@haven_ai/connect 0.1.27-alpha.0 → 0.1.29-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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime-manifest.ts","../src/config-writers.ts","../src/probes.ts","../src/signer-runtime.ts","../src/runtime-registry.ts","../src/signer-consent.ts","../src/doctor.ts","../src/api.ts","../src/key.ts","../src/redact.ts","../src/storage.ts","../src/runtime-install.ts","../src/local-mcp-consent.ts","../src/local-mcp-runtime.ts","../src/skill-install.ts","../src/runtime.ts","../src/args.ts","../src/cli.ts"],"names":["MCP_VERSION","HAVEN_MINIMUM_NODE_VERSION","registeredToolNames","signerToolSchemas","parseDocument","isMap","replacement","needsTrailingNewline","stringify","unlink","merged","readFile","path","mkdir","dirname","writeFile","chmod","homedir","resolve","platform","join","spawn","access","promisify","execFile","ensureSignerConsent","writeLogChunk","computeSignerConsentHash","loadSignerCredentials","signer","createEdgeSigner","toolSchemas","readdir","stat","Wallet","crypto","rm","ensureConsent","computeConsentHash","loadCredentials","consentInputFromClient","execFileAsync","unsupportedNodeVersionMessage","installedRuntimeMatches","installRuntimePackages","assertFileExists","writeWrapper","writeRuntimeSidecar","isSupportedNodeVersion","readPackageJson","SKILL_FOLDER_NAME","HAVEN_SKILL_MD","HAVEN_SKILL_BODY_MD","signerCredentialReady","errorCode","nextAction","resolveTokenFromAddress","runDoctor","runRepair","realpathSync","fileURLToPath","pathToFileURL"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { MCP_VERSION, registeredToolNames } from '@haven_ai/mcp'\nimport { toolSchemas as signerToolSchemas } from '@haven_ai/signer'\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.27-alpha.0',\n signerPackage: '@haven_ai/signer',\n signerVersion: '0.1.27-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 /**\n * The signer MCP's tool surface, DERIVED from the pinned @haven_ai/signer\n * package (#1587) — same anti-drift rule as `requiredTools` above: a\n * literal list here would rot the first time the signer gains a tool.\n * The handshake probe requires all of them.\n */\n requiredSignerTools: Object.keys(signerToolSchemas) 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\n/**\n * #1589: the doctor needs to READ the config the writers write. One resolver,\n * next to the path functions themselves so a new runtime cannot be added\n * without the doctor seeing it (returns null for runtimes without a\n * file-based config this module owns, e.g. claude-code via the CLI).\n */\nexport function runtimeConfigPathFor(runtime: string, homeDir = homedir()): string | null {\n switch (runtime) {\n case 'cursor':\n return cursorConfigPath(homeDir)\n case 'codex-cli':\n case 'codex-desktop':\n return codexConfigPath(homeDir)\n case 'vscode':\n return vscodeConfigPath(homeDir)\n case 'vscode-insiders':\n return vscodeInsidersConfigPath(homeDir)\n case 'claude-desktop':\n return claudeDesktopConfigPath(homeDir)\n case 'hermes':\n return hermesConfigPath(homeDir)\n default:\n return null\n }\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 { 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 /** #1589: the initialize response's serverInfo/capabilities, when reached —\n * the doctor reports the signer's advertised compat versions from here\n * instead of a second probe call. */\n serverInfo?: { name?: string; version?: string }\n capabilities?: Record<string, unknown>\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 let serverInfo: { name?: string; version?: string } | undefined\n let capabilities: Record<string, unknown> | undefined\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 const init = payload.result as\n | { serverInfo?: { name?: string; version?: string }; capabilities?: Record<string, unknown> }\n | undefined\n serverInfo = init?.serverInfo\n capabilities = init?.capabilities\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, serverInfo, capabilities })\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 { 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 /** Heartbeats during the (possibly minutes-long) npm install (#1586). */\n onProgress?: (message: string) => void\n}\n\n/**\n * Honest budget for a COLD-cache install over a slow link (#1586). The old\n * 120s budget was exactly what broke the 2026-08-18 Codex Desktop setup: a\n * 6+ minute cold install was killed at 2 minutes, the failure fell back to\n * npx silently, and the resulting config structurally could not start.\n */\nexport const SIGNER_INSTALL_TIMEOUT_MS = 600_000\n\n/** How often the console hears from a long install instead of going silent. */\nexport const SIGNER_INSTALL_HEARTBEAT_MS = 15_000\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)\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 deps: SignerRuntimeDeps,\n): Promise<void> {\n const { runCommand, onProgress } = deps\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 // Heartbeat while npm works: a cold install can legitimately take\n // minutes, and a silent console reads as a hang (#1586).\n const startedAt = Date.now()\n const heartbeat = setInterval(() => {\n const seconds = Math.round((Date.now() - startedAt) / 1000)\n onProgress?.(`Still installing the local Haven signer runtime… (${seconds}s — a cold cache can take several minutes)`)\n }, SIGNER_INSTALL_HEARTBEAT_MS)\n heartbeat.unref?.()\n try {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: SIGNER_INSTALL_TIMEOUT_MS, maxBuffer: 1024 * 1024 })\n } finally {\n clearInterval(heartbeat)\n }\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\nexport async 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\n/** The sidecar `prepareSignerRuntime` writes next to the credentials (#1589). */\nexport interface SignerRuntimeSidecar {\n signer_package: string\n signer_version: string\n sdk_package: string\n sdk_version: string\n wrapper_path: string\n runtime_directory: string\n npm_cache_directory: string\n cli_path: string\n}\n\nexport async function readRuntimeSidecar(credentialDirectory: string): Promise<SignerRuntimeSidecar | null> {\n try {\n return JSON.parse(\n await readFile(join(credentialDirectory, 'signer-runtime.json'), 'utf8'),\n ) as SignerRuntimeSidecar\n } catch {\n return null\n }\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","/**\n * `--doctor` / `--repair` (#1589, epic #1585) — end-to-end setup diagnosis\n * without hand-building an MCP stdio client, which is what the 2026-08-18\n * external Codex Desktop tester was reduced to.\n *\n * Doctor is READ-ONLY (its one spawn is the same read-only tools/list\n * handshake setup itself uses) and secret-free: checks report names, paths,\n * versions and verdicts — never the api key or any key material. Repair\n * re-runs the pieces setup already owns — reinstall the pinned signer\n * runtime, rewrite wrapper + sidecar, re-write the runtime config from the\n * STORED identity — and never touches credentials or needs a new setup token.\n *\n * Design notes carried in from #1587's review:\n * - the signer probe reports the initialize payload, so compat versions come\n * from the SAME handshake (no second probe);\n * - a probe against an un-acknowledged consent gate exits 1 — the doctor\n * reports that as \"consent missing\" with the ack re-run as the repair,\n * never as \"signer broken\".\n */\n\nimport { readFile, readdir, stat } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { MCP_RUNTIME_MANIFEST } from './runtime-manifest.js'\nimport { probeHostedMcpTools, probeLocalMcpTools, type LocalMcpProbeResult } from './probes.js'\nimport {\n installedRuntimeMatches,\n prepareSignerRuntime,\n readRuntimeSidecar,\n type SignerRuntimeSidecar,\n} from './signer-runtime.js'\nimport { runtimeConfigPathFor, writeRuntimeConfig } from './config-writers.js'\nimport { restartRequiredForRuntime, type RuntimeId } from './runtime-registry.js'\nimport { getLocalSignerConsentStatus } from './signer-consent.js'\n\nexport interface DoctorCheck {\n id: string\n label: string\n ok: boolean\n /** Human detail — never secret material. */\n detail: string\n /** One concrete action, present exactly when the check fails. */\n repair?: string\n}\n\nexport interface DoctorReport {\n version: 1\n ok: boolean\n runtime: string\n credentialDirectory?: string\n checks: DoctorCheck[]\n /** Signer compat surface from the live handshake, when it succeeded. */\n signerCapabilities?: Record<string, unknown>\n}\n\nexport interface DoctorDeps {\n homeDir?: string\n fetch?: typeof fetch\n probeSignerTools?: typeof probeLocalMcpTools\n probeHosted?: typeof probeHostedMcpTools\n runCommand?: (command: string, args: string[]) => Promise<void>\n env?: NodeJS.ProcessEnv\n}\n\ninterface IdentityFile {\n api_key?: string\n agent_id?: string\n api_url?: string\n hosted_mcp_url?: string\n}\n\nconst RERUN = 'npx @haven_ai/connect@alpha'\n\n/** Newest agent directory that holds an identity.json, plus a multi-dir note. */\nasync function discoverCredentialDirectory(\n homeDir: string,\n explicit?: string,\n): Promise<{ directory?: string; note?: string }> {\n if (explicit) return { directory: explicit }\n const root = join(homeDir, '.haven', 'agents')\n let entries: string[] = []\n try {\n entries = await readdir(root)\n } catch {\n return {}\n }\n const candidates: Array<{ directory: string; mtimeMs: number }> = []\n for (const entry of entries) {\n const directory = join(root, entry)\n try {\n const s = await stat(join(directory, 'identity.json'))\n candidates.push({ directory, mtimeMs: s.mtimeMs })\n } catch {\n // not an agent credential dir\n }\n }\n if (candidates.length === 0) return {}\n candidates.sort((a, b) => b.mtimeMs - a.mtimeMs)\n return {\n directory: candidates[0].directory,\n note: candidates.length > 1 ? `${candidates.length} agent credential dirs found; examining the newest.` : undefined,\n }\n}\n\nexport async function runDoctor(\n input: { runtime: string; credentialsDir?: string },\n deps: DoctorDeps = {},\n): Promise<DoctorReport> {\n const homeDir = deps.homeDir ?? homedir()\n const checks: DoctorCheck[] = []\n let signerCapabilities: Record<string, unknown> | undefined\n\n const { directory, note } = await discoverCredentialDirectory(homeDir, input.credentialsDir)\n\n // ── 1. Credentials ────────────────────────────────────────────────────────\n let identity: IdentityFile | undefined\n let signerParses = false\n if (!directory) {\n checks.push({\n id: 'credentials',\n label: 'Agent credentials',\n ok: false,\n detail: 'No agent credential directory with an identity.json under ~/.haven/agents.',\n repair: `Run the full setup once: ${RERUN} --setup <token from the Haven dashboard>.`,\n })\n } else {\n try {\n identity = JSON.parse(await readFile(join(directory, 'identity.json'), 'utf8')) as IdentityFile\n } catch {\n identity = undefined\n }\n try {\n const signer = JSON.parse(await readFile(join(directory, 'signer.json'), 'utf8')) as Record<string, unknown>\n signerParses = typeof signer === 'object' && signer !== null\n } catch {\n signerParses = false\n }\n const ok = Boolean(identity?.api_key) && signerParses\n checks.push({\n id: 'credentials',\n label: 'Agent credentials',\n ok,\n detail: ok\n ? `identity.json and signer.json parse (agent ${identity?.agent_id ?? 'unknown'})${note ? ` — ${note}` : ''}`\n : 'identity.json or signer.json is missing or unparseable.',\n ...(ok ? {} : { repair: `Re-run the full setup with a fresh token: ${RERUN} --setup <token>.` }),\n })\n }\n\n // ── 2. Signer runtime install ─────────────────────────────────────────────\n let sidecar: SignerRuntimeSidecar | null = null\n if (directory) {\n sidecar = await readRuntimeSidecar(directory)\n if (!sidecar) {\n checks.push({\n id: 'signer_runtime',\n label: 'Signer runtime (preinstalled wrapper)',\n ok: false,\n detail: 'No signer-runtime.json sidecar — the pinned signer runtime was never prepared (or a pre-#1586 npx config).',\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n } else {\n const matches = await installedRuntimeMatches(sidecar.runtime_directory, sidecar.cli_path)\n const versionOk = sidecar.signer_version === MCP_RUNTIME_MANIFEST.signerVersion\n const ok = matches && versionOk\n checks.push({\n id: 'signer_runtime',\n label: 'Signer runtime (preinstalled wrapper)',\n ok,\n detail: ok\n ? `Installed ${sidecar.signer_package}@${sidecar.signer_version} at ${sidecar.runtime_directory}`\n : matches\n ? `Installed version ${sidecar.signer_version} does not match the connector's pinned ${MCP_RUNTIME_MANIFEST.signerVersion}.`\n : `Runtime directory is stale or empty (${sidecar.runtime_directory}) — the CLI or package versions are missing.`,\n ...(ok ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n }\n\n // ── 3. Runtime config ─────────────────────────────────────────────────────\n const configPath = runtimeConfigPathFor(input.runtime, homeDir)\n if (configPath === null) {\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok: true,\n detail: `Runtime '${input.runtime}' has no file-based config the connector owns (CLI-managed) — skipping the file check.`,\n })\n } else {\n let configText: string | null = null\n try {\n configText = await readFile(configPath, 'utf8')\n } catch {\n configText = null\n }\n if (configText === null) {\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok: false,\n detail: `No runtime config at ${configPath}.`,\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n } else {\n const hasHaven = identity?.hosted_mcp_url\n ? configText.includes(identity.hosted_mcp_url)\n : configText.includes('haven')\n // The wrapper form never writes the package spec into the config; only\n // the retired npx launch does — so the spec's presence IS the tell.\n const signerViaNpx = configText.includes('@haven_ai/signer')\n const wrapperReferenced = sidecar ? configText.includes(sidecar.wrapper_path) : false\n const ok = hasHaven && !signerViaNpx && (sidecar ? wrapperReferenced : true)\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok,\n detail: ok\n ? `Config at ${configPath} references the hosted server and the prepared signer wrapper.`\n : signerViaNpx\n ? `Config at ${configPath} still launches the signer via npx — the pre-#1586 shape that cannot start under a 120s startup timeout.`\n : `Config at ${configPath} is missing the Haven entries${sidecar && !wrapperReferenced ? ' (or references a different signer wrapper)' : ''}.`,\n ...(ok ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n }\n\n // ── 4. Hosted MCP ─────────────────────────────────────────────────────────\n if (identity?.api_key && (identity.hosted_mcp_url || identity.api_url)) {\n const hostedUrl = identity.hosted_mcp_url ?? `${identity.api_url}/mcp`\n const probe = await (deps.probeHosted ?? probeHostedMcpTools)(identity.api_key, hostedUrl, deps.fetch)\n checks.push({\n id: 'hosted_mcp',\n label: 'Hosted Haven MCP',\n ok: probe.status === 'ok',\n detail: probe.status === 'ok'\n ? `Reachable and authorized (${hostedUrl}).`\n : `Probe failed: ${probe.status} (${hostedUrl}).`,\n ...(probe.status === 'ok'\n ? {}\n : {\n repair: probe.status === 'unauthorized'\n ? `The stored API key was rejected — re-run the full setup with a fresh token: ${RERUN} --setup <token>.`\n : 'Check network access to the hosted MCP URL, then re-run --doctor.',\n }),\n })\n } else {\n checks.push({\n id: 'hosted_mcp',\n label: 'Hosted Haven MCP',\n ok: false,\n detail: 'No stored API key / hosted MCP URL to probe with.',\n repair: `Re-run the full setup: ${RERUN} --setup <token>.`,\n })\n }\n\n // ── 5. Signer process handshake ───────────────────────────────────────────\n if (sidecar && directory) {\n const consent = await getLocalSignerConsentStatus(join(directory, 'signer.json'))\n if (!consent.acknowledged) {\n // #1587 review: an un-acknowledged consent gate exits 1 and would read\n // as process_error — report the true cause instead of \"signer broken\".\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: false,\n detail: 'The local-tools consent is not acknowledged, so the signer refuses to start (by design).',\n repair: `Run: ${RERUN} --ack-local-tools --setup <token> (or re-run your original setup command with --ack-local-tools).`,\n })\n } else {\n const probe: LocalMcpProbeResult = await (deps.probeSignerTools ?? probeLocalMcpTools)(\n sidecar.wrapper_path,\n [],\n MCP_RUNTIME_MANIFEST.requiredSignerTools,\n )\n // Real signer shape nests MCP capabilities under `experimental`\n // (signerCapabilityAdvertisement); accept both for robustness.\n const experimental = (probe.capabilities?.experimental ?? probe.capabilities) as\n | Record<string, unknown>\n | undefined\n const compat = experimental?.['haven/signer-compatibility'] as Record<string, unknown> | undefined\n signerCapabilities = compat ? { 'haven/signer-compatibility': compat } : undefined\n const compatDetail = compat\n ? ` Compat: x402 expected-context v${JSON.stringify((compat as { x402_expected_context_versions?: unknown }).x402_expected_context_versions ?? '?')}.`\n : ''\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: probe.status === 'ok',\n detail: probe.status === 'ok'\n ? `Signer started, listed ${probe.toolNames?.length ?? 0} tools${probe.serverInfo?.version ? ` (v${probe.serverInfo.version})` : ''}.${compatDetail}`\n : `Handshake failed: ${probe.status}.`,\n ...(probe.status === 'ok' ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n } else if (directory) {\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: false,\n detail: 'Skipped — no prepared signer runtime to probe.',\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n }\n\n // ── 6. Restart still required? (informational, never fails the doctor) ────\n const restart = restartRequiredForRuntime(input.runtime, deps.env)\n checks.push({\n id: 'restart',\n label: 'Runtime restart',\n ok: true,\n detail: restart\n ? 'This runtime loads MCP config at startup — restart it after any repair before expecting the tools to appear.'\n : 'No restart requirement known for this runtime.',\n })\n\n return {\n version: 1,\n ok: checks.every((check) => check.ok),\n runtime: input.runtime,\n credentialDirectory: directory,\n checks,\n ...(signerCapabilities ? { signerCapabilities } : {}),\n }\n}\n\nexport interface RepairResult {\n ok: boolean\n messages: string[]\n}\n\n/** Re-run the pieces setup owns; never touches credentials or tokens. */\nexport async function runRepair(\n input: { runtime: string; credentialsDir?: string },\n deps: DoctorDeps = {},\n): Promise<RepairResult> {\n const homeDir = deps.homeDir ?? homedir()\n const messages: string[] = []\n const { directory, note } = await discoverCredentialDirectory(homeDir, input.credentialsDir)\n if (note) messages.push(`Note: ${note}`)\n if (!directory) {\n return {\n ok: false,\n messages: [`No agent credentials found to repair — run the full setup: ${RERUN} --setup <token>.`],\n }\n }\n let identity: IdentityFile\n try {\n identity = JSON.parse(await readFile(join(directory, 'identity.json'), 'utf8')) as IdentityFile\n } catch {\n return { ok: false, messages: ['identity.json is unreadable — re-run the full setup with a fresh token.'] }\n }\n if (!identity.api_key || !(identity.hosted_mcp_url || identity.api_url)) {\n return { ok: false, messages: ['identity.json lacks the stored API key / hosted URL — re-run the full setup.'] }\n }\n\n // #1589 review (HIGH): a --local (local-stdio) setup writes a structurally\n // different config (the haven entry is the LOCAL MCP wrapper, not the\n // hosted URL). Repair only knows how to write the hosted+signer shape, so\n // clobbering a local config would convert a working topology silently —\n // the exact class of harm a repair tool must never cause. Detect and\n // refuse: the local wrapper (bin/haven-mcp) and its mcp-runtime sidecar\n // are the tell.\n const configPath = runtimeConfigPathFor(input.runtime, homeDir)\n if (configPath) {\n try {\n const existing = await readFile(configPath, 'utf8')\n if (existing.includes('bin/haven-mcp') || existing.includes('.haven/mcp-runtime')) {\n return {\n ok: false,\n messages: [\n `The config at ${configPath} is the LOCAL-stdio topology (--local). Repair currently rewrites only the hosted+signer shape and will not touch it.`,\n 'Re-run your original setup command (with --local) to repair a local-stdio install.',\n ],\n }\n }\n } catch {\n // No existing config — nothing to clobber; proceed.\n }\n }\n\n const signerPath = join(directory, 'signer.json')\n const prepared = await prepareSignerRuntime(\n { credentialDirectory: directory, signerPath, homeDir },\n { runCommand: deps.runCommand },\n )\n messages.push(...prepared.messages)\n\n const configResult = await writeRuntimeConfig({\n runtime: input.runtime as RuntimeId,\n hostedMcpUrl: identity.hosted_mcp_url ?? `${identity.api_url}/mcp`,\n apiKey: identity.api_key,\n identityPath: join(directory, 'identity.json'),\n signerPath,\n credentialDirectory: directory,\n signerCommand: { command: prepared.command, args: prepared.args },\n homeDir,\n mode: 'hosted',\n })\n messages.push(...configResult.messages)\n messages.push('Repair complete — restart the runtime, then verify with --doctor.')\n return { ok: true, messages }\n}\n","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 /**\n * Omitted on the #1543 early config-written report — no probe has run yet,\n * and the backend merge keeps the key absent until the final report sets it.\n */\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 { 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\n/**\n * The config-write snapshot handed to `onRuntimeConfigured` (#1543). The\n * booleans mirror the semantics of the FINAL report's unlock keys minus the\n * probe verdicts: \"configured\" here means the config write succeeded, the\n * required consent is acknowledged, and the signer credential exists on disk\n * (a local fs check) — not that a handshake has verified it. A later probe\n * failure refines the final report and sets its errorCode; the dashboard's\n * unlock condition accepts either state.\n */\nexport interface EarlyRuntimeConfigReport {\n runtime: RuntimeId\n runtimeMcpMode: RuntimeMcpMode\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured: boolean\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n restartRequired: boolean\n nextUserAction: string\n errorCode?: 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 /**\n * #1543: invoked once, the moment the runtime MCP config write has settled —\n * BEFORE the network probes and the skill install. The dashboard withholds\n * its budget-approval controls until an install-status report shows the\n * runtime configured, and the final report only lands after the entire\n * install; gating approval on that tail made the user wait on work approval\n * does not depend on. The snapshot carries the config-write facts (no probe\n * verdicts, no skill state); the caller's complete report remains\n * authoritative and overwrites these keys. Best-effort by contract: a\n * throwing callback is swallowed and never fails the install.\n */\n onRuntimeConfigured?: (report: EarlyRuntimeConfigReport) => Promise<void> | void\n runCommand?: (command: string, args: string[]) => Promise<void>\n prepareLocalMcpRuntime?: (input: PrepareLocalMcpRuntimeInput) => Promise<PreparedLocalMcpRuntime>\n prepareSignerRuntime?: (input: PrepareSignerRuntimeInput) => Promise<PreparedSignerRuntime>\n probeSignerTools?: (\n command: string,\n args: string[],\n requiredTools: readonly string[],\n ) => Promise<LocalMcpProbeResult>\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.\n //\n // #1586: prep failure is FATAL for this setup run — loud and fail-closed,\n // never a silent npx fallback. The 2026-08-18 Codex Desktop test showed\n // why: with Codex's startup_timeout_sec = 120, an npx first-launch is a\n // multi-minute npm install killed at 2 minutes, leaving corrupted _npx\n // dirs and a config that LOOKS wired but structurally cannot connect —\n // strictly worse than a clear error. Fail-closed here means NO config is\n // written at all (not even the hosted `haven` entry): a half-wired setup\n // where quotes work but signing never can is the same looks-fine trap in\n // a different place. The recovery is a re-run once the cause (network,\n // npm cache) is addressed.\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 return {\n runtime,\n runtimeMcpMode: 'hosted_plus_signer',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: 'signer_runtime_install_failed',\n restartRequired: false,\n nextUserAction:\n 'The local Haven signer runtime could not be installed, so no configuration was written. ' +\n 'Check your network (a cold install downloads the signer package set) and re-run: npx @haven_ai/connect@alpha',\n errorCode: 'signer_runtime_install_failed',\n configTarget: profile.label,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: undefined,\n signerRuntimePrepared: false,\n messages: [\n ...consentMessages,\n `Could not pre-install the local Haven signer: ${err instanceof Error ? err.message : String(err)}`,\n 'No runtime configuration was written (fail-closed): a config pointing at an uninstalled signer looks wired but cannot start.',\n 'Re-run `npx @haven_ai/connect@alpha` to retry the setup.',\n ],\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 // #1543: the config write has settled — everything the dashboard's approval\n // unlock reads is now known, so report it before the probes and skill\n // install run. The signer-credential check is a local fs stat, cheap enough\n // to make the early booleans carry the final report's semantics (minus the\n // network probe verdicts, which only refine — never gate — the unlock).\n if (deps.onRuntimeConfigured) {\n const signerCredentialOnDisk = await probeLocalSignerCredential(input.signerPath)\n const earlyLocalMcpOk = configResult.runtimeMcpMode === 'local_stdio' &&\n configResult.localMcpConfigured &&\n signerCredentialOnDisk &&\n Boolean(localMcpConsent?.acknowledged)\n const earlySignerOk = configResult.runtimeMcpMode === 'local_stdio'\n ? earlyLocalMcpOk\n : configResult.signerConfigured && signerCredentialOnDisk && Boolean(signerConsent?.acknowledged)\n try {\n await deps.onRuntimeConfigured({\n runtime,\n runtimeMcpMode: configResult.runtimeMcpMode,\n hostedMcpConfigured: configResult.hostedConfigured,\n localSignerConfigured: earlySignerOk,\n localMcpConfigured: earlyLocalMcpOk,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n restartRequired: configResult.restartRequired || restartRequiredForRuntime(runtime, deps.env),\n nextUserAction: nextAction(runtime, profile.restartMode, configResult.errorCode),\n errorCode: configResult.errorCode,\n })\n } catch {\n // Best-effort by contract: early reporting must never fail the install —\n // the caller's complete report follows either way.\n }\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 // #1587: in the hosted topology the signer is its own MCP stdio server and\n // gets the same courtesy as the hosted server — a REAL handshake\n // (initialize → tools/list → required-tools check) against the registered\n // command, not a credential-file stat. The 2026-08-18 Codex test is why:\n // setup exited 0 on a signer that could not start, and the failure\n // surfaced mid-payment. Cheap and fast now that #1586 guarantees the\n // command is a prepared wrapper, never a cold npx launch.\n const signerProbePromise = configResult.runtimeMcpMode !== 'local_stdio' && signerCommand\n ? (deps.probeSignerTools ?? probeLocalMcpTools)(\n signerCommand.command,\n signerCommand.args,\n MCP_RUNTIME_MANIFEST.requiredSignerTools,\n )\n : Promise.resolve(undefined)\n const [hostedProbe, signerCredentialReady, localMcpProbe, signerProbe] = 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 signerProbePromise,\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 &&\n signerCredentialReady &&\n Boolean(signerConsent?.acknowledged) &&\n // #1587: no handshake, no green. A signer command that was registered\n // but not probed (manual topology) keeps the old semantics.\n (signerProbe === undefined || signerProbe.status === 'ok')\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) ??\n signerConsentErrorCode(signerCredentialReady, signerConsent) ??\n signerProbeErrorCode(signerProbe))\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 signerProbeMessages = signerProbe\n ? signerProbe.status === 'ok'\n ? ['Verified local Haven signer with a stdio handshake.']\n : [\n `Local Haven signer handshake failed: ${signerProbe.status}.`,\n 'Re-run `npx @haven_ai/connect@alpha` to repair the signer setup.',\n ]\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, ...signerProbeMessages, ...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 // Remove stale entries first so re-runs and hosted→local switches are\n // idempotent — `claude mcp add-json` fails when the name already exists.\n // #1569: without this, a second setup left the runtime wired to the\n // PREVIOUS agent's wrapper (the add collided, the old entry survived) —\n // the hosted sibling below always did it in this order. Deliberate\n // tradeoff: if the add fails AFTER a successful remove, the runtime ends\n // with NO haven entry instead of a stale wrong-agent one — fail-closed,\n // and the claude_code_config_failed recovery (rerun setup) works cleanly\n // from that state because this sequence is idempotent from any start.\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', serverJson, '--scope', 'user'])\n .catch(async () => {\n await runCommand('claude', ['mcp', 'add', 'haven', '--scope', 'user', '--', localMcpCommand])\n })\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 signerProbeErrorCode(probe: LocalMcpProbeResult | undefined): string | undefined {\n if (!probe || probe.status === 'ok') return undefined\n return `local_signer_probe_${probe.status}`\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 // onProgress threaded through on purpose (#1593, the #1586 review lesson):\n // without it the install heartbeat is dead code in production.\n const prepare = deps.prepareLocalMcpRuntime ?? ((runtimeInput: PrepareLocalMcpRuntimeInput) =>\n prepareLocalMcpRuntime(runtimeInput, { runCommand: deps.runCommand, onProgress: deps.onProgress }))\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 // onProgress threaded through on purpose (#1586 review): without it the\n // install heartbeat was dead code in production and the console still\n // went silent for the whole cold install — the exact symptom the issue\n // set out to remove, at a longer timeout.\n prepareSignerRuntime(runtimeInput, { runCommand: deps.runCommand, onProgress: deps.onProgress }))\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 { 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 { 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 { SIGNER_INSTALL_HEARTBEAT_MS, SIGNER_INSTALL_TIMEOUT_MS } from './signer-runtime.js'\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 /** Install progress heartbeat, mirrored from the signer runtime (#1586/#1593). */\n onProgress?: (message: string) => 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)\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 deps: LocalMcpRuntimeDeps,\n): Promise<void> {\n const { runCommand, onProgress } = deps\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 // Heartbeat while npm works, and the same honest budget as the signer\n // install: a cold-cache install can legitimately exceed the old 120s\n // timeout, and a silent console reads as a hang (#1586/#1593).\n const startedAt = Date.now()\n const heartbeat = setInterval(() => {\n const seconds = Math.round((Date.now() - startedAt) / 1000)\n onProgress?.(`Still installing the local Haven MCP runtime… (${seconds}s — a cold cache can take several minutes)`)\n }, SIGNER_INSTALL_HEARTBEAT_MS)\n heartbeat.unref?.()\n try {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: SIGNER_INSTALL_TIMEOUT_MS, maxBuffer: 1024 * 1024 })\n } finally {\n clearInterval(heartbeat)\n }\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 { 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","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, type RuntimeProfile } 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.27-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 }, {\n onProgress: log,\n // #1543: report \"runtime configured\" the moment the config write settles,\n // so the dashboard can expose its budget-approval controls without\n // waiting on the probes and skill install — a tail that approval does not\n // depend on. Silent and best-effort: the complete report below remains\n // authoritative (it overwrites these keys, adding the probe verdicts and\n // skill state), so an early failure costs nothing but the head start.\n onRuntimeConfigured: async (early) => {\n try {\n await api.updateInstallStatus(registration.setup_id, localApiKey, {\n runtime: early.runtime,\n connectorVersion,\n runtimeMcpMode: early.runtimeMcpMode,\n hostedMcpConfigured: early.hostedMcpConfigured,\n localSignerConfigured: early.localSignerConfigured,\n localMcpConfigured: early.localMcpConfigured,\n credentialFilesWritten: true,\n signerAcknowledged: early.signerAcknowledged,\n localMcpAcknowledged: early.localMcpAcknowledged,\n restartRequired: early.restartRequired,\n nextUserAction: early.nextUserAction,\n errorCode: early.errorCode ?? null,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n })\n } catch {\n // ignore — the final report follows either way\n }\n },\n })\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. Since #1543 the unlock\n // usually happened already, via the early config-written report above —\n // this complete report refines it with the probe verdicts and skill state,\n // and stays the fallback unlock path when the early one failed. It remains\n // best-effort readiness metadata only: a failed report cannot activate the\n // agent or 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. The observed outcome\n // shapes the printed next steps (#1542): an approval the wait just\n // celebrated must not be requested again two lines later.\n let approval: BudgetApprovalOutcome | undefined\n if (options.waitForApproval !== false && !runtimeInstall.errorCode) {\n approval = await waitForBudgetApproval(api, registration.setup_id, localApiKey, log, options.approvalWait)\n }\n\n printNextSteps(runtimeInstall, log, approval)\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 (36 polls; with the immediate first check below the last one\n * lands at ~175 s) — the connector ALWAYS terminates on its own; a timeout\n * is a clean exit with guidance, never a hang. Injectable clock/cadence for\n * tests.\n *\n * #1542: the first check happens BEFORE the \"waiting for you to approve\" line\n * is printed. Users routinely approve in the dashboard while the runtime\n * install is still running, and announcing a wait that is already over made\n * the very next line (\"Budget approved 🎉\") read as a contradiction — the\n * field-test agent relayed the pair verbatim as a bug.\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 type BudgetApprovalOutcome = 'approved' | 'pending' | 'ended'\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<BudgetApprovalOutcome> {\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 // Announced only once a check has actually observed a pending (or unknown)\n // state — never ahead of a first check that may find the wait already over.\n let waitingAnnounced = false\n const announceWaiting = () => {\n if (waitingAnnounced) return\n waitingAnnounced = true\n log('Registered with Haven — waiting for you to approve the budget in the dashboard…')\n }\n\n for (let i = 0; i < maxPolls; i++) {\n // The first check is immediate (#1542); only the retries pace themselves.\n if (i > 0) 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 // and say so, rather than sitting silent until a check succeeds.\n announceWaiting()\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 announceWaiting()\n if (i > 0 && i % 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\n * budget in Haven, then (for most runtimes) restart so the freshly-written MCP\n * config is loaded. The approval line states the dependency explicitly — tools\n * never appear before approval, restart or not — because an agent that had\n * already approved still couldn't tell whether missing tools meant \"not\n * approved\" or \"needs restart.\"\n *\n * #1542, from the field test:\n * - The lines are shaped by what the approval wait observed. `'approved'`\n * replaces the approve instruction with a confirmation — the connector must\n * never celebrate the approval and then instruct the user to go perform it.\n * `undefined` (wait skipped: --json mode, or an install errorCode) keeps the\n * full instruction.\n * - One name for the gate throughout this file: the BUDGET — the word the wait\n * loop, the celebration, and the dashboard's grant screen already use.\n * \"Agent rules\" here made one gate read as two.\n * - The restart step says WHY it survives the connector's own verification:\n * session/app-scoped runtimes only read MCP config at start-up.\n */\nexport function completionHandoffLines(\n result: RuntimeInstallResult,\n approval?: BudgetApprovalOutcome,\n): string[] {\n if (result.errorCode === 'manual_runtime_setup_required') {\n return [\n 'Next steps:',\n '1. Return to Haven and approve the budget. 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 if (approval === 'ended') {\n return [\n 'Next step: this setup ended in Haven before the budget was approved, so there is nothing left to approve on it — start a fresh connection from the dashboard when ready.',\n ]\n }\n\n const profile = runtimeProfile(result.runtime)\n const activation = activationInstructionWithWhy(profile)\n if (approval === 'approved') {\n return [\n 'Next steps — the budget is already approved, so there is nothing more to do in Haven:',\n `1. ${activation}`,\n `2. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n }\n return [\n 'Next steps:',\n '1. Return to Haven and approve the budget. Approval — not restarting — unlocks Haven tools.',\n `2. ${activation}`,\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n}\n\n/**\n * The field-test agent had just watched the connector print \"Verified Claude\n * Code MCP entry\" and reasonably asked why a restart was still demanded. Say\n * the reason in the instruction itself: verification ran in the connector's\n * process, but the runtime only reads MCP config at session start (or app\n * launch). Hot-reload and manual runtimes keep their registry copy untouched —\n * their instructions already carry their own activation story.\n */\nfunction activationInstructionWithWhy(profile: RuntimeProfile): string {\n if (profile.restartMode === 'restart-session') {\n return `${profile.activationInstruction} (The entries are already written and verified — ${profile.label} only reads MCP config when a session starts, which is why this step is still needed.)`\n }\n if (profile.restartMode === 'restart-app') {\n return `${profile.activationInstruction} (The entries are already written and verified — ${profile.label} only reads MCP config at app launch, which is why this step is still needed.)`\n }\n return profile.activationInstruction\n}\n\nfunction printNextSteps(\n result: RuntimeInstallResult,\n log: (message: string) => void,\n approval?: BudgetApprovalOutcome,\n): void {\n for (const line of completionHandoffLines(result, approval)) 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 /** #1589: diagnosis mode — no setup token required. */\n doctor: boolean\n repair: 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 let doctor = false\n let repair = 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 === '--doctor') {\n doctor = true\n } else if (arg === '--repair') {\n repair = 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, doctor, repair }\n }\n\n if (doctor || repair) {\n // Diagnosis/repair reuse STORED credentials — a setup token is exactly\n // what they exist to avoid needing.\n if (!options.runtime) {\n throw new Error('--doctor/--repair need --runtime <runtime> (which config to examine).')\n }\n return { options: options as ConnectOptions, help, json, doctor, repair }\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, doctor, repair }\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 ' --doctor Diagnose an existing setup (read-only, no token): config, credentials,',\n ' signer runtime, hosted MCP, and a live signer handshake. Exits non-zero on any failure.',\n ' --repair Repair, then re-diagnose (implies --doctor): reinstall the pinned signer',\n ' runtime, rewrite the wrapper and runtime config from stored credentials.',\n ' Hosted topology only (refuses to touch a --local config). No keys, no token.',\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 if (parsed.doctor || parsed.repair) {\n const { runDoctor, runRepair } = await import('./doctor.js')\n const runtime = parsed.options.runtime ?? ''\n const credentialsDir = parsed.options.credentialsDir\n try {\n if (parsed.repair) {\n const repair = await runRepair({ runtime, credentialsDir })\n for (const message of repair.messages) io.stderr(`${redactSecrets(message)}\\n`)\n if (!repair.ok) return 1\n }\n const report = await runDoctor({ runtime, credentialsDir })\n // Defensively redacted like every other output path — the report is\n // secret-free by construction, but signerCapabilities is untrusted\n // process output and belts are cheap (#1589 review).\n if (parsed.json) {\n io.stdout(`${redactSecrets(JSON.stringify(report))}\\n`)\n } else {\n for (const check of report.checks) {\n io.stdout(redactSecrets(`${check.ok ? '✓' : '✗'} ${check.label}: ${check.detail}\\n`))\n if (check.repair) io.stdout(redactSecrets(` ↳ repair: ${check.repair}\\n`))\n }\n io.stdout(report.ok ? 'All checks passed.\\n' : 'One or more checks FAILED — see repairs above.\\n')\n }\n return report.ok ? 0 : 1\n } catch (err) {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n return 1\n }\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/redact.ts","../src/server-names.ts","../src/runtime-manifest.ts","../src/config-writers.ts","../src/probes.ts","../src/signer-runtime.ts","../src/connect-error.ts","../src/runtime-registry.ts","../src/signer-consent.ts","../src/tombstone.ts","../src/doctor.ts","../src/api.ts","../src/key.ts","../src/runtime.ts","../src/storage.ts","../src/runtime-install.ts","../src/local-mcp-consent.ts","../src/local-mcp-runtime.ts","../src/skill-install.ts","../src/installed-clients.ts","../src/args.ts","../src/cli.ts"],"names":["MCP_VERSION","HAVEN_MINIMUM_NODE_VERSION","registeredToolNames","signerToolSchemas","parseDocument","isMap","replacement","needsTrailingNewline","stringify","unlink","merged","readFile","path","mkdir","dirname","writeFile","chmod","homedir","resolve","platform","join","spawn","access","promisify","execFile","nextAction","ensureSignerConsent","writeLogChunk","computeSignerConsentHash","loadSignerCredentials","signer","createEdgeSigner","toolSchemas","stat","readdir","basename","Wallet","crypto","rm","ensureConsent","computeConsentHash","loadCredentials","consentInputFromClient","execFileAsync","unsupportedNodeVersionMessage","installedRuntimeMatches","installRuntimePackages","assertFileExists","writeWrapper","writeRuntimeSidecar","isSupportedNodeVersion","readPackageJson","SKILL_FOLDER_NAME","HAVEN_SKILL_MD","HAVEN_SKILL_BODY_MD","signerCredentialReady","errorCode","createInterface","resolveTokenFromAddress","writeAgentTombstone","runDoctor","runRepair","realpathSync","fileURLToPath","pathToFileURL"],"mappings":"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","file":"cli.cjs","sourcesContent":["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","/**\n * MCP server-name pairs (#1695, epic #1694).\n *\n * One runtime config can hold several Haven agents, each as its own\n * hosted+signer MCP pair keyed by server name. The names are the wiring\n * contract every host depends on (server name = tool prefix), so:\n *\n * - The UNNAMED pair keeps today's exact names — bare `haven` /\n * `haven-signer`, and Codex's historical `haven_signer` table — because a\n * rename would break every currently-wired host (#1694 owner decision).\n * - A NAMED pair suffixes the slug: `haven-<slug>` / `haven-signer-<slug>`.\n * The slug is fixed at connect time and never changes (#1694: editable\n * display name, immutable wiring slug). #1696 wires the `--name` flag.\n *\n * Hermes stores each pair's API key in its dotenv file, so a named pair also\n * needs its own env key — two agents sharing `MCP_HAVEN_API_KEY` would both\n * authenticate as whichever setup ran last.\n */\n\nexport interface ServerNames {\n /** Hosted MCP entry name in JSON/YAML configs and the Claude Code registry. */\n hosted: string\n /** Signer entry name in JSON/YAML configs and the Claude Code registry. */\n signer: string\n /** Codex TOML table name for the hosted entry (`mcp_servers.<name>`). */\n codexHosted: string\n /** Codex TOML table name for the signer entry. */\n codexSigner: string\n /** Hermes dotenv key holding this pair's hosted API key. */\n hermesEnvKey: string\n}\n\n/**\n * Slug shape: lowercase alphanumerics and single hyphens, 1–32 chars. Strict\n * on purpose — the slug becomes a server name, a TOML bare key, part of an\n * env var, and a tool prefix, and it is immutable once wired.\n */\nconst SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nexport function assertValidServerSlug(slug: string): void {\n if (slug.length === 0 || slug.length > 32 || !SLUG_RE.test(slug)) {\n throw new Error(\n `Invalid server name ${JSON.stringify(slug)}: use 1-32 lowercase letters, digits, and single hyphens (e.g. \"research\").`,\n )\n }\n // Collision-freedom (#1695 review, blocking finding): every derived name\n // must be unique across ALL valid slugs and the bare pair, or \"a writer\n // touches only its own pair\" is false. The only cross-collisions the\n // haven-<slug> / haven-signer-<slug> scheme admits are:\n // hosted(A) === bare signer ⇔ A === 'signer'\n // hosted(A) === signer(B), A≠B ⇔ A === `signer-${B}`\n // (signer(A) === signer(B) and hosted(A) === hosted(B) already force A===B.)\n // Rejecting 'signer' and the 'signer-' prefix therefore closes the whole\n // family, not just the literal case — proven by the adversarial-pair test.\n // #1696: the bare pair's own names are refused as slugs outright — not a\n // collision ('haven' would yield 'haven-haven'), but an operator typing\n // --name haven means the bare pair, and silently minting a doubled name\n // would wire an agent nobody can find again.\n if (slug === 'haven' || slug === 'haven-signer') {\n throw new Error(\n `Invalid server name ${JSON.stringify(slug)}: \"haven\" and \"haven-signer\" are the unnamed pair's own names — omit --name for the bare pair.`,\n )\n }\n if (slug === 'signer' || slug.startsWith('signer-')) {\n throw new Error(\n `Invalid server name ${JSON.stringify(slug)}: \"signer\" and \"signer-*\" are reserved — ` +\n \"they would collide with another pair's haven-signer-* entry.\",\n )\n }\n}\n\nexport function serverNamesFor(slug?: string): ServerNames {\n if (slug === undefined) {\n return {\n hosted: 'haven',\n signer: 'haven-signer',\n // Historical Codex table names — every wired Codex host has these.\n codexHosted: 'haven',\n codexSigner: 'haven_signer',\n hermesEnvKey: 'MCP_HAVEN_API_KEY',\n }\n }\n assertValidServerSlug(slug)\n return {\n hosted: `haven-${slug}`,\n signer: `haven-signer-${slug}`,\n // Hyphens are valid TOML bare keys, so named Codex tables match the\n // JSON/YAML names instead of inheriting the legacy underscore.\n codexHosted: `haven-${slug}`,\n codexSigner: `haven-signer-${slug}`,\n hermesEnvKey: `MCP_HAVEN_${slug.toUpperCase().replace(/-/g, '_')}_API_KEY`,\n }\n}\n","import { MCP_VERSION, registeredToolNames } from '@haven_ai/mcp'\nimport { toolSchemas as signerToolSchemas } from '@haven_ai/signer'\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.29-alpha.0',\n signerPackage: '@haven_ai/signer',\n signerVersion: '0.1.29-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 /**\n * The signer MCP's tool surface, DERIVED from the pinned @haven_ai/signer\n * package (#1587) — same anti-drift rule as `requiredTools` above: a\n * literal list here would rot the first time the signer gains a tool.\n * The handshake probe requires all of them.\n */\n requiredSignerTools: Object.keys(signerToolSchemas) 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 { serverNamesFor, type ServerNames } from './server-names.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 * #1695: wiring slug for a NAMED server pair (haven-<slug> /\n * haven-signer-<slug>). Absent = the bare haven / haven-signer pair,\n * byte-identical to the pre-#1695 output. A writer only ever touches the\n * pair it owns, so named and unnamed pairs coexist in one config.\n */\n serverName?: string\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\n/**\n * #1719: the chosen client's config file EXISTS but Haven cannot read it.\n *\n * Distinct from a write failure on purpose. A write failure is a permissions\n * or disk problem and \"try again\" is reasonable advice; an unreadable config\n * is a file the user has to fix by hand, and re-running the connector will\n * fail identically forever until they do. Collapsing the two under\n * `runtime_config_write_failed` told the user to retry a thing that cannot\n * succeed.\n */\n/**\n * Mirrors `RERUN` in doctor.ts — the moving alpha tag, so the advice resolves\n * to a connector that has `--repair` regardless of what is cached locally.\n */\nconst REPAIR_COMMAND_PREFIX = 'npx @haven_ai/connect@alpha --doctor --repair --runtime'\n\nexport class UnreadableRuntimeConfigError extends Error {\n readonly configPath: string\n constructor(configPath: string, detail: string) {\n super(`${configPath} is not a config Haven can merge into (${detail})`)\n this.name = 'UnreadableRuntimeConfigError'\n this.configPath = configPath\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 names: ServerNames = serverNamesFor(),\n configPath?: string,\n): string {\n const config = existingJson?.trim() ? parseJsonObject(existingJson, configPath) : {}\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 [names.hosted]: hostedServer,\n [names.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 names: ServerNames = serverNamesFor(),\n configPath?: string,\n): string {\n if (!existingYaml?.trim()) {\n return renderHermesYaml({ [names.hosted]: hostedServer, [names.signer]: signerServer })\n }\n\n const doc = parseDocument(existingYaml, { keepSourceTokens: true })\n if (doc.errors.length > 0 || !isMap(doc.contents)) {\n // #1719: the same class as an unparseable JSON config — the file has to be\n // fixed by hand, so it must not be reported as a retryable write failure.\n // The YAML parser's own message is deliberately NOT included: it quotes the\n // offending source, which is a file that may hold another server's bearer\n // token (the #1719 sibling of the redaction rule this writer already keeps).\n throw new UnreadableRuntimeConfigError(configPath ?? 'the Hermes config', 'it is not 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 [names.hosted]: hostedServer,\n [names.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(\n existingEnv: string | null,\n apiKey: string,\n envKey: string = HERMES_API_KEY_ENV,\n): string {\n if (/[\\r\\n]/.test(apiKey)) throw new Error('Hermes API key must be a single line')\n\n const assignment = `${envKey}=${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, envKey)) {\n if (found) return []\n found = true\n return [assignment]\n }\n if (isAmbiguousHermesEnvLine(line, envKey)) {\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, envKey: string): boolean {\n return new RegExp(`^\\\\s*(?:export[ \\\\t]+)?${envKey}[ \\\\t]*=`).test(line)\n}\n\nfunction isAmbiguousHermesEnvLine(line: string, envKey: string): boolean {\n // The env keys are our own generated identifiers (no regex metacharacters),\n // so embedding them in a pattern is safe by construction.\n return new RegExp(`^\\\\s*(?:export[ \\\\t]+)?${envKey}\\\\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(\n existingToml: string,\n localMcpCommand: string,\n names: ServerNames = serverNamesFor(),\n): string {\n let next = removeTomlTableTree(\n removeTomlTableTree(existingToml, `mcp_servers.${names.codexHosted}`),\n `mcp_servers.${names.codexSigner}`,\n )\n next = next.trimEnd()\n const block = [\n `[mcp_servers.${names.codexHosted}]`,\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 names: ServerNames = serverNamesFor(),\n): string {\n let next = removeTomlTableTree(\n removeTomlTableTree(existingToml, `mcp_servers.${names.codexHosted}`),\n `mcp_servers.${names.codexSigner}`,\n )\n next = next.trimEnd()\n const block = [\n `[mcp_servers.${names.codexHosted}]`,\n `url = ${tomlString(hostedMcpUrl)}`,\n `http_headers = { \"Authorization\" = ${tomlString(`Bearer ${apiKey}`)} }`,\n '',\n `[mcp_servers.${names.codexSigner}]`,\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 serverNamesFor(input.serverName),\n target,\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 // #1719: the parse runs BEFORE the write, so an unreadable config leaves\n // the file untouched — no half-merged config, nothing to roll back. The\n // separate code exists so the message can say \"fix this file\" instead of\n // \"run setup again\", which would never succeed — this fires AFTER\n // registerSetup consumed the one-shot setup token, so the pasted command\n // now 409s at /resolve. `--repair` is the recovery that actually works:\n // it rewrites this exact config from the credentials already on disk,\n // needs no token, and mints no second agent (the #1688 orphaning a fresh\n // connection would cause).\n const unreadable = err instanceof UnreadableRuntimeConfigError\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: unreadable\n ? [\n `Could not update ${configTargetLabel(input.runtime)}: ${err.message}.`,\n `Nothing was written to ${err.configPath}. Fix the JSON there (or move the file aside), then run \\`${REPAIR_COMMAND_PREFIX} ${input.runtime}\\` to write the Haven entries from the credentials already stored on this machine. Do not re-run the setup command: its token is already used.`,\n ]\n : [`Could not update ${configTargetLabel(input.runtime)}: ${err instanceof Error ? err.message : String(err)}`],\n errorCode: unreadable ? 'runtime_config_unreadable' : '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 names = serverNamesFor(input.serverName)\n const hostedServer = {\n ...buildHostedServer(input.hostedMcpUrl, `\\${${names.hermesEnvKey}}`, 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 names,\n target,\n )\n const mergedEnv = mergeHermesEnv(existingEnv, input.apiKey, names.hermesEnvKey)\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 several long-lived Hermes processes are running (a gateway plus TUI workers), restart EVERY one: each loads its MCP wiring at startup, so a process started before this setup keeps using its old snapshot.',\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 const unreadable = err instanceof UnreadableRuntimeConfigError\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: unreadable\n ? [\n `Could not update Hermes Agent config: ${err.message}.`,\n `Nothing was written to ${err.configPath}. Fix the YAML there (or move the file aside), then run \\`${REPAIR_COMMAND_PREFIX} hermes\\` to write the Haven entries from the credentials already stored on this machine. Do not re-run the setup command: its token is already used.`,\n ]\n : [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: unreadable ? 'runtime_config_unreadable' : '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, serverNamesFor(input.serverName))\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(\n existing ?? '',\n input.hostedMcpUrl,\n input.apiKey,\n resolveSignerLaunchSpec(input),\n serverNamesFor(input.serverName),\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: 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, configPath?: string): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(value) as unknown\n } catch {\n // The parser's own message is deliberately dropped: V8's SyntaxError text\n // quotes the offending source, and this file may hold ANOTHER MCP server's\n // bearer token. The path plus \"not valid JSON\" is everything the user\n // needs, and nothing they must not see in a log.\n throw new UnreadableRuntimeConfigError(configPath ?? 'the runtime config', 'it is not valid JSON')\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new UnreadableRuntimeConfigError(configPath ?? 'the runtime config', 'the top level is not 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\n/**\n * #1589: the doctor needs to READ the config the writers write. One resolver,\n * next to the path functions themselves so a new runtime cannot be added\n * without the doctor seeing it (returns null for runtimes without a\n * file-based config this module owns, e.g. claude-code via the CLI).\n */\nexport function runtimeConfigPathFor(runtime: string, homeDir = homedir()): string | null {\n switch (runtime) {\n case 'cursor':\n return cursorConfigPath(homeDir)\n case 'codex-cli':\n case 'codex-desktop':\n return codexConfigPath(homeDir)\n case 'vscode':\n return vscodeConfigPath(homeDir)\n case 'vscode-insiders':\n return vscodeInsidersConfigPath(homeDir)\n case 'claude-desktop':\n return claudeDesktopConfigPath(homeDir)\n case 'hermes':\n return hermesConfigPath(homeDir)\n default:\n return null\n }\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 { 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\n/**\n * #1697: who does this API key actually authenticate as?\n *\n * The #1681 incident was only provable by hand: cross-checking the delegate\n * address a live session reported against the `signer.json` on disk, a check\n * nothing in the product performed. This is the knowable half — the doctor\n * still cannot see inside a running host, but it CAN prove that the stored\n * API key and the stored signing key belong to the same agent. The key read\n * here is the same one the hosted MCP entry carries, which is what makes the\n * comparison meaningful rather than incidental.\n *\n * Read-only: a GET of the agent's own identity, nothing else.\n */\nexport interface HostedIdentityProbeResult {\n status: HostedProbeStatus\n agentId?: string\n delegateAddress?: string\n}\n\nexport async function probeHostedAgentIdentity(\n apiKey: string,\n apiUrl: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<HostedIdentityProbeResult> {\n let response: Response\n try {\n response = await fetchWithTimeout(fetchImpl, `${apiUrl.replace(/\\/+$/, '')}/machine-payments/agent`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${apiKey}`, Accept: 'application/json' },\n })\n } catch {\n return { status: 'network_error' }\n }\n if (response.status === 401 || response.status === 403) return { status: 'unauthorized' }\n if (!response.ok) return { status: 'bad_response' }\n try {\n const payload = JSON.parse(await response.text()) as { id?: string; delegate_address?: string }\n if (typeof payload?.delegate_address !== 'string') return { status: 'bad_response' }\n return { status: 'ok', agentId: payload.id, delegateAddress: payload.delegate_address }\n } catch {\n return { status: 'bad_response' }\n }\n}\n\nexport type LocalMcpProbeStatus = 'ok' | 'timeout' | 'process_error' | 'bad_response' | 'missing_tools'\n\nexport interface LocalMcpProbeResult {\n status: LocalMcpProbeStatus\n /** #1589: the initialize response's serverInfo/capabilities, when reached —\n * the doctor reports the signer's advertised compat versions from here\n * instead of a second probe call. */\n serverInfo?: { name?: string; version?: string }\n capabilities?: Record<string, unknown>\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 let serverInfo: { name?: string; version?: string } | undefined\n let capabilities: Record<string, unknown> | undefined\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 const init = payload.result as\n | { serverInfo?: { name?: string; version?: string }; capabilities?: Record<string, unknown> }\n | undefined\n serverInfo = init?.serverInfo\n capabilities = init?.capabilities\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, serverInfo, capabilities })\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 { 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 /** #1696: wiring slug, recorded in the sidecar for per-agent inventory (#1697). */\n serverName?: 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 /** Heartbeats during the (possibly minutes-long) npm install (#1586). */\n onProgress?: (message: string) => void\n}\n\n/**\n * Honest budget for a COLD-cache install over a slow link (#1586). The old\n * 120s budget was exactly what broke the 2026-08-18 Codex Desktop setup: a\n * 6+ minute cold install was killed at 2 minutes, the failure fell back to\n * npx silently, and the resulting config structurally could not start.\n */\nexport const SIGNER_INSTALL_TIMEOUT_MS = 600_000\n\n/** How often the console hears from a long install instead of going silent. */\nexport const SIGNER_INSTALL_HEARTBEAT_MS = 15_000\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)\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 serverName: input.serverName,\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 deps: SignerRuntimeDeps,\n): Promise<void> {\n const { runCommand, onProgress } = deps\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 // Heartbeat while npm works: a cold install can legitimately take\n // minutes, and a silent console reads as a hang (#1586).\n const startedAt = Date.now()\n const heartbeat = setInterval(() => {\n const seconds = Math.round((Date.now() - startedAt) / 1000)\n onProgress?.(`Still installing the local Haven signer runtime… (${seconds}s — a cold cache can take several minutes)`)\n }, SIGNER_INSTALL_HEARTBEAT_MS)\n heartbeat.unref?.()\n try {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: SIGNER_INSTALL_TIMEOUT_MS, maxBuffer: 1024 * 1024 })\n } finally {\n clearInterval(heartbeat)\n }\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\nexport async 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\n/** The sidecar `prepareSignerRuntime` writes next to the credentials (#1589). */\nexport interface SignerRuntimeSidecar {\n /** #1696: present when this credential dir belongs to a NAMED pair. */\n server_name?: string\n signer_package: string\n signer_version: string\n sdk_package: string\n sdk_version: string\n wrapper_path: string\n runtime_directory: string\n npm_cache_directory: string\n cli_path: string\n}\n\nexport async function readRuntimeSidecar(credentialDirectory: string): Promise<SignerRuntimeSidecar | null> {\n try {\n return JSON.parse(\n await readFile(join(credentialDirectory, 'signer-runtime.json'), 'utf8'),\n ) as SignerRuntimeSidecar\n } catch {\n return null\n }\n}\n\nasync function writeRuntimeSidecar(input: {\n path: string\n wrapperPath: string\n runtimeDirectory: string\n npmCacheDirectory: string\n cliPath: string\n serverName?: string\n}): Promise<void> {\n const value = {\n ...(input.serverName ? { server_name: input.serverName } : {}),\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","/**\n * The connector's machine-readable failure vocabulary (#1719).\n *\n * Before this, a refusal was a bare `throw new Error(...)` and the automation\n * contract recovered a code by regex-matching the message in\n * `failedConnectOutcome`. That works only for as long as nobody rewords a\n * sentence, and it gives the caller nothing to branch on that the wording did\n * not accidentally provide. Every refusal this module fronts carries:\n *\n * - `code` — stable, snake_case, safe to switch on;\n * - `nextAction` — the one thing to do next, in the same snake_case shape the\n * install-status contract already uses for `next_action`;\n * - `message` — human/agent prose, still the thing printed to a terminal.\n *\n * Codes are additive and never renamed: a consumer pinned to an older\n * connector must keep recognising the ones it already knows.\n */\nexport class ConnectError extends Error {\n readonly code: string\n readonly nextAction: string\n\n constructor(code: string, message: string, nextAction: string) {\n super(message)\n this.name = 'ConnectError'\n this.code = code\n this.nextAction = nextAction\n }\n}\n\nexport function isConnectError(err: unknown): err is ConnectError {\n return err instanceof ConnectError\n}\n","import { ConnectError } from './connect-error.js'\n\nexport 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 // #1682: Cowork runs Claude Code's config, so it resolves to the same\n // profile. The dashboard's command carries no --runtime for it (it is a\n // detected, command-path runtime), but an explicit `--runtime cowork` typed\n // by hand must not fall through to the no-runtime refusal.\n cowork: '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 // #1682: OpenClaw is a SNIPPET target — the user pastes an mcpServers entry\n // into ~/.openclaw/openclaw.json and restarts the gateway. That is exactly\n // the 'other' profile's behaviour (credentials written to disk, no config\n // auto-written, manual finish), so it resolves there rather than earning a\n // profile whose only distinguishing feature would be its label.\n openclaw: 'other',\n 'open-claw': 'other',\n 'open_claw': 'other',\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\n/** The flag values a refusal message should offer. Mirrors RuntimeId. */\nexport const RUNTIME_FLAG_VALUES =\n 'claude-code, codex-cli, codex-desktop, cursor, vscode, vscode-insiders, claude-desktop, hermes, other' as const\n\nexport interface RuntimeSelection {\n runtime: RuntimeId | null\n source: 'force' | 'detected' | 'explicit' | 'prompted' | 'none'\n /** Set when a confident environment detection overrode a contradicting explicit hint (#1672). */\n overrodeHint?: RuntimeId\n /** Set when a supplied hint was not a runtime name at all and detection carried the run (#1719). */\n discardedHint?: string\n}\n\nexport interface RuntimeResolutionOptions {\n env?: NodeJS.ProcessEnv\n /**\n * Rung 3b (#1719): the harness an AGENT executing this command reported for\n * ITSELF, when detection found nothing to go on.\n *\n * It deliberately enters at the same precedence as `--runtime`, which is\n * what makes it safe: a hint can only ever fill a vacuum, and loses to a\n * confident detection exactly as #1672 made it. In practice the agent\n * supplies it BY re-running with `--runtime <name>`; this field exists so a\n * programmatic caller can pass a self-report without pretending to be a\n * command-line flag, and so the ladder names the rung it has.\n */\n selfReported?: string\n /**\n * Rung 4 (#1719): ask a human at an interactive terminal which of the\n * clients installed on this machine to configure. Injected as a thunk so\n * the ladder stays a policy function — the scan, the readline prompt, and\n * the \"nothing writable is installed\" refusal all live in\n * `installed-clients.ts`. Omitted (`--json`, no TTY, library callers) means\n * the rung is skipped entirely, not answered with a guess.\n */\n promptForRuntime?: () => Promise<RuntimeId>\n}\n\n/**\n * Runtime resolution, detection-first (#1672) and self-resolving (#1719).\n *\n * The setup command carries no `--runtime`; the connector works out the\n * runtime it is executing inside. Precedence:\n *\n * 1. `--runtime-force <name>` — always wins (unknown name refuses).\n * 2. Environment detection over a CONTRADICTING hint. Detection only fires\n * inside a real agent shell, where writing a different client's config is\n * almost surely wrong — the claude-desktop-hint-in-Claude-Code dead end\n * this exists to close.\n * 3. An explicit `--runtime`, or an agent's self-report, with no contradicting\n * detection (the legit plain-terminal \"configure Claude Desktop by hand\"\n * case — unchanged).\n * 4. Detection alone.\n * 5. An interactive pick among the clients actually installed here, when a\n * human is at a TTY. The scan populates the choices; it never selects.\n * 6. Nothing known → `runtime: null`; the caller refuses BEFORE side effects\n * rather than guessing a config location.\n *\n * A hint that is not a runtime name at all is not a hint — it is a mistake, and\n * the one thing it must never do is fall through to a config location nobody\n * asked for. With no detection to fall back on it refuses (`runtime_unrecognized`).\n * With a detection it loses to it, loudly, exactly like a contradicting hint:\n * the detected client is the right write either way, and refusing there would\n * turn every rollout window in which the dashboard learns an id before the\n * published connector does into a hard failure.\n */\nexport async function resolveRuntimeSelection(\n explicit: string | undefined,\n force: string | undefined,\n options: RuntimeResolutionOptions = {},\n): Promise<RuntimeSelection> {\n const env = options.env ?? process.env\n if (force !== undefined) {\n const forced = normalizeRuntimeName(force)\n if (!forced) {\n throw new ConnectError(\n 'runtime_force_unrecognized',\n `Unknown --runtime-force value \"${force}\". Valid values: ${RUNTIME_FLAG_VALUES}.`,\n 'rerun_connect_with_a_valid_runtime_name',\n )\n }\n return { runtime: forced, source: 'force' }\n }\n const detected = detectRuntime(env)\n const supplied = explicit?.trim() || options.selfReported?.trim() || undefined\n const hint = normalizeRuntimeName(supplied)\n if (supplied && !hint) {\n if (!detected) {\n throw new ConnectError(\n 'runtime_unrecognized',\n `\"${supplied}\" is not an agent runtime Haven knows. Valid values: ${RUNTIME_FLAG_VALUES} ` +\n '(the aliases cowork, codex and openclaw are accepted too). ' +\n 'Re-run with one of those, or --runtime other to store credentials and finish the MCP setup by hand. ' +\n 'Nothing was written and the Haven setup token is still unused.',\n 'rerun_connect_with_a_valid_runtime_name',\n )\n }\n return { runtime: detected, source: 'detected', discardedHint: supplied }\n }\n if (detected && hint && detected !== hint) {\n return { runtime: detected, source: 'detected', overrodeHint: hint }\n }\n if (hint) return { runtime: hint, source: 'explicit' }\n if (detected) return { runtime: detected, source: 'detected' }\n if (options.promptForRuntime) {\n return { runtime: await options.promptForRuntime(), source: 'prompted' }\n }\n return { runtime: null, source: 'none' }\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","/**\n * Agent-directory tombstones (#1681) — for the RECREATION case, where an old\n * directory is abandoned. (#1700's --rekey deliberately writes no tombstone:\n * it rewrites credentials in place at a stable path, so no dead path exists —\n * owner decision on epic #1694, 2026-08-21.)\n *\n * A long-lived MCP host loads its wiring snapshot once, at process start.\n * When an agent is recreated and its old directory is later removed, every\n * such host keeps spawning the OLD wrapper path — and the spawn fails with a\n * FileNotFoundError the host masks as \"Connection closed\", parked and\n * re-probed every five minutes, indefinitely. The field report behind this\n * counted 5,356 occurrences of one dead UUID, and TWO different long-lived\n * processes each parked on a DIFFERENT dead UUID, because each holds the\n * snapshot from its own start time.\n *\n * A tombstone replaces the wrapper with a script that tells the truth: which\n * agent this was, when and why it was retired, and that THIS host must be\n * restarted. The park loop does not disappear — nothing local can reach into\n * a running host's memory — but every five-minute probe now logs the\n * diagnosis instead of a masked symptom, in exactly the stderr log where the\n * original investigation had to dig it out by hand.\n *\n * What a tombstone deliberately does NOT do:\n * - It never touches key material. identity.json / signer.json are left\n * exactly as found — connect never revokes and never deletes credentials\n * (#1688's standing rule). A retirement flow that wants the keys gone\n * deletes them itself, and the tombstone survives to keep the path honest.\n * - It does not try to speak MCP. A well-formed JSON-RPC error needs the\n * request id, which means reading stdin and racing client timeouts; a\n * fast, loud stderr exit lands in the host's MCP stderr log — the place\n * the #1681 forensics actually looked — on every probe, with no protocol\n * to get subtly wrong.\n */\n\nimport { chmod, mkdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { redactSecrets } from './redact.js'\n\nexport const TOMBSTONE_FILENAME = 'TOMBSTONE.json'\n\nexport interface TombstoneInfo {\n agent_id: string\n retired_at: string\n reason: string\n replaced_by?: string\n}\n\nexport interface WriteTombstoneInput {\n /** The agent credential directory being retired. */\n directory: string\n agentId: string\n /** Why the directory was retired — rendered verbatim in the diagnosis. */\n reason: string\n /** The agent that superseded this one, when there is one. */\n replacedBy?: string\n /** Injectable for tests; defaults to now. */\n retiredAt?: string\n}\n\n/** The marker string hosts and humans can grep their MCP stderr logs for. */\nexport const TOMBSTONE_MARKER = 'HAVEN-TOMBSTONE'\n\nfunction tombstoneScript(info: TombstoneInfo): string {\n const lines = [\n `${TOMBSTONE_MARKER}: this Haven agent was retired.`,\n '',\n ` agent: ${info.agent_id}`,\n ` retired at: ${info.retired_at}`,\n ` reason: ${info.reason}`,\n ...(info.replaced_by ? [` replaced by: ${info.replaced_by}`] : []),\n '',\n 'This process is running with a wiring snapshot that predates the',\n 'retirement — it loaded its MCP config at startup and has kept it since.',\n 'Restart THIS host to pick up the current wiring. If several long-lived',\n 'hosts are running (a gateway, a TUI worker, an editor), restart EVERY',\n 'one of them: each holds the snapshot from its own start time, so after',\n 'a chain of recreations each can be parked on a DIFFERENT old agent.',\n '',\n 'Then verify with: npx @haven_ai/connect@alpha --doctor --runtime <runtime>',\n ]\n // Fully self-contained: no imports, no reads — a tombstone that could\n // itself fail to start would recreate the exact masking it exists to end.\n return [\n '#!/usr/bin/env node',\n `// ${TOMBSTONE_MARKER} — written by @haven_ai/connect (#1681). Safe to delete`,\n '// once every long-lived MCP host on this machine has been restarted.',\n `process.stderr.write(${JSON.stringify(lines.join('\\n') + '\\n')})`,\n 'process.exit(1)',\n '',\n ].join('\\n')\n}\n\n/**\n * Replace the directory's signer wrapper with a tombstone and record the\n * retirement in TOMBSTONE.json. Key files are not touched. Idempotent — a\n * re-run overwrites the tombstone with the same content shape.\n */\nexport async function writeAgentTombstone(input: WriteTombstoneInput): Promise<TombstoneInfo> {\n // The directory must already exist: a mistyped path would otherwise be\n // silently created and reported as a successful retirement. (#1681 review)\n const dirStat = await stat(input.directory).catch(() => null)\n if (!dirStat?.isDirectory()) {\n throw new Error(`Not a directory: ${input.directory} — nothing to tombstone.`)\n }\n const info: TombstoneInfo = {\n // reason / replaced_by are persisted to disk and re-emitted to the host's\n // MCP stderr log on EVERY stale probe, potentially for months — redact\n // like every other output path, at the write layer so any future caller\n // inherits it. (#1681 review, finding 1)\n agent_id: input.agentId,\n retired_at: input.retiredAt ?? new Date().toISOString(),\n reason: redactSecrets(input.reason),\n ...(input.replacedBy ? { replaced_by: redactSecrets(input.replacedBy) } : {}),\n }\n const binDir = join(input.directory, 'bin')\n await mkdir(binDir, { recursive: true })\n const wrapperPath = join(binDir, 'haven-signer.mjs')\n await writeFile(wrapperPath, tombstoneScript(info), 'utf8')\n await chmod(wrapperPath, 0o755)\n await writeFile(join(input.directory, TOMBSTONE_FILENAME), JSON.stringify(info, null, 2) + '\\n', 'utf8')\n return info\n}\n\n/** The tombstone record for a directory, or null when it is not tombstoned. */\nexport async function readAgentTombstone(directory: string): Promise<TombstoneInfo | null> {\n try {\n const parsed = JSON.parse(await readFile(join(directory, TOMBSTONE_FILENAME), 'utf8')) as TombstoneInfo\n if (typeof parsed?.agent_id !== 'string') return null\n return parsed\n } catch {\n return null\n }\n}\n","/**\n * `--doctor` / `--repair` (#1589, epic #1585) — end-to-end setup diagnosis\n * without hand-building an MCP stdio client, which is what the 2026-08-18\n * external Codex Desktop tester was reduced to.\n *\n * Doctor is READ-ONLY (its one spawn is the same read-only tools/list\n * handshake setup itself uses) and secret-free: checks report names, paths,\n * versions and verdicts — never the api key or any key material. Repair\n * re-runs the pieces setup already owns — reinstall the pinned signer\n * runtime, rewrite wrapper + sidecar, re-write the runtime config from the\n * STORED identity — and never touches credentials or needs a new setup token.\n *\n * Design notes carried in from #1587's review:\n * - the signer probe reports the initialize payload, so compat versions come\n * from the SAME handshake (no second probe);\n * - a probe against an un-acknowledged consent gate exits 1 — the doctor\n * reports that as \"consent missing\" with the ack re-run as the repair,\n * never as \"signer broken\".\n */\n\nimport { readFile, readdir, stat } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join } from 'node:path'\nimport { MCP_RUNTIME_MANIFEST } from './runtime-manifest.js'\nimport {\n probeHostedAgentIdentity,\n probeHostedMcpTools,\n probeLocalMcpTools,\n type LocalMcpProbeResult,\n} from './probes.js'\nimport {\n installedRuntimeMatches,\n prepareSignerRuntime,\n readRuntimeSidecar,\n type SignerRuntimeSidecar,\n} from './signer-runtime.js'\nimport { runtimeConfigPathFor, writeRuntimeConfig } from './config-writers.js'\nimport { restartRequiredForRuntime, type RuntimeId } from './runtime-registry.js'\nimport { getLocalSignerConsentStatus } from './signer-consent.js'\nimport { TOMBSTONE_FILENAME, readAgentTombstone } from './tombstone.js'\nimport { serverNamesFor, type ServerNames } from './server-names.js'\nimport { shortAddress } from './redact.js'\n\nexport interface DoctorCheck {\n id: string\n label: string\n ok: boolean\n /** Human detail — never secret material. */\n detail: string\n /** One concrete action, present exactly when the check fails. */\n repair?: string\n}\n\nexport interface DoctorReport {\n version: 1\n ok: boolean\n runtime: string\n credentialDirectory?: string\n checks: DoctorCheck[]\n /** #1697: one entry per credential directory found on this machine. */\n agents: AgentInventoryEntry[]\n /** Signer compat surface from the live handshake, when it succeeded. */\n signerCapabilities?: Record<string, unknown>\n}\n\nexport interface DoctorDeps {\n homeDir?: string\n fetch?: typeof fetch\n probeSignerTools?: typeof probeLocalMcpTools\n probeHosted?: typeof probeHostedMcpTools\n probeHostedIdentity?: typeof probeHostedAgentIdentity\n runCommand?: (command: string, args: string[]) => Promise<void>\n env?: NodeJS.ProcessEnv\n}\n\ninterface IdentityFile {\n api_key?: string\n agent_id?: string\n api_url?: string\n hosted_mcp_url?: string\n}\n\nconst RERUN = 'npx @haven_ai/connect@alpha'\n\n/**\n * Newest agent directory that holds an identity.json, plus every OTHER such\n * directory (#1688). The others used to be a cosmetic note (\"N dirs found;\n * examining the newest\") — which downgraded the exact fact that matters: a\n * re-run mints a fresh agent and retires nothing, so a directory this doctor\n * did NOT select can hold a key that still authenticates and still spends.\n * The superseded_agents check now owns that fact; the note is gone.\n */\nasync function discoverCredentialDirectory(\n homeDir: string,\n explicit?: string,\n): Promise<{ directory?: string; others: string[] }> {\n // An explicit --credentials-dir names the agent DIRECTORY itself, so its\n // siblings live in its parent — never in the default root. Scanning the\n // default root under an explicit override would live-probe real keys in a\n // location the caller explicitly pointed away from (#1688 review, B2).\n const root = explicit ? dirname(explicit) : join(homeDir, '.haven', 'agents')\n let entries: string[] = []\n try {\n entries = await readdir(root)\n } catch {\n return explicit ? { directory: explicit, others: [] } : { others: [] }\n }\n const candidates: Array<{ directory: string; mtimeMs: number }> = []\n // #1681: a directory whose keys were removed but that carries TOMBSTONE.json\n // is a deliberately retired agent — reportable in the superseded scan, but\n // never selectable as the active credential directory.\n const tombstonedOnly: string[] = []\n for (const entry of entries) {\n const directory = join(root, entry)\n try {\n const s = await stat(join(directory, 'identity.json'))\n candidates.push({ directory, mtimeMs: s.mtimeMs })\n } catch {\n try {\n await stat(join(directory, TOMBSTONE_FILENAME))\n tombstonedOnly.push(directory)\n } catch {\n // not an agent credential dir\n }\n }\n }\n candidates.sort((a, b) => b.mtimeMs - a.mtimeMs)\n if (explicit) {\n return {\n directory: explicit,\n others: [...candidates.map((c) => c.directory), ...tombstonedOnly].filter((d) => d !== explicit),\n }\n }\n if (candidates.length === 0 && tombstonedOnly.length === 0) return { others: [] }\n return {\n directory: candidates[0]?.directory,\n others: [...candidates.slice(1).map((c) => c.directory), ...tombstonedOnly],\n }\n}\n\n/**\n * #1697: one entry per credential directory on this machine.\n *\n * \"Newest wins\" was a single-agent heuristic: it named one directory the real\n * one and demoted the rest to a note. Multi-agent (#1696) makes several\n * agents legitimately live at once, so the doctor enumerates instead of\n * choosing, and says which of four things each directory IS.\n */\nexport type AgentClassification = 'wired' | 'superseded' | 'retired' | 'orphaned'\n\nexport interface AgentInventoryEntry {\n /** Wiring slug (#1696); absent for the bare haven / haven-signer pair. */\n slug?: string\n agentId?: string\n directory: string\n classification: AgentClassification\n /** Per-agent checks — empty for entries that are not wired. */\n checks: DoctorCheck[]\n}\n\n/**\n * Is this agent's MCP pair actually present in the runtime's config?\n *\n * The answer depends on whether the pair is NAMED, because only a named pair\n * has a name of its own:\n * - NAMED (#1696): its entry name is unique, so the name in the config text\n * settles it.\n * - UNNAMED: every unnamed agent claims the same bare `haven` /\n * `haven-signer` names, so the name proves nothing — exactly one of them\n * can be wired, and the tell is which signer wrapper path the config\n * actually references.\n * - No readable config at all (Claude Code is CLI-managed, or the file is\n * missing): this module cannot tell. Guessing \"orphaned\" would accuse every\n * agent on the most common runtime, so it falls back to the pre-#1697\n * heuristic — the selected directory is wired, the rest are not — which is\n * the honest degradation rather than a fabricated verdict.\n */\nfunction agentIsWired(\n configText: string | null,\n names: ServerNames,\n slug: string | undefined,\n identity: IdentityFile | undefined,\n sidecar: SignerRuntimeSidecar | null,\n isPrimary: boolean,\n bareOwnerExists: boolean,\n): boolean {\n if (configText === null) return isPrimary\n if (slug) {\n // Match the NAME with a boundary so `haven-ops` cannot match\n // `haven-ops-2` and `haven` cannot match `haven-ops`.\n for (const name of [names.hosted, names.codexHosted, names.signer, names.codexSigner]) {\n if (new RegExp(`(^|[.\"'\\\\s\\\\[])${name}([\"'\\\\]:\\\\s]|$)`, 'm').test(configText)) return true\n }\n return false\n }\n if (sidecar?.wrapper_path && configText.includes(sidecar.wrapper_path)) return true\n // #1697 review, finding 2: a sidecar whose wrapper is NOT referenced is not\n // proof of the opposite. A config still on the retired npx launch form\n // (which the runtime_config check flags separately) names no wrapper at\n // all, and condemning that directory as superseded would tell the user to\n // revoke their only working agent. Fall through to the same ownership\n // reasoning the sidecar-less case uses.\n // No proof of ownership of the bare\n // pair. If some OTHER directory's wrapper is the one the config launches,\n // the bare pair is already owned and this one is not wired — even when it\n // is the newest. Only when nothing owns the bare pair does the pre-#1697\n // heuristic apply.\n if (bareOwnerExists) return false\n return isPrimary && Boolean(identity?.hosted_mcp_url && configText.includes(identity.hosted_mcp_url))\n}\n\nasync function readIdentity(directory: string): Promise<IdentityFile | undefined> {\n try {\n return JSON.parse(await readFile(join(directory, 'identity.json'), 'utf8')) as IdentityFile\n } catch {\n return undefined\n }\n}\n\n/** Every per-agent check for ONE credential directory. */\nasync function checksForAgent(\n entry: { directory: string; identity?: IdentityFile; sidecar: SignerRuntimeSidecar | null },\n input: { runtime: string },\n deps: DoctorDeps,\n): Promise<{ checks: DoctorCheck[]; signerCapabilities?: Record<string, unknown> }> {\n const { directory, identity, sidecar } = entry\n const checks: DoctorCheck[] = []\n let signerCapabilities: Record<string, unknown> | undefined\n\n // ── Credentials ───────────────────────────────────────────────────────────\n let signerFile: Record<string, unknown> | undefined\n try {\n const parsed = JSON.parse(await readFile(join(directory, 'signer.json'), 'utf8')) as Record<string, unknown>\n signerFile = typeof parsed === 'object' && parsed !== null ? parsed : undefined\n } catch {\n signerFile = undefined\n }\n const credentialsOk = Boolean(identity?.api_key) && signerFile !== undefined\n checks.push({\n id: 'credentials',\n label: 'Agent credentials',\n ok: credentialsOk,\n detail: credentialsOk\n ? `identity.json and signer.json parse (agent ${identity?.agent_id ?? 'unknown'})`\n : 'identity.json or signer.json is missing or unparseable.',\n ...(credentialsOk ? {} : { repair: `Re-run the full setup with a fresh token: ${RERUN} --setup <token>.` }),\n })\n\n // ── Signer runtime install ────────────────────────────────────────────────\n if (!sidecar) {\n checks.push({\n id: 'signer_runtime',\n label: 'Signer runtime (preinstalled wrapper)',\n ok: false,\n detail: 'No signer-runtime.json sidecar — the pinned signer runtime was never prepared (or a pre-#1586 npx config).',\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n } else {\n const matches = await installedRuntimeMatches(sidecar.runtime_directory, sidecar.cli_path)\n const versionOk = sidecar.signer_version === MCP_RUNTIME_MANIFEST.signerVersion\n const ok = matches && versionOk\n checks.push({\n id: 'signer_runtime',\n label: 'Signer runtime (preinstalled wrapper)',\n ok,\n detail: ok\n ? `Installed ${sidecar.signer_package}@${sidecar.signer_version} at ${sidecar.runtime_directory}`\n : matches\n ? `Installed version ${sidecar.signer_version} does not match the connector's pinned ${MCP_RUNTIME_MANIFEST.signerVersion}.`\n : `Runtime directory is stale or empty (${sidecar.runtime_directory}) — the CLI or package versions are missing.`,\n ...(ok ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n\n // ── Hosted MCP ────────────────────────────────────────────────────────────\n const hostedUrl = identity?.hosted_mcp_url ?? (identity?.api_url ? `${identity.api_url}/mcp` : undefined)\n if (identity?.api_key && hostedUrl) {\n const probe = await (deps.probeHosted ?? probeHostedMcpTools)(identity.api_key, hostedUrl, deps.fetch)\n checks.push({\n id: 'hosted_mcp',\n label: 'Hosted Haven MCP',\n ok: probe.status === 'ok',\n detail: probe.status === 'ok'\n ? `Reachable and authorized (${hostedUrl}).`\n : `Probe failed: ${probe.status} (${hostedUrl}).`,\n ...(probe.status === 'ok'\n ? {}\n : {\n repair: probe.status === 'unauthorized'\n ? `The stored API key was rejected — re-run the full setup with a fresh token: ${RERUN} --setup <token>.`\n : 'Check network access to the hosted MCP URL, then re-run --doctor.',\n }),\n })\n } else {\n checks.push({\n id: 'hosted_mcp',\n label: 'Hosted Haven MCP',\n ok: false,\n detail: 'No stored API key / hosted MCP URL to probe with.',\n repair: `Re-run the full setup: ${RERUN} --setup <token>.`,\n })\n }\n\n // ── Hosted-vs-local identity (#1697) ──────────────────────────────────────\n // The #1681 incident, made mechanical: the API key and the signing key must\n // belong to the SAME agent. A mismatch means the runtime would quote as one\n // agent and sign as another — the exact shape #1690 refuses at signing time.\n // This proves the on-disk pair is self-consistent, which is the half a local\n // tool can know; it still cannot see inside an already-running host.\n const localDelegate = typeof signerFile?.delegate_address === 'string'\n ? (signerFile.delegate_address as string)\n : undefined\n if (identity?.api_key && identity.api_url) {\n const probe = await (deps.probeHostedIdentity ?? probeHostedAgentIdentity)(\n identity.api_key, identity.api_url, deps.fetch,\n )\n if (probe.status !== 'ok') {\n // #1697 review, finding 1: an unperformable comparison is NOT a pass.\n // Saying \"skipped, not passed\" in the text while setting ok:true is the\n // same green-check-proving-nothing defect this check exists to remove —\n // and worse here, because a real key mismatch that coincides with a\n // network blip would sail through. `hosted_mcp` already fails on\n // network_error; identity_match matches it rather than contradicting it.\n checks.push({\n id: 'identity_match',\n label: 'Hosted identity matches the local signing key',\n ok: false,\n detail: probe.status === 'unauthorized'\n ? 'The stored API key was rejected, so the agent it authenticates as cannot be compared with the local signing key.'\n : `Could not read the hosted identity (${probe.status}) — the comparison did not happen, so it cannot be reported as a match.`,\n repair: probe.status === 'unauthorized'\n ? `Re-run the full setup with a fresh token: ${RERUN} --setup <token>.`\n : `Restore network access to the Haven API, then re-run: ${RERUN} --doctor --runtime ${input.runtime}`,\n })\n } else if (!localDelegate) {\n checks.push({\n id: 'identity_match',\n label: 'Hosted identity matches the local signing key',\n ok: false,\n detail: 'signer.json holds no delegate_address to compare against the hosted identity.',\n repair: `Re-run the full setup with a fresh token: ${RERUN} --setup <token>.`,\n })\n } else {\n const same = probe.delegateAddress?.toLowerCase() === localDelegate.toLowerCase()\n checks.push({\n id: 'identity_match',\n label: 'Hosted identity matches the local signing key',\n ok: same,\n detail: same\n ? `The stored API key authenticates as the agent whose signing key is in this directory (${shortAddress(localDelegate)}).`\n : `MISMATCH: the stored API key authenticates as agent ${probe.agentId ?? 'unknown'} with delegate ` +\n `${shortAddress(probe.delegateAddress ?? 'unknown')}, but signer.json here holds ${shortAddress(localDelegate)}. ` +\n 'This runtime would quote as one agent and sign as another.',\n ...(same\n ? {}\n : {\n repair: 'Re-run setup for this agent so its API key and signing key come from one run: ' +\n `${RERUN} --setup <token>. Do not hand-edit either file.`,\n }),\n })\n }\n }\n\n // ── Signer stdio handshake ────────────────────────────────────────────────\n if (sidecar) {\n const consent = await getLocalSignerConsentStatus(join(directory, 'signer.json'))\n if (!consent.acknowledged) {\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: false,\n detail: 'The local-tools consent is not acknowledged, so the signer refuses to start (by design).',\n repair: `Run: ${RERUN} --ack-local-tools --setup <token> (or re-run your original setup command with --ack-local-tools).`,\n })\n } else {\n const probe: LocalMcpProbeResult = await (deps.probeSignerTools ?? probeLocalMcpTools)(\n sidecar.wrapper_path,\n [],\n MCP_RUNTIME_MANIFEST.requiredSignerTools,\n )\n const experimental = (probe.capabilities?.experimental ?? probe.capabilities) as\n | Record<string, unknown>\n | undefined\n const compat = experimental?.['haven/signer-compatibility'] as Record<string, unknown> | undefined\n signerCapabilities = compat ? { 'haven/signer-compatibility': compat } : undefined\n const compatDetail = compat\n ? ` Compat: x402 expected-context v${JSON.stringify((compat as { x402_expected_context_versions?: unknown }).x402_expected_context_versions ?? '?')}.`\n : ''\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: probe.status === 'ok',\n detail: probe.status === 'ok'\n ? `Signer started, listed ${probe.toolNames?.length ?? 0} tools${probe.serverInfo?.version ? ` (v${probe.serverInfo.version})` : ''}.${compatDetail}`\n : `Handshake failed: ${probe.status}.`,\n ...(probe.status === 'ok' ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n } else {\n checks.push({\n id: 'signer_process',\n label: 'Signer stdio handshake',\n ok: false,\n detail: 'Skipped — no prepared signer runtime to probe.',\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n }\n\n return { checks, ...(signerCapabilities ? { signerCapabilities } : {}) }\n}\n\nexport async function runDoctor(\n input: { runtime: string; credentialsDir?: string },\n deps: DoctorDeps = {},\n): Promise<DoctorReport> {\n const homeDir = deps.homeDir ?? homedir()\n const checks: DoctorCheck[] = []\n let signerCapabilities: Record<string, unknown> | undefined\n\n const { directory, others } = await discoverCredentialDirectory(homeDir, input.credentialsDir)\n\n // ── Runtime config (read once; every agent's wiring is judged against it) ─\n const configPath = runtimeConfigPathFor(input.runtime, homeDir)\n let configText: string | null = null\n if (configPath !== null) {\n try {\n configText = await readFile(configPath, 'utf8')\n } catch {\n configText = null\n }\n }\n\n // ── Inventory ─────────────────────────────────────────────────────────────\n const allDirectories = directory ? [directory, ...others] : others\n // Which directory (if any) owns the BARE haven / haven-signer pair? The\n // config launches exactly one signer wrapper for it, and that path is the\n // only unambiguous tell — the bare NAMES are claimed by every unnamed\n // agent, so they identify nobody.\n let bareOwnerExists = false\n for (const dir of allDirectories) {\n const sidecar = await readRuntimeSidecar(dir)\n if (!sidecar?.server_name && sidecar?.wrapper_path && configText?.includes(sidecar.wrapper_path)) {\n bareOwnerExists = true\n break\n }\n }\n const inventory: AgentInventoryEntry[] = []\n const capabilitiesByDirectory = new Map<string, Record<string, unknown> | undefined>()\n const primaryChecksById = new Map<string, DoctorCheck>()\n for (const dir of allDirectories) {\n const identity = await readIdentity(dir)\n const sidecar = await readRuntimeSidecar(dir)\n const tombstone = await readAgentTombstone(dir)\n const slug = sidecar?.server_name\n const names = serverNamesFor(slug)\n if (!identity?.api_key) {\n inventory.push({\n ...(slug ? { slug } : {}),\n ...(tombstone?.agent_id ? { agentId: tombstone.agent_id } : {}),\n directory: dir,\n classification: tombstone ? 'retired' : 'orphaned',\n checks: [],\n })\n continue\n }\n const wired = agentIsWired(configText, names, slug, identity, sidecar, dir === directory, bareOwnerExists)\n const entry: AgentInventoryEntry = {\n ...(slug ? { slug } : {}),\n ...(identity.agent_id ? { agentId: identity.agent_id } : {}),\n directory: dir,\n classification: wired ? 'wired' : 'superseded',\n checks: [],\n }\n if (wired) {\n const result = await checksForAgent({ directory: dir, identity, sidecar }, input, deps)\n entry.checks = result.checks\n capabilitiesByDirectory.set(dir, result.signerCapabilities)\n }\n inventory.push(entry)\n }\n\n // Which agent does the flat `checks` array describe? An explicitly given\n // --credentials-dir always wins. Otherwise it is the first WIRED agent —\n // not merely the newest directory, because a newly created but unwired\n // credential set would otherwise hijack the report and describe an agent\n // the runtime is not even using (#1697).\n const wiredDirectories = inventory\n .filter((entry) => entry.classification === 'wired')\n .map((entry) => entry.directory)\n const primaryDirectory = input.credentialsDir\n ? directory\n : (wiredDirectories.includes(directory ?? '') ? directory : wiredDirectories[0] ?? directory)\n if (primaryDirectory) {\n const primaryEntry = inventory.find((entry) => entry.directory === primaryDirectory)\n signerCapabilities = capabilitiesByDirectory.get(primaryDirectory)\n for (const check of primaryEntry?.checks ?? []) primaryChecksById.set(check.id, check)\n }\n\n // ── The historical single-agent check list, for the PRIMARY directory ─────\n // A single-agent install must read exactly as it did before (#1697 AC), so\n // the flat `checks` array keeps its order and ids; `agents` is the new,\n // additive per-agent shape.\n if (!primaryDirectory) {\n checks.push({\n id: 'credentials',\n label: 'Agent credentials',\n ok: false,\n detail: 'No agent credential directory with an identity.json under ~/.haven/agents.',\n repair: `Run the full setup once: ${RERUN} --setup <token from the Haven dashboard>.`,\n })\n } else {\n const primaryIdentity = await readIdentity(primaryDirectory)\n const primarySidecar = await readRuntimeSidecar(primaryDirectory)\n if (primaryChecksById.size === 0) {\n // The primary directory is not wired (or has no key): run its checks\n // anyway — the user pointed the doctor at this machine, and silence\n // about the selected directory would be the old heuristic's failure.\n const result = await checksForAgent(\n { directory: primaryDirectory, identity: primaryIdentity, sidecar: primarySidecar }, input, deps,\n )\n signerCapabilities = result.signerCapabilities\n for (const check of result.checks) primaryChecksById.set(check.id, check)\n }\n for (const id of ['credentials', 'signer_runtime']) {\n const check = primaryChecksById.get(id)\n if (check) checks.push(check)\n }\n }\n\n if (configPath === null) {\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok: true,\n detail: `Runtime '${input.runtime}' has no file-based config the connector owns (CLI-managed) — skipping the file check.`,\n })\n } else if (configText === null) {\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok: false,\n detail: `No runtime config at ${configPath}.`,\n repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}`,\n })\n } else {\n const primaryIdentity = await readIdentity(primaryDirectory ?? '')\n const primarySidecar = primaryDirectory ? await readRuntimeSidecar(primaryDirectory) : null\n const hasHaven = primaryIdentity?.hosted_mcp_url\n ? configText.includes(primaryIdentity.hosted_mcp_url)\n : configText.includes('haven')\n // The wrapper form never writes the package spec into the config; only\n // the retired npx launch does — so the spec's presence IS the tell.\n const signerViaNpx = configText.includes('@haven_ai/signer')\n const wrapperReferenced = primarySidecar ? configText.includes(primarySidecar.wrapper_path) : false\n const ok = hasHaven && !signerViaNpx && (primarySidecar ? wrapperReferenced : true)\n checks.push({\n id: 'runtime_config',\n label: 'Runtime MCP config',\n ok,\n detail: ok\n ? `Config at ${configPath} references the hosted server and the prepared signer wrapper.`\n : signerViaNpx\n ? `Config at ${configPath} still launches the signer via npx — the pre-#1586 shape that cannot start under a 120s startup timeout.`\n : `Config at ${configPath} is missing the Haven entries${primarySidecar && !wrapperReferenced ? ' (or references a different signer wrapper)' : ''}.`,\n ...(ok ? {} : { repair: `Run: ${RERUN} --doctor --repair --runtime ${input.runtime}` }),\n })\n }\n\n for (const id of ['hosted_mcp', 'identity_match']) {\n const check = primaryChecksById.get(id)\n if (check) checks.push(check)\n }\n\n // ── Superseded agents (#1688, now inventory-driven) ───────────────────────\n // A re-run mints a NEW agent and retires nothing: the connector never\n // deletes old directories, registration only collides on delegate address,\n // and cancel deliberately refuses to auto-revoke. Net effect: an MCP host\n // that started before the re-run keeps spending as the agent the user\n // believes they replaced — silently, because its old key still resolves.\n // The doctor reports; the user decides — connect never revokes or deletes.\n const otherEntries = inventory.filter((entry) => entry.directory !== primaryDirectory)\n if (otherEntries.length > 0) {\n // Labels carry their SOURCE ENTRY (#1697 review, finding 3): resolving a\n // label back to an entry by string prefix would attribute one agent's\n // classification to another whenever one id is a prefix of the next\n // (`agent-1` / `agent-10`), and the failure mode is telling the user to\n // revoke the live agent.\n const live: Array<{ label: string; entry: AgentInventoryEntry }> = []\n const revoked: string[] = []\n const unverifiable: string[] = []\n const retired: string[] = []\n for (const entry of otherEntries) {\n const identity = await readIdentity(entry.directory)\n const tombstone = await readAgentTombstone(entry.directory)\n const otherAgent = identity?.agent_id ?? tombstone?.agent_id ?? basename(entry.directory)\n const otherUrl = identity?.hosted_mcp_url\n ?? (identity?.api_url ? `${identity.api_url}/mcp` : undefined)\n if (!identity?.api_key || !otherUrl) {\n if (tombstone) retired.push(`${otherAgent} (retired ${tombstone.retired_at})`)\n else unverifiable.push(`${otherAgent} (no stored key/URL to probe)`)\n continue\n }\n const suffix = tombstone ? ' [tombstoned — key material still present]' : ''\n const probe = await (deps.probeHosted ?? probeHostedMcpTools)(identity.api_key, otherUrl, deps.fetch)\n if (probe.status === 'ok') live.push({ label: `${otherAgent}${suffix}`, entry })\n else if (probe.status === 'unauthorized') revoked.push(`${otherAgent}${suffix}`)\n // network_error / bad_response: neither a false \"still live\" failure\n // nor a false clean bill — a note, never a verdict.\n else unverifiable.push(`${otherAgent} (${probe.status})${suffix}`)\n }\n const parts: string[] = []\n if (live.length > 0) parts.push(`STILL SPEND-CAPABLE: ${live.map((item) => item.label).join(', ')}`)\n if (revoked.length > 0) parts.push(`already revoked: ${revoked.join(', ')}`)\n if (retired.length > 0) parts.push(`tombstoned (keys removed): ${retired.join(', ')}`)\n if (unverifiable.length > 0) parts.push(`could not verify: ${unverifiable.join(', ')}`)\n // #1697: a WIRED sibling is a legitimately live agent, not a superseded\n // one — several agents may share a runtime now. Only unwired credential\n // dirs make the check fail.\n const supersededLive = live\n .filter((item) => item.entry.classification !== 'wired')\n .map((item) => item.label)\n checks.push({\n id: 'superseded_agents',\n label: 'Superseded agent credentials',\n ok: supersededLive.length === 0,\n detail:\n supersededLive.length > 0\n ? `${otherEntries.length} other credential dir(s) found — ${parts.join('; ')}. A host started before ` +\n 'your latest setup keeps authenticating (and spending) as the old agent.'\n : `${otherEntries.length} other credential dir(s) found — ${parts.join('; ')}.`,\n ...(supersededLive.length > 0\n ? {\n repair:\n `Revoke ${supersededLive.join(', ')} on the Haven agent page, then remove the old ` +\n 'director(y/ies) under ~/.haven/agents. Connect never revokes or deletes for you.',\n }\n : {}),\n })\n }\n\n const signerProcess = primaryChecksById.get('signer_process')\n if (signerProcess) checks.push(signerProcess)\n\n // ── Restart still required? (informational, never fails the doctor) ───────\n const restart = restartRequiredForRuntime(input.runtime, deps.env)\n checks.push({\n id: 'restart',\n label: 'Runtime restart',\n ok: true,\n detail: restart\n ? 'This runtime loads MCP config at startup — restart it after any repair before expecting the tools to appear.'\n : 'No restart requirement known for this runtime.',\n })\n\n // #1697: exit non-zero if ANY wired agent fails ANY check — not just the\n // one the old heuristic happened to select.\n const wiredOk = inventory\n .filter((entry) => entry.classification === 'wired')\n .every((entry) => entry.checks.every((check) => check.ok))\n\n return {\n version: 1,\n ok: checks.every((check) => check.ok) && wiredOk,\n runtime: input.runtime,\n credentialDirectory: primaryDirectory,\n checks,\n agents: inventory,\n ...(signerCapabilities ? { signerCapabilities } : {}),\n }\n}\n\nexport interface RepairResult {\n ok: boolean\n messages: string[]\n}\n\n/** Re-run the pieces setup owns; never touches credentials or tokens. */\nexport async function runRepair(\n input: { runtime: string; credentialsDir?: string },\n deps: DoctorDeps = {},\n): Promise<RepairResult> {\n const homeDir = deps.homeDir ?? homedir()\n const messages: string[] = []\n const { directory, others } = await discoverCredentialDirectory(homeDir, input.credentialsDir)\n if (others.length > 0) {\n // Repair never touches the other directories — that is the doctor's\n // superseded_agents check's job to REPORT and the user's to act on.\n messages.push(`Note: ${others.length} other agent credential dir(s) exist — run --doctor for their status.`)\n }\n if (!directory) {\n return {\n ok: false,\n messages: [`No agent credentials found to repair — run the full setup: ${RERUN} --setup <token>.`],\n }\n }\n let identity: IdentityFile\n try {\n identity = JSON.parse(await readFile(join(directory, 'identity.json'), 'utf8')) as IdentityFile\n } catch {\n return { ok: false, messages: ['identity.json is unreadable — re-run the full setup with a fresh token.'] }\n }\n if (!identity.api_key || !(identity.hosted_mcp_url || identity.api_url)) {\n return { ok: false, messages: ['identity.json lacks the stored API key / hosted URL — re-run the full setup.'] }\n }\n\n // #1589 review (HIGH): a --local (local-stdio) setup writes a structurally\n // different config (the haven entry is the LOCAL MCP wrapper, not the\n // hosted URL). Repair only knows how to write the hosted+signer shape, so\n // clobbering a local config would convert a working topology silently —\n // the exact class of harm a repair tool must never cause. Detect and\n // refuse: the local wrapper (bin/haven-mcp) and its mcp-runtime sidecar\n // are the tell.\n const configPath = runtimeConfigPathFor(input.runtime, homeDir)\n if (configPath) {\n try {\n const existing = await readFile(configPath, 'utf8')\n if (existing.includes('bin/haven-mcp') || existing.includes('.haven/mcp-runtime')) {\n return {\n ok: false,\n messages: [\n `The config at ${configPath} is the LOCAL-stdio topology (--local). Repair currently rewrites only the hosted+signer shape and will not touch it.`,\n 'Re-run your original setup command (with --local) to repair a local-stdio install.',\n ],\n }\n }\n } catch {\n // No existing config — nothing to clobber; proceed.\n }\n }\n\n const signerPath = join(directory, 'signer.json')\n const prepared = await prepareSignerRuntime(\n { credentialDirectory: directory, signerPath, homeDir },\n { runCommand: deps.runCommand },\n )\n messages.push(...prepared.messages)\n\n const configResult = await writeRuntimeConfig({\n runtime: input.runtime as RuntimeId,\n hostedMcpUrl: identity.hosted_mcp_url ?? `${identity.api_url}/mcp`,\n apiKey: identity.api_key,\n identityPath: join(directory, 'identity.json'),\n signerPath,\n credentialDirectory: directory,\n signerCommand: { command: prepared.command, args: prepared.args },\n homeDir,\n mode: 'hosted',\n })\n messages.push(...configResult.messages)\n messages.push('Repair complete — restart the runtime, then verify with --doctor.')\n return { ok: true, messages }\n}\n","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 /**\n * Omitted on the #1543 early config-written report — no probe has run yet,\n * and the backend merge keeps the key absent until the final report sets it.\n */\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","import { join } from 'node:path'\nimport { readFile, readdir, stat } from 'node:fs/promises'\nimport { 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 { assertValidServerSlug } from './server-names.js'\nimport {\n assertServerSlugAvailable,\n defaultCredentialRoot,\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, resolveRuntimeSelection, runtimeProfile, runtimeVerificationInstruction, RUNTIME_FLAG_VALUES, type RuntimeId, type RuntimeProfile } from './runtime-registry.js'\nimport { ConnectError } from './connect-error.js'\nimport { resolveRuntimeByInstalledClientPrompt } from './installed-clients.js'\nimport { assertSupportedNodeVersion } from './local-mcp-runtime.js'\nimport { MCP_RUNTIME_MANIFEST } from './runtime-manifest.js'\n\nexport const CONNECTOR_VERSION = '0.1.29-alpha.0'\n\nexport interface ConnectOptions {\n setupToken: string\n apiBaseUrl: string\n runtime?: string\n /** #1672 escape hatch: use exactly this runtime, ignoring environment detection. */\n runtimeForce?: string\n /**\n * #1719: the harness an AGENT running this command reported for itself. Enters\n * at the same precedence as `runtime`, so it can only fill a vacuum — never\n * override a detected environment.\n */\n runtimeSelfReport?: string\n /**\n * #1719: this run may ask a human which installed client to configure. The\n * CLI sets it for a non-`--json` run; a library caller must opt in. Combined\n * with `deps.isTty`, it is what makes the prompt rung SKIPPED rather than\n * answered in CI, in `--json` automation, and in library embeddings.\n */\n interactive?: boolean\n credentialsDir?: string\n environmentLabel?: string\n /** #1696: wiring slug for a named MCP pair + slug-keyed credential dir. */\n serverName?: 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 /** Overridable so runtime detection (#1672) is testable without faking process.env. */\n env?: NodeJS.ProcessEnv\n /** Overridable so the #1719 TTY gate is testable without faking process.stdin. */\n isTty?: boolean\n /** Overridable so the #1719 installed-client prompt is testable without readline. */\n promptRuntime?: () => Promise<RuntimeId>\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 // #1672: detection-first runtime resolution, BEFORE any side effect — the\n // setup command no longer carries --runtime, and a hint that contradicts a\n // confident detection must not write another client's config. Refusing here\n // keeps the #1161 discipline: no half-created agent, no burned setup token.\n //\n // #1719 extends the ladder past detection: an agent that knows its own\n // harness may say so (as a re-run carrying --runtime, which is why the\n // backend's setup prompt now permits exactly that one change), and a human\n // at a TTY is offered the clients actually installed here. The prompt rung\n // is OMITTED — not answered — whenever this is not an interactive terminal\n // run, so CI and --json automation still reach the refusal below instead of\n // blocking on stdin.\n const selection = await resolveRuntimeSelection(options.runtime, options.runtimeForce, {\n env: deps.env ?? process.env,\n selfReported: options.runtimeSelfReport,\n promptForRuntime: runtimeSelectionPrompt(options, deps),\n })\n if (!selection.runtime) {\n throw new ConnectError(\n 'runtime_undetermined',\n 'Could not determine the agent runtime: nothing was detected in this environment and no --runtime was given. ' +\n 'If you are an AI agent running this command: re-run it once, unchanged except for adding ' +\n `--runtime <name>, naming the harness you are running in — one of: ${RUNTIME_FLAG_VALUES} ` +\n '(the aliases cowork, codex and openclaw are accepted too). Do not guess: if your harness is ' +\n 'not one of those, use --runtime other, which stores the credentials and prints the manual MCP steps. ' +\n 'Nothing was written and the Haven setup token is still unused.',\n 'rerun_connect_with_explicit_runtime',\n )\n }\n const runtime = selection.runtime\n const installCapabilities = runtimeInstallCapabilities(runtime)\n\n if (options.localMcp) {\n if (!supportsLocalMcp(runtime)) {\n throw new Error(\n `--local (fully-local Haven MCP) is only available for Claude Code and Codex. ` +\n `The detected runtime is ${runtimeProfile(runtime).label}. ` +\n 'Re-run without --local to use the default hosted MCP + local signer setup.',\n )\n }\n }\n\n if (selection.overrodeHint) {\n log(`runtime: ${runtime} (detected; ignoring the ${selection.overrodeHint} hint — pass --runtime-force ${selection.overrodeHint} to override)`)\n }\n if (selection.discardedHint) {\n // #1719: never silent. The caller asked for something this connector has\n // no name for; detection is what saved the run, and the user has to be\n // able to see that their value did nothing.\n log(`runtime: ${runtime} (detected; \"${selection.discardedHint}\" is not a runtime Haven knows — valid values: ${RUNTIME_FLAG_VALUES})`)\n }\n if (selection.source === 'prompted') {\n log(`runtime: ${runtime} (chosen at the prompt — nothing was detected in this environment)`)\n }\n\n log('Warming up your connection to Haven…')\n const setup = await api.resolveSetup({\n setupToken: options.setupToken,\n connectorVersion,\n runtime,\n })\n assertSetupChallengeIsUsable(setup.challenge.expires_at)\n printSetupSummary(setup, log)\n\n await preflightStorage({ baseDir: options.credentialsDir, warn: log })\n if (options.serverName) {\n // Validated HERE too, not only in the CLI parser (#1696 review): runConnect\n // is exported, and a library caller passing a reserved or malformed slug\n // would otherwise register a live agent and write real key material to\n // disk before failing deep inside the config writer — the exact orphaned\n // -agent outcome this ordering exists to prevent.\n assertValidServerSlug(options.serverName)\n // #1696: the slug keys the credential directory, and connect never\n // overwrites credential files — so a taken slug must refuse HERE, before\n // a key is minted or an agent registered, not fail on the write and\n // leave an orphaned registration behind.\n await assertServerSlugAvailable(options.serverName, options.credentialsDir)\n }\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,\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 serverName: options.serverName,\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,\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 serverName: options.serverName,\n }, {\n onProgress: log,\n // #1543: report \"runtime configured\" the moment the config write settles,\n // so the dashboard can expose its budget-approval controls without\n // waiting on the probes and skill install — a tail that approval does not\n // depend on. Silent and best-effort: the complete report below remains\n // authoritative (it overwrites these keys, adding the probe verdicts and\n // skill state), so an early failure costs nothing but the head start.\n onRuntimeConfigured: async (early) => {\n try {\n await api.updateInstallStatus(registration.setup_id, localApiKey, {\n runtime: early.runtime,\n connectorVersion,\n runtimeMcpMode: early.runtimeMcpMode,\n hostedMcpConfigured: early.hostedMcpConfigured,\n localSignerConfigured: early.localSignerConfigured,\n localMcpConfigured: early.localMcpConfigured,\n credentialFilesWritten: true,\n signerAcknowledged: early.signerAcknowledged,\n localMcpAcknowledged: early.localMcpAcknowledged,\n restartRequired: early.restartRequired,\n nextUserAction: early.nextUserAction,\n errorCode: early.errorCode ?? null,\n environmentLabel: options.environmentLabel ?? 'Local workspace',\n })\n } catch {\n // ignore — the final report follows either way\n }\n },\n })\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 // #1688: a re-run minted a NEW agent, and nothing retires the old one — the\n // previous directory keeps an API key and a signing key, and any host that\n // started before this run keeps spending as that agent. Name the superseded\n // agents here, at the moment the user is watching, with the one action only\n // they can take. Connect never revokes or deletes credentials itself.\n try {\n const supersededIds = await listOtherAgentIds(options.credentialsDir, credentialPaths.directory)\n if (supersededIds.length > 0) {\n log('')\n log(\n `Heads-up: this setup created a NEW agent. Your previous agent(s) — ${supersededIds.join(', ')} — ` +\n 'still exist with their own keys, and any host that was already running keeps acting as them.',\n )\n log(\n 'If you meant to replace them: revoke them on the Haven agent page, then restart EVERY ' +\n 'long-lived host (gateways, TUI workers, editors) — each holds the MCP wiring snapshot from ' +\n 'its own start time, so after repeated setups each can be stuck on a DIFFERENT old agent. ' +\n `Then remove their directories under ~/.haven/agents (or ${RERUN_HINT} --tombstone <dir> to ` +\n `leave a diagnostic in their place). Run ${RERUN_HINT} --doctor to check whether their keys are still live.`,\n )\n }\n } catch {\n // Best-effort — never let the heads-up break a completed setup.\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. Since #1543 the unlock\n // usually happened already, via the early config-written report above —\n // this complete report refines it with the probe verdicts and skill state,\n // and stays the fallback unlock path when the early one failed. It remains\n // best-effort readiness metadata only: a failed report cannot activate the\n // agent or 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. The observed outcome\n // shapes the printed next steps (#1542): an approval the wait just\n // celebrated must not be requested again two lines later.\n let approval: BudgetApprovalOutcome | undefined\n if (options.waitForApproval !== false && !runtimeInstall.errorCode) {\n approval = await waitForBudgetApproval(api, registration.setup_id, localApiKey, log, options.approvalWait)\n }\n\n printNextSteps(runtimeInstall, log, approval)\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 * The prompt rung's gate (#1719), in one place so the two conditions that\n * SKIP it cannot drift apart: a run that is not interactive (`--json`, a\n * library embedding) and a run whose stdin is not a terminal (CI, a pipe).\n * Returning `undefined` omits the rung from the ladder entirely, so those runs\n * reach the `runtime_undetermined` refusal instead of blocking on stdin.\n */\nfunction runtimeSelectionPrompt(\n options: ConnectOptions,\n deps: ConnectDeps,\n): (() => Promise<RuntimeId>) | undefined {\n if (options.interactive !== true) return undefined\n // The TTY gate is checked BEFORE the injected prompt, not after: an override\n // that could skip it would make the gate untestable through the seam that\n // exists to test it.\n if (!(deps.isTty ?? Boolean(process.stdin.isTTY))) return undefined\n return deps.promptRuntime ?? (() => resolveRuntimeByInstalledClientPrompt())\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 *\n * #1719: a `ConnectError` carries its own code and next action, so it is read\n * rather than guessed. The regex ladder below survives only for the refusals\n * that are still plain `Error`s — every new failure mode joins the vocabulary\n * instead of joining that ladder.\n */\nexport function failedConnectOutcome(runtimeHint: string | undefined, error: unknown): ConnectOutcome {\n const message = error instanceof Error ? error.message : ''\n const code = error instanceof ConnectError\n ? error.code\n : /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 = error instanceof ConnectError\n ? error.nextAction\n : 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 (36 polls; with the immediate first check below the last one\n * lands at ~175 s) — the connector ALWAYS terminates on its own; a timeout\n * is a clean exit with guidance, never a hang. Injectable clock/cadence for\n * tests.\n *\n * #1542: the first check happens BEFORE the \"waiting for you to approve\" line\n * is printed. Users routinely approve in the dashboard while the runtime\n * install is still running, and announcing a wait that is already over made\n * the very next line (\"Budget approved 🎉\") read as a contradiction — the\n * field-test agent relayed the pair verbatim as a bug.\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 type BudgetApprovalOutcome = 'approved' | 'pending' | 'ended'\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<BudgetApprovalOutcome> {\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 // Announced only once a check has actually observed a pending (or unknown)\n // state — never ahead of a first check that may find the wait already over.\n let waitingAnnounced = false\n const announceWaiting = () => {\n if (waitingAnnounced) return\n waitingAnnounced = true\n log('Registered with Haven — waiting for you to approve the budget in the dashboard…')\n }\n\n for (let i = 0; i < maxPolls; i++) {\n // The first check is immediate (#1542); only the retries pace themselves.\n if (i > 0) 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 // and say so, rather than sitting silent until a check succeeds.\n announceWaiting()\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 announceWaiting()\n if (i > 0 && i % 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\n * budget in Haven, then (for most runtimes) restart so the freshly-written MCP\n * config is loaded. The approval line states the dependency explicitly — tools\n * never appear before approval, restart or not — because an agent that had\n * already approved still couldn't tell whether missing tools meant \"not\n * approved\" or \"needs restart.\"\n *\n * #1542, from the field test:\n * - The lines are shaped by what the approval wait observed. `'approved'`\n * replaces the approve instruction with a confirmation — the connector must\n * never celebrate the approval and then instruct the user to go perform it.\n * `undefined` (wait skipped: --json mode, or an install errorCode) keeps the\n * full instruction.\n * - One name for the gate throughout this file: the BUDGET — the word the wait\n * loop, the celebration, and the dashboard's grant screen already use.\n * \"Agent rules\" here made one gate read as two.\n * - The restart step says WHY it survives the connector's own verification:\n * session/app-scoped runtimes only read MCP config at start-up.\n */\nexport function completionHandoffLines(\n result: RuntimeInstallResult,\n approval?: BudgetApprovalOutcome,\n): string[] {\n if (result.errorCode === 'manual_runtime_setup_required') {\n return [\n 'Next steps:',\n '1. Return to Haven and approve the budget. 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 if (approval === 'ended') {\n return [\n 'Next step: this setup ended in Haven before the budget was approved, so there is nothing left to approve on it — start a fresh connection from the dashboard when ready.',\n ]\n }\n\n const profile = runtimeProfile(result.runtime)\n const activation = activationInstructionWithWhy(profile)\n if (approval === 'approved') {\n return [\n 'Next steps — the budget is already approved, so there is nothing more to do in Haven:',\n `1. ${activation}`,\n `2. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n }\n return [\n 'Next steps:',\n '1. Return to Haven and approve the budget. Approval — not restarting — unlocks Haven tools.',\n `2. ${activation}`,\n `3. ${runtimeVerificationInstruction(result.runtime)}`,\n ]\n}\n\n/**\n * The field-test agent had just watched the connector print \"Verified Claude\n * Code MCP entry\" and reasonably asked why a restart was still demanded. Say\n * the reason in the instruction itself: verification ran in the connector's\n * process, but the runtime only reads MCP config at session start (or app\n * launch). Hot-reload and manual runtimes keep their registry copy untouched —\n * their instructions already carry their own activation story.\n */\nfunction activationInstructionWithWhy(profile: RuntimeProfile): string {\n if (profile.restartMode === 'restart-session') {\n return `${profile.activationInstruction} (The entries are already written and verified — ${profile.label} only reads MCP config when a session starts, which is why this step is still needed.)`\n }\n if (profile.restartMode === 'restart-app') {\n return `${profile.activationInstruction} (The entries are already written and verified — ${profile.label} only reads MCP config at app launch, which is why this step is still needed.)`\n }\n return profile.activationInstruction\n}\n\nconst RERUN_HINT = 'npx @haven_ai/connect@alpha'\n\n/**\n * Agent ids of every OTHER credential directory (#1688) — the agents this\n * run just superseded. Reads identity.json for the id; a directory that does\n * not parse is named by its directory name, because \"I could not read it\" is\n * still a directory the user should know exists.\n */\nasync function listOtherAgentIds(baseDir: string | undefined, currentDirectory: string): Promise<string[]> {\n const root = defaultCredentialRoot(baseDir)\n let entries: string[] = []\n try {\n entries = await readdir(root)\n } catch {\n return []\n }\n const ids: string[] = []\n for (const entry of entries) {\n // Exclude by the DIRECTORY this run wrote, never by agent id (#1696\n // review): a named agent's directory is its slug, which never equals the\n // agent uuid, so an id comparison would name the agent just created as a\n // superseded one and tell the user to revoke it on a clean first run.\n if (join(root, entry) === currentDirectory) continue\n const identityPath = join(root, entry, 'identity.json')\n // Gate on the FILE EXISTING before treating the entry as an agent at all\n // (#1688 review, B1): readdir returns every filesystem entry, and a\n // .DS_Store or sync-relic that merely fails to read must be skipped —\n // naming it would tell the user to \"revoke\" a file. A directory whose\n // identity.json EXISTS but does not parse is the case worth surfacing,\n // by directory name, because a corrupt agent dir is still an agent dir.\n try {\n await stat(identityPath)\n } catch {\n continue\n }\n try {\n const identity = JSON.parse(await readFile(identityPath, 'utf8')) as { agent_id?: string }\n ids.push(identity.agent_id ?? entry)\n } catch {\n ids.push(entry)\n }\n }\n return ids\n}\n\nfunction printNextSteps(\n result: RuntimeInstallResult,\n log: (message: string) => void,\n approval?: BudgetApprovalOutcome,\n): void {\n for (const line of completionHandoffLines(result, approval)) log(line)\n}\n","import { access, chmod, mkdir, rm, stat, 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 /**\n * #1696: wiring slug. Named agents live at ~/.haven/agents/<slug>/ (stable\n * across a re-key by construction — the slug never rotates); unnamed keep\n * the historical ~/.haven/agents/<agent-uuid>/. Both schemes coexist.\n */\n serverName?: 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.serverName ?? 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\n/**\n * #1696: a wiring slug keys a credential directory, and connect never\n * overwrites credential files — a taken slug is refused before any side\n * effect. A leftover EMPTY slug directory (no identity.json) does not count\n * as taken. Replacing a named agent's credentials in place is #1700's\n * explicit re-key path, never a re-run.\n */\nexport async function assertServerSlugAvailable(serverName: string, baseDir?: string): Promise<void> {\n const directory = defaultAgentDirectory(serverName, baseDir)\n try {\n await stat(join(directory, 'identity.json'))\n } catch {\n return\n }\n throw new Error(\n `The name \"${serverName}\" is already wired on this machine (${directory} holds credentials). ` +\n 'Pick a different --name, or revoke and remove that agent first — connect never overwrites credentials.',\n )\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 { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { writeRuntimeConfig, type RuntimeMcpMode } from './config-writers.js'\nimport { serverNamesFor } from './server-names.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 * #1695: wiring slug for a NAMED MCP pair (haven-<slug> /\n * haven-signer-<slug>). Absent = the bare pair, unchanged from today.\n */\n serverName?: string\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\n/**\n * The config-write snapshot handed to `onRuntimeConfigured` (#1543). The\n * booleans mirror the semantics of the FINAL report's unlock keys minus the\n * probe verdicts: \"configured\" here means the config write succeeded, the\n * required consent is acknowledged, and the signer credential exists on disk\n * (a local fs check) — not that a handshake has verified it. A later probe\n * failure refines the final report and sets its errorCode; the dashboard's\n * unlock condition accepts either state.\n */\nexport interface EarlyRuntimeConfigReport {\n runtime: RuntimeId\n runtimeMcpMode: RuntimeMcpMode\n hostedMcpConfigured: boolean\n localSignerConfigured: boolean\n localMcpConfigured: boolean\n signerAcknowledged?: boolean\n localMcpAcknowledged?: boolean\n restartRequired: boolean\n nextUserAction: string\n errorCode?: 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 /**\n * #1543: invoked once, the moment the runtime MCP config write has settled —\n * BEFORE the network probes and the skill install. The dashboard withholds\n * its budget-approval controls until an install-status report shows the\n * runtime configured, and the final report only lands after the entire\n * install; gating approval on that tail made the user wait on work approval\n * does not depend on. The snapshot carries the config-write facts (no probe\n * verdicts, no skill state); the caller's complete report remains\n * authoritative and overwrites these keys. Best-effort by contract: a\n * throwing callback is swallowed and never fails the install.\n */\n onRuntimeConfigured?: (report: EarlyRuntimeConfigReport) => Promise<void> | void\n runCommand?: (command: string, args: string[]) => Promise<void>\n prepareLocalMcpRuntime?: (input: PrepareLocalMcpRuntimeInput) => Promise<PreparedLocalMcpRuntime>\n prepareSignerRuntime?: (input: PrepareSignerRuntimeInput) => Promise<PreparedSignerRuntime>\n probeSignerTools?: (\n command: string,\n args: string[],\n requiredTools: readonly string[],\n ) => Promise<LocalMcpProbeResult>\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.\n //\n // #1586: prep failure is FATAL for this setup run — loud and fail-closed,\n // never a silent npx fallback. The 2026-08-18 Codex Desktop test showed\n // why: with Codex's startup_timeout_sec = 120, an npx first-launch is a\n // multi-minute npm install killed at 2 minutes, leaving corrupted _npx\n // dirs and a config that LOOKS wired but structurally cannot connect —\n // strictly worse than a clear error. Fail-closed here means NO config is\n // written at all (not even the hosted `haven` entry): a half-wired setup\n // where quotes work but signing never can is the same looks-fine trap in\n // a different place. The recovery is a re-run once the cause (network,\n // npm cache) is addressed.\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 return {\n runtime,\n runtimeMcpMode: 'hosted_plus_signer',\n hostedMcpConfigured: false,\n localSignerConfigured: false,\n localMcpConfigured: false,\n probeResult: 'signer_runtime_install_failed',\n restartRequired: false,\n nextUserAction:\n 'The local Haven signer runtime could not be installed, so no configuration was written. ' +\n 'Check your network (a cold install downloads the signer package set) and re-run: npx @haven_ai/connect@alpha',\n errorCode: 'signer_runtime_install_failed',\n configTarget: profile.label,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n activationCommand: undefined,\n signerRuntimePrepared: false,\n messages: [\n ...consentMessages,\n `Could not pre-install the local Haven signer: ${err instanceof Error ? err.message : String(err)}`,\n 'No runtime configuration was written (fail-closed): a config pointing at an uninstalled signer looks wired but cannot start.',\n 'Re-run `npx @haven_ai/connect@alpha` to retry the setup.',\n ],\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 ?? '', input.serverName)\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 serverName: input.serverName,\n credentialDirectory: input.credentialDirectory,\n localMcpCommand: localRuntimeInstall?.command,\n signerCommand,\n homeDir: deps.homeDir,\n mode: localRuntime ? 'local' : 'hosted',\n })\n\n // #1543: the config write has settled — everything the dashboard's approval\n // unlock reads is now known, so report it before the probes and skill\n // install run. The signer-credential check is a local fs stat, cheap enough\n // to make the early booleans carry the final report's semantics (minus the\n // network probe verdicts, which only refine — never gate — the unlock).\n if (deps.onRuntimeConfigured) {\n const signerCredentialOnDisk = await probeLocalSignerCredential(input.signerPath)\n const earlyLocalMcpOk = configResult.runtimeMcpMode === 'local_stdio' &&\n configResult.localMcpConfigured &&\n signerCredentialOnDisk &&\n Boolean(localMcpConsent?.acknowledged)\n const earlySignerOk = configResult.runtimeMcpMode === 'local_stdio'\n ? earlyLocalMcpOk\n : configResult.signerConfigured && signerCredentialOnDisk && Boolean(signerConsent?.acknowledged)\n try {\n await deps.onRuntimeConfigured({\n runtime,\n runtimeMcpMode: configResult.runtimeMcpMode,\n hostedMcpConfigured: configResult.hostedConfigured,\n localSignerConfigured: earlySignerOk,\n localMcpConfigured: earlyLocalMcpOk,\n signerAcknowledged: signerConsent?.acknowledged,\n localMcpAcknowledged: localMcpConsent?.acknowledged,\n restartRequired: configResult.restartRequired || restartRequiredForRuntime(runtime, deps.env),\n nextUserAction: nextAction(runtime, profile.restartMode, configResult.errorCode),\n errorCode: configResult.errorCode,\n })\n } catch {\n // Best-effort by contract: early reporting must never fail the install —\n // the caller's complete report follows either way.\n }\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 // #1587: in the hosted topology the signer is its own MCP stdio server and\n // gets the same courtesy as the hosted server — a REAL handshake\n // (initialize → tools/list → required-tools check) against the registered\n // command, not a credential-file stat. The 2026-08-18 Codex test is why:\n // setup exited 0 on a signer that could not start, and the failure\n // surfaced mid-payment. Cheap and fast now that #1586 guarantees the\n // command is a prepared wrapper, never a cold npx launch.\n const signerProbePromise = configResult.runtimeMcpMode !== 'local_stdio' && signerCommand\n ? (deps.probeSignerTools ?? probeLocalMcpTools)(\n signerCommand.command,\n signerCommand.args,\n MCP_RUNTIME_MANIFEST.requiredSignerTools,\n )\n : Promise.resolve(undefined)\n const [hostedProbe, signerCredentialReady, localMcpProbe, signerProbe] = 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 signerProbePromise,\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 &&\n signerCredentialReady &&\n Boolean(signerConsent?.acknowledged) &&\n // #1587: no handshake, no green. A signer command that was registered\n // but not probed (manual topology) keeps the old semantics.\n (signerProbe === undefined || signerProbe.status === 'ok')\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) ??\n signerConsentErrorCode(signerCredentialReady, signerConsent) ??\n signerProbeErrorCode(signerProbe))\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 signerProbeMessages = signerProbe\n ? signerProbe.status === 'ok'\n ? ['Verified local Haven signer with a stdio handshake.']\n : [\n `Local Haven signer handshake failed: ${signerProbe.status}.`,\n 'Re-run `npx @haven_ai/connect@alpha` to repair the signer setup.',\n ]\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, ...signerProbeMessages, ...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 serverName?: 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 // Remove stale entries first so re-runs and hosted→local switches are\n // idempotent — `claude mcp add-json` fails when the name already exists.\n // #1569: without this, a second setup left the runtime wired to the\n // PREVIOUS agent's wrapper (the add collided, the old entry survived) —\n // the hosted sibling below always did it in this order. Deliberate\n // tradeoff: if the add fails AFTER a successful remove, the runtime ends\n // with NO haven entry instead of a stale wrong-agent one — fail-closed,\n // and the claude_code_config_failed recovery (rerun setup) works cleanly\n // from that state because this sequence is idempotent from any start.\n const names = serverNamesFor(serverName)\n await runCommand('claude', ['mcp', 'remove', names.hosted]).catch(() => undefined)\n await runCommand('claude', ['mcp', 'remove', names.signer]).catch(() => undefined)\n await runCommand('claude', ['mcp', 'add-json', names.hosted, serverJson, '--scope', 'user'])\n .catch(async () => {\n await runCommand('claude', ['mcp', 'add', names.hosted, '--scope', 'user', '--', localMcpCommand])\n })\n const verified = await runCommand('claude', ['mcp', 'get', names.hosted])\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 // #1695: only the entries THIS pair owns, by name — a named setup can\n // never clobber the bare pair or a sibling named pair.\n const names = serverNamesFor(input.serverName)\n await runCommand('claude', ['mcp', 'remove', names.hosted]).catch(() => undefined)\n await runCommand('claude', ['mcp', 'remove', names.signer]).catch(() => undefined)\n await runCommand('claude', ['mcp', 'add-json', names.hosted, hostedJson, '--scope', 'user'])\n await runCommand('claude', ['mcp', 'add-json', names.signer, signerJson, '--scope', 'user'])\n const verified = await runCommand('claude', ['mcp', 'get', names.hosted])\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 signerProbeErrorCode(probe: LocalMcpProbeResult | undefined): string | undefined {\n if (!probe || probe.status === 'ok') return undefined\n return `local_signer_probe_${probe.status}`\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 // onProgress threaded through on purpose (#1593, the #1586 review lesson):\n // without it the install heartbeat is dead code in production.\n const prepare = deps.prepareLocalMcpRuntime ?? ((runtimeInput: PrepareLocalMcpRuntimeInput) =>\n prepareLocalMcpRuntime(runtimeInput, { runCommand: deps.runCommand, onProgress: deps.onProgress }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n identityPath: input.identityPath,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n serverName: input.serverName,\n })\n}\n\nasync function prepareSignerForRuntime(\n input: RuntimeInstallInput,\n deps: RuntimeInstallDeps,\n): Promise<PreparedSignerRuntime> {\n const prepare = deps.prepareSignerRuntime ?? ((runtimeInput: PrepareSignerRuntimeInput) =>\n // onProgress threaded through on purpose (#1586 review): without it the\n // install heartbeat was dead code in production and the console still\n // went silent for the whole cold install — the exact symptom the issue\n // set out to remove, at a longer timeout.\n prepareSignerRuntime(runtimeInput, { runCommand: deps.runCommand, onProgress: deps.onProgress }))\n return prepare({\n credentialDirectory: input.credentialDirectory,\n signerPath: input.signerPath,\n homeDir: deps.homeDir,\n serverName: input.serverName,\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 { 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 { 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 { SIGNER_INSTALL_HEARTBEAT_MS, SIGNER_INSTALL_TIMEOUT_MS } from './signer-runtime.js'\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 /** #1696: wiring slug, recorded in the sidecar for per-agent inventory (#1697). */\n serverName?: 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 /** Install progress heartbeat, mirrored from the signer runtime (#1586/#1593). */\n onProgress?: (message: string) => 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)\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 serverName: input.serverName,\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 deps: LocalMcpRuntimeDeps,\n): Promise<void> {\n const { runCommand, onProgress } = deps\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 // Heartbeat while npm works, and the same honest budget as the signer\n // install: a cold-cache install can legitimately exceed the old 120s\n // timeout, and a silent console reads as a hang (#1586/#1593).\n const startedAt = Date.now()\n const heartbeat = setInterval(() => {\n const seconds = Math.round((Date.now() - startedAt) / 1000)\n onProgress?.(`Still installing the local Haven MCP runtime… (${seconds}s — a cold cache can take several minutes)`)\n }, SIGNER_INSTALL_HEARTBEAT_MS)\n heartbeat.unref?.()\n try {\n if (runCommand) await runCommand('npm', args)\n else await execFileAsync('npm', args, { timeout: SIGNER_INSTALL_TIMEOUT_MS, maxBuffer: 1024 * 1024 })\n } finally {\n clearInterval(heartbeat)\n }\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 serverName?: string\n}): Promise<void> {\n const value = {\n ...(input.serverName ? { server_name: input.serverName } : {}),\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 { 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","import { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\nimport { access } from 'node:fs/promises'\nimport { createInterface } from 'node:readline'\nimport { ConnectError } from './connect-error.js'\nimport { runtimeConfigPathFor } from './config-writers.js'\nimport { runtimeProfile, type RuntimeId } from './runtime-registry.js'\n\n/**\n * Installed-client scan + interactive pick (#1719).\n *\n * The rung that answers \"which runtime am I configuring?\" for a HUMAN in a\n * plain terminal, where there is no agent shell to detect. Two properties hold\n * it up, and both are load-bearing:\n *\n * 1. **Only clients the connector can actually write.** A row that cannot be\n * configured is not a choice, it is a dead end wearing a choice's clothes.\n * 2. **The scan populates the choices; it never selects.** Finding exactly one\n * installed app tells you what EXISTS, not where the user wants their agent\n * to run — and the cost of being wrong is an API key and a delegate key\n * written into an app the user does not use. `scanInstalledClients` returns\n * candidates and nothing else; only an answer typed at the prompt resolves\n * a runtime.\n */\nexport interface InstalledClientCandidate {\n runtime: RuntimeId\n label: string\n /** What made this a candidate — shown at the prompt so the pick is informed. */\n detail: string\n /**\n * The config file Haven would write for this client, when it owns one.\n * `null` for Claude Code, which is configured through its own CLI. Set\n * regardless of which evidence found the client — `evidence` is what says\n * whether that file exists today.\n */\n configPath: string | null\n evidence: 'config-file' | 'client-directory'\n}\n\ninterface ScanTarget {\n runtime: RuntimeId\n label: string\n /** The config file the connector would write, when it owns a file path. */\n configPath: string | null\n /** Paths that mean \"this client is installed\" even with no MCP config yet. */\n markers: string[]\n}\n\nexport interface ScanInstalledClientsOptions {\n homeDir?: string\n /** Workspace root, for the project-local `.vscode/` marker. */\n cwd?: string\n env?: NodeJS.ProcessEnv\n /** Injectable so the scan is testable without a populated home directory. */\n exists?: (path: string) => Promise<boolean>\n}\n\n/**\n * Ranked highest-confidence first WITHIN each evidence tier. An existing MCP\n * config file outranks a bare client directory across the board — a client the\n * user has already pointed at some MCP server is likelier to be the one they\n * are pointing at Haven now.\n */\nconst SCAN_ORDER: readonly RuntimeId[] = [\n 'claude-code',\n 'codex-cli',\n 'cursor',\n 'vscode',\n 'vscode-insiders',\n 'claude-desktop',\n 'hermes',\n]\n\nexport function installedClientTargets(\n homeDir: string = homedir(),\n cwd: string = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): ScanTarget[] {\n const targets: ScanTarget[] = [\n {\n runtime: 'claude-code',\n label: 'Claude Code',\n // Claude Code is configured through its own CLI (`claude mcp add-json`),\n // not by writing a file this module owns — so its evidence is the\n // client directory, never a config path.\n configPath: null,\n markers: [join(homeDir, '.claude'), join(homeDir, '.claude.json')],\n },\n {\n runtime: 'codex-cli',\n // Both Codex surfaces write the same ~/.codex/config.toml, so they are\n // ONE candidate. Splitting them would ask the user to answer a question\n // whose answers are the same write.\n label: 'Codex (CLI or Desktop)',\n configPath: runtimeConfigPathFor('codex-cli', homeDir),\n markers: [join(homeDir, '.codex')],\n },\n {\n runtime: 'cursor',\n label: 'Cursor',\n configPath: runtimeConfigPathFor('cursor', homeDir),\n markers: [join(homeDir, '.cursor')],\n },\n {\n runtime: 'vscode',\n label: 'VS Code',\n configPath: runtimeConfigPathFor('vscode', homeDir),\n markers: [resolve(cwd, '.vscode')],\n },\n {\n runtime: 'vscode-insiders',\n label: 'VS Code Insiders',\n configPath: runtimeConfigPathFor('vscode-insiders', homeDir),\n markers: [],\n },\n {\n runtime: 'claude-desktop',\n label: 'Claude Desktop',\n configPath: runtimeConfigPathFor('claude-desktop', homeDir),\n markers: [],\n },\n {\n runtime: 'hermes',\n label: 'Hermes Agent',\n configPath: runtimeConfigPathFor('hermes', homeDir),\n markers: [env.HERMES_HOME ?? join(homeDir, '.hermes')],\n },\n ]\n // Belt and braces against a future profile losing its writer: an unwritable\n // runtime must never reach the prompt (property 1 above).\n return targets.filter((target) => runtimeProfile(target.runtime, {}).canWriteRuntimeConfig)\n}\n\nexport async function scanInstalledClients(\n options: ScanInstalledClientsOptions = {},\n): Promise<InstalledClientCandidate[]> {\n const exists = options.exists ?? pathExists\n const targets = installedClientTargets(options.homeDir, options.cwd, options.env ?? process.env)\n const found: InstalledClientCandidate[] = []\n for (const target of targets) {\n if (target.configPath && (await exists(target.configPath))) {\n found.push({\n runtime: target.runtime,\n label: target.label,\n detail: `MCP config found at ${target.configPath}`,\n configPath: target.configPath,\n evidence: 'config-file',\n })\n continue\n }\n for (const marker of target.markers) {\n if (!(await exists(marker))) continue\n found.push({\n runtime: target.runtime,\n label: target.label,\n detail: `installed (${marker})`,\n configPath: target.configPath,\n evidence: 'client-directory',\n })\n break\n }\n }\n return found.sort((a, b) => {\n if (a.evidence !== b.evidence) return a.evidence === 'config-file' ? -1 : 1\n return SCAN_ORDER.indexOf(a.runtime) - SCAN_ORDER.indexOf(b.runtime)\n })\n}\n\nexport interface PromptIo {\n write: (text: string) => void\n /** Resolves the typed line, or `null` on EOF / Ctrl-C. */\n question: (query: string) => Promise<string | null>\n}\n\n/** Bounded so a piped-but-TTY-looking stdin cannot spin forever. */\nconst MAX_PROMPT_ATTEMPTS = 3\n\nexport async function promptForInstalledClient(\n candidates: readonly InstalledClientCandidate[],\n io: PromptIo = defaultPromptIo(),\n): Promise<RuntimeId> {\n if (candidates.length === 0) throw noInstalledClientsError()\n io.write('Haven could not detect which agent runtime this is.\\n')\n io.write('These agent clients are installed on this machine:\\n')\n candidates.forEach((candidate, index) => {\n io.write(` ${index + 1}) ${candidate.label} — ${candidate.detail}\\n`)\n })\n io.write('Haven writes an API key and a signing key into the client you pick, so pick the one your agent actually runs in.\\n')\n\n for (let attempt = 0; attempt < MAX_PROMPT_ATTEMPTS; attempt += 1) {\n const answer = await io.question(`Which one? [1-${candidates.length}] (default 1 — ${candidates[0].label}): `)\n if (answer === null) throw promptAbortedError('the prompt was cancelled')\n const trimmed = answer.trim()\n // Empty ACCEPTS the pre-selected default. That is still a choice the user\n // made at the prompt — the scan itself never gets to select (property 2).\n if (trimmed === '') return candidates[0].runtime\n const picked = Number.parseInt(trimmed, 10)\n if (Number.isInteger(picked) && picked >= 1 && picked <= candidates.length) {\n return candidates[picked - 1].runtime\n }\n io.write(`\"${trimmed}\" is not one of 1-${candidates.length}.\\n`)\n }\n throw promptAbortedError(`no valid choice after ${MAX_PROMPT_ATTEMPTS} attempts`)\n}\n\n/**\n * The whole rung as one thunk: scan, refuse if nothing writable is installed,\n * otherwise prompt. This is what `resolveRuntimeSelection` calls, which is why\n * the registry needs no knowledge of the filesystem or of readline.\n */\nexport async function resolveRuntimeByInstalledClientPrompt(\n options: ScanInstalledClientsOptions & { io?: PromptIo } = {},\n): Promise<RuntimeId> {\n const candidates = await scanInstalledClients(options)\n if (candidates.length === 0) throw noInstalledClientsError()\n return promptForInstalledClient(candidates, options.io ?? defaultPromptIo())\n}\n\nfunction noInstalledClientsError(): ConnectError {\n return new ConnectError(\n 'runtime_no_installed_clients',\n 'Could not determine the agent runtime: nothing was detected in this environment, and no agent client Haven can configure is installed on this machine. ' +\n 'Re-run with --runtime <name> naming the client you want configured, or --runtime other to store credentials and finish the MCP setup by hand.',\n 'rerun_connect_with_explicit_runtime',\n )\n}\n\nfunction promptAbortedError(reason: string): ConnectError {\n return new ConnectError(\n 'runtime_prompt_aborted',\n `Runtime not chosen (${reason}). Nothing was written: no agent was created, no credentials were stored, and the Haven setup token is still unused. ` +\n 'Run the setup command again, or pass --runtime <name> to skip the prompt.',\n 'rerun_connect_and_choose_a_runtime',\n )\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nfunction defaultPromptIo(): PromptIo {\n return {\n write: (text) => process.stdout.write(text),\n question: (query) =>\n new Promise<string | null>((resolvePromise) => {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n let settled = false\n const settle = (value: string | null) => {\n if (settled) return\n settled = true\n rl.close()\n resolvePromise(value)\n }\n // Without an explicit SIGINT listener readline's Ctrl-C behaviour\n // depends on the host; with one, Ctrl-C is an abort we report as such\n // and exit non-zero from, having written nothing.\n rl.once('SIGINT', () => settle(null))\n rl.once('close', () => settle(null))\n rl.question(query, (answer) => settle(answer))\n }),\n }\n}\n","import { CONNECTOR_VERSION, type ConnectOptions } from './runtime.js'\nimport { assertValidServerSlug } from './server-names.js'\n\nexport interface ParsedCli {\n options: ConnectOptions\n help: boolean\n json: boolean\n /** #1589: diagnosis mode — no setup token required. */\n doctor: boolean\n repair: boolean\n /** #1681: retire an agent credential directory in place — no token required. */\n tombstone?: { directory: string; reason?: string; replacedBy?: string }\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 let doctor = false\n let repair = false\n let tombstoneDir: string | undefined\n let tombstoneReason: string | undefined\n let tombstoneReplacedBy: string | undefined\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 === '--doctor') {\n doctor = true\n } else if (arg === '--repair') {\n repair = true\n } else if (arg === '--tombstone') {\n tombstoneDir = requireValue(argv, ++i, arg)\n } else if (arg === '--reason') {\n tombstoneReason = requireValue(argv, ++i, arg)\n } else if (arg === '--replaced-by') {\n tombstoneReplacedBy = requireValue(argv, ++i, arg)\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 === '--runtime-force') {\n options.runtimeForce = requireValue(argv, ++i, arg)\n } else if (arg === '--credentials-dir') {\n options.credentialsDir = requireValue(argv, ++i, arg)\n } else if (arg === '--name') {\n // Validated HERE, before any credential or config write can happen —\n // the slug is immutable once wired (#1694 owner decision), so a bad one\n // must die at the argument, not after files exist.\n options.serverName = requireValue(argv, ++i, arg)\n assertValidServerSlug(options.serverName)\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 const tombstone = tombstoneDir\n ? { directory: tombstoneDir, reason: tombstoneReason, replacedBy: tombstoneReplacedBy }\n : undefined\n\n if (help) {\n return { options: options as ConnectOptions, help, json, doctor, repair, tombstone }\n }\n\n if (!tombstoneDir && (tombstoneReason !== undefined || tombstoneReplacedBy !== undefined)) {\n // Refuse rather than silently discard — the caller believed these did\n // something. (#1681 review, finding 2)\n throw new Error('--reason and --replaced-by require --tombstone <dir>.')\n }\n\n if (tombstone) {\n // Retirement reuses STORED state, like --doctor — no token, no runtime.\n return { options: options as ConnectOptions, help, json, doctor, repair, tombstone }\n }\n\n if (doctor || repair) {\n // Diagnosis/repair reuse STORED credentials — a setup token is exactly\n // what they exist to avoid needing.\n if (!options.runtime) {\n throw new Error('--doctor/--repair need --runtime <runtime> (which config to examine).')\n }\n return { options: options as ConnectOptions, help, json, doctor, repair, tombstone }\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, doctor, repair, tombstone }\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',\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 ' Usually unnecessary: the connector detects the runtime it runs inside, and a detection',\n ' that contradicts this hint wins (with a printed notice). When nothing is detected, an',\n ' interactive terminal is offered the agent clients installed on this machine; this flag is',\n ' how an agent, or a non-interactive run, answers instead. An unknown name is refused, never guessed.',\n ' --runtime-force <name> Escape hatch: use exactly this runtime, ignoring environment detection.',\n ' --credentials-dir <path> Credential directory fallback. Defaults to ~/.haven/agents.',\n ' --environment-label <text> Non-sensitive label shown in Haven setup review.',\n ' --name <slug> Wiring slug for a NAMED agent: writes haven-<slug> / haven-signer-<slug>',\n ' MCP entries and stores credentials at ~/.haven/agents/<slug>/, so several',\n ' agents can run side by side in one runtime. 1-32 lowercase letters, digits,',\n ' single hyphens; immutable once wired. Omit for the bare haven / haven-signer pair.',\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 ' --doctor Diagnose an existing setup (read-only, no token): config, credentials,',\n ' signer runtime, hosted MCP, and a live signer handshake. Exits non-zero on any failure.',\n ' --repair Repair, then re-diagnose (implies --doctor): reinstall the pinned signer',\n ' runtime, rewrite the wrapper and runtime config from stored credentials.',\n ' Hosted topology only (refuses to touch a --local config). No keys, no token.',\n ' --tombstone <dir> Retire an agent credential directory in place (no token): replaces its signer',\n ' wrapper with a diagnostic that names the retirement in MCP stderr logs, and',\n ' writes TOMBSTONE.json. Touches NO key material and revokes nothing.',\n ' --reason <text> Reason recorded in the tombstone (with --tombstone).',\n ' --replaced-by <agent-id> Successor agent recorded in the tombstone (with --tombstone).',\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 if (parsed.tombstone) {\n // #1681: retire a credential directory in place. Reads the stored\n // identity for the agent id, replaces the wrapper with a truth-telling\n // tombstone, touches NO key material, and tells the user what the\n // tombstone cannot do for them: restart every long-lived host.\n const { writeAgentTombstone } = await import('./tombstone.js')\n const { readFile } = await import('node:fs/promises')\n const { join } = await import('node:path')\n try {\n let agentId = 'unknown'\n try {\n const identity = JSON.parse(\n await readFile(join(parsed.tombstone.directory, 'identity.json'), 'utf8'),\n ) as { agent_id?: string }\n agentId = identity.agent_id ?? 'unknown'\n } catch {\n // A directory whose identity no longer parses can still be retired —\n // the tombstone then names it as unknown, which is honest.\n }\n const info = await writeAgentTombstone({\n directory: parsed.tombstone.directory,\n agentId,\n reason: parsed.tombstone.reason ?? 'retired by operator via --tombstone',\n replacedBy: parsed.tombstone.replacedBy,\n })\n if (parsed.json) {\n io.stdout(`${redactSecrets(JSON.stringify({ tombstoned: true, ...info }))}\\n`)\n } else {\n io.stdout(redactSecrets(`Tombstoned agent ${info.agent_id} at ${parsed.tombstone.directory}.\\n`))\n io.stdout(\n 'Key files were NOT touched and nothing was revoked — revoke the agent on the Haven ' +\n 'agent page if you have not already.\\n',\n )\n io.stdout(\n 'Restart EVERY long-lived MCP host (gateway, TUI workers, editors): each holds the ' +\n 'wiring snapshot from its own start time, and the tombstone only speaks when a stale ' +\n 'host next probes the old path.\\n',\n )\n }\n return 0\n } catch (err) {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n return 1\n }\n }\n if (parsed.doctor || parsed.repair) {\n const { runDoctor, runRepair } = await import('./doctor.js')\n const runtime = parsed.options.runtime ?? ''\n const credentialsDir = parsed.options.credentialsDir\n try {\n if (parsed.repair) {\n const repair = await runRepair({ runtime, credentialsDir })\n for (const message of repair.messages) io.stderr(`${redactSecrets(message)}\\n`)\n if (!repair.ok) return 1\n }\n const report = await runDoctor({ runtime, credentialsDir })\n // Defensively redacted like every other output path — the report is\n // secret-free by construction, but signerCapabilities is untrusted\n // process output and belts are cheap (#1589 review).\n if (parsed.json) {\n io.stdout(`${redactSecrets(JSON.stringify(report))}\\n`)\n } else {\n for (const check of report.checks) {\n io.stdout(redactSecrets(`${check.ok ? '✓' : '✗'} ${check.label}: ${check.detail}\\n`))\n if (check.repair) io.stdout(redactSecrets(` ↳ repair: ${check.repair}\\n`))\n }\n // #1697: the other agents on this machine. The flat list above\n // describes ONE agent; multi-agent means the rest still have to be\n // accounted for, by name and by verdict, never silently dropped.\n const otherAgents = report.agents.filter((agent) => agent.directory !== report.credentialDirectory)\n if (otherAgents.length > 0) {\n io.stdout('\\nOther agents on this machine:\\n')\n for (const agent of otherAgents) {\n const name = agent.slug ? `${agent.slug} (${agent.agentId ?? 'unknown'})` : agent.agentId ?? 'unknown'\n const failed = agent.checks.filter((check) => !check.ok)\n const verdict = agent.classification === 'wired'\n ? failed.length === 0 ? 'wired, all checks passed' : `wired, ${failed.length} check(s) FAILED`\n : agent.classification\n io.stdout(redactSecrets(` ${failed.length > 0 ? '✗' : '•'} ${name}: ${verdict}\\n`))\n for (const check of failed) {\n io.stdout(redactSecrets(` ✗ ${check.label}: ${check.detail}\\n`))\n if (check.repair) io.stdout(redactSecrets(` ↳ repair: ${check.repair}\\n`))\n }\n }\n }\n io.stdout(report.ok ? 'All checks passed.\\n' : 'One or more checks FAILED — see repairs above.\\n')\n }\n return report.ok ? 0 : 1\n } catch (err) {\n io.stderr(`${redactSecrets(err instanceof Error ? err.message : String(err))}\\n`)\n return 1\n }\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 {\n ...parsed.options,\n waitForApproval: !parsed.json,\n // #1719: only a human-facing run may be asked which installed client to\n // configure. --json is the automation contract — it must fail with a\n // machine-readable code, never block on stdin. runConnect additionally\n // requires a real TTY before it prompts.\n interactive: !parsed.json,\n },\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"]}