"use strict"; /** Matches waitForScriptRun default (1h) plus bridge overhead. */ const VAULT_AGENT_SCRIPT_WAIT_TIMEOUT_MS = 3_605_000; function parseVaultAgentWaitFlag(raw) { if (raw === undefined || raw === null || raw === "") return false; if (typeof raw === "boolean") return raw; const normalized = String(raw).trim().toLowerCase(); return normalized === "true" || normalized === "1" || normalized === "yes"; } function vaultAgentInvokeOptions(op, params = {}) { if (op !== "snippets.run" && op !== "scripts.run") return undefined; if (!parseVaultAgentWaitFlag(params.wait)) return undefined; return { timeoutMs: VAULT_AGENT_SCRIPT_WAIT_TIMEOUT_MS }; } /** * Vault domain service. Read-only metadata and notes/snippets are served from * renderer vault state via VaultAgentBridge; credentials never cross the bridge. */ function createVaultService(ctx = {}) { const { invokeVaultAgent } = ctx; function requireBridge() { if (typeof invokeVaultAgent !== "function") { return { ok: false, error: "Vault agent bridge is unavailable." }; } return null; } return { getHost: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.get", { hostId: params.hostId }); }, listHosts: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.list", {}); }, openHost: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.open", { hostId: params.hostId, chatSessionId: params.chatSessionId, }); }, createHosts: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("hosts.create", params); }, updateHost: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.update", params); }, deleteHost: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.delete", { hostId: params.hostId }); }, importHosts: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.import", params); }, getHostNotes: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.notes.get", { hostId: params.hostId }); }, setHostNotes: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.notes.set", { hostId: params.hostId, notes: params.notes, }); }, listNotes: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("note.list", {}); }, getNote: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("note.get", { noteId: params.noteId, offset: params.offset, maxChars: params.maxChars, query: params.query, expectedUpdatedAt: params.expectedUpdatedAt, }); }, createNote: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("note.create", params); }, updateNote: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("note.update", params); }, deleteNote: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("note.delete", { noteId: params.noteId }); }, listIdentities: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("identity.list", {}); }, listProxyProfiles: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("proxyProfile.list", {}); }, listGroups: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("group.list", {}); }, createGroup: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("group.create", params); }, updateGroup: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("group.update", params); }, deleteGroup: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("group.delete", params); }, listSnippets: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.list", {}); }, getSnippet: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.get", { snippetId: params.snippetId }); }, runSnippet: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.run", { snippetId: params.snippetId, sessionId: params.sessionId, variables: params.variables, chatSessionId: params.chatSessionId, wait: params.wait, }, vaultAgentInvokeOptions("snippets.run", params)); }, createSnippet: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.create", params); }, updateSnippet: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.update", params); }, deleteSnippet: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("snippets.delete", params); }, listScripts: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.list", {}); }, getScript: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.get", { scriptId: params.scriptId, snippetId: params.scriptId }); }, createScript: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.create", params); }, updateScript: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.update", params); }, deleteScript: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.delete", params); }, runScript: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.run", params, vaultAgentInvokeOptions("scripts.run", params)); }, getScriptReference: async () => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.reference", {}); }, listScriptRuns: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.runs.list", params); }, stopScriptRun: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.run.stop", params); }, pauseScriptRun: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.run.pause", params); }, resumeScriptRun: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.run.resume", params); }, setScriptTargets: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("scripts.targets.set", params); }, listHostConnectScripts: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.connectScripts.list", params); }, setHostConnectScripts: async (params = {}) => { const bridgeErr = requireBridge(); if (bridgeErr) return bridgeErr; return invokeVaultAgent("host.connectScripts.set", params); }, }; } module.exports = { createVaultService, };