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