@haven_ai/connect 0.1.23-alpha.2 → 0.1.25-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +111 -22
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +112 -23
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +111 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +112 -23
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/key.ts","../src/redact.ts","../src/storage.ts","../src/runtime-manifest.ts","../src/config-writers.ts","../src/local-mcp-consent.ts","../src/probes.ts","../src/local-mcp-runtime.ts","../src/signer-runtime.ts","../src/runtime-registry.ts","../src/signer-consent.ts","../src/runtime-install.ts","../src/runtime.ts","../src/args.ts","../src/cli.ts"],"names":["Wallet","crypto","mkdir","join","rm","homedir","resolve","writeFile","access","chmod","MCP_VERSION","HAVEN_MINIMUM_NODE_VERSION","registeredToolNames","parseDocument","isMap","replacement","needsTrailingNewline","stringify","unlink","merged","readFile","path","dirname","platform","ensureConsent","computeConsentHash","loadCredentials","consentInputFromClient","spawn","promisify","execFile","unsupportedNodeVersionMessage","isSupportedNodeVersion","execFileAsync","installedRuntimeMatches","installRuntimePackages","assertFileExists","writeWrapper","writeRuntimeSidecar","readPackageJson","ensureSignerConsent","writeLogChunk","computeSignerConsentHash","loadSignerCredentials","signer","createEdgeSigner","toolSchemas","signerCredentialReady","errorCode","SKILL_FOLDER_NAME","HAVEN_SKILL_MD","nextAction","resolveTokenFromAddress","realpathSync","fileURLToPath","pathToFileURL"],"mappings":"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","file":"cli.cjs","sourcesContent":["export interface ConnectApiClient {\n resolveSetup(input: ResolveSetupInput): Promise<ResolvedSetup>\n registerSetup(input: RegisterSetupInput): Promise<RegisterSetupResponse>\n updateInstallStatus(\n setupId: string,\n apiKey: string,\n input: UpdateInstallStatusInput,\n ): Promise<void>\n /**\n * #1377 D: the narrow status read the connector polls after registering,\n * authenticated with the agent API key it just minted (works while the\n * agent is still `setup_pending` — the endpoint exists for exactly that\n * window). Returns status plus the approved budget once approval lands;\n * never any secret material.\n */\n getConnectorStatus(setupId: string, apiKey: string): Promise<ConnectorStatusResponse>\n}\n\nexport interface ConnectorStatusResponse {\n status: string\n approved_budget: {\n token_symbol: string\n token_address: string\n amount: string\n reset_period_min: number\n } | null\n}\n\nexport interface ResolveSetupInput {\n setupToken: string\n connectorVersion: string\n runtime?: string\n}\n\nexport interface RegisterSetupInput extends ResolveSetupInput {\n challengeId: string\n delegateAddress: string\n proofSignature: string\n apiKeyHash: string\n apiKeyPrefix: string\n connectorContext?: ConnectorContext\n installCapabilities?: {\n canWriteRuntimeConfig?: boolean\n restartRequired?: boolean\n }\n}\n\nexport interface UpdateInstallStatusInput {\n runtime?: string\n connectorVersion: string\n runtimeMcpMode?: string\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured?: boolean\n credentialFilesWritten?: boolean\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n activationCommandAvailable?: boolean\n skillInstalled?: boolean\n probeResult: string\n restartRequired: boolean\n nextUserAction: string\n errorCode?: string | null\n environmentLabel?: string\n}\n\nexport interface ConnectorContext {\n environment_label?: string\n runtime_version?: string\n config_target?: string\n}\n\nexport interface ResolvedSetup {\n setup_id: string\n status: string\n agent: {\n name: string\n description?: string | null\n }\n haven_wallet: {\n id: string\n name: string\n address: string\n chain_id: number\n network: string\n }\n agent_budget: Array<{\n token_address: string\n token_symbol: string\n allowance_amount: string\n reset_period_min: number\n }>\n hosted_mcp_url: string\n // Address the edge signer verifies x402 expected-context signatures against.\n // null/absent when the backend has no x402 binding key configured.\n x402_binding_signer?: string | null\n challenge: {\n id: string\n message: string\n expires_at: string\n }\n}\n\nexport interface RegisterSetupResponse {\n setup_id: string\n agent_id: string\n status: string\n agent_status: string\n api_key_prefix: string\n api_key_scope: string\n delegate_address: string\n hosted_mcp_url: string\n next_action: string\n}\n\nexport function createConnectApiClient(baseUrl: string, fetchImpl: typeof fetch = fetch): ConnectApiClient {\n const root = baseUrl.replace(/\\/+$/, '')\n return {\n resolveSetup: (input) =>\n request(fetchImpl, `${root}/agent-connection-setups/resolve`, {\n method: 'POST',\n body: JSON.stringify({\n setup_token: input.setupToken,\n connector_version: input.connectorVersion,\n runtime: input.runtime,\n }),\n }),\n\n registerSetup: (input) =>\n request(fetchImpl, `${root}/agent-connection-setups/register`, {\n method: 'POST',\n body: JSON.stringify({\n setup_token: input.setupToken,\n challenge_id: input.challengeId,\n delegate_address: input.delegateAddress,\n proof_signature: input.proofSignature,\n api_key_hash: input.apiKeyHash,\n api_key_prefix: input.apiKeyPrefix,\n runtime: input.runtime,\n connector_version: input.connectorVersion,\n connector_context: input.connectorContext,\n install_capabilities: input.installCapabilities && {\n can_write_runtime_config: input.installCapabilities.canWriteRuntimeConfig,\n restart_required: input.installCapabilities.restartRequired,\n },\n }),\n }),\n\n getConnectorStatus: (setupId, apiKey) =>\n request(fetchImpl, `${root}/agent-connection-setups/${encodeURIComponent(setupId)}/connector-status`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n }),\n\n updateInstallStatus: async (setupId, apiKey, input) => {\n await request(fetchImpl, `${root}/agent-connection-setups/${encodeURIComponent(setupId)}/install-status`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n body: JSON.stringify({\n runtime: input.runtime,\n connector_version: input.connectorVersion,\n runtime_mcp_mode: input.runtimeMcpMode,\n hosted_mcp_configured: input.hostedMcpConfigured,\n local_signer_configured: input.localSignerConfigured,\n local_mcp_configured: input.localMcpConfigured,\n credential_files_written: input.credentialFilesWritten,\n signer_acknowledged: input.signerAcknowledged,\n local_mcp_acknowledged: input.localMcpAcknowledged,\n activation_command_available: input.activationCommandAvailable,\n skill_installed: input.skillInstalled,\n probe_result: input.probeResult,\n restart_required: input.restartRequired,\n next_user_action: input.nextUserAction,\n error_code: input.errorCode ?? null,\n environment_label: input.environmentLabel,\n }),\n })\n },\n }\n}\n\n/**\n * Request failure carrying the HTTP status, so callers can tell a permanent\n * verdict (401 revoked key, 404 gone) from transient noise (5xx, network).\n * The approval poll loop (#1377 D) branches on this: retrying a 401 for the\n * full window and then saying \"still pending\" is actively wrong when the user\n * cancelled the setup and the key was revoked.\n */\nexport class ConnectRequestError extends Error {\n constructor(message: string, readonly status: number) {\n super(message)\n this.name = 'ConnectRequestError'\n }\n}\n\nasync function request<T>(\n fetchImpl: typeof fetch,\n url: string,\n init: RequestInit,\n): Promise<T> {\n const response = await fetchImpl(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...(init.headers ?? {}),\n },\n })\n const text = await response.text()\n const body = text ? JSON.parse(text) : null\n if (!response.ok) {\n const message = body?.error ?? body?.message ?? `${response.status} ${response.statusText}`\n throw new ConnectRequestError(`Haven setup request failed: ${message}`, response.status)\n }\n return body as T\n}\n","import crypto from 'node:crypto'\nimport { Wallet } from 'ethers'\n\nexport interface LocalDelegateKey {\n privateKey: string\n address: string\n signChallenge(message: string): Promise<string>\n}\n\nexport function generateDelegateKey(): LocalDelegateKey {\n return delegateKeyFromPrivateKey(Wallet.createRandom().privateKey)\n}\n\nexport function delegateKeyFromPrivateKey(privateKey: string): LocalDelegateKey {\n const wallet = new Wallet(privateKey)\n return {\n privateKey: wallet.privateKey,\n address: wallet.address,\n signChallenge: (message: string) => wallet.signMessage(message),\n }\n}\n\nexport function generateAgentApiKey(): string {\n return `sk_agent_${crypto.randomBytes(24).toString('hex')}`\n}\n\nexport function hashAgentApiKey(apiKey: string): string {\n return crypto.createHash('sha256').update(apiKey).digest('hex')\n}\n\nexport function agentApiKeyPrefix(apiKey: string): string {\n return apiKey.slice(0, 12)\n}\n","const API_KEY_RE = /sk_agent_[A-Za-z0-9]+/g\nconst PRIVATE_KEY_RE = /0x[0-9a-fA-F]{64}/g\n\nexport function redactSecrets(value: string): string {\n return value\n .replace(API_KEY_RE, 'sk_agent_[redacted]')\n .replace(PRIVATE_KEY_RE, '0x[redacted-private-key]')\n}\n\nexport function shortAddress(address: string): string {\n if (!/^0x[0-9a-fA-F]{40}$/.test(address)) return address\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n","import { access, chmod, mkdir, rm, writeFile } from 'node:fs/promises'\nimport crypto from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nexport interface StoredCredentialPaths {\n directory: string\n identityPath: string\n signerPath: string\n /** Non-secret orientation file (identity + configured budget, no keys). */\n agentPath: string\n}\n\nexport interface WriteCredentialInput {\n baseDir?: string\n agentId: string\n apiKey: string\n delegateKey: string\n delegateAddress: string\n safeAddress?: string\n chainId?: number\n network?: string\n agentBudget?: Array<{\n token_symbol: string\n allowance_amount: string\n reset_period_min: number\n }>\n apiUrl: string\n hostedMcpUrl: string\n x402BindingSigner?: string\n warn?: (message: string) => void\n}\n\nexport interface PreflightCredentialStorageInput {\n baseDir?: string\n warn?: (message: string) => void\n}\n\nexport async function preflightCredentialStorage(\n input: PreflightCredentialStorageInput = {},\n): Promise<string> {\n const directory = defaultCredentialRoot(input.baseDir)\n await mkdir(directory, { recursive: true, mode: 0o700 })\n await restrictPermissions(directory, 0o700, input.warn)\n\n const probePath = join(directory, `.haven-connect-preflight-${crypto.randomBytes(8).toString('hex')}`)\n try {\n await writeOwnerOnlyJson(probePath, { ok: true }, input.warn)\n } finally {\n await rm(probePath, { force: true }).catch(() => undefined)\n }\n\n return directory\n}\n\nexport async function writeCredentialFiles(input: WriteCredentialInput): Promise<StoredCredentialPaths> {\n const directory = defaultAgentDirectory(input.agentId, input.baseDir)\n await mkdir(directory, { recursive: true, mode: 0o700 })\n await restrictPermissions(directory, 0o700, input.warn)\n\n const identityPath = join(directory, 'identity.json')\n const signerPath = join(directory, 'signer.json')\n const agentPath = join(directory, 'agent.json')\n\n await assertDoesNotExist(identityPath)\n await assertDoesNotExist(signerPath)\n await assertDoesNotExist(agentPath)\n\n await writeOwnerOnlyJson(\n signerPath,\n {\n delegate_key: input.delegateKey,\n delegate_address: input.delegateAddress,\n agent_id: input.agentId,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n x402_binding_signer: input.x402BindingSigner,\n note: 'Local signer credential. Haven backend never receives this private key.',\n },\n input.warn,\n )\n\n try {\n await writeOwnerOnlyJson(\n identityPath,\n {\n api_key: input.apiKey,\n agent_id: input.agentId,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n api_url: input.apiUrl,\n hosted_mcp_url: input.hostedMcpUrl,\n agent_budget: input.agentBudget,\n note: 'Haven API key identifies the agent only. It cannot spend without the local signer key and on-chain Haven wallet rules.',\n },\n input.warn,\n )\n } catch (err) {\n await rm(signerPath, { force: true }).catch(() => undefined)\n throw err\n }\n\n // Non-secret orientation file. Lets the agent answer \"who am I and what may I\n // spend\" on its first turn by reading one local file — no MCP round trip and\n // no exposure of the API key (identity.json) or delegate key (signer.json) in\n // the agent's transcript. Holds the *configured* budget; live remaining budget\n // still comes from haven_get_allowances before a payment.\n try {\n await writeOwnerOnlyJson(\n agentPath,\n {\n agent_id: input.agentId,\n delegate_address: input.delegateAddress,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n agent_budget: input.agentBudget,\n note: 'Non-secret orientation for the agent: public delegate/Haven wallet identity + configured budget. Contains no API key or signing key. For the live remaining budget, call haven_get_allowances.',\n },\n input.warn,\n )\n } catch (err) {\n // Roll back every file so a partial write (e.g. writeFile succeeds but chmod\n // fails) can't leave agent.json behind and block reconnection via\n // assertDoesNotExist on the next run.\n await rm(signerPath, { force: true }).catch(() => undefined)\n await rm(identityPath, { force: true }).catch(() => undefined)\n await rm(agentPath, { force: true }).catch(() => undefined)\n throw err\n }\n\n return { directory, identityPath, signerPath, agentPath }\n}\n\nexport function defaultAgentDirectory(agentId: string, baseDir = join(homedir(), '.haven', 'agents')): string {\n return resolve(defaultCredentialRoot(baseDir), safePathPart(agentId))\n}\n\nexport function defaultCredentialRoot(baseDir = join(homedir(), '.haven', 'agents')): string {\n return resolve(baseDir)\n}\n\nasync function writeOwnerOnlyJson(\n path: string,\n value: Record<string, unknown>,\n warn: ((message: string) => void) | undefined,\n): Promise<void> {\n const json = JSON.stringify(dropUndefined(value), null, 2)\n await writeFile(path, `${json}\\n`, { mode: 0o600, flag: 'wx' })\n await restrictPermissions(path, 0o600, warn)\n}\n\nfunction safePathPart(value: string): string {\n return value.replace(/[^A-Za-z0-9_.-]/g, '_')\n}\n\nfunction dropUndefined(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(value).filter(([, field]) => field !== undefined))\n}\n\nasync function assertDoesNotExist(path: string): Promise<void> {\n try {\n await access(path)\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n throw new Error(`Refusing to overwrite existing Haven credential file: ${path}`)\n}\n\nasync function restrictPermissions(\n path: string,\n mode: 0o600 | 0o700,\n warn: ((message: string) => void) | undefined,\n): Promise<void> {\n try {\n await chmod(path, mode)\n } catch (err) {\n warn?.(\n `Warning: could not restrict permissions on ${path} to ${mode.toString(8)}. ` +\n `Move this credential to a private location or run chmod ${mode.toString(8)} ${path}. ` +\n `${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n","import { MCP_VERSION, registeredToolNames } from '@haven_ai/mcp'\nimport { HAVEN_MINIMUM_NODE_VERSION } from '@haven_ai/sdk'\n\n// The required-tools list is derived from `@haven_ai/mcp`'s canonical\n// `registeredToolNames()` rather than maintained as a literal here. An earlier\n// hand-maintained list drifted out of sync with the MCP package (it advertised\n// tools the local MCP no longer exposed, and missed `haven_pay_x402` when it\n// landed), which broke the consent screen and the post-setup probe. Sourcing\n// from the MCP package directly is now the only way new tools can ship.\nexport const MCP_RUNTIME_MANIFEST = {\n mcpPackage: '@haven_ai/mcp',\n mcpVersion: MCP_VERSION,\n sdkPackage: '@haven_ai/sdk',\n sdkVersion: '0.1.23-alpha.2',\n signerPackage: '@haven_ai/signer',\n signerVersion: '0.1.23-alpha.2',\n // Sourced from the SDK, never a literal (#1161). This field read '20.0.0'\n // while every package's `engines` said `>=24` and the docs said `>=24.0.0`,\n // so the guard that was supposed to enforce the floor waved Node v23 through\n // — including on the `--local` path where it does run. A hand-maintained\n // second copy of a number is a drift waiting to happen; a guard test pins\n // this against `package.json`'s `engines.node`.\n minimumNodeVersion: HAVEN_MINIMUM_NODE_VERSION,\n supportedClients: ['codex-cli', 'codex-desktop', 'claude-code'] as const,\n requiredTools: registeredToolNames() as readonly string[],\n} as const\n\nexport function mcpPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.mcpPackage}@${MCP_RUNTIME_MANIFEST.mcpVersion}`\n}\n\nexport function sdkPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.sdkPackage}@${MCP_RUNTIME_MANIFEST.sdkVersion}`\n}\n\nexport function signerPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.signerPackage}@${MCP_RUNTIME_MANIFEST.signerVersion}`\n}\n","import { mkdir, readFile, writeFile, chmod, unlink } from 'node:fs/promises'\nimport { homedir, platform } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { isMap, parseDocument, stringify } from 'yaml'\nimport { signerPackageSpec } from './runtime-manifest.js'\nimport { type RuntimeId } from './runtime-registry.js'\n\nexport type RuntimeMcpMode = 'local_stdio' | 'hosted_plus_signer' | 'manual'\n\nconst HERMES_API_KEY_ENV = 'MCP_HAVEN_API_KEY'\n\n/** How to launch the local edge signer as an MCP stdio server. */\nexport interface SignerLaunchSpec {\n command: string\n args: string[]\n}\n\nexport interface RuntimeConfigInput {\n runtime: RuntimeId\n hostedMcpUrl: string\n apiKey: string\n identityPath: string\n signerPath: string\n credentialDirectory: string\n localMcpCommand?: string\n /**\n * Prepared signer launch command (absolute wrapper from prepareSignerRuntime).\n * When absent, falls back to a runtime `npx -y @haven_ai/signer@…` invocation,\n * which is fragile under the agent runtime's MCP-spawn environment — prefer\n * always passing a prepared command.\n */\n signerCommand?: SignerLaunchSpec\n homeDir?: string\n /**\n * Topology to write. 'hosted' (default) configures the keyless hosted MCP\n * server plus the local signer; 'local' restores the local-stdio MCP for\n * runtimes that support it (explicit opt-in only).\n */\n mode?: 'hosted' | 'local'\n}\n\nexport interface RuntimeConfigWriteResult {\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}\n\n/** Injectable file operations for failure-safe runtime-config tests. */\nexport interface RuntimeConfigWriteDeps {\n writeOwnerOnlyText?: (path: string, value: string) => Promise<void>\n}\n\nclass HermesConfigRecoveryError extends Error {\n constructor() {\n super('Hermes configuration recovery did not complete')\n this.name = 'HermesConfigRecoveryError'\n }\n}\n\nexport class InvalidCodexTomlError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'InvalidCodexTomlError'\n }\n}\n\nexport async function writeRuntimeConfig(\n input: RuntimeConfigInput,\n deps: RuntimeConfigWriteDeps = {},\n): Promise<RuntimeConfigWriteResult> {\n switch (input.runtime) {\n case 'codex-cli':\n case 'codex-desktop':\n return writeCodexConfig(input)\n case 'cursor':\n return writeJsonRuntimeConfig(input, cursorConfigPath(input.homeDir), 'mcpServers')\n case 'vscode':\n return writeJsonRuntimeConfig(input, vscodeConfigPath(input.homeDir), 'servers')\n case 'vscode-insiders':\n return writeJsonRuntimeConfig(input, vscodeInsidersConfigPath(input.homeDir), 'servers')\n case 'claude-desktop':\n return writeJsonRuntimeConfig(input, claudeDesktopConfigPath(input.homeDir), 'mcpServers')\n case 'hermes':\n return writeHermesConfig(input, deps)\n default:\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'manual',\n target: 'manual runtime setup',\n changed: false,\n restartRequired: true,\n messages: ['Runtime config needs to be added manually for this agent environment.'],\n errorCode: 'manual_runtime_setup_required',\n }\n }\n}\n\nexport function buildHostedServer(hostedMcpUrl: string, apiKey: string, runtime: RuntimeId): Record<string, unknown> {\n if (runtime === 'vscode' || runtime === 'vscode-insiders') {\n return {\n type: 'http',\n url: hostedMcpUrl,\n headers: { Authorization: `Bearer ${apiKey}` },\n }\n }\n return {\n url: hostedMcpUrl,\n headers: { Authorization: `Bearer ${apiKey}` },\n }\n}\n\n/**\n * Resolve how to launch the signer: the prepared absolute-path wrapper when\n * available, otherwise a runtime npx invocation (fallback only).\n */\nexport function resolveSignerLaunchSpec(input: RuntimeConfigInput): SignerLaunchSpec {\n return (\n input.signerCommand ?? {\n command: 'npx',\n args: ['-y', signerPackageSpec(), '--credentials', input.signerPath],\n }\n )\n}\n\nexport function buildSignerServer(spec: SignerLaunchSpec, runtime: RuntimeId): Record<string, unknown> {\n const server = {\n command: spec.command,\n args: spec.args,\n }\n if (runtime === 'vscode' || runtime === 'vscode-insiders') return { type: 'stdio', ...server }\n return server\n}\n\nexport function buildLocalMcpServer(command: string, runtime: RuntimeId): Record<string, unknown> {\n const server = {\n command,\n args: [],\n }\n if (runtime === 'vscode' || runtime === 'vscode-insiders') return { type: 'stdio', ...server }\n return server\n}\n\nexport function mergeJsonMcpConfig(\n existingJson: string | null,\n serverRoot: 'mcpServers' | 'servers',\n hostedServer: Record<string, unknown>,\n signerServer: Record<string, unknown>,\n): string {\n const config = existingJson?.trim() ? parseJsonObject(existingJson) : {}\n const existingRoot = config[serverRoot]\n const servers = existingRoot && typeof existingRoot === 'object' && !Array.isArray(existingRoot)\n ? existingRoot as Record<string, unknown>\n : {}\n config[serverRoot] = {\n ...servers,\n haven: hostedServer,\n 'haven-signer': signerServer,\n }\n return `${JSON.stringify(config, null, 2)}\\n`\n}\n\n/** Merge Haven's managed MCP entries into Hermes's YAML configuration. */\nexport function mergeHermesYaml(\n existingYaml: string | null,\n hostedServer: Record<string, unknown>,\n signerServer: Record<string, unknown>,\n): string {\n if (!existingYaml?.trim()) return renderHermesYaml({ haven: hostedServer, 'haven-signer': signerServer })\n\n const doc = parseDocument(existingYaml, { keepSourceTokens: true })\n if (doc.errors.length > 0 || !isMap(doc.contents)) {\n throw new Error('Hermes config must be a YAML object')\n }\n\n const mcpPair = doc.contents.items.find((item) => item.key?.toString() === 'mcp_servers')\n const existingServers = mcpPair && isMap(mcpPair.value) ? mcpPair.value.toJSON() : {}\n const servers = isRecord(existingServers) ? existingServers : {}\n const mergedServers = {\n ...servers,\n haven: hostedServer,\n 'haven-signer': signerServer,\n }\n\n if (!mcpPair) {\n return appendHermesMcpServers(existingYaml, mergedServers)\n }\n if (!mcpPair.value?.range) return replaceEmptyHermesMcpServers(existingYaml, mcpPair.key?.range, mergedServers)\n return replaceHermesMcpServers(existingYaml, mcpPair.key?.range, mcpPair.value.range, mergedServers)\n}\n\n/**\n * Upsert the hosted MCP identity in Hermes's dotenv file without evaluating\n * arbitrary dotenv syntax or rewriting unrelated lines.\n */\nexport function mergeHermesEnv(existingEnv: string | null, apiKey: string): string {\n if (/[\\r\\n]/.test(apiKey)) throw new Error('Hermes API key must be a single line')\n\n const assignment = `${HERMES_API_KEY_ENV}=${apiKey}`\n if (!existingEnv) return `${assignment}\\n`\n\n const lineEnding = existingEnv.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const hasTrailingNewline = /\\r?\\n$/.test(existingEnv)\n const lines = existingEnv.split(/\\r?\\n/)\n if (hasTrailingNewline) lines.pop()\n\n let found = false\n const merged = lines.flatMap((line) => {\n if (isHermesEnvAssignment(line)) {\n if (found) return []\n found = true\n return [assignment]\n }\n if (isAmbiguousHermesEnvLine(line)) {\n throw new Error('Hermes environment contains an ambiguous managed key')\n }\n return [line]\n })\n\n if (!found) {\n return `${existingEnv}${hasTrailingNewline ? '' : lineEnding}${assignment}${lineEnding}`\n }\n return `${merged.join(lineEnding)}${hasTrailingNewline ? lineEnding : ''}`\n}\n\nfunction isHermesEnvAssignment(line: string): boolean {\n return /^\\s*(?:export[ \\t]+)?MCP_HAVEN_API_KEY[ \\t]*=/.test(line)\n}\n\nfunction isAmbiguousHermesEnvLine(line: string): boolean {\n return /^\\s*(?:export[ \\t]+)?MCP_HAVEN_API_KEY\\b/.test(line)\n}\n\nfunction appendHermesMcpServers(source: string, servers: Record<string, unknown>): string {\n const documentEnd = /(?:^|\\n)[ \\t]*\\.\\.\\.[ \\t]*(?:#[^\\n]*)?\\r?\\n?$/.exec(source)\n if (documentEnd) {\n const markerStart = documentEnd.index + (documentEnd[0].startsWith('\\n') ? 1 : 0)\n const beforeMarker = source.slice(0, markerStart)\n return `${beforeMarker}${beforeMarker.endsWith('\\n') ? '' : '\\n'}${renderHermesMcpServers(servers, '')}\\n${source.slice(markerStart)}`\n }\n const separator = source.endsWith('\\n') ? '' : '\\n'\n return `${source}${separator}${renderHermesMcpServers(servers, '')}\\n`\n}\n\nfunction replaceHermesMcpServers(\n source: string,\n keyRange: readonly number[] | undefined,\n valueRange: readonly number[],\n servers: Record<string, unknown>,\n): string {\n const valueStart = valueRange[0]\n const valueEnd = valueRange[1]\n const valueLineStart = source.lastIndexOf('\\n', valueStart - 1) + 1\n const keyStartsOnValueLine = keyRange?.[0] !== undefined && keyRange[0] >= valueLineStart\n const nestedIndent = `${source.slice(valueLineStart, keyRange?.[0] ?? valueLineStart)} `\n\n if (keyStartsOnValueLine) {\n const keyStart = keyRange![0]\n const keyEnd = keyRange![1]\n const replacement = `${source.slice(keyStart, keyEnd)}:\\n${renderHermesMcpServerEntries(servers, nestedIndent)}`\n const needsTrailingNewline = valueEnd < source.length && !source.slice(valueEnd).startsWith('\\n')\n return `${source.slice(0, keyStart)}${replacement}${needsTrailingNewline ? '\\n' : ''}${source.slice(valueEnd)}`\n }\n\n const indent = source.slice(valueLineStart, valueStart)\n const rendered = stringify(servers, { lineWidth: 120 }).trimEnd()\n const replacement = rendered.split('\\n').map((line, index) => index === 0 ? line : `${indent}${line}`).join('\\n')\n const needsTrailingNewline = valueEnd < source.length && !source.slice(valueEnd).startsWith('\\n')\n return `${source.slice(0, valueStart)}${replacement}${needsTrailingNewline ? '\\n' : ''}${source.slice(valueEnd)}`\n}\n\nfunction replaceEmptyHermesMcpServers(\n source: string,\n keyRange: readonly number[] | undefined,\n servers: Record<string, unknown>,\n): string {\n if (!keyRange) throw new Error('Hermes config mcp_servers key is invalid')\n const keyStart = keyRange[0]\n const keyEnd = keyRange[1]\n const lineStart = source.lastIndexOf('\\n', keyStart - 1) + 1\n const lineEnd = source.indexOf('\\n', keyEnd)\n const nestedIndent = `${source.slice(lineStart, keyStart)} `\n const replacement = `${source.slice(keyStart, keyEnd)}:\\n${renderHermesMcpServerEntries(servers, nestedIndent)}`\n return `${source.slice(0, keyStart)}${replacement}${lineEnd === -1 ? '\\n' : source.slice(lineEnd)}`\n}\n\nfunction renderHermesYaml(servers: Record<string, unknown>): string {\n return `${renderHermesMcpServers(servers, '')}\\n`\n}\n\nfunction renderHermesMcpServers(servers: Record<string, unknown>, indent: string): string {\n return `mcp_servers:\\n${renderHermesMcpServerEntries(servers, `${indent} `)}`\n}\n\nfunction renderHermesMcpServerEntries(servers: Record<string, unknown>, indent: string): string {\n return stringify(servers, { lineWidth: 120 })\n .trimEnd()\n .split('\\n')\n .map((line) => `${indent}${line}`)\n .join('\\n')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function mergeCodexToml(existingToml: string, localMcpCommand: string): string {\n let next = removeTomlTableTree(removeTomlTableTree(existingToml, 'mcp_servers.haven'), 'mcp_servers.haven_signer')\n next = next.trimEnd()\n const block = [\n '[mcp_servers.haven]',\n `command = ${tomlString(localMcpCommand)}`,\n 'args = []',\n 'startup_timeout_sec = 120',\n ].join('\\n')\n validateCodexToml(block, 'Generated Codex Haven config')\n const merged = `${next ? `${next}\\n\\n` : ''}${block}\\n`\n return merged\n}\n\nexport function mergeCodexTomlHosted(\n existingToml: string,\n hostedMcpUrl: string,\n apiKey: string,\n signerSpec: SignerLaunchSpec,\n): string {\n let next = removeTomlTableTree(removeTomlTableTree(existingToml, 'mcp_servers.haven'), 'mcp_servers.haven_signer')\n next = next.trimEnd()\n const block = [\n '[mcp_servers.haven]',\n `url = ${tomlString(hostedMcpUrl)}`,\n `http_headers = { \"Authorization\" = ${tomlString(`Bearer ${apiKey}`)} }`,\n '',\n '[mcp_servers.haven_signer]',\n `command = ${tomlString(signerSpec.command)}`,\n `args = [${signerSpec.args.map((arg) => tomlString(arg)).join(', ')}]`,\n 'startup_timeout_sec = 120',\n ].join('\\n')\n validateCodexToml(block, 'Generated Codex Haven config')\n const merged = `${next ? `${next}\\n\\n` : ''}${block}\\n`\n return merged\n}\n\nasync function writeJsonRuntimeConfig(\n input: RuntimeConfigInput,\n target: string,\n serverRoot: 'mcpServers' | 'servers',\n): Promise<RuntimeConfigWriteResult> {\n try {\n const existing = await readOptional(target)\n const merged = mergeJsonMcpConfig(\n existing,\n serverRoot,\n buildHostedServer(input.hostedMcpUrl, input.apiKey, input.runtime),\n buildSignerServer(resolveSignerLaunchSpec(input), input.runtime),\n )\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: input.runtime === 'claude-desktop',\n messages: [`Updated Haven MCP entries in ${configTargetLabel(input.runtime)}.`],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: false,\n restartRequired: true,\n messages: [`Could not update ${configTargetLabel(input.runtime)}: ${err instanceof Error ? err.message : String(err)}`],\n errorCode: 'runtime_config_write_failed',\n }\n }\n}\n\nasync function writeHermesConfig(input: RuntimeConfigInput, deps: RuntimeConfigWriteDeps): Promise<RuntimeConfigWriteResult> {\n const target = hermesConfigPath(input.homeDir)\n const envTarget = hermesEnvPath(input.homeDir)\n try {\n const [existing, existingEnv] = await Promise.all([readOptional(target), readOptional(envTarget)])\n const hostedServer = {\n ...buildHostedServer(input.hostedMcpUrl, `\\${${HERMES_API_KEY_ENV}}`, input.runtime),\n enabled: true,\n }\n const signerServer = {\n ...buildSignerServer(resolveSignerLaunchSpec(input), input.runtime),\n enabled: true,\n }\n const merged = mergeHermesYaml(\n existing,\n hostedServer,\n signerServer,\n )\n const mergedEnv = mergeHermesEnv(existingEnv, input.apiKey)\n const writeText = deps.writeOwnerOnlyText ?? writeOwnerOnlyText\n await writeText(envTarget, mergedEnv)\n try {\n await writeText(target, merged)\n } catch (err) {\n const recovered = await restoreHermesFiles(target, existing, envTarget, existingEnv, writeText)\n if (!recovered) throw new HermesConfigRecoveryError()\n throw err\n }\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Hermes Agent config',\n changed: existing !== merged || existingEnv !== mergedEnv,\n restartRequired: true,\n messages: [\n `Updated Haven MCP entries in ${target}; stored the hosted MCP identity in ${envTarget}.`,\n 'Restart Hermes (start a new session; gateway users: /restart), then verify with `hermes mcp list`, `hermes mcp test haven`, and `hermes mcp test haven-signer`.',\n 'If no mcp_* tools appear after restart, ensure the MCP SDK is installed in Hermes: pip install mcp',\n ],\n }\n } catch (err) {\n const recoveryIncomplete = err instanceof HermesConfigRecoveryError\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Hermes Agent config',\n changed: false,\n restartRequired: true,\n messages: [recoveryIncomplete\n ? 'Could not update Hermes Agent config. Recovery did not complete; inspect the Hermes configuration before retrying.'\n : 'Could not update Hermes Agent config. Existing configuration was left unchanged.'],\n errorCode: 'runtime_config_write_failed',\n }\n }\n}\n\nasync function restoreHermesFiles(\n configPath: string,\n existingConfig: string | null,\n envPath: string,\n existingEnv: string | null,\n writeText: (path: string, value: string) => Promise<void>,\n): Promise<boolean> {\n const [envResult, configResult] = await Promise.allSettled([\n restoreOptionalText(envPath, existingEnv, writeText),\n restoreOptionalText(configPath, existingConfig, writeText),\n ])\n return envResult.status === 'fulfilled' && configResult.status === 'fulfilled'\n}\n\nasync function restoreOptionalText(\n path: string,\n existing: string | null,\n writeText: (path: string, value: string) => Promise<void>,\n): Promise<void> {\n if (existing !== null) {\n await writeText(path, existing)\n return\n }\n try {\n await unlink(path)\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n}\n\nasync function writeCodexConfig(input: RuntimeConfigInput): Promise<RuntimeConfigWriteResult> {\n const target = codexConfigPath(input.homeDir)\n const local = input.mode === 'local'\n try {\n const existing = await readOptional(target)\n if (local) {\n if (!input.localMcpCommand) {\n throw new Error('local MCP wrapper command is required')\n }\n const merged = mergeCodexToml(existing ?? '', input.localMcpCommand)\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: false,\n signerConfigured: true,\n localMcpConfigured: true,\n runtimeMcpMode: 'local_stdio',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: true,\n messages: [\n `Updated local Haven MCP entry in ${configTargetLabel(input.runtime)}.`,\n ],\n }\n }\n const merged = mergeCodexTomlHosted(existing ?? '', input.hostedMcpUrl, input.apiKey, resolveSignerLaunchSpec(input))\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: true,\n messages: [\n `Updated Haven MCP entries in ${configTargetLabel(input.runtime)}.`,\n ],\n }\n } catch (err) {\n const invalidToml = err instanceof InvalidCodexTomlError\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: local ? 'local_stdio' : 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: false,\n restartRequired: true,\n messages: [`Could not update ${configTargetLabel(input.runtime)}: ${err instanceof Error ? err.message : String(err)}`],\n errorCode: invalidToml ? 'codex_config_invalid' : 'runtime_config_write_failed',\n }\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, 'utf8')\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n}\n\nasync function writeOwnerOnlyText(path: string, value: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 })\n await writeFile(path, value, { mode: 0o600 })\n await chmod(path, 0o600).catch(() => undefined)\n}\n\nfunction parseJsonObject(value: string): Record<string, unknown> {\n const parsed = JSON.parse(value) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('runtime config must be a JSON object')\n }\n return parsed as Record<string, unknown>\n}\n\nfunction removeTomlTableTree(toml: string, table: string): string {\n const lines = toml.split(/\\r?\\n/)\n const kept: string[] = []\n let skipping = false\n for (const line of lines) {\n const trimmed = line.trim()\n const tableName = tomlTableName(trimmed)\n if (tableName) {\n skipping = tableName === table || tableName.startsWith(`${table}.`)\n if (skipping) continue\n }\n if (!skipping) kept.push(line)\n }\n return kept.join('\\n')\n}\n\nfunction tomlTableName(line: string): string | null {\n if (line.startsWith('[[') && line.endsWith(']]')) return line.slice(2, -2).trim()\n if (line.startsWith('[') && line.endsWith(']')) return line.slice(1, -1).trim()\n return null\n}\n\nexport function validateCodexToml(toml: string, label = 'Codex config'): void {\n const lines = toml.split(/\\r?\\n/)\n let pendingValue: { value: string; line: number } | null = null\n for (let index = 0; index < lines.length; index += 1) {\n const raw = lines[index]\n const line = stripTomlComment(raw).trim()\n if (!line) continue\n\n if (pendingValue) {\n pendingValue.value = `${pendingValue.value}\\n${line}`\n if (hasBalancedTomlContainers(pendingValue.value)) {\n if (!isTomlValue(pendingValue.value)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${pendingValue.line}.`)\n }\n pendingValue = null\n }\n continue\n }\n\n if (isTomlTable(line)) continue\n\n const equalsIndex = line.indexOf('=')\n if (equalsIndex <= 0) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n\n const key = line.slice(0, equalsIndex).trim()\n const value = line.slice(equalsIndex + 1).trim()\n if (!isTomlKey(key)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n if (startsTomlContainer(value) && !hasBalancedTomlContainers(value)) {\n pendingValue = { value, line: index + 1 }\n continue\n }\n if (!isTomlValue(value)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n }\n if (pendingValue) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${pendingValue.line}.`)\n }\n}\n\nfunction isTomlTable(line: string): boolean {\n const table = tomlTableName(line)\n return Boolean(table && splitTomlDottedKey(table).every(isTomlKeyPart))\n}\n\nfunction isTomlKey(value: string): boolean {\n return splitTomlDottedKey(value).every(isTomlKeyPart)\n}\n\nfunction splitTomlDottedKey(value: string): string[] {\n const parts: string[] = []\n let current = ''\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n current += char\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n current += char\n continue\n }\n if (char === '.') {\n parts.push(current.trim())\n current = ''\n continue\n }\n current += char\n }\n parts.push(current.trim())\n return quote ? [] : parts\n}\n\nfunction isTomlKeyPart(value: string): boolean {\n return isTomlBareKey(value) || isTomlQuotedString(value)\n}\n\nfunction isTomlBareKey(value: string): boolean {\n return /^[A-Za-z0-9_-]+$/.test(value)\n}\n\nfunction isTomlValue(value: string): boolean {\n if (!value) return false\n if (isTomlQuotedString(value)) return true\n if (/^(true|false)$/i.test(value)) return true\n if (/^[+-]?(?:inf|nan)$/i.test(value)) return true\n if (/^[+-]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]+)?(?:[eE][+-]?[0-9_]+)?$/.test(value)) return true\n if (/^\\d{4}-\\d{2}-\\d{2}(?:[Tt ][0-9:.+-Zz]+)?$/.test(value)) return true\n if ((value.startsWith('[') && value.endsWith(']')) || (value.startsWith('{') && value.endsWith('}'))) {\n return hasBalancedTomlContainers(value)\n }\n return false\n}\n\nfunction startsTomlContainer(value: string): boolean {\n return value.startsWith('[') || value.startsWith('{')\n}\n\nfunction isTomlQuotedString(value: string): boolean {\n if (value.startsWith('\"\"\"') || value.startsWith(\"'''\")) {\n const marker = value.slice(0, 3)\n return value.length >= 6 && value.endsWith(marker)\n }\n if ((!value.startsWith('\"') || !value.endsWith('\"')) && (!value.startsWith(\"'\") || !value.endsWith(\"'\"))) {\n return false\n }\n return hasBalancedTomlContainers(value)\n}\n\nfunction stripTomlComment(value: string): string {\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n continue\n }\n if (char === '#') return value.slice(0, i)\n }\n return value\n}\n\nfunction hasBalancedTomlContainers(value: string): boolean {\n const stack: string[] = []\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n continue\n }\n if (char === '[' || char === '{') {\n stack.push(char)\n continue\n }\n if (char === ']') {\n if (stack.pop() !== '[') return false\n continue\n }\n if (char === '}') {\n if (stack.pop() !== '{') return false\n }\n }\n return stack.length === 0 && quote === null\n}\n\nfunction tomlString(value: string): string {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`\n}\n\nfunction cursorConfigPath(homeDir = homedir()): string {\n return resolve(homeDir, '.cursor', 'mcp.json')\n}\n\nfunction codexConfigPath(homeDir = homedir()): string {\n return resolve(homeDir, '.codex', 'config.toml')\n}\n\nfunction vscodeConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') return resolve(homeDir, 'Library', 'Application Support', 'Code', 'User', 'mcp.json')\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Code', 'User', 'mcp.json')\n }\n return resolve(homeDir, '.config', 'Code', 'User', 'mcp.json')\n}\n\nfunction vscodeInsidersConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') return resolve(homeDir, 'Library', 'Application Support', 'Code - Insiders', 'User', 'mcp.json')\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Code - Insiders', 'User', 'mcp.json')\n }\n return resolve(homeDir, '.config', 'Code - Insiders', 'User', 'mcp.json')\n}\n\nfunction claudeDesktopConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') {\n return resolve(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')\n }\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json')\n }\n return resolve(homeDir, '.config', 'Claude', 'claude_desktop_config.json')\n}\n\nexport function hermesConfigPath(homeDir?: string): string {\n return join(hermesHomePath(homeDir), 'config.yaml')\n}\n\nexport function hermesEnvPath(homeDir?: string): string {\n return join(hermesHomePath(homeDir), '.env')\n}\n\nfunction hermesHomePath(homeDir?: string): string {\n return process.env.HERMES_HOME ?? join(homeDir ?? homedir(), '.hermes')\n}\n\nfunction configTargetLabel(runtime: RuntimeId): string {\n switch (runtime) {\n case 'codex-cli':\n return 'Codex CLI config'\n case 'codex-desktop':\n return 'Codex Desktop config'\n case 'cursor':\n return 'Cursor MCP config'\n case 'vscode':\n return 'VS Code MCP config'\n case 'vscode-insiders':\n return 'VS Code Insiders MCP config'\n case 'claude-desktop':\n return 'Claude Desktop config'\n default:\n return 'runtime MCP config'\n }\n}\n","import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport {\n computeConsentHash,\n consentInputFromClient,\n ensureConsent,\n loadCredentials,\n registeredToolNames,\n type ConsentDecision,\n} from '@haven_ai/mcp'\n\nexport interface LocalMcpConsentStatus {\n acknowledged: boolean\n hash?: string\n reason?: ConsentDecision['reason'] | 'ack_file_missing' | 'ack_file_mismatch'\n error?: string\n}\n\nexport async function acknowledgeLocalMcpConsent(\n identityPath: string,\n signerPath: string,\n log?: (message: string) => void,\n): Promise<LocalMcpConsentStatus> {\n try {\n const input = await buildLocalMcpConsentInput(identityPath, signerPath)\n const decision = await ensureConsent(input, {\n credentialsPath: identityPath,\n writeAck: true,\n out: log ? { write: (chunk) => writeLogChunk(log, chunk) } : undefined,\n })\n return {\n acknowledged: decision.ok,\n hash: decision.hash,\n reason: decision.reason,\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport async function getLocalMcpConsentStatus(\n identityPath: string,\n signerPath: string,\n): Promise<LocalMcpConsentStatus> {\n try {\n const input = await buildLocalMcpConsentInput(identityPath, signerPath)\n const hash = computeConsentHash(input)\n const stored = await readLocalMcpAckFile(localMcpAckPath(identityPath))\n if (stored === hash) {\n return { acknowledged: true, hash, reason: 'ack_file_match' }\n }\n return {\n acknowledged: false,\n hash,\n reason: stored ? 'ack_file_mismatch' : 'ack_file_missing',\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport function localMcpAckPath(identityPath: string): string {\n return resolve(`${identityPath}.ack.json`)\n}\n\nasync function buildLocalMcpConsentInput(identityPath: string, signerPath: string) {\n const credentials = await loadCredentials({ identityPath, signerPath })\n const unavailableDuringSetup = {\n getAllowances: async () => {\n throw new Error('Haven approval is not complete yet.')\n },\n }\n return consentInputFromClient(\n unavailableDuringSetup as never,\n {\n apiKey: credentials.apiKey,\n apiUrl: credentials.apiUrl,\n agentId: credentials.agentId,\n safeAddress: credentials.safeAddress,\n delegateAddress: credentials.delegateAddress,\n chainId: credentials.chainId,\n allowanceSummary: credentials.allowanceSummary,\n },\n registeredToolNames(),\n )\n}\n\nasync function readLocalMcpAckFile(path: string): Promise<string | null> {\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as { ack?: unknown }\n return typeof parsed.ack === 'string' ? parsed.ack : null\n } catch {\n return null\n }\n}\n\nfunction writeLogChunk(log: (message: string) => void, chunk: string): void {\n const message = String(chunk).trimEnd()\n if (message) log(message)\n}\n","import { spawn } from 'node:child_process'\nimport { readFile } from 'node:fs/promises'\n\nexport type HostedProbeStatus = 'ok' | 'unauthorized' | 'network_error' | 'bad_response'\n\nexport interface HostedProbeResult {\n status: HostedProbeStatus\n toolCount?: number\n}\n\nexport type LocalMcpProbeStatus = 'ok' | 'timeout' | 'process_error' | 'bad_response' | 'missing_tools'\n\nexport interface LocalMcpProbeResult {\n status: LocalMcpProbeStatus\n toolNames?: string[]\n}\n\nexport async function probeHostedMcpTools(\n apiKey: string,\n hostedMcpUrl: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<HostedProbeResult> {\n let response: Response\n try {\n response = await fetchWithTimeout(fetchImpl, hostedMcpUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' }),\n })\n } catch {\n return { status: 'network_error' }\n }\n\n if (response.status === 401 || response.status === 403) return { status: 'unauthorized' }\n if (!response.ok) return { status: 'bad_response' }\n\n try {\n const payload = parseJsonRpcPayload(await response.text())\n if (!payload || payload.error) return { status: 'bad_response' }\n const tools = (payload.result as { tools?: unknown[] } | undefined)?.tools\n return { status: 'ok', toolCount: Array.isArray(tools) ? tools.length : undefined }\n } catch {\n return { status: 'bad_response' }\n }\n}\n\nexport async function probeLocalSignerCredential(signerPath: string): Promise<boolean> {\n try {\n const parsed = JSON.parse(await readFile(signerPath, 'utf8')) as unknown\n return Boolean(\n parsed &&\n typeof parsed === 'object' &&\n 'delegate_key' in parsed &&\n typeof (parsed as { delegate_key?: unknown }).delegate_key === 'string',\n )\n } catch {\n return false\n }\n}\n\nexport async function probeLocalMcpTools(\n command: string,\n args: string[],\n requiredTools: readonly string[],\n timeoutMs = 10_000,\n): Promise<LocalMcpProbeResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, { stdio: ['pipe', 'pipe', 'ignore'] })\n let stdout = ''\n let settled = false\n let sawInitialize = false\n\n const finish = (result: LocalMcpProbeResult): void => {\n if (settled) return\n settled = true\n clearTimeout(timeout)\n child.kill()\n resolve(result)\n }\n\n const timeout = setTimeout(() => finish({ status: 'timeout' }), timeoutMs)\n\n child.on('error', () => finish({ status: 'process_error' }))\n child.on('exit', (code) => {\n if (!settled && code !== 0) finish({ status: 'process_error' })\n })\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8')\n const lines = stdout.split(/\\r?\\n/)\n stdout = lines.pop() ?? ''\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n let payload: JsonRpcEnvelope & { id?: number }\n try {\n payload = JSON.parse(trimmed) as JsonRpcEnvelope & { id?: number }\n } catch {\n continue\n }\n if (payload.error) {\n finish({ status: 'bad_response' })\n return\n }\n if (payload.id === 1 && !sawInitialize) {\n sawInitialize = true\n writeJsonRpc(child, { jsonrpc: '2.0', method: 'notifications/initialized', params: {} })\n writeJsonRpc(child, { jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} })\n continue\n }\n if (payload.id === 2) {\n const tools = (payload.result as { tools?: unknown[] } | undefined)?.tools\n const toolNames = Array.isArray(tools)\n ? tools\n .map((tool) => tool && typeof tool === 'object' && 'name' in tool ? (tool as { name?: unknown }).name : undefined)\n .filter((name): name is string => typeof name === 'string')\n : []\n const missing = requiredTools.filter((name) => !toolNames.includes(name))\n finish({ status: missing.length === 0 ? 'ok' : 'missing_tools', toolNames })\n return\n }\n }\n })\n\n writeJsonRpc(child, {\n jsonrpc: '2.0',\n id: 1,\n method: 'initialize',\n params: {\n protocolVersion: '2025-06-18',\n capabilities: {},\n clientInfo: { name: 'haven-connect-probe', version: '0.0.0' },\n },\n })\n })\n}\n\ninterface JsonRpcEnvelope {\n result?: unknown\n error?: unknown\n}\n\nfunction writeJsonRpc(child: ReturnType<typeof spawn>, payload: Record<string, unknown>): void {\n child.stdin?.write(`${JSON.stringify(payload)}\\n`)\n}\n\nfunction parseJsonRpcPayload(raw: string): JsonRpcEnvelope | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n if (trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed) as JsonRpcEnvelope\n } catch {\n return null\n }\n }\n const dataLines = trimmed\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith('data:'))\n .map((line) => line.slice(5).trim())\n for (let i = dataLines.length - 1; i >= 0; i -= 1) {\n try {\n return JSON.parse(dataLines[i]) as JsonRpcEnvelope\n } catch {\n /* try previous SSE frame */\n }\n }\n return null\n}\n\nasync function fetchWithTimeout(fetchImpl: typeof fetch, url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeout)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\nimport { isSupportedNodeVersion, unsupportedNodeVersionMessage } from '@haven_ai/sdk'\nimport {\n MCP_RUNTIME_MANIFEST,\n mcpPackageSpec,\n sdkPackageSpec,\n} from './runtime-manifest.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface PrepareLocalMcpRuntimeInput {\n credentialDirectory: string\n identityPath: string\n signerPath: string\n homeDir?: string\n nodeVersion?: string\n}\n\nexport interface PreparedLocalMcpRuntime {\n command: string\n args: string[]\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n messages: string[]\n}\n\nexport interface LocalMcpRuntimeDeps {\n runCommand?: (command: string, args: string[]) => Promise<void>\n}\n\n/**\n * Raised when the running Node is below the floor every Haven package declares.\n *\n * The `code` is load-bearing: `runtime-install.ts` maps it to the\n * `local_stdio_mcp_unsupported_node_version` probe result, and Haven's install\n * telemetry has been recording that string since the local path shipped. Kept\n * verbatim even though the guard is no longer local-MCP-only (#1161), because\n * renaming it would silently split one condition across two codes in the\n * historical data.\n */\nexport class UnsupportedNodeVersionError extends Error {\n readonly code = 'local_mcp_unsupported_node_version'\n readonly nodeVersion: string\n readonly minimumNodeVersion: string\n\n constructor(nodeVersion: string, minimumNodeVersion: string, subject = 'Haven setup') {\n super(unsupportedNodeVersionMessage({ subject, nodeVersion, minimumNodeVersion }))\n this.name = 'UnsupportedNodeVersionError'\n this.nodeVersion = nodeVersion\n this.minimumNodeVersion = minimumNodeVersion\n }\n}\n\nexport async function prepareLocalMcpRuntime(\n input: PrepareLocalMcpRuntimeInput,\n deps: LocalMcpRuntimeDeps = {},\n): Promise<PreparedLocalMcpRuntime> {\n assertSupportedNodeVersion(input.nodeVersion)\n\n const homeDir = input.homeDir ?? homedir()\n const runtimeDirectory = resolve(homeDir, '.haven', 'mcp-runtime', MCP_RUNTIME_MANIFEST.mcpVersion)\n const npmCacheDirectory = resolve(homeDir, '.haven', 'npm-cache')\n const cliPath = join(runtimeDirectory, 'node_modules', '@haven_ai', 'mcp', 'dist', 'cli.js')\n const messages: string[] = []\n\n await mkdir(runtimeDirectory, { recursive: true, mode: 0o700 })\n await chmod(runtimeDirectory, 0o700).catch(() => undefined)\n await mkdir(npmCacheDirectory, { recursive: true, mode: 0o700 })\n await chmod(npmCacheDirectory, 0o700).catch(() => undefined)\n\n if (await installedRuntimeMatches(runtimeDirectory, cliPath)) {\n messages.push(`Using existing local Haven MCP runtime ${mcpPackageSpec()}.`)\n } else {\n await installRuntimePackages(runtimeDirectory, npmCacheDirectory, deps.runCommand)\n messages.push(`Installed local Haven MCP runtime ${mcpPackageSpec()}.`)\n }\n\n await assertFileExists(cliPath, 'local Haven MCP CLI')\n\n const wrapperPath = join(input.credentialDirectory, 'bin', 'haven-mcp')\n await writeWrapper({\n wrapperPath,\n cliPath,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n })\n\n await writeRuntimeSidecar({\n path: join(input.credentialDirectory, 'mcp-runtime.json'),\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n })\n\n messages.push(`Prepared stable local Haven MCP wrapper: ${wrapperPath}`)\n\n return {\n command: wrapperPath,\n args: [],\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n messages,\n }\n}\n\n/**\n * Refuse to proceed on an unsupported Node.\n *\n * Called from BOTH connect paths since #1161: `runConnect` runs it before any\n * side effect on the default (hosted MCP + local signer) topology, and\n * `prepareLocalMcpRuntime` keeps its own call for the `--local` path. It used to\n * exist only on the latter — the path almost nobody takes — so the documented\n * floor was enforced where it mattered least.\n */\nexport function assertSupportedNodeVersion(\n nodeVersion = process.versions.node,\n minimumNodeVersion = MCP_RUNTIME_MANIFEST.minimumNodeVersion,\n subject = 'Haven setup',\n): void {\n if (!isSupportedNodeVersion(nodeVersion, minimumNodeVersion)) {\n throw new UnsupportedNodeVersionError(nodeVersion, minimumNodeVersion, subject)\n }\n}\n\nasync function installRuntimePackages(\n runtimeDirectory: string,\n npmCacheDirectory: string,\n runCommand: ((command: string, args: string[]) => Promise<void>) | undefined,\n): Promise<void> {\n // Mirrors prepareSignerRuntime's installRuntimePackages: fast path reuses the\n // default npm cache (warmed by npx) with --prefer-offline so the mcp + sdk\n // tarballs are not re-downloaded; fall back to the isolated Haven-owned cache\n // if the default cache is broken or root-owned (see docs/operations/\n // mcp-runtime-compatibility.md).\n const baseArgs = [\n 'install',\n '--prefix',\n runtimeDirectory,\n '--no-audit',\n '--no-fund',\n '--omit=dev',\n '--prefer-offline',\n mcpPackageSpec(),\n sdkPackageSpec(),\n ]\n const run = async (args: string[]): Promise<void> => {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: 120_000, maxBuffer: 1024 * 1024 })\n }\n\n try {\n await run(baseArgs)\n } catch {\n try {\n await run([...baseArgs, '--cache', npmCacheDirectory])\n } catch (err) {\n throw new Error(`Could not install local Haven MCP runtime ${mcpPackageSpec()}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n}\n\nasync function installedRuntimeMatches(runtimeDirectory: string, cliPath: string): Promise<boolean> {\n try {\n await assertFileExists(cliPath, 'local Haven MCP CLI')\n const [mcpPackage, sdkPackage] = await Promise.all([\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'mcp', 'package.json')),\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'sdk', 'package.json')),\n ])\n return mcpPackage.version === MCP_RUNTIME_MANIFEST.mcpVersion &&\n sdkPackage.version === MCP_RUNTIME_MANIFEST.sdkVersion\n } catch {\n return false\n }\n}\n\nasync function readPackageJson(path: string): Promise<{ version?: string }> {\n return JSON.parse(await readFile(path, 'utf8')) as { version?: string }\n}\n\nasync function writeWrapper(input: {\n wrapperPath: string\n cliPath: string\n identityPath: string\n signerPath: string\n}): Promise<void> {\n await mkdir(dirname(input.wrapperPath), { recursive: true, mode: 0o700 })\n await chmod(dirname(input.wrapperPath), 0o700).catch(() => undefined)\n const source = [\n '#!/usr/bin/env node',\n \"import { spawn } from 'node:child_process'\",\n '',\n `const cliPath = ${JSON.stringify(input.cliPath)}`,\n `const identityPath = ${JSON.stringify(input.identityPath)}`,\n `const signerPath = ${JSON.stringify(input.signerPath)}`,\n '',\n \"const child = spawn(process.execPath, [cliPath, '--identity', identityPath, '--signer', signerPath, ...process.argv.slice(2)], {\",\n \" stdio: 'inherit',\",\n '})',\n '',\n \"child.on('exit', (code, signal) => {\",\n ' if (signal) process.kill(process.pid, signal)',\n ' else process.exit(code ?? 1)',\n '})',\n '',\n ].join('\\n')\n await writeFile(input.wrapperPath, source, { mode: 0o700 })\n await chmod(input.wrapperPath, 0o700).catch(() => undefined)\n}\n\nasync function writeRuntimeSidecar(input: {\n path: string\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n}): Promise<void> {\n const value = {\n mcp_package: MCP_RUNTIME_MANIFEST.mcpPackage,\n mcp_version: MCP_RUNTIME_MANIFEST.mcpVersion,\n sdk_package: MCP_RUNTIME_MANIFEST.sdkPackage,\n sdk_version: MCP_RUNTIME_MANIFEST.sdkVersion,\n minimum_node_version: MCP_RUNTIME_MANIFEST.minimumNodeVersion,\n wrapper_path: input.wrapperPath,\n runtime_directory: input.runtimeDirectory,\n npm_cache_directory: input.npmCacheDirectory,\n cli_path: input.cliPath,\n }\n await writeFile(input.path, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await chmod(input.path, 0o600).catch(() => undefined)\n}\n\nasync function assertFileExists(path: string, label: string): Promise<void> {\n try {\n await access(path)\n } catch {\n throw new Error(`Missing ${label}: ${path}`)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\nimport { MCP_RUNTIME_MANIFEST, sdkPackageSpec, signerPackageSpec } from './runtime-manifest.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface PrepareSignerRuntimeInput {\n credentialDirectory: string\n signerPath: string\n homeDir?: string\n}\n\nexport interface PreparedSignerRuntime {\n /** Absolute command to register as the signer MCP `command`. */\n command: string\n /** Args to register alongside `command` (credentials are baked into the wrapper). */\n args: string[]\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n messages: string[]\n}\n\nexport interface SignerRuntimeDeps {\n runCommand?: (command: string, args: string[]) => Promise<void>\n}\n\n/**\n * Pre-install the edge signer into a version-pinned, connector-managed\n * directory and write a stable wrapper that launches it with an absolute Node\n * path. The signer MCP is then registered as `command: <wrapper>` instead of a\n * runtime `npx -y @haven_ai/signer@…` invocation.\n *\n * Why: launching the signer via bare `npx` at every MCP spawn made it depend on\n * the PATH/environment the agent runtime hands the stdio subprocess, which is\n * not the user's interactive shell — the failure mode that left `haven-signer`\n * stuck at \"Failed to connect\" while the hosted HTTP server connected fine. The\n * local MCP topology already avoids this with the same pre-install + wrapper\n * pattern (see prepareLocalMcpRuntime); this brings the default hosted+signer\n * topology to parity. Version stays pinned (no unpinned `npm i -g`), and the\n * wrapper lives under ~/.haven so the reset flow already cleans it up.\n */\nexport async function prepareSignerRuntime(\n input: PrepareSignerRuntimeInput,\n deps: SignerRuntimeDeps = {},\n): Promise<PreparedSignerRuntime> {\n const homeDir = input.homeDir ?? homedir()\n const runtimeDirectory = resolve(homeDir, '.haven', 'signer-runtime', MCP_RUNTIME_MANIFEST.signerVersion)\n const npmCacheDirectory = resolve(homeDir, '.haven', 'npm-cache')\n const cliPath = join(runtimeDirectory, 'node_modules', '@haven_ai', 'signer', 'dist', 'cli.js')\n const messages: string[] = []\n\n await mkdir(runtimeDirectory, { recursive: true, mode: 0o700 })\n await chmod(runtimeDirectory, 0o700).catch(() => undefined)\n await mkdir(npmCacheDirectory, { recursive: true, mode: 0o700 })\n await chmod(npmCacheDirectory, 0o700).catch(() => undefined)\n\n if (await installedRuntimeMatches(runtimeDirectory, cliPath)) {\n messages.push(`Using existing local Haven signer runtime ${signerPackageSpec()}.`)\n } else {\n await installRuntimePackages(runtimeDirectory, npmCacheDirectory, deps.runCommand)\n messages.push(`Installed local Haven signer runtime ${signerPackageSpec()}.`)\n }\n\n await assertFileExists(cliPath, 'local Haven signer CLI')\n\n // .mjs so the wrapper is unambiguously ESM when the runtime exec's it via the\n // shebang — Node < 20.10 has no automatic module detection, and there is no\n // package.json with \"type\":\"module\" under ~/.haven to disambiguate otherwise.\n const wrapperPath = join(input.credentialDirectory, 'bin', 'haven-signer.mjs')\n await writeWrapper({ wrapperPath, cliPath, signerPath: input.signerPath })\n\n await writeRuntimeSidecar({\n path: join(input.credentialDirectory, 'signer-runtime.json'),\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n })\n\n messages.push(`Prepared stable local Haven signer wrapper: ${wrapperPath}`)\n\n return {\n command: wrapperPath,\n args: [],\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n messages,\n }\n}\n\nasync function installRuntimePackages(\n runtimeDirectory: string,\n npmCacheDirectory: string,\n runCommand: ((command: string, args: string[]) => Promise<void>) | undefined,\n): Promise<void> {\n // Fast path: install against the user's default npm cache with\n // `--prefer-offline`. `npx @haven_ai/connect` just downloaded the signer + sdk\n // tarballs (plus their closure) into that cache moments earlier, so this\n // resolves from disk instead of re-fetching over the network — the single\n // biggest avoidable cost in cold setup.\n const baseArgs = [\n 'install',\n '--prefix',\n runtimeDirectory,\n '--no-audit',\n '--no-fund',\n '--omit=dev',\n '--prefer-offline',\n signerPackageSpec(),\n sdkPackageSpec(),\n ]\n const run = async (args: string[]): Promise<void> => {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: 120_000, maxBuffer: 1024 * 1024 })\n }\n\n try {\n await run(baseArgs)\n } catch {\n // Fallback: the default `~/.npm` can be corrupted or root-owned (a real,\n // documented failure mode — see docs/operations/mcp-runtime-compatibility.md).\n // Retry against the isolated Haven-owned cache so a broken global cache can't\n // break agent setup. This path may hit the network; that is the acceptable\n // cost of recovering from an unusable default cache.\n try {\n await run([...baseArgs, '--cache', npmCacheDirectory])\n } catch (err) {\n throw new Error(\n `Could not install local Haven signer runtime ${signerPackageSpec()}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n}\n\nasync function installedRuntimeMatches(runtimeDirectory: string, cliPath: string): Promise<boolean> {\n try {\n await assertFileExists(cliPath, 'local Haven signer CLI')\n const [signerPackage, sdkPackage] = await Promise.all([\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'signer', 'package.json')),\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'sdk', 'package.json')),\n ])\n return signerPackage.version === MCP_RUNTIME_MANIFEST.signerVersion &&\n sdkPackage.version === MCP_RUNTIME_MANIFEST.sdkVersion\n } catch {\n return false\n }\n}\n\nasync function readPackageJson(path: string): Promise<{ version?: string }> {\n return JSON.parse(await readFile(path, 'utf8')) as { version?: string }\n}\n\nasync function writeWrapper(input: {\n wrapperPath: string\n cliPath: string\n signerPath: string\n}): Promise<void> {\n await mkdir(dirname(input.wrapperPath), { recursive: true, mode: 0o700 })\n await chmod(dirname(input.wrapperPath), 0o700).catch(() => undefined)\n const source = [\n '#!/usr/bin/env node',\n \"import { spawn } from 'node:child_process'\",\n '',\n `const cliPath = ${JSON.stringify(input.cliPath)}`,\n `const signerPath = ${JSON.stringify(input.signerPath)}`,\n '',\n \"const child = spawn(process.execPath, [cliPath, '--credentials', signerPath, ...process.argv.slice(2)], {\",\n \" stdio: 'inherit',\",\n '})',\n '',\n \"child.on('exit', (code, signal) => {\",\n ' if (signal) process.kill(process.pid, signal)',\n ' else process.exit(code ?? 1)',\n '})',\n '',\n ].join('\\n')\n await writeFile(input.wrapperPath, source, { mode: 0o700 })\n await chmod(input.wrapperPath, 0o700).catch(() => undefined)\n}\n\nasync function writeRuntimeSidecar(input: {\n path: string\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n}): Promise<void> {\n const value = {\n signer_package: MCP_RUNTIME_MANIFEST.signerPackage,\n signer_version: MCP_RUNTIME_MANIFEST.signerVersion,\n sdk_package: MCP_RUNTIME_MANIFEST.sdkPackage,\n sdk_version: MCP_RUNTIME_MANIFEST.sdkVersion,\n wrapper_path: input.wrapperPath,\n runtime_directory: input.runtimeDirectory,\n npm_cache_directory: input.npmCacheDirectory,\n cli_path: input.cliPath,\n }\n await writeFile(input.path, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await chmod(input.path, 0o600).catch(() => undefined)\n}\n\nasync function assertFileExists(path: string, label: string): Promise<void> {\n try {\n await access(path)\n } catch {\n throw new Error(`Missing ${label}: ${path}`)\n }\n}\n","export type RuntimeId =\n | 'claude-code'\n | 'codex-desktop'\n | 'codex-cli'\n | 'cursor'\n | 'vscode'\n | 'vscode-insiders'\n | 'claude-desktop'\n | 'hermes'\n | 'other'\n\nexport type RestartMode = 'restart-session' | 'restart-app' | 'hot-reload' | 'manual'\n\nexport interface RuntimeProfile {\n id: RuntimeId\n label: string\n restartMode: RestartMode\n canWriteRuntimeConfig: boolean\n /** Precise, runtime-owned instruction for loading a freshly written MCP entry. */\n activationInstruction: string\n}\n\nconst RUNTIME_PROFILES: Record<RuntimeId, RuntimeProfile> = {\n 'claude-code': {\n id: 'claude-code',\n label: 'Claude Code',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a new Claude Code session so it loads the Haven MCP entries.',\n },\n 'codex-cli': {\n id: 'codex-cli',\n label: 'Codex CLI',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a fresh Codex CLI session (for example, run `codex resume --last`).',\n },\n 'codex-desktop': {\n id: 'codex-desktop',\n label: 'Codex Desktop',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Quit and reopen Codex Desktop so it loads the Haven MCP entries.',\n },\n cursor: {\n id: 'cursor',\n label: 'Cursor',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for Cursor to hot-reload the Haven MCP entries; no app restart is required.',\n },\n vscode: {\n id: 'vscode',\n label: 'VS Code',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for VS Code to hot-reload the Haven MCP entries; no app restart is required.',\n },\n 'vscode-insiders': {\n id: 'vscode-insiders',\n label: 'VS Code Insiders',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for VS Code Insiders to hot-reload the Haven MCP entries; no app restart is required.',\n },\n 'claude-desktop': {\n id: 'claude-desktop',\n label: 'Claude Desktop',\n restartMode: 'restart-app',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Quit and reopen Claude Desktop so it loads the Haven MCP entries.',\n },\n hermes: {\n id: 'hermes',\n label: 'Hermes Agent',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a new Hermes session; in Hermes Gateway, run `/restart` instead.',\n },\n other: {\n id: 'other',\n label: 'Other agent runtime',\n restartMode: 'manual',\n canWriteRuntimeConfig: false,\n activationInstruction: 'Finish the manual MCP setup shown above, then start a fresh session in that runtime.',\n },\n}\n\nconst RUNTIME_ALIASES: Record<string, RuntimeId> = {\n claude: 'claude-code',\n 'claude-code': 'claude-code',\n claudecode: 'claude-code',\n 'claude_code': 'claude-code',\n codex: 'codex-cli',\n 'codex-cli': 'codex-cli',\n codexcli: 'codex-cli',\n 'codex_cli': 'codex-cli',\n 'codex-desktop': 'codex-desktop',\n 'codex_desktop': 'codex-desktop',\n codexdesktop: 'codex-desktop',\n 'codex-app': 'codex-desktop',\n 'codex_app': 'codex-desktop',\n codexapp: 'codex-desktop',\n cursor: 'cursor',\n vscode: 'vscode',\n 'vs-code': 'vscode',\n 'vs_code': 'vscode',\n code: 'vscode',\n 'vscode-insiders': 'vscode-insiders',\n 'vscode_insiders': 'vscode-insiders',\n vscodeinsiders: 'vscode-insiders',\n 'vs-code-insiders': 'vscode-insiders',\n 'code-insiders': 'vscode-insiders',\n insiders: 'vscode-insiders',\n 'claude-desktop': 'claude-desktop',\n 'claude_desktop': 'claude-desktop',\n claudesktop: 'claude-desktop',\n desktop: 'claude-desktop',\n hermes: 'hermes',\n 'hermes-agent': 'hermes',\n hermes_agent: 'hermes',\n hermesagent: 'hermes',\n other: 'other',\n manual: 'other',\n}\n\nexport function runtimeProfile(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): RuntimeProfile {\n return RUNTIME_PROFILES[normalizeRuntime(runtime, env)]\n}\n\nexport function normalizeRuntime(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): RuntimeId {\n const explicit = normalizeRuntimeName(runtime)\n if (explicit) return explicit\n return detectRuntime(env) ?? 'other'\n}\n\nexport function restartRequiredForRuntime(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): boolean {\n const mode = runtimeProfile(runtime, env).restartMode\n return mode === 'restart-session' || mode === 'restart-app'\n}\n\n/**\n * Desktop GUI runtimes really do require a restart for the user to see the new\n * MCP server — the MCP server lifecycle is tied to app launch, not to the\n * current conversation. The agent who reported the \"restart not needed\"\n * surprise was using Claude Code (a CLI session that picks up new MCP servers\n * in-session via the deferred-tool mechanism). Don't softpedal the restart\n * instruction on Claude Desktop / Codex Desktop just because Claude Code is\n * looser about it.\n */\nexport function runtimeRequiresHardRestart(runtime: RuntimeId): boolean {\n return runtime === 'claude-desktop' || runtime === 'codex-desktop'\n}\n\n/**\n * The one safe post-activation check for every supported topology. It only\n * reads the connected agent and its live budget; it never signs, funds, or\n * creates a payment.\n */\nexport function runtimeVerificationInstruction(runtime: RuntimeId): string {\n const label = RUNTIME_PROFILES[runtime].label\n return `In ${label}, run the read-only \\`haven_get_agent\\` and \\`haven_get_allowances\\` tools to confirm the Haven wallet and live budget. Do not sign, fund, or create a payment to verify setup.`\n}\n\nfunction normalizeRuntimeName(runtime: string | undefined): RuntimeId | null {\n const key = runtime?.trim().toLowerCase()\n if (!key) return null\n return RUNTIME_ALIASES[key.replace(/\\s+/g, '-')] ?? null\n}\n\nfunction detectRuntime(env: NodeJS.ProcessEnv): RuntimeId | null {\n if (env.CLAUDECODE || env.CLAUDE_CODE || env.CLAUDECODE_CWD) return 'claude-code'\n if (env.CODEX_SANDBOX || env.CODEX_HOME || env.CODEX_CWD) return 'codex-cli'\n if (env.VSCODE_CWD || env.VSCODE_IPC_HOOK_CLI || env.TERM_PROGRAM === 'vscode') return 'vscode'\n if (env.HERMES_HOME || env.HERMES_AGENT) return 'hermes'\n return null\n}\n","import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport {\n computeSignerConsentHash,\n createEdgeSigner,\n ensureSignerConsent,\n loadSignerCredentials,\n toolSchemas,\n type SignerConsentDecision,\n type SignerConsentInput,\n type SignerToolName,\n} from '@haven_ai/signer'\n\nexport interface LocalSignerConsentStatus {\n acknowledged: boolean\n hash?: string\n reason?: SignerConsentDecision['reason'] | 'ack_file_missing' | 'ack_file_mismatch'\n error?: string\n}\n\nexport async function acknowledgeLocalSignerConsent(\n signerPath: string,\n log?: (message: string) => void,\n): Promise<LocalSignerConsentStatus> {\n try {\n const input = await buildSignerConsentInput(signerPath)\n const decision = await ensureSignerConsent(input, {\n credentialsPath: signerPath,\n writeAck: true,\n out: log ? { write: (chunk) => writeLogChunk(log, chunk) } : undefined,\n })\n return {\n acknowledged: decision.ok,\n hash: decision.hash,\n reason: decision.reason,\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport async function getLocalSignerConsentStatus(signerPath: string): Promise<LocalSignerConsentStatus> {\n try {\n const input = await buildSignerConsentInput(signerPath)\n const hash = computeSignerConsentHash(input)\n const stored = await readSignerAckFile(signerAckPath(signerPath))\n if (stored === hash) {\n return { acknowledged: true, hash, reason: 'ack_file_match' }\n }\n return {\n acknowledged: false,\n hash,\n reason: stored ? 'ack_file_mismatch' : 'ack_file_missing',\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport function signerAckPath(signerPath: string): string {\n return resolve(`${signerPath}.signer-ack.json`)\n}\n\nasync function buildSignerConsentInput(signerPath: string): Promise<SignerConsentInput> {\n const credentials = await loadSignerCredentials(signerPath)\n const signer = createEdgeSigner(credentials.delegateKey, {\n x402BindingSigner: credentials.x402BindingSigner,\n })\n return {\n delegateAddress: signer.delegateAddress,\n safeAddress: credentials.safeAddress,\n agentId: credentials.agentId,\n chainId: credentials.chainId,\n network: credentials.network,\n toolNames: Object.keys(toolSchemas) as SignerToolName[],\n }\n}\n\nasync function readSignerAckFile(path: string): Promise<string | null> {\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as { ack?: unknown }\n return typeof parsed.ack === 'string' ? parsed.ack : null\n } catch {\n return null\n }\n}\n\nfunction writeLogChunk(log: (message: string) => void, chunk: string): void {\n const message = String(chunk).trimEnd()\n if (message) log(message)\n}\n","import { execFile } from 'node:child_process'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\nimport { writeRuntimeConfig, type RuntimeMcpMode } from './config-writers.js'\nimport {\n acknowledgeLocalMcpConsent,\n getLocalMcpConsentStatus,\n type LocalMcpConsentStatus,\n} from './local-mcp-consent.js'\nimport {\n probeHostedMcpTools,\n probeLocalMcpTools,\n probeLocalSignerCredential,\n type LocalMcpProbeResult,\n type LocalMcpProbeStatus,\n} from './probes.js'\nimport {\n prepareLocalMcpRuntime,\n type PreparedLocalMcpRuntime,\n type PrepareLocalMcpRuntimeInput,\n} from './local-mcp-runtime.js'\nimport {\n prepareSignerRuntime,\n type PreparedSignerRuntime,\n type PrepareSignerRuntimeInput,\n} from './signer-runtime.js'\nimport { MCP_RUNTIME_MANIFEST, mcpPackageSpec, signerPackageSpec } from './runtime-manifest.js'\nimport { HAVEN_SKILL_MD, SKILL_FOLDER_NAME } from '@haven_ai/sdk'\nimport { normalizeRuntime, restartRequiredForRuntime, runtimeProfile, type RuntimeId } from './runtime-registry.js'\nimport {\n acknowledgeLocalSignerConsent,\n getLocalSignerConsentStatus,\n type LocalSignerConsentStatus,\n} from './signer-consent.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface RuntimeInstallInput {\n runtime?: string\n hostedMcpUrl: string\n apiKey: string\n signerPath: string\n identityPath: string\n credentialDirectory: string\n environmentLabel?: string\n ackSigner?: boolean\n ackLocalTools?: boolean\n /**\n * Explicit opt-in to the local-stdio MCP topology (zero hosted dependency).\n * Default is hosted MCP + local signer for every runtime; local MCP is only\n * used when this is true and the runtime supports it.\n */\n localMcp?: boolean\n}\n\nexport interface RuntimeInstallResult {\n runtime: RuntimeId\n runtimeMcpMode: RuntimeMcpMode\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured: boolean\n probeResult: string\n restartRequired: boolean\n nextUserAction: string\n errorCode?: string\n configTarget?: string\n runtimeVersion?: string\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n activationCommand?: string\n skillInstalled?: boolean\n /**\n * Hosted topology only: true when the signer was pre-installed and registered\n * via its absolute wrapper, false when prep failed and it fell back to the\n * fragile runtime-`npx` launch. Undefined for local/manual topologies that\n * do not run the signer as a separate MCP. Lets callers/tests detect the\n * silent npx fallback instead of treating every write as fully healthy.\n */\n signerRuntimePrepared?: boolean\n messages: string[]\n}\n\nexport interface RuntimeInstallDeps {\n env?: NodeJS.ProcessEnv\n homeDir?: string\n fetch?: typeof fetch\n /**\n * Optional live progress callback. installRuntime's slowest steps (signer\n * pre-install, runtime config write, MCP handshake probes) otherwise emit\n * nothing until the caller flushes the collected `messages` after this\n * returns — leaving the console silent through the longest part of setup.\n * When provided, a few lightweight heartbeat lines are emitted as they run.\n */\n onProgress?: (message: string) => void\n runCommand?: (command: string, args: string[]) => Promise<void>\n prepareLocalMcpRuntime?: (input: PrepareLocalMcpRuntimeInput) => Promise<PreparedLocalMcpRuntime>\n prepareSignerRuntime?: (input: PrepareSignerRuntimeInput) => Promise<PreparedSignerRuntime>\n probeLocalMcpTools?: (\n command: string,\n args: string[],\n requiredTools: readonly string[],\n ) => Promise<LocalMcpProbeResult>\n}\n\nexport async function installRuntime(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps = {},\n): Promise<RuntimeInstallResult> {\n const runtime = normalizeRuntime(input.runtime, deps.env)\n const profile = runtimeProfile(runtime, deps.env)\n const progress = deps.onProgress ?? (() => undefined)\n const localRuntime = input.localMcp === true && supportsLocalMcp(runtime)\n const consentMessages: string[] = []\n const localMcpConsent = localRuntime\n ? await resolveLocalMcpConsent(input, consentMessages)\n : undefined\n const signerConsent = localRuntime\n ? undefined\n : await resolveSignerConsent(input, consentMessages)\n\n if (runtime === 'other') {\n const signerCredentialReady = await probeLocalSignerCredential(input.signerPath)\n const signerReady = signerCredentialReady && signerConsent?.acknowledged\n return {\n runtime,\n runtimeMcpMode: 'manual',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: signerReady\n ? 'manual_runtime_setup_required_local_signer_ready'\n : 'manual_runtime_setup_required_local_signer_unavailable',\n restartRequired: true,\n nextUserAction: 'return_to_haven_for_wallet_approval_then_configure_runtime',\n errorCode: 'manual_runtime_setup_required',\n configTarget: 'manual runtime setup',\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: false,\n messages: [\n ...consentMessages,\n 'Custom runtime: Haven did not auto-configure it. Your credentials are on disk (chmod 600) — read them at runtime; never paste a key into the agent prompt, memory, or logs.',\n ` identity (hosted MCP Bearer): ${input.identityPath}`,\n ` signer (local signing key): ${input.signerPath}`,\n 'After wallet approval, wire the runtime to Haven by reference:',\n ` Hosted MCP + local signer: point your MCP client at ${input.hostedMcpUrl} with the api_key from identity.json, then run npx -y ${signerPackageSpec()} --credentials ${input.signerPath}`,\n ` Fully local MCP (no hosted dependency): npx -y ${mcpPackageSpec()} --identity ${input.identityPath} --signer ${input.signerPath}`,\n ],\n }\n }\n\n let localRuntimeInstall: PreparedLocalMcpRuntime | undefined\n let localRuntimeError: unknown\n if (localRuntime) {\n try {\n localRuntimeInstall = await prepareRuntimeForLocalMcp(input, deps)\n } catch (err) {\n localRuntimeError = err\n }\n }\n\n if (localRuntimeError) {\n const errorCode = localRuntimePrepareErrorCode(localRuntimeError)\n return {\n runtime,\n runtimeMcpMode: 'local_stdio',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: errorCode === 'local_mcp_unsupported_node_version'\n ? 'local_stdio_mcp_unsupported_node_version'\n : 'local_stdio_mcp_runtime_install_failed',\n restartRequired: true,\n nextUserAction: nextAction(runtime, profile.restartMode, errorCode),\n errorCode,\n configTarget: profile.label,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: undefined,\n messages: [\n ...consentMessages,\n `Could not prepare local Haven MCP runtime: ${localRuntimeError instanceof Error ? localRuntimeError.message : String(localRuntimeError)}`,\n ],\n }\n }\n\n // Hosted topology launches the local signer as its own MCP stdio server.\n // Pre-install it and register an absolute wrapper instead of a runtime\n // `npx -y` invocation, which is fragile in the agent runtime's MCP-spawn\n // environment. Prep failure is non-fatal: fall back to the npx command.\n let signerCommand: { command: string; args: string[] } | undefined\n if (!localRuntime) {\n progress('Getting the signer ready…')\n try {\n const signerRuntime = await prepareSignerForRuntime(input, deps)\n signerCommand = { command: signerRuntime.command, args: signerRuntime.args }\n consentMessages.push(...signerRuntime.messages)\n } catch (err) {\n consentMessages.push(\n `Could not pre-install the local Haven signer; falling back to npx launch: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n const signerRuntimePrepared = localRuntime ? undefined : signerCommand !== undefined\n\n progress('Setting up your Haven tools…')\n const configResult = runtime === 'claude-code'\n ? localRuntime\n ? await configureClaudeCode(deps, localRuntimeInstall?.command ?? '')\n : await configureClaudeCodeHosted(deps, input, signerCommand)\n : await writeRuntimeConfig({\n runtime,\n hostedMcpUrl: input.hostedMcpUrl,\n apiKey: input.apiKey,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n credentialDirectory: input.credentialDirectory,\n localMcpCommand: localRuntimeInstall?.command,\n signerCommand,\n homeDir: deps.homeDir,\n mode: localRuntime ? 'local' : 'hosted',\n })\n\n progress('Almost there — just confirming everything connects…')\n const localProbePromise = configResult.runtimeMcpMode === 'local_stdio' && localRuntimeInstall\n ? runLocalMcpProbe(localRuntimeInstall, deps)\n : Promise.resolve(undefined)\n const [hostedProbe, signerCredentialReady, localMcpProbe] = await Promise.all([\n configResult.hostedConfigured\n ? probeHostedMcpTools(input.apiKey, input.hostedMcpUrl, deps.fetch)\n : Promise.resolve({ status: 'bad_response' as const }),\n probeLocalSignerCredential(input.signerPath),\n localProbePromise,\n ])\n\n const hostedOk = configResult.hostedConfigured && hostedProbe.status === 'ok'\n const localMcpOk = configResult.runtimeMcpMode === 'local_stdio' &&\n configResult.localMcpConfigured &&\n signerCredentialReady &&\n Boolean(localMcpConsent?.acknowledged) &&\n localMcpProbe?.status === 'ok'\n const signerOk = configResult.runtimeMcpMode === 'local_stdio'\n ? localMcpOk\n : configResult.signerConfigured && signerCredentialReady && Boolean(signerConsent?.acknowledged)\n const restartRequired = configResult.restartRequired || restartRequiredForRuntime(runtime, deps.env)\n const errorCode = configResult.errorCode ??\n (configResult.runtimeMcpMode === 'local_stdio'\n ? localMcpErrorCode(signerCredentialReady, localMcpConsent, localMcpProbe?.status)\n : hostedMcpErrorCode(configResult.hostedConfigured, hostedProbe.status) ?? signerConsentErrorCode(signerCredentialReady, signerConsent))\n const hostedProbeMessages = configResult.hostedConfigured && hostedProbe.status !== 'ok'\n ? [`Hosted Haven MCP probe failed: ${hostedProbe.status}.`]\n : configResult.hostedConfigured\n ? ['Verified hosted Haven MCP tools with a read-only handshake.']\n : []\n const localProbeMessages = localMcpProbe && localMcpProbe.status !== 'ok'\n ? [`Local Haven MCP handshake failed: ${localMcpProbe.status}.`]\n : localMcpProbe?.status === 'ok'\n ? ['Verified local Haven MCP tools with a stdio handshake.']\n : []\n\n // The generic payment skill is static and secret-free, so it is installed\n // like the other acknowledged local writes on runtimes with a skills folder.\n const skillInstall = runtime === 'claude-code' && !configResult.errorCode\n ? await installClaudeSkill(deps.homeDir)\n : undefined\n\n return {\n runtime,\n runtimeMcpMode: configResult.runtimeMcpMode,\n hostedMcpConfigured: hostedOk,\n localSignerConfigured: signerOk,\n localMcpConfigured: localMcpOk,\n probeResult: buildProbeResult(configResult.runtimeMcpMode, configResult.hostedConfigured, hostedProbe.status, signerOk, localMcpOk, localMcpProbe?.status),\n restartRequired,\n nextUserAction: nextAction(runtime, profile.restartMode, errorCode),\n errorCode,\n configTarget: configResult.target,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: configResult.activationCommand,\n skillInstalled: skillInstall?.installed,\n signerRuntimePrepared,\n messages: [...consentMessages, ...(localRuntimeInstall?.messages ?? []), ...configResult.messages, ...hostedProbeMessages, ...localProbeMessages, ...(skillInstall?.messages ?? [])],\n }\n}\n\nexport function runtimeInstallCapabilities(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): {\n canWriteRuntimeConfig: boolean\n restartRequired: boolean\n} {\n const profile = runtimeProfile(runtime, env)\n return {\n canWriteRuntimeConfig: profile.canWriteRuntimeConfig,\n restartRequired: restartRequiredForRuntime(runtime, env),\n }\n}\n\nasync function configureClaudeCode(\n deps: RuntimeInstallDeps,\n localMcpCommand: string,\n): Promise<{\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}> {\n const runCommand = deps.runCommand ?? defaultRunCommand\n const serverJson = JSON.stringify({\n type: 'stdio',\n command: localMcpCommand,\n args: [],\n env: {},\n })\n try {\n if (!localMcpCommand) throw new Error('local MCP wrapper command is required')\n await runCommand('claude', ['mcp', 'add-json', 'haven', serverJson, '--scope', 'user'])\n .catch(async () => {\n await runCommand('claude', ['mcp', 'add', 'haven', '--scope', 'user', '--', localMcpCommand])\n })\n await runCommand('claude', ['mcp', 'remove', 'haven-signer']).catch(() => undefined)\n const verified = await runCommand('claude', ['mcp', 'get', 'haven'])\n .then(() => true)\n .catch(() => false)\n return {\n hostedConfigured: false,\n signerConfigured: true,\n localMcpConfigured: true,\n runtimeMcpMode: 'local_stdio',\n target: 'Claude Code MCP config',\n changed: true,\n restartRequired: true,\n messages: [\n 'Updated local Haven MCP entry with Claude Code.',\n ...(verified ? ['Verified Claude Code MCP entry.'] : []),\n ],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'local_stdio',\n target: 'Claude Code MCP config',\n changed: false,\n restartRequired: true,\n messages: [\n `Could not update Claude Code MCP config: ${err instanceof Error ? err.message : String(err)}`,\n 'Install Claude Code or rerun the Haven setup command inside a Claude Code terminal.',\n ],\n errorCode: 'claude_code_config_failed',\n }\n }\n}\n\nasync function configureClaudeCodeHosted(\n deps: RuntimeInstallDeps,\n input: RuntimeInstallInput,\n signerCommand?: { command: string; args: string[] },\n): Promise<{\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}> {\n const runCommand = deps.runCommand ?? defaultRunCommand\n const hostedJson = JSON.stringify({\n type: 'http',\n url: input.hostedMcpUrl,\n headers: { Authorization: `Bearer ${input.apiKey}` },\n })\n const signerJson = JSON.stringify({\n type: 'stdio',\n command: signerCommand?.command ?? 'npx',\n args: signerCommand?.args ?? ['-y', signerPackageSpec(), '--credentials', input.signerPath],\n env: {},\n })\n try {\n // Remove stale entries first so re-runs and local→hosted switches are\n // idempotent — `claude mcp add-json` fails when the name already exists.\n await runCommand('claude', ['mcp', 'remove', 'haven']).catch(() => undefined)\n await runCommand('claude', ['mcp', 'remove', 'haven-signer']).catch(() => undefined)\n await runCommand('claude', ['mcp', 'add-json', 'haven', hostedJson, '--scope', 'user'])\n await runCommand('claude', ['mcp', 'add-json', 'haven-signer', signerJson, '--scope', 'user'])\n const verified = await runCommand('claude', ['mcp', 'get', 'haven'])\n .then(() => true)\n .catch(() => false)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Claude Code MCP config',\n changed: true,\n restartRequired: true,\n messages: [\n 'Updated hosted Haven MCP and local signer entries with Claude Code.',\n ...(verified ? ['Verified Claude Code MCP entry.'] : []),\n ],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Claude Code MCP config',\n changed: false,\n restartRequired: true,\n messages: [\n `Could not update Claude Code MCP config: ${err instanceof Error ? err.message : String(err)}`,\n 'Install Claude Code or rerun the Haven setup command inside a Claude Code terminal.',\n ],\n errorCode: 'claude_code_config_failed',\n }\n }\n}\n\nasync function defaultRunCommand(command: string, args: string[]): Promise<void> {\n await execFileAsync(command, args, { timeout: 10_000 })\n}\n\nasync function installClaudeSkill(homeDir?: string): Promise<{ installed: boolean; messages: string[] }> {\n try {\n const skillDir = resolve(homeDir ?? homedir(), '.claude', 'skills', SKILL_FOLDER_NAME)\n await mkdir(skillDir, { recursive: true })\n await writeFile(join(skillDir, 'SKILL.md'), HAVEN_SKILL_MD, 'utf8')\n return {\n installed: true,\n messages: ['Installed the generic Haven payment skill (~/.claude/skills/haven-pay). It contains no secrets.'],\n }\n } catch (err) {\n return {\n installed: false,\n messages: [`Could not install the Haven payment skill: ${err instanceof Error ? err.message : String(err)}. Download it from the Haven dashboard instead.`],\n }\n }\n}\n\nfunction buildProbeResult(\n mode: RuntimeMcpMode,\n hostedConfigured: boolean,\n hostedStatus: string,\n signerReady: boolean,\n localMcpReady: boolean,\n localMcpProbeStatus?: LocalMcpProbeStatus,\n): string {\n if (mode === 'local_stdio') {\n if (localMcpReady) return 'local_stdio_mcp_ready'\n return localMcpProbeStatus ? `local_stdio_mcp_${localMcpProbeStatus}` : 'local_stdio_mcp_unavailable'\n }\n const hostedPart = hostedConfigured ? `hosted_${hostedStatus}` : 'hosted_not_configured'\n const signerPart = signerReady ? 'local_signer_ready' : 'local_signer_unavailable'\n return `${hostedPart}_${signerPart}`.slice(0, 120)\n}\n\nasync function resolveLocalMcpConsent(\n input: RuntimeInstallInput,\n messages: string[],\n): Promise<LocalMcpConsentStatus> {\n if (input.ackLocalTools || input.ackSigner) {\n const status = await acknowledgeLocalMcpConsent(input.identityPath, input.signerPath, (message) => messages.push(message))\n if (status.acknowledged) {\n messages.push('Prepared the local Haven tools acknowledgement.')\n } else {\n messages.push('Local Haven tools acknowledgement still needs attention.')\n }\n return status\n }\n return getLocalMcpConsentStatus(input.identityPath, input.signerPath)\n}\n\nasync function resolveSignerConsent(\n input: RuntimeInstallInput,\n messages: string[],\n): Promise<LocalSignerConsentStatus> {\n if (input.ackSigner || input.ackLocalTools) {\n const status = await acknowledgeLocalSignerConsent(input.signerPath, (message) => messages.push(message))\n if (status.acknowledged) {\n messages.push('Prepared the local Haven signer acknowledgement.')\n } else {\n messages.push('Local Haven signer acknowledgement still needs attention.')\n }\n return status\n }\n return getLocalSignerConsentStatus(input.signerPath)\n}\n\nfunction signerConsentErrorCode(\n signerCredentialReady: boolean,\n signerConsent: LocalSignerConsentStatus | undefined,\n): string | undefined {\n if (!signerCredentialReady) return 'local_signer_credential_unavailable'\n if (!signerConsent?.acknowledged) return 'local_signer_ack_required'\n return undefined\n}\n\nfunction hostedMcpErrorCode(\n hostedConfigured: boolean,\n hostedProbeStatus: string,\n): string | undefined {\n if (!hostedConfigured || hostedProbeStatus === 'ok') return undefined\n return `hosted_mcp_probe_${hostedProbeStatus}`\n}\n\nfunction localMcpErrorCode(\n signerCredentialReady: boolean,\n localMcpConsent: LocalMcpConsentStatus | undefined,\n localMcpProbeStatus: LocalMcpProbeStatus | undefined,\n): string | undefined {\n if (!signerCredentialReady) return 'local_signer_credential_unavailable'\n if (!localMcpConsent?.acknowledged) return 'local_mcp_ack_required'\n if (localMcpProbeStatus && localMcpProbeStatus !== 'ok') return `local_mcp_probe_${localMcpProbeStatus}`\n return undefined\n}\n\nfunction nextAction(\n runtime: RuntimeId,\n restartMode: 'restart-session' | 'restart-app' | 'hot-reload' | 'manual',\n errorCode?: string,\n): string {\n if (errorCode) return 'return_to_haven_for_wallet_approval_then_finish_runtime_setup'\n if (restartMode === 'hot-reload') return 'return_to_haven_for_wallet_approval'\n if (runtime === 'codex-cli' || runtime === 'codex-desktop') return 'return_to_haven_for_wallet_approval_then_restart_codex'\n if (runtime === 'claude-code') return 'return_to_haven_for_wallet_approval_then_restart_claude_code'\n if (restartMode === 'restart-app') return 'return_to_haven_for_wallet_approval_then_restart_app'\n if (restartMode === 'restart-session') return 'return_to_haven_for_wallet_approval_then_restart_agent_session'\n return 'return_to_haven_for_wallet_approval_then_configure_runtime'\n}\n\n/**\n * Runtimes where the local-stdio MCP topology can be installed when the user\n * explicitly opts in. Never used by default — the default topology is hosted\n * MCP + local signer for every runtime.\n */\nexport function supportsLocalMcp(runtime: RuntimeId): boolean {\n return runtime === 'codex-cli' || runtime === 'codex-desktop' || runtime === 'claude-code'\n}\n\nasync function prepareRuntimeForLocalMcp(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps,\n): Promise<PreparedLocalMcpRuntime> {\n const prepare = deps.prepareLocalMcpRuntime ?? ((runtimeInput: PrepareLocalMcpRuntimeInput) =>\n prepareLocalMcpRuntime(runtimeInput, { runCommand: deps.runCommand }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n })\n}\n\nasync function prepareSignerForRuntime(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps,\n): Promise<PreparedSignerRuntime> {\n const prepare = deps.prepareSignerRuntime ?? ((runtimeInput: PrepareSignerRuntimeInput) =>\n prepareSignerRuntime(runtimeInput, { runCommand: deps.runCommand }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n })\n}\n\nasync function runLocalMcpProbe(\n runtimeInstall: PreparedLocalMcpRuntime,\n deps: RuntimeInstallDeps,\n): Promise<LocalMcpProbeResult> {\n const probe = deps.probeLocalMcpTools ?? probeLocalMcpTools\n try {\n return await probe(runtimeInstall.command, runtimeInstall.args, MCP_RUNTIME_MANIFEST.requiredTools)\n } catch {\n return { status: 'process_error' }\n }\n}\n\nfunction localRuntimePrepareErrorCode(err: unknown): string {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'local_mcp_unsupported_node_version') {\n return 'local_mcp_unsupported_node_version'\n }\n return 'local_mcp_runtime_install_failed'\n}\n","import { createConnectApiClient, ConnectRequestError, type ConnectApiClient, type ResolvedSetup } from './api.js'\nimport { resolveTokenFromAddress } from '@haven_ai/sdk'\nimport {\n agentApiKeyPrefix,\n generateAgentApiKey,\n generateDelegateKey,\n hashAgentApiKey,\n type LocalDelegateKey,\n} from './key.js'\nimport { redactSecrets, shortAddress } from './redact.js'\nimport {\n preflightCredentialStorage,\n writeCredentialFiles,\n type StoredCredentialPaths,\n} from './storage.js'\nimport {\n installRuntime,\n runtimeInstallCapabilities,\n supportsLocalMcp,\n type RuntimeInstallResult,\n} from './runtime-install.js'\nimport { normalizeRuntime, runtimeProfile, runtimeVerificationInstruction } from './runtime-registry.js'\nimport { assertSupportedNodeVersion } from './local-mcp-runtime.js'\nimport { MCP_RUNTIME_MANIFEST } from './runtime-manifest.js'\n\nexport const CONNECTOR_VERSION = '0.1.23-alpha.2'\n\nexport interface ConnectOptions {\n setupToken: string\n apiBaseUrl: string\n runtime?: string\n credentialsDir?: string\n environmentLabel?: string\n connectorVersion?: string\n ackSigner?: boolean\n ackLocalTools?: boolean\n localMcp?: boolean\n /**\n * #1377 D: keep the process alive after registering and poll for the\n * user's budget approval (default). Set false for structured/automation\n * runs (--json) where prompt output emission matters more than narration.\n */\n waitForApproval?: boolean\n /** Test/injection overrides for the approval poll cadence and clock. */\n approvalWait?: ApprovalWaitOptions\n}\n\n/** The stable machine-readable result emitted by `haven-connect --json`. */\nexport const CONNECT_OUTCOME_SCHEMA_VERSION = 1 as const\n\nexport type ConnectOutcomeStatus = 'complete' | 'action_required' | 'failed'\n\nexport interface ConnectOutcome {\n schema_version: typeof CONNECT_OUTCOME_SCHEMA_VERSION\n outcome: ConnectOutcomeStatus\n runtime: string\n topology: string\n configuration: {\n hosted_mcp: boolean\n local_signer: boolean\n local_mcp: boolean\n }\n probe: { result: string }\n activation: {\n restart_required: boolean\n instruction: string\n }\n next_action: string\n approval: { required: boolean; expires_at: string | null }\n verification: {\n tools: readonly ['haven_get_agent', 'haven_get_allowances']\n instruction: string\n }\n delegate_address?: string\n setup_challenge_expires_at?: string\n error?: { code: string; next_action: string }\n}\n\nexport interface ConnectDeps {\n api?: ConnectApiClient\n generateKey?: () => LocalDelegateKey\n generateApiKey?: () => string\n preflightStorage?: typeof preflightCredentialStorage\n writeCredentials?: typeof writeCredentialFiles\n installRuntime?: typeof installRuntime\n log?: (message: string) => void\n /** JSON CLI mode must not expose owner-only credential file locations. */\n redactPaths?: boolean\n /** Overridable so the Node-floor refusal is testable without spawning a Node. */\n nodeVersion?: string\n}\n\nexport interface ConnectResult {\n setupId: string\n agentId: string\n delegateAddress: string\n credentialPaths: StoredCredentialPaths\n /** Additive, secret-free completion contract shared by library callers and --json. */\n outcome: ConnectOutcome\n}\n\nexport async function runConnect(options: ConnectOptions, deps: ConnectDeps = {}): Promise<ConnectResult> {\n // FIRST, before anything with a side effect (#1161).\n //\n // This runs ahead of the setup-token resolve, the storage preflight, key\n // generation, the agent registration, and every credential write — so a\n // refusal cannot strand a half-created agent or burn a one-shot setup token,\n // the same discipline the hosted-MCP-URL guard adopted in #1129.\n //\n // It is checked on EVERY topology, which is the actual fix here. The guard\n // already existed but only ran inside local-MCP installation, reached solely\n // via `--local`; the default hosted-MCP + local-signer path — what nearly\n // every user runs — never touched it. The floor was enforced on the advanced\n // path and unenforced on the common one.\n //\n // Refuse rather than warn: what gets installed is the signer, which holds the\n // delegate key and produces every payment signature. An unsupported runtime\n // under a signing component is not a state to continue from, and npm's own\n // EBADENGINE notice is advisory unless the user happens to run engine-strict.\n assertSupportedNodeVersion(deps.nodeVersion, MCP_RUNTIME_MANIFEST.minimumNodeVersion)\n\n const connectorVersion = options.connectorVersion ?? CONNECTOR_VERSION\n const api = deps.api ?? createConnectApiClient(options.apiBaseUrl)\n const log = secureLogger(\n deps.log ?? ((message) => process.stdout.write(`${message}\\n`)),\n deps.redactPaths === true,\n )\n const writeCredentials = deps.writeCredentials ?? writeCredentialFiles\n const preflightStorage = deps.preflightStorage ?? preflightCredentialStorage\n const runRuntimeInstall = deps.installRuntime ?? installRuntime\n const generateKey = deps.generateKey ?? generateDelegateKey\n const generateLocalApiKey = deps.generateApiKey ?? generateAgentApiKey\n const installCapabilities = runtimeInstallCapabilities(options.runtime)\n\n if (options.localMcp) {\n const resolvedRuntime = normalizeRuntime(options.runtime)\n if (!supportsLocalMcp(resolvedRuntime)) {\n throw new Error(\n `--local (fully-local Haven MCP) is only available for Claude Code and Codex. ` +\n `The detected runtime is ${runtimeProfile(resolvedRuntime).label}. ` +\n 'Re-run without --local to use the default hosted MCP + local signer setup.',\n )\n }\n }\n\n log('Warming up your connection to Haven…')\n const setup = await api.resolveSetup({\n setupToken: options.setupToken,\n connectorVersion,\n runtime: options.runtime,\n })\n assertSetupChallengeIsUsable(setup.challenge.expires_at)\n printSetupSummary(setup, log)\n\n await preflightStorage({ baseDir: options.credentialsDir, warn: log })\n log('Checked local credential storage — all clear.')\n\n const localKey = generateKey()\n const localApiKey = generateLocalApiKey()\n log('Minting a fresh signing key and API key — both stay on this machine.')\n const proofSignature = await localKey.signChallenge(setup.challenge.message)\n\n log('Introducing your agent to Haven…')\n let registration: Awaited<ReturnType<ConnectApiClient['registerSetup']>>\n try {\n registration = await api.registerSetup({\n setupToken: options.setupToken,\n connectorVersion,\n runtime: options.runtime,\n challengeId: setup.challenge.id,\n delegateAddress: localKey.address,\n proofSignature,\n apiKeyHash: hashAgentApiKey(localApiKey),\n apiKeyPrefix: agentApiKeyPrefix(localApiKey),\n connectorContext: {\n environment_label: options.environmentLabel ?? 'Local workspace',\n config_target: installCapabilities.canWriteRuntimeConfig\n ? 'agent runtime MCP config'\n : 'local credential files',\n },\n installCapabilities,\n })\n } catch (err) {\n if (isExpiredSetupChallenge(err)) {\n throw new Error(\n 'The Haven setup challenge expired while connecting. Return to Haven, start a fresh connection, and run its new Connect command. Do not reuse or paste credentials.',\n )\n }\n throw err\n }\n\n log(`Registered signing address with Haven: ${shortAddress(registration.delegate_address)}.`)\n\n log('Tucking your credentials away safely on disk…')\n const credentialPaths = await writeCredentials({\n baseDir: options.credentialsDir,\n agentId: registration.agent_id,\n apiKey: localApiKey,\n delegateKey: localKey.privateKey,\n delegateAddress: localKey.address,\n safeAddress: setup.haven_wallet.address,\n chainId: setup.haven_wallet.chain_id,\n network: setup.haven_wallet.network,\n agentBudget: setup.agent_budget.map((budget) => ({\n token_symbol: budget.token_symbol,\n allowance_amount: budget.allowance_amount,\n reset_period_min: budget.reset_period_min,\n })),\n apiUrl: options.apiBaseUrl,\n hostedMcpUrl: registration.hosted_mcp_url,\n x402BindingSigner: setup.x402_binding_signer ?? undefined,\n warn: log,\n })\n log(`Stored Haven identity credential locally: ${credentialPaths.identityPath}`)\n log(`Stored local signer credential locally: ${credentialPaths.signerPath}`)\n log(`Stored non-secret agent orientation locally: ${credentialPaths.agentPath}`)\n if (setup.x402_binding_signer) {\n log('Configured x402 binding signer for the local signer.')\n } else {\n // Fail loud here rather than silently at x402 sign time: without a trusted\n // binding signer the edge signer refuses to sign x402 funding hashes.\n log(\n 'Warning: Haven did not provide an x402 binding signer, so x402 payments will not sign ' +\n 'until HAVEN_X402_BINDING_SIGNER is set for the signer. Non-x402 payments are unaffected.',\n )\n }\n\n const runtimeInstall = await runRuntimeInstall({\n runtime: options.runtime,\n hostedMcpUrl: registration.hosted_mcp_url,\n apiKey: localApiKey,\n signerPath: credentialPaths.signerPath,\n identityPath: credentialPaths.identityPath,\n credentialDirectory: credentialPaths.directory,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n ackSigner: options.ackSigner,\n ackLocalTools: options.ackLocalTools,\n localMcp: options.localMcp,\n }, { onProgress: log })\n printRuntimeInstall(runtimeInstall, log)\n\n // Tell the user they're done and what to do next BEFORE the telemetry call —\n // the install-status report is best-effort and must not sit between them and\n // the \"you're finished\" signal. The agent who reported the setup couldn't tell\n // whether the connector had finished; this affirms it explicitly. Only claim\n // completion when the runtime install actually succeeded — an errorCode means\n // manual steps remain (e.g. an unrecognized runtime), so don't overstate it.\n if (runtimeInstall.errorCode) {\n log('Haven setup needs a couple more steps on this machine — see the notes above.')\n } else {\n log('Haven setup on this machine is complete.')\n }\n\n // Report the completed runtime state before polling for budget approval.\n // The dashboard intentionally withholds approval controls until it knows the\n // local runtime is configured; polling first would wait on controls the\n // connector itself has not made available yet. This remains best-effort\n // readiness metadata only: a failed report cannot activate the agent or\n // change its budget authority.\n try {\n await api.updateInstallStatus(registration.setup_id, localApiKey, {\n runtime: runtimeInstall.runtime,\n connectorVersion,\n runtimeMcpMode: runtimeInstall.runtimeMcpMode,\n hostedMcpConfigured: runtimeInstall.hostedMcpConfigured,\n localSignerConfigured: runtimeInstall.localSignerConfigured,\n localMcpConfigured: runtimeInstall.localMcpConfigured,\n credentialFilesWritten: true,\n signerAcknowledged: runtimeInstall.signerAcknowledged,\n localMcpAcknowledged: runtimeInstall.localMcpAcknowledged,\n activationCommandAvailable: Boolean(runtimeInstall.activationCommand),\n skillInstalled: runtimeInstall.skillInstalled,\n probeResult: runtimeInstall.probeResult,\n restartRequired: runtimeInstall.restartRequired,\n nextUserAction: runtimeInstall.nextUserAction,\n errorCode: runtimeInstall.errorCode,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n })\n } catch (err) {\n log(`Could not report install status to Haven: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n // #1377 D: stay alive through the approval instead of going dead exactly\n // while the user acts. Skipped in structured/automation mode\n // (waitForApproval: false — the --json contract emits promptly) and when\n // the install itself needs manual completion first.\n if (options.waitForApproval !== false && !runtimeInstall.errorCode) {\n await waitForBudgetApproval(api, registration.setup_id, localApiKey, log, options.approvalWait)\n }\n\n printNextSteps(runtimeInstall, log)\n\n return {\n setupId: registration.setup_id,\n agentId: registration.agent_id,\n delegateAddress: registration.delegate_address,\n credentialPaths,\n outcome: completionOutcome({\n runtimeInstall,\n delegateAddress: registration.delegate_address,\n setupChallengeExpiresAt: setup.challenge.expires_at,\n approvalRequired: registration.agent_status === 'pending_approval',\n }),\n }\n}\n\nexport function completionOutcome(input: {\n runtimeInstall: RuntimeInstallResult\n delegateAddress: string\n setupChallengeExpiresAt?: string\n approvalRequired: boolean\n}): ConnectOutcome {\n const { runtimeInstall } = input\n const manualSetup = runtimeInstall.errorCode === 'manual_runtime_setup_required'\n const nextAction = runtimeInstall.nextUserAction\n const outcome: ConnectOutcome = {\n schema_version: CONNECT_OUTCOME_SCHEMA_VERSION,\n outcome: runtimeInstall.errorCode ? 'action_required' : 'complete',\n runtime: runtimeInstall.runtime,\n topology: runtimeInstall.runtimeMcpMode,\n configuration: {\n hosted_mcp: runtimeInstall.hostedMcpConfigured,\n local_signer: runtimeInstall.localSignerConfigured,\n local_mcp: runtimeInstall.localMcpConfigured,\n },\n probe: { result: runtimeInstall.probeResult },\n activation: {\n restart_required: runtimeInstall.restartRequired,\n instruction: manualSetup\n ? 'Finish the manual MCP setup using the secret-free references shown in normal Connect output, then start a fresh session.'\n : runtimeProfile(runtimeInstall.runtime).activationInstruction,\n },\n next_action: nextAction,\n approval: { required: input.approvalRequired, expires_at: null },\n verification: {\n tools: ['haven_get_agent', 'haven_get_allowances'] as const,\n instruction: runtimeVerificationInstruction(runtimeInstall.runtime),\n },\n // The backend contract supplies a 20-byte address. If an unexpected\n // malformed value arrives, do not echo it into an automation-facing\n // record; the human log has already been redacted separately.\n delegate_address: /^0x[0-9a-fA-F]{40}$/.test(input.delegateAddress)\n ? shortAddress(input.delegateAddress)\n : '[delegate-address-redacted]',\n ...(input.setupChallengeExpiresAt ? { setup_challenge_expires_at: input.setupChallengeExpiresAt } : {}),\n ...(runtimeInstall.errorCode\n ? { error: { code: runtimeInstall.errorCode, next_action: nextAction } }\n : {}),\n }\n return outcome\n}\n\n/**\n * A deliberately terse failure record: error messages can contain server or\n * filesystem detail, while this public contract must remain safe to serialize.\n */\nexport function failedConnectOutcome(runtimeHint: string | undefined, error: unknown): ConnectOutcome {\n const message = error instanceof Error ? error.message : ''\n const code = /Node\\.js >=/i.test(message)\n ? 'unsupported_node_version'\n : /setup challenge.*expired|expired or invalid/i.test(message)\n ? 'setup_challenge_expired_or_invalid'\n : /only available for Claude Code and Codex/i.test(message)\n ? 'local_mcp_unsupported_runtime'\n : 'connect_failed'\n const runtime = normalizeRuntime(runtimeHint)\n const nextAction = code === 'setup_challenge_expired_or_invalid'\n ? 'return_to_haven_for_fresh_setup'\n : code === 'unsupported_node_version'\n ? 'install_supported_node_and_rerun_connect'\n : code === 'local_mcp_unsupported_runtime'\n ? 'rerun_without_local_mcp'\n : 'review_the_safe_error_output_and_start_a_fresh_haven_setup_if_needed'\n return {\n schema_version: CONNECT_OUTCOME_SCHEMA_VERSION,\n outcome: 'failed',\n runtime,\n topology: 'unknown',\n configuration: { hosted_mcp: false, local_signer: false, local_mcp: false },\n probe: { result: 'not_run' },\n activation: { restart_required: false, instruction: 'Resolve the reported problem before activating Haven tools.' },\n next_action: nextAction,\n approval: { required: false, expires_at: null },\n verification: {\n tools: ['haven_get_agent', 'haven_get_allowances'] as const,\n instruction: 'After a successful setup and activation, verify only with haven_get_agent and haven_get_allowances.',\n },\n error: { code, next_action: nextAction },\n }\n}\n\nfunction printSetupSummary(setup: ResolvedSetup, log: (message: string) => void): void {\n log(`Fetched Haven setup for ${setup.agent.name}.`)\n log(`Haven wallet: ${setup.haven_wallet.name} on ${setup.haven_wallet.network}.`)\n if (setup.agent_budget.length > 0) {\n for (const budget of setup.agent_budget) {\n log(\n `Agent budget: ${budget.allowance_amount} atomic ${budget.token_symbol} / ${budget.reset_period_min} minute reset.`,\n )\n }\n }\n log(`Setup challenge expires at ${setup.challenge.expires_at}. If it expires, return to Haven for a fresh setup and rerun Connect — do not reuse or paste credentials.`)\n}\n\nfunction assertSetupChallengeIsUsable(expiresAt: string): void {\n const expiresAtMs = Date.parse(expiresAt)\n if (!Number.isNaN(expiresAtMs) && expiresAtMs > Date.now()) return\n throw new Error(\n 'This Haven setup challenge is expired or invalid. Return to Haven, start a fresh connection, and rerun Connect. No local credentials were written.',\n )\n}\n\nfunction isExpiredSetupChallenge(err: unknown): boolean {\n return err instanceof Error && /(?:setup )?challenge.*expir|expir.*(?:setup )?challenge/i.test(err.message)\n}\n\nfunction secureLogger(log: (message: string) => void, redactPaths = false): (message: string) => void {\n return (message) => {\n let safe = redactSecrets(message)\n if (redactPaths) {\n safe = safe\n .replace(/(?:~|\\/)[^\\s`\"']*\\/(?:identity|signer|agent)\\.json\\b/g, '[credential-file-redacted]')\n .replace(/(?:~|\\/)[^\\s`\"']*\\/\\.env\\b/g, '[credential-env-redacted]')\n }\n log(safe)\n }\n}\n\nfunction printRuntimeInstall(result: RuntimeInstallResult, log: (message: string) => void): void {\n for (const message of result.messages) log(message)\n if (result.localMcpConfigured) {\n log('Configured local Haven MCP tools.')\n } else if (result.hostedMcpConfigured) {\n log('Configured hosted Haven MCP identity.')\n } else {\n log('Haven MCP tools still need runtime setup.')\n }\n if (result.localSignerConfigured) {\n log('Configured local Haven signer.')\n } else {\n log('Local Haven signer still needs runtime setup.')\n }\n}\n\n/**\n * #1377 D: after registering, the connector no longer goes dead while the\n * user approves in Haven — it polls the narrow connector-status endpoint\n * (agent-API-key auth, works during `setup_pending`) and narrates progress in\n * the flow's voice, ending in a concrete celebration naming the granted\n * authority. Bounds (stated per the issue): poll every 5 s, give up after\n * 3 minutes — the connector ALWAYS terminates on its own; a timeout is a\n * clean exit with guidance, never a hang. Injectable clock/cadence for tests.\n */\nexport interface ApprovalWaitOptions {\n intervalMs?: number\n timeoutMs?: number\n sleep?: (ms: number) => Promise<void>\n}\n\n/** Human form of an atomic amount — whole numbers stay whole (\"25\", not \"25.0\"). */\nfunction formatAtomicAmount(atomic: bigint, decimals: number): string {\n const s = atomic.toString().padStart(decimals + 1, '0')\n const intPart = s.slice(0, s.length - decimals) || '0'\n const fracPart = s.slice(s.length - decimals).replace(/0+$/, '')\n return fracPart ? `${intPart}.${fracPart}` : intPart\n}\n\nfunction describeResetPeriod(resetPeriodMin: number): string {\n if (resetPeriodMin === 1440) return 'per day'\n if (resetPeriodMin === 60) return 'per hour'\n if (resetPeriodMin === 0) return 'with no automatic reset'\n return `per ${resetPeriodMin} minutes`\n}\n\nfunction describeApprovedBudget(budget: {\n token_symbol: string\n token_address: string\n amount: string\n reset_period_min: number\n}): string {\n const token = resolveTokenFromAddress(budget.token_address)\n const amount = token\n ? `${formatAtomicAmount(BigInt(budget.amount), token.decimals)} ${budget.token_symbol}`\n : `${budget.amount} ${budget.token_symbol} (atomic units)`\n return `${amount} ${describeResetPeriod(budget.reset_period_min)}`\n}\n\nexport async function waitForBudgetApproval(\n api: Pick<ConnectApiClient, 'getConnectorStatus'>,\n setupId: string,\n apiKey: string,\n log: (message: string) => void,\n options: ApprovalWaitOptions = {},\n): Promise<'approved' | 'pending' | 'ended'> {\n const intervalMs = options.intervalMs ?? 5_000\n const timeoutMs = options.timeoutMs ?? 180_000\n const sleep = options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)))\n const maxPolls = Math.max(1, Math.floor(timeoutMs / intervalMs))\n const remindEvery = Math.max(1, Math.floor(30_000 / intervalMs))\n\n log('Registered with Haven — waiting for you to approve the budget in the dashboard…')\n for (let i = 0; i < maxPolls; i++) {\n await sleep(intervalMs)\n let status: Awaited<ReturnType<ConnectApiClient['getConnectorStatus']>>\n try {\n status = await api.getConnectorStatus(setupId, apiKey)\n } catch (err) {\n // 401/404 are verdicts, not noise: the user cancelled the setup from\n // the dashboard (key revoked) or the setup is gone. Retrying for the\n // rest of the window and then saying \"still pending\" would be wrong —\n // there is nothing left to approve.\n if (err instanceof ConnectRequestError && (err.status === 401 || err.status === 404)) {\n log('This setup ended in Haven — start a fresh connection from the dashboard when ready.')\n return 'ended'\n }\n // A flaky poll is not a verdict — keep waiting inside the same bound.\n continue\n }\n if (status.status === 'active') {\n log(\n status.approved_budget\n ? `Budget approved 🎉 — I can now spend up to ${describeApprovedBudget(status.approved_budget)} from your Haven wallet.`\n : 'Budget approved 🎉 — the agent can now spend within its Haven rules.',\n )\n return 'approved'\n }\n if (status.status === 'cancelled' || status.status === 'expired' || status.status === 'failed') {\n log(`This setup ended in Haven (${status.status}) — start a fresh connection from the dashboard when ready.`)\n return 'ended'\n }\n if ((i + 1) % remindEvery === 0) {\n log('Still waiting for budget approval in Haven…')\n }\n }\n log(\n 'Budget approval is still pending in Haven. Approve it in the dashboard whenever you are ready — ' +\n 'the agent tools unlock the moment you do. Verify later with the read-only haven_get_agent tool.',\n )\n return 'pending'\n}\n\n/**\n * The two remaining gates after the local connector finishes: approve the rules\n * in Haven, then (for most runtimes) restart so the freshly-written MCP config\n * is loaded. The approval line states the dependency explicitly — tools never\n * appear before approval, restart or not — because an agent that had already\n * approved still couldn't tell whether missing tools meant \"not approved\" or\n * \"needs restart.\"\n */\nexport function completionHandoffLines(result: RuntimeInstallResult): string[] {\n if (result.errorCode === 'manual_runtime_setup_required') {\n return [\n 'Next steps:',\n '1. Return to Haven and approve the agent rules. Approval — not restarting — unlocks Haven tools.',\n '2. Finish the manual MCP setup using the secret-free file references printed above, then start a fresh session in your runtime.',\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n }\n if (result.errorCode) {\n return [\n 'Recovery: runtime setup is not complete. Resolve the reported problem, then return to Haven for a fresh connection and run its new Connect command. Do not manually edit runtime config or paste credentials into prompts, logs, or config.',\n ]\n }\n\n const profile = runtimeProfile(result.runtime)\n return [\n 'Next steps:',\n '1. Return to Haven and approve the agent rules. Approval — not restarting — unlocks Haven tools.',\n `2. ${profile.activationInstruction}`,\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n}\n\nfunction printNextSteps(result: RuntimeInstallResult, log: (message: string) => void): void {\n for (const line of completionHandoffLines(result)) log(line)\n}\n","import { CONNECTOR_VERSION, type ConnectOptions } from './runtime.js'\n\nexport interface ParsedCli {\n options: ConnectOptions\n help: boolean\n json: boolean\n}\n\nexport function parseArgs(argv: string[], env: NodeJS.ProcessEnv = process.env): ParsedCli {\n const options: Partial<ConnectOptions> = {\n apiBaseUrl: env.HAVEN_API_URL ?? 'http://localhost:3001',\n connectorVersion: CONNECTOR_VERSION,\n }\n let help = false\n let json = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--help' || arg === '-h') {\n help = true\n } else if (arg === '--json') {\n json = true\n } else if (arg === '--setup' || arg === '--setup-token') {\n options.setupToken = requireValue(argv, ++i, arg)\n } else if (arg === '--api' || arg === '--api-url') {\n options.apiBaseUrl = requireValue(argv, ++i, arg)\n } else if (arg === '--runtime') {\n options.runtime = requireValue(argv, ++i, arg)\n } else if (arg === '--credentials-dir') {\n options.credentialsDir = requireValue(argv, ++i, arg)\n } else if (arg === '--environment-label') {\n options.environmentLabel = requireValue(argv, ++i, arg)\n } else if (arg === '--ack-local-tools') {\n options.ackLocalTools = true\n } else if (arg === '--ack-signer') {\n options.ackSigner = true\n options.ackLocalTools = true\n } else if (arg === '--local' || arg === '--local-mcp') {\n options.localMcp = true\n } else if (arg === '--version') {\n process.stdout.write(`${CONNECTOR_VERSION}\\n`)\n process.exit(0)\n } else {\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n if (help) {\n return { options: options as ConnectOptions, help, json }\n }\n\n if (!options.setupToken) {\n throw new Error('Missing --setup <hv_setup_...> setup token.')\n }\n if (!options.apiBaseUrl) {\n throw new Error('Missing --api <Haven API URL>.')\n }\n\n options.apiBaseUrl = options.apiBaseUrl.replace(/\\/+$/, '')\n return { options: options as ConnectOptions, help, json }\n}\n\nexport function helpText(): string {\n return [\n 'Haven Connect Agent 2 local connector',\n '',\n 'Generates the agent signing key locally, stores it on this machine, and',\n 'sends Haven only the public signing address plus a proof signature.',\n '',\n 'Usage:',\n ' npx -y @haven_ai/connect --setup hv_setup_... --api https://api.haven.example --ack-local-tools --runtime claude-code',\n '',\n 'Options:',\n ' --setup <token> Short-lived setup token from Haven.',\n ' --api <url> Haven backend API URL. Defaults to HAVEN_API_URL or http://localhost:3001.',\n ' --runtime <name> Agent runtime hint, such as claude-code, codex-cli, codex-desktop, cursor, vscode, claude-desktop, or hermes.',\n ' --credentials-dir <path> Credential directory fallback. Defaults to ~/.haven/agents.',\n ' --environment-label <text> Non-sensitive label shown in Haven setup review.',\n ' --ack-local-tools Write the one-time local Haven tools acknowledgement during setup.',\n ' --ack-signer Backward-compatible alias for --ack-local-tools.',\n ' --local Advanced: install the fully-local Haven MCP (no hosted dependency).',\n ' Only available for Claude Code and Codex. Default is hosted MCP + local signer.',\n ' --json Emit one versioned, secret-free result object on stdout; progress stays on stderr.',\n ' --help Show this help.',\n '',\n 'The connector never prints the private key and never sends it to Haven. JSON output never includes credential contents or full credential paths.',\n ].join('\\n')\n}\n\nfunction requireValue(argv: string[], index: number, option: string): string {\n const value = argv[index]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${option}.`)\n }\n return value\n}\n","#!/usr/bin/env node\n\nimport { realpathSync } from 'node:fs'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { helpText, parseArgs } from './args.js'\nimport { failedConnectOutcome, runConnect } from './runtime.js'\nimport { redactSecrets } from './redact.js'\n\nexport interface CliIo {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\nexport async function runCli(\n argv: string[],\n io: CliIo = {\n stdout: (message) => process.stdout.write(message),\n stderr: (message) => process.stderr.write(message),\n },\n): Promise<number> {\n const wantsJson = argv.includes('--json')\n let parsed\n try {\n parsed = parseArgs(argv)\n } catch (err) {\n if (wantsJson) {\n io.stdout(`${JSON.stringify(failedConnectOutcome(undefined, err))}\\n`)\n } else {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n }\n return 1\n }\n if (parsed.help) {\n io.stdout(`${helpText()}\\n`)\n return 0\n }\n try {\n // --json is the automation contract: emit the outcome promptly instead of\n // blocking up to the approval-wait bound (#1377 D).\n const result = await runConnect(\n { ...parsed.options, waitForApproval: !parsed.json },\n {\n log: (message) => (parsed.json ? io.stderr : io.stdout)(`${message}\\n`),\n redactPaths: parsed.json,\n },\n )\n if (parsed.json) io.stdout(`${JSON.stringify(result.outcome)}\\n`)\n return 0\n } catch (err) {\n if (parsed.json) {\n io.stdout(`${JSON.stringify(failedConnectOutcome(parsed.options.runtime, err))}\\n`)\n } else {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n }\n return 1\n }\n}\n\nasync function main(): Promise<void> {\n const exitCode = await runCli(process.argv.slice(2))\n if (exitCode !== 0) process.exitCode = exitCode\n}\n\n/**\n * npm executes package bins through a `node_modules/.bin` symlink. Node keeps\n * that symlink in `process.argv[1]`, whereas `import.meta.url` identifies the\n * real module path. Resolve both sides before comparing so a published\n * `haven-connect` bin starts, while an ordinary `runCli` import remains inert.\n */\nexport function isCliEntrypoint(\n argvPath: string | undefined = process.argv[1],\n moduleUrl: string = import.meta.url,\n): boolean {\n if (!argvPath) return false\n try {\n return realpathSync(argvPath) === realpathSync(fileURLToPath(moduleUrl))\n } catch {\n // Keep the direct-file behavior when a loader provides an unresolvable\n // path. A missing path cannot be a safe reason to run imported CLI code.\n return pathToFileURL(argvPath).href === moduleUrl\n }\n}\n\nif (isCliEntrypoint()) void main()\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/key.ts","../src/redact.ts","../src/storage.ts","../src/runtime-manifest.ts","../src/config-writers.ts","../src/local-mcp-consent.ts","../src/probes.ts","../src/local-mcp-runtime.ts","../src/signer-runtime.ts","../src/skill-install.ts","../src/runtime-registry.ts","../src/signer-consent.ts","../src/runtime-install.ts","../src/runtime.ts","../src/args.ts","../src/cli.ts"],"names":["Wallet","crypto","mkdir","join","rm","homedir","resolve","writeFile","access","chmod","MCP_VERSION","HAVEN_MINIMUM_NODE_VERSION","registeredToolNames","parseDocument","isMap","replacement","needsTrailingNewline","stringify","unlink","merged","readFile","path","dirname","platform","ensureConsent","computeConsentHash","loadCredentials","consentInputFromClient","spawn","promisify","execFile","unsupportedNodeVersionMessage","isSupportedNodeVersion","execFileAsync","installedRuntimeMatches","installRuntimePackages","assertFileExists","writeWrapper","writeRuntimeSidecar","readPackageJson","SKILL_FOLDER_NAME","HAVEN_SKILL_MD","HAVEN_SKILL_BODY_MD","ensureSignerConsent","writeLogChunk","computeSignerConsentHash","loadSignerCredentials","signer","createEdgeSigner","toolSchemas","signerCredentialReady","errorCode","nextAction","resolveTokenFromAddress","realpathSync","fileURLToPath","pathToFileURL"],"mappings":"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","file":"cli.cjs","sourcesContent":["export interface ConnectApiClient {\n resolveSetup(input: ResolveSetupInput): Promise<ResolvedSetup>\n registerSetup(input: RegisterSetupInput): Promise<RegisterSetupResponse>\n updateInstallStatus(\n setupId: string,\n apiKey: string,\n input: UpdateInstallStatusInput,\n ): Promise<void>\n /**\n * #1377 D: the narrow status read the connector polls after registering,\n * authenticated with the agent API key it just minted (works while the\n * agent is still `setup_pending` — the endpoint exists for exactly that\n * window). Returns status plus the approved budget once approval lands;\n * never any secret material.\n */\n getConnectorStatus(setupId: string, apiKey: string): Promise<ConnectorStatusResponse>\n}\n\nexport interface ConnectorStatusResponse {\n status: string\n approved_budget: {\n token_symbol: string\n token_address: string\n amount: string\n reset_period_min: number\n } | null\n}\n\nexport interface ResolveSetupInput {\n setupToken: string\n connectorVersion: string\n runtime?: string\n}\n\nexport interface RegisterSetupInput extends ResolveSetupInput {\n challengeId: string\n delegateAddress: string\n proofSignature: string\n apiKeyHash: string\n apiKeyPrefix: string\n connectorContext?: ConnectorContext\n installCapabilities?: {\n canWriteRuntimeConfig?: boolean\n restartRequired?: boolean\n }\n}\n\nexport interface UpdateInstallStatusInput {\n runtime?: string\n connectorVersion: string\n runtimeMcpMode?: string\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured?: boolean\n credentialFilesWritten?: boolean\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n activationCommandAvailable?: boolean\n skillInstalled?: boolean\n probeResult: string\n restartRequired: boolean\n nextUserAction: string\n errorCode?: string | null\n environmentLabel?: string\n}\n\nexport interface ConnectorContext {\n environment_label?: string\n runtime_version?: string\n config_target?: string\n}\n\nexport interface ResolvedSetup {\n setup_id: string\n status: string\n agent: {\n name: string\n description?: string | null\n }\n haven_wallet: {\n id: string\n name: string\n address: string\n chain_id: number\n network: string\n }\n agent_budget: Array<{\n token_address: string\n token_symbol: string\n allowance_amount: string\n reset_period_min: number\n }>\n hosted_mcp_url: string\n // Address the edge signer verifies x402 expected-context signatures against.\n // null/absent when the backend has no x402 binding key configured.\n x402_binding_signer?: string | null\n challenge: {\n id: string\n message: string\n expires_at: string\n }\n}\n\nexport interface RegisterSetupResponse {\n setup_id: string\n agent_id: string\n status: string\n agent_status: string\n api_key_prefix: string\n api_key_scope: string\n delegate_address: string\n hosted_mcp_url: string\n next_action: string\n}\n\nexport function createConnectApiClient(baseUrl: string, fetchImpl: typeof fetch = fetch): ConnectApiClient {\n const root = baseUrl.replace(/\\/+$/, '')\n return {\n resolveSetup: (input) =>\n request(fetchImpl, `${root}/agent-connection-setups/resolve`, {\n method: 'POST',\n body: JSON.stringify({\n setup_token: input.setupToken,\n connector_version: input.connectorVersion,\n runtime: input.runtime,\n }),\n }),\n\n registerSetup: (input) =>\n request(fetchImpl, `${root}/agent-connection-setups/register`, {\n method: 'POST',\n body: JSON.stringify({\n setup_token: input.setupToken,\n challenge_id: input.challengeId,\n delegate_address: input.delegateAddress,\n proof_signature: input.proofSignature,\n api_key_hash: input.apiKeyHash,\n api_key_prefix: input.apiKeyPrefix,\n runtime: input.runtime,\n connector_version: input.connectorVersion,\n connector_context: input.connectorContext,\n install_capabilities: input.installCapabilities && {\n can_write_runtime_config: input.installCapabilities.canWriteRuntimeConfig,\n restart_required: input.installCapabilities.restartRequired,\n },\n }),\n }),\n\n getConnectorStatus: (setupId, apiKey) =>\n request(fetchImpl, `${root}/agent-connection-setups/${encodeURIComponent(setupId)}/connector-status`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}` },\n }),\n\n updateInstallStatus: async (setupId, apiKey, input) => {\n await request(fetchImpl, `${root}/agent-connection-setups/${encodeURIComponent(setupId)}/install-status`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n body: JSON.stringify({\n runtime: input.runtime,\n connector_version: input.connectorVersion,\n runtime_mcp_mode: input.runtimeMcpMode,\n hosted_mcp_configured: input.hostedMcpConfigured,\n local_signer_configured: input.localSignerConfigured,\n local_mcp_configured: input.localMcpConfigured,\n credential_files_written: input.credentialFilesWritten,\n signer_acknowledged: input.signerAcknowledged,\n local_mcp_acknowledged: input.localMcpAcknowledged,\n activation_command_available: input.activationCommandAvailable,\n skill_installed: input.skillInstalled,\n probe_result: input.probeResult,\n restart_required: input.restartRequired,\n next_user_action: input.nextUserAction,\n error_code: input.errorCode ?? null,\n environment_label: input.environmentLabel,\n }),\n })\n },\n }\n}\n\n/**\n * Request failure carrying the HTTP status, so callers can tell a permanent\n * verdict (401 revoked key, 404 gone) from transient noise (5xx, network).\n * The approval poll loop (#1377 D) branches on this: retrying a 401 for the\n * full window and then saying \"still pending\" is actively wrong when the user\n * cancelled the setup and the key was revoked.\n */\nexport class ConnectRequestError extends Error {\n constructor(message: string, readonly status: number) {\n super(message)\n this.name = 'ConnectRequestError'\n }\n}\n\nasync function request<T>(\n fetchImpl: typeof fetch,\n url: string,\n init: RequestInit,\n): Promise<T> {\n const response = await fetchImpl(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...(init.headers ?? {}),\n },\n })\n const text = await response.text()\n const body = text ? JSON.parse(text) : null\n if (!response.ok) {\n const message = body?.error ?? body?.message ?? `${response.status} ${response.statusText}`\n throw new ConnectRequestError(`Haven setup request failed: ${message}`, response.status)\n }\n return body as T\n}\n","import crypto from 'node:crypto'\nimport { Wallet } from 'ethers'\n\nexport interface LocalDelegateKey {\n privateKey: string\n address: string\n signChallenge(message: string): Promise<string>\n}\n\nexport function generateDelegateKey(): LocalDelegateKey {\n return delegateKeyFromPrivateKey(Wallet.createRandom().privateKey)\n}\n\nexport function delegateKeyFromPrivateKey(privateKey: string): LocalDelegateKey {\n const wallet = new Wallet(privateKey)\n return {\n privateKey: wallet.privateKey,\n address: wallet.address,\n signChallenge: (message: string) => wallet.signMessage(message),\n }\n}\n\nexport function generateAgentApiKey(): string {\n return `sk_agent_${crypto.randomBytes(24).toString('hex')}`\n}\n\nexport function hashAgentApiKey(apiKey: string): string {\n return crypto.createHash('sha256').update(apiKey).digest('hex')\n}\n\nexport function agentApiKeyPrefix(apiKey: string): string {\n return apiKey.slice(0, 12)\n}\n","const API_KEY_RE = /sk_agent_[A-Za-z0-9]+/g\nconst PRIVATE_KEY_RE = /0x[0-9a-fA-F]{64}/g\n\nexport function redactSecrets(value: string): string {\n return value\n .replace(API_KEY_RE, 'sk_agent_[redacted]')\n .replace(PRIVATE_KEY_RE, '0x[redacted-private-key]')\n}\n\nexport function shortAddress(address: string): string {\n if (!/^0x[0-9a-fA-F]{40}$/.test(address)) return address\n return `${address.slice(0, 6)}...${address.slice(-4)}`\n}\n","import { access, chmod, mkdir, rm, writeFile } from 'node:fs/promises'\nimport crypto from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nexport interface StoredCredentialPaths {\n directory: string\n identityPath: string\n signerPath: string\n /** Non-secret orientation file (identity + configured budget, no keys). */\n agentPath: string\n}\n\nexport interface WriteCredentialInput {\n baseDir?: string\n agentId: string\n apiKey: string\n delegateKey: string\n delegateAddress: string\n safeAddress?: string\n chainId?: number\n network?: string\n agentBudget?: Array<{\n token_symbol: string\n allowance_amount: string\n reset_period_min: number\n }>\n apiUrl: string\n hostedMcpUrl: string\n x402BindingSigner?: string\n warn?: (message: string) => void\n}\n\nexport interface PreflightCredentialStorageInput {\n baseDir?: string\n warn?: (message: string) => void\n}\n\nexport async function preflightCredentialStorage(\n input: PreflightCredentialStorageInput = {},\n): Promise<string> {\n const directory = defaultCredentialRoot(input.baseDir)\n await mkdir(directory, { recursive: true, mode: 0o700 })\n await restrictPermissions(directory, 0o700, input.warn)\n\n const probePath = join(directory, `.haven-connect-preflight-${crypto.randomBytes(8).toString('hex')}`)\n try {\n await writeOwnerOnlyJson(probePath, { ok: true }, input.warn)\n } finally {\n await rm(probePath, { force: true }).catch(() => undefined)\n }\n\n return directory\n}\n\nexport async function writeCredentialFiles(input: WriteCredentialInput): Promise<StoredCredentialPaths> {\n const directory = defaultAgentDirectory(input.agentId, input.baseDir)\n await mkdir(directory, { recursive: true, mode: 0o700 })\n await restrictPermissions(directory, 0o700, input.warn)\n\n const identityPath = join(directory, 'identity.json')\n const signerPath = join(directory, 'signer.json')\n const agentPath = join(directory, 'agent.json')\n\n await assertDoesNotExist(identityPath)\n await assertDoesNotExist(signerPath)\n await assertDoesNotExist(agentPath)\n\n await writeOwnerOnlyJson(\n signerPath,\n {\n delegate_key: input.delegateKey,\n delegate_address: input.delegateAddress,\n agent_id: input.agentId,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n x402_binding_signer: input.x402BindingSigner,\n note: 'Local signer credential. Haven backend never receives this private key.',\n },\n input.warn,\n )\n\n try {\n await writeOwnerOnlyJson(\n identityPath,\n {\n api_key: input.apiKey,\n agent_id: input.agentId,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n api_url: input.apiUrl,\n hosted_mcp_url: input.hostedMcpUrl,\n agent_budget: input.agentBudget,\n note: 'Haven API key identifies the agent only. It cannot spend without the local signer key and on-chain Haven wallet rules.',\n },\n input.warn,\n )\n } catch (err) {\n await rm(signerPath, { force: true }).catch(() => undefined)\n throw err\n }\n\n // Non-secret orientation file. Lets the agent answer \"who am I and what may I\n // spend\" on its first turn by reading one local file — no MCP round trip and\n // no exposure of the API key (identity.json) or delegate key (signer.json) in\n // the agent's transcript. Holds the *configured* budget; live remaining budget\n // still comes from haven_get_allowances before a payment.\n try {\n await writeOwnerOnlyJson(\n agentPath,\n {\n agent_id: input.agentId,\n delegate_address: input.delegateAddress,\n safe_address: input.safeAddress,\n chain_id: input.chainId,\n network: input.network,\n agent_budget: input.agentBudget,\n note: 'Non-secret orientation for the agent: public delegate/Haven wallet identity + configured budget. Contains no API key or signing key. For the live remaining budget, call haven_get_allowances.',\n },\n input.warn,\n )\n } catch (err) {\n // Roll back every file so a partial write (e.g. writeFile succeeds but chmod\n // fails) can't leave agent.json behind and block reconnection via\n // assertDoesNotExist on the next run.\n await rm(signerPath, { force: true }).catch(() => undefined)\n await rm(identityPath, { force: true }).catch(() => undefined)\n await rm(agentPath, { force: true }).catch(() => undefined)\n throw err\n }\n\n return { directory, identityPath, signerPath, agentPath }\n}\n\nexport function defaultAgentDirectory(agentId: string, baseDir = join(homedir(), '.haven', 'agents')): string {\n return resolve(defaultCredentialRoot(baseDir), safePathPart(agentId))\n}\n\nexport function defaultCredentialRoot(baseDir = join(homedir(), '.haven', 'agents')): string {\n return resolve(baseDir)\n}\n\nasync function writeOwnerOnlyJson(\n path: string,\n value: Record<string, unknown>,\n warn: ((message: string) => void) | undefined,\n): Promise<void> {\n const json = JSON.stringify(dropUndefined(value), null, 2)\n await writeFile(path, `${json}\\n`, { mode: 0o600, flag: 'wx' })\n await restrictPermissions(path, 0o600, warn)\n}\n\nfunction safePathPart(value: string): string {\n return value.replace(/[^A-Za-z0-9_.-]/g, '_')\n}\n\nfunction dropUndefined(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(value).filter(([, field]) => field !== undefined))\n}\n\nasync function assertDoesNotExist(path: string): Promise<void> {\n try {\n await access(path)\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n throw new Error(`Refusing to overwrite existing Haven credential file: ${path}`)\n}\n\nasync function restrictPermissions(\n path: string,\n mode: 0o600 | 0o700,\n warn: ((message: string) => void) | undefined,\n): Promise<void> {\n try {\n await chmod(path, mode)\n } catch (err) {\n warn?.(\n `Warning: could not restrict permissions on ${path} to ${mode.toString(8)}. ` +\n `Move this credential to a private location or run chmod ${mode.toString(8)} ${path}. ` +\n `${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n","import { MCP_VERSION, registeredToolNames } from '@haven_ai/mcp'\nimport { HAVEN_MINIMUM_NODE_VERSION } from '@haven_ai/sdk'\n\n// The required-tools list is derived from `@haven_ai/mcp`'s canonical\n// `registeredToolNames()` rather than maintained as a literal here. An earlier\n// hand-maintained list drifted out of sync with the MCP package (it advertised\n// tools the local MCP no longer exposed, and missed `haven_pay_x402` when it\n// landed), which broke the consent screen and the post-setup probe. Sourcing\n// from the MCP package directly is now the only way new tools can ship.\nexport const MCP_RUNTIME_MANIFEST = {\n mcpPackage: '@haven_ai/mcp',\n mcpVersion: MCP_VERSION,\n sdkPackage: '@haven_ai/sdk',\n sdkVersion: '0.1.25-alpha.0',\n signerPackage: '@haven_ai/signer',\n signerVersion: '0.1.25-alpha.0',\n // Sourced from the SDK, never a literal (#1161). This field read '20.0.0'\n // while every package's `engines` said `>=24` and the docs said `>=24.0.0`,\n // so the guard that was supposed to enforce the floor waved Node v23 through\n // — including on the `--local` path where it does run. A hand-maintained\n // second copy of a number is a drift waiting to happen; a guard test pins\n // this against `package.json`'s `engines.node`.\n minimumNodeVersion: HAVEN_MINIMUM_NODE_VERSION,\n supportedClients: ['codex-cli', 'codex-desktop', 'claude-code'] as const,\n requiredTools: registeredToolNames() as readonly string[],\n} as const\n\nexport function mcpPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.mcpPackage}@${MCP_RUNTIME_MANIFEST.mcpVersion}`\n}\n\nexport function sdkPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.sdkPackage}@${MCP_RUNTIME_MANIFEST.sdkVersion}`\n}\n\nexport function signerPackageSpec(): string {\n return `${MCP_RUNTIME_MANIFEST.signerPackage}@${MCP_RUNTIME_MANIFEST.signerVersion}`\n}\n","import { mkdir, readFile, writeFile, chmod, unlink } from 'node:fs/promises'\nimport { homedir, platform } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { isMap, parseDocument, stringify } from 'yaml'\nimport { signerPackageSpec } from './runtime-manifest.js'\nimport { type RuntimeId } from './runtime-registry.js'\n\nexport type RuntimeMcpMode = 'local_stdio' | 'hosted_plus_signer' | 'manual'\n\nconst HERMES_API_KEY_ENV = 'MCP_HAVEN_API_KEY'\n\n/** How to launch the local edge signer as an MCP stdio server. */\nexport interface SignerLaunchSpec {\n command: string\n args: string[]\n}\n\nexport interface RuntimeConfigInput {\n runtime: RuntimeId\n hostedMcpUrl: string\n apiKey: string\n identityPath: string\n signerPath: string\n credentialDirectory: string\n localMcpCommand?: string\n /**\n * Prepared signer launch command (absolute wrapper from prepareSignerRuntime).\n * When absent, falls back to a runtime `npx -y @haven_ai/signer@…` invocation,\n * which is fragile under the agent runtime's MCP-spawn environment — prefer\n * always passing a prepared command.\n */\n signerCommand?: SignerLaunchSpec\n homeDir?: string\n /**\n * Topology to write. 'hosted' (default) configures the keyless hosted MCP\n * server plus the local signer; 'local' restores the local-stdio MCP for\n * runtimes that support it (explicit opt-in only).\n */\n mode?: 'hosted' | 'local'\n}\n\nexport interface RuntimeConfigWriteResult {\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}\n\n/** Injectable file operations for failure-safe runtime-config tests. */\nexport interface RuntimeConfigWriteDeps {\n writeOwnerOnlyText?: (path: string, value: string) => Promise<void>\n}\n\nclass HermesConfigRecoveryError extends Error {\n constructor() {\n super('Hermes configuration recovery did not complete')\n this.name = 'HermesConfigRecoveryError'\n }\n}\n\nexport class InvalidCodexTomlError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'InvalidCodexTomlError'\n }\n}\n\nexport async function writeRuntimeConfig(\n input: RuntimeConfigInput,\n deps: RuntimeConfigWriteDeps = {},\n): Promise<RuntimeConfigWriteResult> {\n switch (input.runtime) {\n case 'codex-cli':\n case 'codex-desktop':\n return writeCodexConfig(input)\n case 'cursor':\n return writeJsonRuntimeConfig(input, cursorConfigPath(input.homeDir), 'mcpServers')\n case 'vscode':\n return writeJsonRuntimeConfig(input, vscodeConfigPath(input.homeDir), 'servers')\n case 'vscode-insiders':\n return writeJsonRuntimeConfig(input, vscodeInsidersConfigPath(input.homeDir), 'servers')\n case 'claude-desktop':\n return writeJsonRuntimeConfig(input, claudeDesktopConfigPath(input.homeDir), 'mcpServers')\n case 'hermes':\n return writeHermesConfig(input, deps)\n default:\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'manual',\n target: 'manual runtime setup',\n changed: false,\n restartRequired: true,\n messages: ['Runtime config needs to be added manually for this agent environment.'],\n errorCode: 'manual_runtime_setup_required',\n }\n }\n}\n\nexport function buildHostedServer(hostedMcpUrl: string, apiKey: string, runtime: RuntimeId): Record<string, unknown> {\n if (runtime === 'vscode' || runtime === 'vscode-insiders') {\n return {\n type: 'http',\n url: hostedMcpUrl,\n headers: { Authorization: `Bearer ${apiKey}` },\n }\n }\n return {\n url: hostedMcpUrl,\n headers: { Authorization: `Bearer ${apiKey}` },\n }\n}\n\n/**\n * Resolve how to launch the signer: the prepared absolute-path wrapper when\n * available, otherwise a runtime npx invocation (fallback only).\n */\nexport function resolveSignerLaunchSpec(input: RuntimeConfigInput): SignerLaunchSpec {\n return (\n input.signerCommand ?? {\n command: 'npx',\n args: ['-y', signerPackageSpec(), '--credentials', input.signerPath],\n }\n )\n}\n\nexport function buildSignerServer(spec: SignerLaunchSpec, runtime: RuntimeId): Record<string, unknown> {\n const server = {\n command: spec.command,\n args: spec.args,\n }\n if (runtime === 'vscode' || runtime === 'vscode-insiders') return { type: 'stdio', ...server }\n return server\n}\n\nexport function buildLocalMcpServer(command: string, runtime: RuntimeId): Record<string, unknown> {\n const server = {\n command,\n args: [],\n }\n if (runtime === 'vscode' || runtime === 'vscode-insiders') return { type: 'stdio', ...server }\n return server\n}\n\nexport function mergeJsonMcpConfig(\n existingJson: string | null,\n serverRoot: 'mcpServers' | 'servers',\n hostedServer: Record<string, unknown>,\n signerServer: Record<string, unknown>,\n): string {\n const config = existingJson?.trim() ? parseJsonObject(existingJson) : {}\n const existingRoot = config[serverRoot]\n const servers = existingRoot && typeof existingRoot === 'object' && !Array.isArray(existingRoot)\n ? existingRoot as Record<string, unknown>\n : {}\n config[serverRoot] = {\n ...servers,\n haven: hostedServer,\n 'haven-signer': signerServer,\n }\n return `${JSON.stringify(config, null, 2)}\\n`\n}\n\n/** Merge Haven's managed MCP entries into Hermes's YAML configuration. */\nexport function mergeHermesYaml(\n existingYaml: string | null,\n hostedServer: Record<string, unknown>,\n signerServer: Record<string, unknown>,\n): string {\n if (!existingYaml?.trim()) return renderHermesYaml({ haven: hostedServer, 'haven-signer': signerServer })\n\n const doc = parseDocument(existingYaml, { keepSourceTokens: true })\n if (doc.errors.length > 0 || !isMap(doc.contents)) {\n throw new Error('Hermes config must be a YAML object')\n }\n\n const mcpPair = doc.contents.items.find((item) => item.key?.toString() === 'mcp_servers')\n const existingServers = mcpPair && isMap(mcpPair.value) ? mcpPair.value.toJSON() : {}\n const servers = isRecord(existingServers) ? existingServers : {}\n const mergedServers = {\n ...servers,\n haven: hostedServer,\n 'haven-signer': signerServer,\n }\n\n if (!mcpPair) {\n return appendHermesMcpServers(existingYaml, mergedServers)\n }\n if (!mcpPair.value?.range) return replaceEmptyHermesMcpServers(existingYaml, mcpPair.key?.range, mergedServers)\n return replaceHermesMcpServers(existingYaml, mcpPair.key?.range, mcpPair.value.range, mergedServers)\n}\n\n/**\n * Upsert the hosted MCP identity in Hermes's dotenv file without evaluating\n * arbitrary dotenv syntax or rewriting unrelated lines.\n */\nexport function mergeHermesEnv(existingEnv: string | null, apiKey: string): string {\n if (/[\\r\\n]/.test(apiKey)) throw new Error('Hermes API key must be a single line')\n\n const assignment = `${HERMES_API_KEY_ENV}=${apiKey}`\n if (!existingEnv) return `${assignment}\\n`\n\n const lineEnding = existingEnv.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const hasTrailingNewline = /\\r?\\n$/.test(existingEnv)\n const lines = existingEnv.split(/\\r?\\n/)\n if (hasTrailingNewline) lines.pop()\n\n let found = false\n const merged = lines.flatMap((line) => {\n if (isHermesEnvAssignment(line)) {\n if (found) return []\n found = true\n return [assignment]\n }\n if (isAmbiguousHermesEnvLine(line)) {\n throw new Error('Hermes environment contains an ambiguous managed key')\n }\n return [line]\n })\n\n if (!found) {\n return `${existingEnv}${hasTrailingNewline ? '' : lineEnding}${assignment}${lineEnding}`\n }\n return `${merged.join(lineEnding)}${hasTrailingNewline ? lineEnding : ''}`\n}\n\nfunction isHermesEnvAssignment(line: string): boolean {\n return /^\\s*(?:export[ \\t]+)?MCP_HAVEN_API_KEY[ \\t]*=/.test(line)\n}\n\nfunction isAmbiguousHermesEnvLine(line: string): boolean {\n return /^\\s*(?:export[ \\t]+)?MCP_HAVEN_API_KEY\\b/.test(line)\n}\n\nfunction appendHermesMcpServers(source: string, servers: Record<string, unknown>): string {\n const documentEnd = /(?:^|\\n)[ \\t]*\\.\\.\\.[ \\t]*(?:#[^\\n]*)?\\r?\\n?$/.exec(source)\n if (documentEnd) {\n const markerStart = documentEnd.index + (documentEnd[0].startsWith('\\n') ? 1 : 0)\n const beforeMarker = source.slice(0, markerStart)\n return `${beforeMarker}${beforeMarker.endsWith('\\n') ? '' : '\\n'}${renderHermesMcpServers(servers, '')}\\n${source.slice(markerStart)}`\n }\n const separator = source.endsWith('\\n') ? '' : '\\n'\n return `${source}${separator}${renderHermesMcpServers(servers, '')}\\n`\n}\n\nfunction replaceHermesMcpServers(\n source: string,\n keyRange: readonly number[] | undefined,\n valueRange: readonly number[],\n servers: Record<string, unknown>,\n): string {\n const valueStart = valueRange[0]\n const valueEnd = valueRange[1]\n const valueLineStart = source.lastIndexOf('\\n', valueStart - 1) + 1\n const keyStartsOnValueLine = keyRange?.[0] !== undefined && keyRange[0] >= valueLineStart\n const nestedIndent = `${source.slice(valueLineStart, keyRange?.[0] ?? valueLineStart)} `\n\n if (keyStartsOnValueLine) {\n const keyStart = keyRange![0]\n const keyEnd = keyRange![1]\n const replacement = `${source.slice(keyStart, keyEnd)}:\\n${renderHermesMcpServerEntries(servers, nestedIndent)}`\n const needsTrailingNewline = valueEnd < source.length && !source.slice(valueEnd).startsWith('\\n')\n return `${source.slice(0, keyStart)}${replacement}${needsTrailingNewline ? '\\n' : ''}${source.slice(valueEnd)}`\n }\n\n const indent = source.slice(valueLineStart, valueStart)\n const rendered = stringify(servers, { lineWidth: 120 }).trimEnd()\n const replacement = rendered.split('\\n').map((line, index) => index === 0 ? line : `${indent}${line}`).join('\\n')\n const needsTrailingNewline = valueEnd < source.length && !source.slice(valueEnd).startsWith('\\n')\n return `${source.slice(0, valueStart)}${replacement}${needsTrailingNewline ? '\\n' : ''}${source.slice(valueEnd)}`\n}\n\nfunction replaceEmptyHermesMcpServers(\n source: string,\n keyRange: readonly number[] | undefined,\n servers: Record<string, unknown>,\n): string {\n if (!keyRange) throw new Error('Hermes config mcp_servers key is invalid')\n const keyStart = keyRange[0]\n const keyEnd = keyRange[1]\n const lineStart = source.lastIndexOf('\\n', keyStart - 1) + 1\n const lineEnd = source.indexOf('\\n', keyEnd)\n const nestedIndent = `${source.slice(lineStart, keyStart)} `\n const replacement = `${source.slice(keyStart, keyEnd)}:\\n${renderHermesMcpServerEntries(servers, nestedIndent)}`\n return `${source.slice(0, keyStart)}${replacement}${lineEnd === -1 ? '\\n' : source.slice(lineEnd)}`\n}\n\nfunction renderHermesYaml(servers: Record<string, unknown>): string {\n return `${renderHermesMcpServers(servers, '')}\\n`\n}\n\nfunction renderHermesMcpServers(servers: Record<string, unknown>, indent: string): string {\n return `mcp_servers:\\n${renderHermesMcpServerEntries(servers, `${indent} `)}`\n}\n\nfunction renderHermesMcpServerEntries(servers: Record<string, unknown>, indent: string): string {\n return stringify(servers, { lineWidth: 120 })\n .trimEnd()\n .split('\\n')\n .map((line) => `${indent}${line}`)\n .join('\\n')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport function mergeCodexToml(existingToml: string, localMcpCommand: string): string {\n let next = removeTomlTableTree(removeTomlTableTree(existingToml, 'mcp_servers.haven'), 'mcp_servers.haven_signer')\n next = next.trimEnd()\n const block = [\n '[mcp_servers.haven]',\n `command = ${tomlString(localMcpCommand)}`,\n 'args = []',\n 'startup_timeout_sec = 120',\n ].join('\\n')\n validateCodexToml(block, 'Generated Codex Haven config')\n const merged = `${next ? `${next}\\n\\n` : ''}${block}\\n`\n return merged\n}\n\nexport function mergeCodexTomlHosted(\n existingToml: string,\n hostedMcpUrl: string,\n apiKey: string,\n signerSpec: SignerLaunchSpec,\n): string {\n let next = removeTomlTableTree(removeTomlTableTree(existingToml, 'mcp_servers.haven'), 'mcp_servers.haven_signer')\n next = next.trimEnd()\n const block = [\n '[mcp_servers.haven]',\n `url = ${tomlString(hostedMcpUrl)}`,\n `http_headers = { \"Authorization\" = ${tomlString(`Bearer ${apiKey}`)} }`,\n '',\n '[mcp_servers.haven_signer]',\n `command = ${tomlString(signerSpec.command)}`,\n `args = [${signerSpec.args.map((arg) => tomlString(arg)).join(', ')}]`,\n 'startup_timeout_sec = 120',\n ].join('\\n')\n validateCodexToml(block, 'Generated Codex Haven config')\n const merged = `${next ? `${next}\\n\\n` : ''}${block}\\n`\n return merged\n}\n\nasync function writeJsonRuntimeConfig(\n input: RuntimeConfigInput,\n target: string,\n serverRoot: 'mcpServers' | 'servers',\n): Promise<RuntimeConfigWriteResult> {\n try {\n const existing = await readOptional(target)\n const merged = mergeJsonMcpConfig(\n existing,\n serverRoot,\n buildHostedServer(input.hostedMcpUrl, input.apiKey, input.runtime),\n buildSignerServer(resolveSignerLaunchSpec(input), input.runtime),\n )\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: input.runtime === 'claude-desktop',\n messages: [`Updated Haven MCP entries in ${configTargetLabel(input.runtime)}.`],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: false,\n restartRequired: true,\n messages: [`Could not update ${configTargetLabel(input.runtime)}: ${err instanceof Error ? err.message : String(err)}`],\n errorCode: 'runtime_config_write_failed',\n }\n }\n}\n\nasync function writeHermesConfig(input: RuntimeConfigInput, deps: RuntimeConfigWriteDeps): Promise<RuntimeConfigWriteResult> {\n const target = hermesConfigPath(input.homeDir)\n const envTarget = hermesEnvPath(input.homeDir)\n try {\n const [existing, existingEnv] = await Promise.all([readOptional(target), readOptional(envTarget)])\n const hostedServer = {\n ...buildHostedServer(input.hostedMcpUrl, `\\${${HERMES_API_KEY_ENV}}`, input.runtime),\n enabled: true,\n }\n const signerServer = {\n ...buildSignerServer(resolveSignerLaunchSpec(input), input.runtime),\n enabled: true,\n }\n const merged = mergeHermesYaml(\n existing,\n hostedServer,\n signerServer,\n )\n const mergedEnv = mergeHermesEnv(existingEnv, input.apiKey)\n const writeText = deps.writeOwnerOnlyText ?? writeOwnerOnlyText\n await writeText(envTarget, mergedEnv)\n try {\n await writeText(target, merged)\n } catch (err) {\n const recovered = await restoreHermesFiles(target, existing, envTarget, existingEnv, writeText)\n if (!recovered) throw new HermesConfigRecoveryError()\n throw err\n }\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Hermes Agent config',\n changed: existing !== merged || existingEnv !== mergedEnv,\n restartRequired: true,\n messages: [\n `Updated Haven MCP entries in ${target}; stored the hosted MCP identity in ${envTarget}.`,\n 'Restart Hermes (start a new session; gateway users: /restart), then verify with `hermes mcp list`, `hermes mcp test haven`, and `hermes mcp test haven-signer`.',\n 'If no mcp_* tools appear after restart, ensure the MCP SDK is installed in Hermes: pip install mcp',\n ],\n }\n } catch (err) {\n const recoveryIncomplete = err instanceof HermesConfigRecoveryError\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Hermes Agent config',\n changed: false,\n restartRequired: true,\n messages: [recoveryIncomplete\n ? 'Could not update Hermes Agent config. Recovery did not complete; inspect the Hermes configuration before retrying.'\n : 'Could not update Hermes Agent config. Existing configuration was left unchanged.'],\n errorCode: 'runtime_config_write_failed',\n }\n }\n}\n\nasync function restoreHermesFiles(\n configPath: string,\n existingConfig: string | null,\n envPath: string,\n existingEnv: string | null,\n writeText: (path: string, value: string) => Promise<void>,\n): Promise<boolean> {\n const [envResult, configResult] = await Promise.allSettled([\n restoreOptionalText(envPath, existingEnv, writeText),\n restoreOptionalText(configPath, existingConfig, writeText),\n ])\n return envResult.status === 'fulfilled' && configResult.status === 'fulfilled'\n}\n\nasync function restoreOptionalText(\n path: string,\n existing: string | null,\n writeText: (path: string, value: string) => Promise<void>,\n): Promise<void> {\n if (existing !== null) {\n await writeText(path, existing)\n return\n }\n try {\n await unlink(path)\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n}\n\nasync function writeCodexConfig(input: RuntimeConfigInput): Promise<RuntimeConfigWriteResult> {\n const target = codexConfigPath(input.homeDir)\n const local = input.mode === 'local'\n try {\n const existing = await readOptional(target)\n if (local) {\n if (!input.localMcpCommand) {\n throw new Error('local MCP wrapper command is required')\n }\n const merged = mergeCodexToml(existing ?? '', input.localMcpCommand)\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: false,\n signerConfigured: true,\n localMcpConfigured: true,\n runtimeMcpMode: 'local_stdio',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: true,\n messages: [\n `Updated local Haven MCP entry in ${configTargetLabel(input.runtime)}.`,\n ],\n }\n }\n const merged = mergeCodexTomlHosted(existing ?? '', input.hostedMcpUrl, input.apiKey, resolveSignerLaunchSpec(input))\n await writeOwnerOnlyText(target, merged)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: existing !== merged,\n restartRequired: true,\n messages: [\n `Updated Haven MCP entries in ${configTargetLabel(input.runtime)}.`,\n ],\n }\n } catch (err) {\n const invalidToml = err instanceof InvalidCodexTomlError\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: local ? 'local_stdio' : 'hosted_plus_signer',\n target: configTargetLabel(input.runtime),\n changed: false,\n restartRequired: true,\n messages: [`Could not update ${configTargetLabel(input.runtime)}: ${err instanceof Error ? err.message : String(err)}`],\n errorCode: invalidToml ? 'codex_config_invalid' : 'runtime_config_write_failed',\n }\n }\n}\n\nasync function readOptional(path: string): Promise<string | null> {\n try {\n return await readFile(path, 'utf8')\n } catch (err) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n}\n\nasync function writeOwnerOnlyText(path: string, value: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 })\n await writeFile(path, value, { mode: 0o600 })\n await chmod(path, 0o600).catch(() => undefined)\n}\n\nfunction parseJsonObject(value: string): Record<string, unknown> {\n const parsed = JSON.parse(value) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('runtime config must be a JSON object')\n }\n return parsed as Record<string, unknown>\n}\n\nfunction removeTomlTableTree(toml: string, table: string): string {\n const lines = toml.split(/\\r?\\n/)\n const kept: string[] = []\n let skipping = false\n for (const line of lines) {\n const trimmed = line.trim()\n const tableName = tomlTableName(trimmed)\n if (tableName) {\n skipping = tableName === table || tableName.startsWith(`${table}.`)\n if (skipping) continue\n }\n if (!skipping) kept.push(line)\n }\n return kept.join('\\n')\n}\n\nfunction tomlTableName(line: string): string | null {\n if (line.startsWith('[[') && line.endsWith(']]')) return line.slice(2, -2).trim()\n if (line.startsWith('[') && line.endsWith(']')) return line.slice(1, -1).trim()\n return null\n}\n\nexport function validateCodexToml(toml: string, label = 'Codex config'): void {\n const lines = toml.split(/\\r?\\n/)\n let pendingValue: { value: string; line: number } | null = null\n for (let index = 0; index < lines.length; index += 1) {\n const raw = lines[index]\n const line = stripTomlComment(raw).trim()\n if (!line) continue\n\n if (pendingValue) {\n pendingValue.value = `${pendingValue.value}\\n${line}`\n if (hasBalancedTomlContainers(pendingValue.value)) {\n if (!isTomlValue(pendingValue.value)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${pendingValue.line}.`)\n }\n pendingValue = null\n }\n continue\n }\n\n if (isTomlTable(line)) continue\n\n const equalsIndex = line.indexOf('=')\n if (equalsIndex <= 0) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n\n const key = line.slice(0, equalsIndex).trim()\n const value = line.slice(equalsIndex + 1).trim()\n if (!isTomlKey(key)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n if (startsTomlContainer(value) && !hasBalancedTomlContainers(value)) {\n pendingValue = { value, line: index + 1 }\n continue\n }\n if (!isTomlValue(value)) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${index + 1}.`)\n }\n }\n if (pendingValue) {\n throw new InvalidCodexTomlError(`${label} has invalid TOML near line ${pendingValue.line}.`)\n }\n}\n\nfunction isTomlTable(line: string): boolean {\n const table = tomlTableName(line)\n return Boolean(table && splitTomlDottedKey(table).every(isTomlKeyPart))\n}\n\nfunction isTomlKey(value: string): boolean {\n return splitTomlDottedKey(value).every(isTomlKeyPart)\n}\n\nfunction splitTomlDottedKey(value: string): string[] {\n const parts: string[] = []\n let current = ''\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n current += char\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n current += char\n continue\n }\n if (char === '.') {\n parts.push(current.trim())\n current = ''\n continue\n }\n current += char\n }\n parts.push(current.trim())\n return quote ? [] : parts\n}\n\nfunction isTomlKeyPart(value: string): boolean {\n return isTomlBareKey(value) || isTomlQuotedString(value)\n}\n\nfunction isTomlBareKey(value: string): boolean {\n return /^[A-Za-z0-9_-]+$/.test(value)\n}\n\nfunction isTomlValue(value: string): boolean {\n if (!value) return false\n if (isTomlQuotedString(value)) return true\n if (/^(true|false)$/i.test(value)) return true\n if (/^[+-]?(?:inf|nan)$/i.test(value)) return true\n if (/^[+-]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]+)?(?:[eE][+-]?[0-9_]+)?$/.test(value)) return true\n if (/^\\d{4}-\\d{2}-\\d{2}(?:[Tt ][0-9:.+-Zz]+)?$/.test(value)) return true\n if ((value.startsWith('[') && value.endsWith(']')) || (value.startsWith('{') && value.endsWith('}'))) {\n return hasBalancedTomlContainers(value)\n }\n return false\n}\n\nfunction startsTomlContainer(value: string): boolean {\n return value.startsWith('[') || value.startsWith('{')\n}\n\nfunction isTomlQuotedString(value: string): boolean {\n if (value.startsWith('\"\"\"') || value.startsWith(\"'''\")) {\n const marker = value.slice(0, 3)\n return value.length >= 6 && value.endsWith(marker)\n }\n if ((!value.startsWith('\"') || !value.endsWith('\"')) && (!value.startsWith(\"'\") || !value.endsWith(\"'\"))) {\n return false\n }\n return hasBalancedTomlContainers(value)\n}\n\nfunction stripTomlComment(value: string): string {\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n continue\n }\n if (char === '#') return value.slice(0, i)\n }\n return value\n}\n\nfunction hasBalancedTomlContainers(value: string): boolean {\n const stack: string[] = []\n let quote: '\"' | \"'\" | null = null\n let escaped = false\n for (let i = 0; i < value.length; i += 1) {\n const char = value[i]\n if (quote) {\n if (quote === '\"' && char === '\\\\' && !escaped) {\n escaped = true\n continue\n }\n if (char === quote && !escaped) quote = null\n escaped = false\n continue\n }\n if (char === '\"' || char === \"'\") {\n quote = char\n continue\n }\n if (char === '[' || char === '{') {\n stack.push(char)\n continue\n }\n if (char === ']') {\n if (stack.pop() !== '[') return false\n continue\n }\n if (char === '}') {\n if (stack.pop() !== '{') return false\n }\n }\n return stack.length === 0 && quote === null\n}\n\nfunction tomlString(value: string): string {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`\n}\n\nfunction cursorConfigPath(homeDir = homedir()): string {\n return resolve(homeDir, '.cursor', 'mcp.json')\n}\n\nfunction codexConfigPath(homeDir = homedir()): string {\n return resolve(homeDir, '.codex', 'config.toml')\n}\n\nfunction vscodeConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') return resolve(homeDir, 'Library', 'Application Support', 'Code', 'User', 'mcp.json')\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Code', 'User', 'mcp.json')\n }\n return resolve(homeDir, '.config', 'Code', 'User', 'mcp.json')\n}\n\nfunction vscodeInsidersConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') return resolve(homeDir, 'Library', 'Application Support', 'Code - Insiders', 'User', 'mcp.json')\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Code - Insiders', 'User', 'mcp.json')\n }\n return resolve(homeDir, '.config', 'Code - Insiders', 'User', 'mcp.json')\n}\n\nfunction claudeDesktopConfigPath(homeDir = homedir()): string {\n if (platform() === 'darwin') {\n return resolve(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')\n }\n if (platform() === 'win32') {\n return resolve(process.env.APPDATA ?? join(homeDir, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json')\n }\n return resolve(homeDir, '.config', 'Claude', 'claude_desktop_config.json')\n}\n\nexport function hermesConfigPath(homeDir?: string): string {\n return join(hermesHomePath(homeDir), 'config.yaml')\n}\n\nexport function hermesEnvPath(homeDir?: string): string {\n return join(hermesHomePath(homeDir), '.env')\n}\n\nfunction hermesHomePath(homeDir?: string): string {\n return process.env.HERMES_HOME ?? join(homeDir ?? homedir(), '.hermes')\n}\n\nfunction configTargetLabel(runtime: RuntimeId): string {\n switch (runtime) {\n case 'codex-cli':\n return 'Codex CLI config'\n case 'codex-desktop':\n return 'Codex Desktop config'\n case 'cursor':\n return 'Cursor MCP config'\n case 'vscode':\n return 'VS Code MCP config'\n case 'vscode-insiders':\n return 'VS Code Insiders MCP config'\n case 'claude-desktop':\n return 'Claude Desktop config'\n default:\n return 'runtime MCP config'\n }\n}\n","import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport {\n computeConsentHash,\n consentInputFromClient,\n ensureConsent,\n loadCredentials,\n registeredToolNames,\n type ConsentDecision,\n} from '@haven_ai/mcp'\n\nexport interface LocalMcpConsentStatus {\n acknowledged: boolean\n hash?: string\n reason?: ConsentDecision['reason'] | 'ack_file_missing' | 'ack_file_mismatch'\n error?: string\n}\n\nexport async function acknowledgeLocalMcpConsent(\n identityPath: string,\n signerPath: string,\n log?: (message: string) => void,\n): Promise<LocalMcpConsentStatus> {\n try {\n const input = await buildLocalMcpConsentInput(identityPath, signerPath)\n const decision = await ensureConsent(input, {\n credentialsPath: identityPath,\n writeAck: true,\n out: log ? { write: (chunk) => writeLogChunk(log, chunk) } : undefined,\n })\n return {\n acknowledged: decision.ok,\n hash: decision.hash,\n reason: decision.reason,\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport async function getLocalMcpConsentStatus(\n identityPath: string,\n signerPath: string,\n): Promise<LocalMcpConsentStatus> {\n try {\n const input = await buildLocalMcpConsentInput(identityPath, signerPath)\n const hash = computeConsentHash(input)\n const stored = await readLocalMcpAckFile(localMcpAckPath(identityPath))\n if (stored === hash) {\n return { acknowledged: true, hash, reason: 'ack_file_match' }\n }\n return {\n acknowledged: false,\n hash,\n reason: stored ? 'ack_file_mismatch' : 'ack_file_missing',\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport function localMcpAckPath(identityPath: string): string {\n return resolve(`${identityPath}.ack.json`)\n}\n\nasync function buildLocalMcpConsentInput(identityPath: string, signerPath: string) {\n const credentials = await loadCredentials({ identityPath, signerPath })\n const unavailableDuringSetup = {\n getAllowances: async () => {\n throw new Error('Haven approval is not complete yet.')\n },\n }\n return consentInputFromClient(\n unavailableDuringSetup as never,\n {\n apiKey: credentials.apiKey,\n apiUrl: credentials.apiUrl,\n agentId: credentials.agentId,\n safeAddress: credentials.safeAddress,\n delegateAddress: credentials.delegateAddress,\n chainId: credentials.chainId,\n allowanceSummary: credentials.allowanceSummary,\n },\n registeredToolNames(),\n )\n}\n\nasync function readLocalMcpAckFile(path: string): Promise<string | null> {\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as { ack?: unknown }\n return typeof parsed.ack === 'string' ? parsed.ack : null\n } catch {\n return null\n }\n}\n\nfunction writeLogChunk(log: (message: string) => void, chunk: string): void {\n const message = String(chunk).trimEnd()\n if (message) log(message)\n}\n","import { spawn } from 'node:child_process'\nimport { readFile } from 'node:fs/promises'\n\nexport type HostedProbeStatus = 'ok' | 'unauthorized' | 'network_error' | 'bad_response'\n\nexport interface HostedProbeResult {\n status: HostedProbeStatus\n toolCount?: number\n}\n\nexport type LocalMcpProbeStatus = 'ok' | 'timeout' | 'process_error' | 'bad_response' | 'missing_tools'\n\nexport interface LocalMcpProbeResult {\n status: LocalMcpProbeStatus\n toolNames?: string[]\n}\n\nexport async function probeHostedMcpTools(\n apiKey: string,\n hostedMcpUrl: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<HostedProbeResult> {\n let response: Response\n try {\n response = await fetchWithTimeout(fetchImpl, hostedMcpUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list' }),\n })\n } catch {\n return { status: 'network_error' }\n }\n\n if (response.status === 401 || response.status === 403) return { status: 'unauthorized' }\n if (!response.ok) return { status: 'bad_response' }\n\n try {\n const payload = parseJsonRpcPayload(await response.text())\n if (!payload || payload.error) return { status: 'bad_response' }\n const tools = (payload.result as { tools?: unknown[] } | undefined)?.tools\n return { status: 'ok', toolCount: Array.isArray(tools) ? tools.length : undefined }\n } catch {\n return { status: 'bad_response' }\n }\n}\n\nexport async function probeLocalSignerCredential(signerPath: string): Promise<boolean> {\n try {\n const parsed = JSON.parse(await readFile(signerPath, 'utf8')) as unknown\n return Boolean(\n parsed &&\n typeof parsed === 'object' &&\n 'delegate_key' in parsed &&\n typeof (parsed as { delegate_key?: unknown }).delegate_key === 'string',\n )\n } catch {\n return false\n }\n}\n\nexport async function probeLocalMcpTools(\n command: string,\n args: string[],\n requiredTools: readonly string[],\n timeoutMs = 10_000,\n): Promise<LocalMcpProbeResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, { stdio: ['pipe', 'pipe', 'ignore'] })\n let stdout = ''\n let settled = false\n let sawInitialize = false\n\n const finish = (result: LocalMcpProbeResult): void => {\n if (settled) return\n settled = true\n clearTimeout(timeout)\n child.kill()\n resolve(result)\n }\n\n const timeout = setTimeout(() => finish({ status: 'timeout' }), timeoutMs)\n\n child.on('error', () => finish({ status: 'process_error' }))\n child.on('exit', (code) => {\n if (!settled && code !== 0) finish({ status: 'process_error' })\n })\n child.stdout.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8')\n const lines = stdout.split(/\\r?\\n/)\n stdout = lines.pop() ?? ''\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n let payload: JsonRpcEnvelope & { id?: number }\n try {\n payload = JSON.parse(trimmed) as JsonRpcEnvelope & { id?: number }\n } catch {\n continue\n }\n if (payload.error) {\n finish({ status: 'bad_response' })\n return\n }\n if (payload.id === 1 && !sawInitialize) {\n sawInitialize = true\n writeJsonRpc(child, { jsonrpc: '2.0', method: 'notifications/initialized', params: {} })\n writeJsonRpc(child, { jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} })\n continue\n }\n if (payload.id === 2) {\n const tools = (payload.result as { tools?: unknown[] } | undefined)?.tools\n const toolNames = Array.isArray(tools)\n ? tools\n .map((tool) => tool && typeof tool === 'object' && 'name' in tool ? (tool as { name?: unknown }).name : undefined)\n .filter((name): name is string => typeof name === 'string')\n : []\n const missing = requiredTools.filter((name) => !toolNames.includes(name))\n finish({ status: missing.length === 0 ? 'ok' : 'missing_tools', toolNames })\n return\n }\n }\n })\n\n writeJsonRpc(child, {\n jsonrpc: '2.0',\n id: 1,\n method: 'initialize',\n params: {\n protocolVersion: '2025-06-18',\n capabilities: {},\n clientInfo: { name: 'haven-connect-probe', version: '0.0.0' },\n },\n })\n })\n}\n\ninterface JsonRpcEnvelope {\n result?: unknown\n error?: unknown\n}\n\nfunction writeJsonRpc(child: ReturnType<typeof spawn>, payload: Record<string, unknown>): void {\n child.stdin?.write(`${JSON.stringify(payload)}\\n`)\n}\n\nfunction parseJsonRpcPayload(raw: string): JsonRpcEnvelope | null {\n const trimmed = raw.trim()\n if (!trimmed) return null\n if (trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed) as JsonRpcEnvelope\n } catch {\n return null\n }\n }\n const dataLines = trimmed\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith('data:'))\n .map((line) => line.slice(5).trim())\n for (let i = dataLines.length - 1; i >= 0; i -= 1) {\n try {\n return JSON.parse(dataLines[i]) as JsonRpcEnvelope\n } catch {\n /* try previous SSE frame */\n }\n }\n return null\n}\n\nasync function fetchWithTimeout(fetchImpl: typeof fetch, url: string, init: RequestInit): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n try {\n return await fetchImpl(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeout)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\nimport { isSupportedNodeVersion, unsupportedNodeVersionMessage } from '@haven_ai/sdk'\nimport {\n MCP_RUNTIME_MANIFEST,\n mcpPackageSpec,\n sdkPackageSpec,\n} from './runtime-manifest.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface PrepareLocalMcpRuntimeInput {\n credentialDirectory: string\n identityPath: string\n signerPath: string\n homeDir?: string\n nodeVersion?: string\n}\n\nexport interface PreparedLocalMcpRuntime {\n command: string\n args: string[]\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n messages: string[]\n}\n\nexport interface LocalMcpRuntimeDeps {\n runCommand?: (command: string, args: string[]) => Promise<void>\n}\n\n/**\n * Raised when the running Node is below the floor every Haven package declares.\n *\n * The `code` is load-bearing: `runtime-install.ts` maps it to the\n * `local_stdio_mcp_unsupported_node_version` probe result, and Haven's install\n * telemetry has been recording that string since the local path shipped. Kept\n * verbatim even though the guard is no longer local-MCP-only (#1161), because\n * renaming it would silently split one condition across two codes in the\n * historical data.\n */\nexport class UnsupportedNodeVersionError extends Error {\n readonly code = 'local_mcp_unsupported_node_version'\n readonly nodeVersion: string\n readonly minimumNodeVersion: string\n\n constructor(nodeVersion: string, minimumNodeVersion: string, subject = 'Haven setup') {\n super(unsupportedNodeVersionMessage({ subject, nodeVersion, minimumNodeVersion }))\n this.name = 'UnsupportedNodeVersionError'\n this.nodeVersion = nodeVersion\n this.minimumNodeVersion = minimumNodeVersion\n }\n}\n\nexport async function prepareLocalMcpRuntime(\n input: PrepareLocalMcpRuntimeInput,\n deps: LocalMcpRuntimeDeps = {},\n): Promise<PreparedLocalMcpRuntime> {\n assertSupportedNodeVersion(input.nodeVersion)\n\n const homeDir = input.homeDir ?? homedir()\n const runtimeDirectory = resolve(homeDir, '.haven', 'mcp-runtime', MCP_RUNTIME_MANIFEST.mcpVersion)\n const npmCacheDirectory = resolve(homeDir, '.haven', 'npm-cache')\n const cliPath = join(runtimeDirectory, 'node_modules', '@haven_ai', 'mcp', 'dist', 'cli.js')\n const messages: string[] = []\n\n await mkdir(runtimeDirectory, { recursive: true, mode: 0o700 })\n await chmod(runtimeDirectory, 0o700).catch(() => undefined)\n await mkdir(npmCacheDirectory, { recursive: true, mode: 0o700 })\n await chmod(npmCacheDirectory, 0o700).catch(() => undefined)\n\n if (await installedRuntimeMatches(runtimeDirectory, cliPath)) {\n messages.push(`Using existing local Haven MCP runtime ${mcpPackageSpec()}.`)\n } else {\n await installRuntimePackages(runtimeDirectory, npmCacheDirectory, deps.runCommand)\n messages.push(`Installed local Haven MCP runtime ${mcpPackageSpec()}.`)\n }\n\n await assertFileExists(cliPath, 'local Haven MCP CLI')\n\n const wrapperPath = join(input.credentialDirectory, 'bin', 'haven-mcp')\n await writeWrapper({\n wrapperPath,\n cliPath,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n })\n\n await writeRuntimeSidecar({\n path: join(input.credentialDirectory, 'mcp-runtime.json'),\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n })\n\n messages.push(`Prepared stable local Haven MCP wrapper: ${wrapperPath}`)\n\n return {\n command: wrapperPath,\n args: [],\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n messages,\n }\n}\n\n/**\n * Refuse to proceed on an unsupported Node.\n *\n * Called from BOTH connect paths since #1161: `runConnect` runs it before any\n * side effect on the default (hosted MCP + local signer) topology, and\n * `prepareLocalMcpRuntime` keeps its own call for the `--local` path. It used to\n * exist only on the latter — the path almost nobody takes — so the documented\n * floor was enforced where it mattered least.\n */\nexport function assertSupportedNodeVersion(\n nodeVersion = process.versions.node,\n minimumNodeVersion = MCP_RUNTIME_MANIFEST.minimumNodeVersion,\n subject = 'Haven setup',\n): void {\n if (!isSupportedNodeVersion(nodeVersion, minimumNodeVersion)) {\n throw new UnsupportedNodeVersionError(nodeVersion, minimumNodeVersion, subject)\n }\n}\n\nasync function installRuntimePackages(\n runtimeDirectory: string,\n npmCacheDirectory: string,\n runCommand: ((command: string, args: string[]) => Promise<void>) | undefined,\n): Promise<void> {\n // Mirrors prepareSignerRuntime's installRuntimePackages: fast path reuses the\n // default npm cache (warmed by npx) with --prefer-offline so the mcp + sdk\n // tarballs are not re-downloaded; fall back to the isolated Haven-owned cache\n // if the default cache is broken or root-owned (see docs/operations/\n // mcp-runtime-compatibility.md).\n const baseArgs = [\n 'install',\n '--prefix',\n runtimeDirectory,\n '--no-audit',\n '--no-fund',\n '--omit=dev',\n '--prefer-offline',\n mcpPackageSpec(),\n sdkPackageSpec(),\n ]\n const run = async (args: string[]): Promise<void> => {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: 120_000, maxBuffer: 1024 * 1024 })\n }\n\n try {\n await run(baseArgs)\n } catch {\n try {\n await run([...baseArgs, '--cache', npmCacheDirectory])\n } catch (err) {\n throw new Error(`Could not install local Haven MCP runtime ${mcpPackageSpec()}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n}\n\nasync function installedRuntimeMatches(runtimeDirectory: string, cliPath: string): Promise<boolean> {\n try {\n await assertFileExists(cliPath, 'local Haven MCP CLI')\n const [mcpPackage, sdkPackage] = await Promise.all([\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'mcp', 'package.json')),\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'sdk', 'package.json')),\n ])\n return mcpPackage.version === MCP_RUNTIME_MANIFEST.mcpVersion &&\n sdkPackage.version === MCP_RUNTIME_MANIFEST.sdkVersion\n } catch {\n return false\n }\n}\n\nasync function readPackageJson(path: string): Promise<{ version?: string }> {\n return JSON.parse(await readFile(path, 'utf8')) as { version?: string }\n}\n\nasync function writeWrapper(input: {\n wrapperPath: string\n cliPath: string\n identityPath: string\n signerPath: string\n}): Promise<void> {\n await mkdir(dirname(input.wrapperPath), { recursive: true, mode: 0o700 })\n await chmod(dirname(input.wrapperPath), 0o700).catch(() => undefined)\n const source = [\n '#!/usr/bin/env node',\n \"import { spawn } from 'node:child_process'\",\n '',\n `const cliPath = ${JSON.stringify(input.cliPath)}`,\n `const identityPath = ${JSON.stringify(input.identityPath)}`,\n `const signerPath = ${JSON.stringify(input.signerPath)}`,\n '',\n \"const child = spawn(process.execPath, [cliPath, '--identity', identityPath, '--signer', signerPath, ...process.argv.slice(2)], {\",\n \" stdio: 'inherit',\",\n '})',\n '',\n \"child.on('exit', (code, signal) => {\",\n ' if (signal) process.kill(process.pid, signal)',\n ' else process.exit(code ?? 1)',\n '})',\n '',\n ].join('\\n')\n await writeFile(input.wrapperPath, source, { mode: 0o700 })\n await chmod(input.wrapperPath, 0o700).catch(() => undefined)\n}\n\nasync function writeRuntimeSidecar(input: {\n path: string\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n}): Promise<void> {\n const value = {\n mcp_package: MCP_RUNTIME_MANIFEST.mcpPackage,\n mcp_version: MCP_RUNTIME_MANIFEST.mcpVersion,\n sdk_package: MCP_RUNTIME_MANIFEST.sdkPackage,\n sdk_version: MCP_RUNTIME_MANIFEST.sdkVersion,\n minimum_node_version: MCP_RUNTIME_MANIFEST.minimumNodeVersion,\n wrapper_path: input.wrapperPath,\n runtime_directory: input.runtimeDirectory,\n npm_cache_directory: input.npmCacheDirectory,\n cli_path: input.cliPath,\n }\n await writeFile(input.path, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await chmod(input.path, 0o600).catch(() => undefined)\n}\n\nasync function assertFileExists(path: string, label: string): Promise<void> {\n try {\n await access(path)\n } catch {\n throw new Error(`Missing ${label}: ${path}`)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\nimport { promisify } from 'node:util'\nimport { MCP_RUNTIME_MANIFEST, sdkPackageSpec, signerPackageSpec } from './runtime-manifest.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface PrepareSignerRuntimeInput {\n credentialDirectory: string\n signerPath: string\n homeDir?: string\n}\n\nexport interface PreparedSignerRuntime {\n /** Absolute command to register as the signer MCP `command`. */\n command: string\n /** Args to register alongside `command` (credentials are baked into the wrapper). */\n args: string[]\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n messages: string[]\n}\n\nexport interface SignerRuntimeDeps {\n runCommand?: (command: string, args: string[]) => Promise<void>\n}\n\n/**\n * Pre-install the edge signer into a version-pinned, connector-managed\n * directory and write a stable wrapper that launches it with an absolute Node\n * path. The signer MCP is then registered as `command: <wrapper>` instead of a\n * runtime `npx -y @haven_ai/signer@…` invocation.\n *\n * Why: launching the signer via bare `npx` at every MCP spawn made it depend on\n * the PATH/environment the agent runtime hands the stdio subprocess, which is\n * not the user's interactive shell — the failure mode that left `haven-signer`\n * stuck at \"Failed to connect\" while the hosted HTTP server connected fine. The\n * local MCP topology already avoids this with the same pre-install + wrapper\n * pattern (see prepareLocalMcpRuntime); this brings the default hosted+signer\n * topology to parity. Version stays pinned (no unpinned `npm i -g`), and the\n * wrapper lives under ~/.haven so the reset flow already cleans it up.\n */\nexport async function prepareSignerRuntime(\n input: PrepareSignerRuntimeInput,\n deps: SignerRuntimeDeps = {},\n): Promise<PreparedSignerRuntime> {\n const homeDir = input.homeDir ?? homedir()\n const runtimeDirectory = resolve(homeDir, '.haven', 'signer-runtime', MCP_RUNTIME_MANIFEST.signerVersion)\n const npmCacheDirectory = resolve(homeDir, '.haven', 'npm-cache')\n const cliPath = join(runtimeDirectory, 'node_modules', '@haven_ai', 'signer', 'dist', 'cli.js')\n const messages: string[] = []\n\n await mkdir(runtimeDirectory, { recursive: true, mode: 0o700 })\n await chmod(runtimeDirectory, 0o700).catch(() => undefined)\n await mkdir(npmCacheDirectory, { recursive: true, mode: 0o700 })\n await chmod(npmCacheDirectory, 0o700).catch(() => undefined)\n\n if (await installedRuntimeMatches(runtimeDirectory, cliPath)) {\n messages.push(`Using existing local Haven signer runtime ${signerPackageSpec()}.`)\n } else {\n await installRuntimePackages(runtimeDirectory, npmCacheDirectory, deps.runCommand)\n messages.push(`Installed local Haven signer runtime ${signerPackageSpec()}.`)\n }\n\n await assertFileExists(cliPath, 'local Haven signer CLI')\n\n // .mjs so the wrapper is unambiguously ESM when the runtime exec's it via the\n // shebang — Node < 20.10 has no automatic module detection, and there is no\n // package.json with \"type\":\"module\" under ~/.haven to disambiguate otherwise.\n const wrapperPath = join(input.credentialDirectory, 'bin', 'haven-signer.mjs')\n await writeWrapper({ wrapperPath, cliPath, signerPath: input.signerPath })\n\n await writeRuntimeSidecar({\n path: join(input.credentialDirectory, 'signer-runtime.json'),\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n })\n\n messages.push(`Prepared stable local Haven signer wrapper: ${wrapperPath}`)\n\n return {\n command: wrapperPath,\n args: [],\n wrapperPath,\n runtimeDirectory,\n npmCacheDirectory,\n cliPath,\n messages,\n }\n}\n\nasync function installRuntimePackages(\n runtimeDirectory: string,\n npmCacheDirectory: string,\n runCommand: ((command: string, args: string[]) => Promise<void>) | undefined,\n): Promise<void> {\n // Fast path: install against the user's default npm cache with\n // `--prefer-offline`. `npx @haven_ai/connect` just downloaded the signer + sdk\n // tarballs (plus their closure) into that cache moments earlier, so this\n // resolves from disk instead of re-fetching over the network — the single\n // biggest avoidable cost in cold setup.\n const baseArgs = [\n 'install',\n '--prefix',\n runtimeDirectory,\n '--no-audit',\n '--no-fund',\n '--omit=dev',\n '--prefer-offline',\n signerPackageSpec(),\n sdkPackageSpec(),\n ]\n const run = async (args: string[]): Promise<void> => {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: 120_000, maxBuffer: 1024 * 1024 })\n }\n\n try {\n await run(baseArgs)\n } catch {\n // Fallback: the default `~/.npm` can be corrupted or root-owned (a real,\n // documented failure mode — see docs/operations/mcp-runtime-compatibility.md).\n // Retry against the isolated Haven-owned cache so a broken global cache can't\n // break agent setup. This path may hit the network; that is the acceptable\n // cost of recovering from an unusable default cache.\n try {\n await run([...baseArgs, '--cache', npmCacheDirectory])\n } catch (err) {\n throw new Error(\n `Could not install local Haven signer runtime ${signerPackageSpec()}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n}\n\nasync function installedRuntimeMatches(runtimeDirectory: string, cliPath: string): Promise<boolean> {\n try {\n await assertFileExists(cliPath, 'local Haven signer CLI')\n const [signerPackage, sdkPackage] = await Promise.all([\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'signer', 'package.json')),\n readPackageJson(join(runtimeDirectory, 'node_modules', '@haven_ai', 'sdk', 'package.json')),\n ])\n return signerPackage.version === MCP_RUNTIME_MANIFEST.signerVersion &&\n sdkPackage.version === MCP_RUNTIME_MANIFEST.sdkVersion\n } catch {\n return false\n }\n}\n\nasync function readPackageJson(path: string): Promise<{ version?: string }> {\n return JSON.parse(await readFile(path, 'utf8')) as { version?: string }\n}\n\nasync function writeWrapper(input: {\n wrapperPath: string\n cliPath: string\n signerPath: string\n}): Promise<void> {\n await mkdir(dirname(input.wrapperPath), { recursive: true, mode: 0o700 })\n await chmod(dirname(input.wrapperPath), 0o700).catch(() => undefined)\n const source = [\n '#!/usr/bin/env node',\n \"import { spawn } from 'node:child_process'\",\n '',\n `const cliPath = ${JSON.stringify(input.cliPath)}`,\n `const signerPath = ${JSON.stringify(input.signerPath)}`,\n '',\n \"const child = spawn(process.execPath, [cliPath, '--credentials', signerPath, ...process.argv.slice(2)], {\",\n \" stdio: 'inherit',\",\n '})',\n '',\n \"child.on('exit', (code, signal) => {\",\n ' if (signal) process.kill(process.pid, signal)',\n ' else process.exit(code ?? 1)',\n '})',\n '',\n ].join('\\n')\n await writeFile(input.wrapperPath, source, { mode: 0o700 })\n await chmod(input.wrapperPath, 0o700).catch(() => undefined)\n}\n\nasync function writeRuntimeSidecar(input: {\n path: string\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n}): Promise<void> {\n const value = {\n signer_package: MCP_RUNTIME_MANIFEST.signerPackage,\n signer_version: MCP_RUNTIME_MANIFEST.signerVersion,\n sdk_package: MCP_RUNTIME_MANIFEST.sdkPackage,\n sdk_version: MCP_RUNTIME_MANIFEST.sdkVersion,\n wrapper_path: input.wrapperPath,\n runtime_directory: input.runtimeDirectory,\n npm_cache_directory: input.npmCacheDirectory,\n cli_path: input.cliPath,\n }\n await writeFile(input.path, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n await chmod(input.path, 0o600).catch(() => undefined)\n}\n\nasync function assertFileExists(path: string, label: string): Promise<void> {\n try {\n await access(path)\n } catch {\n throw new Error(`Missing ${label}: ${path}`)\n }\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { HAVEN_SKILL_MD, HAVEN_SKILL_BODY_MD, SKILL_FOLDER_NAME } from '@haven_ai/sdk'\nimport type { RuntimeId } from './runtime-registry.js'\n\n/**\n * Guidance-surface parity across runtimes (#1332).\n *\n * The generic payment skill is static and secret-free. Where a runtime has a\n * DOCUMENTED instruction mechanism, setup installs the canonical content\n * there; the substance is identical everywhere — only the wrapper differs:\n *\n * - claude-code — `~/.claude/skills/haven-pay/SKILL.md` (Claude's skills\n * folder; unchanged behavior, moved here from runtime-install.ts).\n * - hermes — `$HERMES_HOME/skills/haven-pay/SKILL.md` (default\n * `~/.hermes/skills/…`). Hermes auto-discovers SKILL.md skills from that\n * directory in the same front-matter format Claude uses, so the file is\n * byte-identical to the Claude install.\n * - codex-cli / codex-desktop — a marker-delimited managed section in the\n * global `~/.codex/AGENTS.md` (Codex's documented global-guidance file,\n * shared by CLI and Desktop). The section carries the skill BODY (front\n * matter is skills-registry metadata and meaningless in AGENTS.md). Writes\n * are idempotent — an existing managed section is replaced in place — and\n * everything outside the markers is preserved byte-for-byte. The file is\n * created when absent. `AGENTS.override.md` is never touched.\n * - every other runtime — no documented instruction file; the baseline is the\n * MCP server-level initialize instructions, so nothing is written.\n */\n\nexport const CODEX_AGENTS_BEGIN_MARKER =\n '<!-- BEGIN haven-pay (managed by @haven_ai/connect; edits inside this section are overwritten on re-setup) -->'\nexport const CODEX_AGENTS_END_MARKER = '<!-- END haven-pay -->'\n\nexport interface SkillInstallResult {\n installed: boolean\n target?: string\n messages: string[]\n}\n\nexport interface SkillInstallDeps {\n homeDir?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport async function installSkillForRuntime(\n runtime: RuntimeId,\n deps: SkillInstallDeps = {},\n): Promise<SkillInstallResult | undefined> {\n switch (runtime) {\n case 'claude-code':\n return installSkillFile(\n resolve(deps.homeDir ?? homedir(), '.claude', 'skills', SKILL_FOLDER_NAME),\n '~/.claude/skills/haven-pay',\n )\n case 'hermes':\n return installSkillFile(\n join(hermesHome(deps), 'skills', SKILL_FOLDER_NAME),\n 'the Hermes skills folder',\n )\n case 'codex-cli':\n case 'codex-desktop':\n return installCodexAgentsSection(deps)\n default:\n // No documented instruction file for this runtime — the MCP server's\n // initialize instructions carry the baseline guidance.\n return undefined\n }\n}\n\nasync function installSkillFile(skillDir: string, label: string): Promise<SkillInstallResult> {\n try {\n await mkdir(skillDir, { recursive: true })\n const target = join(skillDir, 'SKILL.md')\n await writeFile(target, HAVEN_SKILL_MD, 'utf8')\n return {\n installed: true,\n target,\n messages: [`Installed the generic Haven payment skill (${label}). It contains no secrets.`],\n }\n } catch (err) {\n return {\n installed: false,\n messages: [\n `Could not install the Haven payment skill: ${err instanceof Error ? err.message : String(err)}. Download it from the Haven dashboard instead.`,\n ],\n }\n }\n}\n\nasync function installCodexAgentsSection(deps: SkillInstallDeps): Promise<SkillInstallResult> {\n try {\n const codexDir = resolve(deps.homeDir ?? homedir(), '.codex')\n const target = join(codexDir, 'AGENTS.md')\n await mkdir(codexDir, { recursive: true })\n const existing = await readFile(target, 'utf8').catch(() => null)\n const next = upsertManagedSection(existing, codexManagedSection())\n if (next !== existing) {\n await writeFile(target, next, 'utf8')\n }\n return {\n installed: true,\n target,\n messages: [\n 'Installed the generic Haven payment guidance as a managed section in ~/.codex/AGENTS.md (Codex reads it as global instructions). It contains no secrets; your own content in that file is untouched.',\n ],\n }\n } catch (err) {\n return {\n installed: false,\n messages: [\n `Could not install the Haven payment guidance into ~/.codex/AGENTS.md: ${err instanceof Error ? err.message : String(err)}. Download the skill from the Haven dashboard instead.`,\n ],\n }\n }\n}\n\nfunction codexManagedSection(): string {\n return `${CODEX_AGENTS_BEGIN_MARKER}\\n\\n${HAVEN_SKILL_BODY_MD.trimEnd()}\\n\\n${CODEX_AGENTS_END_MARKER}\\n`\n}\n\n/**\n * Replace the existing managed section in place, or append one. Everything\n * outside the markers is preserved byte-for-byte — this file belongs to the\n * user; Haven owns only the span between its own markers.\n */\nexport function upsertManagedSection(existing: string | null, section: string): string {\n if (existing === null || existing.trim() === '') return section\n // Line-anchored: a marker quoted mid-line (prose, a code fence example)\n // must not be mistaken for a live section boundary.\n const begins = markerLineIndexes(existing, CODEX_AGENTS_BEGIN_MARKER)\n const ends = markerLineIndexes(existing, CODEX_AGENTS_END_MARKER)\n if (begins.length === 1 && ends.length === 1 && ends[0] > begins[0]) {\n const afterEnd = ends[0] + CODEX_AGENTS_END_MARKER.length\n // Swallow the line break the section itself terminates with (LF or CRLF),\n // so re-runs replace in place instead of accreting blank lines.\n const tail = existing.startsWith('\\r\\n', afterEnd)\n ? existing.slice(afterEnd + 2)\n : existing.startsWith('\\n', afterEnd)\n ? existing.slice(afterEnd + 1)\n : existing.slice(afterEnd)\n return existing.slice(0, begins[0]) + section + tail\n }\n if (begins.length > 0 || ends.length > 0) {\n // Anything but exactly one well-ordered pair — an orphaned marker, or a\n // duplicated section — is damage. Appending or guessing a span here could\n // swallow user content between markers on this or a LATER run; fail\n // closed and leave the file alone.\n throw new Error(\n 'found a damaged Haven marker section (orphaned or duplicated markers); remove the leftover marker lines and re-run setup',\n )\n }\n // No markers: append at the end, separated by a blank line.\n return `${existing.replace(/\\n*$/, '\\n\\n')}${section}`\n}\n\n/** Indexes of `marker` occurrences that sit at the start of a line. */\nfunction markerLineIndexes(text: string, marker: string): number[] {\n const indexes: number[] = []\n for (let from = 0; ; ) {\n const at = text.indexOf(marker, from)\n if (at === -1) return indexes\n if (at === 0 || text[at - 1] === '\\n') indexes.push(at)\n from = at + marker.length\n }\n}\n\n// Must resolve the SAME home as config-writers' hermesHomePath (which reads\n// the real process.env) — the skill and the config.yaml/.env writes belong in\n// one Hermes home. `deps.env` exists for test isolation only; production\n// callers never pass it, so both resolvers read the same process.env.\nfunction hermesHome(deps: SkillInstallDeps): string {\n const env = deps.env ?? process.env\n return env.HERMES_HOME ?? join(deps.homeDir ?? homedir(), '.hermes')\n}\n","export type RuntimeId =\n | 'claude-code'\n | 'codex-desktop'\n | 'codex-cli'\n | 'cursor'\n | 'vscode'\n | 'vscode-insiders'\n | 'claude-desktop'\n | 'hermes'\n | 'other'\n\nexport type RestartMode = 'restart-session' | 'restart-app' | 'hot-reload' | 'manual'\n\nexport interface RuntimeProfile {\n id: RuntimeId\n label: string\n restartMode: RestartMode\n canWriteRuntimeConfig: boolean\n /** Precise, runtime-owned instruction for loading a freshly written MCP entry. */\n activationInstruction: string\n}\n\nconst RUNTIME_PROFILES: Record<RuntimeId, RuntimeProfile> = {\n 'claude-code': {\n id: 'claude-code',\n label: 'Claude Code',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a new Claude Code session so it loads the Haven MCP entries.',\n },\n 'codex-cli': {\n id: 'codex-cli',\n label: 'Codex CLI',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a fresh Codex CLI session (for example, run `codex resume --last`).',\n },\n 'codex-desktop': {\n id: 'codex-desktop',\n label: 'Codex Desktop',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Quit and reopen Codex Desktop so it loads the Haven MCP entries.',\n },\n cursor: {\n id: 'cursor',\n label: 'Cursor',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for Cursor to hot-reload the Haven MCP entries; no app restart is required.',\n },\n vscode: {\n id: 'vscode',\n label: 'VS Code',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for VS Code to hot-reload the Haven MCP entries; no app restart is required.',\n },\n 'vscode-insiders': {\n id: 'vscode-insiders',\n label: 'VS Code Insiders',\n restartMode: 'hot-reload',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Wait for VS Code Insiders to hot-reload the Haven MCP entries; no app restart is required.',\n },\n 'claude-desktop': {\n id: 'claude-desktop',\n label: 'Claude Desktop',\n restartMode: 'restart-app',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Quit and reopen Claude Desktop so it loads the Haven MCP entries.',\n },\n hermes: {\n id: 'hermes',\n label: 'Hermes Agent',\n restartMode: 'restart-session',\n canWriteRuntimeConfig: true,\n activationInstruction: 'Start a new Hermes session; in Hermes Gateway, run `/restart` instead.',\n },\n other: {\n id: 'other',\n label: 'Other agent runtime',\n restartMode: 'manual',\n canWriteRuntimeConfig: false,\n activationInstruction: 'Finish the manual MCP setup shown above, then start a fresh session in that runtime.',\n },\n}\n\nconst RUNTIME_ALIASES: Record<string, RuntimeId> = {\n claude: 'claude-code',\n 'claude-code': 'claude-code',\n claudecode: 'claude-code',\n 'claude_code': 'claude-code',\n codex: 'codex-cli',\n 'codex-cli': 'codex-cli',\n codexcli: 'codex-cli',\n 'codex_cli': 'codex-cli',\n 'codex-desktop': 'codex-desktop',\n 'codex_desktop': 'codex-desktop',\n codexdesktop: 'codex-desktop',\n 'codex-app': 'codex-desktop',\n 'codex_app': 'codex-desktop',\n codexapp: 'codex-desktop',\n cursor: 'cursor',\n vscode: 'vscode',\n 'vs-code': 'vscode',\n 'vs_code': 'vscode',\n code: 'vscode',\n 'vscode-insiders': 'vscode-insiders',\n 'vscode_insiders': 'vscode-insiders',\n vscodeinsiders: 'vscode-insiders',\n 'vs-code-insiders': 'vscode-insiders',\n 'code-insiders': 'vscode-insiders',\n insiders: 'vscode-insiders',\n 'claude-desktop': 'claude-desktop',\n 'claude_desktop': 'claude-desktop',\n claudesktop: 'claude-desktop',\n desktop: 'claude-desktop',\n hermes: 'hermes',\n 'hermes-agent': 'hermes',\n hermes_agent: 'hermes',\n hermesagent: 'hermes',\n other: 'other',\n manual: 'other',\n}\n\nexport function runtimeProfile(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): RuntimeProfile {\n return RUNTIME_PROFILES[normalizeRuntime(runtime, env)]\n}\n\nexport function normalizeRuntime(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): RuntimeId {\n const explicit = normalizeRuntimeName(runtime)\n if (explicit) return explicit\n return detectRuntime(env) ?? 'other'\n}\n\nexport function restartRequiredForRuntime(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): boolean {\n const mode = runtimeProfile(runtime, env).restartMode\n return mode === 'restart-session' || mode === 'restart-app'\n}\n\n/**\n * Desktop GUI runtimes really do require a restart for the user to see the new\n * MCP server — the MCP server lifecycle is tied to app launch, not to the\n * current conversation. The agent who reported the \"restart not needed\"\n * surprise was using Claude Code (a CLI session that picks up new MCP servers\n * in-session via the deferred-tool mechanism). Don't softpedal the restart\n * instruction on Claude Desktop / Codex Desktop just because Claude Code is\n * looser about it.\n */\nexport function runtimeRequiresHardRestart(runtime: RuntimeId): boolean {\n return runtime === 'claude-desktop' || runtime === 'codex-desktop'\n}\n\n/**\n * The one safe post-activation check for every supported topology. It only\n * reads the connected agent and its live budget; it never signs, funds, or\n * creates a payment.\n */\nexport function runtimeVerificationInstruction(runtime: RuntimeId): string {\n const label = RUNTIME_PROFILES[runtime].label\n return `In ${label}, run the read-only \\`haven_get_agent\\` and \\`haven_get_allowances\\` tools to confirm the Haven wallet and live budget. Do not sign, fund, or create a payment to verify setup.`\n}\n\nfunction normalizeRuntimeName(runtime: string | undefined): RuntimeId | null {\n const key = runtime?.trim().toLowerCase()\n if (!key) return null\n return RUNTIME_ALIASES[key.replace(/\\s+/g, '-')] ?? null\n}\n\nfunction detectRuntime(env: NodeJS.ProcessEnv): RuntimeId | null {\n if (env.CLAUDECODE || env.CLAUDE_CODE || env.CLAUDECODE_CWD) return 'claude-code'\n if (env.CODEX_SANDBOX || env.CODEX_HOME || env.CODEX_CWD) return 'codex-cli'\n if (env.VSCODE_CWD || env.VSCODE_IPC_HOOK_CLI || env.TERM_PROGRAM === 'vscode') return 'vscode'\n if (env.HERMES_HOME || env.HERMES_AGENT) return 'hermes'\n return null\n}\n","import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport {\n computeSignerConsentHash,\n createEdgeSigner,\n ensureSignerConsent,\n loadSignerCredentials,\n toolSchemas,\n type SignerConsentDecision,\n type SignerConsentInput,\n type SignerToolName,\n} from '@haven_ai/signer'\n\nexport interface LocalSignerConsentStatus {\n acknowledged: boolean\n hash?: string\n reason?: SignerConsentDecision['reason'] | 'ack_file_missing' | 'ack_file_mismatch'\n error?: string\n}\n\nexport async function acknowledgeLocalSignerConsent(\n signerPath: string,\n log?: (message: string) => void,\n): Promise<LocalSignerConsentStatus> {\n try {\n const input = await buildSignerConsentInput(signerPath)\n const decision = await ensureSignerConsent(input, {\n credentialsPath: signerPath,\n writeAck: true,\n out: log ? { write: (chunk) => writeLogChunk(log, chunk) } : undefined,\n })\n return {\n acknowledged: decision.ok,\n hash: decision.hash,\n reason: decision.reason,\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport async function getLocalSignerConsentStatus(signerPath: string): Promise<LocalSignerConsentStatus> {\n try {\n const input = await buildSignerConsentInput(signerPath)\n const hash = computeSignerConsentHash(input)\n const stored = await readSignerAckFile(signerAckPath(signerPath))\n if (stored === hash) {\n return { acknowledged: true, hash, reason: 'ack_file_match' }\n }\n return {\n acknowledged: false,\n hash,\n reason: stored ? 'ack_file_mismatch' : 'ack_file_missing',\n }\n } catch (err) {\n return {\n acknowledged: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n}\n\nexport function signerAckPath(signerPath: string): string {\n return resolve(`${signerPath}.signer-ack.json`)\n}\n\nasync function buildSignerConsentInput(signerPath: string): Promise<SignerConsentInput> {\n const credentials = await loadSignerCredentials(signerPath)\n const signer = createEdgeSigner(credentials.delegateKey, {\n x402BindingSigner: credentials.x402BindingSigner,\n })\n return {\n delegateAddress: signer.delegateAddress,\n safeAddress: credentials.safeAddress,\n agentId: credentials.agentId,\n chainId: credentials.chainId,\n network: credentials.network,\n toolNames: Object.keys(toolSchemas) as SignerToolName[],\n }\n}\n\nasync function readSignerAckFile(path: string): Promise<string | null> {\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as { ack?: unknown }\n return typeof parsed.ack === 'string' ? parsed.ack : null\n } catch {\n return null\n }\n}\n\nfunction writeLogChunk(log: (message: string) => void, chunk: string): void {\n const message = String(chunk).trimEnd()\n if (message) log(message)\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { writeRuntimeConfig, type RuntimeMcpMode } from './config-writers.js'\nimport {\n acknowledgeLocalMcpConsent,\n getLocalMcpConsentStatus,\n type LocalMcpConsentStatus,\n} from './local-mcp-consent.js'\nimport {\n probeHostedMcpTools,\n probeLocalMcpTools,\n probeLocalSignerCredential,\n type LocalMcpProbeResult,\n type LocalMcpProbeStatus,\n} from './probes.js'\nimport {\n prepareLocalMcpRuntime,\n type PreparedLocalMcpRuntime,\n type PrepareLocalMcpRuntimeInput,\n} from './local-mcp-runtime.js'\nimport {\n prepareSignerRuntime,\n type PreparedSignerRuntime,\n type PrepareSignerRuntimeInput,\n} from './signer-runtime.js'\nimport { MCP_RUNTIME_MANIFEST, mcpPackageSpec, signerPackageSpec } from './runtime-manifest.js'\nimport { installSkillForRuntime } from './skill-install.js'\nimport { normalizeRuntime, restartRequiredForRuntime, runtimeProfile, type RuntimeId } from './runtime-registry.js'\nimport {\n acknowledgeLocalSignerConsent,\n getLocalSignerConsentStatus,\n type LocalSignerConsentStatus,\n} from './signer-consent.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport interface RuntimeInstallInput {\n runtime?: string\n hostedMcpUrl: string\n apiKey: string\n signerPath: string\n identityPath: string\n credentialDirectory: string\n environmentLabel?: string\n ackSigner?: boolean\n ackLocalTools?: boolean\n /**\n * Explicit opt-in to the local-stdio MCP topology (zero hosted dependency).\n * Default is hosted MCP + local signer for every runtime; local MCP is only\n * used when this is true and the runtime supports it.\n */\n localMcp?: boolean\n}\n\nexport interface RuntimeInstallResult {\n runtime: RuntimeId\n runtimeMcpMode: RuntimeMcpMode\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured: boolean\n probeResult: string\n restartRequired: boolean\n nextUserAction: string\n errorCode?: string\n configTarget?: string\n runtimeVersion?: string\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n activationCommand?: string\n skillInstalled?: boolean\n /**\n * Hosted topology only: true when the signer was pre-installed and registered\n * via its absolute wrapper, false when prep failed and it fell back to the\n * fragile runtime-`npx` launch. Undefined for local/manual topologies that\n * do not run the signer as a separate MCP. Lets callers/tests detect the\n * silent npx fallback instead of treating every write as fully healthy.\n */\n signerRuntimePrepared?: boolean\n messages: string[]\n}\n\nexport interface RuntimeInstallDeps {\n env?: NodeJS.ProcessEnv\n homeDir?: string\n fetch?: typeof fetch\n /**\n * Optional live progress callback. installRuntime's slowest steps (signer\n * pre-install, runtime config write, MCP handshake probes) otherwise emit\n * nothing until the caller flushes the collected `messages` after this\n * returns — leaving the console silent through the longest part of setup.\n * When provided, a few lightweight heartbeat lines are emitted as they run.\n */\n onProgress?: (message: string) => void\n runCommand?: (command: string, args: string[]) => Promise<void>\n prepareLocalMcpRuntime?: (input: PrepareLocalMcpRuntimeInput) => Promise<PreparedLocalMcpRuntime>\n prepareSignerRuntime?: (input: PrepareSignerRuntimeInput) => Promise<PreparedSignerRuntime>\n probeLocalMcpTools?: (\n command: string,\n args: string[],\n requiredTools: readonly string[],\n ) => Promise<LocalMcpProbeResult>\n}\n\nexport async function installRuntime(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps = {},\n): Promise<RuntimeInstallResult> {\n const runtime = normalizeRuntime(input.runtime, deps.env)\n const profile = runtimeProfile(runtime, deps.env)\n const progress = deps.onProgress ?? (() => undefined)\n const localRuntime = input.localMcp === true && supportsLocalMcp(runtime)\n const consentMessages: string[] = []\n const localMcpConsent = localRuntime\n ? await resolveLocalMcpConsent(input, consentMessages)\n : undefined\n const signerConsent = localRuntime\n ? undefined\n : await resolveSignerConsent(input, consentMessages)\n\n if (runtime === 'other') {\n const signerCredentialReady = await probeLocalSignerCredential(input.signerPath)\n const signerReady = signerCredentialReady && signerConsent?.acknowledged\n return {\n runtime,\n runtimeMcpMode: 'manual',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: signerReady\n ? 'manual_runtime_setup_required_local_signer_ready'\n : 'manual_runtime_setup_required_local_signer_unavailable',\n restartRequired: true,\n nextUserAction: 'return_to_haven_for_wallet_approval_then_configure_runtime',\n errorCode: 'manual_runtime_setup_required',\n configTarget: 'manual runtime setup',\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: false,\n messages: [\n ...consentMessages,\n 'Custom runtime: Haven did not auto-configure it. Your credentials are on disk (chmod 600) — read them at runtime; never paste a key into the agent prompt, memory, or logs.',\n ` identity (hosted MCP Bearer): ${input.identityPath}`,\n ` signer (local signing key): ${input.signerPath}`,\n 'After wallet approval, wire the runtime to Haven by reference:',\n ` Hosted MCP + local signer: point your MCP client at ${input.hostedMcpUrl} with the api_key from identity.json, then run npx -y ${signerPackageSpec()} --credentials ${input.signerPath}`,\n ` Fully local MCP (no hosted dependency): npx -y ${mcpPackageSpec()} --identity ${input.identityPath} --signer ${input.signerPath}`,\n ],\n }\n }\n\n let localRuntimeInstall: PreparedLocalMcpRuntime | undefined\n let localRuntimeError: unknown\n if (localRuntime) {\n try {\n localRuntimeInstall = await prepareRuntimeForLocalMcp(input, deps)\n } catch (err) {\n localRuntimeError = err\n }\n }\n\n if (localRuntimeError) {\n const errorCode = localRuntimePrepareErrorCode(localRuntimeError)\n return {\n runtime,\n runtimeMcpMode: 'local_stdio',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: errorCode === 'local_mcp_unsupported_node_version'\n ? 'local_stdio_mcp_unsupported_node_version'\n : 'local_stdio_mcp_runtime_install_failed',\n restartRequired: true,\n nextUserAction: nextAction(runtime, profile.restartMode, errorCode),\n errorCode,\n configTarget: profile.label,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: undefined,\n messages: [\n ...consentMessages,\n `Could not prepare local Haven MCP runtime: ${localRuntimeError instanceof Error ? localRuntimeError.message : String(localRuntimeError)}`,\n ],\n }\n }\n\n // Hosted topology launches the local signer as its own MCP stdio server.\n // Pre-install it and register an absolute wrapper instead of a runtime\n // `npx -y` invocation, which is fragile in the agent runtime's MCP-spawn\n // environment. Prep failure is non-fatal: fall back to the npx command.\n let signerCommand: { command: string; args: string[] } | undefined\n if (!localRuntime) {\n progress('Getting the signer ready…')\n try {\n const signerRuntime = await prepareSignerForRuntime(input, deps)\n signerCommand = { command: signerRuntime.command, args: signerRuntime.args }\n consentMessages.push(...signerRuntime.messages)\n } catch (err) {\n consentMessages.push(\n `Could not pre-install the local Haven signer; falling back to npx launch: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n const signerRuntimePrepared = localRuntime ? undefined : signerCommand !== undefined\n\n progress('Setting up your Haven tools…')\n const configResult = runtime === 'claude-code'\n ? localRuntime\n ? await configureClaudeCode(deps, localRuntimeInstall?.command ?? '')\n : await configureClaudeCodeHosted(deps, input, signerCommand)\n : await writeRuntimeConfig({\n runtime,\n hostedMcpUrl: input.hostedMcpUrl,\n apiKey: input.apiKey,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n credentialDirectory: input.credentialDirectory,\n localMcpCommand: localRuntimeInstall?.command,\n signerCommand,\n homeDir: deps.homeDir,\n mode: localRuntime ? 'local' : 'hosted',\n })\n\n progress('Almost there — just confirming everything connects…')\n const localProbePromise = configResult.runtimeMcpMode === 'local_stdio' && localRuntimeInstall\n ? runLocalMcpProbe(localRuntimeInstall, deps)\n : Promise.resolve(undefined)\n const [hostedProbe, signerCredentialReady, localMcpProbe] = await Promise.all([\n configResult.hostedConfigured\n ? probeHostedMcpTools(input.apiKey, input.hostedMcpUrl, deps.fetch)\n : Promise.resolve({ status: 'bad_response' as const }),\n probeLocalSignerCredential(input.signerPath),\n localProbePromise,\n ])\n\n const hostedOk = configResult.hostedConfigured && hostedProbe.status === 'ok'\n const localMcpOk = configResult.runtimeMcpMode === 'local_stdio' &&\n configResult.localMcpConfigured &&\n signerCredentialReady &&\n Boolean(localMcpConsent?.acknowledged) &&\n localMcpProbe?.status === 'ok'\n const signerOk = configResult.runtimeMcpMode === 'local_stdio'\n ? localMcpOk\n : configResult.signerConfigured && signerCredentialReady && Boolean(signerConsent?.acknowledged)\n const restartRequired = configResult.restartRequired || restartRequiredForRuntime(runtime, deps.env)\n const errorCode = configResult.errorCode ??\n (configResult.runtimeMcpMode === 'local_stdio'\n ? localMcpErrorCode(signerCredentialReady, localMcpConsent, localMcpProbe?.status)\n : hostedMcpErrorCode(configResult.hostedConfigured, hostedProbe.status) ?? signerConsentErrorCode(signerCredentialReady, signerConsent))\n const hostedProbeMessages = configResult.hostedConfigured && hostedProbe.status !== 'ok'\n ? [`Hosted Haven MCP probe failed: ${hostedProbe.status}.`]\n : configResult.hostedConfigured\n ? ['Verified hosted Haven MCP tools with a read-only handshake.']\n : []\n const localProbeMessages = localMcpProbe && localMcpProbe.status !== 'ok'\n ? [`Local Haven MCP handshake failed: ${localMcpProbe.status}.`]\n : localMcpProbe?.status === 'ok'\n ? ['Verified local Haven MCP tools with a stdio handshake.']\n : []\n\n // The generic payment skill is static and secret-free, so it is installed\n // like the other acknowledged local writes on every runtime with a\n // documented instruction mechanism (#1332): Claude's and Hermes's skills\n // folders, Codex's global AGENTS.md managed section. Runtimes without one\n // rely on the MCP server-level initialize instructions.\n const skillInstall = !configResult.errorCode\n ? await installSkillForRuntime(runtime, { homeDir: deps.homeDir, env: deps.env })\n : undefined\n\n return {\n runtime,\n runtimeMcpMode: configResult.runtimeMcpMode,\n hostedMcpConfigured: hostedOk,\n localSignerConfigured: signerOk,\n localMcpConfigured: localMcpOk,\n probeResult: buildProbeResult(configResult.runtimeMcpMode, configResult.hostedConfigured, hostedProbe.status, signerOk, localMcpOk, localMcpProbe?.status),\n restartRequired,\n nextUserAction: nextAction(runtime, profile.restartMode, errorCode),\n errorCode,\n configTarget: configResult.target,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: configResult.activationCommand,\n skillInstalled: skillInstall?.installed,\n signerRuntimePrepared,\n messages: [...consentMessages, ...(localRuntimeInstall?.messages ?? []), ...configResult.messages, ...hostedProbeMessages, ...localProbeMessages, ...(skillInstall?.messages ?? [])],\n }\n}\n\nexport function runtimeInstallCapabilities(runtime: string | undefined, env: NodeJS.ProcessEnv = process.env): {\n canWriteRuntimeConfig: boolean\n restartRequired: boolean\n} {\n const profile = runtimeProfile(runtime, env)\n return {\n canWriteRuntimeConfig: profile.canWriteRuntimeConfig,\n restartRequired: restartRequiredForRuntime(runtime, env),\n }\n}\n\nasync function configureClaudeCode(\n deps: RuntimeInstallDeps,\n localMcpCommand: string,\n): Promise<{\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}> {\n const runCommand = deps.runCommand ?? defaultRunCommand\n const serverJson = JSON.stringify({\n type: 'stdio',\n command: localMcpCommand,\n args: [],\n env: {},\n })\n try {\n if (!localMcpCommand) throw new Error('local MCP wrapper command is required')\n await runCommand('claude', ['mcp', 'add-json', 'haven', serverJson, '--scope', 'user'])\n .catch(async () => {\n await runCommand('claude', ['mcp', 'add', 'haven', '--scope', 'user', '--', localMcpCommand])\n })\n await runCommand('claude', ['mcp', 'remove', 'haven-signer']).catch(() => undefined)\n const verified = await runCommand('claude', ['mcp', 'get', 'haven'])\n .then(() => true)\n .catch(() => false)\n return {\n hostedConfigured: false,\n signerConfigured: true,\n localMcpConfigured: true,\n runtimeMcpMode: 'local_stdio',\n target: 'Claude Code MCP config',\n changed: true,\n restartRequired: true,\n messages: [\n 'Updated local Haven MCP entry with Claude Code.',\n ...(verified ? ['Verified Claude Code MCP entry.'] : []),\n ],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'local_stdio',\n target: 'Claude Code MCP config',\n changed: false,\n restartRequired: true,\n messages: [\n `Could not update Claude Code MCP config: ${err instanceof Error ? err.message : String(err)}`,\n 'Install Claude Code or rerun the Haven setup command inside a Claude Code terminal.',\n ],\n errorCode: 'claude_code_config_failed',\n }\n }\n}\n\nasync function configureClaudeCodeHosted(\n deps: RuntimeInstallDeps,\n input: RuntimeInstallInput,\n signerCommand?: { command: string; args: string[] },\n): Promise<{\n hostedConfigured: boolean\n signerConfigured: boolean\n localMcpConfigured: boolean\n runtimeMcpMode: RuntimeMcpMode\n target: string\n changed: boolean\n restartRequired: boolean\n messages: string[]\n errorCode?: string\n activationCommand?: string\n}> {\n const runCommand = deps.runCommand ?? defaultRunCommand\n const hostedJson = JSON.stringify({\n type: 'http',\n url: input.hostedMcpUrl,\n headers: { Authorization: `Bearer ${input.apiKey}` },\n })\n const signerJson = JSON.stringify({\n type: 'stdio',\n command: signerCommand?.command ?? 'npx',\n args: signerCommand?.args ?? ['-y', signerPackageSpec(), '--credentials', input.signerPath],\n env: {},\n })\n try {\n // Remove stale entries first so re-runs and local→hosted switches are\n // idempotent — `claude mcp add-json` fails when the name already exists.\n await runCommand('claude', ['mcp', 'remove', 'haven']).catch(() => undefined)\n await runCommand('claude', ['mcp', 'remove', 'haven-signer']).catch(() => undefined)\n await runCommand('claude', ['mcp', 'add-json', 'haven', hostedJson, '--scope', 'user'])\n await runCommand('claude', ['mcp', 'add-json', 'haven-signer', signerJson, '--scope', 'user'])\n const verified = await runCommand('claude', ['mcp', 'get', 'haven'])\n .then(() => true)\n .catch(() => false)\n return {\n hostedConfigured: true,\n signerConfigured: true,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Claude Code MCP config',\n changed: true,\n restartRequired: true,\n messages: [\n 'Updated hosted Haven MCP and local signer entries with Claude Code.',\n ...(verified ? ['Verified Claude Code MCP entry.'] : []),\n ],\n }\n } catch (err) {\n return {\n hostedConfigured: false,\n signerConfigured: false,\n localMcpConfigured: false,\n runtimeMcpMode: 'hosted_plus_signer',\n target: 'Claude Code MCP config',\n changed: false,\n restartRequired: true,\n messages: [\n `Could not update Claude Code MCP config: ${err instanceof Error ? err.message : String(err)}`,\n 'Install Claude Code or rerun the Haven setup command inside a Claude Code terminal.',\n ],\n errorCode: 'claude_code_config_failed',\n }\n }\n}\n\nasync function defaultRunCommand(command: string, args: string[]): Promise<void> {\n await execFileAsync(command, args, { timeout: 10_000 })\n}\n\nfunction buildProbeResult(\n mode: RuntimeMcpMode,\n hostedConfigured: boolean,\n hostedStatus: string,\n signerReady: boolean,\n localMcpReady: boolean,\n localMcpProbeStatus?: LocalMcpProbeStatus,\n): string {\n if (mode === 'local_stdio') {\n if (localMcpReady) return 'local_stdio_mcp_ready'\n return localMcpProbeStatus ? `local_stdio_mcp_${localMcpProbeStatus}` : 'local_stdio_mcp_unavailable'\n }\n const hostedPart = hostedConfigured ? `hosted_${hostedStatus}` : 'hosted_not_configured'\n const signerPart = signerReady ? 'local_signer_ready' : 'local_signer_unavailable'\n return `${hostedPart}_${signerPart}`.slice(0, 120)\n}\n\nasync function resolveLocalMcpConsent(\n input: RuntimeInstallInput,\n messages: string[],\n): Promise<LocalMcpConsentStatus> {\n if (input.ackLocalTools || input.ackSigner) {\n const status = await acknowledgeLocalMcpConsent(input.identityPath, input.signerPath, (message) => messages.push(message))\n if (status.acknowledged) {\n messages.push('Prepared the local Haven tools acknowledgement.')\n } else {\n messages.push('Local Haven tools acknowledgement still needs attention.')\n }\n return status\n }\n return getLocalMcpConsentStatus(input.identityPath, input.signerPath)\n}\n\nasync function resolveSignerConsent(\n input: RuntimeInstallInput,\n messages: string[],\n): Promise<LocalSignerConsentStatus> {\n if (input.ackSigner || input.ackLocalTools) {\n const status = await acknowledgeLocalSignerConsent(input.signerPath, (message) => messages.push(message))\n if (status.acknowledged) {\n messages.push('Prepared the local Haven signer acknowledgement.')\n } else {\n messages.push('Local Haven signer acknowledgement still needs attention.')\n }\n return status\n }\n return getLocalSignerConsentStatus(input.signerPath)\n}\n\nfunction signerConsentErrorCode(\n signerCredentialReady: boolean,\n signerConsent: LocalSignerConsentStatus | undefined,\n): string | undefined {\n if (!signerCredentialReady) return 'local_signer_credential_unavailable'\n if (!signerConsent?.acknowledged) return 'local_signer_ack_required'\n return undefined\n}\n\nfunction hostedMcpErrorCode(\n hostedConfigured: boolean,\n hostedProbeStatus: string,\n): string | undefined {\n if (!hostedConfigured || hostedProbeStatus === 'ok') return undefined\n return `hosted_mcp_probe_${hostedProbeStatus}`\n}\n\nfunction localMcpErrorCode(\n signerCredentialReady: boolean,\n localMcpConsent: LocalMcpConsentStatus | undefined,\n localMcpProbeStatus: LocalMcpProbeStatus | undefined,\n): string | undefined {\n if (!signerCredentialReady) return 'local_signer_credential_unavailable'\n if (!localMcpConsent?.acknowledged) return 'local_mcp_ack_required'\n if (localMcpProbeStatus && localMcpProbeStatus !== 'ok') return `local_mcp_probe_${localMcpProbeStatus}`\n return undefined\n}\n\nfunction nextAction(\n runtime: RuntimeId,\n restartMode: 'restart-session' | 'restart-app' | 'hot-reload' | 'manual',\n errorCode?: string,\n): string {\n if (errorCode) return 'return_to_haven_for_wallet_approval_then_finish_runtime_setup'\n if (restartMode === 'hot-reload') return 'return_to_haven_for_wallet_approval'\n if (runtime === 'codex-cli' || runtime === 'codex-desktop') return 'return_to_haven_for_wallet_approval_then_restart_codex'\n if (runtime === 'claude-code') return 'return_to_haven_for_wallet_approval_then_restart_claude_code'\n if (restartMode === 'restart-app') return 'return_to_haven_for_wallet_approval_then_restart_app'\n if (restartMode === 'restart-session') return 'return_to_haven_for_wallet_approval_then_restart_agent_session'\n return 'return_to_haven_for_wallet_approval_then_configure_runtime'\n}\n\n/**\n * Runtimes where the local-stdio MCP topology can be installed when the user\n * explicitly opts in. Never used by default — the default topology is hosted\n * MCP + local signer for every runtime.\n */\nexport function supportsLocalMcp(runtime: RuntimeId): boolean {\n return runtime === 'codex-cli' || runtime === 'codex-desktop' || runtime === 'claude-code'\n}\n\nasync function prepareRuntimeForLocalMcp(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps,\n): Promise<PreparedLocalMcpRuntime> {\n const prepare = deps.prepareLocalMcpRuntime ?? ((runtimeInput: PrepareLocalMcpRuntimeInput) =>\n prepareLocalMcpRuntime(runtimeInput, { runCommand: deps.runCommand }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n })\n}\n\nasync function prepareSignerForRuntime(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps,\n): Promise<PreparedSignerRuntime> {\n const prepare = deps.prepareSignerRuntime ?? ((runtimeInput: PrepareSignerRuntimeInput) =>\n prepareSignerRuntime(runtimeInput, { runCommand: deps.runCommand }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n })\n}\n\nasync function runLocalMcpProbe(\n runtimeInstall: PreparedLocalMcpRuntime,\n deps: RuntimeInstallDeps,\n): Promise<LocalMcpProbeResult> {\n const probe = deps.probeLocalMcpTools ?? probeLocalMcpTools\n try {\n return await probe(runtimeInstall.command, runtimeInstall.args, MCP_RUNTIME_MANIFEST.requiredTools)\n } catch {\n return { status: 'process_error' }\n }\n}\n\nfunction localRuntimePrepareErrorCode(err: unknown): string {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'local_mcp_unsupported_node_version') {\n return 'local_mcp_unsupported_node_version'\n }\n return 'local_mcp_runtime_install_failed'\n}\n","import { createConnectApiClient, ConnectRequestError, type ConnectApiClient, type ResolvedSetup } from './api.js'\nimport { resolveTokenFromAddress } from '@haven_ai/sdk'\nimport {\n agentApiKeyPrefix,\n generateAgentApiKey,\n generateDelegateKey,\n hashAgentApiKey,\n type LocalDelegateKey,\n} from './key.js'\nimport { redactSecrets, shortAddress } from './redact.js'\nimport {\n preflightCredentialStorage,\n writeCredentialFiles,\n type StoredCredentialPaths,\n} from './storage.js'\nimport {\n installRuntime,\n runtimeInstallCapabilities,\n supportsLocalMcp,\n type RuntimeInstallResult,\n} from './runtime-install.js'\nimport { normalizeRuntime, runtimeProfile, runtimeVerificationInstruction } from './runtime-registry.js'\nimport { assertSupportedNodeVersion } from './local-mcp-runtime.js'\nimport { MCP_RUNTIME_MANIFEST } from './runtime-manifest.js'\n\nexport const CONNECTOR_VERSION = '0.1.25-alpha.0'\n\nexport interface ConnectOptions {\n setupToken: string\n apiBaseUrl: string\n runtime?: string\n credentialsDir?: string\n environmentLabel?: string\n connectorVersion?: string\n ackSigner?: boolean\n ackLocalTools?: boolean\n localMcp?: boolean\n /**\n * #1377 D: keep the process alive after registering and poll for the\n * user's budget approval (default). Set false for structured/automation\n * runs (--json) where prompt output emission matters more than narration.\n */\n waitForApproval?: boolean\n /** Test/injection overrides for the approval poll cadence and clock. */\n approvalWait?: ApprovalWaitOptions\n}\n\n/** The stable machine-readable result emitted by `haven-connect --json`. */\nexport const CONNECT_OUTCOME_SCHEMA_VERSION = 1 as const\n\nexport type ConnectOutcomeStatus = 'complete' | 'action_required' | 'failed'\n\nexport interface ConnectOutcome {\n schema_version: typeof CONNECT_OUTCOME_SCHEMA_VERSION\n outcome: ConnectOutcomeStatus\n runtime: string\n topology: string\n configuration: {\n hosted_mcp: boolean\n local_signer: boolean\n local_mcp: boolean\n }\n probe: { result: string }\n activation: {\n restart_required: boolean\n instruction: string\n }\n next_action: string\n approval: { required: boolean; expires_at: string | null }\n verification: {\n tools: readonly ['haven_get_agent', 'haven_get_allowances']\n instruction: string\n }\n delegate_address?: string\n setup_challenge_expires_at?: string\n error?: { code: string; next_action: string }\n}\n\nexport interface ConnectDeps {\n api?: ConnectApiClient\n generateKey?: () => LocalDelegateKey\n generateApiKey?: () => string\n preflightStorage?: typeof preflightCredentialStorage\n writeCredentials?: typeof writeCredentialFiles\n installRuntime?: typeof installRuntime\n log?: (message: string) => void\n /** JSON CLI mode must not expose owner-only credential file locations. */\n redactPaths?: boolean\n /** Overridable so the Node-floor refusal is testable without spawning a Node. */\n nodeVersion?: string\n}\n\nexport interface ConnectResult {\n setupId: string\n agentId: string\n delegateAddress: string\n credentialPaths: StoredCredentialPaths\n /** Additive, secret-free completion contract shared by library callers and --json. */\n outcome: ConnectOutcome\n}\n\nexport async function runConnect(options: ConnectOptions, deps: ConnectDeps = {}): Promise<ConnectResult> {\n // FIRST, before anything with a side effect (#1161).\n //\n // This runs ahead of the setup-token resolve, the storage preflight, key\n // generation, the agent registration, and every credential write — so a\n // refusal cannot strand a half-created agent or burn a one-shot setup token,\n // the same discipline the hosted-MCP-URL guard adopted in #1129.\n //\n // It is checked on EVERY topology, which is the actual fix here. The guard\n // already existed but only ran inside local-MCP installation, reached solely\n // via `--local`; the default hosted-MCP + local-signer path — what nearly\n // every user runs — never touched it. The floor was enforced on the advanced\n // path and unenforced on the common one.\n //\n // Refuse rather than warn: what gets installed is the signer, which holds the\n // delegate key and produces every payment signature. An unsupported runtime\n // under a signing component is not a state to continue from, and npm's own\n // EBADENGINE notice is advisory unless the user happens to run engine-strict.\n assertSupportedNodeVersion(deps.nodeVersion, MCP_RUNTIME_MANIFEST.minimumNodeVersion)\n\n const connectorVersion = options.connectorVersion ?? CONNECTOR_VERSION\n const api = deps.api ?? createConnectApiClient(options.apiBaseUrl)\n const log = secureLogger(\n deps.log ?? ((message) => process.stdout.write(`${message}\\n`)),\n deps.redactPaths === true,\n )\n const writeCredentials = deps.writeCredentials ?? writeCredentialFiles\n const preflightStorage = deps.preflightStorage ?? preflightCredentialStorage\n const runRuntimeInstall = deps.installRuntime ?? installRuntime\n const generateKey = deps.generateKey ?? generateDelegateKey\n const generateLocalApiKey = deps.generateApiKey ?? generateAgentApiKey\n const installCapabilities = runtimeInstallCapabilities(options.runtime)\n\n if (options.localMcp) {\n const resolvedRuntime = normalizeRuntime(options.runtime)\n if (!supportsLocalMcp(resolvedRuntime)) {\n throw new Error(\n `--local (fully-local Haven MCP) is only available for Claude Code and Codex. ` +\n `The detected runtime is ${runtimeProfile(resolvedRuntime).label}. ` +\n 'Re-run without --local to use the default hosted MCP + local signer setup.',\n )\n }\n }\n\n log('Warming up your connection to Haven…')\n const setup = await api.resolveSetup({\n setupToken: options.setupToken,\n connectorVersion,\n runtime: options.runtime,\n })\n assertSetupChallengeIsUsable(setup.challenge.expires_at)\n printSetupSummary(setup, log)\n\n await preflightStorage({ baseDir: options.credentialsDir, warn: log })\n log('Checked local credential storage — all clear.')\n\n const localKey = generateKey()\n const localApiKey = generateLocalApiKey()\n log('Minting a fresh signing key and API key — both stay on this machine.')\n const proofSignature = await localKey.signChallenge(setup.challenge.message)\n\n log('Introducing your agent to Haven…')\n let registration: Awaited<ReturnType<ConnectApiClient['registerSetup']>>\n try {\n registration = await api.registerSetup({\n setupToken: options.setupToken,\n connectorVersion,\n runtime: options.runtime,\n challengeId: setup.challenge.id,\n delegateAddress: localKey.address,\n proofSignature,\n apiKeyHash: hashAgentApiKey(localApiKey),\n apiKeyPrefix: agentApiKeyPrefix(localApiKey),\n connectorContext: {\n environment_label: options.environmentLabel ?? 'Local workspace',\n config_target: installCapabilities.canWriteRuntimeConfig\n ? 'agent runtime MCP config'\n : 'local credential files',\n },\n installCapabilities,\n })\n } catch (err) {\n if (isExpiredSetupChallenge(err)) {\n throw new Error(\n 'The Haven setup challenge expired while connecting. Return to Haven, start a fresh connection, and run its new Connect command. Do not reuse or paste credentials.',\n )\n }\n throw err\n }\n\n log(`Registered signing address with Haven: ${shortAddress(registration.delegate_address)}.`)\n\n log('Tucking your credentials away safely on disk…')\n const credentialPaths = await writeCredentials({\n baseDir: options.credentialsDir,\n agentId: registration.agent_id,\n apiKey: localApiKey,\n delegateKey: localKey.privateKey,\n delegateAddress: localKey.address,\n safeAddress: setup.haven_wallet.address,\n chainId: setup.haven_wallet.chain_id,\n network: setup.haven_wallet.network,\n agentBudget: setup.agent_budget.map((budget) => ({\n token_symbol: budget.token_symbol,\n allowance_amount: budget.allowance_amount,\n reset_period_min: budget.reset_period_min,\n })),\n apiUrl: options.apiBaseUrl,\n hostedMcpUrl: registration.hosted_mcp_url,\n x402BindingSigner: setup.x402_binding_signer ?? undefined,\n warn: log,\n })\n log(`Stored Haven identity credential locally: ${credentialPaths.identityPath}`)\n log(`Stored local signer credential locally: ${credentialPaths.signerPath}`)\n log(`Stored non-secret agent orientation locally: ${credentialPaths.agentPath}`)\n if (setup.x402_binding_signer) {\n log('Configured x402 binding signer for the local signer.')\n } else {\n // Fail loud here rather than silently at x402 sign time: without a trusted\n // binding signer the edge signer refuses to sign x402 funding hashes.\n log(\n 'Warning: Haven did not provide an x402 binding signer, so x402 payments will not sign ' +\n 'until HAVEN_X402_BINDING_SIGNER is set for the signer. Non-x402 payments are unaffected.',\n )\n }\n\n const runtimeInstall = await runRuntimeInstall({\n runtime: options.runtime,\n hostedMcpUrl: registration.hosted_mcp_url,\n apiKey: localApiKey,\n signerPath: credentialPaths.signerPath,\n identityPath: credentialPaths.identityPath,\n credentialDirectory: credentialPaths.directory,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n ackSigner: options.ackSigner,\n ackLocalTools: options.ackLocalTools,\n localMcp: options.localMcp,\n }, { onProgress: log })\n printRuntimeInstall(runtimeInstall, log)\n\n // Tell the user they're done and what to do next BEFORE the telemetry call —\n // the install-status report is best-effort and must not sit between them and\n // the \"you're finished\" signal. The agent who reported the setup couldn't tell\n // whether the connector had finished; this affirms it explicitly. Only claim\n // completion when the runtime install actually succeeded — an errorCode means\n // manual steps remain (e.g. an unrecognized runtime), so don't overstate it.\n if (runtimeInstall.errorCode) {\n log('Haven setup needs a couple more steps on this machine — see the notes above.')\n } else {\n log('Haven setup on this machine is complete.')\n }\n\n // Report the completed runtime state before polling for budget approval.\n // The dashboard intentionally withholds approval controls until it knows the\n // local runtime is configured; polling first would wait on controls the\n // connector itself has not made available yet. This remains best-effort\n // readiness metadata only: a failed report cannot activate the agent or\n // change its budget authority.\n try {\n await api.updateInstallStatus(registration.setup_id, localApiKey, {\n runtime: runtimeInstall.runtime,\n connectorVersion,\n runtimeMcpMode: runtimeInstall.runtimeMcpMode,\n hostedMcpConfigured: runtimeInstall.hostedMcpConfigured,\n localSignerConfigured: runtimeInstall.localSignerConfigured,\n localMcpConfigured: runtimeInstall.localMcpConfigured,\n credentialFilesWritten: true,\n signerAcknowledged: runtimeInstall.signerAcknowledged,\n localMcpAcknowledged: runtimeInstall.localMcpAcknowledged,\n activationCommandAvailable: Boolean(runtimeInstall.activationCommand),\n skillInstalled: runtimeInstall.skillInstalled,\n probeResult: runtimeInstall.probeResult,\n restartRequired: runtimeInstall.restartRequired,\n nextUserAction: runtimeInstall.nextUserAction,\n errorCode: runtimeInstall.errorCode,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n })\n } catch (err) {\n log(`Could not report install status to Haven: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n // #1377 D: stay alive through the approval instead of going dead exactly\n // while the user acts. Skipped in structured/automation mode\n // (waitForApproval: false — the --json contract emits promptly) and when\n // the install itself needs manual completion first.\n if (options.waitForApproval !== false && !runtimeInstall.errorCode) {\n await waitForBudgetApproval(api, registration.setup_id, localApiKey, log, options.approvalWait)\n }\n\n printNextSteps(runtimeInstall, log)\n\n return {\n setupId: registration.setup_id,\n agentId: registration.agent_id,\n delegateAddress: registration.delegate_address,\n credentialPaths,\n outcome: completionOutcome({\n runtimeInstall,\n delegateAddress: registration.delegate_address,\n setupChallengeExpiresAt: setup.challenge.expires_at,\n approvalRequired: registration.agent_status === 'pending_approval',\n }),\n }\n}\n\nexport function completionOutcome(input: {\n runtimeInstall: RuntimeInstallResult\n delegateAddress: string\n setupChallengeExpiresAt?: string\n approvalRequired: boolean\n}): ConnectOutcome {\n const { runtimeInstall } = input\n const manualSetup = runtimeInstall.errorCode === 'manual_runtime_setup_required'\n const nextAction = runtimeInstall.nextUserAction\n const outcome: ConnectOutcome = {\n schema_version: CONNECT_OUTCOME_SCHEMA_VERSION,\n outcome: runtimeInstall.errorCode ? 'action_required' : 'complete',\n runtime: runtimeInstall.runtime,\n topology: runtimeInstall.runtimeMcpMode,\n configuration: {\n hosted_mcp: runtimeInstall.hostedMcpConfigured,\n local_signer: runtimeInstall.localSignerConfigured,\n local_mcp: runtimeInstall.localMcpConfigured,\n },\n probe: { result: runtimeInstall.probeResult },\n activation: {\n restart_required: runtimeInstall.restartRequired,\n instruction: manualSetup\n ? 'Finish the manual MCP setup using the secret-free references shown in normal Connect output, then start a fresh session.'\n : runtimeProfile(runtimeInstall.runtime).activationInstruction,\n },\n next_action: nextAction,\n approval: { required: input.approvalRequired, expires_at: null },\n verification: {\n tools: ['haven_get_agent', 'haven_get_allowances'] as const,\n instruction: runtimeVerificationInstruction(runtimeInstall.runtime),\n },\n // The backend contract supplies a 20-byte address. If an unexpected\n // malformed value arrives, do not echo it into an automation-facing\n // record; the human log has already been redacted separately.\n delegate_address: /^0x[0-9a-fA-F]{40}$/.test(input.delegateAddress)\n ? shortAddress(input.delegateAddress)\n : '[delegate-address-redacted]',\n ...(input.setupChallengeExpiresAt ? { setup_challenge_expires_at: input.setupChallengeExpiresAt } : {}),\n ...(runtimeInstall.errorCode\n ? { error: { code: runtimeInstall.errorCode, next_action: nextAction } }\n : {}),\n }\n return outcome\n}\n\n/**\n * A deliberately terse failure record: error messages can contain server or\n * filesystem detail, while this public contract must remain safe to serialize.\n */\nexport function failedConnectOutcome(runtimeHint: string | undefined, error: unknown): ConnectOutcome {\n const message = error instanceof Error ? error.message : ''\n const code = /Node\\.js >=/i.test(message)\n ? 'unsupported_node_version'\n : /setup challenge.*expired|expired or invalid/i.test(message)\n ? 'setup_challenge_expired_or_invalid'\n : /only available for Claude Code and Codex/i.test(message)\n ? 'local_mcp_unsupported_runtime'\n : 'connect_failed'\n const runtime = normalizeRuntime(runtimeHint)\n const nextAction = code === 'setup_challenge_expired_or_invalid'\n ? 'return_to_haven_for_fresh_setup'\n : code === 'unsupported_node_version'\n ? 'install_supported_node_and_rerun_connect'\n : code === 'local_mcp_unsupported_runtime'\n ? 'rerun_without_local_mcp'\n : 'review_the_safe_error_output_and_start_a_fresh_haven_setup_if_needed'\n return {\n schema_version: CONNECT_OUTCOME_SCHEMA_VERSION,\n outcome: 'failed',\n runtime,\n topology: 'unknown',\n configuration: { hosted_mcp: false, local_signer: false, local_mcp: false },\n probe: { result: 'not_run' },\n activation: { restart_required: false, instruction: 'Resolve the reported problem before activating Haven tools.' },\n next_action: nextAction,\n approval: { required: false, expires_at: null },\n verification: {\n tools: ['haven_get_agent', 'haven_get_allowances'] as const,\n instruction: 'After a successful setup and activation, verify only with haven_get_agent and haven_get_allowances.',\n },\n error: { code, next_action: nextAction },\n }\n}\n\nfunction printSetupSummary(setup: ResolvedSetup, log: (message: string) => void): void {\n log(`Fetched Haven setup for ${setup.agent.name}.`)\n log(`Haven wallet: ${setup.haven_wallet.name} on ${setup.haven_wallet.network}.`)\n if (setup.agent_budget.length > 0) {\n for (const budget of setup.agent_budget) {\n log(\n `Agent budget: ${budget.allowance_amount} atomic ${budget.token_symbol} / ${budget.reset_period_min} minute reset.`,\n )\n }\n }\n log(`Setup challenge expires at ${setup.challenge.expires_at}. If it expires, return to Haven for a fresh setup and rerun Connect — do not reuse or paste credentials.`)\n}\n\nfunction assertSetupChallengeIsUsable(expiresAt: string): void {\n const expiresAtMs = Date.parse(expiresAt)\n if (!Number.isNaN(expiresAtMs) && expiresAtMs > Date.now()) return\n throw new Error(\n 'This Haven setup challenge is expired or invalid. Return to Haven, start a fresh connection, and rerun Connect. No local credentials were written.',\n )\n}\n\nfunction isExpiredSetupChallenge(err: unknown): boolean {\n return err instanceof Error && /(?:setup )?challenge.*expir|expir.*(?:setup )?challenge/i.test(err.message)\n}\n\nfunction secureLogger(log: (message: string) => void, redactPaths = false): (message: string) => void {\n return (message) => {\n let safe = redactSecrets(message)\n if (redactPaths) {\n safe = safe\n .replace(/(?:~|\\/)[^\\s`\"']*\\/(?:identity|signer|agent)\\.json\\b/g, '[credential-file-redacted]')\n .replace(/(?:~|\\/)[^\\s`\"']*\\/\\.env\\b/g, '[credential-env-redacted]')\n }\n log(safe)\n }\n}\n\nfunction printRuntimeInstall(result: RuntimeInstallResult, log: (message: string) => void): void {\n for (const message of result.messages) log(message)\n if (result.localMcpConfigured) {\n log('Configured local Haven MCP tools.')\n } else if (result.hostedMcpConfigured) {\n log('Configured hosted Haven MCP identity.')\n } else {\n log('Haven MCP tools still need runtime setup.')\n }\n if (result.localSignerConfigured) {\n log('Configured local Haven signer.')\n } else {\n log('Local Haven signer still needs runtime setup.')\n }\n}\n\n/**\n * #1377 D: after registering, the connector no longer goes dead while the\n * user approves in Haven — it polls the narrow connector-status endpoint\n * (agent-API-key auth, works during `setup_pending`) and narrates progress in\n * the flow's voice, ending in a concrete celebration naming the granted\n * authority. Bounds (stated per the issue): poll every 5 s, give up after\n * 3 minutes — the connector ALWAYS terminates on its own; a timeout is a\n * clean exit with guidance, never a hang. Injectable clock/cadence for tests.\n */\nexport interface ApprovalWaitOptions {\n intervalMs?: number\n timeoutMs?: number\n sleep?: (ms: number) => Promise<void>\n}\n\n/** Human form of an atomic amount — whole numbers stay whole (\"25\", not \"25.0\"). */\nfunction formatAtomicAmount(atomic: bigint, decimals: number): string {\n const s = atomic.toString().padStart(decimals + 1, '0')\n const intPart = s.slice(0, s.length - decimals) || '0'\n const fracPart = s.slice(s.length - decimals).replace(/0+$/, '')\n return fracPart ? `${intPart}.${fracPart}` : intPart\n}\n\n/**\n * #1426: one voice with the dashboard. The celebration line renders next to\n * the dashboard's approved screen describing the SAME grant, so every period\n * the dashboard offers (RESET_PERIODS: 0/1440/10080/43200) must phrase\n * identically to `budgetPeriodLabel`'s sentence form — \"per 10080 minutes\"\n * made the user do arithmetic on a reassurance message. `0` says \"in total\"\n * (the dashboard's sentence form), not \"with no automatic reset\" — one voice,\n * decided here rather than left as a recorded divergence.\n *\n * Deliberately NOT one source of truth with the frontend: the shared mapping\n * lives in dashboard code, and the only shared home would be\n * `@haven_ai/core` — a PRIVATE workspace package that published packages\n * (this one) must never depend on. Same structural reason the frontend keeps\n * an inline copy of the skill content; the parity tests are the coupling.\n */\nfunction describeResetPeriod(resetPeriodMin: number): string {\n if (resetPeriodMin === 1440) return 'per day'\n if (resetPeriodMin === 10080) return 'per week'\n if (resetPeriodMin === 43200) return 'per month'\n if (resetPeriodMin === 60) return 'per hour'\n if (resetPeriodMin === 0) return 'in total'\n return `every ${resetPeriodMin} minutes`\n}\n\nfunction describeApprovedBudget(budget: {\n token_symbol: string\n token_address: string\n amount: string\n reset_period_min: number\n}): string {\n const token = resolveTokenFromAddress(budget.token_address)\n const amount = token\n ? `${formatAtomicAmount(BigInt(budget.amount), token.decimals)} ${budget.token_symbol}`\n : `${budget.amount} ${budget.token_symbol} (atomic units)`\n return `${amount} ${describeResetPeriod(budget.reset_period_min)}`\n}\n\nexport async function waitForBudgetApproval(\n api: Pick<ConnectApiClient, 'getConnectorStatus'>,\n setupId: string,\n apiKey: string,\n log: (message: string) => void,\n options: ApprovalWaitOptions = {},\n): Promise<'approved' | 'pending' | 'ended'> {\n const intervalMs = options.intervalMs ?? 5_000\n const timeoutMs = options.timeoutMs ?? 180_000\n const sleep = options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)))\n const maxPolls = Math.max(1, Math.floor(timeoutMs / intervalMs))\n const remindEvery = Math.max(1, Math.floor(30_000 / intervalMs))\n\n log('Registered with Haven — waiting for you to approve the budget in the dashboard…')\n for (let i = 0; i < maxPolls; i++) {\n await sleep(intervalMs)\n let status: Awaited<ReturnType<ConnectApiClient['getConnectorStatus']>>\n try {\n status = await api.getConnectorStatus(setupId, apiKey)\n } catch (err) {\n // 401/404 are verdicts, not noise: the user cancelled the setup from\n // the dashboard (key revoked) or the setup is gone. Retrying for the\n // rest of the window and then saying \"still pending\" would be wrong —\n // there is nothing left to approve.\n if (err instanceof ConnectRequestError && (err.status === 401 || err.status === 404)) {\n log('This setup ended in Haven — start a fresh connection from the dashboard when ready.')\n return 'ended'\n }\n // A flaky poll is not a verdict — keep waiting inside the same bound.\n continue\n }\n if (status.status === 'active') {\n log(\n status.approved_budget\n ? `Budget approved 🎉 — I can now spend up to ${describeApprovedBudget(status.approved_budget)} from your Haven wallet.`\n : 'Budget approved 🎉 — the agent can now spend within its Haven rules.',\n )\n return 'approved'\n }\n if (status.status === 'cancelled' || status.status === 'expired' || status.status === 'failed') {\n log(`This setup ended in Haven (${status.status}) — start a fresh connection from the dashboard when ready.`)\n return 'ended'\n }\n if ((i + 1) % remindEvery === 0) {\n log('Still waiting for budget approval in Haven…')\n }\n }\n log(\n 'Budget approval is still pending in Haven. Approve it in the dashboard whenever you are ready — ' +\n 'the agent tools unlock the moment you do. Verify later with the read-only haven_get_agent tool.',\n )\n return 'pending'\n}\n\n/**\n * The two remaining gates after the local connector finishes: approve the rules\n * in Haven, then (for most runtimes) restart so the freshly-written MCP config\n * is loaded. The approval line states the dependency explicitly — tools never\n * appear before approval, restart or not — because an agent that had already\n * approved still couldn't tell whether missing tools meant \"not approved\" or\n * \"needs restart.\"\n */\nexport function completionHandoffLines(result: RuntimeInstallResult): string[] {\n if (result.errorCode === 'manual_runtime_setup_required') {\n return [\n 'Next steps:',\n '1. Return to Haven and approve the agent rules. Approval — not restarting — unlocks Haven tools.',\n '2. Finish the manual MCP setup using the secret-free file references printed above, then start a fresh session in your runtime.',\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n }\n if (result.errorCode) {\n return [\n 'Recovery: runtime setup is not complete. Resolve the reported problem, then return to Haven for a fresh connection and run its new Connect command. Do not manually edit runtime config or paste credentials into prompts, logs, or config.',\n ]\n }\n\n const profile = runtimeProfile(result.runtime)\n return [\n 'Next steps:',\n '1. Return to Haven and approve the agent rules. Approval — not restarting — unlocks Haven tools.',\n `2. ${profile.activationInstruction}`,\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n}\n\nfunction printNextSteps(result: RuntimeInstallResult, log: (message: string) => void): void {\n for (const line of completionHandoffLines(result)) log(line)\n}\n","import { CONNECTOR_VERSION, type ConnectOptions } from './runtime.js'\n\nexport interface ParsedCli {\n options: ConnectOptions\n help: boolean\n json: boolean\n}\n\nexport function parseArgs(argv: string[], env: NodeJS.ProcessEnv = process.env): ParsedCli {\n const options: Partial<ConnectOptions> = {\n apiBaseUrl: env.HAVEN_API_URL ?? 'http://localhost:3001',\n connectorVersion: CONNECTOR_VERSION,\n }\n let help = false\n let json = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--help' || arg === '-h') {\n help = true\n } else if (arg === '--json') {\n json = true\n } else if (arg === '--setup' || arg === '--setup-token') {\n options.setupToken = requireValue(argv, ++i, arg)\n } else if (arg === '--api' || arg === '--api-url') {\n options.apiBaseUrl = requireValue(argv, ++i, arg)\n } else if (arg === '--runtime') {\n options.runtime = requireValue(argv, ++i, arg)\n } else if (arg === '--credentials-dir') {\n options.credentialsDir = requireValue(argv, ++i, arg)\n } else if (arg === '--environment-label') {\n options.environmentLabel = requireValue(argv, ++i, arg)\n } else if (arg === '--ack-local-tools') {\n options.ackLocalTools = true\n } else if (arg === '--ack-signer') {\n options.ackSigner = true\n options.ackLocalTools = true\n } else if (arg === '--local' || arg === '--local-mcp') {\n options.localMcp = true\n } else if (arg === '--version') {\n process.stdout.write(`${CONNECTOR_VERSION}\\n`)\n process.exit(0)\n } else {\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n if (help) {\n return { options: options as ConnectOptions, help, json }\n }\n\n if (!options.setupToken) {\n throw new Error('Missing --setup <hv_setup_...> setup token.')\n }\n if (!options.apiBaseUrl) {\n throw new Error('Missing --api <Haven API URL>.')\n }\n\n options.apiBaseUrl = options.apiBaseUrl.replace(/\\/+$/, '')\n return { options: options as ConnectOptions, help, json }\n}\n\nexport function helpText(): string {\n return [\n 'Haven Connect Agent 2 local connector',\n '',\n 'Generates the agent signing key locally, stores it on this machine, and',\n 'sends Haven only the public signing address plus a proof signature.',\n '',\n 'Usage:',\n ' npx -y @haven_ai/connect --setup hv_setup_... --api https://api.haven.example --ack-local-tools --runtime claude-code',\n '',\n 'Options:',\n ' --setup <token> Short-lived setup token from Haven.',\n ' --api <url> Haven backend API URL. Defaults to HAVEN_API_URL or http://localhost:3001.',\n ' --runtime <name> Agent runtime hint, such as claude-code, codex-cli, codex-desktop, cursor, vscode, claude-desktop, or hermes.',\n ' --credentials-dir <path> Credential directory fallback. Defaults to ~/.haven/agents.',\n ' --environment-label <text> Non-sensitive label shown in Haven setup review.',\n ' --ack-local-tools Write the one-time local Haven tools acknowledgement during setup.',\n ' --ack-signer Backward-compatible alias for --ack-local-tools.',\n ' --local Advanced: install the fully-local Haven MCP (no hosted dependency).',\n ' Only available for Claude Code and Codex. Default is hosted MCP + local signer.',\n ' --json Emit one versioned, secret-free result object on stdout; progress stays on stderr.',\n ' --help Show this help.',\n '',\n 'The connector never prints the private key and never sends it to Haven. JSON output never includes credential contents or full credential paths.',\n ].join('\\n')\n}\n\nfunction requireValue(argv: string[], index: number, option: string): string {\n const value = argv[index]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${option}.`)\n }\n return value\n}\n","#!/usr/bin/env node\n\nimport { realpathSync } from 'node:fs'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { helpText, parseArgs } from './args.js'\nimport { failedConnectOutcome, runConnect } from './runtime.js'\nimport { redactSecrets } from './redact.js'\n\nexport interface CliIo {\n stdout: (message: string) => void\n stderr: (message: string) => void\n}\n\nexport async function runCli(\n argv: string[],\n io: CliIo = {\n stdout: (message) => process.stdout.write(message),\n stderr: (message) => process.stderr.write(message),\n },\n): Promise<number> {\n const wantsJson = argv.includes('--json')\n let parsed\n try {\n parsed = parseArgs(argv)\n } catch (err) {\n if (wantsJson) {\n io.stdout(`${JSON.stringify(failedConnectOutcome(undefined, err))}\\n`)\n } else {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n }\n return 1\n }\n if (parsed.help) {\n io.stdout(`${helpText()}\\n`)\n return 0\n }\n try {\n // --json is the automation contract: emit the outcome promptly instead of\n // blocking up to the approval-wait bound (#1377 D).\n const result = await runConnect(\n { ...parsed.options, waitForApproval: !parsed.json },\n {\n log: (message) => (parsed.json ? io.stderr : io.stdout)(`${message}\\n`),\n redactPaths: parsed.json,\n },\n )\n if (parsed.json) io.stdout(`${JSON.stringify(result.outcome)}\\n`)\n return 0\n } catch (err) {\n if (parsed.json) {\n io.stdout(`${JSON.stringify(failedConnectOutcome(parsed.options.runtime, err))}\\n`)\n } else {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n }\n return 1\n }\n}\n\nasync function main(): Promise<void> {\n const exitCode = await runCli(process.argv.slice(2))\n if (exitCode !== 0) process.exitCode = exitCode\n}\n\n/**\n * npm executes package bins through a `node_modules/.bin` symlink. Node keeps\n * that symlink in `process.argv[1]`, whereas `import.meta.url` identifies the\n * real module path. Resolve both sides before comparing so a published\n * `haven-connect` bin starts, while an ordinary `runCli` import remains inert.\n */\nexport function isCliEntrypoint(\n argvPath: string | undefined = process.argv[1],\n moduleUrl: string = import.meta.url,\n): boolean {\n if (!argvPath) return false\n try {\n return realpathSync(argvPath) === realpathSync(fileURLToPath(moduleUrl))\n } catch {\n // Keep the direct-file behavior when a loader provides an unresolvable\n // path. A missing path cannot be a safe reason to run imported CLI code.\n return pathToFileURL(argvPath).href === moduleUrl\n }\n}\n\nif (isCliEntrypoint()) void main()\n"]}
|