@ai-sdk/harness-acp 1.0.30 → 1.0.32
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/CHANGELOG.md +25 -0
- package/README.md +11 -0
- package/dist/bridge/host-tool-mcp.mjs +1 -1
- package/dist/bridge/index.mjs +94 -30
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/bridge/package.json +2 -2
- package/dist/bridge/pnpm-lock.yaml +57 -55
- package/dist/index.d.ts +26 -2
- package/dist/index.js +121 -104
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/acp-harness.ts +9 -2
- package/src/index.ts +1 -0
- package/src/v1/acp-v1-bridge-protocol.ts +27 -6
- package/src/v1/acp-v1-harness.ts +85 -47
- package/src/v1/acp-v1-lifecycle.ts +1 -29
- package/src/v1/acp-v1-prompt.ts +1 -1
- package/src/v1/acp-v1-settings.ts +20 -1
- package/src/v1/acp-v1-skills.ts +15 -56
- package/src/v1/acp-v1-turn-start-config.ts +7 -3
- package/src/v1/bridge/acp-v1-bridge-environment.ts +4 -0
- package/src/v1/bridge/index.ts +16 -5
- package/src/v1/bridge/model-mapping.ts +35 -0
- package/src/v1/bridge/package.json +2 -2
- package/src/v1/bridge/pnpm-lock.yaml +57 -55
- package/src/v1/bridge/protocol-configuration.ts +6 -2
- package/src/v1/implementation.ts +8 -0
- package/src/v1/index.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/v1/bridge/index.ts","../../src/v1/bridge/acp-v1-bridge-environment.ts","../../src/v1/bridge/profile-values.ts","../../src/v1/bridge/protocol-configuration.ts","../../src/v1/bridge/acp-stream-capture.ts","../../src/v1/bridge/acp-diagnostics.ts","../../src/v1/bridge/agent-stderr-monitor.ts","../../src/v1/bridge/stream-translator.ts","../../src/v1/bridge/host-tool-correlation.ts","../../src/v1/bridge/create-emit-stream-event.ts","../../src/v1/bridge/instruction-mapping.ts","../../src/v1/bridge/host-tool-relay.ts","../../src/v1/bridge/refresh-host-tool-catalog.ts","../../src/v1/bridge/permission-controller.ts","../../src/v1/bridge/permission-mode.ts","../../src/v1/bridge/recovered-session.ts","../../src/v1/bridge/session-lifecycle.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, the in-memory event log +\n// monotonic `seq`, resume replay, and the lifecycle/meta files. Any number of\n// hosts may be connected; exactly one of them owns the event stream, and\n// `start`/`resume` transfer that ownership. The adapter supplies only `onStart`\n// (drive its CLI/SDK and translate to wire events) and lifecycle cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport { HarnessBridgeCapabilityUnsupportedError } from './harness-bridge-capability-unsupported-error';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface Experimental_BridgeUserMessage {\n readonly messageId: string;\n readonly text: string;\n accept(): void;\n reject(error: unknown): void;\n}\n\nexport interface Experimental_BridgeUserMessageQueue extends AsyncIterable<Experimental_BridgeUserMessage> {\n readonly pendingCount: number;\n close(error?: unknown): void;\n}\n\ntype InternalBridgeUserMessageQueue = Experimental_BridgeUserMessageQueue & {\n enqueue(input: { messageId: string; text: string }): void;\n};\n\ntype BridgeUserMessageResponse = {\n type: 'user-message-response';\n messageId: string;\n accepted: boolean;\n error?: { message: string };\n};\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n if (typeof err === 'string') {\n return { message: err };\n }\n if (err !== null && typeof err === 'object') {\n try {\n return { message: JSON.stringify(err) };\n } catch {}\n }\n return { message: String(err) };\n}\n\nfunction createBridgeUserMessageQueue(options: {\n respond(response: BridgeUserMessageResponse): void;\n}): InternalBridgeUserMessageQueue {\n const messages: Experimental_BridgeUserMessage[] = [];\n const waiters: Array<\n (result: IteratorResult<Experimental_BridgeUserMessage>) => void\n > = [];\n const entries = new Map<\n string,\n {\n response?: BridgeUserMessageResponse;\n reject(error: unknown): void;\n }\n >();\n let closed = false;\n let pendingCount = 0;\n\n const enqueue = (input: { messageId: string; text: string }): void => {\n const existing = entries.get(input.messageId);\n if (existing != null) {\n if (existing.response != null) {\n options.respond(existing.response);\n }\n return;\n }\n\n let settled = false;\n const settle = (response: BridgeUserMessageResponse): void => {\n if (settled) return;\n settled = true;\n pendingCount--;\n const entry = entries.get(input.messageId);\n if (entry != null) entry.response = response;\n options.respond(response);\n };\n const message: Experimental_BridgeUserMessage = {\n messageId: input.messageId,\n text: input.text,\n accept: () => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: true,\n });\n },\n reject: error => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: false,\n error: { message: formatBridgeError(error).message },\n });\n },\n };\n entries.set(input.messageId, {\n reject: message.reject,\n });\n pendingCount++;\n\n if (closed) {\n message.reject(\n new Error('The bridge turn is no longer accepting user messages.'),\n );\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter != null) {\n waiter({ done: false, value: message });\n } else {\n messages.push(message);\n }\n };\n\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n const reason =\n error ??\n new Error('The bridge turn ended before accepting the user message.');\n for (const entry of entries.values()) {\n if (entry.response == null) entry.reject(reason);\n }\n messages.length = 0;\n while (waiters.length > 0) {\n waiters.shift()!({ done: true, value: undefined });\n }\n };\n\n return {\n get pendingCount() {\n return pendingCount;\n },\n enqueue,\n close,\n [Symbol.asyncIterator]() {\n return {\n next: () => {\n const message = messages.shift();\n if (message != null) {\n return Promise.resolve({ done: false as const, value: message });\n }\n if (closed) {\n return Promise.resolve({\n done: true as const,\n value: undefined,\n });\n }\n return new Promise<IteratorResult<Experimental_BridgeUserMessage>>(\n resolve => {\n waiters.push(resolve);\n },\n );\n },\n };\n },\n };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n toolCallId: string,\n ): Promise<{ output: unknown; isError?: boolean }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n readonly experimental_userMessages: Experimental_BridgeUserMessageQueue;\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n\n /**\n * Emit a non-fatal bridge warning to stderr using the runtime's harness\n * prefix. This is diagnostic-only: it does not emit a stream event, does not\n * consume a `seq`, and does not fail the turn.\n */\n emitWarning(input: { message: string }): void;\n\n emitError(input: { error: unknown; message?: string }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /** Drive one prompt turn. Rejections surface to the host as an `error` event. */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /**\n * Produce the adapter-defined runtime resume data for `stop`. Defaults to\n * `{}`.\n */\n onStop?(): unknown | Promise<unknown>;\n /**\n * Perform adapter-defined destruction before the bridge exits.\n */\n onDestroy?(): void | Promise<void>;\n /** WS port. Defaults to `BRIDGE_WS_PORT` env (0 = OS-assigned). */\n port?: number;\n /** Auth token. Defaults to `BRIDGE_CHANNEL_TOKEN` env. */\n token?: string;\n /** Called with the bound port once the server is listening. */\n onListening?(port: number): void;\n /**\n * Tear the process down after `stop` / `destroy`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; messageId?: string; text: string }\n | { type: 'abort' }\n | { type: 'stop' }\n | { type: 'destroy' }\n | { type: 'resume'; lastSeenEventId: number };\n\nconst WS_OPEN = 1;\n\n/**\n * Boot the bridge: bind the WebSocket server, announce `bridge-ready`, and\n * service host connections for the lifetime of the process. Resolves once the\n * server is listening; the process then stays alive on the server until a\n * `stop` / `destroy` exits it.\n */\nexport interface BridgeHandle {\n /** The port the WebSocket server bound to. */\n readonly port: number;\n /** Close the WebSocket server. Does not call `process.exit`. */\n close(): Promise<void>;\n}\n\nexport async function runBridge<TStart extends { type: 'start' }>(\n options: RunBridgeOptions<TStart>,\n): Promise<BridgeHandle> {\n const { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n /*\n * The one connection turn events stream to. A socket claims it by asking for\n * work — `start` (a turn) or `resume` (a catch-up) — never by connecting:\n * every event goes here alone, so claiming on connect would silence a turn\n * already streaming to someone else. Any number of sockets may be connected;\n * the others still exchange control frames, they just get no events.\n */\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: InternalBridgeUserMessageQueue | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the in-flight turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n (output: { output: unknown; isError?: boolean }) => void\n >();\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(line);\n } catch {\n // Send is best-effort: a dropped socket leaves the event in the log,\n // replayed once the host reconnects and sends `resume`.\n }\n }\n };\n\n const replay = (ws: WebSocket, afterSeq: number): void => {\n for (const entry of eventLog) {\n if (entry.seq > afterSeq && ws.readyState === WS_OPEN) {\n ws.send(entry.line);\n }\n }\n };\n\n // ─── diagnostics ──────────────────────────────────────────────\n const shouldEmitDebugEvent = (\n level: BridgeDebugLevel,\n subsystem: string,\n ): boolean => {\n if (!debugConfig?.enabled) return false;\n const threshold = debugConfig.level ?? 'debug';\n if (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n return subsystemMatches(debugConfig.subsystems, subsystem);\n };\n\n /*\n * Forward sandbox console output. We line-buffer the original writers (kept so\n * output still reaches the real fds) and emit one `sandbox-log` per complete\n * line. `emit` never writes to stdout/stderr, so there is no recursion.\n * Installed lazily the first time a turn enables diagnostics; once installed,\n * capture is gated per-write on `debugConfig.enabled` so a later turn can\n * disable it. Console capture is independent of the subsystem/level filter.\n */\n const rawStdoutWrite = process.stdout.write.bind(process.stdout);\n const rawStderrWrite = process.stderr.write.bind(process.stderr);\n\n const writeErrorToStderr = (input: {\n message: string;\n error: unknown;\n }): void => {\n try {\n const formatted = formatBridgeError(input.error);\n rawStderrWrite(\n `[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`,\n );\n if (formatted.stack) {\n rawStderrWrite(`${formatted.stack}\\n`);\n }\n } catch {}\n };\n\n const emitWarning = (input: { message: string }): void => {\n try {\n for (const line of input.message.split('\\n')) {\n if (line.trim().length > 0) {\n rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n }\n }\n } catch {}\n };\n\n const emitError = (input: { error: unknown; message?: string }): void => {\n writeErrorToStderr({\n message: input.message ?? 'bridge error',\n error: input.error,\n });\n emit({ type: 'error', error: serialiseError(input.error) });\n };\n\n const installConsoleCapture = (): void => {\n if (consoleCaptureInstalled) return;\n consoleCaptureInstalled = true;\n const buffers: { stdout: string; stderr: string } = {\n stdout: '',\n stderr: '',\n };\n const patch =\n (stream: 'stdout' | 'stderr', raw: typeof process.stdout.write) =>\n (chunk: unknown, encoding?: unknown, cb?: unknown): boolean => {\n if (debugConfig?.enabled) {\n try {\n const enc = typeof encoding === 'string' ? encoding : 'utf8';\n const text =\n typeof chunk === 'string'\n ? chunk\n : Buffer.from(chunk as Uint8Array).toString(\n enc as BufferEncoding,\n );\n const combined = buffers[stream] + text.replace(/\\r\\n/g, '\\n');\n const parts = combined.split('\\n');\n buffers[stream] = parts.pop() ?? '';\n for (const line of parts) {\n const trimmed = line.replace(/\\s+$/, '');\n if (trimmed) {\n emit({\n type: 'sandbox-log',\n source: bridgeType,\n stream,\n line: trimmed,\n });\n }\n }\n } catch {\n // Never let capture break real output.\n }\n }\n return (raw as (c: unknown, e?: unknown, cb?: unknown) => boolean)(\n chunk,\n encoding,\n cb,\n );\n };\n process.stdout.write = patch(\n 'stdout',\n rawStdoutWrite,\n ) as typeof process.stdout.write;\n process.stderr.write = patch(\n 'stderr',\n rawStderrWrite,\n ) as typeof process.stderr.write;\n };\n\n // ─── inbound routing ────────────────────────────────────────────────\n const handleInbound = async (\n msg: TStart | InboundControl,\n ws: WebSocket,\n ): Promise<void> => {\n switch (msg.type) {\n case 'start': {\n activeSocket = ws; // asking for a turn claims the event stream\n currentUserMessages?.close(\n new Error('A new bridge turn replaced the active turn.'),\n );\n const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const userMessages = createBridgeUserMessageQueue({ respond: emit });\n const turn: BridgeTurn = {\n emit,\n requestToolResult: toolCallId =>\n new Promise(resolve => {\n pendingToolResults.set(toolCallId, resolve);\n }),\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n experimental_userMessages: userMessages,\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n emitWarning,\n emitError,\n };\n currentUserMessages = userMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\n userMessages.close();\n if (currentUserMessages === userMessages) {\n currentUserMessages = undefined;\n }\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n return;\n }\n case 'tool-result': {\n const resolver = pendingToolResults.get(msg.toolCallId);\n if (resolver) {\n pendingToolResults.delete(msg.toolCallId);\n resolver({ output: msg.output, isError: msg.isError });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message': {\n const messageId = msg.messageId ?? randomUUID();\n if (currentUserMessages == null) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: { message: 'The bridge has no active turn to steer.' },\n });\n return;\n }\n if (ws !== activeSocket) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: {\n message: 'The connection does not own the active bridge turn.',\n },\n });\n return;\n }\n currentUserMessages.enqueue({\n messageId,\n text: msg.text,\n });\n return;\n }\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n activeSocket = ws; // asking for a catch-up claims it too\n // Synchronous, so no event can slip out live ahead of the replayed tail.\n replay(ws, msg.lastSeenEventId);\n return;\n case 'destroy':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n await onDestroy?.();\n drainThenExit(ws, 1000, 'destroy');\n return;\n case 'stop': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onStop?.()) ?? {};\n sendControl(ws, { type: 'bridge-stop', data });\n drainThenExit(ws, 1000, 'stop');\n return;\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean stop/destroy leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl(ws, {\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n capabilities: { experimental_userMessageResponses: true },\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl(ws, {\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the stream owner's close matters; a socket that never claimed it,\n // or that a later `start`/`resume` displaced, closes as a no-op.\n // Crucially we do NOT abort the in-flight turn: it keeps running and its\n // events accumulate in the log for replay on reconnect.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\n });\n\n ws.on('error', () => {\n // 'close' follows; nothing to do beyond keeping the process alive.\n });\n });\n\n // Surface bridge-internal crashes to the host instead of dying silently.\n process.on('uncaughtException', err => {\n emitError({ error: err, message: 'uncaught exception' });\n });\n process.on('unhandledRejection', err => {\n emitError({ error: err, message: 'unhandled rejection' });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\n/*\n * Control frames answer the socket that sent the frame they reply to, so the\n * target is always explicit. Event streaming is the separate, stateful path\n * (`emit` → `activeSocket`); this one carries no state at all.\n */\nfunction sendControl(\n socket: WebSocket | undefined,\n message: Record<string, unknown>,\n): void {\n if (socket?.readyState === WS_OPEN) {\n try {\n socket.send(JSON.stringify(message));\n } catch {\n // best-effort\n }\n }\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","const name = 'AI_HarnessBridgeCapabilityUnsupportedError';\n\n/**\n * Signals an unsupported capability discovered inside a sandbox bridge.\n * `isInstance` also recognizes the serialized error shape received by the\n * host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n */\nexport class HarnessBridgeCapabilityUnsupportedError extends Error {\n readonly harnessId?: string;\n readonly cause?: unknown;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super(message);\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n this.cause = cause;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessBridgeCapabilityUnsupportedError {\n return (\n error != null &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === name &&\n 'message' in error &&\n typeof error.message === 'string'\n );\n }\n}\n","import {\n HarnessBridgeCapabilityUnsupportedError,\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { Readable, Writable } from 'node:stream';\nimport { argv, env as processEnv } from 'node:process';\nimport {\n ACP_BRIDGE_CONFIGURATION_ENV,\n readACPBridgeEnvironment,\n} from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { StartMessage } from '../acp-v1-bridge-protocol';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport type { ACPGatewayValues } from './profile-values';\nimport {\n assertACPAuthenticationMethod,\n createACPInitializeRequest,\n resolveACPLaunchEnvironment,\n validateACPProtocolVersion,\n type ACPInitializeResult,\n} from './protocol-configuration';\nimport { captureACPStream, type ACPStreamCapture } from './acp-stream-capture';\nimport {\n createACPBridgeError,\n createACPInitializationDiagnostic,\n} from './acp-diagnostics';\nimport { monitorACPAgentStderr } from './agent-stderr-monitor';\nimport { createEmitStreamEvent } from './create-emit-stream-event';\nimport { resolveACPInstructionConfiguration } from './instruction-mapping';\nimport {\n startHostToolRelay,\n type HostToolRelay,\n type HostToolRelayTurn,\n} from './host-tool-relay';\nimport {\n promptAndRefreshInitialHostToolCatalog,\n refreshHostToolCatalog,\n} from './refresh-host-tool-catalog';\nimport { createACPPermissionController } from './permission-controller';\nimport { configureACPPermissionMode } from './permission-mode';\nimport {\n assertACPResumeCapability,\n createACPRecoveredSession,\n createACPRecoveredSessionUpdates,\n type ACPActiveSession,\n} from './recovered-session';\nimport {\n restoreACPBridgeSession,\n type ACPSessionRestorationMethod,\n} from './session-lifecycle';\n\ntype ImplementationDescriptor = {\n readonly executablePath: string;\n readonly privateHome: boolean;\n readonly args: ReadonlyArray<string>;\n readonly envKeys: ReadonlyArray<string>;\n};\n\nconst HOST_TOOL_MCP_SERVER_NAME = 'ai-sdk-harness-tools';\nconst CATALOG_REFRESH_TIMEOUT_MS = 10_000;\n\nconst args = parseArgs({ args: argv.slice(2) });\nconst workDir = requireArg({ value: args.workDir, name: '--workdir' });\nconst bridgeStateDir = requireArg({\n value: args.bridgeStateDir,\n name: '--bridge-state-dir',\n});\nconst implementationDir = requireArg({\n value: args.implementationDir,\n name: '--implementation-dir',\n});\nconst bridgeType = requireArg({\n value: args.bridgeType,\n name: '--bridge-type',\n});\nconst implementation = await readImplementationDescriptor({\n path: `${implementationDir}/implementation.json`,\n});\nconst bridgeConfiguration = await readACPBridgeEnvironment({ env: processEnv });\n\nlet child: ChildProcessWithoutNullStreams | undefined;\nlet agentResponseStreamFailure: Promise<never> | undefined;\nlet connection: acp.ClientConnection | undefined;\nlet session: ACPActiveSession | undefined;\nlet recoveredSessionUpdates:\n | ReturnType<typeof createACPRecoveredSessionUpdates>\n | undefined;\nlet recoveredSessionId: string | undefined;\nlet sessionConfigurationFingerprint: string | undefined;\nlet streamCapture: ACPStreamCapture | undefined;\nlet initializationDiagnostic: Record<string, unknown> | undefined;\nlet hostToolRelay: HostToolRelay | undefined;\nlet catalogRefreshError: HarnessBridgeCapabilityUnsupportedError | undefined;\nlet sessionConfigurationFailure: { readonly error: unknown } | undefined;\nlet historicalUpdatesSuppressed = false;\nlet coldRestorationMethod: ACPSessionRestorationMethod | undefined;\nlet activePermissionController:\n | ReturnType<typeof createACPPermissionController>\n | undefined;\n\nawait runBridge<StartMessage>({\n bridgeType,\n bridgeStateDir,\n onStart: runTurn,\n onStop: () => (session == null ? {} : { sessionId: session.sessionId }),\n onExit: () => {\n let exited = false;\n const finish = () => {\n if (exited) return;\n exited = true;\n session?.dispose();\n connection?.close();\n child?.kill();\n process.exit(0);\n };\n if (hostToolRelay == null) {\n finish();\n return;\n }\n const timer = setTimeout(finish, 1000);\n timer.unref();\n void hostToolRelay.close().finally(() => {\n clearTimeout(timer);\n finish();\n });\n },\n});\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n let initialHostToolCatalogRefreshRequired: boolean;\n try {\n ({ initialHostToolCatalogRefreshRequired } = await ensureSession({\n start,\n turn,\n }));\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) throw error;\n throw createACPBridgeError({\n stage: 'session initialization',\n cause: error,\n });\n }\n const activeSession = session;\n if (activeSession == null) {\n throw new Error('ACP session initialization did not produce a session.');\n }\n const activeAgentResponseStreamFailure = agentResponseStreamFailure;\n if (activeAgentResponseStreamFailure == null) {\n throw new Error(\n 'ACP session initialization did not start stderr monitoring.',\n );\n }\n const activeHostToolRelay = hostToolRelay;\n if (activeHostToolRelay == null) {\n throw new Error('The host tool MCP relay is unavailable.');\n }\n if (start.recoveryMode?.type === 'lossy-rerun') {\n const marker = {\n type: 'acp-recovery',\n mode: 'lossy-rerun',\n reason: start.recoveryMode.reason,\n } as const;\n turn.emit({ type: 'raw', rawValue: marker });\n turn.bridgeLog({\n level: 'warn',\n subsystem: 'acp.recovery',\n message:\n 'The ACP process was replaced; the original prompt is being rerun against the resumed ACP session.',\n attrs: marker,\n });\n turn.emitWarning({\n message:\n 'ACP process-loss recovery is rerunning the interrupted prompt and may repeat work.',\n });\n }\n turn.emit({\n type: 'bridge-thread',\n threadId: activeSession.sessionId,\n });\n if (initializationDiagnostic != null) {\n turn.bridgeLog({\n level: 'info',\n subsystem: 'acp.protocol',\n message: 'ACP session initialized.',\n attrs: initializationDiagnostic,\n });\n }\n if (start.recoveryMode?.type === 'cold-restore') {\n const marker = {\n type: 'acp-session-restored',\n method: coldRestorationMethod,\n } as const;\n turn.emit({ type: 'raw', rawValue: marker });\n turn.bridgeLog({\n level: 'info',\n subsystem: 'acp.lifecycle',\n message: 'ACP session restored in a replacement bridge process.',\n attrs: marker,\n });\n turn.emit({\n type: 'finish',\n finishReason: {\n unified: 'stop',\n raw: 'acp-session-restored',\n },\n totalUsage: unknownUsage(),\n });\n return;\n }\n\n let rejectCancellationFailure!: (error: unknown) => void;\n const cancellationFailure = new Promise<never>((_, reject) => {\n rejectCancellationFailure = reject;\n });\n void cancellationFailure.catch(() => {});\n let cancellationRequested = false;\n let cancellationFailureError: Error | undefined;\n const cancel = async () => {\n if (cancellationRequested) return;\n cancellationRequested = true;\n activePermissionController?.cancelAll();\n try {\n if (connection == null) {\n throw new Error('ACP connection closed before cancellation.');\n }\n await connection.agent.notify(acp.methods.agent.session.cancel, {\n sessionId: activeSession.sessionId,\n });\n } catch (error) {\n cancellationFailureError = createACPBridgeError({\n stage: 'session cancellation',\n cause: error,\n });\n rejectCancellationFailure(cancellationFailureError);\n }\n };\n turn.emit({ type: 'stream-start' });\n const emitStreamEvent = createEmitStreamEvent({\n emit: event => turn.emit(event as BridgeEvent),\n emitToolCallCandidate: ({ toolCall }) => {\n turn.emit({\n type: 'acp-tool-call-candidate',\n toolCall,\n });\n },\n builtinTools: start.builtinTools,\n hostToolServerName: HOST_TOOL_MCP_SERVER_NAME,\n hostTools: start.tools ?? [],\n });\n const permissionController = createACPPermissionController({\n turn,\n sessionId: activeSession.sessionId,\n permissionMode: start.permissionMode ?? 'allow-all',\n hasPermissionModeMapping: start.permissionModeMapping != null,\n emitToolCall: emitStreamEvent.permissionToolCall,\n claimHostToolPermission: emitStreamEvent.claimHostToolPermission,\n });\n activePermissionController = permissionController;\n const relayTurn: HostToolRelayTurn = {\n emitToolCall: emitStreamEvent.hostToolCall,\n emitToolResult: emitStreamEvent.hostToolResult,\n requestToolResult: toolCallId => turn.requestToolResult(toolCallId),\n registerCorrelationInvocation:\n emitStreamEvent.registerHostToolCorrelationInvocation,\n removeCorrelationInvocation:\n emitStreamEvent.removeHostToolCorrelationInvocation,\n };\n activeHostToolRelay.bindTurn({ turn: relayTurn });\n try {\n const promptMeta = createOutputSchemaPromptMeta({ start });\n const startPrompt = () =>\n promptActiveSession({\n session: activeSession,\n agent: connection!.agent,\n prompt: start.prompt,\n meta: promptMeta,\n });\n if (initialHostToolCatalogRefreshRequired) {\n try {\n await promptAndRefreshInitialHostToolCatalog({\n startPrompt,\n relay: activeHostToolRelay,\n tools: start.tools ?? [],\n harnessId: bridgeType,\n timeoutMs: CATALOG_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n sessionConfigurationFailure = { error };\n throw error;\n }\n } else {\n void startPrompt();\n }\n if (turn.abortSignal.aborted) {\n await cancel();\n } else {\n turn.abortSignal.addEventListener('abort', () => void cancel(), {\n once: true,\n });\n }\n for (;;) {\n let message: acp.ActiveSessionMessage;\n try {\n message = await Promise.race([\n activeSession.nextUpdate(),\n cancellationFailure,\n activeAgentResponseStreamFailure,\n ]);\n } catch (error) {\n for (const rawValue of streamCapture?.drainRawValues() ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n emitStreamEvent.close();\n if (error === cancellationFailureError) throw error;\n throw createACPBridgeError({\n stage: 'prompt update stream',\n cause: error,\n });\n }\n if (message.kind === 'session_update') {\n const captured = streamCapture?.takeForUpdate({\n update: message.update,\n });\n for (const rawValue of captured?.precedingRawValues ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n emitStreamEvent.message({\n message,\n rawUpdate: captured?.rawUpdate,\n });\n continue;\n }\n for (const rawValue of streamCapture?.drainRawValues() ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n if (emitStreamEvent.message({ message })) return;\n }\n } finally {\n permissionController.cancelAll();\n activePermissionController = undefined;\n activeHostToolRelay.unbindTurn({ turn: relayTurn });\n }\n}\n\nasync function ensureSession({\n start,\n turn,\n}: {\n start: StartMessage;\n turn: BridgeTurn;\n}): Promise<{ initialHostToolCatalogRefreshRequired: boolean }> {\n if (sessionConfigurationFailure != null) {\n throw sessionConfigurationFailure.error;\n }\n const fingerprint = JSON.stringify({\n authentication: bridgeConfiguration.authentication,\n providerAuthentication: bridgeConfiguration.providerAuthentication,\n providerEnvironment: bridgeConfiguration.providerEnvironment,\n sessionMeta: bridgeConfiguration.sessionMeta,\n instructionMapping: start.instructionMapping,\n permissionMode: start.permissionMode,\n permissionModeMapping: start.permissionModeMapping,\n mcpServers: start.mcpServers,\n });\n if (session != null) {\n if (catalogRefreshError != null) throw catalogRefreshError;\n if (sessionConfigurationFingerprint !== fingerprint) {\n throw new Error(\n 'ACP authentication and session profile settings cannot change after the ACP session has started.',\n );\n }\n const relay = hostToolRelay;\n if (relay == null) {\n throw new Error('The host tool MCP relay is unavailable.');\n }\n try {\n await refreshHostToolCatalog({\n relay,\n tools: start.tools ?? [],\n harnessId: bridgeType,\n timeoutMs: CATALOG_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n throw error;\n }\n return { initialHostToolCatalogRefreshRequired: false };\n }\n\n const clientApp = resolveClientApp();\n const authentication = bridgeConfiguration.authentication;\n const launchEnv =\n bridgeConfiguration.providerEnvironment ??\n resolveACPLaunchEnvironment({\n providerAuthentication: bridgeConfiguration.providerAuthentication,\n gateway:\n bridgeConfiguration.providerAuthentication?.type === 'ai-gateway'\n ? resolveGatewayValues({ clientApp })\n : undefined,\n });\n const instructionConfiguration = await resolveACPInstructionConfiguration({\n instructions: start.instructions,\n instructionMapping: start.instructionMapping,\n sessionMeta: bridgeConfiguration.sessionMeta,\n environment: createChildEnvironment({\n launchEnv,\n implementationDir,\n privateHome: implementation.privateHome,\n }),\n });\n child = spawn(\n `${implementationDir}/${implementation.executablePath}`,\n [...implementation.args],\n {\n cwd: workDir,\n env: instructionConfiguration.environment,\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n agentResponseStreamFailure = monitorACPAgentStderr({\n stderr: child.stderr,\n onStderrLine: line => {\n turn.bridgeLog({\n level: 'warn',\n subsystem: 'acp.agent.stderr',\n message: line,\n });\n },\n });\n\n const input = Writable.toWeb(child.stdin);\n const output = Readable.toWeb(child.stdout) as ReadableStream<\n Uint8Array<ArrayBufferLike>\n >;\n const capturedStream = captureACPStream({\n stream: acp.ndJsonStream(input, output),\n });\n streamCapture = capturedStream.capture;\n connection = acp\n .client({ name: clientApp.name })\n .onRequest(\n acp.methods.client.session.requestPermission,\n ({ params }) =>\n activePermissionController?.requestPermission(params) ?? {\n outcome: { outcome: 'cancelled' },\n },\n )\n .onNotification(acp.methods.client.session.update, ({ params }) => {\n if (params.sessionId !== recoveredSessionId) return;\n if (historicalUpdatesSuppressed) return;\n recoveredSessionUpdates?.enqueue({\n kind: 'session_update',\n notification: params,\n update: params.update,\n });\n })\n .connect(capturedStream.stream);\n\n const initializeRequest = createACPInitializeRequest({\n protocolVersion: acp.PROTOCOL_VERSION,\n clientApp,\n authentication,\n supportsBooleanSessionConfigOptions: Object.values(\n start.permissionModeMapping ?? {},\n ).some(\n target =>\n target?.type === 'session-config-option' &&\n typeof target.value === 'boolean',\n ),\n });\n const initialization = await connection.agent.request<\n acp.InitializeResponse,\n typeof initializeRequest\n >(acp.methods.agent.initialize, initializeRequest);\n validateACPProtocolVersion({\n requested: acp.PROTOCOL_VERSION,\n initialization,\n });\n\n if (authentication != null) {\n await authenticate({\n agent: connection.agent,\n initialization,\n authentication,\n });\n }\n const externalMcpServers = createExternalMcpServers({\n mcpServers: start.mcpServers,\n initialization,\n });\n const tools = start.tools ?? [];\n const catalogPath = `${bridgeStateDir}/host-tools.json`;\n await writeFile(catalogPath, JSON.stringify(tools), { mode: 0o600 });\n hostToolRelay = await startHostToolRelay({\n tools,\n serverName: HOST_TOOL_MCP_SERVER_NAME,\n });\n\n const mcpServers: acp.McpServer[] = [\n ...externalMcpServers,\n {\n name: HOST_TOOL_MCP_SERVER_NAME,\n command: process.execPath,\n args: [fileURLToPath(new URL('./host-tool-mcp.mjs', import.meta.url))],\n env: [\n {\n name: 'AI_SDK_ACP_HOST_TOOLS_FILE',\n value: catalogPath,\n },\n {\n name: 'AI_SDK_ACP_HOST_TOOL_RELAY_URL',\n value: hostToolRelay.url,\n },\n {\n name: 'AI_SDK_ACP_HOST_TOOL_RELAY_CREDENTIAL',\n value: hostToolRelay.credential,\n },\n ],\n },\n ];\n let createdSession: ACPActiveSession;\n if (start.recoveryMode?.type === 'lossy-rerun') {\n assertACPResumeCapability({ initialization, harnessId: bridgeType });\n recoveredSessionId = start.recoveryMode.acpSessionId;\n recoveredSessionUpdates = createACPRecoveredSessionUpdates();\n const resumeResponse = await connection.agent.request<\n acp.ResumeSessionResponse,\n acp.ResumeSessionRequest\n >(acp.methods.agent.session.resume, {\n sessionId: recoveredSessionId,\n cwd: workDir,\n mcpServers,\n ...(instructionConfiguration.sessionMeta == null\n ? {}\n : { _meta: instructionConfiguration.sessionMeta }),\n });\n createdSession = createACPRecoveredSession({\n agent: connection.agent,\n sessionId: recoveredSessionId,\n restorationResponse: resumeResponse,\n updates: recoveredSessionUpdates,\n });\n } else if (start.recoveryMode?.type === 'cold-restore') {\n recoveredSessionId = start.recoveryMode.acpSessionId;\n recoveredSessionUpdates = createACPRecoveredSessionUpdates();\n const restored = await restoreACPBridgeSession({\n agent: connection.agent,\n initialization,\n sessionId: recoveredSessionId,\n cwd: workDir,\n mcpServers,\n meta: instructionConfiguration.sessionMeta,\n harnessId: bridgeType,\n setHistoricalUpdatesSuppressed: ({ suppressed }) => {\n historicalUpdatesSuppressed = suppressed;\n },\n discardCapturedHistory: () => {\n streamCapture?.drainRawValues();\n },\n });\n coldRestorationMethod = restored.method;\n createdSession = createACPRecoveredSession({\n agent: connection.agent,\n sessionId: recoveredSessionId,\n restorationResponse: restored.response,\n updates: recoveredSessionUpdates,\n });\n } else {\n createdSession = await connection.agent\n .buildSession({\n cwd: workDir,\n mcpServers,\n ...(instructionConfiguration.sessionMeta == null\n ? {}\n : { _meta: instructionConfiguration.sessionMeta }),\n })\n .start();\n }\n try {\n if (start.permissionModeMapping != null) {\n await configureACPPermissionMode({\n agent: connection.agent,\n sessionId: createdSession.sessionId,\n sessionConfiguration: createdSession.newSessionResponse,\n permissionModeMapping: start.permissionModeMapping,\n permissionMode: start.permissionMode ?? 'allow-all',\n harnessId: bridgeType,\n });\n }\n } catch (error) {\n createdSession.dispose();\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n sessionConfigurationFailure = { error };\n throw error;\n }\n session = createdSession;\n initializationDiagnostic = createACPInitializationDiagnostic({\n initialization,\n sessionId: createdSession.sessionId,\n });\n sessionConfigurationFingerprint = fingerprint;\n return { initialHostToolCatalogRefreshRequired: tools.length > 0 };\n}\n\nfunction createExternalMcpServers({\n mcpServers,\n initialization,\n}: {\n mcpServers: Record<string, unknown> | undefined;\n initialization: acp.InitializeResponse;\n}): acp.McpServer[] {\n if (mcpServers == null) return [];\n return Object.entries(mcpServers).map(([name, value]) => {\n if (!isRecord(value)) {\n throw new Error(\n `ACP MCP server ${JSON.stringify(name)} must be configured with an object value.`,\n );\n }\n if (value.type === 'acp') {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId: bridgeType,\n message:\n 'ACP-transport MCP servers require client-side mcp/connect handling, which this harness does not provide.',\n });\n }\n const mcpCapabilities = initialization.agentCapabilities?.mcpCapabilities;\n if (\n (value.type === 'http' && mcpCapabilities?.http !== true) ||\n (value.type === 'sse' && mcpCapabilities?.sse !== true)\n ) {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId: bridgeType,\n message: `The ACP agent does not advertise support for ${value.type.toUpperCase()} MCP servers.`,\n });\n }\n return { ...value, name } as acp.McpServer;\n });\n}\n\nfunction unknownUsage() {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n}\n\nasync function authenticate({\n agent,\n initialization,\n authentication,\n}: {\n agent: acp.ClientContext;\n initialization: ACPInitializeResult;\n authentication: ACPAuthentication;\n}): Promise<void> {\n assertACPAuthenticationMethod({\n initialization,\n methodId: authentication.methodId,\n });\n await agent.request(acp.methods.agent.authenticate, {\n methodId: authentication.methodId,\n ...(authentication.meta == null ? {} : { _meta: authentication.meta }),\n });\n}\n\nfunction resolveClientApp(): ACPClientApp {\n const name = processEnv.AI_SDK_ACP_CLIENT_APP_NAME;\n const version = processEnv.AI_SDK_ACP_CLIENT_APP_VERSION;\n if (name == null || version == null) {\n throw new Error('ACP client app values were not supplied to the bridge.');\n }\n return { name, version };\n}\n\nfunction resolveGatewayValues({\n clientApp,\n}: {\n clientApp: ACPClientApp;\n}): ACPGatewayValues {\n const apiKey = processEnv.AI_SDK_ACP_GATEWAY_API_KEY;\n const baseUrl = processEnv.AI_SDK_ACP_GATEWAY_BASE_URL;\n if (apiKey == null || baseUrl == null) {\n throw new Error(\n 'AI Gateway profile values were not supplied to the ACP bridge.',\n );\n }\n return {\n apiKey,\n baseUrl,\n clientAppName: clientApp.name,\n clientAppVersion: clientApp.version,\n };\n}\n\nfunction createChildEnvironment({\n launchEnv,\n implementationDir,\n privateHome,\n}: {\n launchEnv: Readonly<Record<string, string>>;\n implementationDir: string;\n privateHome: boolean;\n}): NodeJS.ProcessEnv {\n const blocked = new Set([\n 'BRIDGE_CHANNEL_TOKEN',\n 'BRIDGE_WS_PORT',\n 'AI_SDK_ACP_GATEWAY_API_KEY',\n 'AI_SDK_ACP_GATEWAY_BASE_URL',\n 'AI_SDK_ACP_CLIENT_APP_NAME',\n 'AI_SDK_ACP_CLIENT_APP_VERSION',\n ACP_BRIDGE_CONFIGURATION_ENV,\n ]);\n const environment = {\n ...Object.fromEntries(\n Object.entries(processEnv).filter(\n ([key, value]) => !blocked.has(key) && value != null,\n ),\n ),\n ...launchEnv,\n };\n if (!privateHome) return environment;\n\n const home = `${implementationDir}/home`;\n const inheritedPath = environment.PATH;\n return {\n ...environment,\n HOME: home,\n PATH: [\n `${home}/.local/bin`,\n ...(inheritedPath == null || inheritedPath.length === 0\n ? []\n : [inheritedPath]),\n ].join(':'),\n };\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction createOutputSchemaPromptMeta({\n start,\n}: {\n start: StartMessage;\n}): Record<string, unknown> | undefined {\n if (\n start.responseFormat?.type !== 'json' ||\n start.responseFormat.schema == null ||\n start.outputSchemaMapping?.type !== 'session-prompt-meta'\n ) {\n return undefined;\n }\n const root: Record<string, unknown> = {};\n let target = root;\n const path = start.outputSchemaMapping.path;\n for (let index = 0; index < path.length - 1; index++) {\n const child: Record<string, unknown> = {};\n target[path[index]!] = child;\n target = child;\n }\n target[path[path.length - 1]!] = start.responseFormat.schema;\n return root;\n}\n\nfunction promptActiveSession({\n session,\n agent,\n prompt,\n meta,\n}: {\n session: ACPActiveSession;\n agent: acp.ClientContext;\n prompt: Array<acp.ContentBlock>;\n meta: Record<string, unknown> | undefined;\n}): Promise<acp.PromptResponse> {\n if (meta == null) return session.prompt(prompt);\n if (session.promptWithMeta != null) {\n return session.promptWithMeta({ prompt, meta });\n }\n const updates = (\n session as unknown as {\n updates?: {\n clearErrors(): void;\n enqueue(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n };\n }\n ).updates;\n if (updates == null) {\n throw new Error(\n 'The installed ACP SDK cannot send session prompt metadata while preserving streamed updates.',\n );\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n {\n sessionId: session.sessionId,\n prompt,\n _meta: meta,\n },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n}\n\nasync function readImplementationDescriptor({\n path,\n}: {\n path: string;\n}): Promise<ImplementationDescriptor> {\n const text = await readFile(path, 'utf8');\n const value = await new Response(text, {\n headers: { 'content-type': 'application/json' },\n }).json();\n if (\n !isRecord(value) ||\n typeof value.executablePath !== 'string' ||\n typeof value.privateHome !== 'boolean' ||\n !Array.isArray(value.args) ||\n !value.args.every(item => typeof item === 'string') ||\n !Array.isArray(value.envKeys) ||\n !value.envKeys.every(item => typeof item === 'string')\n ) {\n throw new Error('Invalid ACP implementation descriptor.');\n }\n return {\n executablePath: value.executablePath,\n privateHome: value.privateHome,\n args: value.args as string[],\n envKeys: value.envKeys as string[],\n };\n}\n\nfunction parseArgs({ args }: { args: ReadonlyArray<string> }): {\n workDir?: string;\n bridgeStateDir?: string;\n implementationDir?: string;\n bridgeType?: string;\n} {\n const result: {\n workDir?: string;\n bridgeStateDir?: string;\n implementationDir?: string;\n bridgeType?: string;\n } = {};\n for (let index = 0; index < args.length; index++) {\n const value = args[index + 1];\n if (value == null) continue;\n if (args[index] === '--workdir') result.workDir = value;\n else if (args[index] === '--bridge-state-dir')\n result.bridgeStateDir = value;\n else if (args[index] === '--implementation-dir')\n result.implementationDir = value;\n else if (args[index] === '--bridge-type') result.bridgeType = value;\n }\n return result;\n}\n\nfunction requireArg({\n value,\n name,\n}: {\n value: string | undefined;\n name: string;\n}): string {\n if (value == null || value.length === 0) {\n throw new Error(`Missing ${name} argument.`);\n }\n return value;\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPAuthentication,\n ACPProfileValue,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nexport const ACP_BRIDGE_CONFIGURATION_ENV = 'AI_SDK_ACP_BRIDGE_CONFIGURATION';\n\nconst serializableValueSchema: z.ZodType<ACPSerializableValue> = z.json();\n\nconst profileValueSchema: z.ZodType<ACPProfileValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({\n $source: z.enum([\n 'gateway-api-key',\n 'gateway-base-url',\n 'gateway-authorization',\n 'client-app',\n 'client-app-name',\n 'client-app-version',\n ]),\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n ensureSuffix: z.string().optional(),\n }),\n z.array(profileValueSchema),\n z.record(z.string(), profileValueSchema),\n ]),\n);\n\nconst serializableRecordSchema = z.record(z.string(), serializableValueSchema);\nconst profileRecordSchema = z.record(z.string(), profileValueSchema);\n\nconst authenticationSchema: z.ZodType<ACPAuthentication> = z.object({\n methodId: z.string(),\n meta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n});\n\nconst providerAuthenticationSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('direct') }),\n z.object({\n type: z.literal('ai-gateway'),\n env: profileRecordSchema,\n }),\n]);\n\nexport type ACPResolvedProviderAuthentication = z.infer<\n typeof providerAuthenticationSchema\n>;\n\nexport type ACPBridgeConfiguration = {\n readonly authentication?: ACPAuthentication;\n readonly providerAuthentication?: ACPResolvedProviderAuthentication;\n readonly providerEnvironment?: Readonly<Record<string, string>>;\n readonly sessionMeta?: Readonly<Record<string, ACPSerializableValue>>;\n};\n\nconst bridgeConfigurationSchema: z.ZodType<ACPBridgeConfiguration> = z.object({\n authentication: authenticationSchema.optional(),\n providerAuthentication: providerAuthenticationSchema.optional(),\n providerEnvironment: z.record(z.string(), z.string()).optional(),\n sessionMeta: serializableRecordSchema.optional(),\n});\n\nexport function createACPBridgeEnvironment({\n authentication,\n providerAuthentication,\n providerEnvironment,\n sessionMeta,\n}: ACPBridgeConfiguration): Record<string, string> {\n return {\n [ACP_BRIDGE_CONFIGURATION_ENV]: JSON.stringify({\n ...(authentication == null ? {} : { authentication }),\n ...(providerAuthentication == null ? {} : { providerAuthentication }),\n ...(providerEnvironment == null ? {} : { providerEnvironment }),\n ...(sessionMeta == null ? {} : { sessionMeta }),\n }),\n };\n}\n\nexport async function readACPBridgeEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n}): Promise<ACPBridgeConfiguration> {\n const serialized = env[ACP_BRIDGE_CONFIGURATION_ENV];\n if (serialized == null) return {};\n try {\n const result = bridgeConfigurationSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error('ACP bridge configuration environment is invalid.');\n}\n","import type { ACPProfileValue, ACPSerializableValue } from '../acp-v1-settings';\n\nexport type ACPGatewayValues = {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly clientAppName: string;\n readonly clientAppVersion: string;\n};\n\nexport function resolveACPProfileValue({\n value,\n gateway,\n}: {\n value: ACPProfileValue;\n gateway: ACPGatewayValues;\n}): ACPSerializableValue {\n if (Array.isArray(value)) {\n return value.map(item => resolveACPProfileValue({ value: item, gateway }));\n }\n if (value !== null && typeof value === 'object') {\n if (isValueSource(value)) {\n const sourceValue = resolveSource({ source: value.$source, gateway });\n const resolved = `${value.prefix ?? ''}${sourceValue}`;\n return value.ensureSuffix == null\n ? `${resolved}${value.suffix ?? ''}`\n : ensureSuffix({\n value: resolved,\n suffix: value.ensureSuffix,\n });\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n resolveACPProfileValue({ value: item, gateway }),\n ]),\n );\n }\n return value;\n}\n\nfunction isValueSource(value: object): value is {\n readonly $source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n readonly prefix?: string;\n readonly suffix?: string;\n readonly ensureSuffix?: string;\n} {\n return (\n '$source' in value &&\n typeof (value as { $source?: unknown }).$source === 'string'\n );\n}\n\nfunction ensureSuffix({\n value,\n suffix,\n}: {\n value: string;\n suffix: string;\n}): string {\n const normalized = value.replace(/\\/+$/, '');\n return normalized.endsWith(suffix) ? normalized : `${normalized}${suffix}`;\n}\n\nfunction resolveSource({\n source,\n gateway,\n}: {\n source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n gateway: ACPGatewayValues;\n}): string {\n switch (source) {\n case 'gateway-api-key':\n return gateway.apiKey;\n case 'gateway-base-url':\n return gateway.baseUrl;\n case 'gateway-authorization':\n return `Bearer ${gateway.apiKey}`;\n case 'client-app':\n return `${gateway.clientAppName}/${gateway.clientAppVersion}`;\n case 'client-app-name':\n return gateway.clientAppName;\n case 'client-app-version':\n return gateway.clientAppVersion;\n }\n}\n","import type { ACPResolvedProviderAuthentication } from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport {\n resolveACPProfileValue,\n type ACPGatewayValues,\n} from './profile-values';\n\nexport type ACPInitializeResult = {\n readonly protocolVersion: number;\n readonly authMethods?: ReadonlyArray<{ readonly id: string }> | null;\n readonly agentCapabilities?: Readonly<Record<string, unknown>> | null;\n};\n\nexport function createACPInitializeRequest({\n protocolVersion,\n clientApp,\n authentication,\n supportsBooleanSessionConfigOptions = false,\n}: {\n protocolVersion: number;\n clientApp: ACPClientApp;\n authentication: ACPAuthentication | undefined;\n supportsBooleanSessionConfigOptions?: boolean;\n}): {\n readonly protocolVersion: number;\n readonly clientInfo: {\n readonly name: string;\n readonly version: string;\n };\n readonly clientCapabilities: Readonly<Record<string, unknown>>;\n} {\n let clientCapabilities: Readonly<Record<string, unknown>> =\n authentication?.clientCapabilities ?? {};\n if (supportsBooleanSessionConfigOptions) {\n clientCapabilities = mergeRecords({\n left: clientCapabilities,\n right: {\n session: {\n configOptions: {\n boolean: {},\n },\n },\n },\n });\n }\n return {\n protocolVersion,\n clientInfo: clientApp,\n clientCapabilities,\n };\n}\n\nexport function resolveACPLaunchEnvironment({\n providerAuthentication,\n gateway,\n}: {\n providerAuthentication: ACPResolvedProviderAuthentication | undefined;\n gateway: ACPGatewayValues | undefined;\n}): Record<string, string> {\n if (providerAuthentication?.type !== 'ai-gateway') {\n return {};\n }\n const resolved = asRecord(\n resolveACPProfileValue({\n value: providerAuthentication.env,\n gateway: requireGateway({ gateway }),\n }),\n );\n return Object.fromEntries(\n Object.entries(resolved).map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ]),\n );\n}\n\nexport function validateACPProtocolVersion({\n requested,\n initialization,\n}: {\n requested: number;\n initialization: ACPInitializeResult;\n}): void {\n if (initialization.protocolVersion !== requested) {\n throw new Error(\n `ACP protocol negotiation failed: requested v${requested}, agent selected v${initialization.protocolVersion}.`,\n );\n }\n}\n\nexport function assertACPAuthenticationMethod({\n initialization,\n methodId,\n}: {\n initialization: ACPInitializeResult;\n methodId: string;\n}): void {\n if (!initialization.authMethods?.some(method => method.id === methodId)) {\n const advertised =\n initialization.authMethods?.map(method => method.id).join(', ') || 'none';\n throw new Error(\n `ACP authentication method ${JSON.stringify(methodId)} is not advertised by the agent. Advertised methods: ${advertised}.`,\n );\n }\n}\n\nfunction mergeRecords({\n left,\n right,\n}: {\n left: Readonly<Record<string, unknown>>;\n right: Readonly<Record<string, unknown>>;\n}): Readonly<Record<string, unknown>> {\n const result: Record<string, unknown> = { ...left };\n for (const [key, value] of Object.entries(right)) {\n const previous = result[key];\n result[key] =\n isRecord(previous) && isRecord(value)\n ? mergeRecords({ left: previous, right: value })\n : value;\n }\n return result;\n}\n\nfunction requireGateway({\n gateway,\n}: {\n gateway: ACPGatewayValues | undefined;\n}): ACPGatewayValues {\n if (gateway == null) {\n throw new Error('ACP Gateway profile values are unavailable.');\n }\n return gateway;\n}\n\nfunction asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (!isRecord(value)) {\n throw new Error('ACP profile data must resolve to an object.');\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import type {\n AnyMessage,\n SessionUpdate,\n Stream as ACPStream,\n} from '@agentclientprotocol/sdk';\n\nconst KNOWN_SESSION_UPDATES = new Set([\n 'user_message_chunk',\n 'agent_message_chunk',\n 'agent_thought_chunk',\n 'tool_call',\n 'tool_call_update',\n 'plan',\n 'plan_update',\n 'plan_removed',\n 'available_commands_update',\n 'current_mode_update',\n 'config_option_update',\n 'session_info_update',\n 'usage_update',\n]);\n\ntype CapturedSessionUpdate = {\n readonly rawUpdate: unknown;\n readonly forwarded: boolean;\n};\n\nexport type ACPStreamCapture = {\n takeForUpdate(options: { update: SessionUpdate }): {\n readonly precedingRawValues: ReadonlyArray<unknown>;\n readonly rawUpdate: unknown;\n };\n drainRawValues(): ReadonlyArray<unknown>;\n};\n\nexport function captureACPStream({ stream }: { stream: ACPStream }): {\n stream: ACPStream;\n capture: ACPStreamCapture;\n} {\n const updates: CapturedSessionUpdate[] = [];\n const readable = stream.readable.pipeThrough(\n new TransformStream<AnyMessage, AnyMessage>({\n transform(message, controller) {\n const rawUpdate = getRawSessionUpdate({ message });\n if (!rawUpdate.isSessionUpdate) {\n controller.enqueue(message);\n return;\n }\n\n const sessionUpdate = getStringProperty({\n value: rawUpdate.value,\n property: 'sessionUpdate',\n });\n const forwarded =\n !rawUpdate.canFilterUnknown ||\n sessionUpdate == null ||\n KNOWN_SESSION_UPDATES.has(sessionUpdate);\n updates.push({ rawUpdate: rawUpdate.value, forwarded });\n if (forwarded) controller.enqueue(message);\n },\n }),\n );\n\n return {\n stream: { ...stream, readable },\n capture: {\n takeForUpdate: ({ update }) => {\n const index = updates.findIndex(\n candidate =>\n candidate.forwarded &&\n sessionUpdatesMatch({\n rawUpdate: candidate.rawUpdate,\n update,\n }),\n );\n if (index === -1) {\n return { precedingRawValues: [], rawUpdate: update };\n }\n const consumed = updates.splice(0, index + 1);\n return {\n precedingRawValues: consumed\n .slice(0, -1)\n .map(candidate => candidate.rawUpdate),\n rawUpdate: consumed.at(-1)!.rawUpdate,\n };\n },\n drainRawValues: () =>\n updates.splice(0).map(candidate => candidate.rawUpdate),\n },\n };\n}\n\nfunction getRawSessionUpdate({ message }: { message: AnyMessage }):\n | { readonly isSessionUpdate: false }\n | {\n readonly isSessionUpdate: true;\n readonly value: unknown;\n readonly canFilterUnknown: boolean;\n } {\n const record = message as unknown as Record<string, unknown>;\n if (record.method !== 'session/update' || !isRecord(record.params)) {\n return { isSessionUpdate: false };\n }\n const params = record.params;\n return {\n isSessionUpdate: true,\n value: params.update,\n canFilterUnknown:\n typeof params.sessionId === 'string' && isRecord(params.update),\n };\n}\n\nfunction sessionUpdatesMatch({\n rawUpdate,\n update,\n}: {\n rawUpdate: unknown;\n update: SessionUpdate;\n}): boolean {\n if (!isRecord(rawUpdate)) return false;\n if (rawUpdate.sessionUpdate !== update.sessionUpdate) return false;\n if (\n update.sessionUpdate === 'tool_call' ||\n update.sessionUpdate === 'tool_call_update'\n ) {\n return rawUpdate.toolCallId === update.toolCallId;\n }\n if (\n update.sessionUpdate === 'user_message_chunk' ||\n update.sessionUpdate === 'agent_message_chunk' ||\n update.sessionUpdate === 'agent_thought_chunk'\n ) {\n return rawUpdate.messageId === update.messageId;\n }\n return true;\n}\n\nfunction getStringProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): string | undefined {\n if (!isRecord(value)) return undefined;\n const propertyValue = value[property];\n return typeof propertyValue === 'string' ? propertyValue : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { InitializeResponse } from '@agentclientprotocol/sdk';\n\nexport function createACPInitializationDiagnostic({\n initialization,\n sessionId,\n}: {\n initialization: InitializeResponse;\n sessionId: string;\n}): Record<string, unknown> {\n const agentInfo = initialization.agentInfo;\n return {\n protocolVersion: initialization.protocolVersion,\n sessionId,\n agent:\n agentInfo == null\n ? null\n : {\n name: agentInfo.name,\n version: agentInfo.version,\n ...(agentInfo.title == null ? {} : { title: agentInfo.title }),\n },\n capabilities: stripMetadata({\n value: initialization.agentCapabilities ?? {},\n }),\n authMethods: (initialization.authMethods ?? []).map(method => ({\n id: method.id,\n type: 'type' in method ? method.type : 'agent',\n })),\n };\n}\n\nexport function createACPBridgeError({\n stage,\n cause,\n}: {\n stage:\n | 'session initialization'\n | 'session cancellation'\n | 'prompt update stream';\n cause: unknown;\n}): Error {\n const causeMessage = getErrorMessage({ error: cause });\n const error = new Error(\n causeMessage == null\n ? `ACP ${stage} failed.`\n : `ACP ${stage} failed: ${causeMessage}`,\n );\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n\nfunction getErrorMessage({ error }: { error: unknown }): string | undefined {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n error != null &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof error.message === 'string'\n ) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return undefined;\n}\n\nfunction stripMetadata({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => stripMetadata({ value: item }));\n }\n if (value == null || typeof value !== 'object') return value;\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (key !== '_meta') result[key] = stripMetadata({ value: item });\n }\n return result;\n}\n","import type { Readable } from 'node:stream';\nimport { stripVTControlCharacters } from 'node:util';\n\nexport function monitorACPAgentStderr({\n stderr,\n onStderrLine,\n}: {\n stderr: Readable;\n onStderrLine: (line: string) => void;\n}): Promise<never> {\n let rejectFailure!: (error: unknown) => void;\n const failure = new Promise<never>((_, reject) => {\n rejectFailure = reject;\n });\n void failure.catch(() => {});\n\n void (async () => {\n stderr.setEncoding('utf8');\n let pending = '';\n for await (const chunk of stderr) {\n pending += chunk;\n const lines = pending.split('\\n');\n pending = lines.pop() ?? '';\n for (const line of lines) handleStderrLine({ line });\n }\n if (pending.length > 0) handleStderrLine({ line: pending });\n })().catch(error => rejectFailure(error));\n\n return failure;\n\n function handleStderrLine({ line }: { line: string }): void {\n if (line.length === 0) return;\n onStderrLine(line);\n const normalizedLine = stripVTControlCharacters(line);\n\n /*\n * An ACP agent can log a response-stream decoding failure without rejecting\n * its pending JSON-RPC prompt. Once the provider stream cannot be decoded,\n * no valid prompt completion can reach the ACP client, so the bridge must\n * fail the turn instead of waiting indefinitely.\n */\n if (\n normalizedLine\n .toLowerCase()\n .includes('failed to deserialize responsestreamevent from stream')\n ) {\n rejectFailure(\n new Error('ACP agent failed to deserialize a streamed response.'),\n );\n }\n }\n}\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport type { PromptResponse, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n ACPToolCall,\n ACPToolCallStatus,\n ACPToolKind,\n} from '../../acp-tool-call';\nimport type { ACPBuiltinToolMapping } from '../acp-v1-bridge-protocol';\n\ntype HarnessUsage = Extract<\n HarnessV1StreamPart,\n { readonly type: 'finish' }\n>['totalUsage'];\ntype HarnessToolResult = Extract<\n HarnessV1StreamPart,\n { readonly type: 'tool-result' }\n>['result'];\ntype HarnessJSONValue = HarnessToolResult | null;\n\ntype ToolState = {\n readonly toolCallId: string;\n readonly values: Record<string, unknown>;\n readonly emittedFilePaths: Set<string>;\n emittedCall: boolean;\n emittedResult: boolean;\n toolName?: string;\n nativeName?: string;\n};\n\nexport type ACPSessionUpdate = SessionUpdate;\nexport type ACPPromptResponse = PromptResponse;\n\nexport function createACPStreamTranslator({\n emit,\n emitToolCallCandidate,\n builtinTools = [],\n}: {\n emit: (event: HarnessV1StreamPart) => void;\n emitToolCallCandidate?: (options: { toolCall: ACPToolCall }) => void;\n builtinTools?: ReadonlyArray<ACPBuiltinToolMapping>;\n}): {\n update: (\n options:\n | ACPSessionUpdate\n | {\n update: ACPSessionUpdate;\n rawUpdate?: unknown;\n preserveRaw?: boolean;\n },\n ) => void;\n permissionToolCall: (options: {\n toolCall: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n }) => void;\n raw: (options: { rawValue: unknown }) => void;\n close: () => void;\n finish: (response: ACPPromptResponse) => void;\n hostToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n hostToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n} {\n let openBlock:\n | {\n readonly type: 'text' | 'reasoning';\n readonly id: string;\n readonly messageId: string | null;\n }\n | undefined;\n let blockCounter = 0;\n let stepOpen = false;\n let finished = false;\n const blockIdCounts = new Map<string, number>();\n const toolStates = new Map<string, ToolState>();\n const pendingToolCallIds = new Set<string>();\n const builtinToolsByName = indexBuiltinTools({ builtinTools });\n\n const closeBlock = () => {\n if (openBlock == null) return;\n emit({\n type: openBlock.type === 'text' ? 'text-end' : 'reasoning-end',\n id: openBlock.id,\n });\n openBlock = undefined;\n };\n\n const createBlockId = ({\n type,\n messageId,\n }: {\n type: 'text' | 'reasoning';\n messageId: string | null;\n }): string => {\n const base = messageId ?? `acp-${type}-${++blockCounter}`;\n const count = (blockIdCounts.get(base) ?? 0) + 1;\n blockIdCounts.set(base, count);\n return count === 1 ? base : `${base}-${count}`;\n };\n\n const emitContent = ({\n type,\n text,\n messageId,\n }: {\n type: 'text' | 'reasoning';\n text: string;\n messageId?: string | null;\n }) => {\n const normalizedMessageId = messageId ?? null;\n if (\n openBlock == null ||\n openBlock.type !== type ||\n openBlock.messageId !== normalizedMessageId\n ) {\n closeBlock();\n const id = createBlockId({ type, messageId: normalizedMessageId });\n emit({\n type: type === 'text' ? 'text-start' : 'reasoning-start',\n id,\n });\n openBlock = { type, id, messageId: normalizedMessageId };\n }\n emit({\n type: type === 'text' ? 'text-delta' : 'reasoning-delta',\n id: openBlock.id,\n delta: text,\n });\n stepOpen = true;\n };\n\n const emitInferredStep = ({\n finishReason,\n }: {\n finishReason: Extract<\n HarnessV1StreamPart,\n { readonly type: 'finish-step' }\n >['finishReason'];\n }) => {\n closeBlock();\n emit({\n type: 'finish-step',\n finishReason,\n usage: unknownUsage(),\n harnessMetadata: { acp: { inferredStep: true } },\n });\n stepOpen = false;\n };\n\n const finishCompletedToolStep = () => {\n if (!stepOpen || pendingToolCallIds.size > 0) {\n return;\n }\n emitInferredStep({\n finishReason: { unified: 'tool-calls', raw: 'tool-calls' },\n });\n };\n\n const emitToolUpdate = ({\n update,\n rawUpdate,\n forceEmit = false,\n }: {\n update: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n rawUpdate: unknown;\n forceEmit?: boolean;\n }) => {\n closeBlock();\n const state =\n toolStates.get(update.toolCallId) ??\n ({\n toolCallId: update.toolCallId,\n values: {},\n emittedFilePaths: new Set(),\n emittedCall: false,\n emittedResult: false,\n } satisfies ToolState);\n toolStates.set(update.toolCallId, state);\n mergeToolUpdate({ state, update, rawUpdate });\n\n if (\n !forceEmit &&\n !state.emittedCall &&\n update.sessionUpdate === 'tool_call' &&\n update.status === 'pending'\n ) {\n return;\n }\n\n if (!state.emittedCall) {\n const programmaticName = getStringProperty({\n value: state.values,\n property: 'name',\n });\n const builtin = resolveBuiltinTool({\n programmaticName,\n metadata: state.values._meta,\n title: getStringProperty({\n value: state.values,\n property: 'title',\n }),\n kind: isACPToolKind(state.values.kind) ? state.values.kind : undefined,\n rawInput: state.values.rawInput,\n builtinTools,\n builtinToolsByName,\n });\n if (\n !forceEmit &&\n builtin?.inputSchema != null &&\n state.values.status !== 'completed' &&\n state.values.status !== 'failed' &&\n !hasRequiredBuiltinToolInput({\n rawInput: state.values.rawInput,\n inputSchema: builtin.inputSchema,\n })\n ) {\n return;\n }\n if (builtin != null) {\n state.toolName = builtin.toolName;\n state.nativeName =\n builtin.nativeName != null && builtin.toolName !== builtin.nativeName\n ? builtin.nativeName\n : undefined;\n } else {\n state.toolName = createDynamicToolName({\n programmaticName,\n toolCallId: state.toolCallId,\n });\n emitToolCallCandidate?.({ toolCall: createACPToolCall({ state }) });\n }\n emit({\n type: 'tool-call',\n toolCallId: state.toolCallId,\n toolName: state.toolName,\n input: stringifyToolInput({ input: state.values.rawInput }),\n providerExecuted: true,\n ...(state.nativeName == null ? {} : { nativeName: state.nativeName }),\n });\n state.emittedCall = true;\n stepOpen = true;\n pendingToolCallIds.add(state.toolCallId);\n }\n\n emitFileChanges({ state, emit });\n\n if (\n !state.emittedResult &&\n (state.values.status === 'completed' || state.values.status === 'failed')\n ) {\n emit({\n type: 'tool-result',\n toolCallId: state.toolCallId,\n toolName: state.toolName!,\n result: createToolResult({ state }),\n ...(state.values.status === 'failed' ? { isError: true } : {}),\n });\n state.emittedResult = true;\n pendingToolCallIds.delete(state.toolCallId);\n finishCompletedToolStep();\n }\n };\n\n const hostToolCall = ({\n toolCallId,\n toolName,\n input,\n }: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => {\n closeBlock();\n emit({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: stringifyToolInput({ input }),\n providerExecuted: false,\n });\n stepOpen = true;\n pendingToolCallIds.add(toolCallId);\n };\n\n const hostToolResult = ({\n toolCallId,\n toolName,\n output,\n isError,\n }: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => {\n closeBlock();\n emit({\n type: 'tool-result',\n toolCallId,\n toolName,\n result: toSafeJSONValue({ value: output, fallback: {} }) ?? {},\n ...(isError ? { isError: true } : {}),\n });\n pendingToolCallIds.delete(toolCallId);\n finishCompletedToolStep();\n };\n\n return {\n update: options => {\n const { update, rawUpdate, preserveRaw } =\n 'update' in options\n ? {\n update: options.update,\n rawUpdate: options.rawUpdate,\n preserveRaw: options.preserveRaw,\n }\n : { update: options, rawUpdate: options, preserveRaw: true };\n const preservedUpdate = rawUpdate === undefined ? update : rawUpdate;\n if (preserveRaw !== false) {\n emit({ type: 'raw', rawValue: preservedUpdate });\n }\n if (\n update.sessionUpdate === 'agent_message_chunk' &&\n update.content?.type === 'text' &&\n typeof update.content.text === 'string'\n ) {\n emitContent({\n type: 'text',\n text: update.content.text,\n messageId: update.messageId,\n });\n return;\n }\n if (\n update.sessionUpdate === 'agent_thought_chunk' &&\n update.content?.type === 'text' &&\n typeof update.content.text === 'string'\n ) {\n emitContent({\n type: 'reasoning',\n text: update.content.text,\n messageId: update.messageId,\n });\n return;\n }\n if (\n update.sessionUpdate === 'agent_message_chunk' ||\n update.sessionUpdate === 'agent_thought_chunk'\n ) {\n closeBlock();\n return;\n }\n if (\n update.sessionUpdate === 'tool_call' ||\n update.sessionUpdate === 'tool_call_update'\n ) {\n emitToolUpdate({ update, rawUpdate: preservedUpdate });\n }\n },\n permissionToolCall: ({ toolCall }) => {\n emitToolUpdate({\n update: toolCall,\n rawUpdate: toolCall,\n forceEmit: true,\n });\n },\n raw: ({ rawValue }) => {\n emit({ type: 'raw', rawValue });\n },\n close: closeBlock,\n hostToolCall,\n hostToolResult,\n finish: response => {\n if (finished) return;\n finished = true;\n emit({ type: 'raw', rawValue: response });\n const finishReason = mapACPFinishReason({\n stopReason: response.stopReason,\n });\n const usageMetadata =\n response.usage == null\n ? undefined\n : mapACPUsageMetadata({ usage: response.usage });\n if (stepOpen) {\n emitInferredStep({ finishReason });\n } else {\n closeBlock();\n }\n emit({\n type: 'finish',\n finishReason,\n totalUsage: mapACPUsage({ usage: response.usage }),\n harnessMetadata: {\n acp: {\n stopReason: response.stopReason,\n ...(usageMetadata == null ? {} : { usage: usageMetadata }),\n },\n },\n });\n },\n };\n}\n\nexport function mapACPFinishReason({ stopReason }: { stopReason: string }): {\n unified:\n | 'stop'\n | 'length'\n | 'content-filter'\n | 'tool-calls'\n | 'error'\n | 'other';\n raw: string;\n} {\n switch (stopReason) {\n case 'end_turn':\n return { unified: 'stop', raw: stopReason };\n case 'max_tokens':\n case 'max_turn_requests':\n return { unified: 'length', raw: stopReason };\n case 'refusal':\n return { unified: 'content-filter', raw: stopReason };\n default:\n return { unified: 'other', raw: stopReason };\n }\n}\n\nfunction indexBuiltinTools({\n builtinTools,\n}: {\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n}): ReadonlyMap<string, ACPBuiltinToolMapping> {\n const matches = new Map<string, ACPBuiltinToolMapping | null>();\n for (const builtinTool of builtinTools) {\n addBuiltinToolMatch({\n matches,\n name: builtinTool.toolName,\n builtinTool,\n });\n if (builtinTool.nativeName != null) {\n addBuiltinToolMatch({\n matches,\n name: builtinTool.nativeName,\n builtinTool,\n });\n }\n }\n return new Map(\n [...matches].filter(\n (entry): entry is [string, ACPBuiltinToolMapping] => entry[1] != null,\n ),\n );\n}\n\nfunction addBuiltinToolMatch({\n matches,\n name,\n builtinTool,\n}: {\n matches: Map<string, ACPBuiltinToolMapping | null>;\n name: string;\n builtinTool: ACPBuiltinToolMapping;\n}): void {\n if (!matches.has(name)) {\n matches.set(name, builtinTool);\n return;\n }\n if (matches.get(name)?.toolName !== builtinTool.toolName) {\n matches.set(name, null);\n }\n}\n\nfunction resolveBuiltinTool({\n programmaticName,\n metadata,\n title,\n kind,\n rawInput,\n builtinTools,\n builtinToolsByName,\n}: {\n programmaticName: string | undefined;\n metadata: unknown;\n title: string | undefined;\n kind: ACPToolKind | undefined;\n rawInput: unknown;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n builtinToolsByName: ReadonlyMap<string, ACPBuiltinToolMapping>;\n}): ACPBuiltinToolMapping | undefined {\n if (programmaticName != null) {\n return builtinToolsByName.get(programmaticName);\n }\n\n const metadataMatch = findBuiltinToolsInMetadata({\n metadata,\n builtinToolsByName,\n });\n if (metadataMatch.hasProgrammaticName) {\n return metadataMatch.matches.length === 1\n ? metadataMatch.matches[0]\n : undefined;\n }\n\n const titleMatch = findBuiltinToolByTitle({\n title,\n kind,\n builtinTools,\n });\n if (titleMatch != null) return titleMatch;\n\n const schemaMatches = builtinTools.filter(tool =>\n matchesBuiltinToolInput({ rawInput, inputSchema: tool.inputSchema }),\n );\n return schemaMatches.length === 1 ? schemaMatches[0] : undefined;\n}\n\nfunction findBuiltinToolByTitle({\n title,\n kind,\n builtinTools,\n}: {\n title: string | undefined;\n kind: ACPToolKind | undefined;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n}): ACPBuiltinToolMapping | undefined {\n if (title == null) return undefined;\n const matches = builtinTools.filter(\n tool =>\n tool.title != null &&\n title.startsWith(tool.title) &&\n isCompatibleToolKind({ toolUseKind: tool.toolUseKind, kind }),\n );\n if (matches.length === 0) return undefined;\n const longestPrefixLength = Math.max(\n ...matches.map(tool => tool.title!.length),\n );\n const longestMatches = matches.filter(\n tool => tool.title!.length === longestPrefixLength,\n );\n return longestMatches.length === 1 ? longestMatches[0] : undefined;\n}\n\nfunction isCompatibleToolKind({\n toolUseKind,\n kind,\n}: {\n toolUseKind: ACPBuiltinToolMapping['toolUseKind'];\n kind: ACPToolKind | undefined;\n}): boolean {\n if (toolUseKind == null || kind == null) return true;\n switch (toolUseKind) {\n case 'readonly':\n return (\n kind === 'read' ||\n kind === 'search' ||\n kind === 'fetch' ||\n kind === 'think'\n );\n case 'edit':\n return kind === 'edit' || kind === 'delete' || kind === 'move';\n case 'bash':\n return kind === 'execute';\n }\n}\n\nfunction findBuiltinToolsInMetadata({\n metadata,\n builtinToolsByName,\n}: {\n metadata: unknown;\n builtinToolsByName: ReadonlyMap<string, ACPBuiltinToolMapping>;\n}): {\n hasProgrammaticName: boolean;\n matches: ReadonlyArray<ACPBuiltinToolMapping>;\n} {\n const matches = new Map<string, ACPBuiltinToolMapping>();\n let hasProgrammaticName = false;\n const seen = new Set<object>();\n const visit = (value: unknown): void => {\n if (value == null || typeof value !== 'object' || seen.has(value)) return;\n seen.add(value);\n for (const [property, child] of Array.isArray(value)\n ? value.entries()\n : Object.entries(value as Record<string, unknown>)) {\n if (\n (property === 'name' || property === 'toolName') &&\n typeof child === 'string'\n ) {\n hasProgrammaticName = true;\n const builtin = builtinToolsByName.get(child);\n if (builtin != null) matches.set(builtin.toolName, builtin);\n }\n visit(child);\n }\n };\n visit(metadata);\n return { hasProgrammaticName, matches: [...matches.values()] };\n}\n\nfunction matchesBuiltinToolInput({\n rawInput,\n inputSchema,\n}: {\n rawInput: unknown;\n inputSchema: ACPBuiltinToolMapping['inputSchema'];\n}): boolean {\n if (!isRecord(rawInput) || !isRecord(inputSchema)) return false;\n if (inputSchema.type !== 'object') return false;\n const required = inputSchema.required;\n if (\n !Array.isArray(required) ||\n required.length === 0 ||\n !required.every(property => typeof property === 'string')\n ) {\n return false;\n }\n if (!hasRequiredBuiltinToolInput({ rawInput, inputSchema })) return false;\n\n const properties = isRecord(inputSchema.properties)\n ? inputSchema.properties\n : {};\n return Object.entries(properties)\n .filter(([, schema]) => isJSONSchemaDiscriminator({ schema }))\n .every(([property, schema]) => {\n if (!Object.prototype.hasOwnProperty.call(rawInput, property)) {\n return false;\n }\n return matchesJSONSchemaValue({ value: rawInput[property], schema });\n });\n}\n\nfunction hasRequiredBuiltinToolInput({\n rawInput,\n inputSchema,\n}: {\n rawInput: unknown;\n inputSchema: ACPBuiltinToolMapping['inputSchema'];\n}): boolean {\n if (!isRecord(inputSchema) || inputSchema.type !== 'object') return true;\n if (!isRecord(rawInput)) return false;\n const required = inputSchema.required;\n if (!Array.isArray(required) || required.length === 0) return true;\n if (!required.every(property => typeof property === 'string')) return true;\n const properties = isRecord(inputSchema.properties)\n ? inputSchema.properties\n : {};\n return required.every(property => {\n if (!Object.prototype.hasOwnProperty.call(rawInput, property)) return false;\n return matchesJSONSchemaValue({\n value: rawInput[property],\n schema: properties[property],\n });\n });\n}\n\nfunction isJSONSchemaDiscriminator({ schema }: { schema: unknown }): boolean {\n return (\n isRecord(schema) &&\n ('const' in schema ||\n (Array.isArray(schema.enum) && schema.enum.length === 1))\n );\n}\n\nfunction matchesJSONSchemaValue({\n value,\n schema,\n}: {\n value: unknown;\n schema: unknown;\n}): boolean {\n if (schema === true) return true;\n if (schema === false || !isRecord(schema)) return false;\n if ('const' in schema && !Object.is(value, schema.const)) return false;\n if (\n Array.isArray(schema.enum) &&\n !schema.enum.some(candidate => Object.is(value, candidate))\n ) {\n return false;\n }\n for (const alternatives of [schema.anyOf, schema.oneOf]) {\n if (\n Array.isArray(alternatives) &&\n !alternatives.some(alternative =>\n matchesJSONSchemaValue({ value, schema: alternative }),\n )\n ) {\n return false;\n }\n }\n if (typeof schema.type !== 'string') return true;\n switch (schema.type) {\n case 'null':\n return value === null;\n case 'boolean':\n return typeof value === 'boolean';\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'string':\n return typeof value === 'string';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isRecord(value);\n default:\n return true;\n }\n}\n\nfunction mergeToolUpdate({\n state,\n update,\n rawUpdate,\n}: {\n state: ToolState;\n update: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n rawUpdate: unknown;\n}): void {\n const parsed = update as unknown as Record<string, unknown>;\n for (const property of [\n 'title',\n 'kind',\n 'status',\n 'content',\n 'locations',\n 'rawInput',\n 'rawOutput',\n '_meta',\n ]) {\n if (\n Object.prototype.hasOwnProperty.call(parsed, property) &&\n parsed[property] !== undefined\n ) {\n state.values[property] = parsed[property];\n }\n }\n const programmaticName = getStringProperty({\n value: rawUpdate,\n property: 'name',\n });\n if (programmaticName != null) state.values.name = programmaticName;\n}\n\nfunction createACPToolCall({ state }: { state: ToolState }): ACPToolCall {\n const title = getStringProperty({\n value: state.values,\n property: 'title',\n });\n const kind = state.values.kind;\n const status = state.values.status;\n return {\n toolCallId: state.toolCallId,\n title: title ?? state.toolName ?? `Tool ${state.toolCallId}`,\n ...(isACPToolKind(kind) ? { kind } : {}),\n ...(isACPToolCallStatus(status) ? { status } : {}),\n ...(Array.isArray(state.values.content)\n ? { content: state.values.content as ACPToolCall['content'] }\n : {}),\n ...(Array.isArray(state.values.locations)\n ? { locations: state.values.locations as ACPToolCall['locations'] }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(state.values, 'rawInput')\n ? { rawInput: state.values.rawInput }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(state.values, 'rawOutput')\n ? { rawOutput: state.values.rawOutput }\n : {}),\n ...(state.values._meta === null || isRecord(state.values._meta)\n ? { _meta: state.values._meta }\n : {}),\n };\n}\n\nfunction isACPToolKind(value: unknown): value is ACPToolKind {\n return (\n value === 'read' ||\n value === 'edit' ||\n value === 'delete' ||\n value === 'move' ||\n value === 'search' ||\n value === 'execute' ||\n value === 'think' ||\n value === 'fetch' ||\n value === 'switch_mode' ||\n value === 'other'\n );\n}\n\nfunction isACPToolCallStatus(value: unknown): value is ACPToolCallStatus {\n return (\n value === 'pending' ||\n value === 'in_progress' ||\n value === 'completed' ||\n value === 'failed'\n );\n}\n\nfunction emitFileChanges({\n state,\n emit,\n}: {\n state: ToolState;\n emit: (event: HarnessV1StreamPart) => void;\n}): void {\n const content = Array.isArray(state.values.content)\n ? state.values.content\n : [];\n for (const item of content) {\n if (!isRecord(item) || item.type !== 'diff') continue;\n const path = getStringProperty({ value: item, property: 'path' });\n const newText = getStringProperty({ value: item, property: 'newText' });\n if (path == null || newText == null) continue;\n const oldText = item.oldText;\n const event = oldText == null ? 'create' : 'modify';\n emitFileChange({ state, emit, path, event });\n }\n\n if (state.values.kind !== 'edit') return;\n const locations = Array.isArray(state.values.locations)\n ? state.values.locations\n : [];\n for (const location of locations) {\n const path = getStringProperty({ value: location, property: 'path' });\n if (path != null) {\n emitFileChange({ state, emit, path, event: 'modify' });\n }\n }\n}\n\nfunction emitFileChange({\n state,\n emit,\n path,\n event,\n}: {\n state: ToolState;\n emit: (event: HarnessV1StreamPart) => void;\n path: string;\n event: 'create' | 'modify' | 'delete';\n}): void {\n if (state.emittedFilePaths.has(path)) return;\n state.emittedFilePaths.add(path);\n emit({\n type: 'file-change',\n path,\n event,\n harnessMetadata: {\n acp: {\n toolCallId: state.toolCallId,\n },\n },\n });\n}\n\nfunction createDynamicToolName({\n programmaticName,\n toolCallId,\n}: {\n programmaticName: string | undefined;\n toolCallId: string;\n}): string {\n const source = programmaticName ?? `acp_tool_${toolCallId}`;\n const normalized = source\n .replace(/[^A-Za-z0-9_-]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .slice(0, 128);\n if (normalized.length === 0) return 'acp_tool';\n return /^[A-Za-z_]/.test(normalized) ? normalized : `acp_${normalized}`;\n}\n\nfunction stringifyToolInput({ input }: { input: unknown }): string {\n return JSON.stringify(toSafeJSONValue({ value: input, fallback: {} }));\n}\n\nfunction createToolResult({ state }: { state: ToolState }): HarnessToolResult {\n const value =\n state.values.rawOutput != null\n ? state.values.rawOutput\n : state.values.content != null\n ? state.values.content\n : {};\n return toSafeJSONValue({ value, fallback: {} }) ?? {};\n}\n\nfunction toSafeJSONValue({\n value,\n fallback,\n seen = new Set(),\n}: {\n value: unknown;\n fallback: HarnessJSONValue;\n seen?: Set<object>;\n}): HarnessJSONValue {\n if (value == null) return fallback;\n if (typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return value.toString();\n if (typeof value !== 'object') return fallback;\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) {\n const result = value.map(item =>\n toSafeJSONValue({ value: item, fallback: null, seen }),\n );\n seen.delete(value);\n return result;\n }\n const result = Object.create(null) as Record<string, HarnessJSONValue>;\n try {\n for (const [key, item] of Object.entries(value)) {\n result[key] = toSafeJSONValue({\n value: item,\n fallback: null,\n seen,\n });\n }\n } catch {\n seen.delete(value);\n return fallback;\n }\n seen.delete(value);\n return result;\n}\n\nfunction getStringProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): string | undefined {\n if (!isRecord(value)) return undefined;\n const propertyValue = value[property];\n return typeof propertyValue === 'string' ? propertyValue : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mapACPUsage({\n usage,\n}: {\n usage: ACPPromptResponse['usage'];\n}): HarnessUsage {\n if (usage == null) return unknownUsage();\n const raw = mapACPUsageMetadata({ usage });\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: undefined,\n cacheRead: usage.cachedReadTokens ?? undefined,\n cacheWrite: usage.cachedWriteTokens ?? undefined,\n },\n outputTokens: {\n total: usage.outputTokens,\n text: undefined,\n reasoning: usage.thoughtTokens ?? undefined,\n },\n raw,\n };\n}\n\nfunction mapACPUsageMetadata({\n usage,\n}: {\n usage: NonNullable<ACPPromptResponse['usage']>;\n}) {\n return {\n totalTokens: usage.totalTokens,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n ...(usage.thoughtTokens == null\n ? {}\n : { thoughtTokens: usage.thoughtTokens }),\n ...(usage.cachedReadTokens == null\n ? {}\n : { cachedReadTokens: usage.cachedReadTokens }),\n ...(usage.cachedWriteTokens == null\n ? {}\n : { cachedWriteTokens: usage.cachedWriteTokens }),\n };\n}\n\nfunction unknownUsage(): HarnessUsage {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n}\n","import type {\n ActiveSessionMessage,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\n\ntype SessionUpdateMessage = Extract<\n ActiveSessionMessage,\n { readonly kind: 'session_update' }\n>;\n\ntype BufferedUpdate = {\n readonly message: SessionUpdateMessage;\n readonly rawUpdate: unknown;\n};\n\ntype CorrelationInvocation = {\n readonly token: string;\n readonly serverName: string;\n readonly toolName: string;\n readonly inputFingerprint: string;\n readonly order: number;\n expiryTimer?: ReturnType<typeof setTimeout>;\n toolCallId?: string;\n};\n\ntype CorrelationCandidate = {\n readonly toolCallId: string;\n readonly order: number;\n readonly evidence: unknown[];\n};\n\nconst CORRELATION_WINDOW_MS = 1000;\nconst MAX_BUFFERED_UPDATES = 128;\n\nexport function createHostToolCorrelation({\n emitSemanticUpdate,\n emitRawUpdate,\n hostToolServerName,\n hostTools,\n}: {\n emitSemanticUpdate: (options: {\n message: SessionUpdateMessage;\n rawUpdate: unknown;\n }) => void;\n emitRawUpdate: (options: { rawUpdate: unknown }) => void;\n hostToolServerName: string;\n hostTools: ReadonlyArray<{ readonly name: string }>;\n}): {\n update(options: { message: SessionUpdateMessage; rawUpdate?: unknown }): void;\n registerInvocation(options: {\n token: string;\n serverName: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n order: number;\n }): void;\n claimHostToolPermission(options: { toolCall: ToolCallUpdate }): boolean;\n flush(): void;\n removeInvocation(options: { token: string }): void;\n close(): void;\n} {\n const invocations = new Map<string, CorrelationInvocation>();\n const candidates = new Map<string, CorrelationCandidate>();\n const suppressedToolCallIds = new Set<string>();\n const releasedToolCallIds = new Set<string>();\n let nextCandidateOrder = 0;\n let buffered: BufferedUpdate[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | undefined;\n\n const flush = () => {\n if (flushTimer != null) {\n clearTimeout(flushTimer);\n flushTimer = undefined;\n }\n if (buffered.length === 0) return;\n const updates = buffered;\n buffered = [];\n for (const update of updates) {\n if (\n isToolUpdate(update.message) &&\n suppressedToolCallIds.has(update.message.update.toolCallId)\n ) {\n continue;\n }\n if (isToolUpdate(update.message)) {\n releasedToolCallIds.add(update.message.update.toolCallId);\n }\n emitSemanticUpdate(update);\n }\n for (const toolCallId of candidates.keys()) {\n if (!suppressedToolCallIds.has(toolCallId)) {\n releasedToolCallIds.add(toolCallId);\n }\n }\n candidates.clear();\n };\n\n const scheduleFlush = () => {\n if (flushTimer != null) return;\n flushTimer = setTimeout(flush, CORRELATION_WINDOW_MS);\n flushTimer.unref?.();\n };\n\n const suppressCandidate = ({\n candidate,\n invocation,\n }: {\n candidate: CorrelationCandidate;\n invocation: CorrelationInvocation;\n }) => {\n invocation.toolCallId = candidate.toolCallId;\n suppressedToolCallIds.add(candidate.toolCallId);\n candidates.delete(candidate.toolCallId);\n deleteInvocation({ invocations, token: invocation.token });\n };\n\n const suppressToolCallUpdate = ({ toolCallId }: { toolCallId: string }) => {\n suppressedToolCallIds.add(toolCallId);\n candidates.delete(toolCallId);\n if (candidates.size === 0) flush();\n };\n\n const reconcile = () => {\n const orderedInvocations = [...invocations.values()].sort(\n (left, right) => left.order - right.order,\n );\n const orderedCandidates = [...candidates.values()].sort(\n (left, right) => left.order - right.order,\n );\n for (const invocation of orderedInvocations) {\n if (invocation.toolCallId != null) continue;\n const candidate = orderedCandidates.find(\n item =>\n candidates.has(item.toolCallId) &&\n hasPortableEvidence({ candidate: item, invocation }),\n );\n if (candidate != null) suppressCandidate({ candidate, invocation });\n }\n if (candidates.size === 0) flush();\n };\n\n return {\n update: ({ message, rawUpdate }) => {\n const preservedUpdate =\n rawUpdate === undefined ? message.update : rawUpdate;\n emitRawUpdate({ rawUpdate: preservedUpdate });\n if (!isToolUpdate(message)) {\n if (buffered.length === 0) {\n emitSemanticUpdate({ message, rawUpdate: preservedUpdate });\n } else {\n buffered.push({ message, rawUpdate: preservedUpdate });\n if (buffered.length >= MAX_BUFFERED_UPDATES) flush();\n }\n return;\n }\n\n const toolCallId = message.update.toolCallId;\n if (suppressedToolCallIds.has(toolCallId)) {\n if (isTerminalToolUpdate(message)) {\n suppressedToolCallIds.delete(toolCallId);\n removeInvocationForToolCall({ invocations, toolCallId });\n }\n return;\n }\n if (releasedToolCallIds.has(toolCallId)) {\n emitSemanticUpdate({ message, rawUpdate: preservedUpdate });\n if (isTerminalToolUpdate(message))\n releasedToolCallIds.delete(toolCallId);\n return;\n }\n\n buffered.push({ message, rawUpdate: preservedUpdate });\n const candidate =\n candidates.get(toolCallId) ??\n ({\n toolCallId,\n order: ++nextCandidateOrder,\n evidence: [],\n } satisfies CorrelationCandidate);\n candidate.evidence.push(message.update, preservedUpdate);\n candidates.set(toolCallId, candidate);\n\n const tokenMatch = findTokenInvocation({\n value: preservedUpdate,\n invocations,\n });\n if (tokenMatch != null) {\n suppressCandidate({ candidate, invocation: tokenMatch });\n }\n reconcile();\n if (buffered.length >= MAX_BUFFERED_UPDATES) flush();\n else if (buffered.length > 0) scheduleFlush();\n },\n registerInvocation: ({ token, serverName, toolName, input, order }) => {\n const invocation: CorrelationInvocation = {\n token,\n serverName,\n toolName,\n inputFingerprint: canonicalFingerprint({ value: input }),\n order,\n };\n invocations.set(token, invocation);\n invocation.expiryTimer = setTimeout(\n () => deleteInvocation({ invocations, token }),\n CORRELATION_WINDOW_MS,\n );\n invocation.expiryTimer.unref?.();\n const tokenCandidate = [...candidates.values()].find(candidate =>\n candidate.evidence.some(value =>\n containsExactValue({ value, target: token }),\n ),\n );\n if (tokenCandidate != null) {\n suppressCandidate({ candidate: tokenCandidate, invocation });\n }\n reconcile();\n },\n claimHostToolPermission: ({ toolCall }) => {\n const candidate = candidates.get(toolCall.toolCallId);\n const matches = hostTools.filter(({ name }) => {\n const permission = resolvePermissionHostTool({\n toolCall,\n serverName: hostToolServerName,\n toolName: name,\n });\n if (permission == null) return false;\n if (candidate == null) return permission.hasRequestIdentity;\n return hasPortableEvidence({\n candidate,\n invocation: {\n token: '',\n serverName: hostToolServerName,\n toolName: name,\n inputFingerprint: canonicalFingerprint({\n value: permission.input,\n }),\n order: 0,\n },\n });\n });\n if (matches.length !== 1) return false;\n suppressToolCallUpdate({ toolCallId: toolCall.toolCallId });\n return true;\n },\n flush,\n removeInvocation: ({ token }) => {\n deleteInvocation({ invocations, token });\n },\n close: () => {\n flush();\n for (const invocation of invocations.values()) {\n if (invocation.expiryTimer != null) {\n clearTimeout(invocation.expiryTimer);\n }\n }\n invocations.clear();\n candidates.clear();\n suppressedToolCallIds.clear();\n releasedToolCallIds.clear();\n },\n };\n}\n\nfunction hasPortableEvidence({\n candidate,\n invocation,\n}: {\n candidate: CorrelationCandidate;\n invocation: CorrelationInvocation;\n}): boolean {\n let hasServerIdentity = false;\n let hasToolName = false;\n let hasInput = false;\n for (const evidence of candidate.evidence) {\n const metadata = getProperty({ value: evidence, property: '_meta' });\n const rawInput = getProperty({ value: evidence, property: 'rawInput' });\n const programmaticName = getProperty({\n value: evidence,\n property: 'name',\n });\n const deferredToolName = getProperty({\n value: rawInput,\n property: 'tool_name',\n });\n const deferredToolInput = getProperty({\n value: rawInput,\n property: 'tool_input',\n });\n if (\n containsCombinedIdentity({\n value: [metadata, programmaticName],\n serverName: invocation.serverName,\n toolName: invocation.toolName,\n })\n ) {\n hasServerIdentity = true;\n hasToolName = true;\n }\n if (\n typeof deferredToolName === 'string' &&\n isRecord(deferredToolInput) &&\n hasDelimitedPair({\n value: deferredToolName,\n serverName: invocation.serverName,\n toolName: invocation.toolName,\n })\n ) {\n hasServerIdentity = true;\n hasToolName = true;\n if (\n canonicalFingerprint({ value: deferredToolInput }) ===\n invocation.inputFingerprint\n ) {\n hasInput = true;\n }\n }\n if (\n containsExactValue({\n value: [metadata, rawInput],\n target: invocation.serverName,\n })\n ) {\n hasServerIdentity = true;\n }\n if (\n programmaticName === invocation.toolName ||\n containsExactValue({\n value: [metadata, rawInput],\n target: invocation.toolName,\n })\n ) {\n hasToolName = true;\n }\n if (\n containsFingerprint({\n value: [metadata, rawInput],\n target: invocation.inputFingerprint,\n })\n ) {\n hasInput = true;\n }\n }\n return hasServerIdentity && hasToolName && hasInput;\n}\n\nfunction resolvePermissionHostTool({\n toolCall,\n serverName,\n toolName,\n}: {\n toolCall: ToolCallUpdate;\n serverName: string;\n toolName: string;\n}):\n | {\n readonly input: Readonly<Record<string, unknown>>;\n readonly hasRequestIdentity: boolean;\n }\n | undefined {\n if (!isRecord(toolCall.rawInput)) return undefined;\n const deferredToolName = getProperty({\n value: toolCall.rawInput,\n property: 'tool_name',\n });\n const deferredToolInput = getProperty({\n value: toolCall.rawInput,\n property: 'tool_input',\n });\n if (\n hasOwnProperty({ value: toolCall.rawInput, property: 'tool_name' }) &&\n hasOwnProperty({ value: toolCall.rawInput, property: 'tool_input' })\n ) {\n if (\n typeof deferredToolName !== 'string' ||\n !isRecord(deferredToolInput) ||\n !hasDelimitedPair({\n value: deferredToolName,\n serverName,\n toolName,\n })\n ) {\n return undefined;\n }\n return {\n input: deferredToolInput,\n hasRequestIdentity: true,\n };\n }\n return {\n input: toolCall.rawInput,\n hasRequestIdentity: containsCombinedIdentity({\n value: [\n getProperty({ value: toolCall, property: 'title' }),\n getProperty({ value: toolCall, property: 'name' }),\n getProperty({ value: toolCall, property: '_meta' }),\n ],\n serverName,\n toolName,\n }),\n };\n}\n\nfunction containsCombinedIdentity({\n value,\n serverName,\n toolName,\n}: {\n value: unknown;\n serverName: string;\n toolName: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (typeof candidate === 'string') {\n return hasDelimitedPair({ value: candidate, serverName, toolName });\n }\n if (candidate == null || typeof candidate !== 'object') return false;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n return false;\n };\n return visit(value);\n}\n\nfunction hasDelimitedPair({\n value,\n serverName,\n toolName,\n}: {\n value: string;\n serverName: string;\n toolName: string;\n}): boolean {\n if (serverName.length === 0 || toolName.length === 0) return false;\n let serverIndex = value.indexOf(serverName);\n while (serverIndex !== -1) {\n const beforeServer = serverIndex === 0 ? undefined : value[serverIndex - 1];\n const serverHasLeadingBoundary =\n beforeServer == null ||\n value.slice(0, serverIndex).endsWith('__') ||\n !/[A-Za-z0-9_-]/.test(beforeServer);\n const delimiterStart = serverIndex + serverName.length;\n let toolIndex = delimiterStart;\n while (toolIndex < value.length && !/[A-Za-z0-9-]/.test(value[toolIndex])) {\n toolIndex += 1;\n }\n const toolEnd = toolIndex + toolName.length;\n const afterTool = toolEnd === value.length ? undefined : value[toolEnd];\n const toolHasTrailingBoundary =\n afterTool == null ||\n value.startsWith('__', toolEnd) ||\n !/[A-Za-z0-9_-]/.test(afterTool);\n if (\n serverHasLeadingBoundary &&\n toolIndex > delimiterStart &&\n value.startsWith(toolName, toolIndex) &&\n toolHasTrailingBoundary\n ) {\n return true;\n }\n serverIndex = value.indexOf(serverName, serverIndex + 1);\n }\n return false;\n}\n\nfunction findTokenInvocation({\n value,\n invocations,\n}: {\n value: unknown;\n invocations: ReadonlyMap<string, CorrelationInvocation>;\n}): CorrelationInvocation | undefined {\n for (const invocation of invocations.values()) {\n if (containsExactValue({ value, target: invocation.token })) {\n return invocation;\n }\n }\n return undefined;\n}\n\nfunction removeInvocationForToolCall({\n invocations,\n toolCallId,\n}: {\n invocations: Map<string, CorrelationInvocation>;\n toolCallId: string;\n}): void {\n for (const [token, invocation] of invocations) {\n if (invocation.toolCallId === toolCallId) {\n deleteInvocation({ invocations, token });\n }\n }\n}\n\nfunction deleteInvocation({\n invocations,\n token,\n}: {\n invocations: Map<string, CorrelationInvocation>;\n token: string;\n}): void {\n const invocation = invocations.get(token);\n if (invocation?.expiryTimer != null) clearTimeout(invocation.expiryTimer);\n invocations.delete(token);\n}\n\nfunction isToolUpdate(\n message: SessionUpdateMessage,\n): message is SessionUpdateMessage & {\n readonly update: {\n readonly sessionUpdate: 'tool_call' | 'tool_call_update';\n readonly toolCallId: string;\n readonly status?: string | null;\n };\n} {\n return (\n message.update.sessionUpdate === 'tool_call' ||\n message.update.sessionUpdate === 'tool_call_update'\n );\n}\n\nfunction containsExactValue({\n value,\n target,\n}: {\n value: unknown;\n target: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (candidate === target) return true;\n if (candidate == null || typeof candidate !== 'object') return false;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n return false;\n };\n return visit(value);\n}\n\nfunction containsFingerprint({\n value,\n target,\n}: {\n value: unknown;\n target: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (candidate != null && typeof candidate === 'object') {\n if (canonicalFingerprint({ value: candidate }) === target) return true;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n }\n return false;\n };\n return visit(value);\n}\n\nfunction canonicalFingerprint({ value }: { value: unknown }): string {\n return JSON.stringify(canonicalizeJSON({ value }));\n}\n\nfunction canonicalizeJSON({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => canonicalizeJSON({ value: item }));\n }\n if (value == null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.keys(value as Record<string, unknown>)\n .sort()\n .filter(key => (value as Record<string, unknown>)[key] !== undefined)\n .map(key => [\n key,\n canonicalizeJSON({\n value: (value as Record<string, unknown>)[key],\n }),\n ]),\n );\n}\n\nfunction getProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): unknown {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n return Reflect.get(value, property);\n}\n\nfunction hasOwnProperty({\n value,\n property,\n}: {\n value: Readonly<Record<string, unknown>>;\n property: string;\n}): boolean {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isTerminalToolUpdate(\n message: SessionUpdateMessage,\n): message is SessionUpdateMessage & {\n readonly update: {\n readonly sessionUpdate: 'tool_call' | 'tool_call_update';\n readonly toolCallId: string;\n readonly status: 'completed' | 'failed';\n };\n} {\n return (\n isToolUpdate(message) &&\n (message.update.status === 'completed' ||\n message.update.status === 'failed')\n );\n}\n","import type {\n ActiveSessionMessage,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\nimport type {\n HarnessV1BridgeToolWire,\n HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport type { ACPToolCall } from '../../acp-tool-call';\nimport type { ACPBuiltinToolMapping } from '../acp-v1-bridge-protocol';\nimport { createACPStreamTranslator } from './stream-translator';\nimport { createHostToolCorrelation } from './host-tool-correlation';\n\nexport function createEmitStreamEvent({\n emit,\n emitToolCallCandidate,\n builtinTools,\n hostToolServerName,\n hostTools,\n}: {\n emit: (event: HarnessV1StreamPart) => void;\n emitToolCallCandidate: (options: { toolCall: ACPToolCall }) => void;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n hostToolServerName: string;\n hostTools: ReadonlyArray<HarnessV1BridgeToolWire>;\n}): {\n message: (options: {\n message: ActiveSessionMessage;\n rawUpdate?: unknown;\n }) => boolean;\n raw: (options: { rawValue: unknown }) => void;\n close: () => void;\n permissionToolCall: (options: { toolCall: ToolCallUpdate }) => void;\n claimHostToolPermission: (options: { toolCall: ToolCallUpdate }) => boolean;\n hostToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n hostToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n registerHostToolCorrelationInvocation: (options: {\n token: string;\n serverName: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n order: number;\n }) => void;\n removeHostToolCorrelationInvocation: (options: { token: string }) => void;\n} {\n const translator = createACPStreamTranslator({\n emit,\n emitToolCallCandidate,\n builtinTools,\n });\n const correlation = createHostToolCorrelation({\n emitSemanticUpdate: ({ message, rawUpdate }) => {\n translator.update({\n update: message.update,\n rawUpdate,\n preserveRaw: false,\n });\n },\n emitRawUpdate: ({ rawUpdate }) => {\n translator.raw({ rawValue: rawUpdate });\n },\n hostToolServerName,\n hostTools,\n });\n\n return {\n message: ({ message, rawUpdate }) => {\n if (message.kind === 'stop') {\n correlation.close();\n translator.finish(message.response);\n return true;\n }\n correlation.update({ message, rawUpdate });\n return false;\n },\n raw: translator.raw,\n close: () => {\n correlation.close();\n translator.close();\n },\n permissionToolCall: ({ toolCall }) => {\n translator.permissionToolCall({\n toolCall: {\n sessionUpdate: 'tool_call_update',\n ...toolCall,\n },\n });\n },\n claimHostToolPermission: correlation.claimHostToolPermission,\n hostToolCall: translator.hostToolCall,\n hostToolResult: translator.hostToolResult,\n registerHostToolCorrelationInvocation: correlation.registerInvocation,\n removeHostToolCorrelationInvocation: correlation.removeInvocation,\n };\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPInstructionMapping,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nconst UNSAFE_PATH_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\nconst serializableRecordSchema: z.ZodType<\n Readonly<Record<string, ACPSerializableValue>>\n> = z.record(z.string(), z.json());\n\nexport async function resolveACPInstructionConfiguration({\n instructions,\n instructionMapping,\n sessionMeta,\n environment,\n}: {\n instructions: string | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n environment: Readonly<Record<string, string | undefined>>;\n}): Promise<{\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n environment: Record<string, string | undefined>;\n}> {\n const resolvedEnvironment = { ...environment };\n if (\n instructionMapping == null ||\n instructions == null ||\n instructions.length === 0\n ) {\n return { sessionMeta, environment: resolvedEnvironment };\n }\n\n assertSafePath({ path: instructionMapping.path });\n\n if (instructionMapping.type === 'session-meta') {\n return {\n sessionMeta: setStringAtPath({\n record: sessionMeta ?? {},\n path: instructionMapping.path,\n value: instructions,\n }),\n environment: resolvedEnvironment,\n };\n }\n\n const serialized = resolvedEnvironment[instructionMapping.variable];\n let configuration: Readonly<Record<string, ACPSerializableValue>> = {};\n if (serialized != null && serialized.length > 0) {\n configuration = parseSerializableRecord({\n serialized,\n variable: instructionMapping.variable,\n });\n }\n\n resolvedEnvironment[instructionMapping.variable] = JSON.stringify(\n setStringAtPath({\n record: configuration,\n path: instructionMapping.path,\n value: instructions,\n }),\n );\n\n return { sessionMeta, environment: resolvedEnvironment };\n}\n\n/*\n * The bridge runs in an isolated runtime whose dependencies are limited to the\n * ones declared in this directory's package.json, so AI SDK JSON helpers are\n * unavailable here. Schema validation plus a guarded `JSON.parse` provides the\n * same guarantee: nothing but a validated serializable record escapes.\n */\nfunction parseSerializableRecord({\n serialized,\n variable,\n}: {\n serialized: string;\n variable: string;\n}): Readonly<Record<string, ACPSerializableValue>> {\n try {\n const result = serializableRecordSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error(\n `ACP instruction mapping environment variable ${JSON.stringify(variable)} must contain a JSON object.`,\n );\n}\n\nfunction setStringAtPath({\n record,\n path,\n value,\n}: {\n record: Readonly<Record<string, ACPSerializableValue>>;\n path: ReadonlyArray<string>;\n value: string;\n}): Record<string, ACPSerializableValue> {\n const [key, ...remainingPath] = path;\n if (key == null) return { ...record };\n return {\n ...record,\n [key]:\n remainingPath.length === 0\n ? value\n : setStringAtPath({\n record: isRecord(record[key]) ? record[key] : {},\n path: remainingPath,\n value,\n }),\n };\n}\n\nfunction assertSafePath({ path }: { path: ReadonlyArray<string> }): void {\n if (\n path.length === 0 ||\n path.some(\n segment => segment.length === 0 || UNSAFE_PATH_SEGMENTS.has(segment),\n )\n ) {\n throw new Error(\n 'ACP instruction mapping path must contain only safe, non-empty property names.',\n );\n }\n}\n\nfunction isRecord(\n value: ACPSerializableValue | undefined,\n): value is Readonly<Record<string, ACPSerializableValue>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\nimport { createServer, type IncomingMessage, type Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { HarnessV1BridgeToolWire } from '@ai-sdk/harness';\n\nexport type HostToolCorrelationInvocation = {\n readonly token: string;\n readonly serverName: string;\n readonly toolName: string;\n readonly input: Readonly<Record<string, unknown>>;\n readonly order: number;\n};\n\nexport type HostToolRelayTurn = {\n readonly emitToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n readonly emitToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n readonly requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n readonly registerCorrelationInvocation: (\n options: HostToolCorrelationInvocation,\n ) => void;\n readonly removeCorrelationInvocation: (options: { token: string }) => void;\n};\n\nexport type HostToolRelay = {\n readonly url: string;\n readonly credential: string;\n bindTurn(options: { turn: HostToolRelayTurn }): void;\n unbindTurn(options: { turn: HostToolRelayTurn }): void;\n updateCatalog(options: { tools: ReadonlyArray<HarnessV1BridgeToolWire> }): {\n changed: boolean;\n revision: number;\n };\n waitForCatalogRefresh(options: {\n revision: number;\n timeoutMs: number;\n }): Promise<boolean>;\n close(): Promise<void>;\n};\n\ntype CatalogState = {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n fingerprint: string;\n revision: number;\n servedRevision: number;\n closed: boolean;\n readonly changeWaiters: Set<() => void>;\n readonly refreshWaiters: Set<{\n readonly revision: number;\n readonly resolve: (refreshed: boolean) => void;\n }>;\n};\n\nexport async function startHostToolRelay({\n tools,\n serverName,\n}: {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n serverName: string;\n}): Promise<HostToolRelay> {\n const state: CatalogState = {\n tools: [...tools],\n fingerprint: catalogFingerprint({ tools }),\n revision: 1,\n servedRevision: 0,\n closed: false,\n changeWaiters: new Set(),\n refreshWaiters: new Set(),\n };\n const credential = randomBytes(32).toString('hex');\n let activeTurn: HostToolRelayTurn | undefined;\n let invocationOrder = 0;\n let closePromise: Promise<void> | undefined;\n const server = createServer(async (request, response) => {\n try {\n const result = await handleRequest({\n request,\n credential,\n state,\n serverName,\n turn: activeTurn,\n nextInvocationOrder: () => ++invocationOrder,\n });\n response.writeHead(200, { 'content-type': 'application/json' });\n response.end(JSON.stringify(result));\n } catch (error) {\n const status = error instanceof RelayRequestError ? error.status : 500;\n response.writeHead(status, { 'content-type': 'application/json' });\n response.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n await listen({ server });\n const address = server.address() as AddressInfo;\n\n return {\n url: `http://127.0.0.1:${address.port}/invoke`,\n credential,\n bindTurn: ({ turn }) => {\n if (activeTurn != null && activeTurn !== turn) {\n throw new Error('A host tool relay turn is already active.');\n }\n activeTurn = turn;\n },\n unbindTurn: ({ turn }) => {\n if (activeTurn === turn) activeTurn = undefined;\n },\n updateCatalog: ({ tools: nextTools }) => {\n const fingerprint = catalogFingerprint({ tools: nextTools });\n if (fingerprint === state.fingerprint) {\n return { changed: false, revision: state.revision };\n }\n state.tools = [...nextTools];\n state.fingerprint = fingerprint;\n state.revision += 1;\n resolveCatalogChanges({ state });\n return { changed: true, revision: state.revision };\n },\n waitForCatalogRefresh: ({ revision, timeoutMs }) =>\n waitForCatalogRefresh({ state, revision, timeoutMs }),\n close: () => {\n if (closePromise != null) return closePromise;\n state.closed = true;\n resolveCatalogChanges({ state });\n resolveRefreshWaiters({ state, closing: true });\n closePromise = closeServer({ server });\n return closePromise;\n },\n };\n}\n\nasync function handleRequest({\n request,\n credential,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n}: {\n request: IncomingMessage;\n credential: string;\n state: CatalogState;\n serverName: string;\n turn: HostToolRelayTurn | undefined;\n nextInvocationOrder: () => number;\n}): Promise<unknown> {\n if (request.method !== 'POST') {\n throw new RelayRequestError({\n status: 404,\n message: 'Unknown host tool relay endpoint.',\n });\n }\n if (\n !credentialsMatch({\n expected: credential,\n actual: request.headers.authorization,\n })\n ) {\n throw new RelayRequestError({\n status: 401,\n message: 'Invalid host tool relay credential.',\n });\n }\n const body = await readJSONBody({ request });\n if (request.url === '/catalog/next') {\n return handleCatalogNext({ body, state });\n }\n if (request.url === '/catalog/seen') {\n return handleCatalogSeen({ body, state });\n }\n if (request.url === '/invoke') {\n return handleInvocation({\n body,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n });\n }\n throw new RelayRequestError({\n status: 404,\n message: 'Unknown host tool relay endpoint.',\n });\n}\n\nasync function handleCatalogNext({\n body,\n state,\n}: {\n body: unknown;\n state: CatalogState;\n}): Promise<unknown> {\n if (\n !isRecord(body) ||\n !Number.isSafeInteger(body.afterRevision) ||\n (body.afterRevision as number) < 0\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool catalog poll request.',\n });\n }\n const afterRevision = body.afterRevision as number;\n if (!state.closed && afterRevision >= state.revision) {\n await waitForCatalogChange({ state });\n }\n if (state.closed) {\n return { closed: true, revision: state.revision };\n }\n return afterRevision < state.revision\n ? { revision: state.revision, tools: state.tools }\n : { revision: state.revision };\n}\n\nfunction handleCatalogSeen({\n body,\n state,\n}: {\n body: unknown;\n state: CatalogState;\n}): unknown {\n if (\n !isRecord(body) ||\n !Number.isSafeInteger(body.revision) ||\n (body.revision as number) < 1 ||\n (body.revision as number) > state.revision\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool catalog acknowledgment.',\n });\n }\n state.servedRevision = Math.max(\n state.servedRevision,\n body.revision as number,\n );\n resolveRefreshWaiters({ state, closing: false });\n return { acknowledged: true };\n}\n\nasync function handleInvocation({\n body,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n}: {\n body: unknown;\n state: CatalogState;\n serverName: string;\n turn: HostToolRelayTurn | undefined;\n nextInvocationOrder: () => number;\n}): Promise<{\n output: unknown;\n isError?: boolean;\n correlationToken: string;\n}> {\n if (turn == null) {\n throw new RelayRequestError({\n status: 409,\n message: 'No ACP prompt turn is active.',\n });\n }\n if (\n !isRecord(body) ||\n typeof body.requestId !== 'string' ||\n typeof body.toolName !== 'string' ||\n !isRecord(body.input) ||\n !Number.isSafeInteger(body.catalogRevision)\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool relay request.',\n });\n }\n if (body.catalogRevision !== state.revision) {\n throw new RelayRequestError({\n status: 409,\n message:\n `Host tool ${body.toolName} was invoked from stale catalog revision ` +\n `${body.catalogRevision}; the active revision is ${state.revision}.`,\n });\n }\n const tool = state.tools.find(item => item.name === body.toolName);\n if (tool == null) {\n throw new RelayRequestError({\n status: 404,\n message:\n `Host tool ${body.toolName} is not active in catalog revision ` +\n `${state.revision}.`,\n });\n }\n\n const correlationToken = randomBytes(32).toString('hex');\n turn.registerCorrelationInvocation({\n token: correlationToken,\n serverName,\n toolName: tool.name,\n input: body.input,\n order: nextInvocationOrder(),\n });\n turn.emitToolCall({\n toolCallId: body.requestId,\n toolName: tool.name,\n input: body.input,\n });\n let result: { output: unknown; isError?: boolean };\n try {\n result = await turn.requestToolResult(body.requestId);\n } catch (error) {\n turn.removeCorrelationInvocation({ token: correlationToken });\n throw error;\n }\n turn.emitToolResult({\n toolCallId: body.requestId,\n toolName: tool.name,\n output: result.output,\n ...(result.isError ? { isError: true } : {}),\n });\n return {\n output: result.output,\n ...(result.isError ? { isError: true } : {}),\n correlationToken,\n };\n}\n\nfunction waitForCatalogChange({\n state,\n}: {\n state: CatalogState;\n}): Promise<void> {\n let changeWaiter!: () => void;\n const change = new Promise<void>(resolve => {\n changeWaiter = resolve;\n state.changeWaiters.add(changeWaiter);\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<void>(resolve => {\n timer = setTimeout(resolve, 20_000);\n timer.unref?.();\n });\n return Promise.race([change, timeout]).finally(() => {\n state.changeWaiters.delete(changeWaiter);\n if (timer != null) clearTimeout(timer);\n });\n}\n\nfunction resolveCatalogChanges({ state }: { state: CatalogState }): void {\n for (const resolve of [...state.changeWaiters]) resolve();\n}\n\nfunction waitForCatalogRefresh({\n state,\n revision,\n timeoutMs,\n}: {\n state: CatalogState;\n revision: number;\n timeoutMs: number;\n}): Promise<boolean> {\n if (state.servedRevision >= revision) return Promise.resolve(true);\n if (state.closed) return Promise.resolve(false);\n let waiter!: {\n readonly revision: number;\n readonly resolve: (refreshed: boolean) => void;\n };\n const refresh = new Promise<boolean>(resolve => {\n waiter = {\n revision,\n resolve,\n };\n state.refreshWaiters.add(waiter);\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<boolean>(resolve => {\n timer = setTimeout(() => resolve(false), timeoutMs);\n timer.unref?.();\n });\n return Promise.race([refresh, timeout]).finally(() => {\n state.refreshWaiters.delete(waiter);\n if (timer != null) clearTimeout(timer);\n });\n}\n\nfunction resolveRefreshWaiters({\n state,\n closing,\n}: {\n state: CatalogState;\n closing: boolean;\n}): void {\n for (const waiter of [...state.refreshWaiters]) {\n if (closing || state.servedRevision >= waiter.revision) {\n waiter.resolve(!closing);\n }\n }\n}\n\nexport function catalogFingerprint({\n tools,\n}: {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n}): string {\n return JSON.stringify(canonicalizeJSON({ value: tools }));\n}\n\nfunction canonicalizeJSON({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => canonicalizeJSON({ value: item }));\n }\n if (!isRecord(value)) return value;\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter(key => value[key] !== undefined)\n .map(key => [key, canonicalizeJSON({ value: value[key] })]),\n );\n}\n\nasync function readJSONBody({\n request,\n}: {\n request: IncomingMessage;\n}): Promise<unknown> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > 16 * 1024 * 1024) {\n throw new RelayRequestError({\n status: 413,\n message: 'Host tool relay request is too large.',\n });\n }\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString('utf8');\n try {\n return await new Response(text, {\n headers: { 'content-type': 'application/json' },\n }).json();\n } catch {\n throw new RelayRequestError({\n status: 400,\n message: 'Host tool relay request is not valid JSON.',\n });\n }\n}\n\nfunction credentialsMatch({\n expected,\n actual,\n}: {\n expected: string;\n actual: string | undefined;\n}): boolean {\n const expectedValue = Buffer.from(`Bearer ${expected}`);\n const actualValue = Buffer.from(actual ?? '');\n return (\n expectedValue.length === actualValue.length &&\n timingSafeEqual(expectedValue, actualValue)\n );\n}\n\nfunction listen({ server }: { server: Server }): Promise<void> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject);\n resolve();\n });\n });\n}\n\nfunction closeServer({ server }: { server: Server }): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close(error => {\n if (error == null) resolve();\n else reject(error);\n });\n });\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nclass RelayRequestError extends Error {\n readonly status: number;\n\n constructor({ status, message }: { status: number; message: string }) {\n super(message);\n this.name = 'HostToolRelayRequestError';\n this.status = status;\n }\n}\n","import type { HarnessV1BridgeToolWire } from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport type { HostToolRelay } from './host-tool-relay';\n\n/*\n * Some ACP agents start session MCP servers only after receiving the first\n * prompt. Starting that prompt before waiting lets those agents discover the\n * initial catalog, while the relay's revision checks still reject stale or\n * unknown tool invocations.\n */\nexport async function promptAndRefreshInitialHostToolCatalog({\n startPrompt,\n relay,\n tools,\n harnessId,\n timeoutMs,\n}: {\n startPrompt: () => Promise<unknown>;\n relay: Pick<HostToolRelay, 'updateCatalog' | 'waitForCatalogRefresh'>;\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n harnessId: string;\n timeoutMs: number;\n}): Promise<void> {\n void startPrompt();\n await refreshHostToolCatalog({\n relay,\n tools,\n harnessId,\n timeoutMs,\n });\n}\n\nexport async function refreshHostToolCatalog({\n relay,\n tools,\n harnessId,\n timeoutMs,\n}: {\n relay: Pick<HostToolRelay, 'updateCatalog' | 'waitForCatalogRefresh'>;\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n harnessId: string;\n timeoutMs: number;\n}): Promise<void> {\n const catalog = relay.updateCatalog({ tools });\n if (!catalog.changed && tools.length === 0) return;\n if (\n await relay.waitForCatalogRefresh({\n revision: catalog.revision,\n timeoutMs,\n })\n ) {\n return;\n }\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'The ACP implementation did not load the active harness-owned MCP ' +\n `tool catalog to revision ${catalog.revision} before the next ` +\n 'prompt, so host tools cannot be exposed safely.',\n });\n}\n","import type { HarnessV1PermissionMode } from '@ai-sdk/harness';\nimport type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport type {\n RequestPermissionRequest,\n RequestPermissionResponse,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\n\ntype PendingPermission = {\n cancel(): void;\n};\n\nlet permissionRequestCounter = 0;\n\nexport function createACPPermissionController({\n turn,\n sessionId,\n permissionMode,\n hasPermissionModeMapping,\n emitToolCall,\n claimHostToolPermission,\n}: {\n turn: BridgeTurn;\n sessionId: string;\n permissionMode: HarnessV1PermissionMode;\n hasPermissionModeMapping: boolean;\n emitToolCall: (options: { toolCall: ToolCallUpdate }) => void;\n claimHostToolPermission: (options: { toolCall: ToolCallUpdate }) => boolean;\n}): {\n requestPermission(\n request: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse>;\n cancelAll(): void;\n} {\n const pendingPermissions = new Map<string, PendingPermission>();\n\n return {\n async requestPermission(request) {\n if (request.sessionId !== sessionId) {\n turn.emitWarning({\n message:\n `ACP permission request for session ${JSON.stringify(request.sessionId)} was cancelled ` +\n `because the active session is ${JSON.stringify(sessionId)}.`,\n });\n return cancelled();\n }\n const allowOnce = request.options.find(\n option => option.kind === 'allow_once',\n );\n const rejectOnce = request.options.find(\n option => option.kind === 'reject_once',\n );\n if (allowOnce == null || rejectOnce == null) {\n const missing = [\n ...(allowOnce == null ? ['allow_once'] : []),\n ...(rejectOnce == null ? ['reject_once'] : []),\n ];\n turn.emitWarning({\n message:\n `ACP permission request for tool call ${JSON.stringify(request.toolCall.toolCallId)} ` +\n `was cancelled because it did not advertise ${missing.join(' and ')}.`,\n });\n return cancelled();\n }\n if (claimHostToolPermission({ toolCall: request.toolCall })) {\n return {\n outcome: {\n outcome: 'selected',\n optionId: allowOnce.optionId,\n },\n };\n }\n if (\n !hasPermissionModeMapping &&\n shouldAutoApprove({\n permissionMode,\n kind: request.toolCall.kind,\n })\n ) {\n return {\n outcome: {\n outcome: 'selected',\n optionId: allowOnce.optionId,\n },\n };\n }\n\n const approvalId = `acp-permission-${++permissionRequestCounter}`;\n let cancelPermission!: () => void;\n const cancellation = new Promise<undefined>(resolve => {\n cancelPermission = () => resolve(undefined);\n });\n pendingPermissions.set(approvalId, {\n cancel: cancelPermission,\n });\n const approval = turn.requestToolApproval(approvalId);\n emitToolCall({ toolCall: request.toolCall });\n turn.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: request.toolCall.toolCallId,\n });\n\n try {\n const response = await Promise.race([approval, cancellation]);\n if (response == null) return cancelled();\n return {\n outcome: {\n outcome: 'selected',\n optionId: response.approved\n ? allowOnce.optionId\n : rejectOnce.optionId,\n },\n };\n } finally {\n pendingPermissions.delete(approvalId);\n }\n },\n cancelAll() {\n for (const pending of pendingPermissions.values()) {\n pending.cancel();\n }\n pendingPermissions.clear();\n },\n };\n}\n\nfunction shouldAutoApprove({\n permissionMode,\n kind,\n}: {\n permissionMode: HarnessV1PermissionMode;\n kind: ToolCallUpdate['kind'];\n}): boolean {\n if (permissionMode === 'allow-all') return true;\n if (\n kind === 'read' ||\n kind === 'search' ||\n kind === 'think' ||\n kind === 'fetch'\n ) {\n return true;\n }\n return (\n permissionMode === 'allow-edits' &&\n (kind === 'edit' || kind === 'delete' || kind === 'move')\n );\n}\n\nfunction cancelled(): RequestPermissionResponse {\n return { outcome: { outcome: 'cancelled' } };\n}\n","import type { HarnessV1PermissionMode } from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type {\n ACPPermissionModeMapping,\n ACPPermissionModeTarget,\n} from '../acp-v1-settings';\n\nconst PERMISSION_MODES = [\n 'allow-reads',\n 'allow-edits',\n 'allow-all',\n] as const satisfies ReadonlyArray<HarnessV1PermissionMode>;\n\ntype ACPSessionConfiguration = Pick<\n acp.NewSessionResponse,\n 'modes' | 'configOptions'\n>;\n\nexport async function configureACPPermissionMode({\n agent,\n sessionId,\n sessionConfiguration,\n permissionModeMapping,\n permissionMode,\n harnessId,\n}: {\n agent: acp.ClientContext;\n sessionId: string;\n sessionConfiguration: ACPSessionConfiguration;\n permissionModeMapping: ACPPermissionModeMapping;\n permissionMode: HarnessV1PermissionMode;\n harnessId: string;\n}): Promise<void> {\n const target = permissionModeMapping[permissionMode];\n if (target == null) {\n throw unsupported({\n harnessId,\n message:\n `Permission mode ${JSON.stringify(permissionMode)} is not supported by this ACP harness.` +\n (permissionModeMapping['allow-all'] == null\n ? ''\n : ` Use permissionMode: 'allow-all'.`),\n });\n }\n\n for (const mappedPermissionMode of PERMISSION_MODES) {\n const mappedTarget = permissionModeMapping[mappedPermissionMode];\n if (mappedTarget != null) {\n validateTarget({\n target: mappedTarget,\n permissionMode: mappedPermissionMode,\n sessionConfiguration,\n harnessId,\n });\n }\n }\n\n if (target.type === 'session-mode') {\n await agent.request(acp.methods.agent.session.setMode, {\n sessionId,\n modeId: target.modeId,\n });\n return;\n }\n await agent.request(acp.methods.agent.session.setConfigOption, {\n sessionId,\n configId: target.configId,\n value: target.value,\n ...(typeof target.value === 'boolean' ? { type: 'boolean' as const } : {}),\n });\n}\n\nfunction validateTarget({\n target,\n permissionMode,\n sessionConfiguration,\n harnessId,\n}: {\n target: ACPPermissionModeTarget;\n permissionMode: HarnessV1PermissionMode;\n sessionConfiguration: ACPSessionConfiguration;\n harnessId: string;\n}): void {\n if (target.type === 'session-mode') {\n const availableModeIds =\n sessionConfiguration.modes?.availableModes.map(mode => mode.id) ?? [];\n if (!availableModeIds.includes(target.modeId)) {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires session mode ` +\n `${JSON.stringify(target.modeId)}, but the agent advertised ` +\n `${formatChoices({ values: availableModeIds })}.`,\n });\n }\n return;\n }\n\n const configOption = sessionConfiguration.configOptions?.find(\n option => option.id === target.configId,\n );\n if (configOption == null) {\n const availableConfigIds =\n sessionConfiguration.configOptions?.map(option => option.id) ?? [];\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires session configuration ` +\n `${JSON.stringify(target.configId)}, but the agent advertised ` +\n `${formatChoices({ values: availableConfigIds })}.`,\n });\n }\n if (configOption.type === 'boolean') {\n if (typeof target.value !== 'boolean') {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} assigns string value ` +\n `${JSON.stringify(target.value)} to boolean session configuration ${JSON.stringify(target.configId)}.`,\n });\n }\n return;\n }\n if (typeof target.value !== 'string') {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} assigns boolean value ` +\n `${JSON.stringify(target.value)} to select session configuration ${JSON.stringify(target.configId)}.`,\n });\n }\n const availableValues = configOption.options.flatMap(option =>\n 'options' in option\n ? option.options.map(value => value.value)\n : [option.value],\n );\n if (!availableValues.includes(target.value)) {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires value ` +\n `${JSON.stringify(target.value)} for session configuration ${JSON.stringify(target.configId)}, ` +\n `but the agent advertised ${formatChoices({ values: availableValues })}.`,\n });\n }\n}\n\nfunction formatChoices({ values }: { values: ReadonlyArray<string> }): string {\n return values.length === 0\n ? 'no matching choices'\n : values.map(value => JSON.stringify(value)).join(', ');\n}\n\nfunction unsupported({\n harnessId,\n message,\n}: {\n harnessId: string;\n message: string;\n}): HarnessBridgeCapabilityUnsupportedError {\n return new HarnessBridgeCapabilityUnsupportedError({ harnessId, message });\n}\n","import { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type { ACPInitializeResult } from './protocol-configuration';\n\nexport type ACPActiveSession = {\n readonly sessionId: string;\n readonly newSessionResponse: acp.NewSessionResponse;\n prompt(prompt: Array<acp.ContentBlock>): Promise<acp.PromptResponse>;\n promptWithMeta?(options: {\n prompt: Array<acp.ContentBlock>;\n meta: Record<string, unknown>;\n }): Promise<acp.PromptResponse>;\n nextUpdate(): Promise<acp.ActiveSessionMessage>;\n dispose(): void;\n};\n\nexport function assertACPResumeCapability({\n initialization,\n harnessId,\n}: {\n initialization: ACPInitializeResult;\n harnessId: string;\n}): void {\n const sessionCapabilities = initialization.agentCapabilities\n ?.sessionCapabilities as Readonly<Record<string, unknown>> | undefined;\n if (\n sessionCapabilities?.resume == null ||\n sessionCapabilities.resume === false\n ) {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'ACP process-loss rerun requires the agent to advertise sessionCapabilities.resume; a fresh unrelated ACP session will not be created.',\n });\n }\n}\n\nexport function createACPRecoveredSession({\n agent,\n sessionId,\n restorationResponse,\n updates,\n}: {\n agent: acp.ClientContext;\n sessionId: string;\n restorationResponse: acp.ResumeSessionResponse | acp.LoadSessionResponse;\n updates: ReturnType<typeof createACPRecoveredSessionUpdates>;\n}): ACPActiveSession {\n let disposed = false;\n return {\n sessionId,\n newSessionResponse: {\n sessionId,\n ...restorationResponse,\n },\n prompt: async prompt => {\n if (disposed) {\n throw new Error('Recovered ACP session is disposed.');\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n { sessionId, prompt },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n },\n promptWithMeta: async ({ prompt, meta }) => {\n if (disposed) {\n throw new Error('Recovered ACP session is disposed.');\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n { sessionId, prompt, _meta: meta },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n },\n nextUpdate: () => updates.next(),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n updates.fail(new Error('Recovered ACP session disposed.'));\n },\n };\n}\n\nexport function createACPRecoveredSessionUpdates(): {\n enqueue(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n clearErrors(): void;\n fail(error: unknown): void;\n next(): Promise<acp.ActiveSessionMessage>;\n} {\n type Entry =\n | { readonly type: 'value'; readonly value: acp.ActiveSessionMessage }\n | { readonly type: 'error'; readonly error: unknown };\n const values: Entry[] = [];\n const waiters: Array<{\n resolve(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n }> = [];\n let failure: unknown;\n let failed = false;\n return {\n enqueue(value) {\n if (failed) return;\n const waiter = waiters.shift();\n if (waiter == null) values.push({ type: 'value', value });\n else waiter.resolve(value);\n },\n reject(error) {\n if (failed) return;\n const waiter = waiters.shift();\n if (waiter == null) values.push({ type: 'error', error });\n else waiter.reject(error);\n },\n clearErrors() {\n for (let index = values.length - 1; index >= 0; index--) {\n if (values[index]?.type === 'error') values.splice(index, 1);\n }\n },\n fail(error) {\n if (failed) return;\n failed = true;\n failure = error;\n for (const waiter of waiters.splice(0)) waiter.reject(error);\n },\n next() {\n const entry = values.shift();\n if (entry?.type === 'value') return Promise.resolve(entry.value);\n if (entry?.type === 'error') {\n return Promise.reject(\n entry.error instanceof Error\n ? entry.error\n : new Error('Recovered ACP session update failed.'),\n );\n }\n if (failed) {\n return Promise.reject(\n failure instanceof Error\n ? failure\n : new Error('Recovered ACP session update stream failed.'),\n );\n }\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n };\n}\n","import { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type { ACPInitializeResult } from './protocol-configuration';\n\nexport type ACPSessionRestorationMethod = 'resume' | 'load';\n\nexport function resolveACPSessionRestorationMethod({\n initialization,\n harnessId,\n}: {\n initialization: ACPInitializeResult;\n harnessId: string;\n}): ACPSessionRestorationMethod {\n const sessionCapabilities = initialization.agentCapabilities\n ?.sessionCapabilities as Readonly<Record<string, unknown>> | undefined;\n if (\n sessionCapabilities?.resume != null &&\n sessionCapabilities.resume !== false\n ) {\n return 'resume';\n }\n if (initialization.agentCapabilities?.loadSession === true) {\n return 'load';\n }\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'Cold ACP session restoration requires the agent to advertise sessionCapabilities.resume or loadSession; a fresh unrelated ACP session will not be created.',\n });\n}\n\nexport async function restoreACPBridgeSession({\n agent,\n initialization,\n sessionId,\n cwd,\n mcpServers,\n meta,\n harnessId,\n setHistoricalUpdatesSuppressed,\n discardCapturedHistory,\n}: {\n agent: acp.ClientContext;\n initialization: ACPInitializeResult;\n sessionId: string;\n cwd: string;\n mcpServers: ReadonlyArray<acp.McpServer>;\n meta: Readonly<Record<string, unknown>> | undefined;\n harnessId: string;\n setHistoricalUpdatesSuppressed(options: { suppressed: boolean }): void;\n discardCapturedHistory(): void;\n}): Promise<{\n method: ACPSessionRestorationMethod;\n response: acp.ResumeSessionResponse | acp.LoadSessionResponse;\n}> {\n const method = resolveACPSessionRestorationMethod({\n initialization,\n harnessId,\n });\n setHistoricalUpdatesSuppressed({ suppressed: true });\n try {\n const request = {\n sessionId,\n cwd,\n mcpServers: [...mcpServers],\n ...(meta == null ? {} : { _meta: meta }),\n };\n const response =\n method === 'resume'\n ? await agent.request<\n acp.ResumeSessionResponse,\n acp.ResumeSessionRequest\n >(acp.methods.agent.session.resume, request)\n : await agent.request<acp.LoadSessionResponse, acp.LoadSessionRequest>(\n acp.methods.agent.session.load,\n request,\n );\n discardCapturedHistory();\n return { method, response };\n } finally {\n setHistoricalUpdatesSuppressed({ suppressed: false });\n }\n}\n"],"mappings":"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","names":["bridgeType","bridgeStateDir","acp","writeFile","isRecord","getStringProperty","name","child","isRecord","result","name","isRecord","z","serializableRecordSchema","isRecord","isRecord","canonicalizeJSON","acp","acp","unknownUsage","writeFile","name","isRecord","implementationDir","child","session","args"]}
|
|
1
|
+
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/v1/bridge/index.ts","../../src/v1/bridge/acp-v1-bridge-environment.ts","../../src/v1/bridge/profile-values.ts","../../src/v1/bridge/protocol-configuration.ts","../../src/v1/bridge/acp-stream-capture.ts","../../src/v1/bridge/acp-diagnostics.ts","../../src/v1/bridge/agent-stderr-monitor.ts","../../src/v1/bridge/stream-translator.ts","../../src/v1/bridge/host-tool-correlation.ts","../../src/v1/bridge/create-emit-stream-event.ts","../../src/v1/bridge/instruction-mapping.ts","../../src/v1/bridge/host-tool-relay.ts","../../src/v1/bridge/refresh-host-tool-catalog.ts","../../src/v1/bridge/permission-controller.ts","../../src/v1/bridge/permission-mode.ts","../../src/v1/bridge/model-mapping.ts","../../src/v1/bridge/recovered-session.ts","../../src/v1/bridge/session-lifecycle.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, the in-memory event log +\n// monotonic `seq`, resume replay, and the lifecycle/meta files. Any number of\n// hosts may be connected; exactly one of them owns the event stream, and\n// `start`/`resume` transfer that ownership. The adapter supplies only `onStart`\n// (drive its CLI/SDK and translate to wire events) and lifecycle cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport { HarnessBridgeCapabilityUnsupportedError } from './harness-bridge-capability-unsupported-error';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface Experimental_BridgeUserMessage {\n readonly messageId: string;\n readonly text: string;\n accept(): void;\n reject(error: unknown): void;\n}\n\nexport interface Experimental_BridgeUserMessageQueue extends AsyncIterable<Experimental_BridgeUserMessage> {\n readonly pendingCount: number;\n close(error?: unknown): void;\n}\n\ntype InternalBridgeUserMessageQueue = Experimental_BridgeUserMessageQueue & {\n enqueue(input: { messageId: string; text: string }): void;\n};\n\ntype BridgeUserMessageResponse = {\n type: 'user-message-response';\n messageId: string;\n accepted: boolean;\n error?: { message: string };\n};\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n if (typeof err === 'string') {\n return { message: err };\n }\n if (err !== null && typeof err === 'object') {\n try {\n return { message: JSON.stringify(err) };\n } catch {}\n }\n return { message: String(err) };\n}\n\nfunction createBridgeUserMessageQueue(options: {\n respond(response: BridgeUserMessageResponse): void;\n}): InternalBridgeUserMessageQueue {\n const messages: Experimental_BridgeUserMessage[] = [];\n const waiters: Array<\n (result: IteratorResult<Experimental_BridgeUserMessage>) => void\n > = [];\n const entries = new Map<\n string,\n {\n response?: BridgeUserMessageResponse;\n reject(error: unknown): void;\n }\n >();\n let closed = false;\n let pendingCount = 0;\n\n const enqueue = (input: { messageId: string; text: string }): void => {\n const existing = entries.get(input.messageId);\n if (existing != null) {\n if (existing.response != null) {\n options.respond(existing.response);\n }\n return;\n }\n\n let settled = false;\n const settle = (response: BridgeUserMessageResponse): void => {\n if (settled) return;\n settled = true;\n pendingCount--;\n const entry = entries.get(input.messageId);\n if (entry != null) entry.response = response;\n options.respond(response);\n };\n const message: Experimental_BridgeUserMessage = {\n messageId: input.messageId,\n text: input.text,\n accept: () => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: true,\n });\n },\n reject: error => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: false,\n error: { message: formatBridgeError(error).message },\n });\n },\n };\n entries.set(input.messageId, {\n reject: message.reject,\n });\n pendingCount++;\n\n if (closed) {\n message.reject(\n new Error('The bridge turn is no longer accepting user messages.'),\n );\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter != null) {\n waiter({ done: false, value: message });\n } else {\n messages.push(message);\n }\n };\n\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n const reason =\n error ??\n new Error('The bridge turn ended before accepting the user message.');\n for (const entry of entries.values()) {\n if (entry.response == null) entry.reject(reason);\n }\n messages.length = 0;\n while (waiters.length > 0) {\n waiters.shift()!({ done: true, value: undefined });\n }\n };\n\n return {\n get pendingCount() {\n return pendingCount;\n },\n enqueue,\n close,\n [Symbol.asyncIterator]() {\n return {\n next: () => {\n const message = messages.shift();\n if (message != null) {\n return Promise.resolve({ done: false as const, value: message });\n }\n if (closed) {\n return Promise.resolve({\n done: true as const,\n value: undefined,\n });\n }\n return new Promise<IteratorResult<Experimental_BridgeUserMessage>>(\n resolve => {\n waiters.push(resolve);\n },\n );\n },\n };\n },\n };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n toolCallId: string,\n ): Promise<{ output: unknown; isError?: boolean }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n readonly experimental_userMessages: Experimental_BridgeUserMessageQueue;\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n\n /**\n * Emit a non-fatal bridge warning to stderr using the runtime's harness\n * prefix. This is diagnostic-only: it does not emit a stream event, does not\n * consume a `seq`, and does not fail the turn.\n */\n emitWarning(input: { message: string }): void;\n\n emitError(input: { error: unknown; message?: string }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /**\n * Drive one prompt turn. Rejections surface to the host as an `error`\n * event.\n *\n * Contract: once `turn.abortSignal` fires, wind down promptly — turns are\n * serialized, and a replacement `start` waits up to\n * {@link turnTeardownGraceMs} for this promise to settle before it\n * proceeds anyway.\n */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /**\n * How long a replacement `start` waits for the previous turn's teardown\n * after aborting it, in milliseconds. Turns are serialized so an aborted\n * turn cannot emit into its replacement's event log or overlap its runtime\n * process — but only within this bound: an adapter that does not settle\n * `onStart` after its abort signal fires forfeits the protection for that\n * boundary, and the new turn proceeds anyway rather than blocking forever.\n * The default of ten seconds exceeds the Claude bridge's five-second\n * hard-abort fallback.\n */\n turnTeardownGraceMs?: number;\n /**\n * Produce the adapter-defined runtime resume data for `stop`. Defaults to\n * `{}`.\n */\n onStop?(): unknown | Promise<unknown>;\n /**\n * Perform adapter-defined destruction before the bridge exits.\n */\n onDestroy?(): void | Promise<void>;\n /** WS port. Defaults to `BRIDGE_WS_PORT` env (0 = OS-assigned). */\n port?: number;\n /** Auth token. Defaults to `BRIDGE_CHANNEL_TOKEN` env. */\n token?: string;\n /** Called with the bound port once the server is listening. */\n onListening?(port: number): void;\n /**\n * Tear the process down after `stop` / `destroy`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; messageId?: string; text: string }\n | { type: 'abort' }\n | { type: 'stop' }\n | { type: 'destroy' }\n | { type: 'resume'; lastSeenEventId: number };\n\nconst WS_OPEN = 1;\n\n/**\n * Boot the bridge: bind the WebSocket server, announce `bridge-ready`, and\n * service host connections for the lifetime of the process. Resolves once the\n * server is listening; the process then stays alive on the server until a\n * `stop` / `destroy` exits it.\n */\nexport interface BridgeHandle {\n /** The port the WebSocket server bound to. */\n readonly port: number;\n /** Close the WebSocket server. Does not call `process.exit`. */\n close(): Promise<void>;\n}\n\nexport async function runBridge<TStart extends { type: 'start' }>(\n options: RunBridgeOptions<TStart>,\n): Promise<BridgeHandle> {\n const { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n const teardownGraceMs = options.turnTeardownGraceMs ?? 10_000;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n /*\n * The one connection turn events stream to. A socket claims it by asking for\n * work — `start` (a turn) or `resume` (a catch-up) — never by connecting:\n * every event goes here alone, so claiming on connect would silence a turn\n * already streaming to someone else. Any number of sockets may be connected;\n * the others still exchange control frames, they just get no events.\n */\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: InternalBridgeUserMessageQueue | undefined;\n /**\n * Settles when the in-flight turn has fully wound down — `onStart`\n * returned or threw AND its completion state was recorded. `undefined`\n * between turns. A new `start` fences on this so turns never overlap.\n */\n let activeTurn: Promise<void> | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the in-flight turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n (output: { output: unknown; isError?: boolean }) => void\n >();\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(line);\n } catch {\n // Send is best-effort: a dropped socket leaves the event in the log,\n // replayed once the host reconnects and sends `resume`.\n }\n }\n };\n\n const replay = (ws: WebSocket, afterSeq: number): void => {\n for (const entry of eventLog) {\n if (entry.seq > afterSeq && ws.readyState === WS_OPEN) {\n ws.send(entry.line);\n }\n }\n };\n\n // ─── diagnostics ──────────────────────────────────────────────\n const shouldEmitDebugEvent = (\n level: BridgeDebugLevel,\n subsystem: string,\n ): boolean => {\n if (!debugConfig?.enabled) return false;\n const threshold = debugConfig.level ?? 'debug';\n if (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n return subsystemMatches(debugConfig.subsystems, subsystem);\n };\n\n /*\n * Forward sandbox console output. We line-buffer the original writers (kept so\n * output still reaches the real fds) and emit one `sandbox-log` per complete\n * line. `emit` never writes to stdout/stderr, so there is no recursion.\n * Installed lazily the first time a turn enables diagnostics; once installed,\n * capture is gated per-write on `debugConfig.enabled` so a later turn can\n * disable it. Console capture is independent of the subsystem/level filter.\n */\n const rawStdoutWrite = process.stdout.write.bind(process.stdout);\n const rawStderrWrite = process.stderr.write.bind(process.stderr);\n\n const writeErrorToStderr = (input: {\n message: string;\n error: unknown;\n }): void => {\n try {\n const formatted = formatBridgeError(input.error);\n rawStderrWrite(\n `[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`,\n );\n if (formatted.stack) {\n rawStderrWrite(`${formatted.stack}\\n`);\n }\n } catch {}\n };\n\n const emitWarning = (input: { message: string }): void => {\n try {\n for (const line of input.message.split('\\n')) {\n if (line.trim().length > 0) {\n rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n }\n }\n } catch {}\n };\n\n const emitError = (input: { error: unknown; message?: string }): void => {\n writeErrorToStderr({\n message: input.message ?? 'bridge error',\n error: input.error,\n });\n emit({ type: 'error', error: serialiseError(input.error) });\n };\n\n const installConsoleCapture = (): void => {\n if (consoleCaptureInstalled) return;\n consoleCaptureInstalled = true;\n const buffers: { stdout: string; stderr: string } = {\n stdout: '',\n stderr: '',\n };\n const patch =\n (stream: 'stdout' | 'stderr', raw: typeof process.stdout.write) =>\n (chunk: unknown, encoding?: unknown, cb?: unknown): boolean => {\n if (debugConfig?.enabled) {\n try {\n const enc = typeof encoding === 'string' ? encoding : 'utf8';\n const text =\n typeof chunk === 'string'\n ? chunk\n : Buffer.from(chunk as Uint8Array).toString(\n enc as BufferEncoding,\n );\n const combined = buffers[stream] + text.replace(/\\r\\n/g, '\\n');\n const parts = combined.split('\\n');\n buffers[stream] = parts.pop() ?? '';\n for (const line of parts) {\n const trimmed = line.replace(/\\s+$/, '');\n if (trimmed) {\n emit({\n type: 'sandbox-log',\n source: bridgeType,\n stream,\n line: trimmed,\n });\n }\n }\n } catch {\n // Never let capture break real output.\n }\n }\n return (raw as (c: unknown, e?: unknown, cb?: unknown) => boolean)(\n chunk,\n encoding,\n cb,\n );\n };\n process.stdout.write = patch(\n 'stdout',\n rawStdoutWrite,\n ) as typeof process.stdout.write;\n process.stderr.write = patch(\n 'stderr',\n rawStderrWrite,\n ) as typeof process.stderr.write;\n };\n\n // ─── inbound routing ────────────────────────────────────────────────\n const handleInbound = async (\n msg: TStart | InboundControl,\n ws: WebSocket,\n ): Promise<void> => {\n switch (msg.type) {\n case 'start': {\n /*\n * A new turn replaces the active one — but only after the active one\n * has fully wound down. Inbound frames are dispatched concurrently,\n * and the host settles a caller abort immediately, so a retry's\n * `start` can arrive while the aborted turn is still tearing down\n * (e.g. a graceful interrupt). Without this fence the old turn would\n * keep emitting into the new turn's cleared event log, two runtime\n * processes would run side by side, and the old turn's completion\n * would mark the bridge `waiting` underneath the new turn. Abort the\n * old turn to hasten its teardown; adapters are expected to bound\n * that teardown themselves (e.g. a hard-abort fallback), but the\n * runtime does not rely on it: the wait is capped by the teardown\n * grace period, after which the new turn proceeds anyway — the\n * pre-fence overlapping behavior — rather than hanging behind a\n * teardown that never settles.\n */\n for (;;) {\n const pendingTurn = activeTurn;\n if (pendingTurn == null) break;\n turnAbort?.abort();\n currentUserMessages?.close(\n new Error('A new bridge turn replaced the active turn.'),\n );\n let graceTimer: ReturnType<typeof setTimeout> | undefined;\n const settled = await Promise.race([\n pendingTurn.then(() => true as const),\n new Promise<false>(resolve => {\n graceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n graceTimer.unref?.();\n }),\n ]);\n clearTimeout(graceTimer);\n if (!settled) break;\n }\n let turnFinished!: () => void;\n const thisTurn = new Promise<void>(resolve => (turnFinished = resolve));\n activeTurn = thisTurn;\n activeSocket = ws; // asking for a turn claims the event stream\n const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const userMessages = createBridgeUserMessageQueue({ respond: emit });\n const turn: BridgeTurn = {\n emit,\n requestToolResult: toolCallId =>\n new Promise(resolve => {\n pendingToolResults.set(toolCallId, resolve);\n }),\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n experimental_userMessages: userMessages,\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n emitWarning,\n emitError,\n };\n currentUserMessages = userMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\n userMessages.close();\n if (currentUserMessages === userMessages) {\n currentUserMessages = undefined;\n }\n // Only the still-active turn records completion: after a fence\n // timeout a replacement turn is already running, and this stale\n // completion must not mark the bridge waiting underneath it.\n if (activeTurn === thisTurn) {\n activeTurn = undefined;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n turnFinished();\n }\n return;\n }\n case 'tool-result': {\n const resolver = pendingToolResults.get(msg.toolCallId);\n if (resolver) {\n pendingToolResults.delete(msg.toolCallId);\n resolver({ output: msg.output, isError: msg.isError });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message': {\n const messageId = msg.messageId ?? randomUUID();\n if (currentUserMessages == null) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: { message: 'The bridge has no active turn to steer.' },\n });\n return;\n }\n if (ws !== activeSocket) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: {\n message: 'The connection does not own the active bridge turn.',\n },\n });\n return;\n }\n currentUserMessages.enqueue({\n messageId,\n text: msg.text,\n });\n return;\n }\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n activeSocket = ws; // asking for a catch-up claims it too\n // Synchronous, so no event can slip out live ahead of the replayed tail.\n replay(ws, msg.lastSeenEventId);\n return;\n case 'destroy':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n await onDestroy?.();\n drainThenExit(ws, 1000, 'destroy');\n return;\n case 'stop': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onStop?.()) ?? {};\n sendControl(ws, { type: 'bridge-stop', data });\n drainThenExit(ws, 1000, 'stop');\n return;\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean stop/destroy leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl(ws, {\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n capabilities: { experimental_userMessageResponses: true },\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl(ws, {\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the stream owner's close matters; a socket that never claimed it,\n // or that a later `start`/`resume` displaced, closes as a no-op.\n // Crucially we do NOT abort the in-flight turn: it keeps running and its\n // events accumulate in the log for replay on reconnect.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\n });\n\n ws.on('error', () => {\n // 'close' follows; nothing to do beyond keeping the process alive.\n });\n });\n\n // Surface bridge-internal crashes to the host instead of dying silently.\n process.on('uncaughtException', err => {\n emitError({ error: err, message: 'uncaught exception' });\n });\n process.on('unhandledRejection', err => {\n emitError({ error: err, message: 'unhandled rejection' });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\n/*\n * Control frames answer the socket that sent the frame they reply to, so the\n * target is always explicit. Event streaming is the separate, stateful path\n * (`emit` → `activeSocket`); this one carries no state at all.\n */\nfunction sendControl(\n socket: WebSocket | undefined,\n message: Record<string, unknown>,\n): void {\n if (socket?.readyState === WS_OPEN) {\n try {\n socket.send(JSON.stringify(message));\n } catch {\n // best-effort\n }\n }\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","const name = 'AI_HarnessBridgeCapabilityUnsupportedError';\n\n/**\n * Signals an unsupported capability discovered inside a sandbox bridge.\n * `isInstance` also recognizes the serialized error shape received by the\n * host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n */\nexport class HarnessBridgeCapabilityUnsupportedError extends Error {\n readonly harnessId?: string;\n readonly cause?: unknown;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super(message);\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n this.cause = cause;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessBridgeCapabilityUnsupportedError {\n return (\n error != null &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === name &&\n 'message' in error &&\n typeof error.message === 'string'\n );\n }\n}\n","import {\n HarnessBridgeCapabilityUnsupportedError,\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport { Readable, Writable } from 'node:stream';\nimport { argv, env as processEnv } from 'node:process';\nimport {\n ACP_BRIDGE_CONFIGURATION_ENV,\n readACPBridgeEnvironment,\n} from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { StartMessage } from '../acp-v1-bridge-protocol';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport type { ACPGatewayValues } from './profile-values';\nimport {\n assertACPAuthenticationMethod,\n createACPInitializeRequest,\n resolveACPLaunchEnvironment,\n validateACPProtocolVersion,\n type ACPInitializeResult,\n} from './protocol-configuration';\nimport { captureACPStream, type ACPStreamCapture } from './acp-stream-capture';\nimport {\n createACPBridgeError,\n createACPInitializationDiagnostic,\n} from './acp-diagnostics';\nimport { monitorACPAgentStderr } from './agent-stderr-monitor';\nimport { createEmitStreamEvent } from './create-emit-stream-event';\nimport { resolveACPInstructionConfiguration } from './instruction-mapping';\nimport {\n startHostToolRelay,\n type HostToolRelay,\n type HostToolRelayTurn,\n} from './host-tool-relay';\nimport {\n promptAndRefreshInitialHostToolCatalog,\n refreshHostToolCatalog,\n} from './refresh-host-tool-catalog';\nimport { createACPPermissionController } from './permission-controller';\nimport { configureACPPermissionMode } from './permission-mode';\nimport { configureACPModel } from './model-mapping';\nimport {\n assertACPResumeCapability,\n createACPRecoveredSession,\n createACPRecoveredSessionUpdates,\n type ACPActiveSession,\n} from './recovered-session';\nimport {\n restoreACPBridgeSession,\n type ACPSessionRestorationMethod,\n} from './session-lifecycle';\n\ntype ImplementationDescriptor = {\n readonly executablePath: string;\n readonly privateHome: boolean;\n readonly args: ReadonlyArray<string>;\n readonly envKeys: ReadonlyArray<string>;\n};\n\nconst HOST_TOOL_MCP_SERVER_NAME = 'ai-sdk-harness-tools';\nconst CATALOG_REFRESH_TIMEOUT_MS = 10_000;\n\nconst args = parseArgs({ args: argv.slice(2) });\nconst workDir = requireArg({ value: args.workDir, name: '--workdir' });\nconst bridgeStateDir = requireArg({\n value: args.bridgeStateDir,\n name: '--bridge-state-dir',\n});\nconst implementationDir = requireArg({\n value: args.implementationDir,\n name: '--implementation-dir',\n});\nconst bridgeType = requireArg({\n value: args.bridgeType,\n name: '--bridge-type',\n});\nconst implementation = await readImplementationDescriptor({\n path: `${implementationDir}/implementation.json`,\n});\nconst bridgeConfiguration = await readACPBridgeEnvironment({ env: processEnv });\n\nlet child: ChildProcessWithoutNullStreams | undefined;\nlet agentResponseStreamFailure: Promise<never> | undefined;\nlet connection: acp.ClientConnection | undefined;\nlet session: ACPActiveSession | undefined;\nlet recoveredSessionUpdates:\n | ReturnType<typeof createACPRecoveredSessionUpdates>\n | undefined;\nlet recoveredSessionId: string | undefined;\nlet sessionConfigurationFingerprint: string | undefined;\nlet streamCapture: ACPStreamCapture | undefined;\nlet initializationDiagnostic: Record<string, unknown> | undefined;\nlet hostToolRelay: HostToolRelay | undefined;\nlet catalogRefreshError: HarnessBridgeCapabilityUnsupportedError | undefined;\nlet sessionConfigurationFailure: { readonly error: unknown } | undefined;\nlet historicalUpdatesSuppressed = false;\nlet coldRestorationMethod: ACPSessionRestorationMethod | undefined;\nlet activePermissionController:\n | ReturnType<typeof createACPPermissionController>\n | undefined;\n\nawait runBridge<StartMessage>({\n bridgeType,\n bridgeStateDir,\n onStart: runTurn,\n onStop: () => (session == null ? {} : { sessionId: session.sessionId }),\n onExit: () => {\n let exited = false;\n const finish = () => {\n if (exited) return;\n exited = true;\n session?.dispose();\n connection?.close();\n child?.kill();\n process.exit(0);\n };\n if (hostToolRelay == null) {\n finish();\n return;\n }\n const timer = setTimeout(finish, 1000);\n timer.unref();\n void hostToolRelay.close().finally(() => {\n clearTimeout(timer);\n finish();\n });\n },\n});\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n let initialHostToolCatalogRefreshRequired: boolean;\n try {\n ({ initialHostToolCatalogRefreshRequired } = await ensureSession({\n start,\n turn,\n }));\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) throw error;\n throw createACPBridgeError({\n stage: 'session initialization',\n cause: error,\n });\n }\n const activeSession = session;\n if (activeSession == null) {\n throw new Error('ACP session initialization did not produce a session.');\n }\n const activeAgentResponseStreamFailure = agentResponseStreamFailure;\n if (activeAgentResponseStreamFailure == null) {\n throw new Error(\n 'ACP session initialization did not start stderr monitoring.',\n );\n }\n const activeHostToolRelay = hostToolRelay;\n if (activeHostToolRelay == null) {\n throw new Error('The host tool MCP relay is unavailable.');\n }\n if (start.recoveryMode?.type === 'lossy-rerun') {\n const marker = {\n type: 'acp-recovery',\n mode: 'lossy-rerun',\n reason: start.recoveryMode.reason,\n } as const;\n turn.emit({ type: 'raw', rawValue: marker });\n turn.bridgeLog({\n level: 'warn',\n subsystem: 'acp.recovery',\n message:\n 'The ACP process was replaced; the original prompt is being rerun against the resumed ACP session.',\n attrs: marker,\n });\n turn.emitWarning({\n message:\n 'ACP process-loss recovery is rerunning the interrupted prompt and may repeat work.',\n });\n }\n turn.emit({\n type: 'bridge-thread',\n threadId: activeSession.sessionId,\n });\n if (initializationDiagnostic != null) {\n turn.bridgeLog({\n level: 'info',\n subsystem: 'acp.protocol',\n message: 'ACP session initialized.',\n attrs: initializationDiagnostic,\n });\n }\n if (start.recoveryMode?.type === 'cold-restore') {\n const marker = {\n type: 'acp-session-restored',\n method: coldRestorationMethod,\n } as const;\n turn.emit({ type: 'raw', rawValue: marker });\n turn.bridgeLog({\n level: 'info',\n subsystem: 'acp.lifecycle',\n message: 'ACP session restored in a replacement bridge process.',\n attrs: marker,\n });\n turn.emit({\n type: 'finish',\n finishReason: {\n unified: 'stop',\n raw: 'acp-session-restored',\n },\n totalUsage: unknownUsage(),\n });\n return;\n }\n\n await configureACPModel({\n agent: connection!.agent,\n sessionId: activeSession.sessionId,\n model: start.model,\n mapping: start.modelMapping,\n });\n\n let rejectCancellationFailure!: (error: unknown) => void;\n const cancellationFailure = new Promise<never>((_, reject) => {\n rejectCancellationFailure = reject;\n });\n void cancellationFailure.catch(() => {});\n let cancellationRequested = false;\n let cancellationFailureError: Error | undefined;\n const cancel = async () => {\n if (cancellationRequested) return;\n cancellationRequested = true;\n activePermissionController?.cancelAll();\n try {\n if (connection == null) {\n throw new Error('ACP connection closed before cancellation.');\n }\n await connection.agent.notify(acp.methods.agent.session.cancel, {\n sessionId: activeSession.sessionId,\n });\n } catch (error) {\n cancellationFailureError = createACPBridgeError({\n stage: 'session cancellation',\n cause: error,\n });\n rejectCancellationFailure(cancellationFailureError);\n }\n };\n turn.emit({ type: 'stream-start' });\n const emitStreamEvent = createEmitStreamEvent({\n emit: event => turn.emit(event as BridgeEvent),\n emitToolCallCandidate: ({ toolCall }) => {\n turn.emit({\n type: 'acp-tool-call-candidate',\n toolCall,\n });\n },\n builtinTools: start.builtinTools,\n hostToolServerName: HOST_TOOL_MCP_SERVER_NAME,\n hostTools: start.tools ?? [],\n });\n const permissionController = createACPPermissionController({\n turn,\n sessionId: activeSession.sessionId,\n permissionMode: start.permissionMode ?? 'allow-all',\n hasPermissionModeMapping: start.permissionModeMapping != null,\n emitToolCall: emitStreamEvent.permissionToolCall,\n claimHostToolPermission: emitStreamEvent.claimHostToolPermission,\n });\n activePermissionController = permissionController;\n const relayTurn: HostToolRelayTurn = {\n emitToolCall: emitStreamEvent.hostToolCall,\n emitToolResult: emitStreamEvent.hostToolResult,\n requestToolResult: toolCallId => turn.requestToolResult(toolCallId),\n registerCorrelationInvocation:\n emitStreamEvent.registerHostToolCorrelationInvocation,\n removeCorrelationInvocation:\n emitStreamEvent.removeHostToolCorrelationInvocation,\n };\n activeHostToolRelay.bindTurn({ turn: relayTurn });\n try {\n const promptMeta = createOutputSchemaPromptMeta({ start });\n const startPrompt = () =>\n promptActiveSession({\n session: activeSession,\n agent: connection!.agent,\n prompt: start.prompt,\n meta: promptMeta,\n });\n if (initialHostToolCatalogRefreshRequired) {\n try {\n await promptAndRefreshInitialHostToolCatalog({\n startPrompt,\n relay: activeHostToolRelay,\n tools: start.tools ?? [],\n harnessId: bridgeType,\n timeoutMs: CATALOG_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n sessionConfigurationFailure = { error };\n throw error;\n }\n } else {\n void startPrompt();\n }\n if (turn.abortSignal.aborted) {\n await cancel();\n } else {\n turn.abortSignal.addEventListener('abort', () => void cancel(), {\n once: true,\n });\n }\n for (;;) {\n let message: acp.ActiveSessionMessage;\n try {\n message = await Promise.race([\n activeSession.nextUpdate(),\n cancellationFailure,\n activeAgentResponseStreamFailure,\n ]);\n } catch (error) {\n for (const rawValue of streamCapture?.drainRawValues() ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n emitStreamEvent.close();\n if (error === cancellationFailureError) throw error;\n throw createACPBridgeError({\n stage: 'prompt update stream',\n cause: error,\n });\n }\n if (message.kind === 'session_update') {\n const captured = streamCapture?.takeForUpdate({\n update: message.update,\n });\n for (const rawValue of captured?.precedingRawValues ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n emitStreamEvent.message({\n message,\n rawUpdate: captured?.rawUpdate,\n });\n continue;\n }\n for (const rawValue of streamCapture?.drainRawValues() ?? []) {\n emitStreamEvent.raw({ rawValue });\n }\n if (emitStreamEvent.message({ message })) return;\n }\n } finally {\n permissionController.cancelAll();\n activePermissionController = undefined;\n activeHostToolRelay.unbindTurn({ turn: relayTurn });\n }\n}\n\nasync function ensureSession({\n start,\n turn,\n}: {\n start: StartMessage;\n turn: BridgeTurn;\n}): Promise<{ initialHostToolCatalogRefreshRequired: boolean }> {\n if (sessionConfigurationFailure != null) {\n throw sessionConfigurationFailure.error;\n }\n const fingerprint = JSON.stringify({\n authentication: bridgeConfiguration.authentication,\n providerAuthentication: bridgeConfiguration.providerAuthentication,\n providerEnvironment: bridgeConfiguration.providerEnvironment,\n sessionMeta: bridgeConfiguration.sessionMeta,\n instructionMapping: start.instructionMapping,\n permissionMode: start.permissionMode,\n permissionModeMapping: start.permissionModeMapping,\n mcpServers: start.mcpServers,\n });\n if (session != null) {\n if (catalogRefreshError != null) throw catalogRefreshError;\n if (sessionConfigurationFingerprint !== fingerprint) {\n throw new Error(\n 'ACP authentication and session profile settings cannot change after the ACP session has started.',\n );\n }\n const relay = hostToolRelay;\n if (relay == null) {\n throw new Error('The host tool MCP relay is unavailable.');\n }\n try {\n await refreshHostToolCatalog({\n relay,\n tools: start.tools ?? [],\n harnessId: bridgeType,\n timeoutMs: CATALOG_REFRESH_TIMEOUT_MS,\n });\n } catch (error) {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n throw error;\n }\n return { initialHostToolCatalogRefreshRequired: false };\n }\n\n const clientApp = resolveClientApp();\n const authentication = bridgeConfiguration.authentication;\n const launchEnv =\n bridgeConfiguration.providerEnvironment ??\n resolveACPLaunchEnvironment({\n providerAuthentication: bridgeConfiguration.providerAuthentication,\n gateway:\n bridgeConfiguration.providerAuthentication?.type === 'ai-gateway'\n ? resolveGatewayValues({ clientApp })\n : undefined,\n });\n const instructionConfiguration = await resolveACPInstructionConfiguration({\n instructions: start.instructions,\n instructionMapping: start.instructionMapping,\n sessionMeta: bridgeConfiguration.sessionMeta,\n environment: {\n ...createChildEnvironment({\n launchEnv,\n implementationDir,\n privateHome: implementation.privateHome,\n }),\n },\n });\n child = spawn(\n `${implementationDir}/${implementation.executablePath}`,\n [...implementation.args],\n {\n cwd: workDir,\n env: instructionConfiguration.environment,\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n agentResponseStreamFailure = monitorACPAgentStderr({\n stderr: child.stderr,\n onStderrLine: line => {\n turn.bridgeLog({\n level: 'warn',\n subsystem: 'acp.agent.stderr',\n message: line,\n });\n },\n });\n\n const input = Writable.toWeb(child.stdin);\n const output = Readable.toWeb(child.stdout) as ReadableStream<\n Uint8Array<ArrayBufferLike>\n >;\n const capturedStream = captureACPStream({\n stream: acp.ndJsonStream(input, output),\n });\n streamCapture = capturedStream.capture;\n connection = acp\n .client({ name: clientApp.name })\n .onRequest(\n acp.methods.client.session.requestPermission,\n ({ params }) =>\n activePermissionController?.requestPermission(params) ?? {\n outcome: { outcome: 'cancelled' },\n },\n )\n .onNotification(acp.methods.client.session.update, ({ params }) => {\n if (params.sessionId !== recoveredSessionId) return;\n if (historicalUpdatesSuppressed) return;\n recoveredSessionUpdates?.enqueue({\n kind: 'session_update',\n notification: params,\n update: params.update,\n });\n })\n .connect(capturedStream.stream);\n\n const initializeRequest = createACPInitializeRequest({\n protocolVersion: acp.PROTOCOL_VERSION,\n clientApp,\n authentication,\n clientCapabilities: bridgeConfiguration.clientCapabilities,\n supportsBooleanSessionConfigOptions: Object.values(\n start.permissionModeMapping ?? {},\n ).some(\n target =>\n target?.type === 'session-config-option' &&\n typeof target.value === 'boolean',\n ),\n });\n const initialization = await connection.agent.request<\n acp.InitializeResponse,\n typeof initializeRequest\n >(acp.methods.agent.initialize, initializeRequest);\n validateACPProtocolVersion({\n requested: acp.PROTOCOL_VERSION,\n initialization,\n });\n\n if (authentication != null) {\n await authenticate({\n agent: connection.agent,\n initialization,\n authentication,\n });\n }\n const externalMcpServers = createExternalMcpServers({\n mcpServers: start.mcpServers,\n initialization,\n });\n const tools = start.tools ?? [];\n const catalogPath = `${bridgeStateDir}/host-tools.json`;\n await writeFile(catalogPath, JSON.stringify(tools), { mode: 0o600 });\n hostToolRelay = await startHostToolRelay({\n tools,\n serverName: HOST_TOOL_MCP_SERVER_NAME,\n });\n\n const mcpServers: acp.McpServer[] = [\n ...externalMcpServers,\n {\n name: HOST_TOOL_MCP_SERVER_NAME,\n command: process.execPath,\n args: [fileURLToPath(new URL('./host-tool-mcp.mjs', import.meta.url))],\n env: [\n {\n name: 'AI_SDK_ACP_HOST_TOOLS_FILE',\n value: catalogPath,\n },\n {\n name: 'AI_SDK_ACP_HOST_TOOL_RELAY_URL',\n value: hostToolRelay.url,\n },\n {\n name: 'AI_SDK_ACP_HOST_TOOL_RELAY_CREDENTIAL',\n value: hostToolRelay.credential,\n },\n ],\n },\n ];\n let createdSession: ACPActiveSession;\n if (start.recoveryMode?.type === 'lossy-rerun') {\n assertACPResumeCapability({ initialization, harnessId: bridgeType });\n recoveredSessionId = start.recoveryMode.acpSessionId;\n recoveredSessionUpdates = createACPRecoveredSessionUpdates();\n const resumeResponse = await connection.agent.request<\n acp.ResumeSessionResponse,\n acp.ResumeSessionRequest\n >(acp.methods.agent.session.resume, {\n sessionId: recoveredSessionId,\n cwd: workDir,\n mcpServers,\n ...(instructionConfiguration.sessionMeta == null\n ? {}\n : { _meta: instructionConfiguration.sessionMeta }),\n });\n createdSession = createACPRecoveredSession({\n agent: connection.agent,\n sessionId: recoveredSessionId,\n restorationResponse: resumeResponse,\n updates: recoveredSessionUpdates,\n });\n } else if (start.recoveryMode?.type === 'cold-restore') {\n recoveredSessionId = start.recoveryMode.acpSessionId;\n recoveredSessionUpdates = createACPRecoveredSessionUpdates();\n const restored = await restoreACPBridgeSession({\n agent: connection.agent,\n initialization,\n sessionId: recoveredSessionId,\n cwd: workDir,\n mcpServers,\n meta: instructionConfiguration.sessionMeta,\n harnessId: bridgeType,\n setHistoricalUpdatesSuppressed: ({ suppressed }) => {\n historicalUpdatesSuppressed = suppressed;\n },\n discardCapturedHistory: () => {\n streamCapture?.drainRawValues();\n },\n });\n coldRestorationMethod = restored.method;\n createdSession = createACPRecoveredSession({\n agent: connection.agent,\n sessionId: recoveredSessionId,\n restorationResponse: restored.response,\n updates: recoveredSessionUpdates,\n });\n } else {\n createdSession = await connection.agent\n .buildSession({\n cwd: workDir,\n mcpServers,\n ...(instructionConfiguration.sessionMeta == null\n ? {}\n : { _meta: instructionConfiguration.sessionMeta }),\n })\n .start();\n }\n try {\n if (start.permissionModeMapping != null) {\n await configureACPPermissionMode({\n agent: connection.agent,\n sessionId: createdSession.sessionId,\n sessionConfiguration: createdSession.newSessionResponse,\n permissionModeMapping: start.permissionModeMapping,\n permissionMode: start.permissionMode ?? 'allow-all',\n harnessId: bridgeType,\n });\n }\n } catch (error) {\n createdSession.dispose();\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n catalogRefreshError = error;\n }\n sessionConfigurationFailure = { error };\n throw error;\n }\n session = createdSession;\n initializationDiagnostic = createACPInitializationDiagnostic({\n initialization,\n sessionId: createdSession.sessionId,\n });\n sessionConfigurationFingerprint = fingerprint;\n return { initialHostToolCatalogRefreshRequired: tools.length > 0 };\n}\n\nfunction createExternalMcpServers({\n mcpServers,\n initialization,\n}: {\n mcpServers: Record<string, unknown> | undefined;\n initialization: acp.InitializeResponse;\n}): acp.McpServer[] {\n if (mcpServers == null) return [];\n return Object.entries(mcpServers).map(([name, value]) => {\n if (!isRecord(value)) {\n throw new Error(\n `ACP MCP server ${JSON.stringify(name)} must be configured with an object value.`,\n );\n }\n if (value.type === 'acp') {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId: bridgeType,\n message:\n 'ACP-transport MCP servers require client-side mcp/connect handling, which this harness does not provide.',\n });\n }\n const mcpCapabilities = initialization.agentCapabilities?.mcpCapabilities;\n if (\n (value.type === 'http' && mcpCapabilities?.http !== true) ||\n (value.type === 'sse' && mcpCapabilities?.sse !== true)\n ) {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId: bridgeType,\n message: `The ACP agent does not advertise support for ${value.type.toUpperCase()} MCP servers.`,\n });\n }\n return { ...value, name } as acp.McpServer;\n });\n}\n\nfunction unknownUsage() {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n}\n\nasync function authenticate({\n agent,\n initialization,\n authentication,\n}: {\n agent: acp.ClientContext;\n initialization: ACPInitializeResult;\n authentication: ACPAuthentication;\n}): Promise<void> {\n assertACPAuthenticationMethod({\n initialization,\n methodId: authentication.methodId,\n });\n await agent.request(acp.methods.agent.authenticate, {\n methodId: authentication.methodId,\n ...(authentication.meta == null ? {} : { _meta: authentication.meta }),\n });\n}\n\nfunction resolveClientApp(): ACPClientApp {\n const name = processEnv.AI_SDK_ACP_CLIENT_APP_NAME;\n const version = processEnv.AI_SDK_ACP_CLIENT_APP_VERSION;\n if (name == null || version == null) {\n throw new Error('ACP client app values were not supplied to the bridge.');\n }\n return { name, version };\n}\n\nfunction resolveGatewayValues({\n clientApp,\n}: {\n clientApp: ACPClientApp;\n}): ACPGatewayValues {\n const apiKey = processEnv.AI_SDK_ACP_GATEWAY_API_KEY;\n const baseUrl = processEnv.AI_SDK_ACP_GATEWAY_BASE_URL;\n if (apiKey == null || baseUrl == null) {\n throw new Error(\n 'AI Gateway profile values were not supplied to the ACP bridge.',\n );\n }\n return {\n apiKey,\n baseUrl,\n clientAppName: clientApp.name,\n clientAppVersion: clientApp.version,\n };\n}\n\nfunction createChildEnvironment({\n launchEnv,\n implementationDir,\n privateHome,\n}: {\n launchEnv: Readonly<Record<string, string>>;\n implementationDir: string;\n privateHome: boolean;\n}): NodeJS.ProcessEnv {\n const blocked = new Set([\n 'BRIDGE_CHANNEL_TOKEN',\n 'BRIDGE_WS_PORT',\n 'AI_SDK_ACP_GATEWAY_API_KEY',\n 'AI_SDK_ACP_GATEWAY_BASE_URL',\n 'AI_SDK_ACP_CLIENT_APP_NAME',\n 'AI_SDK_ACP_CLIENT_APP_VERSION',\n ACP_BRIDGE_CONFIGURATION_ENV,\n ]);\n const environment = {\n ...Object.fromEntries(\n Object.entries(processEnv).filter(\n ([key, value]) => !blocked.has(key) && value != null,\n ),\n ),\n ...launchEnv,\n };\n if (!privateHome) return environment;\n\n const home = `${implementationDir}/home`;\n const inheritedPath = environment.PATH;\n return {\n ...environment,\n HOME: home,\n PATH: [\n `${home}/.local/bin`,\n ...(inheritedPath == null || inheritedPath.length === 0\n ? []\n : [inheritedPath]),\n ].join(':'),\n };\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction createOutputSchemaPromptMeta({\n start,\n}: {\n start: StartMessage;\n}): Record<string, unknown> | undefined {\n if (\n start.responseFormat?.type !== 'json' ||\n start.responseFormat.schema == null ||\n start.outputSchemaMapping?.type !== 'session-prompt-meta'\n ) {\n return undefined;\n }\n const root: Record<string, unknown> = {};\n let target = root;\n const path = start.outputSchemaMapping.path;\n for (let index = 0; index < path.length - 1; index++) {\n const child: Record<string, unknown> = {};\n target[path[index]!] = child;\n target = child;\n }\n target[path[path.length - 1]!] = start.responseFormat.schema;\n return root;\n}\n\nfunction promptActiveSession({\n session,\n agent,\n prompt,\n meta,\n}: {\n session: ACPActiveSession;\n agent: acp.ClientContext;\n prompt: Array<acp.ContentBlock>;\n meta: Record<string, unknown> | undefined;\n}): Promise<acp.PromptResponse> {\n if (meta == null) return session.prompt(prompt);\n if (session.promptWithMeta != null) {\n return session.promptWithMeta({ prompt, meta });\n }\n const updates = (\n session as unknown as {\n updates?: {\n clearErrors(): void;\n enqueue(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n };\n }\n ).updates;\n if (updates == null) {\n throw new Error(\n 'The installed ACP SDK cannot send session prompt metadata while preserving streamed updates.',\n );\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n {\n sessionId: session.sessionId,\n prompt,\n _meta: meta,\n },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n}\n\nasync function readImplementationDescriptor({\n path,\n}: {\n path: string;\n}): Promise<ImplementationDescriptor> {\n const text = await readFile(path, 'utf8');\n const value = await new Response(text, {\n headers: { 'content-type': 'application/json' },\n }).json();\n if (\n !isRecord(value) ||\n typeof value.executablePath !== 'string' ||\n typeof value.privateHome !== 'boolean' ||\n !Array.isArray(value.args) ||\n !value.args.every(item => typeof item === 'string') ||\n !Array.isArray(value.envKeys) ||\n !value.envKeys.every(item => typeof item === 'string')\n ) {\n throw new Error('Invalid ACP implementation descriptor.');\n }\n return {\n executablePath: value.executablePath,\n privateHome: value.privateHome,\n args: value.args as string[],\n envKeys: value.envKeys as string[],\n };\n}\n\nfunction parseArgs({ args }: { args: ReadonlyArray<string> }): {\n workDir?: string;\n bridgeStateDir?: string;\n implementationDir?: string;\n bridgeType?: string;\n} {\n const result: {\n workDir?: string;\n bridgeStateDir?: string;\n implementationDir?: string;\n bridgeType?: string;\n } = {};\n for (let index = 0; index < args.length; index++) {\n const value = args[index + 1];\n if (value == null) continue;\n if (args[index] === '--workdir') result.workDir = value;\n else if (args[index] === '--bridge-state-dir')\n result.bridgeStateDir = value;\n else if (args[index] === '--implementation-dir')\n result.implementationDir = value;\n else if (args[index] === '--bridge-type') result.bridgeType = value;\n }\n return result;\n}\n\nfunction requireArg({\n value,\n name,\n}: {\n value: string | undefined;\n name: string;\n}): string {\n if (value == null || value.length === 0) {\n throw new Error(`Missing ${name} argument.`);\n }\n return value;\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPAuthentication,\n ACPProfileValue,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nexport const ACP_BRIDGE_CONFIGURATION_ENV = 'AI_SDK_ACP_BRIDGE_CONFIGURATION';\n\nconst serializableValueSchema: z.ZodType<ACPSerializableValue> = z.json();\n\nconst profileValueSchema: z.ZodType<ACPProfileValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({\n $source: z.enum([\n 'gateway-api-key',\n 'gateway-base-url',\n 'gateway-authorization',\n 'client-app',\n 'client-app-name',\n 'client-app-version',\n ]),\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n ensureSuffix: z.string().optional(),\n }),\n z.array(profileValueSchema),\n z.record(z.string(), profileValueSchema),\n ]),\n);\n\nconst serializableRecordSchema = z.record(z.string(), serializableValueSchema);\nconst profileRecordSchema = z.record(z.string(), profileValueSchema);\n\nconst authenticationSchema: z.ZodType<ACPAuthentication> = z.object({\n methodId: z.string(),\n meta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n});\n\nconst providerAuthenticationSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('direct') }),\n z.object({\n type: z.literal('ai-gateway'),\n env: profileRecordSchema,\n }),\n]);\n\nexport type ACPResolvedProviderAuthentication = z.infer<\n typeof providerAuthenticationSchema\n>;\n\nexport type ACPBridgeConfiguration = {\n readonly authentication?: ACPAuthentication;\n readonly providerAuthentication?: ACPResolvedProviderAuthentication;\n readonly providerEnvironment?: Readonly<Record<string, string>>;\n readonly sessionMeta?: Readonly<Record<string, ACPSerializableValue>>;\n readonly clientCapabilities?: Readonly<Record<string, ACPSerializableValue>>;\n};\n\nconst bridgeConfigurationSchema: z.ZodType<ACPBridgeConfiguration> = z.object({\n authentication: authenticationSchema.optional(),\n providerAuthentication: providerAuthenticationSchema.optional(),\n providerEnvironment: z.record(z.string(), z.string()).optional(),\n sessionMeta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n});\n\nexport function createACPBridgeEnvironment({\n authentication,\n providerAuthentication,\n providerEnvironment,\n sessionMeta,\n clientCapabilities,\n}: ACPBridgeConfiguration): Record<string, string> {\n return {\n [ACP_BRIDGE_CONFIGURATION_ENV]: JSON.stringify({\n ...(authentication == null ? {} : { authentication }),\n ...(providerAuthentication == null ? {} : { providerAuthentication }),\n ...(providerEnvironment == null ? {} : { providerEnvironment }),\n ...(sessionMeta == null ? {} : { sessionMeta }),\n ...(clientCapabilities == null ? {} : { clientCapabilities }),\n }),\n };\n}\n\nexport async function readACPBridgeEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n}): Promise<ACPBridgeConfiguration> {\n const serialized = env[ACP_BRIDGE_CONFIGURATION_ENV];\n if (serialized == null) return {};\n try {\n const result = bridgeConfigurationSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error('ACP bridge configuration environment is invalid.');\n}\n","import type { ACPProfileValue, ACPSerializableValue } from '../acp-v1-settings';\n\nexport type ACPGatewayValues = {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly clientAppName: string;\n readonly clientAppVersion: string;\n};\n\nexport function resolveACPProfileValue({\n value,\n gateway,\n}: {\n value: ACPProfileValue;\n gateway: ACPGatewayValues;\n}): ACPSerializableValue {\n if (Array.isArray(value)) {\n return value.map(item => resolveACPProfileValue({ value: item, gateway }));\n }\n if (value !== null && typeof value === 'object') {\n if (isValueSource(value)) {\n const sourceValue = resolveSource({ source: value.$source, gateway });\n const resolved = `${value.prefix ?? ''}${sourceValue}`;\n return value.ensureSuffix == null\n ? `${resolved}${value.suffix ?? ''}`\n : ensureSuffix({\n value: resolved,\n suffix: value.ensureSuffix,\n });\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n resolveACPProfileValue({ value: item, gateway }),\n ]),\n );\n }\n return value;\n}\n\nfunction isValueSource(value: object): value is {\n readonly $source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n readonly prefix?: string;\n readonly suffix?: string;\n readonly ensureSuffix?: string;\n} {\n return (\n '$source' in value &&\n typeof (value as { $source?: unknown }).$source === 'string'\n );\n}\n\nfunction ensureSuffix({\n value,\n suffix,\n}: {\n value: string;\n suffix: string;\n}): string {\n const normalized = value.replace(/\\/+$/, '');\n return normalized.endsWith(suffix) ? normalized : `${normalized}${suffix}`;\n}\n\nfunction resolveSource({\n source,\n gateway,\n}: {\n source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n gateway: ACPGatewayValues;\n}): string {\n switch (source) {\n case 'gateway-api-key':\n return gateway.apiKey;\n case 'gateway-base-url':\n return gateway.baseUrl;\n case 'gateway-authorization':\n return `Bearer ${gateway.apiKey}`;\n case 'client-app':\n return `${gateway.clientAppName}/${gateway.clientAppVersion}`;\n case 'client-app-name':\n return gateway.clientAppName;\n case 'client-app-version':\n return gateway.clientAppVersion;\n }\n}\n","import type { ACPResolvedProviderAuthentication } from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport {\n resolveACPProfileValue,\n type ACPGatewayValues,\n} from './profile-values';\n\nexport type ACPInitializeResult = {\n readonly protocolVersion: number;\n readonly authMethods?: ReadonlyArray<{ readonly id: string }> | null;\n readonly agentCapabilities?: Readonly<Record<string, unknown>> | null;\n};\n\nexport function createACPInitializeRequest({\n protocolVersion,\n clientApp,\n authentication,\n clientCapabilities: configuredClientCapabilities,\n supportsBooleanSessionConfigOptions = false,\n}: {\n protocolVersion: number;\n clientApp: ACPClientApp;\n authentication: ACPAuthentication | undefined;\n clientCapabilities?: Readonly<Record<string, unknown>>;\n supportsBooleanSessionConfigOptions?: boolean;\n}): {\n readonly protocolVersion: number;\n readonly clientInfo: {\n readonly name: string;\n readonly version: string;\n };\n readonly clientCapabilities: Readonly<Record<string, unknown>>;\n} {\n let clientCapabilities = mergeRecords({\n left: authentication?.clientCapabilities ?? {},\n right: configuredClientCapabilities ?? {},\n });\n if (supportsBooleanSessionConfigOptions) {\n clientCapabilities = mergeRecords({\n left: clientCapabilities,\n right: {\n session: {\n configOptions: {\n boolean: {},\n },\n },\n },\n });\n }\n return {\n protocolVersion,\n clientInfo: clientApp,\n clientCapabilities,\n };\n}\n\nexport function resolveACPLaunchEnvironment({\n providerAuthentication,\n gateway,\n}: {\n providerAuthentication: ACPResolvedProviderAuthentication | undefined;\n gateway: ACPGatewayValues | undefined;\n}): Record<string, string> {\n if (providerAuthentication?.type !== 'ai-gateway') {\n return {};\n }\n const resolved = asRecord(\n resolveACPProfileValue({\n value: providerAuthentication.env,\n gateway: requireGateway({ gateway }),\n }),\n );\n return Object.fromEntries(\n Object.entries(resolved).map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ]),\n );\n}\n\nexport function validateACPProtocolVersion({\n requested,\n initialization,\n}: {\n requested: number;\n initialization: ACPInitializeResult;\n}): void {\n if (initialization.protocolVersion !== requested) {\n throw new Error(\n `ACP protocol negotiation failed: requested v${requested}, agent selected v${initialization.protocolVersion}.`,\n );\n }\n}\n\nexport function assertACPAuthenticationMethod({\n initialization,\n methodId,\n}: {\n initialization: ACPInitializeResult;\n methodId: string;\n}): void {\n if (!initialization.authMethods?.some(method => method.id === methodId)) {\n const advertised =\n initialization.authMethods?.map(method => method.id).join(', ') || 'none';\n throw new Error(\n `ACP authentication method ${JSON.stringify(methodId)} is not advertised by the agent. Advertised methods: ${advertised}.`,\n );\n }\n}\n\nfunction mergeRecords({\n left,\n right,\n}: {\n left: Readonly<Record<string, unknown>>;\n right: Readonly<Record<string, unknown>>;\n}): Readonly<Record<string, unknown>> {\n const result: Record<string, unknown> = { ...left };\n for (const [key, value] of Object.entries(right)) {\n const previous = result[key];\n result[key] =\n isRecord(previous) && isRecord(value)\n ? mergeRecords({ left: previous, right: value })\n : value;\n }\n return result;\n}\n\nfunction requireGateway({\n gateway,\n}: {\n gateway: ACPGatewayValues | undefined;\n}): ACPGatewayValues {\n if (gateway == null) {\n throw new Error('ACP Gateway profile values are unavailable.');\n }\n return gateway;\n}\n\nfunction asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (!isRecord(value)) {\n throw new Error('ACP profile data must resolve to an object.');\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import type {\n AnyMessage,\n SessionUpdate,\n Stream as ACPStream,\n} from '@agentclientprotocol/sdk';\n\nconst KNOWN_SESSION_UPDATES = new Set([\n 'user_message_chunk',\n 'agent_message_chunk',\n 'agent_thought_chunk',\n 'tool_call',\n 'tool_call_update',\n 'plan',\n 'plan_update',\n 'plan_removed',\n 'available_commands_update',\n 'current_mode_update',\n 'config_option_update',\n 'session_info_update',\n 'usage_update',\n]);\n\ntype CapturedSessionUpdate = {\n readonly rawUpdate: unknown;\n readonly forwarded: boolean;\n};\n\nexport type ACPStreamCapture = {\n takeForUpdate(options: { update: SessionUpdate }): {\n readonly precedingRawValues: ReadonlyArray<unknown>;\n readonly rawUpdate: unknown;\n };\n drainRawValues(): ReadonlyArray<unknown>;\n};\n\nexport function captureACPStream({ stream }: { stream: ACPStream }): {\n stream: ACPStream;\n capture: ACPStreamCapture;\n} {\n const updates: CapturedSessionUpdate[] = [];\n const readable = stream.readable.pipeThrough(\n new TransformStream<AnyMessage, AnyMessage>({\n transform(message, controller) {\n const rawUpdate = getRawSessionUpdate({ message });\n if (!rawUpdate.isSessionUpdate) {\n controller.enqueue(message);\n return;\n }\n\n const sessionUpdate = getStringProperty({\n value: rawUpdate.value,\n property: 'sessionUpdate',\n });\n const forwarded =\n !rawUpdate.canFilterUnknown ||\n sessionUpdate == null ||\n KNOWN_SESSION_UPDATES.has(sessionUpdate);\n updates.push({ rawUpdate: rawUpdate.value, forwarded });\n if (forwarded) controller.enqueue(message);\n },\n }),\n );\n\n return {\n stream: { ...stream, readable },\n capture: {\n takeForUpdate: ({ update }) => {\n const index = updates.findIndex(\n candidate =>\n candidate.forwarded &&\n sessionUpdatesMatch({\n rawUpdate: candidate.rawUpdate,\n update,\n }),\n );\n if (index === -1) {\n return { precedingRawValues: [], rawUpdate: update };\n }\n const consumed = updates.splice(0, index + 1);\n return {\n precedingRawValues: consumed\n .slice(0, -1)\n .map(candidate => candidate.rawUpdate),\n rawUpdate: consumed.at(-1)!.rawUpdate,\n };\n },\n drainRawValues: () =>\n updates.splice(0).map(candidate => candidate.rawUpdate),\n },\n };\n}\n\nfunction getRawSessionUpdate({ message }: { message: AnyMessage }):\n | { readonly isSessionUpdate: false }\n | {\n readonly isSessionUpdate: true;\n readonly value: unknown;\n readonly canFilterUnknown: boolean;\n } {\n const record = message as unknown as Record<string, unknown>;\n if (record.method !== 'session/update' || !isRecord(record.params)) {\n return { isSessionUpdate: false };\n }\n const params = record.params;\n return {\n isSessionUpdate: true,\n value: params.update,\n canFilterUnknown:\n typeof params.sessionId === 'string' && isRecord(params.update),\n };\n}\n\nfunction sessionUpdatesMatch({\n rawUpdate,\n update,\n}: {\n rawUpdate: unknown;\n update: SessionUpdate;\n}): boolean {\n if (!isRecord(rawUpdate)) return false;\n if (rawUpdate.sessionUpdate !== update.sessionUpdate) return false;\n if (\n update.sessionUpdate === 'tool_call' ||\n update.sessionUpdate === 'tool_call_update'\n ) {\n return rawUpdate.toolCallId === update.toolCallId;\n }\n if (\n update.sessionUpdate === 'user_message_chunk' ||\n update.sessionUpdate === 'agent_message_chunk' ||\n update.sessionUpdate === 'agent_thought_chunk'\n ) {\n return rawUpdate.messageId === update.messageId;\n }\n return true;\n}\n\nfunction getStringProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): string | undefined {\n if (!isRecord(value)) return undefined;\n const propertyValue = value[property];\n return typeof propertyValue === 'string' ? propertyValue : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { InitializeResponse } from '@agentclientprotocol/sdk';\n\nexport function createACPInitializationDiagnostic({\n initialization,\n sessionId,\n}: {\n initialization: InitializeResponse;\n sessionId: string;\n}): Record<string, unknown> {\n const agentInfo = initialization.agentInfo;\n return {\n protocolVersion: initialization.protocolVersion,\n sessionId,\n agent:\n agentInfo == null\n ? null\n : {\n name: agentInfo.name,\n version: agentInfo.version,\n ...(agentInfo.title == null ? {} : { title: agentInfo.title }),\n },\n capabilities: stripMetadata({\n value: initialization.agentCapabilities ?? {},\n }),\n authMethods: (initialization.authMethods ?? []).map(method => ({\n id: method.id,\n type: 'type' in method ? method.type : 'agent',\n })),\n };\n}\n\nexport function createACPBridgeError({\n stage,\n cause,\n}: {\n stage:\n | 'session initialization'\n | 'session cancellation'\n | 'prompt update stream';\n cause: unknown;\n}): Error {\n const causeMessage = getErrorMessage({ error: cause });\n const error = new Error(\n causeMessage == null\n ? `ACP ${stage} failed.`\n : `ACP ${stage} failed: ${causeMessage}`,\n );\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n\nfunction getErrorMessage({ error }: { error: unknown }): string | undefined {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (\n error != null &&\n typeof error === 'object' &&\n 'message' in error &&\n typeof error.message === 'string'\n ) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return undefined;\n}\n\nfunction stripMetadata({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => stripMetadata({ value: item }));\n }\n if (value == null || typeof value !== 'object') return value;\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (key !== '_meta') result[key] = stripMetadata({ value: item });\n }\n return result;\n}\n","import type { Readable } from 'node:stream';\nimport { stripVTControlCharacters } from 'node:util';\n\nexport function monitorACPAgentStderr({\n stderr,\n onStderrLine,\n}: {\n stderr: Readable;\n onStderrLine: (line: string) => void;\n}): Promise<never> {\n let rejectFailure!: (error: unknown) => void;\n const failure = new Promise<never>((_, reject) => {\n rejectFailure = reject;\n });\n void failure.catch(() => {});\n\n void (async () => {\n stderr.setEncoding('utf8');\n let pending = '';\n for await (const chunk of stderr) {\n pending += chunk;\n const lines = pending.split('\\n');\n pending = lines.pop() ?? '';\n for (const line of lines) handleStderrLine({ line });\n }\n if (pending.length > 0) handleStderrLine({ line: pending });\n })().catch(error => rejectFailure(error));\n\n return failure;\n\n function handleStderrLine({ line }: { line: string }): void {\n if (line.length === 0) return;\n onStderrLine(line);\n const normalizedLine = stripVTControlCharacters(line);\n\n /*\n * An ACP agent can log a response-stream decoding failure without rejecting\n * its pending JSON-RPC prompt. Once the provider stream cannot be decoded,\n * no valid prompt completion can reach the ACP client, so the bridge must\n * fail the turn instead of waiting indefinitely.\n */\n if (\n normalizedLine\n .toLowerCase()\n .includes('failed to deserialize responsestreamevent from stream')\n ) {\n rejectFailure(\n new Error('ACP agent failed to deserialize a streamed response.'),\n );\n }\n }\n}\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport type { PromptResponse, SessionUpdate } from '@agentclientprotocol/sdk';\nimport type {\n ACPToolCall,\n ACPToolCallStatus,\n ACPToolKind,\n} from '../../acp-tool-call';\nimport type { ACPBuiltinToolMapping } from '../acp-v1-bridge-protocol';\n\ntype HarnessUsage = Extract<\n HarnessV1StreamPart,\n { readonly type: 'finish' }\n>['totalUsage'];\ntype HarnessToolResult = Extract<\n HarnessV1StreamPart,\n { readonly type: 'tool-result' }\n>['result'];\ntype HarnessJSONValue = HarnessToolResult | null;\n\ntype ToolState = {\n readonly toolCallId: string;\n readonly values: Record<string, unknown>;\n readonly emittedFilePaths: Set<string>;\n emittedCall: boolean;\n emittedResult: boolean;\n toolName?: string;\n nativeName?: string;\n};\n\nexport type ACPSessionUpdate = SessionUpdate;\nexport type ACPPromptResponse = PromptResponse;\n\nexport function createACPStreamTranslator({\n emit,\n emitToolCallCandidate,\n builtinTools = [],\n}: {\n emit: (event: HarnessV1StreamPart) => void;\n emitToolCallCandidate?: (options: { toolCall: ACPToolCall }) => void;\n builtinTools?: ReadonlyArray<ACPBuiltinToolMapping>;\n}): {\n update: (\n options:\n | ACPSessionUpdate\n | {\n update: ACPSessionUpdate;\n rawUpdate?: unknown;\n preserveRaw?: boolean;\n },\n ) => void;\n permissionToolCall: (options: {\n toolCall: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n }) => void;\n raw: (options: { rawValue: unknown }) => void;\n close: () => void;\n finish: (response: ACPPromptResponse) => void;\n hostToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n hostToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n} {\n let openBlock:\n | {\n readonly type: 'text' | 'reasoning';\n readonly id: string;\n readonly messageId: string | null;\n }\n | undefined;\n let blockCounter = 0;\n let stepOpen = false;\n let finished = false;\n const blockIdCounts = new Map<string, number>();\n const toolStates = new Map<string, ToolState>();\n const pendingToolCallIds = new Set<string>();\n const builtinToolsByName = indexBuiltinTools({ builtinTools });\n\n const closeBlock = () => {\n if (openBlock == null) return;\n emit({\n type: openBlock.type === 'text' ? 'text-end' : 'reasoning-end',\n id: openBlock.id,\n });\n openBlock = undefined;\n };\n\n const createBlockId = ({\n type,\n messageId,\n }: {\n type: 'text' | 'reasoning';\n messageId: string | null;\n }): string => {\n const base = messageId ?? `acp-${type}-${++blockCounter}`;\n const count = (blockIdCounts.get(base) ?? 0) + 1;\n blockIdCounts.set(base, count);\n return count === 1 ? base : `${base}-${count}`;\n };\n\n const emitContent = ({\n type,\n text,\n messageId,\n }: {\n type: 'text' | 'reasoning';\n text: string;\n messageId?: string | null;\n }) => {\n const normalizedMessageId = messageId ?? null;\n if (\n openBlock == null ||\n openBlock.type !== type ||\n openBlock.messageId !== normalizedMessageId\n ) {\n closeBlock();\n const id = createBlockId({ type, messageId: normalizedMessageId });\n emit({\n type: type === 'text' ? 'text-start' : 'reasoning-start',\n id,\n });\n openBlock = { type, id, messageId: normalizedMessageId };\n }\n emit({\n type: type === 'text' ? 'text-delta' : 'reasoning-delta',\n id: openBlock.id,\n delta: text,\n });\n stepOpen = true;\n };\n\n const emitInferredStep = ({\n finishReason,\n }: {\n finishReason: Extract<\n HarnessV1StreamPart,\n { readonly type: 'finish-step' }\n >['finishReason'];\n }) => {\n closeBlock();\n emit({\n type: 'finish-step',\n finishReason,\n usage: unknownUsage(),\n harnessMetadata: { acp: { inferredStep: true } },\n });\n stepOpen = false;\n };\n\n const finishCompletedToolStep = () => {\n if (!stepOpen || pendingToolCallIds.size > 0) {\n return;\n }\n emitInferredStep({\n finishReason: { unified: 'tool-calls', raw: 'tool-calls' },\n });\n };\n\n const emitToolUpdate = ({\n update,\n rawUpdate,\n forceEmit = false,\n }: {\n update: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n rawUpdate: unknown;\n forceEmit?: boolean;\n }) => {\n closeBlock();\n const state =\n toolStates.get(update.toolCallId) ??\n ({\n toolCallId: update.toolCallId,\n values: {},\n emittedFilePaths: new Set(),\n emittedCall: false,\n emittedResult: false,\n } satisfies ToolState);\n toolStates.set(update.toolCallId, state);\n mergeToolUpdate({ state, update, rawUpdate });\n\n if (\n !forceEmit &&\n !state.emittedCall &&\n update.sessionUpdate === 'tool_call' &&\n update.status === 'pending'\n ) {\n return;\n }\n\n if (!state.emittedCall) {\n const programmaticName = getStringProperty({\n value: state.values,\n property: 'name',\n });\n const builtin = resolveBuiltinTool({\n programmaticName,\n metadata: state.values._meta,\n title: getStringProperty({\n value: state.values,\n property: 'title',\n }),\n kind: isACPToolKind(state.values.kind) ? state.values.kind : undefined,\n rawInput: state.values.rawInput,\n builtinTools,\n builtinToolsByName,\n });\n if (\n !forceEmit &&\n builtin?.inputSchema != null &&\n state.values.status !== 'completed' &&\n state.values.status !== 'failed' &&\n !hasRequiredBuiltinToolInput({\n rawInput: state.values.rawInput,\n inputSchema: builtin.inputSchema,\n })\n ) {\n return;\n }\n if (builtin != null) {\n state.toolName = builtin.toolName;\n state.nativeName =\n builtin.nativeName != null && builtin.toolName !== builtin.nativeName\n ? builtin.nativeName\n : undefined;\n } else {\n state.toolName = createDynamicToolName({\n programmaticName,\n toolCallId: state.toolCallId,\n });\n emitToolCallCandidate?.({ toolCall: createACPToolCall({ state }) });\n }\n emit({\n type: 'tool-call',\n toolCallId: state.toolCallId,\n toolName: state.toolName,\n input: stringifyToolInput({ input: state.values.rawInput }),\n providerExecuted: true,\n ...(state.nativeName == null ? {} : { nativeName: state.nativeName }),\n });\n state.emittedCall = true;\n stepOpen = true;\n pendingToolCallIds.add(state.toolCallId);\n }\n\n emitFileChanges({ state, emit });\n\n if (\n !state.emittedResult &&\n (state.values.status === 'completed' || state.values.status === 'failed')\n ) {\n emit({\n type: 'tool-result',\n toolCallId: state.toolCallId,\n toolName: state.toolName!,\n result: createToolResult({ state }),\n ...(state.values.status === 'failed' ? { isError: true } : {}),\n });\n state.emittedResult = true;\n pendingToolCallIds.delete(state.toolCallId);\n finishCompletedToolStep();\n }\n };\n\n const hostToolCall = ({\n toolCallId,\n toolName,\n input,\n }: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => {\n closeBlock();\n emit({\n type: 'tool-call',\n toolCallId,\n toolName,\n input: stringifyToolInput({ input }),\n providerExecuted: false,\n });\n stepOpen = true;\n pendingToolCallIds.add(toolCallId);\n };\n\n const hostToolResult = ({\n toolCallId,\n toolName,\n output,\n isError,\n }: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => {\n closeBlock();\n emit({\n type: 'tool-result',\n toolCallId,\n toolName,\n result: toSafeJSONValue({ value: output, fallback: {} }) ?? {},\n ...(isError ? { isError: true } : {}),\n });\n pendingToolCallIds.delete(toolCallId);\n finishCompletedToolStep();\n };\n\n return {\n update: options => {\n const { update, rawUpdate, preserveRaw } =\n 'update' in options\n ? {\n update: options.update,\n rawUpdate: options.rawUpdate,\n preserveRaw: options.preserveRaw,\n }\n : { update: options, rawUpdate: options, preserveRaw: true };\n const preservedUpdate = rawUpdate === undefined ? update : rawUpdate;\n if (preserveRaw !== false) {\n emit({ type: 'raw', rawValue: preservedUpdate });\n }\n if (\n update.sessionUpdate === 'agent_message_chunk' &&\n update.content?.type === 'text' &&\n typeof update.content.text === 'string'\n ) {\n emitContent({\n type: 'text',\n text: update.content.text,\n messageId: update.messageId,\n });\n return;\n }\n if (\n update.sessionUpdate === 'agent_thought_chunk' &&\n update.content?.type === 'text' &&\n typeof update.content.text === 'string'\n ) {\n emitContent({\n type: 'reasoning',\n text: update.content.text,\n messageId: update.messageId,\n });\n return;\n }\n if (\n update.sessionUpdate === 'agent_message_chunk' ||\n update.sessionUpdate === 'agent_thought_chunk'\n ) {\n closeBlock();\n return;\n }\n if (\n update.sessionUpdate === 'tool_call' ||\n update.sessionUpdate === 'tool_call_update'\n ) {\n emitToolUpdate({ update, rawUpdate: preservedUpdate });\n }\n },\n permissionToolCall: ({ toolCall }) => {\n emitToolUpdate({\n update: toolCall,\n rawUpdate: toolCall,\n forceEmit: true,\n });\n },\n raw: ({ rawValue }) => {\n emit({ type: 'raw', rawValue });\n },\n close: closeBlock,\n hostToolCall,\n hostToolResult,\n finish: response => {\n if (finished) return;\n finished = true;\n emit({ type: 'raw', rawValue: response });\n const finishReason = mapACPFinishReason({\n stopReason: response.stopReason,\n });\n const usageMetadata =\n response.usage == null\n ? undefined\n : mapACPUsageMetadata({ usage: response.usage });\n if (stepOpen) {\n emitInferredStep({ finishReason });\n } else {\n closeBlock();\n }\n emit({\n type: 'finish',\n finishReason,\n totalUsage: mapACPUsage({ usage: response.usage }),\n harnessMetadata: {\n acp: {\n stopReason: response.stopReason,\n ...(usageMetadata == null ? {} : { usage: usageMetadata }),\n },\n },\n });\n },\n };\n}\n\nexport function mapACPFinishReason({ stopReason }: { stopReason: string }): {\n unified:\n | 'stop'\n | 'length'\n | 'content-filter'\n | 'tool-calls'\n | 'error'\n | 'other';\n raw: string;\n} {\n switch (stopReason) {\n case 'end_turn':\n return { unified: 'stop', raw: stopReason };\n case 'max_tokens':\n case 'max_turn_requests':\n return { unified: 'length', raw: stopReason };\n case 'refusal':\n return { unified: 'content-filter', raw: stopReason };\n default:\n return { unified: 'other', raw: stopReason };\n }\n}\n\nfunction indexBuiltinTools({\n builtinTools,\n}: {\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n}): ReadonlyMap<string, ACPBuiltinToolMapping> {\n const matches = new Map<string, ACPBuiltinToolMapping | null>();\n for (const builtinTool of builtinTools) {\n addBuiltinToolMatch({\n matches,\n name: builtinTool.toolName,\n builtinTool,\n });\n if (builtinTool.nativeName != null) {\n addBuiltinToolMatch({\n matches,\n name: builtinTool.nativeName,\n builtinTool,\n });\n }\n }\n return new Map(\n [...matches].filter(\n (entry): entry is [string, ACPBuiltinToolMapping] => entry[1] != null,\n ),\n );\n}\n\nfunction addBuiltinToolMatch({\n matches,\n name,\n builtinTool,\n}: {\n matches: Map<string, ACPBuiltinToolMapping | null>;\n name: string;\n builtinTool: ACPBuiltinToolMapping;\n}): void {\n if (!matches.has(name)) {\n matches.set(name, builtinTool);\n return;\n }\n if (matches.get(name)?.toolName !== builtinTool.toolName) {\n matches.set(name, null);\n }\n}\n\nfunction resolveBuiltinTool({\n programmaticName,\n metadata,\n title,\n kind,\n rawInput,\n builtinTools,\n builtinToolsByName,\n}: {\n programmaticName: string | undefined;\n metadata: unknown;\n title: string | undefined;\n kind: ACPToolKind | undefined;\n rawInput: unknown;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n builtinToolsByName: ReadonlyMap<string, ACPBuiltinToolMapping>;\n}): ACPBuiltinToolMapping | undefined {\n if (programmaticName != null) {\n return builtinToolsByName.get(programmaticName);\n }\n\n const metadataMatch = findBuiltinToolsInMetadata({\n metadata,\n builtinToolsByName,\n });\n if (metadataMatch.hasProgrammaticName) {\n return metadataMatch.matches.length === 1\n ? metadataMatch.matches[0]\n : undefined;\n }\n\n const titleMatch = findBuiltinToolByTitle({\n title,\n kind,\n builtinTools,\n });\n if (titleMatch != null) return titleMatch;\n\n const schemaMatches = builtinTools.filter(tool =>\n matchesBuiltinToolInput({ rawInput, inputSchema: tool.inputSchema }),\n );\n return schemaMatches.length === 1 ? schemaMatches[0] : undefined;\n}\n\nfunction findBuiltinToolByTitle({\n title,\n kind,\n builtinTools,\n}: {\n title: string | undefined;\n kind: ACPToolKind | undefined;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n}): ACPBuiltinToolMapping | undefined {\n if (title == null) return undefined;\n const matches = builtinTools.filter(\n tool =>\n tool.title != null &&\n title.startsWith(tool.title) &&\n isCompatibleToolKind({ toolUseKind: tool.toolUseKind, kind }),\n );\n if (matches.length === 0) return undefined;\n const longestPrefixLength = Math.max(\n ...matches.map(tool => tool.title!.length),\n );\n const longestMatches = matches.filter(\n tool => tool.title!.length === longestPrefixLength,\n );\n return longestMatches.length === 1 ? longestMatches[0] : undefined;\n}\n\nfunction isCompatibleToolKind({\n toolUseKind,\n kind,\n}: {\n toolUseKind: ACPBuiltinToolMapping['toolUseKind'];\n kind: ACPToolKind | undefined;\n}): boolean {\n if (toolUseKind == null || kind == null) return true;\n switch (toolUseKind) {\n case 'readonly':\n return (\n kind === 'read' ||\n kind === 'search' ||\n kind === 'fetch' ||\n kind === 'think'\n );\n case 'edit':\n return kind === 'edit' || kind === 'delete' || kind === 'move';\n case 'bash':\n return kind === 'execute';\n }\n}\n\nfunction findBuiltinToolsInMetadata({\n metadata,\n builtinToolsByName,\n}: {\n metadata: unknown;\n builtinToolsByName: ReadonlyMap<string, ACPBuiltinToolMapping>;\n}): {\n hasProgrammaticName: boolean;\n matches: ReadonlyArray<ACPBuiltinToolMapping>;\n} {\n const matches = new Map<string, ACPBuiltinToolMapping>();\n let hasProgrammaticName = false;\n const seen = new Set<object>();\n const visit = (value: unknown): void => {\n if (value == null || typeof value !== 'object' || seen.has(value)) return;\n seen.add(value);\n for (const [property, child] of Array.isArray(value)\n ? value.entries()\n : Object.entries(value as Record<string, unknown>)) {\n if (\n (property === 'name' || property === 'toolName') &&\n typeof child === 'string'\n ) {\n hasProgrammaticName = true;\n const builtin = builtinToolsByName.get(child);\n if (builtin != null) matches.set(builtin.toolName, builtin);\n }\n visit(child);\n }\n };\n visit(metadata);\n return { hasProgrammaticName, matches: [...matches.values()] };\n}\n\nfunction matchesBuiltinToolInput({\n rawInput,\n inputSchema,\n}: {\n rawInput: unknown;\n inputSchema: ACPBuiltinToolMapping['inputSchema'];\n}): boolean {\n if (!isRecord(rawInput) || !isRecord(inputSchema)) return false;\n if (inputSchema.type !== 'object') return false;\n const required = inputSchema.required;\n if (\n !Array.isArray(required) ||\n required.length === 0 ||\n !required.every(property => typeof property === 'string')\n ) {\n return false;\n }\n if (!hasRequiredBuiltinToolInput({ rawInput, inputSchema })) return false;\n\n const properties = isRecord(inputSchema.properties)\n ? inputSchema.properties\n : {};\n return Object.entries(properties)\n .filter(([, schema]) => isJSONSchemaDiscriminator({ schema }))\n .every(([property, schema]) => {\n if (!Object.prototype.hasOwnProperty.call(rawInput, property)) {\n return false;\n }\n return matchesJSONSchemaValue({ value: rawInput[property], schema });\n });\n}\n\nfunction hasRequiredBuiltinToolInput({\n rawInput,\n inputSchema,\n}: {\n rawInput: unknown;\n inputSchema: ACPBuiltinToolMapping['inputSchema'];\n}): boolean {\n if (!isRecord(inputSchema) || inputSchema.type !== 'object') return true;\n if (!isRecord(rawInput)) return false;\n const required = inputSchema.required;\n if (!Array.isArray(required) || required.length === 0) return true;\n if (!required.every(property => typeof property === 'string')) return true;\n const properties = isRecord(inputSchema.properties)\n ? inputSchema.properties\n : {};\n return required.every(property => {\n if (!Object.prototype.hasOwnProperty.call(rawInput, property)) return false;\n return matchesJSONSchemaValue({\n value: rawInput[property],\n schema: properties[property],\n });\n });\n}\n\nfunction isJSONSchemaDiscriminator({ schema }: { schema: unknown }): boolean {\n return (\n isRecord(schema) &&\n ('const' in schema ||\n (Array.isArray(schema.enum) && schema.enum.length === 1))\n );\n}\n\nfunction matchesJSONSchemaValue({\n value,\n schema,\n}: {\n value: unknown;\n schema: unknown;\n}): boolean {\n if (schema === true) return true;\n if (schema === false || !isRecord(schema)) return false;\n if ('const' in schema && !Object.is(value, schema.const)) return false;\n if (\n Array.isArray(schema.enum) &&\n !schema.enum.some(candidate => Object.is(value, candidate))\n ) {\n return false;\n }\n for (const alternatives of [schema.anyOf, schema.oneOf]) {\n if (\n Array.isArray(alternatives) &&\n !alternatives.some(alternative =>\n matchesJSONSchemaValue({ value, schema: alternative }),\n )\n ) {\n return false;\n }\n }\n if (typeof schema.type !== 'string') return true;\n switch (schema.type) {\n case 'null':\n return value === null;\n case 'boolean':\n return typeof value === 'boolean';\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'number':\n return typeof value === 'number' && Number.isFinite(value);\n case 'string':\n return typeof value === 'string';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isRecord(value);\n default:\n return true;\n }\n}\n\nfunction mergeToolUpdate({\n state,\n update,\n rawUpdate,\n}: {\n state: ToolState;\n update: Extract<\n ACPSessionUpdate,\n { sessionUpdate: 'tool_call' | 'tool_call_update' }\n >;\n rawUpdate: unknown;\n}): void {\n const parsed = update as unknown as Record<string, unknown>;\n for (const property of [\n 'title',\n 'kind',\n 'status',\n 'content',\n 'locations',\n 'rawInput',\n 'rawOutput',\n '_meta',\n ]) {\n if (\n Object.prototype.hasOwnProperty.call(parsed, property) &&\n parsed[property] !== undefined\n ) {\n state.values[property] = parsed[property];\n }\n }\n const programmaticName = getStringProperty({\n value: rawUpdate,\n property: 'name',\n });\n if (programmaticName != null) state.values.name = programmaticName;\n}\n\nfunction createACPToolCall({ state }: { state: ToolState }): ACPToolCall {\n const title = getStringProperty({\n value: state.values,\n property: 'title',\n });\n const kind = state.values.kind;\n const status = state.values.status;\n return {\n toolCallId: state.toolCallId,\n title: title ?? state.toolName ?? `Tool ${state.toolCallId}`,\n ...(isACPToolKind(kind) ? { kind } : {}),\n ...(isACPToolCallStatus(status) ? { status } : {}),\n ...(Array.isArray(state.values.content)\n ? { content: state.values.content as ACPToolCall['content'] }\n : {}),\n ...(Array.isArray(state.values.locations)\n ? { locations: state.values.locations as ACPToolCall['locations'] }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(state.values, 'rawInput')\n ? { rawInput: state.values.rawInput }\n : {}),\n ...(Object.prototype.hasOwnProperty.call(state.values, 'rawOutput')\n ? { rawOutput: state.values.rawOutput }\n : {}),\n ...(state.values._meta === null || isRecord(state.values._meta)\n ? { _meta: state.values._meta }\n : {}),\n };\n}\n\nfunction isACPToolKind(value: unknown): value is ACPToolKind {\n return (\n value === 'read' ||\n value === 'edit' ||\n value === 'delete' ||\n value === 'move' ||\n value === 'search' ||\n value === 'execute' ||\n value === 'think' ||\n value === 'fetch' ||\n value === 'switch_mode' ||\n value === 'other'\n );\n}\n\nfunction isACPToolCallStatus(value: unknown): value is ACPToolCallStatus {\n return (\n value === 'pending' ||\n value === 'in_progress' ||\n value === 'completed' ||\n value === 'failed'\n );\n}\n\nfunction emitFileChanges({\n state,\n emit,\n}: {\n state: ToolState;\n emit: (event: HarnessV1StreamPart) => void;\n}): void {\n const content = Array.isArray(state.values.content)\n ? state.values.content\n : [];\n for (const item of content) {\n if (!isRecord(item) || item.type !== 'diff') continue;\n const path = getStringProperty({ value: item, property: 'path' });\n const newText = getStringProperty({ value: item, property: 'newText' });\n if (path == null || newText == null) continue;\n const oldText = item.oldText;\n const event = oldText == null ? 'create' : 'modify';\n emitFileChange({ state, emit, path, event });\n }\n\n if (state.values.kind !== 'edit') return;\n const locations = Array.isArray(state.values.locations)\n ? state.values.locations\n : [];\n for (const location of locations) {\n const path = getStringProperty({ value: location, property: 'path' });\n if (path != null) {\n emitFileChange({ state, emit, path, event: 'modify' });\n }\n }\n}\n\nfunction emitFileChange({\n state,\n emit,\n path,\n event,\n}: {\n state: ToolState;\n emit: (event: HarnessV1StreamPart) => void;\n path: string;\n event: 'create' | 'modify' | 'delete';\n}): void {\n if (state.emittedFilePaths.has(path)) return;\n state.emittedFilePaths.add(path);\n emit({\n type: 'file-change',\n path,\n event,\n harnessMetadata: {\n acp: {\n toolCallId: state.toolCallId,\n },\n },\n });\n}\n\nfunction createDynamicToolName({\n programmaticName,\n toolCallId,\n}: {\n programmaticName: string | undefined;\n toolCallId: string;\n}): string {\n const source = programmaticName ?? `acp_tool_${toolCallId}`;\n const normalized = source\n .replace(/[^A-Za-z0-9_-]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .slice(0, 128);\n if (normalized.length === 0) return 'acp_tool';\n return /^[A-Za-z_]/.test(normalized) ? normalized : `acp_${normalized}`;\n}\n\nfunction stringifyToolInput({ input }: { input: unknown }): string {\n return JSON.stringify(toSafeJSONValue({ value: input, fallback: {} }));\n}\n\nfunction createToolResult({ state }: { state: ToolState }): HarnessToolResult {\n const value =\n state.values.rawOutput != null\n ? state.values.rawOutput\n : state.values.content != null\n ? state.values.content\n : {};\n return toSafeJSONValue({ value, fallback: {} }) ?? {};\n}\n\nfunction toSafeJSONValue({\n value,\n fallback,\n seen = new Set(),\n}: {\n value: unknown;\n fallback: HarnessJSONValue;\n seen?: Set<object>;\n}): HarnessJSONValue {\n if (value == null) return fallback;\n if (typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return value.toString();\n if (typeof value !== 'object') return fallback;\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n if (Array.isArray(value)) {\n const result = value.map(item =>\n toSafeJSONValue({ value: item, fallback: null, seen }),\n );\n seen.delete(value);\n return result;\n }\n const result = Object.create(null) as Record<string, HarnessJSONValue>;\n try {\n for (const [key, item] of Object.entries(value)) {\n result[key] = toSafeJSONValue({\n value: item,\n fallback: null,\n seen,\n });\n }\n } catch {\n seen.delete(value);\n return fallback;\n }\n seen.delete(value);\n return result;\n}\n\nfunction getStringProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): string | undefined {\n if (!isRecord(value)) return undefined;\n const propertyValue = value[property];\n return typeof propertyValue === 'string' ? propertyValue : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction mapACPUsage({\n usage,\n}: {\n usage: ACPPromptResponse['usage'];\n}): HarnessUsage {\n if (usage == null) return unknownUsage();\n const raw = mapACPUsageMetadata({ usage });\n return {\n inputTokens: {\n total: usage.inputTokens,\n noCache: undefined,\n cacheRead: usage.cachedReadTokens ?? undefined,\n cacheWrite: usage.cachedWriteTokens ?? undefined,\n },\n outputTokens: {\n total: usage.outputTokens,\n text: undefined,\n reasoning: usage.thoughtTokens ?? undefined,\n },\n raw,\n };\n}\n\nfunction mapACPUsageMetadata({\n usage,\n}: {\n usage: NonNullable<ACPPromptResponse['usage']>;\n}) {\n return {\n totalTokens: usage.totalTokens,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n ...(usage.thoughtTokens == null\n ? {}\n : { thoughtTokens: usage.thoughtTokens }),\n ...(usage.cachedReadTokens == null\n ? {}\n : { cachedReadTokens: usage.cachedReadTokens }),\n ...(usage.cachedWriteTokens == null\n ? {}\n : { cachedWriteTokens: usage.cachedWriteTokens }),\n };\n}\n\nfunction unknownUsage(): HarnessUsage {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n}\n","import type {\n ActiveSessionMessage,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\n\ntype SessionUpdateMessage = Extract<\n ActiveSessionMessage,\n { readonly kind: 'session_update' }\n>;\n\ntype BufferedUpdate = {\n readonly message: SessionUpdateMessage;\n readonly rawUpdate: unknown;\n};\n\ntype CorrelationInvocation = {\n readonly token: string;\n readonly serverName: string;\n readonly toolName: string;\n readonly inputFingerprint: string;\n readonly order: number;\n expiryTimer?: ReturnType<typeof setTimeout>;\n toolCallId?: string;\n};\n\ntype CorrelationCandidate = {\n readonly toolCallId: string;\n readonly order: number;\n readonly evidence: unknown[];\n};\n\nconst CORRELATION_WINDOW_MS = 1000;\nconst MAX_BUFFERED_UPDATES = 128;\n\nexport function createHostToolCorrelation({\n emitSemanticUpdate,\n emitRawUpdate,\n hostToolServerName,\n hostTools,\n}: {\n emitSemanticUpdate: (options: {\n message: SessionUpdateMessage;\n rawUpdate: unknown;\n }) => void;\n emitRawUpdate: (options: { rawUpdate: unknown }) => void;\n hostToolServerName: string;\n hostTools: ReadonlyArray<{ readonly name: string }>;\n}): {\n update(options: { message: SessionUpdateMessage; rawUpdate?: unknown }): void;\n registerInvocation(options: {\n token: string;\n serverName: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n order: number;\n }): void;\n claimHostToolPermission(options: { toolCall: ToolCallUpdate }): boolean;\n flush(): void;\n removeInvocation(options: { token: string }): void;\n close(): void;\n} {\n const invocations = new Map<string, CorrelationInvocation>();\n const candidates = new Map<string, CorrelationCandidate>();\n const suppressedToolCallIds = new Set<string>();\n const releasedToolCallIds = new Set<string>();\n let nextCandidateOrder = 0;\n let buffered: BufferedUpdate[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | undefined;\n\n const flush = () => {\n if (flushTimer != null) {\n clearTimeout(flushTimer);\n flushTimer = undefined;\n }\n if (buffered.length === 0) return;\n const updates = buffered;\n buffered = [];\n for (const update of updates) {\n if (\n isToolUpdate(update.message) &&\n suppressedToolCallIds.has(update.message.update.toolCallId)\n ) {\n continue;\n }\n if (isToolUpdate(update.message)) {\n releasedToolCallIds.add(update.message.update.toolCallId);\n }\n emitSemanticUpdate(update);\n }\n for (const toolCallId of candidates.keys()) {\n if (!suppressedToolCallIds.has(toolCallId)) {\n releasedToolCallIds.add(toolCallId);\n }\n }\n candidates.clear();\n };\n\n const scheduleFlush = () => {\n if (flushTimer != null) return;\n flushTimer = setTimeout(flush, CORRELATION_WINDOW_MS);\n flushTimer.unref?.();\n };\n\n const suppressCandidate = ({\n candidate,\n invocation,\n }: {\n candidate: CorrelationCandidate;\n invocation: CorrelationInvocation;\n }) => {\n invocation.toolCallId = candidate.toolCallId;\n suppressedToolCallIds.add(candidate.toolCallId);\n candidates.delete(candidate.toolCallId);\n deleteInvocation({ invocations, token: invocation.token });\n };\n\n const suppressToolCallUpdate = ({ toolCallId }: { toolCallId: string }) => {\n suppressedToolCallIds.add(toolCallId);\n candidates.delete(toolCallId);\n if (candidates.size === 0) flush();\n };\n\n const reconcile = () => {\n const orderedInvocations = [...invocations.values()].sort(\n (left, right) => left.order - right.order,\n );\n const orderedCandidates = [...candidates.values()].sort(\n (left, right) => left.order - right.order,\n );\n for (const invocation of orderedInvocations) {\n if (invocation.toolCallId != null) continue;\n const candidate = orderedCandidates.find(\n item =>\n candidates.has(item.toolCallId) &&\n hasPortableEvidence({ candidate: item, invocation }),\n );\n if (candidate != null) suppressCandidate({ candidate, invocation });\n }\n if (candidates.size === 0) flush();\n };\n\n return {\n update: ({ message, rawUpdate }) => {\n const preservedUpdate =\n rawUpdate === undefined ? message.update : rawUpdate;\n emitRawUpdate({ rawUpdate: preservedUpdate });\n if (!isToolUpdate(message)) {\n if (buffered.length === 0) {\n emitSemanticUpdate({ message, rawUpdate: preservedUpdate });\n } else {\n buffered.push({ message, rawUpdate: preservedUpdate });\n if (buffered.length >= MAX_BUFFERED_UPDATES) flush();\n }\n return;\n }\n\n const toolCallId = message.update.toolCallId;\n if (suppressedToolCallIds.has(toolCallId)) {\n if (isTerminalToolUpdate(message)) {\n suppressedToolCallIds.delete(toolCallId);\n removeInvocationForToolCall({ invocations, toolCallId });\n }\n return;\n }\n if (releasedToolCallIds.has(toolCallId)) {\n emitSemanticUpdate({ message, rawUpdate: preservedUpdate });\n if (isTerminalToolUpdate(message))\n releasedToolCallIds.delete(toolCallId);\n return;\n }\n\n buffered.push({ message, rawUpdate: preservedUpdate });\n const candidate =\n candidates.get(toolCallId) ??\n ({\n toolCallId,\n order: ++nextCandidateOrder,\n evidence: [],\n } satisfies CorrelationCandidate);\n candidate.evidence.push(message.update, preservedUpdate);\n candidates.set(toolCallId, candidate);\n\n const tokenMatch = findTokenInvocation({\n value: preservedUpdate,\n invocations,\n });\n if (tokenMatch != null) {\n suppressCandidate({ candidate, invocation: tokenMatch });\n }\n reconcile();\n if (buffered.length >= MAX_BUFFERED_UPDATES) flush();\n else if (buffered.length > 0) scheduleFlush();\n },\n registerInvocation: ({ token, serverName, toolName, input, order }) => {\n const invocation: CorrelationInvocation = {\n token,\n serverName,\n toolName,\n inputFingerprint: canonicalFingerprint({ value: input }),\n order,\n };\n invocations.set(token, invocation);\n invocation.expiryTimer = setTimeout(\n () => deleteInvocation({ invocations, token }),\n CORRELATION_WINDOW_MS,\n );\n invocation.expiryTimer.unref?.();\n const tokenCandidate = [...candidates.values()].find(candidate =>\n candidate.evidence.some(value =>\n containsExactValue({ value, target: token }),\n ),\n );\n if (tokenCandidate != null) {\n suppressCandidate({ candidate: tokenCandidate, invocation });\n }\n reconcile();\n },\n claimHostToolPermission: ({ toolCall }) => {\n const candidate = candidates.get(toolCall.toolCallId);\n const matches = hostTools.filter(({ name }) => {\n const permission = resolvePermissionHostTool({\n toolCall,\n serverName: hostToolServerName,\n toolName: name,\n });\n if (permission == null) return false;\n if (candidate == null) return permission.hasRequestIdentity;\n return hasPortableEvidence({\n candidate,\n invocation: {\n token: '',\n serverName: hostToolServerName,\n toolName: name,\n inputFingerprint: canonicalFingerprint({\n value: permission.input,\n }),\n order: 0,\n },\n });\n });\n if (matches.length !== 1) return false;\n suppressToolCallUpdate({ toolCallId: toolCall.toolCallId });\n return true;\n },\n flush,\n removeInvocation: ({ token }) => {\n deleteInvocation({ invocations, token });\n },\n close: () => {\n flush();\n for (const invocation of invocations.values()) {\n if (invocation.expiryTimer != null) {\n clearTimeout(invocation.expiryTimer);\n }\n }\n invocations.clear();\n candidates.clear();\n suppressedToolCallIds.clear();\n releasedToolCallIds.clear();\n },\n };\n}\n\nfunction hasPortableEvidence({\n candidate,\n invocation,\n}: {\n candidate: CorrelationCandidate;\n invocation: CorrelationInvocation;\n}): boolean {\n let hasServerIdentity = false;\n let hasToolName = false;\n let hasInput = false;\n for (const evidence of candidate.evidence) {\n const metadata = getProperty({ value: evidence, property: '_meta' });\n const rawInput = getProperty({ value: evidence, property: 'rawInput' });\n const programmaticName = getProperty({\n value: evidence,\n property: 'name',\n });\n const deferredToolName = getProperty({\n value: rawInput,\n property: 'tool_name',\n });\n const deferredToolInput = getProperty({\n value: rawInput,\n property: 'tool_input',\n });\n if (\n containsCombinedIdentity({\n value: [metadata, programmaticName],\n serverName: invocation.serverName,\n toolName: invocation.toolName,\n })\n ) {\n hasServerIdentity = true;\n hasToolName = true;\n }\n if (\n typeof deferredToolName === 'string' &&\n isRecord(deferredToolInput) &&\n hasDelimitedPair({\n value: deferredToolName,\n serverName: invocation.serverName,\n toolName: invocation.toolName,\n })\n ) {\n hasServerIdentity = true;\n hasToolName = true;\n if (\n canonicalFingerprint({ value: deferredToolInput }) ===\n invocation.inputFingerprint\n ) {\n hasInput = true;\n }\n }\n if (\n containsExactValue({\n value: [metadata, rawInput],\n target: invocation.serverName,\n })\n ) {\n hasServerIdentity = true;\n }\n if (\n programmaticName === invocation.toolName ||\n containsExactValue({\n value: [metadata, rawInput],\n target: invocation.toolName,\n })\n ) {\n hasToolName = true;\n }\n if (\n containsFingerprint({\n value: [metadata, rawInput],\n target: invocation.inputFingerprint,\n })\n ) {\n hasInput = true;\n }\n }\n return hasServerIdentity && hasToolName && hasInput;\n}\n\nfunction resolvePermissionHostTool({\n toolCall,\n serverName,\n toolName,\n}: {\n toolCall: ToolCallUpdate;\n serverName: string;\n toolName: string;\n}):\n | {\n readonly input: Readonly<Record<string, unknown>>;\n readonly hasRequestIdentity: boolean;\n }\n | undefined {\n if (!isRecord(toolCall.rawInput)) return undefined;\n const deferredToolName = getProperty({\n value: toolCall.rawInput,\n property: 'tool_name',\n });\n const deferredToolInput = getProperty({\n value: toolCall.rawInput,\n property: 'tool_input',\n });\n if (\n hasOwnProperty({ value: toolCall.rawInput, property: 'tool_name' }) &&\n hasOwnProperty({ value: toolCall.rawInput, property: 'tool_input' })\n ) {\n if (\n typeof deferredToolName !== 'string' ||\n !isRecord(deferredToolInput) ||\n !hasDelimitedPair({\n value: deferredToolName,\n serverName,\n toolName,\n })\n ) {\n return undefined;\n }\n return {\n input: deferredToolInput,\n hasRequestIdentity: true,\n };\n }\n return {\n input: toolCall.rawInput,\n hasRequestIdentity: containsCombinedIdentity({\n value: [\n getProperty({ value: toolCall, property: 'title' }),\n getProperty({ value: toolCall, property: 'name' }),\n getProperty({ value: toolCall, property: '_meta' }),\n ],\n serverName,\n toolName,\n }),\n };\n}\n\nfunction containsCombinedIdentity({\n value,\n serverName,\n toolName,\n}: {\n value: unknown;\n serverName: string;\n toolName: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (typeof candidate === 'string') {\n return hasDelimitedPair({ value: candidate, serverName, toolName });\n }\n if (candidate == null || typeof candidate !== 'object') return false;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n return false;\n };\n return visit(value);\n}\n\nfunction hasDelimitedPair({\n value,\n serverName,\n toolName,\n}: {\n value: string;\n serverName: string;\n toolName: string;\n}): boolean {\n if (serverName.length === 0 || toolName.length === 0) return false;\n let serverIndex = value.indexOf(serverName);\n while (serverIndex !== -1) {\n const beforeServer = serverIndex === 0 ? undefined : value[serverIndex - 1];\n const serverHasLeadingBoundary =\n beforeServer == null ||\n value.slice(0, serverIndex).endsWith('__') ||\n !/[A-Za-z0-9_-]/.test(beforeServer);\n const delimiterStart = serverIndex + serverName.length;\n let toolIndex = delimiterStart;\n while (toolIndex < value.length && !/[A-Za-z0-9-]/.test(value[toolIndex])) {\n toolIndex += 1;\n }\n const toolEnd = toolIndex + toolName.length;\n const afterTool = toolEnd === value.length ? undefined : value[toolEnd];\n const toolHasTrailingBoundary =\n afterTool == null ||\n value.startsWith('__', toolEnd) ||\n !/[A-Za-z0-9_-]/.test(afterTool);\n if (\n serverHasLeadingBoundary &&\n toolIndex > delimiterStart &&\n value.startsWith(toolName, toolIndex) &&\n toolHasTrailingBoundary\n ) {\n return true;\n }\n serverIndex = value.indexOf(serverName, serverIndex + 1);\n }\n return false;\n}\n\nfunction findTokenInvocation({\n value,\n invocations,\n}: {\n value: unknown;\n invocations: ReadonlyMap<string, CorrelationInvocation>;\n}): CorrelationInvocation | undefined {\n for (const invocation of invocations.values()) {\n if (containsExactValue({ value, target: invocation.token })) {\n return invocation;\n }\n }\n return undefined;\n}\n\nfunction removeInvocationForToolCall({\n invocations,\n toolCallId,\n}: {\n invocations: Map<string, CorrelationInvocation>;\n toolCallId: string;\n}): void {\n for (const [token, invocation] of invocations) {\n if (invocation.toolCallId === toolCallId) {\n deleteInvocation({ invocations, token });\n }\n }\n}\n\nfunction deleteInvocation({\n invocations,\n token,\n}: {\n invocations: Map<string, CorrelationInvocation>;\n token: string;\n}): void {\n const invocation = invocations.get(token);\n if (invocation?.expiryTimer != null) clearTimeout(invocation.expiryTimer);\n invocations.delete(token);\n}\n\nfunction isToolUpdate(\n message: SessionUpdateMessage,\n): message is SessionUpdateMessage & {\n readonly update: {\n readonly sessionUpdate: 'tool_call' | 'tool_call_update';\n readonly toolCallId: string;\n readonly status?: string | null;\n };\n} {\n return (\n message.update.sessionUpdate === 'tool_call' ||\n message.update.sessionUpdate === 'tool_call_update'\n );\n}\n\nfunction containsExactValue({\n value,\n target,\n}: {\n value: unknown;\n target: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (candidate === target) return true;\n if (candidate == null || typeof candidate !== 'object') return false;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n return false;\n };\n return visit(value);\n}\n\nfunction containsFingerprint({\n value,\n target,\n}: {\n value: unknown;\n target: string;\n}): boolean {\n const seen = new Set<object>();\n const visit = (candidate: unknown): boolean => {\n if (candidate != null && typeof candidate === 'object') {\n if (canonicalFingerprint({ value: candidate }) === target) return true;\n if (seen.has(candidate)) return false;\n seen.add(candidate);\n const values = Array.isArray(candidate)\n ? candidate\n : Object.values(candidate);\n for (const item of values) {\n if (visit(item)) return true;\n }\n }\n return false;\n };\n return visit(value);\n}\n\nfunction canonicalFingerprint({ value }: { value: unknown }): string {\n return JSON.stringify(canonicalizeJSON({ value }));\n}\n\nfunction canonicalizeJSON({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => canonicalizeJSON({ value: item }));\n }\n if (value == null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.keys(value as Record<string, unknown>)\n .sort()\n .filter(key => (value as Record<string, unknown>)[key] !== undefined)\n .map(key => [\n key,\n canonicalizeJSON({\n value: (value as Record<string, unknown>)[key],\n }),\n ]),\n );\n}\n\nfunction getProperty({\n value,\n property,\n}: {\n value: unknown;\n property: string;\n}): unknown {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n return Reflect.get(value, property);\n}\n\nfunction hasOwnProperty({\n value,\n property,\n}: {\n value: Readonly<Record<string, unknown>>;\n property: string;\n}): boolean {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isTerminalToolUpdate(\n message: SessionUpdateMessage,\n): message is SessionUpdateMessage & {\n readonly update: {\n readonly sessionUpdate: 'tool_call' | 'tool_call_update';\n readonly toolCallId: string;\n readonly status: 'completed' | 'failed';\n };\n} {\n return (\n isToolUpdate(message) &&\n (message.update.status === 'completed' ||\n message.update.status === 'failed')\n );\n}\n","import type {\n ActiveSessionMessage,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\nimport type {\n HarnessV1BridgeToolWire,\n HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport type { ACPToolCall } from '../../acp-tool-call';\nimport type { ACPBuiltinToolMapping } from '../acp-v1-bridge-protocol';\nimport { createACPStreamTranslator } from './stream-translator';\nimport { createHostToolCorrelation } from './host-tool-correlation';\n\nexport function createEmitStreamEvent({\n emit,\n emitToolCallCandidate,\n builtinTools,\n hostToolServerName,\n hostTools,\n}: {\n emit: (event: HarnessV1StreamPart) => void;\n emitToolCallCandidate: (options: { toolCall: ACPToolCall }) => void;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n hostToolServerName: string;\n hostTools: ReadonlyArray<HarnessV1BridgeToolWire>;\n}): {\n message: (options: {\n message: ActiveSessionMessage;\n rawUpdate?: unknown;\n }) => boolean;\n raw: (options: { rawValue: unknown }) => void;\n close: () => void;\n permissionToolCall: (options: { toolCall: ToolCallUpdate }) => void;\n claimHostToolPermission: (options: { toolCall: ToolCallUpdate }) => boolean;\n hostToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n hostToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n registerHostToolCorrelationInvocation: (options: {\n token: string;\n serverName: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n order: number;\n }) => void;\n removeHostToolCorrelationInvocation: (options: { token: string }) => void;\n} {\n const translator = createACPStreamTranslator({\n emit,\n emitToolCallCandidate,\n builtinTools,\n });\n const correlation = createHostToolCorrelation({\n emitSemanticUpdate: ({ message, rawUpdate }) => {\n translator.update({\n update: message.update,\n rawUpdate,\n preserveRaw: false,\n });\n },\n emitRawUpdate: ({ rawUpdate }) => {\n translator.raw({ rawValue: rawUpdate });\n },\n hostToolServerName,\n hostTools,\n });\n\n return {\n message: ({ message, rawUpdate }) => {\n if (message.kind === 'stop') {\n correlation.close();\n translator.finish(message.response);\n return true;\n }\n correlation.update({ message, rawUpdate });\n return false;\n },\n raw: translator.raw,\n close: () => {\n correlation.close();\n translator.close();\n },\n permissionToolCall: ({ toolCall }) => {\n translator.permissionToolCall({\n toolCall: {\n sessionUpdate: 'tool_call_update',\n ...toolCall,\n },\n });\n },\n claimHostToolPermission: correlation.claimHostToolPermission,\n hostToolCall: translator.hostToolCall,\n hostToolResult: translator.hostToolResult,\n registerHostToolCorrelationInvocation: correlation.registerInvocation,\n removeHostToolCorrelationInvocation: correlation.removeInvocation,\n };\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPInstructionMapping,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nconst UNSAFE_PATH_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\nconst serializableRecordSchema: z.ZodType<\n Readonly<Record<string, ACPSerializableValue>>\n> = z.record(z.string(), z.json());\n\nexport async function resolveACPInstructionConfiguration({\n instructions,\n instructionMapping,\n sessionMeta,\n environment,\n}: {\n instructions: string | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n environment: Readonly<Record<string, string | undefined>>;\n}): Promise<{\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n environment: Record<string, string | undefined>;\n}> {\n const resolvedEnvironment = { ...environment };\n if (\n instructionMapping == null ||\n instructions == null ||\n instructions.length === 0\n ) {\n return { sessionMeta, environment: resolvedEnvironment };\n }\n\n assertSafePath({ path: instructionMapping.path });\n\n if (instructionMapping.type === 'session-meta') {\n return {\n sessionMeta: setStringAtPath({\n record: sessionMeta ?? {},\n path: instructionMapping.path,\n value: instructions,\n }),\n environment: resolvedEnvironment,\n };\n }\n\n const serialized = resolvedEnvironment[instructionMapping.variable];\n let configuration: Readonly<Record<string, ACPSerializableValue>> = {};\n if (serialized != null && serialized.length > 0) {\n configuration = parseSerializableRecord({\n serialized,\n variable: instructionMapping.variable,\n });\n }\n\n resolvedEnvironment[instructionMapping.variable] = JSON.stringify(\n setStringAtPath({\n record: configuration,\n path: instructionMapping.path,\n value: instructions,\n }),\n );\n\n return { sessionMeta, environment: resolvedEnvironment };\n}\n\n/*\n * The bridge runs in an isolated runtime whose dependencies are limited to the\n * ones declared in this directory's package.json, so AI SDK JSON helpers are\n * unavailable here. Schema validation plus a guarded `JSON.parse` provides the\n * same guarantee: nothing but a validated serializable record escapes.\n */\nfunction parseSerializableRecord({\n serialized,\n variable,\n}: {\n serialized: string;\n variable: string;\n}): Readonly<Record<string, ACPSerializableValue>> {\n try {\n const result = serializableRecordSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error(\n `ACP instruction mapping environment variable ${JSON.stringify(variable)} must contain a JSON object.`,\n );\n}\n\nfunction setStringAtPath({\n record,\n path,\n value,\n}: {\n record: Readonly<Record<string, ACPSerializableValue>>;\n path: ReadonlyArray<string>;\n value: string;\n}): Record<string, ACPSerializableValue> {\n const [key, ...remainingPath] = path;\n if (key == null) return { ...record };\n return {\n ...record,\n [key]:\n remainingPath.length === 0\n ? value\n : setStringAtPath({\n record: isRecord(record[key]) ? record[key] : {},\n path: remainingPath,\n value,\n }),\n };\n}\n\nfunction assertSafePath({ path }: { path: ReadonlyArray<string> }): void {\n if (\n path.length === 0 ||\n path.some(\n segment => segment.length === 0 || UNSAFE_PATH_SEGMENTS.has(segment),\n )\n ) {\n throw new Error(\n 'ACP instruction mapping path must contain only safe, non-empty property names.',\n );\n }\n}\n\nfunction isRecord(\n value: ACPSerializableValue | undefined,\n): value is Readonly<Record<string, ACPSerializableValue>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\nimport { createServer, type IncomingMessage, type Server } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { HarnessV1BridgeToolWire } from '@ai-sdk/harness';\n\nexport type HostToolCorrelationInvocation = {\n readonly token: string;\n readonly serverName: string;\n readonly toolName: string;\n readonly input: Readonly<Record<string, unknown>>;\n readonly order: number;\n};\n\nexport type HostToolRelayTurn = {\n readonly emitToolCall: (options: {\n toolCallId: string;\n toolName: string;\n input: Readonly<Record<string, unknown>>;\n }) => void;\n readonly emitToolResult: (options: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n isError?: boolean;\n }) => void;\n readonly requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n readonly registerCorrelationInvocation: (\n options: HostToolCorrelationInvocation,\n ) => void;\n readonly removeCorrelationInvocation: (options: { token: string }) => void;\n};\n\nexport type HostToolRelay = {\n readonly url: string;\n readonly credential: string;\n bindTurn(options: { turn: HostToolRelayTurn }): void;\n unbindTurn(options: { turn: HostToolRelayTurn }): void;\n updateCatalog(options: { tools: ReadonlyArray<HarnessV1BridgeToolWire> }): {\n changed: boolean;\n revision: number;\n };\n waitForCatalogRefresh(options: {\n revision: number;\n timeoutMs: number;\n }): Promise<boolean>;\n close(): Promise<void>;\n};\n\ntype CatalogState = {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n fingerprint: string;\n revision: number;\n servedRevision: number;\n closed: boolean;\n readonly changeWaiters: Set<() => void>;\n readonly refreshWaiters: Set<{\n readonly revision: number;\n readonly resolve: (refreshed: boolean) => void;\n }>;\n};\n\nexport async function startHostToolRelay({\n tools,\n serverName,\n}: {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n serverName: string;\n}): Promise<HostToolRelay> {\n const state: CatalogState = {\n tools: [...tools],\n fingerprint: catalogFingerprint({ tools }),\n revision: 1,\n servedRevision: 0,\n closed: false,\n changeWaiters: new Set(),\n refreshWaiters: new Set(),\n };\n const credential = randomBytes(32).toString('hex');\n let activeTurn: HostToolRelayTurn | undefined;\n let invocationOrder = 0;\n let closePromise: Promise<void> | undefined;\n const server = createServer(async (request, response) => {\n try {\n const result = await handleRequest({\n request,\n credential,\n state,\n serverName,\n turn: activeTurn,\n nextInvocationOrder: () => ++invocationOrder,\n });\n response.writeHead(200, { 'content-type': 'application/json' });\n response.end(JSON.stringify(result));\n } catch (error) {\n const status = error instanceof RelayRequestError ? error.status : 500;\n response.writeHead(status, { 'content-type': 'application/json' });\n response.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n await listen({ server });\n const address = server.address() as AddressInfo;\n\n return {\n url: `http://127.0.0.1:${address.port}/invoke`,\n credential,\n bindTurn: ({ turn }) => {\n if (activeTurn != null && activeTurn !== turn) {\n throw new Error('A host tool relay turn is already active.');\n }\n activeTurn = turn;\n },\n unbindTurn: ({ turn }) => {\n if (activeTurn === turn) activeTurn = undefined;\n },\n updateCatalog: ({ tools: nextTools }) => {\n const fingerprint = catalogFingerprint({ tools: nextTools });\n if (fingerprint === state.fingerprint) {\n return { changed: false, revision: state.revision };\n }\n state.tools = [...nextTools];\n state.fingerprint = fingerprint;\n state.revision += 1;\n resolveCatalogChanges({ state });\n return { changed: true, revision: state.revision };\n },\n waitForCatalogRefresh: ({ revision, timeoutMs }) =>\n waitForCatalogRefresh({ state, revision, timeoutMs }),\n close: () => {\n if (closePromise != null) return closePromise;\n state.closed = true;\n resolveCatalogChanges({ state });\n resolveRefreshWaiters({ state, closing: true });\n closePromise = closeServer({ server });\n return closePromise;\n },\n };\n}\n\nasync function handleRequest({\n request,\n credential,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n}: {\n request: IncomingMessage;\n credential: string;\n state: CatalogState;\n serverName: string;\n turn: HostToolRelayTurn | undefined;\n nextInvocationOrder: () => number;\n}): Promise<unknown> {\n if (request.method !== 'POST') {\n throw new RelayRequestError({\n status: 404,\n message: 'Unknown host tool relay endpoint.',\n });\n }\n if (\n !credentialsMatch({\n expected: credential,\n actual: request.headers.authorization,\n })\n ) {\n throw new RelayRequestError({\n status: 401,\n message: 'Invalid host tool relay credential.',\n });\n }\n const body = await readJSONBody({ request });\n if (request.url === '/catalog/next') {\n return handleCatalogNext({ body, state });\n }\n if (request.url === '/catalog/seen') {\n return handleCatalogSeen({ body, state });\n }\n if (request.url === '/invoke') {\n return handleInvocation({\n body,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n });\n }\n throw new RelayRequestError({\n status: 404,\n message: 'Unknown host tool relay endpoint.',\n });\n}\n\nasync function handleCatalogNext({\n body,\n state,\n}: {\n body: unknown;\n state: CatalogState;\n}): Promise<unknown> {\n if (\n !isRecord(body) ||\n !Number.isSafeInteger(body.afterRevision) ||\n (body.afterRevision as number) < 0\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool catalog poll request.',\n });\n }\n const afterRevision = body.afterRevision as number;\n if (!state.closed && afterRevision >= state.revision) {\n await waitForCatalogChange({ state });\n }\n if (state.closed) {\n return { closed: true, revision: state.revision };\n }\n return afterRevision < state.revision\n ? { revision: state.revision, tools: state.tools }\n : { revision: state.revision };\n}\n\nfunction handleCatalogSeen({\n body,\n state,\n}: {\n body: unknown;\n state: CatalogState;\n}): unknown {\n if (\n !isRecord(body) ||\n !Number.isSafeInteger(body.revision) ||\n (body.revision as number) < 1 ||\n (body.revision as number) > state.revision\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool catalog acknowledgment.',\n });\n }\n state.servedRevision = Math.max(\n state.servedRevision,\n body.revision as number,\n );\n resolveRefreshWaiters({ state, closing: false });\n return { acknowledged: true };\n}\n\nasync function handleInvocation({\n body,\n state,\n serverName,\n turn,\n nextInvocationOrder,\n}: {\n body: unknown;\n state: CatalogState;\n serverName: string;\n turn: HostToolRelayTurn | undefined;\n nextInvocationOrder: () => number;\n}): Promise<{\n output: unknown;\n isError?: boolean;\n correlationToken: string;\n}> {\n if (turn == null) {\n throw new RelayRequestError({\n status: 409,\n message: 'No ACP prompt turn is active.',\n });\n }\n if (\n !isRecord(body) ||\n typeof body.requestId !== 'string' ||\n typeof body.toolName !== 'string' ||\n !isRecord(body.input) ||\n !Number.isSafeInteger(body.catalogRevision)\n ) {\n throw new RelayRequestError({\n status: 400,\n message: 'Invalid host tool relay request.',\n });\n }\n if (body.catalogRevision !== state.revision) {\n throw new RelayRequestError({\n status: 409,\n message:\n `Host tool ${body.toolName} was invoked from stale catalog revision ` +\n `${body.catalogRevision}; the active revision is ${state.revision}.`,\n });\n }\n const tool = state.tools.find(item => item.name === body.toolName);\n if (tool == null) {\n throw new RelayRequestError({\n status: 404,\n message:\n `Host tool ${body.toolName} is not active in catalog revision ` +\n `${state.revision}.`,\n });\n }\n\n const correlationToken = randomBytes(32).toString('hex');\n turn.registerCorrelationInvocation({\n token: correlationToken,\n serverName,\n toolName: tool.name,\n input: body.input,\n order: nextInvocationOrder(),\n });\n turn.emitToolCall({\n toolCallId: body.requestId,\n toolName: tool.name,\n input: body.input,\n });\n let result: { output: unknown; isError?: boolean };\n try {\n result = await turn.requestToolResult(body.requestId);\n } catch (error) {\n turn.removeCorrelationInvocation({ token: correlationToken });\n throw error;\n }\n turn.emitToolResult({\n toolCallId: body.requestId,\n toolName: tool.name,\n output: result.output,\n ...(result.isError ? { isError: true } : {}),\n });\n return {\n output: result.output,\n ...(result.isError ? { isError: true } : {}),\n correlationToken,\n };\n}\n\nfunction waitForCatalogChange({\n state,\n}: {\n state: CatalogState;\n}): Promise<void> {\n let changeWaiter!: () => void;\n const change = new Promise<void>(resolve => {\n changeWaiter = resolve;\n state.changeWaiters.add(changeWaiter);\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<void>(resolve => {\n timer = setTimeout(resolve, 20_000);\n timer.unref?.();\n });\n return Promise.race([change, timeout]).finally(() => {\n state.changeWaiters.delete(changeWaiter);\n if (timer != null) clearTimeout(timer);\n });\n}\n\nfunction resolveCatalogChanges({ state }: { state: CatalogState }): void {\n for (const resolve of [...state.changeWaiters]) resolve();\n}\n\nfunction waitForCatalogRefresh({\n state,\n revision,\n timeoutMs,\n}: {\n state: CatalogState;\n revision: number;\n timeoutMs: number;\n}): Promise<boolean> {\n if (state.servedRevision >= revision) return Promise.resolve(true);\n if (state.closed) return Promise.resolve(false);\n let waiter!: {\n readonly revision: number;\n readonly resolve: (refreshed: boolean) => void;\n };\n const refresh = new Promise<boolean>(resolve => {\n waiter = {\n revision,\n resolve,\n };\n state.refreshWaiters.add(waiter);\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<boolean>(resolve => {\n timer = setTimeout(() => resolve(false), timeoutMs);\n timer.unref?.();\n });\n return Promise.race([refresh, timeout]).finally(() => {\n state.refreshWaiters.delete(waiter);\n if (timer != null) clearTimeout(timer);\n });\n}\n\nfunction resolveRefreshWaiters({\n state,\n closing,\n}: {\n state: CatalogState;\n closing: boolean;\n}): void {\n for (const waiter of [...state.refreshWaiters]) {\n if (closing || state.servedRevision >= waiter.revision) {\n waiter.resolve(!closing);\n }\n }\n}\n\nexport function catalogFingerprint({\n tools,\n}: {\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n}): string {\n return JSON.stringify(canonicalizeJSON({ value: tools }));\n}\n\nfunction canonicalizeJSON({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => canonicalizeJSON({ value: item }));\n }\n if (!isRecord(value)) return value;\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter(key => value[key] !== undefined)\n .map(key => [key, canonicalizeJSON({ value: value[key] })]),\n );\n}\n\nasync function readJSONBody({\n request,\n}: {\n request: IncomingMessage;\n}): Promise<unknown> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n size += buffer.length;\n if (size > 16 * 1024 * 1024) {\n throw new RelayRequestError({\n status: 413,\n message: 'Host tool relay request is too large.',\n });\n }\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString('utf8');\n try {\n return await new Response(text, {\n headers: { 'content-type': 'application/json' },\n }).json();\n } catch {\n throw new RelayRequestError({\n status: 400,\n message: 'Host tool relay request is not valid JSON.',\n });\n }\n}\n\nfunction credentialsMatch({\n expected,\n actual,\n}: {\n expected: string;\n actual: string | undefined;\n}): boolean {\n const expectedValue = Buffer.from(`Bearer ${expected}`);\n const actualValue = Buffer.from(actual ?? '');\n return (\n expectedValue.length === actualValue.length &&\n timingSafeEqual(expectedValue, actualValue)\n );\n}\n\nfunction listen({ server }: { server: Server }): Promise<void> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.off('error', reject);\n resolve();\n });\n });\n}\n\nfunction closeServer({ server }: { server: Server }): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close(error => {\n if (error == null) resolve();\n else reject(error);\n });\n });\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nclass RelayRequestError extends Error {\n readonly status: number;\n\n constructor({ status, message }: { status: number; message: string }) {\n super(message);\n this.name = 'HostToolRelayRequestError';\n this.status = status;\n }\n}\n","import type { HarnessV1BridgeToolWire } from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport type { HostToolRelay } from './host-tool-relay';\n\n/*\n * Some ACP agents start session MCP servers only after receiving the first\n * prompt. Starting that prompt before waiting lets those agents discover the\n * initial catalog, while the relay's revision checks still reject stale or\n * unknown tool invocations.\n */\nexport async function promptAndRefreshInitialHostToolCatalog({\n startPrompt,\n relay,\n tools,\n harnessId,\n timeoutMs,\n}: {\n startPrompt: () => Promise<unknown>;\n relay: Pick<HostToolRelay, 'updateCatalog' | 'waitForCatalogRefresh'>;\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n harnessId: string;\n timeoutMs: number;\n}): Promise<void> {\n void startPrompt();\n await refreshHostToolCatalog({\n relay,\n tools,\n harnessId,\n timeoutMs,\n });\n}\n\nexport async function refreshHostToolCatalog({\n relay,\n tools,\n harnessId,\n timeoutMs,\n}: {\n relay: Pick<HostToolRelay, 'updateCatalog' | 'waitForCatalogRefresh'>;\n tools: ReadonlyArray<HarnessV1BridgeToolWire>;\n harnessId: string;\n timeoutMs: number;\n}): Promise<void> {\n const catalog = relay.updateCatalog({ tools });\n if (!catalog.changed && tools.length === 0) return;\n if (\n await relay.waitForCatalogRefresh({\n revision: catalog.revision,\n timeoutMs,\n })\n ) {\n return;\n }\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'The ACP implementation did not load the active harness-owned MCP ' +\n `tool catalog to revision ${catalog.revision} before the next ` +\n 'prompt, so host tools cannot be exposed safely.',\n });\n}\n","import type { HarnessV1PermissionMode } from '@ai-sdk/harness';\nimport type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport type {\n RequestPermissionRequest,\n RequestPermissionResponse,\n ToolCallUpdate,\n} from '@agentclientprotocol/sdk';\n\ntype PendingPermission = {\n cancel(): void;\n};\n\nlet permissionRequestCounter = 0;\n\nexport function createACPPermissionController({\n turn,\n sessionId,\n permissionMode,\n hasPermissionModeMapping,\n emitToolCall,\n claimHostToolPermission,\n}: {\n turn: BridgeTurn;\n sessionId: string;\n permissionMode: HarnessV1PermissionMode;\n hasPermissionModeMapping: boolean;\n emitToolCall: (options: { toolCall: ToolCallUpdate }) => void;\n claimHostToolPermission: (options: { toolCall: ToolCallUpdate }) => boolean;\n}): {\n requestPermission(\n request: RequestPermissionRequest,\n ): Promise<RequestPermissionResponse>;\n cancelAll(): void;\n} {\n const pendingPermissions = new Map<string, PendingPermission>();\n\n return {\n async requestPermission(request) {\n if (request.sessionId !== sessionId) {\n turn.emitWarning({\n message:\n `ACP permission request for session ${JSON.stringify(request.sessionId)} was cancelled ` +\n `because the active session is ${JSON.stringify(sessionId)}.`,\n });\n return cancelled();\n }\n const allowOnce = request.options.find(\n option => option.kind === 'allow_once',\n );\n const rejectOnce = request.options.find(\n option => option.kind === 'reject_once',\n );\n if (allowOnce == null || rejectOnce == null) {\n const missing = [\n ...(allowOnce == null ? ['allow_once'] : []),\n ...(rejectOnce == null ? ['reject_once'] : []),\n ];\n turn.emitWarning({\n message:\n `ACP permission request for tool call ${JSON.stringify(request.toolCall.toolCallId)} ` +\n `was cancelled because it did not advertise ${missing.join(' and ')}.`,\n });\n return cancelled();\n }\n if (claimHostToolPermission({ toolCall: request.toolCall })) {\n return {\n outcome: {\n outcome: 'selected',\n optionId: allowOnce.optionId,\n },\n };\n }\n if (\n !hasPermissionModeMapping &&\n shouldAutoApprove({\n permissionMode,\n kind: request.toolCall.kind,\n })\n ) {\n return {\n outcome: {\n outcome: 'selected',\n optionId: allowOnce.optionId,\n },\n };\n }\n\n const approvalId = `acp-permission-${++permissionRequestCounter}`;\n let cancelPermission!: () => void;\n const cancellation = new Promise<undefined>(resolve => {\n cancelPermission = () => resolve(undefined);\n });\n pendingPermissions.set(approvalId, {\n cancel: cancelPermission,\n });\n const approval = turn.requestToolApproval(approvalId);\n emitToolCall({ toolCall: request.toolCall });\n turn.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: request.toolCall.toolCallId,\n });\n\n try {\n const response = await Promise.race([approval, cancellation]);\n if (response == null) return cancelled();\n return {\n outcome: {\n outcome: 'selected',\n optionId: response.approved\n ? allowOnce.optionId\n : rejectOnce.optionId,\n },\n };\n } finally {\n pendingPermissions.delete(approvalId);\n }\n },\n cancelAll() {\n for (const pending of pendingPermissions.values()) {\n pending.cancel();\n }\n pendingPermissions.clear();\n },\n };\n}\n\nfunction shouldAutoApprove({\n permissionMode,\n kind,\n}: {\n permissionMode: HarnessV1PermissionMode;\n kind: ToolCallUpdate['kind'];\n}): boolean {\n if (permissionMode === 'allow-all') return true;\n if (\n kind === 'read' ||\n kind === 'search' ||\n kind === 'think' ||\n kind === 'fetch'\n ) {\n return true;\n }\n return (\n permissionMode === 'allow-edits' &&\n (kind === 'edit' || kind === 'delete' || kind === 'move')\n );\n}\n\nfunction cancelled(): RequestPermissionResponse {\n return { outcome: { outcome: 'cancelled' } };\n}\n","import type { HarnessV1PermissionMode } from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type {\n ACPPermissionModeMapping,\n ACPPermissionModeTarget,\n} from '../acp-v1-settings';\n\nconst PERMISSION_MODES = [\n 'allow-reads',\n 'allow-edits',\n 'allow-all',\n] as const satisfies ReadonlyArray<HarnessV1PermissionMode>;\n\ntype ACPSessionConfiguration = Pick<\n acp.NewSessionResponse,\n 'modes' | 'configOptions'\n>;\n\nexport async function configureACPPermissionMode({\n agent,\n sessionId,\n sessionConfiguration,\n permissionModeMapping,\n permissionMode,\n harnessId,\n}: {\n agent: acp.ClientContext;\n sessionId: string;\n sessionConfiguration: ACPSessionConfiguration;\n permissionModeMapping: ACPPermissionModeMapping;\n permissionMode: HarnessV1PermissionMode;\n harnessId: string;\n}): Promise<void> {\n const target = permissionModeMapping[permissionMode];\n if (target == null) {\n throw unsupported({\n harnessId,\n message:\n `Permission mode ${JSON.stringify(permissionMode)} is not supported by this ACP harness.` +\n (permissionModeMapping['allow-all'] == null\n ? ''\n : ` Use permissionMode: 'allow-all'.`),\n });\n }\n\n for (const mappedPermissionMode of PERMISSION_MODES) {\n const mappedTarget = permissionModeMapping[mappedPermissionMode];\n if (mappedTarget != null) {\n validateTarget({\n target: mappedTarget,\n permissionMode: mappedPermissionMode,\n sessionConfiguration,\n harnessId,\n });\n }\n }\n\n if (target.type === 'session-mode') {\n await agent.request(acp.methods.agent.session.setMode, {\n sessionId,\n modeId: target.modeId,\n });\n return;\n }\n await agent.request(acp.methods.agent.session.setConfigOption, {\n sessionId,\n configId: target.configId,\n value: target.value,\n ...(typeof target.value === 'boolean' ? { type: 'boolean' as const } : {}),\n });\n}\n\nfunction validateTarget({\n target,\n permissionMode,\n sessionConfiguration,\n harnessId,\n}: {\n target: ACPPermissionModeTarget;\n permissionMode: HarnessV1PermissionMode;\n sessionConfiguration: ACPSessionConfiguration;\n harnessId: string;\n}): void {\n if (target.type === 'session-mode') {\n const availableModeIds =\n sessionConfiguration.modes?.availableModes.map(mode => mode.id) ?? [];\n if (!availableModeIds.includes(target.modeId)) {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires session mode ` +\n `${JSON.stringify(target.modeId)}, but the agent advertised ` +\n `${formatChoices({ values: availableModeIds })}.`,\n });\n }\n return;\n }\n\n const configOption = sessionConfiguration.configOptions?.find(\n option => option.id === target.configId,\n );\n if (configOption == null) {\n const availableConfigIds =\n sessionConfiguration.configOptions?.map(option => option.id) ?? [];\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires session configuration ` +\n `${JSON.stringify(target.configId)}, but the agent advertised ` +\n `${formatChoices({ values: availableConfigIds })}.`,\n });\n }\n if (configOption.type === 'boolean') {\n if (typeof target.value !== 'boolean') {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} assigns string value ` +\n `${JSON.stringify(target.value)} to boolean session configuration ${JSON.stringify(target.configId)}.`,\n });\n }\n return;\n }\n if (typeof target.value !== 'string') {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} assigns boolean value ` +\n `${JSON.stringify(target.value)} to select session configuration ${JSON.stringify(target.configId)}.`,\n });\n }\n const availableValues = configOption.options.flatMap(option =>\n 'options' in option\n ? option.options.map(value => value.value)\n : [option.value],\n );\n if (!availableValues.includes(target.value)) {\n throw unsupported({\n harnessId,\n message:\n `ACP permission mapping for ${JSON.stringify(permissionMode)} requires value ` +\n `${JSON.stringify(target.value)} for session configuration ${JSON.stringify(target.configId)}, ` +\n `but the agent advertised ${formatChoices({ values: availableValues })}.`,\n });\n }\n}\n\nfunction formatChoices({ values }: { values: ReadonlyArray<string> }): string {\n return values.length === 0\n ? 'no matching choices'\n : values.map(value => JSON.stringify(value)).join(', ');\n}\n\nfunction unsupported({\n harnessId,\n message,\n}: {\n harnessId: string;\n message: string;\n}): HarnessBridgeCapabilityUnsupportedError {\n return new HarnessBridgeCapabilityUnsupportedError({ harnessId, message });\n}\n","import * as acp from '@agentclientprotocol/sdk';\nimport type { ACPModelMapping } from '../acp-v1-settings';\n\nexport async function configureACPModel({\n agent,\n sessionId,\n model,\n mapping,\n}: {\n agent: acp.ClientContext;\n sessionId: string;\n model: string | undefined;\n mapping: ACPModelMapping | undefined;\n}): Promise<void> {\n if (model == null) return;\n if (mapping == null) {\n throw new Error('ACP model mapping is required when a model is set.');\n }\n /*\n * Some ACP harnesses, including Grok Build, use the non-standard\n * `session/set_model` convention.\n */\n if (mapping.type === 'session-model') {\n await agent.request('session/set_model', {\n sessionId,\n [mapping.path]: model,\n });\n return;\n }\n await agent.request(acp.methods.agent.session.setConfigOption, {\n sessionId,\n configId: mapping.path,\n value: model,\n });\n}\n","import { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type { ACPInitializeResult } from './protocol-configuration';\n\nexport type ACPActiveSession = {\n readonly sessionId: string;\n readonly newSessionResponse: acp.NewSessionResponse;\n prompt(prompt: Array<acp.ContentBlock>): Promise<acp.PromptResponse>;\n promptWithMeta?(options: {\n prompt: Array<acp.ContentBlock>;\n meta: Record<string, unknown>;\n }): Promise<acp.PromptResponse>;\n nextUpdate(): Promise<acp.ActiveSessionMessage>;\n dispose(): void;\n};\n\nexport function assertACPResumeCapability({\n initialization,\n harnessId,\n}: {\n initialization: ACPInitializeResult;\n harnessId: string;\n}): void {\n const sessionCapabilities = initialization.agentCapabilities\n ?.sessionCapabilities as Readonly<Record<string, unknown>> | undefined;\n if (\n sessionCapabilities?.resume == null ||\n sessionCapabilities.resume === false\n ) {\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'ACP process-loss rerun requires the agent to advertise sessionCapabilities.resume; a fresh unrelated ACP session will not be created.',\n });\n }\n}\n\nexport function createACPRecoveredSession({\n agent,\n sessionId,\n restorationResponse,\n updates,\n}: {\n agent: acp.ClientContext;\n sessionId: string;\n restorationResponse: acp.ResumeSessionResponse | acp.LoadSessionResponse;\n updates: ReturnType<typeof createACPRecoveredSessionUpdates>;\n}): ACPActiveSession {\n let disposed = false;\n return {\n sessionId,\n newSessionResponse: {\n sessionId,\n ...restorationResponse,\n },\n prompt: async prompt => {\n if (disposed) {\n throw new Error('Recovered ACP session is disposed.');\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n { sessionId, prompt },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n },\n promptWithMeta: async ({ prompt, meta }) => {\n if (disposed) {\n throw new Error('Recovered ACP session is disposed.');\n }\n updates.clearErrors();\n const response = agent.request<acp.PromptResponse, acp.PromptRequest>(\n acp.methods.agent.session.prompt,\n { sessionId, prompt, _meta: meta },\n );\n void response.then(\n value => {\n updates.enqueue({\n kind: 'stop',\n response: value,\n stopReason: value.stopReason,\n });\n },\n error => updates.reject(error),\n );\n return response;\n },\n nextUpdate: () => updates.next(),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n updates.fail(new Error('Recovered ACP session disposed.'));\n },\n };\n}\n\nexport function createACPRecoveredSessionUpdates(): {\n enqueue(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n clearErrors(): void;\n fail(error: unknown): void;\n next(): Promise<acp.ActiveSessionMessage>;\n} {\n type Entry =\n | { readonly type: 'value'; readonly value: acp.ActiveSessionMessage }\n | { readonly type: 'error'; readonly error: unknown };\n const values: Entry[] = [];\n const waiters: Array<{\n resolve(value: acp.ActiveSessionMessage): void;\n reject(error: unknown): void;\n }> = [];\n let failure: unknown;\n let failed = false;\n return {\n enqueue(value) {\n if (failed) return;\n const waiter = waiters.shift();\n if (waiter == null) values.push({ type: 'value', value });\n else waiter.resolve(value);\n },\n reject(error) {\n if (failed) return;\n const waiter = waiters.shift();\n if (waiter == null) values.push({ type: 'error', error });\n else waiter.reject(error);\n },\n clearErrors() {\n for (let index = values.length - 1; index >= 0; index--) {\n if (values[index]?.type === 'error') values.splice(index, 1);\n }\n },\n fail(error) {\n if (failed) return;\n failed = true;\n failure = error;\n for (const waiter of waiters.splice(0)) waiter.reject(error);\n },\n next() {\n const entry = values.shift();\n if (entry?.type === 'value') return Promise.resolve(entry.value);\n if (entry?.type === 'error') {\n return Promise.reject(\n entry.error instanceof Error\n ? entry.error\n : new Error('Recovered ACP session update failed.'),\n );\n }\n if (failed) {\n return Promise.reject(\n failure instanceof Error\n ? failure\n : new Error('Recovered ACP session update stream failed.'),\n );\n }\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n };\n}\n","import { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport * as acp from '@agentclientprotocol/sdk';\nimport type { ACPInitializeResult } from './protocol-configuration';\n\nexport type ACPSessionRestorationMethod = 'resume' | 'load';\n\nexport function resolveACPSessionRestorationMethod({\n initialization,\n harnessId,\n}: {\n initialization: ACPInitializeResult;\n harnessId: string;\n}): ACPSessionRestorationMethod {\n const sessionCapabilities = initialization.agentCapabilities\n ?.sessionCapabilities as Readonly<Record<string, unknown>> | undefined;\n if (\n sessionCapabilities?.resume != null &&\n sessionCapabilities.resume !== false\n ) {\n return 'resume';\n }\n if (initialization.agentCapabilities?.loadSession === true) {\n return 'load';\n }\n throw new HarnessBridgeCapabilityUnsupportedError({\n harnessId,\n message:\n 'Cold ACP session restoration requires the agent to advertise sessionCapabilities.resume or loadSession; a fresh unrelated ACP session will not be created.',\n });\n}\n\nexport async function restoreACPBridgeSession({\n agent,\n initialization,\n sessionId,\n cwd,\n mcpServers,\n meta,\n harnessId,\n setHistoricalUpdatesSuppressed,\n discardCapturedHistory,\n}: {\n agent: acp.ClientContext;\n initialization: ACPInitializeResult;\n sessionId: string;\n cwd: string;\n mcpServers: ReadonlyArray<acp.McpServer>;\n meta: Readonly<Record<string, unknown>> | undefined;\n harnessId: string;\n setHistoricalUpdatesSuppressed(options: { suppressed: boolean }): void;\n discardCapturedHistory(): void;\n}): Promise<{\n method: ACPSessionRestorationMethod;\n response: acp.ResumeSessionResponse | acp.LoadSessionResponse;\n}> {\n const method = resolveACPSessionRestorationMethod({\n initialization,\n harnessId,\n });\n setHistoricalUpdatesSuppressed({ suppressed: true });\n try {\n const request = {\n sessionId,\n cwd,\n mcpServers: [...mcpServers],\n ...(meta == null ? {} : { _meta: meta }),\n };\n const response =\n method === 'resume'\n ? await agent.request<\n acp.ResumeSessionResponse,\n acp.ResumeSessionRequest\n >(acp.methods.agent.session.resume, request)\n : await agent.request<acp.LoadSessionResponse, acp.LoadSessionRequest>(\n acp.methods.agent.session.load,\n request,\n );\n discardCapturedHistory();\n return { method, response };\n } finally {\n setHistoricalUpdatesSuppressed({ suppressed: false });\n }\n}\n"],"mappings":"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","names":["bridgeType","bridgeStateDir","acp","writeFile","isRecord","getStringProperty","name","child","isRecord","result","name","isRecord","z","serializableRecordSchema","isRecord","isRecord","canonicalizeJSON","acp","acp","acp","unknownUsage","writeFile","name","isRecord","implementationDir","child","session","args"]}
|