"use strict"; const { AGENT_KINDS, CAPABILITY_STATUS } = require("../constants.cjs"); /** @type {import("../types.cjs").CapabilityDefinition[]} */ const VAULT_CAPABILITIES = [ { id: "vault.host.get", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Get host metadata from the vault.", policy: { write: false, sensitiveRead: true, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["vault", "host", "get"] }, global: { rpcMethod: "vault/host/get" }, public: { rpcMethod: "public/vault/host/get", mcpTool: "host_get" }, }, }, { id: "vault.host.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List saved hosts in the vault (metadata only — no passwords or keys).", policy: { write: false, sensitiveRead: true, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { global: { rpcMethod: "vault/hosts/list" }, public: { rpcMethod: "public/vault/hosts/list", mcpTool: "vault_hosts_list" }, }, }, { id: "vault.host.open", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Open a vault host by creating a new terminal tab and starting the connection. Returns the new sessionId so you can run terminal/SFTP tools against it. Use vault_hosts_list first when you only know the label or hostname.", // Sidebar Catty is scoped to already-open terminals/workspaces and must not // expand that scope mid-turn. Keep host_open for MCP / CLI / global agent. agentKinds: [AGENT_KINDS.GLOBAL], policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["vault", "host", "open"] }, global: { rpcMethod: "vault/hosts/open" }, public: { rpcMethod: "public/vault/hosts/open", mcpTool: "host_open" }, }, }, { id: "vault.hosts.create", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Create vault hosts from structured host objects. Use when the user wants to add/create a host (Vault → Hosts). NOT for Vault → Notes sidebar documentation.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/hosts/create" }, public: { rpcMethod: "public/vault/hosts/create", mcpTool: "vault_hosts_create" }, }, }, { id: "vault.host.update", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Update selected fields on an existing vault host. Use vault_hosts_list first to resolve the hostId.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/hosts/update" }, public: { rpcMethod: "public/vault/hosts/update", mcpTool: "vault_hosts_update" }, }, }, { id: "vault.host.delete", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Delete a saved vault host by id. Use vault_hosts_list first to resolve the hostId.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/hosts/delete" }, public: { rpcMethod: "public/vault/hosts/delete", mcpTool: "vault_hosts_delete" }, }, }, { id: "vault.host.import", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Parse known host export file formats (PuTTY, MobaXterm, CSV, SecureCRT, ssh_config) into vault hosts. For arbitrary unstructured text, map to host objects and use vault_hosts_create instead.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/hosts/import" }, public: { rpcMethod: "public/vault/hosts/import", mcpTool: "vault_hosts_import" }, }, }, { id: "vault.host.notes.get", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Read host metadata notes attached to a saved host (Host Details panel — not Vault sidebar Notes).", policy: { write: false, sensitiveRead: true, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["vault", "host-notes", "get"] }, global: { rpcMethod: "vault/host/notes/get" }, public: { rpcMethod: "public/vault/hostNotes/get", mcpTool: "host_notes_get" }, }, }, { id: "vault.host.notes.set", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Update host metadata notes on a saved host (Host Details panel — not Vault sidebar Notes).", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["vault", "host-notes", "set"] }, global: { rpcMethod: "vault/host/notes/set" }, public: { rpcMethod: "public/vault/hostNotes/set", mcpTool: "host_notes_set" }, }, }, { id: "vault.note.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List notes in Vault → Notes (markdown notes visible in the vault sidebar).", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { global: { rpcMethod: "vault/notes/list" }, public: { rpcMethod: "public/vault/notes/list", mcpTool: "vault_notes_list" }, }, }, { id: "vault.note.get", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Read or search a Vault → Notes entry by exact id, at most 6000 characters per call. Content is only the returned range, not necessarily the whole note. Follow nextOffset with expectedUpdatedAt until null for a complete read; query searches only return matching excerpts. Read every range without query before summarizing the whole note or replacing its content; never treat unread text as absent. For long notes, retain section summaries rather than repeatedly loading all ranges. If the note changed, restart.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { global: { rpcMethod: "vault/notes/get" }, public: { rpcMethod: "public/vault/notes/get", mcpTool: "vault_notes_get" }, }, }, { id: "vault.note.create", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Create a note in Vault → Notes sidebar (markdown documentation). NOT for adding SSH hosts — use vault_hosts_create for that.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/notes/create" }, public: { rpcMethod: "public/vault/notes/create", mcpTool: "vault_notes_create" }, }, }, { id: "vault.note.update", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Update an existing Vault → Notes entry by id.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { global: { rpcMethod: "vault/notes/update" }, public: { rpcMethod: "public/vault/notes/update", mcpTool: "vault_notes_update" }, }, }, { id: "vault.note.delete", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Delete a Vault → Notes entry by id.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false }, surfaces: { global: { rpcMethod: "vault/notes/delete" }, public: { rpcMethod: "public/vault/notes/delete", mcpTool: "vault_notes_delete" }, }, }, { id: "vault.identity.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List reusable vault identities without passwords, private keys, or passphrases.", policy: { write: false, sensitiveRead: true, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true }, surfaces: { global: { rpcMethod: "vault/identities/list" }, public: { rpcMethod: "public/vault/identities/list", mcpTool: "vault_identities_list" }, }, }, { id: "vault.proxyProfile.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List reusable proxy profiles without credentials.", policy: { write: false, sensitiveRead: true, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true }, surfaces: { global: { rpcMethod: "vault/proxyProfiles/list" }, public: { rpcMethod: "public/vault/proxyProfiles/list", mcpTool: "vault_proxy_profiles_list" }, }, }, ...[ ["vault.group.list", "List vault groups and their safe default settings.", "list", "vault_groups_list", false], ["vault.group.create", "Create a vault group with optional default connection settings.", "create", "vault_groups_create", true], ["vault.group.update", "Update or rename a vault group and its default connection settings.", "update", "vault_groups_update", true], ["vault.group.delete", "Delete a vault group, moving its hosts to the root unless deleteHosts is true.", "delete", "vault_groups_delete", true], ].map(([id, description, action, mcpTool, write]) => ({ id, domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description, policy: { write, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: !write, bypassesChatCancel: !write }, surfaces: { global: { rpcMethod: `vault/groups/${action}` }, public: { rpcMethod: `public/vault/groups/${action}`, mcpTool }, }, })), { id: "vault.snippets.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List code snippets stored in the vault.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["snippets", "list"] }, global: { rpcMethod: "vault/snippets/list" }, public: { rpcMethod: "public/vault/snippets/list", mcpTool: "snippets_list" }, }, }, { id: "vault.snippets.get", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Get a single code snippet from the vault.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["snippets", "get"] }, global: { rpcMethod: "vault/snippets/get" }, public: { rpcMethod: "public/vault/snippets/get", mcpTool: "snippets_get" }, }, }, { id: "vault.snippets.run", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Run a vault snippet or automation script in a terminal session. Text snippets paste shell commands; scripts (kind=script) run via the nct JavaScript runtime.", policy: { write: true, sensitiveRead: false, longRunning: true, requiresChatSession: true, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["snippets", "run"] }, global: { rpcMethod: "vault/snippets/run" }, public: { rpcMethod: "public/vault/snippets/run", mcpTool: "snippets_run" }, }, }, { id: "vault.snippets.create", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Create a vault snippet or automation script (set kind=script for nct automation).", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["snippets", "create"] }, global: { rpcMethod: "vault/snippets/create" }, public: { rpcMethod: "public/vault/snippets/create", mcpTool: "snippets_create" }, }, }, { id: "vault.snippets.update", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Update an existing vault snippet or automation script by id.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["snippets", "update"] }, global: { rpcMethod: "vault/snippets/update" }, public: { rpcMethod: "public/vault/snippets/update", mcpTool: "snippets_update" }, }, }, { id: "vault.snippets.delete", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Delete a vault snippet or automation script by id.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["snippets", "delete"] }, global: { rpcMethod: "vault/snippets/delete" }, public: { rpcMethod: "public/vault/snippets/delete", mcpTool: "snippets_delete" }, }, }, { id: "vault.scripts.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List automation scripts (kind=script) in the vault.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["scripts", "list"] }, global: { rpcMethod: "vault/scripts/list" }, public: { rpcMethod: "public/vault/scripts/list", mcpTool: "scripts_list" }, }, }, { id: "vault.scripts.get", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Get a single automation script including JavaScript source.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["scripts", "get"] }, global: { rpcMethod: "vault/scripts/get" }, public: { rpcMethod: "public/vault/scripts/get", mcpTool: "scripts_get" }, }, }, { id: "vault.scripts.create", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Create an automation script using the nct JavaScript API. Call scripts_reference first when authoring nct automation.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "create"] }, global: { rpcMethod: "vault/scripts/create" }, public: { rpcMethod: "public/vault/scripts/create", mcpTool: "scripts_create" }, }, }, { id: "vault.scripts.update", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Update an automation script by id (partial fields).", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "update"] }, global: { rpcMethod: "vault/scripts/update" }, public: { rpcMethod: "public/vault/scripts/update", mcpTool: "scripts_update" }, }, }, { id: "vault.scripts.delete", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Delete an automation script and remove host connect bindings.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "delete"] }, global: { rpcMethod: "vault/scripts/delete" }, public: { rpcMethod: "public/vault/scripts/delete", mcpTool: "scripts_delete" }, }, }, { id: "vault.scripts.run", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Run an automation script in a terminal session via the nct runtime. Set wait=true to block until completion.", policy: { write: true, sensitiveRead: false, longRunning: true, requiresChatSession: true, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "run"] }, global: { rpcMethod: "vault/scripts/run" }, public: { rpcMethod: "public/vault/scripts/run", mcpTool: "scripts_run" }, }, }, { id: "vault.scripts.reference", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Return Netcatty automation script syntax: nct API, triggers, host targeting, and source wrapping rules.", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["scripts", "reference"] }, global: { rpcMethod: "vault/scripts/reference" }, public: { rpcMethod: "public/vault/scripts/reference", mcpTool: "scripts_reference" }, }, }, { id: "vault.scripts.runs.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List automation script runs (optionally filter by sessionId).", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["scripts", "runs", "list"] }, global: { rpcMethod: "vault/scripts/runs/list" }, public: { rpcMethod: "public/vault/scripts/runs/list", mcpTool: "scripts_runs_list" }, }, }, { id: "vault.scripts.run.stop", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Stop a running automation script by runId.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: true, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "run", "stop"] }, global: { rpcMethod: "vault/scripts/run/stop" }, public: { rpcMethod: "public/vault/scripts/run/stop", mcpTool: "scripts_run_stop" }, }, }, { id: "vault.scripts.run.pause", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Pause a running automation script by runId.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: true, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "run", "pause"] }, global: { rpcMethod: "vault/scripts/run/pause" }, public: { rpcMethod: "public/vault/scripts/run/pause", mcpTool: "scripts_run_pause" }, }, }, { id: "vault.scripts.run.resume", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Resume a paused automation script by runId.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: true, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "run", "resume"] }, global: { rpcMethod: "vault/scripts/run/resume" }, public: { rpcMethod: "public/vault/scripts/run/resume", mcpTool: "scripts_run_resume" }, }, }, { id: "vault.scripts.targets.set", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Set host IDs, dynamic group paths, or targetsAllHosts for an automation script. onConnect host IDs sync host connect queues.", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["scripts", "targets", "set"] }, global: { rpcMethod: "vault/scripts/targets/set" }, public: { rpcMethod: "public/vault/scripts/targets/set", mcpTool: "scripts_targets_set" }, }, }, { id: "vault.host.connectScripts.list", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "List resolved onConnect automation scripts for a host (global, dynamic group, then host queue).", policy: { write: false, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: true, bypassesChatCancel: true, }, surfaces: { cli: { command: ["vault", "host", "connect-scripts", "list"] }, global: { rpcMethod: "vault/host/connectScripts/list" }, public: { rpcMethod: "public/vault/hostConnectScripts/list", mcpTool: "host_connect_scripts_list" }, }, }, { id: "vault.host.connectScripts.set", domain: "vault", status: CAPABILITY_STATUS.IMPLEMENTED, description: "Set ordered onConnect script IDs for a host (host-specific queue; globals run separately).", policy: { write: true, sensitiveRead: false, longRunning: false, requiresChatSession: false, bypassesObserverBlock: false, bypassesApproval: false, bypassesChatCancel: false, }, surfaces: { cli: { command: ["vault", "host", "connect-scripts", "set"] }, global: { rpcMethod: "vault/host/connectScripts/set" }, public: { rpcMethod: "public/vault/hostConnectScripts/set", mcpTool: "host_connect_scripts_set" }, }, }, ]; module.exports = { VAULT_CAPABILITIES };