@ai-sdk/harness-claude-code 1.0.71 → 1.0.73

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ai-sdk/harness-claude-code
2
2
 
3
+ ## 1.0.73
4
+
5
+ ### Patch Changes
6
+
7
+ - 616730a: fix(harness): fix missing reasoning controls
8
+
9
+ ## 1.0.72
10
+
11
+ ### Patch Changes
12
+
13
+ - @ai-sdk/harness@1.0.70
14
+
3
15
  ## 1.0.71
4
16
 
5
17
  ### Patch Changes
@@ -1135,6 +1135,7 @@ async function runTurn(start, turn) {
1135
1135
  ...inactiveNativeTools.length > 0 ? { disallowedTools: inactiveNativeTools } : {},
1136
1136
  systemPrompt: createClaudeCodeSystemPrompt(start.instructions),
1137
1137
  thinking: start.thinking,
1138
+ ...start.effort !== void 0 ? { effort: start.effort } : {},
1138
1139
  includePartialMessages: true,
1139
1140
  // The `PostCompact` hook carries the compaction summary, which the
1140
1141
  // `compact_boundary` system message does not. Latch it for the unified
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/bridge/compaction-latch.ts","../../src/bridge/index.ts","../../src/bridge/claude-code-system-prompt.ts","../../src/bridge/claude-skills-option.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/json-schema-to-zod.ts","../../src/bridge/tool-filtering.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, single-flight connection\n// replacement, the in-memory event log + monotonic `seq`, resume replay, and\n// the lifecycle/meta files. The adapter supplies only `onStart` (drive its\n// CLI/SDK and translate to wire events) and lifecycle-specific cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\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\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 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 /**\n * Live queue of mid-turn user messages. The runtime pushes inbound\n * `user-message` text here; the adapter drains it as its runtime accepts\n * interactive input.\n */\n readonly pendingUserMessages: string[];\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'; 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 let activeSocket: WebSocket | undefined;\n let activeSocketReadyForLiveEvents = false;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: string[] | 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 sendControl = (msg: Record<string, unknown>): void => {\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(JSON.stringify(msg));\n } catch {\n // best-effort\n }\n }\n };\n\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 (\n activeSocketReadyForLiveEvents &&\n activeSocket?.readyState === WS_OPEN\n ) {\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 if (activeSocket !== ws) return;\n activeSocketReadyForLiveEvents = true;\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 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 pendingUserMessages: [],\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 = turn.pendingUserMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\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 currentUserMessages?.push(msg.text);\n return;\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n if (activeSocket !== ws) return;\n replay(ws, msg.lastSeenEventId);\n activeSocketReadyForLiveEvents = true;\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({ 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 // Single-flight: a fresh authorized connection *replaces* the active one\n // (the host reconnecting after a drop). The previous socket's close is a\n // no-op below because it is no longer `activeSocket`.\n activeSocket = ws;\n activeSocketReadyForLiveEvents = false;\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({\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\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({\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 *current* socket's close matters. A stale socket (already\n // replaced by a reconnect) closing is a no-op. Crucially we do NOT abort\n // the in-flight turn — it keeps running and its events accumulate in the\n // log for replay when the host reconnects.\n if (activeSocket === ws) {\n activeSocket = undefined;\n activeSocketReadyForLiveEvents = false;\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\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","/*\n * Claude reports a compaction in two pieces whose arrival order is not\n * guaranteed: the `compact_boundary` system message (trigger + token counts)\n * and the `PostCompact` hook (the summary text). The harness `compaction`\n * event needs fields from both, so this latch holds each half and emits a\n * single merged event once both have arrived, then resets for the next\n * compaction in the same turn.\n */\n\nexport type CompactionBoundary = {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionEvent = {\n type: 'compaction';\n trigger: 'manual' | 'auto';\n summary: string;\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionLatch = {\n onBoundary(boundary: CompactionBoundary): void;\n onSummary(summary: string): void;\n};\n\nexport function createCompactionLatch(\n emit: (event: CompactionEvent) => void,\n): CompactionLatch {\n let boundary: CompactionBoundary | undefined;\n let summary: string | undefined;\n\n const tryEmit = (): void => {\n if (!boundary || summary === undefined) return;\n emit({\n type: 'compaction',\n trigger: boundary.trigger,\n summary,\n ...(boundary.tokensBefore !== undefined\n ? { tokensBefore: boundary.tokensBefore }\n : {}),\n ...(boundary.tokensAfter !== undefined\n ? { tokensAfter: boundary.tokensAfter }\n : {}),\n });\n boundary = undefined;\n summary = undefined;\n };\n\n return {\n onBoundary(next) {\n boundary = next;\n tryEmit();\n },\n onSummary(next) {\n summary = next;\n tryEmit();\n },\n };\n}\n","// Long-running bridge that runs inside a sandbox alongside the `claude` CLI.\n// The generic transport — WebSocket server, token auth, single-flight\n// reconnect, the in-memory event log + `seq`, resume replay, and the\n// lifecycle/meta files — lives in the shared `@ai-sdk/harness/bridge` runtime.\n// This file supplies only the Claude-specific turn driver.\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { createCompactionLatch } from './compaction-latch';\nimport type { StartMessage } from '../claude-code-bridge-protocol';\nimport { randomUUID } from 'node:crypto';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\n/*\n * CONSTRAINT — the third-party imports below are NEVER bundled into the\n * compiled `bridge/index.mjs`. They are declared `external` in\n * tsup.config.ts and resolved at runtime from the node_modules that this\n * bridge installs *inside the sandbox* from `src/bridge/package.json` (and\n * its pinned `pnpm-lock.yaml`). That bridge package.json — NOT this host\n * package — is the single source of truth for these packages and their\n * versions; the published `@ai-sdk/harness-claude-code` package does not\n * provide them at runtime.\n *\n * When adding or changing a third-party import here you MUST keep all three\n * in sync, or the bridge will either get the dependency bundled in or fail\n * to resolve it in the sandbox:\n * 1. the import statement below,\n * 2. the `external` array in tsup.config.ts, and\n * 3. the dependency entry in `src/bridge/package.json`.\n */\nimport * as claudeAgentSdk from '@anthropic-ai/claude-agent-sdk';\nimport * as mcpServerModule from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createClaudeCodeSystemPrompt } from './claude-code-system-prompt';\nimport { toClaudeSkillsOption } from './claude-skills-option';\nimport {\n createClaudeStreamEventState,\n createEmitStreamEvent,\n defaultUsage,\n emitFinishStep,\n finishApprovalStep,\n mapUsage,\n type ClaudeMessage,\n} from './create-emit-stream-event';\nimport { jsonSchemaToZodShape } from './json-schema-to-zod';\nimport {\n resolveInactiveNativeTools,\n resolveNativeTools,\n} from './tool-filtering';\n\n/*\n * Native Claude Code tool name → cross-harness common name. Tools outside this\n * map (e.g. `WebFetch`, `NotebookEdit`) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'webSearch';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n Bash: 'bash',\n Glob: 'glob',\n Grep: 'grep',\n WebSearch: 'webSearch',\n};\n\nconst NATIVE_TOOL_KINDS: Readonly<\n Record<string, 'readonly' | 'edit' | 'bash'>\n> = {\n Read: 'readonly',\n Glob: 'readonly',\n Grep: 'readonly',\n WebSearch: 'readonly',\n WebFetch: 'readonly',\n TaskGet: 'readonly',\n TaskList: 'readonly',\n TaskOutput: 'readonly',\n ListMcpResources: 'readonly',\n ReadMcpResource: 'readonly',\n Write: 'edit',\n Edit: 'edit',\n NotebookEdit: 'edit',\n TodoWrite: 'edit',\n TaskCreate: 'edit',\n TaskUpdate: 'edit',\n TaskStop: 'edit',\n EnterWorktree: 'edit',\n ExitWorktree: 'edit',\n ExitPlanMode: 'edit',\n Skill: 'readonly',\n AskUserQuestion: 'readonly',\n ToolSearch: 'readonly',\n Bash: 'bash',\n Monitor: 'bash',\n};\n\nfunction toCommonName(nativeName: string): CommonBuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir;\nconst bridgeStateDir = args.bridgeStateDir;\nif (!workdir) {\n emitFatal('Missing --workdir argument.');\n}\nif (!bridgeStateDir) {\n emitFatal('Missing --bridge-state-dir argument.');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst claudeSdk = claudeAgentSdk as any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst mcpModule = mcpServerModule as any;\n\nawait runBridge<StartMessage>({\n bridgeType: 'claude-code',\n bridgeStateDir,\n onStart: runTurn,\n // Claude Code's session state lives in the workdir on the sandbox filesystem\n // (captured by the sandbox snapshot on stop); the resume payload is empty.\n onStop: () => ({}),\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nfunction createPermissionOptions(input: {\n start: StartMessage;\n inactiveNativeTools: readonly string[];\n turn: BridgeTurn;\n emit: Emit;\n finishApprovalStep: (approvalId: string) => void;\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n}): Record<string, unknown> {\n const permissionMode = input.start.permissionMode ?? 'allow-all';\n const inactiveNativeTools = new Set(input.inactiveNativeTools);\n const permissionSettings = createPermissionSettings({\n permissionMode,\n inactiveNativeTools,\n });\n if (permissionMode === 'allow-all' && inactiveNativeTools.size === 0) {\n return {\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n };\n }\n\n return {\n permissionMode:\n permissionMode === 'allow-edits' ? 'acceptEdits' : 'default',\n allowDangerouslySkipPermissions: false,\n ...(permissionSettings ? { settings: permissionSettings } : {}),\n canUseTool: async (\n toolName: string,\n toolInput: Record<string, unknown>,\n options: { toolUseID: string },\n ) => {\n if (toolName.startsWith('mcp__harness-tools__')) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n if (\n !inactiveNativeTools.has(toolName) &&\n !nativeToolRequiresApproval({\n nativeName: toolName,\n permissionMode,\n })\n ) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n\n const approvalId = options.toolUseID;\n input.approvalRequestedToolUseIds.add(approvalId);\n input.nativeToolCallNames.set(approvalId, toolName);\n input.emit({\n type: 'tool-call',\n toolCallId: approvalId,\n toolName: toCommonName(toolName),\n nativeName: toolName,\n input: JSON.stringify(toolInput ?? {}),\n providerExecuted: true,\n });\n input.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: approvalId,\n });\n input.finishApprovalStep(approvalId);\n\n const decision = await input.turn.requestToolApproval(approvalId);\n return decision.approved\n ? { behavior: 'allow', updatedInput: toolInput, toolUseID: approvalId }\n : {\n behavior: 'deny',\n message: decision.reason ?? 'Denied',\n toolUseID: approvalId,\n };\n },\n };\n}\n\nfunction createPermissionSettings(input: {\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n inactiveNativeTools: ReadonlySet<string>;\n}): Record<string, unknown> | undefined {\n const askRules = new Set<string>();\n for (const [nativeName, kind] of Object.entries(NATIVE_TOOL_KINDS)) {\n if (\n input.inactiveNativeTools.has(nativeName) ||\n (input.permissionMode === 'allow-reads'\n ? kind === 'edit' || kind === 'bash'\n : input.permissionMode === 'allow-edits'\n ? kind === 'bash'\n : false)\n ) {\n askRules.add(`${nativeName}(*)`);\n }\n }\n\n if (askRules.size === 0) return undefined;\n\n return {\n permissions: { ask: [...askRules] },\n sandbox: { autoAllowBashIfSandboxed: false },\n };\n}\n\nfunction nativeToolRequiresApproval(input: {\n nativeName: string;\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n}): boolean {\n if (input.permissionMode === 'allow-all') return false;\n const kind = NATIVE_TOOL_KINDS[input.nativeName] ?? 'edit';\n if (input.permissionMode === 'allow-edits') return kind === 'bash';\n return kind === 'edit' || kind === 'bash';\n}\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n // Local controller for the Claude query. Aborted either by the host (via the\n // shared runtime's `turn.abortSignal`) or by us on a terminal error.\n const abortCtl = new AbortController();\n if (turn.abortSignal.aborted) {\n abortCtl.abort();\n } else {\n turn.abortSignal.addEventListener('abort', () => abortCtl.abort(), {\n once: true,\n });\n }\n\n const streamEventState = createClaudeStreamEventState();\n\n const mcpServers: Record<string, unknown> = { ...(start.mcpServers ?? {}) };\n if (start.tools && start.tools.length > 0) {\n const server = new mcpModule.McpServer({\n name: 'harness-tools',\n version: '1.0.0',\n });\n for (const tool of start.tools) {\n const shape = jsonSchemaToZodShape(tool.inputSchema);\n server.tool(\n tool.name,\n tool.description ?? '',\n shape,\n async (input: Record<string, unknown>) => {\n const toolCallId = randomUUID();\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: tool.name,\n input: JSON.stringify(input),\n providerExecuted: false,\n });\n const { output, isError } = await turn.requestToolResult(toolCallId);\n emit({\n type: 'tool-result',\n toolCallId,\n toolName: tool.name,\n result: output ?? null,\n isError: !!isError,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(output ?? null) }],\n isError,\n };\n },\n );\n }\n mcpServers['harness-tools'] = {\n type: 'sdk',\n name: 'harness-tools',\n instance: server,\n };\n }\n\n // Compaction observation: merge Claude's `compact_boundary` message and\n // `PostCompact` hook (which arrive in either order) into one `compaction`\n // event. See `createCompactionLatch`.\n const compaction = createCompactionLatch(event => emit(event));\n\n // `stream-start` is emitted lazily on the first SDK message (below) so it can\n // carry the model the CLI resolved to, reported on the `system`/`init` message.\n\n const queryInput = createQueryInput({\n initialUserMessage: start.prompt,\n pendingUserMessages: turn.pendingUserMessages,\n abortSignal: abortCtl.signal,\n });\n const skillsOption = toClaudeSkillsOption(start.skills);\n const nativeTools = resolveNativeTools(start.builtinToolFiltering);\n const inactiveNativeTools = resolveInactiveNativeTools(\n start.builtinToolFiltering,\n );\n const permissionOptions = createPermissionOptions({\n start,\n inactiveNativeTools,\n turn,\n emit,\n finishApprovalStep: approvalId => {\n finishApprovalStep({ state: streamEventState, emit, approvalId });\n },\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds,\n });\n\n const q = claudeSdk.query({\n prompt: queryInput.input,\n options: {\n ...(start.model ? { model: start.model } : {}),\n ...(start.maxTurns !== undefined ? { maxTurns: start.maxTurns } : {}),\n ...(start.env !== undefined ? { env: { ...procEnv, ...start.env } } : {}),\n ...(skillsOption ? { skills: skillsOption } : {}),\n ...(nativeTools !== undefined ? { tools: nativeTools } : {}),\n ...(inactiveNativeTools.length > 0\n ? { disallowedTools: inactiveNativeTools }\n : {}),\n systemPrompt: createClaudeCodeSystemPrompt(start.instructions),\n thinking: start.thinking,\n includePartialMessages: true,\n // The `PostCompact` hook carries the compaction summary, which the\n // `compact_boundary` system message does not. Latch it for the unified\n // `compaction` event; return an empty output so compaction proceeds.\n hooks: {\n PostCompact: [\n {\n hooks: [\n async (input: { compact_summary?: unknown }) => {\n if (typeof input?.compact_summary === 'string') {\n compaction.onSummary(input.compact_summary);\n }\n return {};\n },\n ],\n },\n ],\n },\n // Continuation rule: the host can force-continue (resume after a\n // cross-process detach) by setting `start.continue: true`; otherwise\n // we continue every subsequent turn after the first one in this\n // bridge process.\n ...(start.continue === true || !turn.firstTurn ? { continue: true } : {}),\n ...permissionOptions,\n mcpServers,\n cwd: workdir,\n abortSignal: abortCtl.signal,\n },\n });\n let turnUsage: Record<string, unknown> | undefined;\n let totalCostUsd: number | undefined;\n let emittedTerminalError = false;\n let emittedTerminalFinish = false;\n\n const emitTerminalError = (message: string | undefined): void => {\n const normalized = message?.trim();\n if (!normalized || emittedTerminalError || emittedTerminalFinish) return;\n streamEventState.observedTerminalError = normalized;\n emittedTerminalError = true;\n turn.emitError({\n error: normalized,\n message: 'claude-code terminal error',\n });\n queryInput.close();\n abortCtl.abort();\n };\n\n const emitStreamEvent = createEmitStreamEvent({\n state: streamEventState,\n emit,\n emitWarning: turn.emitWarning,\n emitTerminalError,\n onCompactionBoundary: boundary => compaction.onBoundary(boundary),\n toCommonName,\n });\n\n try {\n for await (const msg of q as AsyncIterable<ClaudeMessage>) {\n if (abortCtl.signal.aborted) break;\n\n const type = msg.type;\n\n emitStreamEvent(msg);\n\n if (type === 'result') {\n if (msg.subtype === 'success') {\n const emptyResult = !msg.result?.trim?.();\n if (emptyResult && streamEventState.observedTerminalError) {\n emitTerminalError(streamEventState.observedTerminalError);\n continue;\n }\n const usage = msg.usage ?? msg.message?.usage;\n const harnessUsage = mapUsage(usage);\n if (harnessUsage) turnUsage = harnessUsage;\n if (typeof msg.total_cost_usd === 'number') {\n totalCostUsd = (totalCostUsd ?? 0) + msg.total_cost_usd;\n }\n if (streamEventState.stepOpen) {\n emitFinishStep({\n state: streamEventState,\n emit,\n usage: harnessUsage ?? streamEventState.pendingStepUsage,\n });\n }\n queryInput.close();\n break;\n } else {\n emitTerminalError(\n (Array.isArray(msg.errors) ? msg.errors.join('\\n') : undefined) ||\n streamEventState.observedTerminalError ||\n msg.result ||\n 'Unknown error',\n );\n }\n continue;\n }\n }\n } catch (err) {\n if (!(abortCtl.signal.aborted && emittedTerminalError)) {\n turn.emitError({ error: err, message: 'claude-code turn failed' });\n }\n return;\n } finally {\n queryInput.close();\n }\n\n if (emittedTerminalError) return;\n emittedTerminalFinish = true;\n void emittedTerminalFinish;\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage ?? streamEventState.stepUsage ?? defaultUsage(),\n ...(totalCostUsd !== undefined\n ? { harnessMetadata: { 'claude-code': { costUsd: totalCostUsd } } }\n : {}),\n });\n}\n\nfunction createQueryInput({\n initialUserMessage,\n pendingUserMessages,\n abortSignal,\n}: {\n initialUserMessage: string;\n pendingUserMessages: string[];\n abortSignal: AbortSignal;\n}): {\n input: AsyncIterable<unknown>;\n close(): void;\n} {\n let closed = false;\n const close = (): void => {\n closed = true;\n };\n if (abortSignal.aborted) {\n close();\n } else {\n abortSignal.addEventListener('abort', close, { once: true });\n }\n\n const toUserMessage = (text: string): unknown => ({\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text }],\n },\n });\n\n return {\n close,\n input: {\n [Symbol.asyncIterator]() {\n let sentInitial = false;\n return {\n async next() {\n // eslint-disable-next-line no-unmodified-loop-condition\n while (!closed && !abortSignal.aborted) {\n if (!sentInitial) {\n sentInitial = true;\n return {\n value: toUserMessage(initialUserMessage),\n done: false,\n };\n }\n if (pendingUserMessages.length > 0) {\n return {\n value: toUserMessage(pendingUserMessages.shift()!),\n done: false,\n };\n }\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n return { value: undefined, done: true } as IteratorResult<unknown>;\n },\n };\n },\n },\n };\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: { workdir?: string; bridgeStateDir?: string } = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--workdir' && i + 1 < args.length) {\n out.workdir = args[++i];\n } else if (args[i] === '--bridge-state-dir' && i + 1 < args.length) {\n out.bridgeStateDir = args[++i];\n }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n","export function createClaudeCodeSystemPrompt(instructions?: string): {\n type: 'preset';\n preset: 'claude_code';\n append?: string;\n} {\n return {\n type: 'preset',\n preset: 'claude_code',\n ...(instructions ? { append: instructions } : {}),\n };\n}\n","export function toClaudeSkillsOption(\n skills: ReadonlyArray<string> | undefined,\n): 'all' | undefined {\n /*\n * The Claude Agent SDK treats `skills: string[]` as an allowlist, which hides\n * built-in/default skills. When the harness writes project skills, ask Claude\n * to enable every discovered skill so bundled defaults and project skills are\n * both visible.\n */\n return skills && skills.length > 0 ? 'all' : undefined;\n}\n","import { randomUUID } from 'node:crypto';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type ClaudeMessage = {\n type?: string;\n subtype?: string;\n parent_tool_use_id?: string | null;\n model?: string;\n error?: string;\n error_status?: number | null;\n attempt?: number;\n max_retries?: number;\n retry_delay_ms?: number;\n patch?: { status?: string; error?: string };\n compact_metadata?: {\n trigger: 'manual' | 'auto';\n pre_tokens?: number;\n post_tokens?: number;\n };\n event?: {\n type?: string;\n index?: number;\n content_block?: { type?: string };\n delta?: { type?: string; text?: string; thinking?: string };\n };\n message?: {\n content?: ReadonlyArray<MessageBlock>;\n usage?: Record<string, unknown>;\n };\n result?: string;\n errors?: ReadonlyArray<string>;\n usage?: Record<string, unknown>;\n total_cost_usd?: number;\n};\n\ntype MessageBlock = {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n};\n\nexport type ClaudeStreamEventState = {\n /*\n * Map of native tool-use id → tool name. Claude assistant messages emit\n * `tool_use` blocks with both `id` and `name`; the matching `tool_result`\n * block on a later user message carries only `tool_use_id`, so without this\n * map the tool-result event would have to emit `toolName: 'unknown'`.\n */\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n partialBlocks: Map<number, { id: string; kind: 'text' | 'thinking' }>;\n stepUsage: Record<string, unknown> | undefined;\n pendingStepToolUseIds: Set<string>;\n pendingStepUsage: Record<string, unknown> | undefined;\n stepOpen: boolean;\n /*\n * Tool-use ids that originated from the MCP server hosting user-supplied\n * tools. The MCP handler emits its own `tool-call`/`tool-result` pair with\n * the user-facing tool name and a synthetic id, so the duplicate\n * `tool_result` block Claude reports for the underlying native id must be\n * suppressed.\n */\n mcpToolUseIds: Set<string>;\n externalMcpToolUseIds: Set<string>;\n observedTerminalError: string | undefined;\n};\n\nexport function createClaudeStreamEventState(): ClaudeStreamEventState {\n return {\n nativeToolCallNames: new Map(),\n approvalRequestedToolUseIds: new Set(),\n partialBlocks: new Map(),\n stepUsage: undefined,\n pendingStepToolUseIds: new Set(),\n pendingStepUsage: undefined,\n stepOpen: false,\n mcpToolUseIds: new Set(),\n externalMcpToolUseIds: new Set(),\n observedTerminalError: undefined,\n };\n}\n\nconst UNRECOVERABLE_API_RETRY_STATUSES = new Set([401, 403, 404]);\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitTerminalError,\n onCompactionBoundary,\n toCommonName,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n emitWarning: (warning: { message: string }) => void;\n emitTerminalError: (message: string | undefined) => void;\n onCompactionBoundary: (boundary: {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n }) => void;\n toCommonName: (nativeName: string) => string;\n}): (event: ClaudeMessage) => void {\n let streamStarted = false;\n\n return msg => {\n const type = msg.type;\n\n // Emit `stream-start` once, on the first message, carrying the model the\n // CLI resolved to (the `system`/`init` message reports it — this is the\n // default model when none was configured).\n if (!streamStarted) {\n const initModel =\n type === 'system' &&\n msg.subtype === 'init' &&\n typeof (msg as { model?: unknown }).model === 'string'\n ? (msg as { model: string }).model\n : undefined;\n emit({\n type: 'stream-start',\n ...(initModel ? { modelId: initModel } : {}),\n });\n streamStarted = true;\n }\n\n if (type === 'system' && msg.subtype === 'api_retry') {\n if (\n typeof msg.error_status === 'number' &&\n UNRECOVERABLE_API_RETRY_STATUSES.has(msg.error_status)\n ) {\n emitTerminalError(\n `HTTP ${msg.error_status}: ${msg.error ?? 'provider request failed'}`,\n );\n return;\n }\n\n emitWarning({ message: formatApiRetryWarning(msg) });\n return;\n }\n\n if (typeof msg.error === 'string' && msg.error.trim()) {\n state.observedTerminalError = msg.error.trim();\n }\n\n if (\n type === 'auth_status' &&\n typeof msg.error === 'string' &&\n msg.error.trim()\n ) {\n emitTerminalError(msg.error);\n return;\n }\n\n if (\n type === 'system' &&\n msg.subtype === 'task_updated' &&\n msg.patch?.status === 'failed' &&\n typeof msg.patch.error === 'string'\n ) {\n emitTerminalError(msg.patch.error);\n return;\n }\n\n if (type === 'system' && msg.subtype === 'compact_boundary') {\n const meta = msg.compact_metadata;\n if (meta) {\n onCompactionBoundary({\n trigger: meta.trigger,\n ...(typeof meta.pre_tokens === 'number'\n ? { tokensBefore: meta.pre_tokens }\n : {}),\n ...(typeof meta.post_tokens === 'number'\n ? { tokensAfter: meta.post_tokens }\n : {}),\n });\n }\n return;\n }\n\n // Messages emitted by a Task-tool subagent carry the parent tool-use id.\n // They belong to the subagent stream and must not affect the parent step,\n // including partial stream events that arrive before assistant messages.\n if (msg.parent_tool_use_id != null) {\n return;\n }\n\n if (type === 'stream_event') {\n handleStreamEvent(msg.event, state.partialBlocks, emit);\n return;\n }\n\n if (type === 'assistant' && msg.message?.content) {\n const usage = mapUsage(msg.message.usage);\n const toolUseIds: string[] = [];\n let opensStep = false;\n for (const block of msg.message.content) {\n if (\n block.type === 'tool_use' &&\n typeof block.id === 'string' &&\n typeof block.name === 'string'\n ) {\n toolUseIds.push(block.id);\n const mcpPrefix = 'mcp__harness-tools__';\n if (block.name.startsWith(mcpPrefix)) {\n state.pendingStepToolUseIds.add(block.id);\n state.mcpToolUseIds.add(block.id);\n opensStep = true;\n continue;\n }\n state.nativeToolCallNames.set(block.id, block.name);\n const dynamic = block.name.startsWith('mcp__');\n if (dynamic) state.externalMcpToolUseIds.add(block.id);\n if (state.approvalRequestedToolUseIds.has(block.id)) {\n continue;\n }\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n emit({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: toCommonName(block.name),\n nativeName: block.name,\n input: JSON.stringify(block.input ?? {}),\n providerExecuted: true,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n }\n if (opensStep || toolUseIds.length === 0) {\n state.stepOpen = true;\n if (usage) state.pendingStepUsage = usage;\n }\n return;\n }\n\n if (type === 'user' && msg.message?.content) {\n for (const block of msg.message.content) {\n if (\n block.type === 'tool_result' &&\n typeof block.tool_use_id === 'string'\n ) {\n if (state.mcpToolUseIds.has(block.tool_use_id)) {\n state.mcpToolUseIds.delete(block.tool_use_id);\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n continue;\n }\n state.approvalRequestedToolUseIds.delete(block.tool_use_id);\n const nativeName =\n state.nativeToolCallNames.get(block.tool_use_id) ?? 'unknown';\n state.nativeToolCallNames.delete(block.tool_use_id);\n const toolName = toCommonName(nativeName);\n const dynamic = state.externalMcpToolUseIds.delete(block.tool_use_id);\n const isError = !!block.is_error;\n const content = stringifyContent(block.content);\n /*\n * Claude Code's Bash tool does not report the command's real\n * numeric exit code — the SDK exposes only stdout/stderr text and\n * an is_error flag. Consumers (and the example UI) render bash\n * failures from an `exitCode` field on a structured result, the\n * shape Codex's shell tool provides natively. To match it, derive\n * a binary code from is_error: 1 on failure, 0 on success. This is\n * a stand-in for failed/succeeded, not the process's true exit\n * status.\n */\n const result =\n toolName === 'bash'\n ? { exitCode: isError ? 1 : 0, stdout: content }\n : dynamic\n ? parseMcpToolResult(content)\n : content;\n emit({\n type: 'tool-result',\n toolCallId: block.tool_use_id,\n toolName,\n result,\n isError,\n ...(dynamic ? { dynamic: true } : {}),\n });\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n }\n }\n closeStepIfReady({ state, emit });\n }\n };\n}\n\nexport function finishApprovalStep({\n state,\n emit,\n approvalId,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n approvalId: string;\n}): void {\n state.stepOpen = true;\n state.pendingStepToolUseIds.delete(approvalId);\n closeStepIfReady({ state, emit });\n}\n\nexport function emitFinishStep({\n state,\n emit,\n usage,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n usage: Record<string, unknown> | undefined;\n}): void {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: usage ?? defaultUsage(),\n });\n state.stepUsage = usage ?? state.stepUsage;\n state.pendingStepUsage = undefined;\n state.pendingStepToolUseIds = new Set();\n state.stepOpen = false;\n}\n\nfunction closeStepIfReady({\n state,\n emit,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n}): void {\n if (\n !state.stepOpen ||\n state.pendingStepToolUseIds.size > 0 ||\n state.partialBlocks.size > 0\n ) {\n return;\n }\n emitFinishStep({ state, emit, usage: state.pendingStepUsage });\n}\n\nfunction formatApiRetryWarning(msg: ClaudeMessage): string {\n const details: string[] = [];\n if (typeof msg.attempt === 'number') {\n const maxRetries =\n typeof msg.max_retries === 'number' ? `/${msg.max_retries}` : '';\n details.push(`attempt ${msg.attempt}${maxRetries}`);\n }\n if (typeof msg.error_status === 'number') {\n details.push(`HTTP ${msg.error_status}`);\n }\n if (typeof msg.retry_delay_ms === 'number') {\n details.push(`retrying in ${msg.retry_delay_ms}ms`);\n }\n if (msg.error) details.push(msg.error);\n return details.length > 0\n ? `Claude Code API retry: ${details.join('; ')}`\n : 'Claude Code API retry';\n}\n\nfunction handleStreamEvent(\n event: ClaudeMessage['event'] | undefined,\n partialBlocks: Map<number, { id: string; kind: 'text' | 'thinking' }>,\n send: Emit,\n): void {\n if (!event || typeof event.index !== 'number') return;\n const index = event.index;\n\n if (event.type === 'content_block_start') {\n const blockType = event.content_block?.type;\n if (blockType === 'text') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'text' });\n send({ type: 'text-start', id });\n } else if (blockType === 'thinking') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'thinking' });\n send({ type: 'reasoning-start', id });\n }\n return;\n }\n\n if (event.type === 'content_block_delta') {\n const block = partialBlocks.get(index);\n if (!block) return;\n if (\n block.kind === 'text' &&\n event.delta?.type === 'text_delta' &&\n typeof event.delta.text === 'string'\n ) {\n send({ type: 'text-delta', id: block.id, delta: event.delta.text });\n } else if (\n block.kind === 'thinking' &&\n event.delta?.type === 'thinking_delta' &&\n typeof event.delta.thinking === 'string'\n ) {\n send({\n type: 'reasoning-delta',\n id: block.id,\n delta: event.delta.thinking,\n });\n }\n return;\n }\n\n if (event.type === 'content_block_stop') {\n const block = partialBlocks.get(index);\n if (!block) return;\n partialBlocks.delete(index);\n if (block.kind === 'text') {\n send({ type: 'text-end', id: block.id });\n } else {\n send({ type: 'reasoning-end', id: block.id });\n }\n }\n}\n\nfunction stringifyContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(entry =>\n entry && typeof entry === 'object' && 'text' in entry\n ? String((entry as { text?: unknown }).text ?? '')\n : JSON.stringify(entry),\n )\n .join('');\n }\n return JSON.stringify(content);\n}\n\nfunction parseMcpToolResult(content: string): unknown {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n}\n\nexport function mapUsage(usage: unknown): Record<string, unknown> | undefined {\n if (!usage || typeof usage !== 'object') return undefined;\n const u = usage as {\n input_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n };\n return {\n inputTokens: {\n total:\n (u.input_tokens ?? 0) +\n (u.cache_creation_input_tokens ?? 0) +\n (u.cache_read_input_tokens ?? 0),\n noCache: u.input_tokens ?? 0,\n cacheRead: u.cache_read_input_tokens ?? 0,\n cacheWrite: u.cache_creation_input_tokens ?? 0,\n },\n outputTokens: {\n total: u.output_tokens ?? 0,\n text: u.output_tokens ?? 0,\n },\n };\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import { z } from 'zod/v4';\n\ntype JsonLiteral = string | number | boolean | null;\n\nexport type JsonSchemaObject = {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaObject>;\n required?: string[];\n items?: JsonSchemaObject | JsonSchemaObject[];\n enum?: unknown[];\n const?: unknown;\n oneOf?: JsonSchemaObject[];\n anyOf?: JsonSchemaObject[];\n nullable?: boolean;\n};\n\ntype ZodShape = Record<string, z.ZodTypeAny>;\n\nexport function jsonSchemaToZodShape(input: unknown): ZodShape {\n const schema = isJsonSchemaObject(input) ? input : {};\n return toZodShape(schema);\n}\n\nfunction toZodShape(schema: JsonSchemaObject | undefined): ZodShape {\n if (!schema?.properties) return {};\n const required = new Set(schema.required ?? []);\n const shape: ZodShape = {};\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propType = toZodType(propSchema);\n let propertyType = required.has(key) ? propType : propType.optional();\n if (propSchema.description) {\n propertyType = propertyType.describe(propSchema.description);\n }\n shape[key] = propertyType;\n }\n return shape;\n}\n\nfunction toZodType(schema: JsonSchemaObject | undefined): z.ZodTypeAny {\n if (!schema) return z.any();\n\n let zType =\n zodForConst(schema) ??\n zodForEnum(schema) ??\n zodForNullableUnion(schema) ??\n zodForType(schema);\n\n if (isNullable(schema)) zType = zType.nullable();\n if (schema.description) zType = zType.describe(schema.description);\n return zType;\n}\n\nfunction zodForType(schema: JsonSchemaObject): z.ZodTypeAny {\n const types = getNonNullTypes(schema);\n if (types.length > 1) return z.any();\n if (Array.isArray(schema.type) && types.length === 0) return z.null();\n const type = types[0] ?? (schema.properties ? 'object' : undefined);\n\n switch (type) {\n case 'string':\n return z.string();\n case 'number':\n return z.number();\n case 'integer':\n return z.number().int();\n case 'boolean':\n return z.boolean();\n case 'array':\n return z.array(\n Array.isArray(schema.items) ? z.any() : toZodType(schema.items),\n );\n case 'object':\n return z.object(toZodShape(schema));\n case 'null':\n return z.null();\n default:\n return z.any();\n }\n}\n\nfunction zodForConst(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!('const' in schema)) return undefined;\n return isJsonLiteral(schema.const) ? z.literal(schema.const) : z.any();\n}\n\nfunction zodForEnum(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!Array.isArray(schema.enum)) return undefined;\n if (!schema.enum.every(isJsonLiteral)) return z.any();\n return zodForLiterals(schema.enum);\n}\n\nfunction zodForNullableUnion(\n schema: JsonSchemaObject,\n): z.ZodTypeAny | undefined {\n const unionSchemas = schema.anyOf ?? schema.oneOf;\n if (!unionSchemas || unionSchemas.length < 2) return undefined;\n\n const nonNullSchemas = unionSchemas.filter(item => !isNullOnlySchema(item));\n if (nonNullSchemas.length !== 1) return undefined;\n\n return toZodType(nonNullSchemas[0]).nullable();\n}\n\nfunction zodForLiterals(values: JsonLiteral[]): z.ZodTypeAny {\n if (values.length === 0) return z.any();\n if (values.length === 1) return z.literal(values[0]);\n\n const literals = values.map(value => z.literal(value)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(literals);\n}\n\nfunction getNonNullTypes(schema: JsonSchemaObject): string[] {\n return Array.isArray(schema.type)\n ? schema.type.filter(type => type !== 'null')\n : ([schema.type].filter(Boolean) as string[]);\n}\n\nfunction isNullable(schema: JsonSchemaObject): boolean {\n return (\n schema.nullable === true ||\n (Array.isArray(schema.type) && schema.type.includes('null'))\n );\n}\n\nfunction isNullOnlySchema(schema: JsonSchemaObject): boolean {\n return (\n schema.type === 'null' ||\n (Array.isArray(schema.type) &&\n schema.type.length === 1 &&\n schema.type[0] === 'null') ||\n schema.const === null ||\n (Array.isArray(schema.enum) &&\n schema.enum.length === 1 &&\n schema.enum[0] === null)\n );\n}\n\nfunction isJsonSchemaObject(input: unknown): input is JsonSchemaObject {\n return input != null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction isJsonLiteral(value: unknown): value is JsonLiteral {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n","import type { StartMessage } from '../claude-code-bridge-protocol';\n\ntype BuiltinToolFiltering = StartMessage['builtinToolFiltering'];\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'Read',\n write: 'Write',\n edit: 'Edit',\n bash: 'Bash',\n glob: 'Glob',\n grep: 'Grep',\n webSearch: 'WebSearch',\n WebFetch: 'WebFetch',\n NotebookEdit: 'NotebookEdit',\n TodoWrite: 'TodoWrite',\n Agent: 'Agent',\n TaskCreate: 'TaskCreate',\n TaskGet: 'TaskGet',\n TaskUpdate: 'TaskUpdate',\n TaskList: 'TaskList',\n TaskStop: 'TaskStop',\n TaskOutput: 'TaskOutput',\n Monitor: 'Monitor',\n ListMcpResources: 'ListMcpResources',\n ReadMcpResource: 'ReadMcpResource',\n ExitPlanMode: 'ExitPlanMode',\n EnterWorktree: 'EnterWorktree',\n ExitWorktree: 'ExitWorktree',\n AskUserQuestion: 'AskUserQuestion',\n Skill: 'Skill',\n ToolSearch: 'ToolSearch',\n};\n\nconst PUBLIC_TOOL_NAMES = Object.keys(PUBLIC_TO_NATIVE);\n\nfunction toNativeName(toolName: string): string {\n return PUBLIC_TO_NATIVE[toolName] ?? toolName;\n}\n\nexport function resolveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] | undefined {\n if (toolFiltering == null || toolFiltering.mode === 'deny') return undefined;\n return toolFiltering.toolNames.map(name => toNativeName(name));\n}\n\nexport function resolveInactiveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] {\n if (toolFiltering == null) return [];\n const inactiveToolNames =\n toolFiltering.mode === 'allow'\n ? PUBLIC_TOOL_NAMES.filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n return inactiveToolNames.map(name => toNativeName(name));\n}\n"],"mappings":"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","names":["bridgeStateDir","randomUUID","procEnv","stdout","toCommonName","randomUUID","procEnv","args","stdout"]}
1
+ {"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/bridge/compaction-latch.ts","../../src/bridge/index.ts","../../src/bridge/claude-code-system-prompt.ts","../../src/bridge/claude-skills-option.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/json-schema-to-zod.ts","../../src/bridge/tool-filtering.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, single-flight connection\n// replacement, the in-memory event log + monotonic `seq`, resume replay, and\n// the lifecycle/meta files. The adapter supplies only `onStart` (drive its\n// CLI/SDK and translate to wire events) and lifecycle-specific cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\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\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 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 /**\n * Live queue of mid-turn user messages. The runtime pushes inbound\n * `user-message` text here; the adapter drains it as its runtime accepts\n * interactive input.\n */\n readonly pendingUserMessages: string[];\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'; 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 let activeSocket: WebSocket | undefined;\n let activeSocketReadyForLiveEvents = false;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: string[] | 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 sendControl = (msg: Record<string, unknown>): void => {\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(JSON.stringify(msg));\n } catch {\n // best-effort\n }\n }\n };\n\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 (\n activeSocketReadyForLiveEvents &&\n activeSocket?.readyState === WS_OPEN\n ) {\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 if (activeSocket !== ws) return;\n activeSocketReadyForLiveEvents = true;\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 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 pendingUserMessages: [],\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 = turn.pendingUserMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\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 currentUserMessages?.push(msg.text);\n return;\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n if (activeSocket !== ws) return;\n replay(ws, msg.lastSeenEventId);\n activeSocketReadyForLiveEvents = true;\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({ 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 // Single-flight: a fresh authorized connection *replaces* the active one\n // (the host reconnecting after a drop). The previous socket's close is a\n // no-op below because it is no longer `activeSocket`.\n activeSocket = ws;\n activeSocketReadyForLiveEvents = false;\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({\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\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({\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 *current* socket's close matters. A stale socket (already\n // replaced by a reconnect) closing is a no-op. Crucially we do NOT abort\n // the in-flight turn — it keeps running and its events accumulate in the\n // log for replay when the host reconnects.\n if (activeSocket === ws) {\n activeSocket = undefined;\n activeSocketReadyForLiveEvents = false;\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\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","/*\n * Claude reports a compaction in two pieces whose arrival order is not\n * guaranteed: the `compact_boundary` system message (trigger + token counts)\n * and the `PostCompact` hook (the summary text). The harness `compaction`\n * event needs fields from both, so this latch holds each half and emits a\n * single merged event once both have arrived, then resets for the next\n * compaction in the same turn.\n */\n\nexport type CompactionBoundary = {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionEvent = {\n type: 'compaction';\n trigger: 'manual' | 'auto';\n summary: string;\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionLatch = {\n onBoundary(boundary: CompactionBoundary): void;\n onSummary(summary: string): void;\n};\n\nexport function createCompactionLatch(\n emit: (event: CompactionEvent) => void,\n): CompactionLatch {\n let boundary: CompactionBoundary | undefined;\n let summary: string | undefined;\n\n const tryEmit = (): void => {\n if (!boundary || summary === undefined) return;\n emit({\n type: 'compaction',\n trigger: boundary.trigger,\n summary,\n ...(boundary.tokensBefore !== undefined\n ? { tokensBefore: boundary.tokensBefore }\n : {}),\n ...(boundary.tokensAfter !== undefined\n ? { tokensAfter: boundary.tokensAfter }\n : {}),\n });\n boundary = undefined;\n summary = undefined;\n };\n\n return {\n onBoundary(next) {\n boundary = next;\n tryEmit();\n },\n onSummary(next) {\n summary = next;\n tryEmit();\n },\n };\n}\n","// Long-running bridge that runs inside a sandbox alongside the `claude` CLI.\n// The generic transport — WebSocket server, token auth, single-flight\n// reconnect, the in-memory event log + `seq`, resume replay, and the\n// lifecycle/meta files — lives in the shared `@ai-sdk/harness/bridge` runtime.\n// This file supplies only the Claude-specific turn driver.\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { createCompactionLatch } from './compaction-latch';\nimport type { StartMessage } from '../claude-code-bridge-protocol';\nimport { randomUUID } from 'node:crypto';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\n/*\n * CONSTRAINT — the third-party imports below are NEVER bundled into the\n * compiled `bridge/index.mjs`. They are declared `external` in\n * tsup.config.ts and resolved at runtime from the node_modules that this\n * bridge installs *inside the sandbox* from `src/bridge/package.json` (and\n * its pinned `pnpm-lock.yaml`). That bridge package.json — NOT this host\n * package — is the single source of truth for these packages and their\n * versions; the published `@ai-sdk/harness-claude-code` package does not\n * provide them at runtime.\n *\n * When adding or changing a third-party import here you MUST keep all three\n * in sync, or the bridge will either get the dependency bundled in or fail\n * to resolve it in the sandbox:\n * 1. the import statement below,\n * 2. the `external` array in tsup.config.ts, and\n * 3. the dependency entry in `src/bridge/package.json`.\n */\nimport * as claudeAgentSdk from '@anthropic-ai/claude-agent-sdk';\nimport * as mcpServerModule from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createClaudeCodeSystemPrompt } from './claude-code-system-prompt';\nimport { toClaudeSkillsOption } from './claude-skills-option';\nimport {\n createClaudeStreamEventState,\n createEmitStreamEvent,\n defaultUsage,\n emitFinishStep,\n finishApprovalStep,\n mapUsage,\n type ClaudeMessage,\n} from './create-emit-stream-event';\nimport { jsonSchemaToZodShape } from './json-schema-to-zod';\nimport {\n resolveInactiveNativeTools,\n resolveNativeTools,\n} from './tool-filtering';\n\n/*\n * Native Claude Code tool name → cross-harness common name. Tools outside this\n * map (e.g. `WebFetch`, `NotebookEdit`) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'webSearch';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n Bash: 'bash',\n Glob: 'glob',\n Grep: 'grep',\n WebSearch: 'webSearch',\n};\n\nconst NATIVE_TOOL_KINDS: Readonly<\n Record<string, 'readonly' | 'edit' | 'bash'>\n> = {\n Read: 'readonly',\n Glob: 'readonly',\n Grep: 'readonly',\n WebSearch: 'readonly',\n WebFetch: 'readonly',\n TaskGet: 'readonly',\n TaskList: 'readonly',\n TaskOutput: 'readonly',\n ListMcpResources: 'readonly',\n ReadMcpResource: 'readonly',\n Write: 'edit',\n Edit: 'edit',\n NotebookEdit: 'edit',\n TodoWrite: 'edit',\n TaskCreate: 'edit',\n TaskUpdate: 'edit',\n TaskStop: 'edit',\n EnterWorktree: 'edit',\n ExitWorktree: 'edit',\n ExitPlanMode: 'edit',\n Skill: 'readonly',\n AskUserQuestion: 'readonly',\n ToolSearch: 'readonly',\n Bash: 'bash',\n Monitor: 'bash',\n};\n\nfunction toCommonName(nativeName: string): CommonBuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir;\nconst bridgeStateDir = args.bridgeStateDir;\nif (!workdir) {\n emitFatal('Missing --workdir argument.');\n}\nif (!bridgeStateDir) {\n emitFatal('Missing --bridge-state-dir argument.');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst claudeSdk = claudeAgentSdk as any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst mcpModule = mcpServerModule as any;\n\nawait runBridge<StartMessage>({\n bridgeType: 'claude-code',\n bridgeStateDir,\n onStart: runTurn,\n // Claude Code's session state lives in the workdir on the sandbox filesystem\n // (captured by the sandbox snapshot on stop); the resume payload is empty.\n onStop: () => ({}),\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nfunction createPermissionOptions(input: {\n start: StartMessage;\n inactiveNativeTools: readonly string[];\n turn: BridgeTurn;\n emit: Emit;\n finishApprovalStep: (approvalId: string) => void;\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n}): Record<string, unknown> {\n const permissionMode = input.start.permissionMode ?? 'allow-all';\n const inactiveNativeTools = new Set(input.inactiveNativeTools);\n const permissionSettings = createPermissionSettings({\n permissionMode,\n inactiveNativeTools,\n });\n if (permissionMode === 'allow-all' && inactiveNativeTools.size === 0) {\n return {\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n };\n }\n\n return {\n permissionMode:\n permissionMode === 'allow-edits' ? 'acceptEdits' : 'default',\n allowDangerouslySkipPermissions: false,\n ...(permissionSettings ? { settings: permissionSettings } : {}),\n canUseTool: async (\n toolName: string,\n toolInput: Record<string, unknown>,\n options: { toolUseID: string },\n ) => {\n if (toolName.startsWith('mcp__harness-tools__')) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n if (\n !inactiveNativeTools.has(toolName) &&\n !nativeToolRequiresApproval({\n nativeName: toolName,\n permissionMode,\n })\n ) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n\n const approvalId = options.toolUseID;\n input.approvalRequestedToolUseIds.add(approvalId);\n input.nativeToolCallNames.set(approvalId, toolName);\n input.emit({\n type: 'tool-call',\n toolCallId: approvalId,\n toolName: toCommonName(toolName),\n nativeName: toolName,\n input: JSON.stringify(toolInput ?? {}),\n providerExecuted: true,\n });\n input.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: approvalId,\n });\n input.finishApprovalStep(approvalId);\n\n const decision = await input.turn.requestToolApproval(approvalId);\n return decision.approved\n ? { behavior: 'allow', updatedInput: toolInput, toolUseID: approvalId }\n : {\n behavior: 'deny',\n message: decision.reason ?? 'Denied',\n toolUseID: approvalId,\n };\n },\n };\n}\n\nfunction createPermissionSettings(input: {\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n inactiveNativeTools: ReadonlySet<string>;\n}): Record<string, unknown> | undefined {\n const askRules = new Set<string>();\n for (const [nativeName, kind] of Object.entries(NATIVE_TOOL_KINDS)) {\n if (\n input.inactiveNativeTools.has(nativeName) ||\n (input.permissionMode === 'allow-reads'\n ? kind === 'edit' || kind === 'bash'\n : input.permissionMode === 'allow-edits'\n ? kind === 'bash'\n : false)\n ) {\n askRules.add(`${nativeName}(*)`);\n }\n }\n\n if (askRules.size === 0) return undefined;\n\n return {\n permissions: { ask: [...askRules] },\n sandbox: { autoAllowBashIfSandboxed: false },\n };\n}\n\nfunction nativeToolRequiresApproval(input: {\n nativeName: string;\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n}): boolean {\n if (input.permissionMode === 'allow-all') return false;\n const kind = NATIVE_TOOL_KINDS[input.nativeName] ?? 'edit';\n if (input.permissionMode === 'allow-edits') return kind === 'bash';\n return kind === 'edit' || kind === 'bash';\n}\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n // Local controller for the Claude query. Aborted either by the host (via the\n // shared runtime's `turn.abortSignal`) or by us on a terminal error.\n const abortCtl = new AbortController();\n if (turn.abortSignal.aborted) {\n abortCtl.abort();\n } else {\n turn.abortSignal.addEventListener('abort', () => abortCtl.abort(), {\n once: true,\n });\n }\n\n const streamEventState = createClaudeStreamEventState();\n\n const mcpServers: Record<string, unknown> = { ...(start.mcpServers ?? {}) };\n if (start.tools && start.tools.length > 0) {\n const server = new mcpModule.McpServer({\n name: 'harness-tools',\n version: '1.0.0',\n });\n for (const tool of start.tools) {\n const shape = jsonSchemaToZodShape(tool.inputSchema);\n server.tool(\n tool.name,\n tool.description ?? '',\n shape,\n async (input: Record<string, unknown>) => {\n const toolCallId = randomUUID();\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: tool.name,\n input: JSON.stringify(input),\n providerExecuted: false,\n });\n const { output, isError } = await turn.requestToolResult(toolCallId);\n emit({\n type: 'tool-result',\n toolCallId,\n toolName: tool.name,\n result: output ?? null,\n isError: !!isError,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(output ?? null) }],\n isError,\n };\n },\n );\n }\n mcpServers['harness-tools'] = {\n type: 'sdk',\n name: 'harness-tools',\n instance: server,\n };\n }\n\n // Compaction observation: merge Claude's `compact_boundary` message and\n // `PostCompact` hook (which arrive in either order) into one `compaction`\n // event. See `createCompactionLatch`.\n const compaction = createCompactionLatch(event => emit(event));\n\n // `stream-start` is emitted lazily on the first SDK message (below) so it can\n // carry the model the CLI resolved to, reported on the `system`/`init` message.\n\n const queryInput = createQueryInput({\n initialUserMessage: start.prompt,\n pendingUserMessages: turn.pendingUserMessages,\n abortSignal: abortCtl.signal,\n });\n const skillsOption = toClaudeSkillsOption(start.skills);\n const nativeTools = resolveNativeTools(start.builtinToolFiltering);\n const inactiveNativeTools = resolveInactiveNativeTools(\n start.builtinToolFiltering,\n );\n const permissionOptions = createPermissionOptions({\n start,\n inactiveNativeTools,\n turn,\n emit,\n finishApprovalStep: approvalId => {\n finishApprovalStep({ state: streamEventState, emit, approvalId });\n },\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds,\n });\n\n const q = claudeSdk.query({\n prompt: queryInput.input,\n options: {\n ...(start.model ? { model: start.model } : {}),\n ...(start.maxTurns !== undefined ? { maxTurns: start.maxTurns } : {}),\n ...(start.env !== undefined ? { env: { ...procEnv, ...start.env } } : {}),\n ...(skillsOption ? { skills: skillsOption } : {}),\n ...(nativeTools !== undefined ? { tools: nativeTools } : {}),\n ...(inactiveNativeTools.length > 0\n ? { disallowedTools: inactiveNativeTools }\n : {}),\n systemPrompt: createClaudeCodeSystemPrompt(start.instructions),\n thinking: start.thinking,\n ...(start.effort !== undefined ? { effort: start.effort } : {}),\n includePartialMessages: true,\n // The `PostCompact` hook carries the compaction summary, which the\n // `compact_boundary` system message does not. Latch it for the unified\n // `compaction` event; return an empty output so compaction proceeds.\n hooks: {\n PostCompact: [\n {\n hooks: [\n async (input: { compact_summary?: unknown }) => {\n if (typeof input?.compact_summary === 'string') {\n compaction.onSummary(input.compact_summary);\n }\n return {};\n },\n ],\n },\n ],\n },\n // Continuation rule: the host can force-continue (resume after a\n // cross-process detach) by setting `start.continue: true`; otherwise\n // we continue every subsequent turn after the first one in this\n // bridge process.\n ...(start.continue === true || !turn.firstTurn ? { continue: true } : {}),\n ...permissionOptions,\n mcpServers,\n cwd: workdir,\n abortSignal: abortCtl.signal,\n },\n });\n let turnUsage: Record<string, unknown> | undefined;\n let totalCostUsd: number | undefined;\n let emittedTerminalError = false;\n let emittedTerminalFinish = false;\n\n const emitTerminalError = (message: string | undefined): void => {\n const normalized = message?.trim();\n if (!normalized || emittedTerminalError || emittedTerminalFinish) return;\n streamEventState.observedTerminalError = normalized;\n emittedTerminalError = true;\n turn.emitError({\n error: normalized,\n message: 'claude-code terminal error',\n });\n queryInput.close();\n abortCtl.abort();\n };\n\n const emitStreamEvent = createEmitStreamEvent({\n state: streamEventState,\n emit,\n emitWarning: turn.emitWarning,\n emitTerminalError,\n onCompactionBoundary: boundary => compaction.onBoundary(boundary),\n toCommonName,\n });\n\n try {\n for await (const msg of q as AsyncIterable<ClaudeMessage>) {\n if (abortCtl.signal.aborted) break;\n\n const type = msg.type;\n\n emitStreamEvent(msg);\n\n if (type === 'result') {\n if (msg.subtype === 'success') {\n const emptyResult = !msg.result?.trim?.();\n if (emptyResult && streamEventState.observedTerminalError) {\n emitTerminalError(streamEventState.observedTerminalError);\n continue;\n }\n const usage = msg.usage ?? msg.message?.usage;\n const harnessUsage = mapUsage(usage);\n if (harnessUsage) turnUsage = harnessUsage;\n if (typeof msg.total_cost_usd === 'number') {\n totalCostUsd = (totalCostUsd ?? 0) + msg.total_cost_usd;\n }\n if (streamEventState.stepOpen) {\n emitFinishStep({\n state: streamEventState,\n emit,\n usage: harnessUsage ?? streamEventState.pendingStepUsage,\n });\n }\n queryInput.close();\n break;\n } else {\n emitTerminalError(\n (Array.isArray(msg.errors) ? msg.errors.join('\\n') : undefined) ||\n streamEventState.observedTerminalError ||\n msg.result ||\n 'Unknown error',\n );\n }\n continue;\n }\n }\n } catch (err) {\n if (!(abortCtl.signal.aborted && emittedTerminalError)) {\n turn.emitError({ error: err, message: 'claude-code turn failed' });\n }\n return;\n } finally {\n queryInput.close();\n }\n\n if (emittedTerminalError) return;\n emittedTerminalFinish = true;\n void emittedTerminalFinish;\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage ?? streamEventState.stepUsage ?? defaultUsage(),\n ...(totalCostUsd !== undefined\n ? { harnessMetadata: { 'claude-code': { costUsd: totalCostUsd } } }\n : {}),\n });\n}\n\nfunction createQueryInput({\n initialUserMessage,\n pendingUserMessages,\n abortSignal,\n}: {\n initialUserMessage: string;\n pendingUserMessages: string[];\n abortSignal: AbortSignal;\n}): {\n input: AsyncIterable<unknown>;\n close(): void;\n} {\n let closed = false;\n const close = (): void => {\n closed = true;\n };\n if (abortSignal.aborted) {\n close();\n } else {\n abortSignal.addEventListener('abort', close, { once: true });\n }\n\n const toUserMessage = (text: string): unknown => ({\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text }],\n },\n });\n\n return {\n close,\n input: {\n [Symbol.asyncIterator]() {\n let sentInitial = false;\n return {\n async next() {\n // eslint-disable-next-line no-unmodified-loop-condition\n while (!closed && !abortSignal.aborted) {\n if (!sentInitial) {\n sentInitial = true;\n return {\n value: toUserMessage(initialUserMessage),\n done: false,\n };\n }\n if (pendingUserMessages.length > 0) {\n return {\n value: toUserMessage(pendingUserMessages.shift()!),\n done: false,\n };\n }\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n return { value: undefined, done: true } as IteratorResult<unknown>;\n },\n };\n },\n },\n };\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: { workdir?: string; bridgeStateDir?: string } = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--workdir' && i + 1 < args.length) {\n out.workdir = args[++i];\n } else if (args[i] === '--bridge-state-dir' && i + 1 < args.length) {\n out.bridgeStateDir = args[++i];\n }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n","export function createClaudeCodeSystemPrompt(instructions?: string): {\n type: 'preset';\n preset: 'claude_code';\n append?: string;\n} {\n return {\n type: 'preset',\n preset: 'claude_code',\n ...(instructions ? { append: instructions } : {}),\n };\n}\n","export function toClaudeSkillsOption(\n skills: ReadonlyArray<string> | undefined,\n): 'all' | undefined {\n /*\n * The Claude Agent SDK treats `skills: string[]` as an allowlist, which hides\n * built-in/default skills. When the harness writes project skills, ask Claude\n * to enable every discovered skill so bundled defaults and project skills are\n * both visible.\n */\n return skills && skills.length > 0 ? 'all' : undefined;\n}\n","import { randomUUID } from 'node:crypto';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type ClaudeMessage = {\n type?: string;\n subtype?: string;\n parent_tool_use_id?: string | null;\n model?: string;\n error?: string;\n error_status?: number | null;\n attempt?: number;\n max_retries?: number;\n retry_delay_ms?: number;\n patch?: { status?: string; error?: string };\n compact_metadata?: {\n trigger: 'manual' | 'auto';\n pre_tokens?: number;\n post_tokens?: number;\n };\n event?: {\n type?: string;\n index?: number;\n content_block?: { type?: string };\n delta?: { type?: string; text?: string; thinking?: string };\n };\n message?: {\n content?: ReadonlyArray<MessageBlock>;\n usage?: Record<string, unknown>;\n };\n result?: string;\n errors?: ReadonlyArray<string>;\n usage?: Record<string, unknown>;\n total_cost_usd?: number;\n};\n\ntype MessageBlock = {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n};\n\nexport type ClaudeStreamEventState = {\n /*\n * Map of native tool-use id → tool name. Claude assistant messages emit\n * `tool_use` blocks with both `id` and `name`; the matching `tool_result`\n * block on a later user message carries only `tool_use_id`, so without this\n * map the tool-result event would have to emit `toolName: 'unknown'`.\n */\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n partialBlocks: Map<number, { id: string; kind: 'text' | 'thinking' }>;\n stepUsage: Record<string, unknown> | undefined;\n pendingStepToolUseIds: Set<string>;\n pendingStepUsage: Record<string, unknown> | undefined;\n stepOpen: boolean;\n /*\n * Tool-use ids that originated from the MCP server hosting user-supplied\n * tools. The MCP handler emits its own `tool-call`/`tool-result` pair with\n * the user-facing tool name and a synthetic id, so the duplicate\n * `tool_result` block Claude reports for the underlying native id must be\n * suppressed.\n */\n mcpToolUseIds: Set<string>;\n externalMcpToolUseIds: Set<string>;\n observedTerminalError: string | undefined;\n};\n\nexport function createClaudeStreamEventState(): ClaudeStreamEventState {\n return {\n nativeToolCallNames: new Map(),\n approvalRequestedToolUseIds: new Set(),\n partialBlocks: new Map(),\n stepUsage: undefined,\n pendingStepToolUseIds: new Set(),\n pendingStepUsage: undefined,\n stepOpen: false,\n mcpToolUseIds: new Set(),\n externalMcpToolUseIds: new Set(),\n observedTerminalError: undefined,\n };\n}\n\nconst UNRECOVERABLE_API_RETRY_STATUSES = new Set([401, 403, 404]);\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitTerminalError,\n onCompactionBoundary,\n toCommonName,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n emitWarning: (warning: { message: string }) => void;\n emitTerminalError: (message: string | undefined) => void;\n onCompactionBoundary: (boundary: {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n }) => void;\n toCommonName: (nativeName: string) => string;\n}): (event: ClaudeMessage) => void {\n let streamStarted = false;\n\n return msg => {\n const type = msg.type;\n\n // Emit `stream-start` once, on the first message, carrying the model the\n // CLI resolved to (the `system`/`init` message reports it — this is the\n // default model when none was configured).\n if (!streamStarted) {\n const initModel =\n type === 'system' &&\n msg.subtype === 'init' &&\n typeof (msg as { model?: unknown }).model === 'string'\n ? (msg as { model: string }).model\n : undefined;\n emit({\n type: 'stream-start',\n ...(initModel ? { modelId: initModel } : {}),\n });\n streamStarted = true;\n }\n\n if (type === 'system' && msg.subtype === 'api_retry') {\n if (\n typeof msg.error_status === 'number' &&\n UNRECOVERABLE_API_RETRY_STATUSES.has(msg.error_status)\n ) {\n emitTerminalError(\n `HTTP ${msg.error_status}: ${msg.error ?? 'provider request failed'}`,\n );\n return;\n }\n\n emitWarning({ message: formatApiRetryWarning(msg) });\n return;\n }\n\n if (typeof msg.error === 'string' && msg.error.trim()) {\n state.observedTerminalError = msg.error.trim();\n }\n\n if (\n type === 'auth_status' &&\n typeof msg.error === 'string' &&\n msg.error.trim()\n ) {\n emitTerminalError(msg.error);\n return;\n }\n\n if (\n type === 'system' &&\n msg.subtype === 'task_updated' &&\n msg.patch?.status === 'failed' &&\n typeof msg.patch.error === 'string'\n ) {\n emitTerminalError(msg.patch.error);\n return;\n }\n\n if (type === 'system' && msg.subtype === 'compact_boundary') {\n const meta = msg.compact_metadata;\n if (meta) {\n onCompactionBoundary({\n trigger: meta.trigger,\n ...(typeof meta.pre_tokens === 'number'\n ? { tokensBefore: meta.pre_tokens }\n : {}),\n ...(typeof meta.post_tokens === 'number'\n ? { tokensAfter: meta.post_tokens }\n : {}),\n });\n }\n return;\n }\n\n // Messages emitted by a Task-tool subagent carry the parent tool-use id.\n // They belong to the subagent stream and must not affect the parent step,\n // including partial stream events that arrive before assistant messages.\n if (msg.parent_tool_use_id != null) {\n return;\n }\n\n if (type === 'stream_event') {\n handleStreamEvent(msg.event, state.partialBlocks, emit);\n return;\n }\n\n if (type === 'assistant' && msg.message?.content) {\n const usage = mapUsage(msg.message.usage);\n const toolUseIds: string[] = [];\n let opensStep = false;\n for (const block of msg.message.content) {\n if (\n block.type === 'tool_use' &&\n typeof block.id === 'string' &&\n typeof block.name === 'string'\n ) {\n toolUseIds.push(block.id);\n const mcpPrefix = 'mcp__harness-tools__';\n if (block.name.startsWith(mcpPrefix)) {\n state.pendingStepToolUseIds.add(block.id);\n state.mcpToolUseIds.add(block.id);\n opensStep = true;\n continue;\n }\n state.nativeToolCallNames.set(block.id, block.name);\n const dynamic = block.name.startsWith('mcp__');\n if (dynamic) state.externalMcpToolUseIds.add(block.id);\n if (state.approvalRequestedToolUseIds.has(block.id)) {\n continue;\n }\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n emit({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: toCommonName(block.name),\n nativeName: block.name,\n input: JSON.stringify(block.input ?? {}),\n providerExecuted: true,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n }\n if (opensStep || toolUseIds.length === 0) {\n state.stepOpen = true;\n if (usage) state.pendingStepUsage = usage;\n }\n return;\n }\n\n if (type === 'user' && msg.message?.content) {\n for (const block of msg.message.content) {\n if (\n block.type === 'tool_result' &&\n typeof block.tool_use_id === 'string'\n ) {\n if (state.mcpToolUseIds.has(block.tool_use_id)) {\n state.mcpToolUseIds.delete(block.tool_use_id);\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n continue;\n }\n state.approvalRequestedToolUseIds.delete(block.tool_use_id);\n const nativeName =\n state.nativeToolCallNames.get(block.tool_use_id) ?? 'unknown';\n state.nativeToolCallNames.delete(block.tool_use_id);\n const toolName = toCommonName(nativeName);\n const dynamic = state.externalMcpToolUseIds.delete(block.tool_use_id);\n const isError = !!block.is_error;\n const content = stringifyContent(block.content);\n /*\n * Claude Code's Bash tool does not report the command's real\n * numeric exit code — the SDK exposes only stdout/stderr text and\n * an is_error flag. Consumers (and the example UI) render bash\n * failures from an `exitCode` field on a structured result, the\n * shape Codex's shell tool provides natively. To match it, derive\n * a binary code from is_error: 1 on failure, 0 on success. This is\n * a stand-in for failed/succeeded, not the process's true exit\n * status.\n */\n const result =\n toolName === 'bash'\n ? { exitCode: isError ? 1 : 0, stdout: content }\n : dynamic\n ? parseMcpToolResult(content)\n : content;\n emit({\n type: 'tool-result',\n toolCallId: block.tool_use_id,\n toolName,\n result,\n isError,\n ...(dynamic ? { dynamic: true } : {}),\n });\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n }\n }\n closeStepIfReady({ state, emit });\n }\n };\n}\n\nexport function finishApprovalStep({\n state,\n emit,\n approvalId,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n approvalId: string;\n}): void {\n state.stepOpen = true;\n state.pendingStepToolUseIds.delete(approvalId);\n closeStepIfReady({ state, emit });\n}\n\nexport function emitFinishStep({\n state,\n emit,\n usage,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n usage: Record<string, unknown> | undefined;\n}): void {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: usage ?? defaultUsage(),\n });\n state.stepUsage = usage ?? state.stepUsage;\n state.pendingStepUsage = undefined;\n state.pendingStepToolUseIds = new Set();\n state.stepOpen = false;\n}\n\nfunction closeStepIfReady({\n state,\n emit,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n}): void {\n if (\n !state.stepOpen ||\n state.pendingStepToolUseIds.size > 0 ||\n state.partialBlocks.size > 0\n ) {\n return;\n }\n emitFinishStep({ state, emit, usage: state.pendingStepUsage });\n}\n\nfunction formatApiRetryWarning(msg: ClaudeMessage): string {\n const details: string[] = [];\n if (typeof msg.attempt === 'number') {\n const maxRetries =\n typeof msg.max_retries === 'number' ? `/${msg.max_retries}` : '';\n details.push(`attempt ${msg.attempt}${maxRetries}`);\n }\n if (typeof msg.error_status === 'number') {\n details.push(`HTTP ${msg.error_status}`);\n }\n if (typeof msg.retry_delay_ms === 'number') {\n details.push(`retrying in ${msg.retry_delay_ms}ms`);\n }\n if (msg.error) details.push(msg.error);\n return details.length > 0\n ? `Claude Code API retry: ${details.join('; ')}`\n : 'Claude Code API retry';\n}\n\nfunction handleStreamEvent(\n event: ClaudeMessage['event'] | undefined,\n partialBlocks: Map<number, { id: string; kind: 'text' | 'thinking' }>,\n send: Emit,\n): void {\n if (!event || typeof event.index !== 'number') return;\n const index = event.index;\n\n if (event.type === 'content_block_start') {\n const blockType = event.content_block?.type;\n if (blockType === 'text') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'text' });\n send({ type: 'text-start', id });\n } else if (blockType === 'thinking') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'thinking' });\n send({ type: 'reasoning-start', id });\n }\n return;\n }\n\n if (event.type === 'content_block_delta') {\n const block = partialBlocks.get(index);\n if (!block) return;\n if (\n block.kind === 'text' &&\n event.delta?.type === 'text_delta' &&\n typeof event.delta.text === 'string'\n ) {\n send({ type: 'text-delta', id: block.id, delta: event.delta.text });\n } else if (\n block.kind === 'thinking' &&\n event.delta?.type === 'thinking_delta' &&\n typeof event.delta.thinking === 'string'\n ) {\n send({\n type: 'reasoning-delta',\n id: block.id,\n delta: event.delta.thinking,\n });\n }\n return;\n }\n\n if (event.type === 'content_block_stop') {\n const block = partialBlocks.get(index);\n if (!block) return;\n partialBlocks.delete(index);\n if (block.kind === 'text') {\n send({ type: 'text-end', id: block.id });\n } else {\n send({ type: 'reasoning-end', id: block.id });\n }\n }\n}\n\nfunction stringifyContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(entry =>\n entry && typeof entry === 'object' && 'text' in entry\n ? String((entry as { text?: unknown }).text ?? '')\n : JSON.stringify(entry),\n )\n .join('');\n }\n return JSON.stringify(content);\n}\n\nfunction parseMcpToolResult(content: string): unknown {\n try {\n return JSON.parse(content);\n } catch {\n return content;\n }\n}\n\nexport function mapUsage(usage: unknown): Record<string, unknown> | undefined {\n if (!usage || typeof usage !== 'object') return undefined;\n const u = usage as {\n input_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n };\n return {\n inputTokens: {\n total:\n (u.input_tokens ?? 0) +\n (u.cache_creation_input_tokens ?? 0) +\n (u.cache_read_input_tokens ?? 0),\n noCache: u.input_tokens ?? 0,\n cacheRead: u.cache_read_input_tokens ?? 0,\n cacheWrite: u.cache_creation_input_tokens ?? 0,\n },\n outputTokens: {\n total: u.output_tokens ?? 0,\n text: u.output_tokens ?? 0,\n },\n };\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import { z } from 'zod/v4';\n\ntype JsonLiteral = string | number | boolean | null;\n\nexport type JsonSchemaObject = {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaObject>;\n required?: string[];\n items?: JsonSchemaObject | JsonSchemaObject[];\n enum?: unknown[];\n const?: unknown;\n oneOf?: JsonSchemaObject[];\n anyOf?: JsonSchemaObject[];\n nullable?: boolean;\n};\n\ntype ZodShape = Record<string, z.ZodTypeAny>;\n\nexport function jsonSchemaToZodShape(input: unknown): ZodShape {\n const schema = isJsonSchemaObject(input) ? input : {};\n return toZodShape(schema);\n}\n\nfunction toZodShape(schema: JsonSchemaObject | undefined): ZodShape {\n if (!schema?.properties) return {};\n const required = new Set(schema.required ?? []);\n const shape: ZodShape = {};\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propType = toZodType(propSchema);\n let propertyType = required.has(key) ? propType : propType.optional();\n if (propSchema.description) {\n propertyType = propertyType.describe(propSchema.description);\n }\n shape[key] = propertyType;\n }\n return shape;\n}\n\nfunction toZodType(schema: JsonSchemaObject | undefined): z.ZodTypeAny {\n if (!schema) return z.any();\n\n let zType =\n zodForConst(schema) ??\n zodForEnum(schema) ??\n zodForNullableUnion(schema) ??\n zodForType(schema);\n\n if (isNullable(schema)) zType = zType.nullable();\n if (schema.description) zType = zType.describe(schema.description);\n return zType;\n}\n\nfunction zodForType(schema: JsonSchemaObject): z.ZodTypeAny {\n const types = getNonNullTypes(schema);\n if (types.length > 1) return z.any();\n if (Array.isArray(schema.type) && types.length === 0) return z.null();\n const type = types[0] ?? (schema.properties ? 'object' : undefined);\n\n switch (type) {\n case 'string':\n return z.string();\n case 'number':\n return z.number();\n case 'integer':\n return z.number().int();\n case 'boolean':\n return z.boolean();\n case 'array':\n return z.array(\n Array.isArray(schema.items) ? z.any() : toZodType(schema.items),\n );\n case 'object':\n return z.object(toZodShape(schema));\n case 'null':\n return z.null();\n default:\n return z.any();\n }\n}\n\nfunction zodForConst(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!('const' in schema)) return undefined;\n return isJsonLiteral(schema.const) ? z.literal(schema.const) : z.any();\n}\n\nfunction zodForEnum(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!Array.isArray(schema.enum)) return undefined;\n if (!schema.enum.every(isJsonLiteral)) return z.any();\n return zodForLiterals(schema.enum);\n}\n\nfunction zodForNullableUnion(\n schema: JsonSchemaObject,\n): z.ZodTypeAny | undefined {\n const unionSchemas = schema.anyOf ?? schema.oneOf;\n if (!unionSchemas || unionSchemas.length < 2) return undefined;\n\n const nonNullSchemas = unionSchemas.filter(item => !isNullOnlySchema(item));\n if (nonNullSchemas.length !== 1) return undefined;\n\n return toZodType(nonNullSchemas[0]).nullable();\n}\n\nfunction zodForLiterals(values: JsonLiteral[]): z.ZodTypeAny {\n if (values.length === 0) return z.any();\n if (values.length === 1) return z.literal(values[0]);\n\n const literals = values.map(value => z.literal(value)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(literals);\n}\n\nfunction getNonNullTypes(schema: JsonSchemaObject): string[] {\n return Array.isArray(schema.type)\n ? schema.type.filter(type => type !== 'null')\n : ([schema.type].filter(Boolean) as string[]);\n}\n\nfunction isNullable(schema: JsonSchemaObject): boolean {\n return (\n schema.nullable === true ||\n (Array.isArray(schema.type) && schema.type.includes('null'))\n );\n}\n\nfunction isNullOnlySchema(schema: JsonSchemaObject): boolean {\n return (\n schema.type === 'null' ||\n (Array.isArray(schema.type) &&\n schema.type.length === 1 &&\n schema.type[0] === 'null') ||\n schema.const === null ||\n (Array.isArray(schema.enum) &&\n schema.enum.length === 1 &&\n schema.enum[0] === null)\n );\n}\n\nfunction isJsonSchemaObject(input: unknown): input is JsonSchemaObject {\n return input != null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction isJsonLiteral(value: unknown): value is JsonLiteral {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n","import type { StartMessage } from '../claude-code-bridge-protocol';\n\ntype BuiltinToolFiltering = StartMessage['builtinToolFiltering'];\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'Read',\n write: 'Write',\n edit: 'Edit',\n bash: 'Bash',\n glob: 'Glob',\n grep: 'Grep',\n webSearch: 'WebSearch',\n WebFetch: 'WebFetch',\n NotebookEdit: 'NotebookEdit',\n TodoWrite: 'TodoWrite',\n Agent: 'Agent',\n TaskCreate: 'TaskCreate',\n TaskGet: 'TaskGet',\n TaskUpdate: 'TaskUpdate',\n TaskList: 'TaskList',\n TaskStop: 'TaskStop',\n TaskOutput: 'TaskOutput',\n Monitor: 'Monitor',\n ListMcpResources: 'ListMcpResources',\n ReadMcpResource: 'ReadMcpResource',\n ExitPlanMode: 'ExitPlanMode',\n EnterWorktree: 'EnterWorktree',\n ExitWorktree: 'ExitWorktree',\n AskUserQuestion: 'AskUserQuestion',\n Skill: 'Skill',\n ToolSearch: 'ToolSearch',\n};\n\nconst PUBLIC_TOOL_NAMES = Object.keys(PUBLIC_TO_NATIVE);\n\nfunction toNativeName(toolName: string): string {\n return PUBLIC_TO_NATIVE[toolName] ?? toolName;\n}\n\nexport function resolveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] | undefined {\n if (toolFiltering == null || toolFiltering.mode === 'deny') return undefined;\n return toolFiltering.toolNames.map(name => toNativeName(name));\n}\n\nexport function resolveInactiveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] {\n if (toolFiltering == null) return [];\n const inactiveToolNames =\n toolFiltering.mode === 'allow'\n ? PUBLIC_TOOL_NAMES.filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n return inactiveToolNames.map(name => toNativeName(name));\n}\n"],"mappings":"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","names":["bridgeStateDir","randomUUID","procEnv","stdout","toCommonName","randomUUID","procEnv","args","stdout"]}
package/dist/index.d.ts CHANGED
@@ -50,6 +50,11 @@ type ClaudeCodeHarnessSettings = {
50
50
  * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.
51
51
  */
52
52
  readonly thinking?: ClaudeCodeThinkingConfig;
53
+ /**
54
+ * Controls how much effort Claude applies when adaptive thinking is enabled.
55
+ * Unset uses the Claude Agent SDK default.
56
+ */
57
+ readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';
53
58
  /**
54
59
  * Override the port the bridge binds inside the sandbox. By default the
55
60
  * adapter uses the first port the sandbox declares via `sandbox.ports`.
package/dist/index.js CHANGED
@@ -137,6 +137,7 @@ var thinkingSchema = z.discriminatedUnion("type", [
137
137
  var startMessageSchema = harnessV1BridgeStartBaseSchema.extend({
138
138
  instructions: z.string().optional(),
139
139
  thinking: thinkingSchema,
140
+ effort: z.enum(["low", "medium", "high", "xhigh", "max"]).optional(),
140
141
  maxTurns: z.number().optional(),
141
142
  env: z.record(z.string(), z.string()).optional(),
142
143
  skills: z.array(z.string()).optional(),
@@ -152,7 +153,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
152
153
  ]);
153
154
 
154
155
  // src/version.ts
155
- var VERSION = true ? "1.0.71" : "0.0.0-test";
156
+ var VERSION = true ? "1.0.73" : "0.0.0-test";
156
157
 
157
158
  // src/claude-code-harness.ts
158
159
  var CLAUDE_CODE_CLIENT_APP = `ai-sdk/harness-claude-code/${VERSION}`;
@@ -858,6 +859,7 @@ function createClaudeCode(settings = {}) {
858
859
  maxTurns: settings.maxTurns,
859
860
  env: settings.env,
860
861
  thinking,
862
+ effort: settings.effort,
861
863
  isResume: true,
862
864
  continueOnFirstPrompt: false,
863
865
  rerunContinue: false,
@@ -990,6 +992,7 @@ function createClaudeCode(settings = {}) {
990
992
  maxTurns: settings.maxTurns,
991
993
  env: settings.env,
992
994
  thinking,
995
+ effort: settings.effort,
993
996
  isResume: respawnStrategy !== void 0,
994
997
  continueOnFirstPrompt: respawnStrategy !== void 0,
995
998
  rerunContinue: respawnStrategy === "rerun",
@@ -1192,6 +1195,7 @@ function createSession({
1192
1195
  maxTurns,
1193
1196
  env,
1194
1197
  thinking,
1198
+ effort,
1195
1199
  isResume,
1196
1200
  continueOnFirstPrompt,
1197
1201
  rerunContinue,
@@ -1342,6 +1346,7 @@ function createSession({
1342
1346
  maxTurns,
1343
1347
  ...env !== void 0 ? { env } : {},
1344
1348
  thinking,
1349
+ ...effort !== void 0 ? { effort } : {},
1345
1350
  ...skills.length > 0 ? { skills: skills.map((skill) => skill.name) } : {},
1346
1351
  ...mcpServers == null ? {} : { mcpServers },
1347
1352
  ...permissionMode ? { permissionMode } : {},
@@ -1380,6 +1385,7 @@ function createSession({
1380
1385
  maxTurns,
1381
1386
  ...env !== void 0 ? { env } : {},
1382
1387
  thinking,
1388
+ ...effort !== void 0 ? { effort } : {},
1383
1389
  ...skills.length > 0 ? { skills: skills.map((skill) => skill.name) } : {},
1384
1390
  ...mcpServers == null ? {} : { mcpServers },
1385
1391
  ...permissionMode ? { permissionMode } : {},
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/claude-code-harness.ts","../src/claude-code-auth.ts","../src/claude-code-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { posix } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n commonTool,\n harnessV1DiagnosticFromBridgeFrame,\n HarnessCapabilityUnsupportedError,\n type HarnessV1,\n type HarnessV1Bootstrap,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1BuiltinTool,\n type HarnessV1ContinueTurnState,\n type HarnessV1DebugConfig,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResumeSessionState,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n classifyDiskLog,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxSession,\n type Experimental_SandboxProcess,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n resolveClaudeCodeEnv,\n type ClaudeCodeAuthOptions,\n} from './claude-code-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './claude-code-bridge-protocol';\nimport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\nimport { VERSION } from './version';\n\ntype ClaudeCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype ClaudeCodeRespawnStrategy = 'replay' | 'rerun';\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst CLAUDE_CODE_CLIENT_APP = `ai-sdk/harness-claude-code/${VERSION}`;\n\nexport type ClaudeCodeHarnessSettings = {\n readonly auth?: ClaudeCodeAuthOptions;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Anthropic model id the underlying `claude` CLI should use. Leaving this\n * unset defers to the CLI's default.\n */\n readonly model?: string;\n /**\n * Hard cap on how many internal turns the CLI can take before yielding\n * back to the caller. Unset means the CLI's default.\n */\n readonly maxTurns?: number;\n /**\n * Environment variables for the Claude Code process. These values are\n * merged over the sandbox bridge process environment.\n */\n readonly env?: Readonly<Record<string, string>>;\n /**\n * Controls extended-thinking behavior and whether reasoning is summarized or\n * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.\n */\n readonly thinking?: ClaudeCodeThinkingConfig;\n /**\n * Override the port the bridge binds inside the sandbox. By default the\n * adapter uses the first port the sandbox declares via `sandbox.ports`.\n * Only set this if the sandbox declares multiple ports and the first one\n * is reserved for something else.\n */\n readonly port?: number;\n /** Maximum milliseconds to wait for the bridge to advertise its port. Defaults to 120000. */\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\n/*\n * Every native tool the Claude Code CLI can invoke, declared as a `ToolSet`\n * keyed by what the bridge emits as `toolName` on the wire\n * (`commonName ?? nativeName`). Schemas are transcribed from the generated\n * `sdk-tools.d.ts` and the conditionally registered tool definitions in the\n * pinned Claude Code executable.\n *\n * `MCP` (the generic proxy tool inside the Claude Code SDK) is intentionally\n * omitted — the bridge filters out `mcp__harness-tools__*` tool names before\n * emitting them, and other MCP invocations come through with their own\n * server-tool names rather than the literal `'Mcp'` token.\n */\nconst listMcpResourcesInputSchema = z.object({\n server: z.string().optional(),\n});\n\nconst readMcpResourceInputSchema = z.object({\n server: z.string(),\n uri: z.string(),\n});\n\nconst structuredTeamMessageSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('shutdown_request'),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('shutdown_response'),\n request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('plan_approval_response'),\n request_id: z.string(),\n approve: z.boolean(),\n feedback: z.string().optional(),\n }),\n]);\n\nconst CLAUDE_CODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'Read',\n toolUseKind: 'readonly',\n description: 'Read file contents (text, image, PDF, notebook)',\n inputSchema: z.object({\n file_path: z.string(),\n offset: z.number().optional(),\n limit: z.number().optional(),\n pages: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'Write',\n toolUseKind: 'edit',\n description: 'Overwrite or create a file at an absolute path',\n inputSchema: z.object({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'Edit',\n toolUseKind: 'edit',\n description: 'Edit a file by exact string replacement',\n inputSchema: z.object({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'Bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'Glob',\n toolUseKind: 'readonly',\n description: 'Fast file-pattern search using glob syntax',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'Grep',\n toolUseKind: 'readonly',\n description: 'Regex search over file contents via ripgrep',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n glob: z.string().optional(),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .optional(),\n '-B': z.number().optional(),\n '-A': z.number().optional(),\n '-C': z.number().optional(),\n context: z.number().optional(),\n '-n': z.boolean().optional(),\n '-i': z.boolean().optional(),\n '-o': z.boolean().optional(),\n type: z.string().optional(),\n head_limit: z.number().optional(),\n offset: z.number().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'WebSearch',\n toolUseKind: 'readonly',\n description: 'Issue web search queries with optional domain filters',\n inputSchema: z.object({\n query: z.string(),\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n }),\n }),\n\n WebFetch: tool({\n description: 'Fetch a URL and run a prompt against its content',\n inputSchema: z.object({\n url: z.string(),\n prompt: z.string(),\n }),\n }),\n NotebookEdit: tool({\n description: 'Edit, insert, or delete a Jupyter notebook cell',\n inputSchema: z.object({\n notebook_path: z.string(),\n new_source: z.string(),\n cell_id: z.string().optional(),\n cell_type: z.enum(['code', 'markdown']).optional(),\n edit_mode: z.enum(['replace', 'insert', 'delete']).optional(),\n }),\n }),\n TodoWrite: tool({\n description: 'Replace the session todo list',\n inputSchema: z.object({\n todos: z.array(\n z.object({\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n ),\n }),\n }),\n Agent: tool({\n description: 'Spawn a subagent with a task',\n inputSchema: z.object({\n description: z.string(),\n prompt: z.string(),\n subagent_type: z.string().optional(),\n model: z.enum(['sonnet', 'opus', 'haiku']).optional(),\n run_in_background: z.boolean().optional(),\n name: z.string().optional(),\n team_name: z.string().optional(),\n mode: z\n .enum([\n 'acceptEdits',\n 'auto',\n 'bypassPermissions',\n 'default',\n 'dontAsk',\n 'plan',\n ])\n .optional(),\n isolation: z.literal('worktree').optional(),\n }),\n }),\n TaskCreate: tool({\n description: 'Create a task in the session-local task list',\n inputSchema: z.object({\n subject: z.string(),\n description: z.string(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskGet: tool({\n description: 'Retrieve a task by id',\n inputSchema: z.object({ taskId: z.string() }),\n }),\n TaskUpdate: tool({\n description: 'Update fields of an existing task',\n inputSchema: z.object({\n taskId: z.string(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .union([\n z.enum(['pending', 'in_progress', 'completed']),\n z.literal('deleted'),\n ])\n .optional(),\n addBlocks: z.array(z.string()).optional(),\n addBlockedBy: z.array(z.string()).optional(),\n owner: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskList: tool({\n description: 'Return all tasks in the session-local task list',\n inputSchema: z.object({}),\n }),\n TaskStop: tool({\n description: 'Stop a running background task by id',\n inputSchema: z.object({\n task_id: z.string().optional(),\n shell_id: z.string().optional(),\n }),\n }),\n TaskOutput: tool({\n description: 'Poll for output from a background task',\n inputSchema: z.object({\n task_id: z.string(),\n block: z.boolean(),\n timeout: z.number(),\n }),\n }),\n Monitor: {\n ...tool({\n description: 'Run and monitor a shell command or WebSocket',\n inputSchema: z.object({\n description: z.string().optional(),\n timeout_ms: z.number().optional(),\n persistent: z.boolean().optional(),\n command: z.string().optional(),\n ws: z\n .object({\n url: z.string(),\n protocols: z.array(z.string()).optional(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n ListMcpResources: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ListMcpResourcesTool: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResource: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceTool: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceDirTool: {\n ...tool({\n description: 'List direct children of an MCP directory resource',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n RefreshMcpTools: {\n ...tool({\n description: 'Refresh tools from one or all connected MCP servers',\n inputSchema: z.object({ server: z.string().optional() }),\n }),\n toolUseKind: 'readonly',\n },\n ExitPlanMode: tool({\n description: 'Exit plan mode with optional permission approvals',\n inputSchema: z.looseObject({\n allowedPrompts: z\n .array(\n z.object({\n tool: z.literal('Bash'),\n prompt: z.string(),\n }),\n )\n .optional(),\n }),\n }),\n EnterPlanMode: {\n ...tool({\n description: 'Enter plan mode',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n EnterWorktree: tool({\n description: 'Create or enter an isolated git worktree',\n inputSchema: z.object({\n name: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ExitWorktree: tool({\n description: 'Exit the current worktree session',\n inputSchema: z.object({\n action: z.enum(['keep', 'remove']),\n discard_changes: z.boolean().optional(),\n }),\n }),\n AskUserQuestion: tool({\n description: 'Ask the user multiple-choice questions via a structured UI',\n inputSchema: z.object({\n questions: z\n .array(\n z.object({\n question: z.string(),\n header: z.string(),\n options: z.array(\n z.object({\n label: z.string(),\n description: z.string(),\n preview: z.string().optional(),\n }),\n ),\n multiSelect: z.boolean(),\n }),\n )\n .min(1)\n .max(4),\n answers: z.record(z.string(), z.string()).optional(),\n annotations: z\n .record(\n z.string(),\n z.object({\n preview: z.string().optional(),\n notes: z.string().optional(),\n }),\n )\n .optional(),\n metadata: z.object({ source: z.string().optional() }).optional(),\n }),\n }),\n Skill: {\n ...tool({\n description: 'Activate a skill by name',\n inputSchema: z.object({\n skill: z.string(),\n args: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ToolSearch: tool({\n description:\n 'Search deferred MCP / catalog tools so the model can load them on demand',\n inputSchema: z.object({\n query: z.string(),\n max_results: z.number().optional(),\n }),\n }),\n Artifact: {\n ...tool({\n description: 'Publish or list claude.ai artifacts',\n inputSchema: z.object({\n action: z.enum(['publish', 'list']).optional(),\n file_path: z.string().optional(),\n favicon: z.string().optional(),\n limit: z.number().optional(),\n scope: z.enum(['mine', 'shared', 'all']).optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n label: z.string().optional(),\n url: z.string().optional(),\n force: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronCreate: {\n ...tool({\n description: 'Schedule a recurring or one-shot prompt',\n inputSchema: z.object({\n cron: z.string(),\n prompt: z.string(),\n recurring: z.boolean().optional(),\n durable: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronDelete: {\n ...tool({\n description: 'Delete a scheduled prompt by id',\n inputSchema: z.object({ id: z.string() }),\n }),\n toolUseKind: 'edit',\n },\n CronList: {\n ...tool({\n description: 'List scheduled prompts for the current session',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n DesignSync: {\n ...tool({\n description: 'Read or update claude.ai Design projects',\n inputSchema: z.object({\n method: z.enum([\n 'list_projects',\n 'get_project',\n 'list_files',\n 'get_file',\n 'finalize_plan',\n 'write_files',\n 'delete_files',\n 'register_assets',\n 'unregister_assets',\n 'create_project',\n 'report_validate',\n ]),\n projectId: z.string().optional(),\n path: z.string().optional(),\n writes: z.array(z.string()).max(256).optional(),\n deletes: z.array(z.string()).max(256).optional(),\n planId: z.string().optional(),\n files: z\n .array(\n z.object({\n path: z.string(),\n localPath: z.string().optional(),\n data: z.string().optional(),\n encoding: z.literal('base64').optional(),\n mimeType: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n paths: z.array(z.string()).max(256).optional(),\n name: z.string().optional(),\n assets: z\n .array(\n z.object({\n name: z.string(),\n path: z.string(),\n subtitle: z.string().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number().optional(),\n })\n .optional(),\n group: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n localDir: z.string().optional(),\n counts: z\n .object({\n total: z.number(),\n bad: z.number(),\n thin: z.number(),\n variantsIdentical: z.number(),\n iterations: z.number(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n LSP: {\n ...tool({\n description: 'Query a language server for code intelligence',\n inputSchema: z.object({\n operation: z.enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n ]),\n filePath: z.string(),\n line: z.number().int().positive(),\n character: z.number().int().positive(),\n query: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n PowerShell: {\n ...tool({\n description: 'Execute a PowerShell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n PushNotification: {\n ...tool({\n description: 'Send a notification for proactive or scheduled work',\n inputSchema: z.object({\n message: z.string(),\n status: z.literal('proactive'),\n }),\n }),\n toolUseKind: 'edit',\n },\n RemoteTrigger: {\n ...tool({\n description: 'List, manage, or run a claude.ai Routine trigger',\n inputSchema: z.object({\n action: z.enum(['list', 'get', 'create', 'update', 'run']),\n trigger_id: z.string().optional(),\n body: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n ReportFindings: {\n ...tool({\n description: 'Return verified code-review findings',\n inputSchema: z.object({\n level: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n findings: z\n .array(\n z.object({\n file: z.string(),\n line: z.number().optional(),\n summary: z.string(),\n short_summary: z.string().optional(),\n failure_scenario: z.string(),\n category: z.string().optional(),\n verdict: z.enum(['CONFIRMED', 'PLAUSIBLE']).optional(),\n outcome: z\n .enum(['fixed', 'skipped', 'no_change_needed'])\n .optional(),\n }),\n )\n .max(32),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ScheduleWakeup: {\n ...tool({\n description: 'Schedule or stop the next iteration of a dynamic loop',\n inputSchema: z.object({\n delaySeconds: z.number().optional(),\n reason: z.string().optional(),\n prompt: z.string().optional(),\n stop: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendMessage: {\n ...tool({\n description: 'Send a plain-text or protocol message to another agent',\n inputSchema: z.object({\n to: z.string(),\n summary: z.string().max(200).optional(),\n message: z.union([z.string(), structuredTeamMessageSchema]),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendUserFile: {\n ...tool({\n description: 'Send one or more files to the user',\n inputSchema: z.object({\n files: z.union([z.string(), z.array(z.string()).min(1)]),\n caption: z.string().optional(),\n status: z.enum(['normal', 'proactive']),\n display: z.enum(['render', 'attach']).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ShareOnboardingGuide: {\n ...tool({\n description: 'Create, update, inspect, or delete an onboarding guide',\n inputSchema: z.object({\n mode: z.enum(['check', 'update', 'create', 'delete']).optional(),\n short_code: z\n .string()\n .regex(/^[A-Za-z0-9_-]{1,64}$/)\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n WaitForMcpServers: {\n ...tool({\n description: 'Wait for MCP servers that are still connecting',\n inputSchema: z.object({\n servers: z.array(z.string()).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n Workflow: {\n ...tool({\n description: 'Run or resume a dynamic multi-agent workflow',\n inputSchema: z.object({\n script: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n title: z.string().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scriptPath: z.string().optional(),\n resumeFromRunId: z.string().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\n/*\n * Bootstrap is derived state stored under the sandbox's default working\n * directory so snapshot-capable providers can preserve the installed CLI,\n * bridge, and recipe marker without requiring root filesystem access.\n *\n * The session work dir (`startOpts.sessionWorkDir`) and the bridge-state dir\n * derived from `sandboxSession.defaultWorkingDirectory` both live under the sandbox's\n * default working directory — the provider's persistent mount — so the\n * workdir's CLI state (Claude's `~/.claude/projects/<dir>/*.jsonl` thread\n * history is keyed by working directory) and the bridge state files survive\n * both detach -> attach/replay and stop -> snapshot -> resume cycles.\n */\nconst BOOTSTRAP_DIR = '.harness-bootstrap/claude-code';\n\n/**\n * Live bridge coordinates returned by `doDetach()` and `doSuspendTurn()`. A\n * future process uses them to reopen a socket to the still-running bridge\n * (`attach`) instead of re-spawning it. Absent on a `doStop()` payload.\n */\nconst claudeCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\n/**\n * Schema for the adapter-specific portion of lifecycle state `data`.\n *\n * A `doStop()` payload is structurally empty (`{}`): the framework derives the\n * sandbox via `provider.resumeSession({ sessionId })`, and the Claude SDK's\n * `{ continue: true }` flag rehydrates the thread from the workdir. A\n * `doDetach()` payload additionally carries `bridge` coordinates for\n * cross-process `attach`. A loose object keeps both shapes valid.\n */\nconst claudeCodeResumeStateSchema = z.looseObject({\n bridge: claudeCodeBridgeCoordsSchema.optional(),\n});\n\ntype ClaudeCodeBridgeCoords = z.infer<typeof claudeCodeBridgeCoordsSchema>;\n\nexport function createClaudeCode(\n settings: ClaudeCodeHarnessSettings = {},\n): HarnessV1<typeof CLAUDE_CODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'Claude Code MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n const thinking = settings.thinking ?? {\n type: 'adaptive',\n display: 'summarized',\n };\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'claude-code',\n builtinTools: CLAUDE_CODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: true,\n lifecycleStateSchema: claudeCodeResumeStateSchema,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, bridge] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'claude-code',\n bootstrapDir: BOOTSTRAP_DIR,\n files: [\n { path: `${BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n { path: `${BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command:\n 'if [ -f node_modules/@anthropic-ai/claude-code/install.cjs ]; then node node_modules/@anthropic-ai/claude-code/install.cjs; fi && ./node_modules/.bin/claude --version',\n },\n ],\n };\n return cachedBootstrap;\n },\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const session = sandboxSession.restricted();\n const sandboxId = sandboxSession.id;\n const bootstrapDir = posix.resolve(\n sandboxSession.defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const coords = isResume\n ? (lifecycleState?.data as { bridge?: ClaudeCodeBridgeCoords })?.bridge\n : undefined;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${sandboxSession.defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n\n // Normalize each forwarded bridge diagnostics frame into the general\n // `HarnessV1Diagnostic` and report it. The adapter does no telemetry work\n // beyond this transport→emission mapping.\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'claude-code',\n sessionId: startOpts.sessionId,\n });\n\n // Builds the `connect` thunk a `SandboxChannel` re-invokes on every\n // (re)connect: open the socket, then wait for `bridge-hello` so the\n // end-to-end link is proven live before any frame is sent.\n const buildConnect = (wsUrl: string) => async (): Promise<WebSocket> => {\n return openBridgeWebSocket({ wsUrl, timeoutMs });\n };\n\n /*\n * Rung 1 — ATTACH. When lifecycle state carries live bridge coordinates,\n * try to reopen a socket to the still-running bridge. Parked sessions wait\n * for the next `start`; suspended turns request replay of everything past\n * the persisted cursor. No spawn, no fresh token (the existing bridge\n * still authorises the persisted one). If the bridge is gone the open\n * throws and we fall through to a spawn-based recovery.\n */\n if (coords) {\n try {\n const attachUrl =\n (await sandboxSession.getPortUrl({\n port: coords.port,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(coords.token)}`;\n const attachChannel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(attachUrl),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n // The live bridge was spawned by another process; this one owns no\n // process handle. The session lifecycle method decides whether the\n // sandbox is left running, stopped, or destroyed.\n proc: undefined,\n model: settings.model,\n maxTurns: settings.maxTurns,\n env: settings.env,\n thinking,\n isResume: true,\n continueOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n skills: startOpts.skills ?? [],\n mcpServers: settings.mcpServers,\n });\n } catch {\n // Bridge no longer reachable — recover by respawning below.\n }\n }\n\n /*\n * Rungs 2/3 — REPLAY vs RERUN. Respawn the bridge. `replay` is only sound\n * for `continueFrom`: those coordinates include the cursor the on-disk\n * log is replayed *from*. `resumeFrom` is a between-turn resume; even when\n * it carries bridge coordinates, replaying the previous turn would\n * re-deliver stale events into the next turn. Those resumes always `rerun`\n * when attach is unavailable (the CLI continues its own thread from the\n * workdir snapshot via `continue: true`).\n */\n let respawnStrategy: ClaudeCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n session.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const sandboxHomeDir =\n startOpts.skills && startOpts.skills.length > 0\n ? await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const port = resolveBridgePort(sandboxSession, settings.port);\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId);\n const authEnv = resolveClaudeCodeEnv(settings.auth);\n const env = {\n ...authEnv,\n /*\n * The Claude Agent SDK does not expose arbitrary model-request\n * headers. It reads this environment variable and sends the value as\n * `x-client-app`, while also appending `client-app/<value>` to\n * `User-Agent`, so this is the attribution path for AI Gateway.\n */\n ...(authEnv.AI_GATEWAY_BASE_URL\n ? { CLAUDE_AGENT_SDK_CLIENT_APP: CLAUDE_CODE_CLIENT_APP }\n : {}),\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(sandboxHomeDir ? { HOME: sandboxHomeDir } : {}),\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n /*\n * On a fresh start the workdir, skill files, and bridge-state directory\n * must be created. On any resume they already exist in the\n * sandbox snapshot, so skip the rewrite. The env is sent fresh on every\n * spawn — `BRIDGE_CHANNEL_TOKEN` rotates per start.\n */\n if (respawnStrategy === undefined) {\n await session.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOpts.abortSignal,\n });\n\n if (startOpts.skills && startOpts.skills.length > 0) {\n if (!sandboxHomeDir) {\n throw new Error('Unable to resolve sandbox HOME directory.');\n }\n await writeClaudeCodeSkills({\n sandbox: session,\n homeDir: sandboxHomeDir,\n skills: startOpts.skills,\n abortSignal: startOpts.abortSignal,\n });\n }\n }\n\n await markBridgeStarting({\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'claude-code',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await session.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const bridgeStartupStderr: string[] = [];\n const bridgeStartupStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'claude-code',\n collectTail: bridgeStartupStderr,\n });\n void bridgeStartupStderrDone;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'claude-code',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const wsUrl =\n (await sandboxSession.getPortUrl({\n port: boundPort,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(token)}`;\n\n const channel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(wsUrl),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n // In replay mode the respawned bridge reloaded the finished turn from\n // disk; seed the cursor and resume so it streams the tail (incl.\n // `finish`) rather than starting empty.\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model: settings.model,\n maxTurns: settings.maxTurns,\n env: settings.env,\n thinking,\n isResume: respawnStrategy !== undefined,\n continueOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n skills: startOpts.skills ?? [],\n mcpServers: settings.mcpServers,\n });\n },\n };\n}\n\nfunction resolveBridgePort(\n sandboxSession: HarnessV1NetworkSandboxSession,\n override: number | undefined,\n): number {\n if (override !== undefined) return override;\n if (sandboxSession.ports.length > 0) return sandboxSession.ports[0];\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The claude-code harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createClaudeCode({ port })`.',\n });\n}\n\n/**\n * Materialise skill files into\n * `$HOME/.claude/skills/<name>/SKILL.md`. The `claude` CLI\n * auto-discovers skills from that directory on startup, so the files have to\n * be in place before the bridge is spawned without mutating the session\n * workdir. Each file uses the YAML-frontmatter shape the CLI expects.\n */\nasync function writeClaudeCodeSkills({\n sandbox,\n homeDir,\n skills,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n homeDir: string;\n skills: ReadonlyArray<HarnessV1Skill>;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n await writeHarnessSkills({\n sandbox,\n rootDir: `${homeDir}/.claude/skills`,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid Claude Code skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid Claude Code skill file path for ${skillName}: ${filePath}`,\n trailingNewline: true,\n });\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n\n/**\n * Wait for the bridge's `bridge-hello` message to arrive on the freshly\n * opened WebSocket before any other host-side code touches it.\n *\n * Some sandbox runtimes (Vercel in particular) complete the WS upgrade\n * with the host long before the connection is actually forwarded to the\n * sandbox-side bridge. Anything sent in that gap is silently dropped —\n * including the `start` message we send next. The bridge emits\n * `bridge-hello` the instant it accepts the connection, so receiving it\n * is the only reliable evidence that the end-to-end link is live.\n */\nfunction openWebSocketAndWaitForBridgeHello({\n url,\n openTimeoutMs,\n getHelloTimeoutMs,\n}: {\n url: string;\n openTimeoutMs: number;\n getHelloTimeoutMs: () => number;\n}): Promise<WebSocket> {\n return new Promise<WebSocket>((resolve, reject) => {\n const ws = new WebSocket(url);\n let opened = false;\n let sawBridgeHello = false;\n let settled = false;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let helloTimer: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (openTimer) clearTimeout(openTimer);\n if (helloTimer) clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (err?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (err) {\n try {\n ws.terminate();\n } catch {}\n reject(err);\n } else {\n resolve(ws);\n }\n };\n const tryResolve = () => {\n if (opened && sawBridgeHello) settle();\n };\n const startHelloTimer = () => {\n if (helloTimer) return;\n const helloTimeoutMs = getHelloTimeoutMs();\n helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `claude-code bridge did not send bridge-hello within ${helloTimeoutMs}ms`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n };\n const onOpen = () => {\n opened = true;\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = undefined;\n }\n startHelloTimer();\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success || settled) return;\n const value = parsed.value;\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === 'bridge-hello'\n ) {\n sawBridgeHello = true;\n tryResolve();\n }\n })();\n };\n const onClose = () => {\n settle(\n new Error('claude-code bridge closed before sending bridge-hello'),\n );\n };\n const onError = (err: Error) => settle(err);\n openTimer = setTimeout(\n () =>\n settle(new Error(`WebSocket open timed out after ${openTimeoutMs}ms`)),\n openTimeoutMs,\n );\n openTimer.unref?.();\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n });\n}\n\nasync function openBridgeWebSocket({\n wsUrl,\n timeoutMs,\n}: {\n wsUrl: string;\n timeoutMs: number;\n}): Promise<WebSocket> {\n const deadline = Date.now() + timeoutMs;\n let attempt = 0;\n let lastError: unknown;\n\n while (Date.now() < deadline) {\n attempt++;\n try {\n const remaining = Math.max(1, deadline - Date.now());\n return await openWebSocketAndWaitForBridgeHello({\n url: wsUrl,\n openTimeoutMs: Math.min(10_000, remaining),\n getHelloTimeoutMs: () =>\n Math.min(5_000, Math.max(1, deadline - Date.now())),\n });\n } catch (err) {\n lastError = err;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(250 * attempt, 1_000, remaining));\n }\n }\n\n throw new Error(\n `claude-code bridge did not complete WebSocket handshake within ${timeoutMs}ms after ${attempt} attempt(s). Last error: ${formatUnknownError(lastError)}`,\n );\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n\nfunction formatUnknownError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n maxTurns,\n env,\n thinking,\n isResume,\n continueOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n skills,\n mcpServers,\n}: {\n sessionId: string;\n channel: ClaudeCodeChannel;\n /** Undefined on `attach` — the live bridge was spawned by another process. */\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n maxTurns: number | undefined;\n env: Readonly<Record<string, string>> | undefined;\n thinking: ClaudeCodeThinkingConfig;\n isResume: boolean;\n continueOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n mcpServers: Record<string, unknown> | undefined;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n /*\n * Force the Claude SDK's `continue: true` on the first prompt only when the\n * bridge was respawned (rerun/replay): a fresh bridge process treats its\n * first turn as new, so it must be told to rehydrate the workdir thread. An\n * `attach`ed bridge is already past its first turn and continues on its own.\n */\n let pendingResumeFlag = continueOnFirstPrompt;\n\n /*\n * Wire the channel into one turn's worth of events and return the control\n * surface. Shared by `doPromptTurn` (which sends a `start` afterwards) and\n * `doContinueTurn` (which attaches to an already-running/replayed turn, or sends\n * a rerun `start`). The only difference between the two entry points is the\n * `start` message, not the listener/abort/settle plumbing.\n */\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'finish-step',\n 'raw',\n ] as const;\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n /*\n * A `'suspended'` close is a graceful slice-boundary freeze the host\n * initiated (`doSuspendTurn`): the turn keeps running in the bridge and its\n * tail is replayed to the next process, so wind this turn down cleanly\n * rather than failing it. Any other close mid-turn is an unexpected drop.\n */\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('claude-code bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n submitUserMessage: async text => {\n channel.send({ type: 'user-message', text });\n },\n done,\n };\n };\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n\n const startMessage = {\n type: 'start' as const,\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(skills.length > 0\n ? { skills: skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(pendingResumeFlag ? { continue: true } : {}),\n };\n pendingResumeFlag = false;\n channel.send(startMessage);\n\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n\n /*\n * attach / replay: the still-running (or disk-replayed) turn streams into\n * the wired listeners — `doStart` opened the channel with `{ resume: true }`\n * so the bridge replays everything past the persisted cursor (including a\n * `finish` if the turn ended during the gap). No `start` is sent: issuing\n * one would clear the bridge's replay log and begin a new turn. Lossless.\n *\n * rerun: the bridge was respawned with no in-flight turn to attach to, so\n * re-drive the runtime's own thread from the workdir snapshot via\n * `continue: true`. Lossy — work in flight at the suspension is\n * recomputed. This is the rare bridge-died fallback; the common slice path\n * is `attach`.\n */\n if (rerunContinue) {\n pendingResumeFlag = false;\n channel.send({\n type: 'start' as const,\n /*\n * A continuation nudge rather than an empty prompt: `continue: true`\n * rehydrates the prior thread, and this is the new user turn that\n * drives it forward. It must be non-empty — an empty text block is\n * rejected by the Anthropic API once the SDK stamps it with\n * `cache_control`.\n */\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(skills.length > 0\n ? { skills: skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n continue: true,\n });\n }\n\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n /*\n * Claude Code has no SDK/control method for compaction — the supported\n * trigger is the `/compact` slash command submitted as user input. Ride\n * the existing user-message rail; the bridge feeds it into the streaming\n * query input and Claude's native compaction handles the rest, emitting a\n * `compact_boundary` + `PostCompact` we observe as a `compaction` event.\n */\n const text =\n customInstructions && customInstructions.trim()\n ? `/compact ${customInstructions.trim()}`\n : '/compact';\n channel.send({ type: 'user-message', text });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n // Tell the channel we are tearing down so the bridge's post-shutdown\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n /*\n * If the bridge's channel already closed (e.g. mid-turn WS drop)\n * there is no one to acknowledge a `stop` message. Synthesize an empty\n * payload — for Claude Code the resume state structurally is `{}`\n * (the conversation lives in the workdir, captured by the sandbox\n * snapshot during the subsequent `sandboxSession.stop()`), so we\n * lose nothing by skipping the round-trip.\n */\n // Tell the channel we are tearing down so the bridge's post-stop\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `claude-code session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n // The bridge exits itself after sending bridge-stop. Give\n // it a moment, then ensure the process is reaped and the channel\n // closed.\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n /*\n * Freeze the host at a precise cursor without stopping the active model\n * turn. `channel.suspend` stops processing inbound frames, drains what\n * was already dispatched, then closes the host socket with reason\n * `'suspended'`. The bridge keeps the turn running and accumulates events\n * past the cursor for the next slice to replay. The sandbox process is\n * deliberately left alive.\n */\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n };\n}\n\n/*\n * Reduce a `HarnessV1Prompt` to the plain user text the bridge forwards\n * to the Claude SDK. File and image parts on the message are not yet\n * supported by the underlying runtime — throw rather than silently drop\n * them so callers learn about the gap instead of seeing mysteriously\n * truncated prompts.\n */\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message: `The claude-code harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { execFileSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { getAiGatewayAuthFromEnv } from '@ai-sdk/harness/utils';\n\nexport type ClaudeCodeAuthOptions = {\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n};\n\n/**\n * Resolve the environment-variable blob the bridge needs to authenticate\n * with Anthropic (directly or via the Vercel AI Gateway). Precedence:\n *\n * 1. Explicit `auth.anthropic` — pin to direct Anthropic auth.\n * 2. Explicit `auth.gateway` — pin to gateway-routed auth.\n * 3. Auto-detect from the host process env: gateway first\n * (`AI_GATEWAY_API_KEY` / `VERCEL_OIDC_TOKEN`), then direct\n * (`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN`).\n */\nexport type ResolveClaudeCodeEnvOptions = {\n /**\n * Returns an API key from a custom source (e.g. a password manager).\n * Used as the last-resort fallback in the auto-detect branch when no\n * static env vars or explicit auth are configured. Defaults to running\n * the `apiKeyHelper` command from `~/.claude/settings.json`, matching\n * the `claude` CLI's own behaviour.\n */\n readApiKeyHelper?: () => string | undefined;\n};\n\nexport function resolveClaudeCodeEnv(\n auth: ClaudeCodeAuthOptions | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n options: ResolveClaudeCodeEnvOptions = {},\n): Record<string, string> {\n const readApiKey = options.readApiKeyHelper ?? readApiKeyHelper;\n if (auth?.anthropic) {\n return pickAnthropic({ explicit: auth.anthropic, processEnv, readApiKey });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (auth?.gateway) {\n return pickGateway({\n explicit: auth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({\n explicit: {},\n gatewayAuthFromEnv,\n });\n }\n\n return pickAnthropic({ processEnv, readApiKey });\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n readApiKey,\n}: {\n explicit?: NonNullable<ClaudeCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n readApiKey: () => string | undefined;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const helperKey = explicit ? undefined : readApiKey();\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY ?? helperKey;\n const authToken =\n explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN ?? helperKey;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\n/**\n * Read the `apiKeyHelper` setting from `~/.claude/settings.json` and run\n * it. The `claude` CLI uses this hook to fetch credentials from password\n * managers and similar tools; mirroring it here lets users with that\n * setup run the harness without having to set `ANTHROPIC_API_KEY`\n * explicitly.\n */\nfunction readApiKeyHelper(): string | undefined {\n const home = homedir();\n if (!home) return undefined;\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return undefined;\n }\n let settings: { apiKeyHelper?: unknown };\n try {\n settings = JSON.parse(raw);\n } catch {\n return undefined;\n }\n const command = settings.apiKeyHelper;\n if (typeof command !== 'string' || command.length === 0) return undefined;\n try {\n const output = execFileSync('sh', ['-c', command], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<ClaudeCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n const baseUrl = explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl;\n const env: Record<string, string> = {};\n if (apiKey) {\n env.AI_GATEWAY_API_KEY = apiKey;\n env.ANTHROPIC_API_KEY = apiKey;\n }\n env.AI_GATEWAY_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\n/*\n * Claude Code's bridge wire protocol. The outbound events, transport frames,\n * shared inbound commands, and `bridge-ready` line all come from the shared\n * `@ai-sdk/harness` protocol — the only Claude-specific piece is the `start`\n * payload, which carries Claude SDK configuration.\n */\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nconst thinkingDisplaySchema = z.enum(['summarized', 'omitted']).optional();\n\nconst thinkingSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('adaptive'),\n display: thinkingDisplaySchema,\n }),\n z.object({\n type: z.literal('enabled'),\n display: thinkingDisplaySchema,\n }),\n z.object({ type: z.literal('disabled') }),\n]);\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n instructions: z.string().optional(),\n thinking: thinkingSchema,\n maxTurns: z.number().optional(),\n env: z.record(z.string(), z.string()).optional(),\n skills: z.array(z.string()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n // Resume signal. When true, the bridge passes `{ continue: true }` to the\n // Claude SDK so the in-workdir thread state is rehydrated. The host sets this\n // on the first prompt after a cross-process resume.\n continue: z.boolean().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createClaudeCode } from './claude-code-harness';\n\n/**\n * Default `claude-code` harness instance with no overrides — suitable for the\n * common case where the underlying `claude` CLI's defaults are fine.\n * Equivalent to `createClaudeCode()`.\n */\nexport const claudeCode = createClaudeCode();\n\nexport { createClaudeCode } from './claude-code-harness';\nexport { VERSION } from './version';\nexport type { ClaudeCodeHarnessSettings } from './claude-code-harness';\nexport type { ClaudeCodeAuthOptions } from './claude-code-auth';\nexport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\n"],"mappings":"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","names":["z","z","wsUrl","proc"]}
1
+ {"version":3,"sources":["../src/claude-code-harness.ts","../src/claude-code-auth.ts","../src/claude-code-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { posix } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n commonTool,\n harnessV1DiagnosticFromBridgeFrame,\n HarnessCapabilityUnsupportedError,\n type HarnessV1,\n type HarnessV1Bootstrap,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1BuiltinTool,\n type HarnessV1ContinueTurnState,\n type HarnessV1DebugConfig,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResumeSessionState,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n classifyDiskLog,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxSession,\n type Experimental_SandboxProcess,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n resolveClaudeCodeEnv,\n type ClaudeCodeAuthOptions,\n} from './claude-code-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './claude-code-bridge-protocol';\nimport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\nimport { VERSION } from './version';\n\ntype ClaudeCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype ClaudeCodeRespawnStrategy = 'replay' | 'rerun';\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst CLAUDE_CODE_CLIENT_APP = `ai-sdk/harness-claude-code/${VERSION}`;\n\nexport type ClaudeCodeHarnessSettings = {\n readonly auth?: ClaudeCodeAuthOptions;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Anthropic model id the underlying `claude` CLI should use. Leaving this\n * unset defers to the CLI's default.\n */\n readonly model?: string;\n /**\n * Hard cap on how many internal turns the CLI can take before yielding\n * back to the caller. Unset means the CLI's default.\n */\n readonly maxTurns?: number;\n /**\n * Environment variables for the Claude Code process. These values are\n * merged over the sandbox bridge process environment.\n */\n readonly env?: Readonly<Record<string, string>>;\n /**\n * Controls extended-thinking behavior and whether reasoning is summarized or\n * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.\n */\n readonly thinking?: ClaudeCodeThinkingConfig;\n /**\n * Controls how much effort Claude applies when adaptive thinking is enabled.\n * Unset uses the Claude Agent SDK default.\n */\n readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n /**\n * Override the port the bridge binds inside the sandbox. By default the\n * adapter uses the first port the sandbox declares via `sandbox.ports`.\n * Only set this if the sandbox declares multiple ports and the first one\n * is reserved for something else.\n */\n readonly port?: number;\n /** Maximum milliseconds to wait for the bridge to advertise its port. Defaults to 120000. */\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\n/*\n * Every native tool the Claude Code CLI can invoke, declared as a `ToolSet`\n * keyed by what the bridge emits as `toolName` on the wire\n * (`commonName ?? nativeName`). Schemas are transcribed from the generated\n * `sdk-tools.d.ts` and the conditionally registered tool definitions in the\n * pinned Claude Code executable.\n *\n * `MCP` (the generic proxy tool inside the Claude Code SDK) is intentionally\n * omitted — the bridge filters out `mcp__harness-tools__*` tool names before\n * emitting them, and other MCP invocations come through with their own\n * server-tool names rather than the literal `'Mcp'` token.\n */\nconst listMcpResourcesInputSchema = z.object({\n server: z.string().optional(),\n});\n\nconst readMcpResourceInputSchema = z.object({\n server: z.string(),\n uri: z.string(),\n});\n\nconst structuredTeamMessageSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('shutdown_request'),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('shutdown_response'),\n request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('plan_approval_response'),\n request_id: z.string(),\n approve: z.boolean(),\n feedback: z.string().optional(),\n }),\n]);\n\nconst CLAUDE_CODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'Read',\n toolUseKind: 'readonly',\n description: 'Read file contents (text, image, PDF, notebook)',\n inputSchema: z.object({\n file_path: z.string(),\n offset: z.number().optional(),\n limit: z.number().optional(),\n pages: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'Write',\n toolUseKind: 'edit',\n description: 'Overwrite or create a file at an absolute path',\n inputSchema: z.object({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'Edit',\n toolUseKind: 'edit',\n description: 'Edit a file by exact string replacement',\n inputSchema: z.object({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'Bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'Glob',\n toolUseKind: 'readonly',\n description: 'Fast file-pattern search using glob syntax',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'Grep',\n toolUseKind: 'readonly',\n description: 'Regex search over file contents via ripgrep',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n glob: z.string().optional(),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .optional(),\n '-B': z.number().optional(),\n '-A': z.number().optional(),\n '-C': z.number().optional(),\n context: z.number().optional(),\n '-n': z.boolean().optional(),\n '-i': z.boolean().optional(),\n '-o': z.boolean().optional(),\n type: z.string().optional(),\n head_limit: z.number().optional(),\n offset: z.number().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'WebSearch',\n toolUseKind: 'readonly',\n description: 'Issue web search queries with optional domain filters',\n inputSchema: z.object({\n query: z.string(),\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n }),\n }),\n\n WebFetch: tool({\n description: 'Fetch a URL and run a prompt against its content',\n inputSchema: z.object({\n url: z.string(),\n prompt: z.string(),\n }),\n }),\n NotebookEdit: tool({\n description: 'Edit, insert, or delete a Jupyter notebook cell',\n inputSchema: z.object({\n notebook_path: z.string(),\n new_source: z.string(),\n cell_id: z.string().optional(),\n cell_type: z.enum(['code', 'markdown']).optional(),\n edit_mode: z.enum(['replace', 'insert', 'delete']).optional(),\n }),\n }),\n TodoWrite: tool({\n description: 'Replace the session todo list',\n inputSchema: z.object({\n todos: z.array(\n z.object({\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n ),\n }),\n }),\n Agent: tool({\n description: 'Spawn a subagent with a task',\n inputSchema: z.object({\n description: z.string(),\n prompt: z.string(),\n subagent_type: z.string().optional(),\n model: z.enum(['sonnet', 'opus', 'haiku']).optional(),\n run_in_background: z.boolean().optional(),\n name: z.string().optional(),\n team_name: z.string().optional(),\n mode: z\n .enum([\n 'acceptEdits',\n 'auto',\n 'bypassPermissions',\n 'default',\n 'dontAsk',\n 'plan',\n ])\n .optional(),\n isolation: z.literal('worktree').optional(),\n }),\n }),\n TaskCreate: tool({\n description: 'Create a task in the session-local task list',\n inputSchema: z.object({\n subject: z.string(),\n description: z.string(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskGet: tool({\n description: 'Retrieve a task by id',\n inputSchema: z.object({ taskId: z.string() }),\n }),\n TaskUpdate: tool({\n description: 'Update fields of an existing task',\n inputSchema: z.object({\n taskId: z.string(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .union([\n z.enum(['pending', 'in_progress', 'completed']),\n z.literal('deleted'),\n ])\n .optional(),\n addBlocks: z.array(z.string()).optional(),\n addBlockedBy: z.array(z.string()).optional(),\n owner: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskList: tool({\n description: 'Return all tasks in the session-local task list',\n inputSchema: z.object({}),\n }),\n TaskStop: tool({\n description: 'Stop a running background task by id',\n inputSchema: z.object({\n task_id: z.string().optional(),\n shell_id: z.string().optional(),\n }),\n }),\n TaskOutput: tool({\n description: 'Poll for output from a background task',\n inputSchema: z.object({\n task_id: z.string(),\n block: z.boolean(),\n timeout: z.number(),\n }),\n }),\n Monitor: {\n ...tool({\n description: 'Run and monitor a shell command or WebSocket',\n inputSchema: z.object({\n description: z.string().optional(),\n timeout_ms: z.number().optional(),\n persistent: z.boolean().optional(),\n command: z.string().optional(),\n ws: z\n .object({\n url: z.string(),\n protocols: z.array(z.string()).optional(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n ListMcpResources: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ListMcpResourcesTool: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResource: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceTool: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceDirTool: {\n ...tool({\n description: 'List direct children of an MCP directory resource',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n RefreshMcpTools: {\n ...tool({\n description: 'Refresh tools from one or all connected MCP servers',\n inputSchema: z.object({ server: z.string().optional() }),\n }),\n toolUseKind: 'readonly',\n },\n ExitPlanMode: tool({\n description: 'Exit plan mode with optional permission approvals',\n inputSchema: z.looseObject({\n allowedPrompts: z\n .array(\n z.object({\n tool: z.literal('Bash'),\n prompt: z.string(),\n }),\n )\n .optional(),\n }),\n }),\n EnterPlanMode: {\n ...tool({\n description: 'Enter plan mode',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n EnterWorktree: tool({\n description: 'Create or enter an isolated git worktree',\n inputSchema: z.object({\n name: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ExitWorktree: tool({\n description: 'Exit the current worktree session',\n inputSchema: z.object({\n action: z.enum(['keep', 'remove']),\n discard_changes: z.boolean().optional(),\n }),\n }),\n AskUserQuestion: tool({\n description: 'Ask the user multiple-choice questions via a structured UI',\n inputSchema: z.object({\n questions: z\n .array(\n z.object({\n question: z.string(),\n header: z.string(),\n options: z.array(\n z.object({\n label: z.string(),\n description: z.string(),\n preview: z.string().optional(),\n }),\n ),\n multiSelect: z.boolean(),\n }),\n )\n .min(1)\n .max(4),\n answers: z.record(z.string(), z.string()).optional(),\n annotations: z\n .record(\n z.string(),\n z.object({\n preview: z.string().optional(),\n notes: z.string().optional(),\n }),\n )\n .optional(),\n metadata: z.object({ source: z.string().optional() }).optional(),\n }),\n }),\n Skill: {\n ...tool({\n description: 'Activate a skill by name',\n inputSchema: z.object({\n skill: z.string(),\n args: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ToolSearch: tool({\n description:\n 'Search deferred MCP / catalog tools so the model can load them on demand',\n inputSchema: z.object({\n query: z.string(),\n max_results: z.number().optional(),\n }),\n }),\n Artifact: {\n ...tool({\n description: 'Publish or list claude.ai artifacts',\n inputSchema: z.object({\n action: z.enum(['publish', 'list']).optional(),\n file_path: z.string().optional(),\n favicon: z.string().optional(),\n limit: z.number().optional(),\n scope: z.enum(['mine', 'shared', 'all']).optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n label: z.string().optional(),\n url: z.string().optional(),\n force: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronCreate: {\n ...tool({\n description: 'Schedule a recurring or one-shot prompt',\n inputSchema: z.object({\n cron: z.string(),\n prompt: z.string(),\n recurring: z.boolean().optional(),\n durable: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronDelete: {\n ...tool({\n description: 'Delete a scheduled prompt by id',\n inputSchema: z.object({ id: z.string() }),\n }),\n toolUseKind: 'edit',\n },\n CronList: {\n ...tool({\n description: 'List scheduled prompts for the current session',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n DesignSync: {\n ...tool({\n description: 'Read or update claude.ai Design projects',\n inputSchema: z.object({\n method: z.enum([\n 'list_projects',\n 'get_project',\n 'list_files',\n 'get_file',\n 'finalize_plan',\n 'write_files',\n 'delete_files',\n 'register_assets',\n 'unregister_assets',\n 'create_project',\n 'report_validate',\n ]),\n projectId: z.string().optional(),\n path: z.string().optional(),\n writes: z.array(z.string()).max(256).optional(),\n deletes: z.array(z.string()).max(256).optional(),\n planId: z.string().optional(),\n files: z\n .array(\n z.object({\n path: z.string(),\n localPath: z.string().optional(),\n data: z.string().optional(),\n encoding: z.literal('base64').optional(),\n mimeType: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n paths: z.array(z.string()).max(256).optional(),\n name: z.string().optional(),\n assets: z\n .array(\n z.object({\n name: z.string(),\n path: z.string(),\n subtitle: z.string().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number().optional(),\n })\n .optional(),\n group: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n localDir: z.string().optional(),\n counts: z\n .object({\n total: z.number(),\n bad: z.number(),\n thin: z.number(),\n variantsIdentical: z.number(),\n iterations: z.number(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n LSP: {\n ...tool({\n description: 'Query a language server for code intelligence',\n inputSchema: z.object({\n operation: z.enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n ]),\n filePath: z.string(),\n line: z.number().int().positive(),\n character: z.number().int().positive(),\n query: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n PowerShell: {\n ...tool({\n description: 'Execute a PowerShell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n PushNotification: {\n ...tool({\n description: 'Send a notification for proactive or scheduled work',\n inputSchema: z.object({\n message: z.string(),\n status: z.literal('proactive'),\n }),\n }),\n toolUseKind: 'edit',\n },\n RemoteTrigger: {\n ...tool({\n description: 'List, manage, or run a claude.ai Routine trigger',\n inputSchema: z.object({\n action: z.enum(['list', 'get', 'create', 'update', 'run']),\n trigger_id: z.string().optional(),\n body: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n ReportFindings: {\n ...tool({\n description: 'Return verified code-review findings',\n inputSchema: z.object({\n level: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n findings: z\n .array(\n z.object({\n file: z.string(),\n line: z.number().optional(),\n summary: z.string(),\n short_summary: z.string().optional(),\n failure_scenario: z.string(),\n category: z.string().optional(),\n verdict: z.enum(['CONFIRMED', 'PLAUSIBLE']).optional(),\n outcome: z\n .enum(['fixed', 'skipped', 'no_change_needed'])\n .optional(),\n }),\n )\n .max(32),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ScheduleWakeup: {\n ...tool({\n description: 'Schedule or stop the next iteration of a dynamic loop',\n inputSchema: z.object({\n delaySeconds: z.number().optional(),\n reason: z.string().optional(),\n prompt: z.string().optional(),\n stop: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendMessage: {\n ...tool({\n description: 'Send a plain-text or protocol message to another agent',\n inputSchema: z.object({\n to: z.string(),\n summary: z.string().max(200).optional(),\n message: z.union([z.string(), structuredTeamMessageSchema]),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendUserFile: {\n ...tool({\n description: 'Send one or more files to the user',\n inputSchema: z.object({\n files: z.union([z.string(), z.array(z.string()).min(1)]),\n caption: z.string().optional(),\n status: z.enum(['normal', 'proactive']),\n display: z.enum(['render', 'attach']).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ShareOnboardingGuide: {\n ...tool({\n description: 'Create, update, inspect, or delete an onboarding guide',\n inputSchema: z.object({\n mode: z.enum(['check', 'update', 'create', 'delete']).optional(),\n short_code: z\n .string()\n .regex(/^[A-Za-z0-9_-]{1,64}$/)\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n WaitForMcpServers: {\n ...tool({\n description: 'Wait for MCP servers that are still connecting',\n inputSchema: z.object({\n servers: z.array(z.string()).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n Workflow: {\n ...tool({\n description: 'Run or resume a dynamic multi-agent workflow',\n inputSchema: z.object({\n script: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n title: z.string().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scriptPath: z.string().optional(),\n resumeFromRunId: z.string().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\n/*\n * Bootstrap is derived state stored under the sandbox's default working\n * directory so snapshot-capable providers can preserve the installed CLI,\n * bridge, and recipe marker without requiring root filesystem access.\n *\n * The session work dir (`startOpts.sessionWorkDir`) and the bridge-state dir\n * derived from `sandboxSession.defaultWorkingDirectory` both live under the sandbox's\n * default working directory — the provider's persistent mount — so the\n * workdir's CLI state (Claude's `~/.claude/projects/<dir>/*.jsonl` thread\n * history is keyed by working directory) and the bridge state files survive\n * both detach -> attach/replay and stop -> snapshot -> resume cycles.\n */\nconst BOOTSTRAP_DIR = '.harness-bootstrap/claude-code';\n\n/**\n * Live bridge coordinates returned by `doDetach()` and `doSuspendTurn()`. A\n * future process uses them to reopen a socket to the still-running bridge\n * (`attach`) instead of re-spawning it. Absent on a `doStop()` payload.\n */\nconst claudeCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\n/**\n * Schema for the adapter-specific portion of lifecycle state `data`.\n *\n * A `doStop()` payload is structurally empty (`{}`): the framework derives the\n * sandbox via `provider.resumeSession({ sessionId })`, and the Claude SDK's\n * `{ continue: true }` flag rehydrates the thread from the workdir. A\n * `doDetach()` payload additionally carries `bridge` coordinates for\n * cross-process `attach`. A loose object keeps both shapes valid.\n */\nconst claudeCodeResumeStateSchema = z.looseObject({\n bridge: claudeCodeBridgeCoordsSchema.optional(),\n});\n\ntype ClaudeCodeBridgeCoords = z.infer<typeof claudeCodeBridgeCoordsSchema>;\n\nexport function createClaudeCode(\n settings: ClaudeCodeHarnessSettings = {},\n): HarnessV1<typeof CLAUDE_CODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'Claude Code MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n const thinking = settings.thinking ?? {\n type: 'adaptive',\n display: 'summarized',\n };\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'claude-code',\n builtinTools: CLAUDE_CODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: true,\n lifecycleStateSchema: claudeCodeResumeStateSchema,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, bridge] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'claude-code',\n bootstrapDir: BOOTSTRAP_DIR,\n files: [\n { path: `${BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n { path: `${BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command:\n 'if [ -f node_modules/@anthropic-ai/claude-code/install.cjs ]; then node node_modules/@anthropic-ai/claude-code/install.cjs; fi && ./node_modules/.bin/claude --version',\n },\n ],\n };\n return cachedBootstrap;\n },\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const session = sandboxSession.restricted();\n const sandboxId = sandboxSession.id;\n const bootstrapDir = posix.resolve(\n sandboxSession.defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const coords = isResume\n ? (lifecycleState?.data as { bridge?: ClaudeCodeBridgeCoords })?.bridge\n : undefined;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${sandboxSession.defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n\n // Normalize each forwarded bridge diagnostics frame into the general\n // `HarnessV1Diagnostic` and report it. The adapter does no telemetry work\n // beyond this transport→emission mapping.\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'claude-code',\n sessionId: startOpts.sessionId,\n });\n\n // Builds the `connect` thunk a `SandboxChannel` re-invokes on every\n // (re)connect: open the socket, then wait for `bridge-hello` so the\n // end-to-end link is proven live before any frame is sent.\n const buildConnect = (wsUrl: string) => async (): Promise<WebSocket> => {\n return openBridgeWebSocket({ wsUrl, timeoutMs });\n };\n\n /*\n * Rung 1 — ATTACH. When lifecycle state carries live bridge coordinates,\n * try to reopen a socket to the still-running bridge. Parked sessions wait\n * for the next `start`; suspended turns request replay of everything past\n * the persisted cursor. No spawn, no fresh token (the existing bridge\n * still authorises the persisted one). If the bridge is gone the open\n * throws and we fall through to a spawn-based recovery.\n */\n if (coords) {\n try {\n const attachUrl =\n (await sandboxSession.getPortUrl({\n port: coords.port,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(coords.token)}`;\n const attachChannel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(attachUrl),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n // The live bridge was spawned by another process; this one owns no\n // process handle. The session lifecycle method decides whether the\n // sandbox is left running, stopped, or destroyed.\n proc: undefined,\n model: settings.model,\n maxTurns: settings.maxTurns,\n env: settings.env,\n thinking,\n effort: settings.effort,\n isResume: true,\n continueOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n skills: startOpts.skills ?? [],\n mcpServers: settings.mcpServers,\n });\n } catch {\n // Bridge no longer reachable — recover by respawning below.\n }\n }\n\n /*\n * Rungs 2/3 — REPLAY vs RERUN. Respawn the bridge. `replay` is only sound\n * for `continueFrom`: those coordinates include the cursor the on-disk\n * log is replayed *from*. `resumeFrom` is a between-turn resume; even when\n * it carries bridge coordinates, replaying the previous turn would\n * re-deliver stale events into the next turn. Those resumes always `rerun`\n * when attach is unavailable (the CLI continues its own thread from the\n * workdir snapshot via `continue: true`).\n */\n let respawnStrategy: ClaudeCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n session.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const sandboxHomeDir =\n startOpts.skills && startOpts.skills.length > 0\n ? await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const port = resolveBridgePort(sandboxSession, settings.port);\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId);\n const authEnv = resolveClaudeCodeEnv(settings.auth);\n const env = {\n ...authEnv,\n /*\n * The Claude Agent SDK does not expose arbitrary model-request\n * headers. It reads this environment variable and sends the value as\n * `x-client-app`, while also appending `client-app/<value>` to\n * `User-Agent`, so this is the attribution path for AI Gateway.\n */\n ...(authEnv.AI_GATEWAY_BASE_URL\n ? { CLAUDE_AGENT_SDK_CLIENT_APP: CLAUDE_CODE_CLIENT_APP }\n : {}),\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(sandboxHomeDir ? { HOME: sandboxHomeDir } : {}),\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n /*\n * On a fresh start the workdir, skill files, and bridge-state directory\n * must be created. On any resume they already exist in the\n * sandbox snapshot, so skip the rewrite. The env is sent fresh on every\n * spawn — `BRIDGE_CHANNEL_TOKEN` rotates per start.\n */\n if (respawnStrategy === undefined) {\n await session.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOpts.abortSignal,\n });\n\n if (startOpts.skills && startOpts.skills.length > 0) {\n if (!sandboxHomeDir) {\n throw new Error('Unable to resolve sandbox HOME directory.');\n }\n await writeClaudeCodeSkills({\n sandbox: session,\n homeDir: sandboxHomeDir,\n skills: startOpts.skills,\n abortSignal: startOpts.abortSignal,\n });\n }\n }\n\n await markBridgeStarting({\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'claude-code',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await session.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const bridgeStartupStderr: string[] = [];\n const bridgeStartupStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'claude-code',\n collectTail: bridgeStartupStderr,\n });\n void bridgeStartupStderrDone;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'claude-code',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const wsUrl =\n (await sandboxSession.getPortUrl({\n port: boundPort,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(token)}`;\n\n const channel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(wsUrl),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n // In replay mode the respawned bridge reloaded the finished turn from\n // disk; seed the cursor and resume so it streams the tail (incl.\n // `finish`) rather than starting empty.\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model: settings.model,\n maxTurns: settings.maxTurns,\n env: settings.env,\n thinking,\n effort: settings.effort,\n isResume: respawnStrategy !== undefined,\n continueOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n skills: startOpts.skills ?? [],\n mcpServers: settings.mcpServers,\n });\n },\n };\n}\n\nfunction resolveBridgePort(\n sandboxSession: HarnessV1NetworkSandboxSession,\n override: number | undefined,\n): number {\n if (override !== undefined) return override;\n if (sandboxSession.ports.length > 0) return sandboxSession.ports[0];\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The claude-code harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createClaudeCode({ port })`.',\n });\n}\n\n/**\n * Materialise skill files into\n * `$HOME/.claude/skills/<name>/SKILL.md`. The `claude` CLI\n * auto-discovers skills from that directory on startup, so the files have to\n * be in place before the bridge is spawned without mutating the session\n * workdir. Each file uses the YAML-frontmatter shape the CLI expects.\n */\nasync function writeClaudeCodeSkills({\n sandbox,\n homeDir,\n skills,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n homeDir: string;\n skills: ReadonlyArray<HarnessV1Skill>;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n await writeHarnessSkills({\n sandbox,\n rootDir: `${homeDir}/.claude/skills`,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid Claude Code skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid Claude Code skill file path for ${skillName}: ${filePath}`,\n trailingNewline: true,\n });\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n\n/**\n * Wait for the bridge's `bridge-hello` message to arrive on the freshly\n * opened WebSocket before any other host-side code touches it.\n *\n * Some sandbox runtimes (Vercel in particular) complete the WS upgrade\n * with the host long before the connection is actually forwarded to the\n * sandbox-side bridge. Anything sent in that gap is silently dropped —\n * including the `start` message we send next. The bridge emits\n * `bridge-hello` the instant it accepts the connection, so receiving it\n * is the only reliable evidence that the end-to-end link is live.\n */\nfunction openWebSocketAndWaitForBridgeHello({\n url,\n openTimeoutMs,\n getHelloTimeoutMs,\n}: {\n url: string;\n openTimeoutMs: number;\n getHelloTimeoutMs: () => number;\n}): Promise<WebSocket> {\n return new Promise<WebSocket>((resolve, reject) => {\n const ws = new WebSocket(url);\n let opened = false;\n let sawBridgeHello = false;\n let settled = false;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let helloTimer: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (openTimer) clearTimeout(openTimer);\n if (helloTimer) clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (err?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (err) {\n try {\n ws.terminate();\n } catch {}\n reject(err);\n } else {\n resolve(ws);\n }\n };\n const tryResolve = () => {\n if (opened && sawBridgeHello) settle();\n };\n const startHelloTimer = () => {\n if (helloTimer) return;\n const helloTimeoutMs = getHelloTimeoutMs();\n helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `claude-code bridge did not send bridge-hello within ${helloTimeoutMs}ms`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n };\n const onOpen = () => {\n opened = true;\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = undefined;\n }\n startHelloTimer();\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success || settled) return;\n const value = parsed.value;\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === 'bridge-hello'\n ) {\n sawBridgeHello = true;\n tryResolve();\n }\n })();\n };\n const onClose = () => {\n settle(\n new Error('claude-code bridge closed before sending bridge-hello'),\n );\n };\n const onError = (err: Error) => settle(err);\n openTimer = setTimeout(\n () =>\n settle(new Error(`WebSocket open timed out after ${openTimeoutMs}ms`)),\n openTimeoutMs,\n );\n openTimer.unref?.();\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n });\n}\n\nasync function openBridgeWebSocket({\n wsUrl,\n timeoutMs,\n}: {\n wsUrl: string;\n timeoutMs: number;\n}): Promise<WebSocket> {\n const deadline = Date.now() + timeoutMs;\n let attempt = 0;\n let lastError: unknown;\n\n while (Date.now() < deadline) {\n attempt++;\n try {\n const remaining = Math.max(1, deadline - Date.now());\n return await openWebSocketAndWaitForBridgeHello({\n url: wsUrl,\n openTimeoutMs: Math.min(10_000, remaining),\n getHelloTimeoutMs: () =>\n Math.min(5_000, Math.max(1, deadline - Date.now())),\n });\n } catch (err) {\n lastError = err;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(250 * attempt, 1_000, remaining));\n }\n }\n\n throw new Error(\n `claude-code bridge did not complete WebSocket handshake within ${timeoutMs}ms after ${attempt} attempt(s). Last error: ${formatUnknownError(lastError)}`,\n );\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n\nfunction formatUnknownError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n maxTurns,\n env,\n thinking,\n effort,\n isResume,\n continueOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n skills,\n mcpServers,\n}: {\n sessionId: string;\n channel: ClaudeCodeChannel;\n /** Undefined on `attach` — the live bridge was spawned by another process. */\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n maxTurns: number | undefined;\n env: Readonly<Record<string, string>> | undefined;\n thinking: ClaudeCodeThinkingConfig;\n effort: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | undefined;\n isResume: boolean;\n continueOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n mcpServers: Record<string, unknown> | undefined;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n /*\n * Force the Claude SDK's `continue: true` on the first prompt only when the\n * bridge was respawned (rerun/replay): a fresh bridge process treats its\n * first turn as new, so it must be told to rehydrate the workdir thread. An\n * `attach`ed bridge is already past its first turn and continues on its own.\n */\n let pendingResumeFlag = continueOnFirstPrompt;\n\n /*\n * Wire the channel into one turn's worth of events and return the control\n * surface. Shared by `doPromptTurn` (which sends a `start` afterwards) and\n * `doContinueTurn` (which attaches to an already-running/replayed turn, or sends\n * a rerun `start`). The only difference between the two entry points is the\n * `start` message, not the listener/abort/settle plumbing.\n */\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'finish-step',\n 'raw',\n ] as const;\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n /*\n * A `'suspended'` close is a graceful slice-boundary freeze the host\n * initiated (`doSuspendTurn`): the turn keeps running in the bridge and its\n * tail is replayed to the next process, so wind this turn down cleanly\n * rather than failing it. Any other close mid-turn is an unexpected drop.\n */\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('claude-code bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n submitUserMessage: async text => {\n channel.send({ type: 'user-message', text });\n },\n done,\n };\n };\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n\n const startMessage = {\n type: 'start' as const,\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(skills.length > 0\n ? { skills: skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(pendingResumeFlag ? { continue: true } : {}),\n };\n pendingResumeFlag = false;\n channel.send(startMessage);\n\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n\n /*\n * attach / replay: the still-running (or disk-replayed) turn streams into\n * the wired listeners — `doStart` opened the channel with `{ resume: true }`\n * so the bridge replays everything past the persisted cursor (including a\n * `finish` if the turn ended during the gap). No `start` is sent: issuing\n * one would clear the bridge's replay log and begin a new turn. Lossless.\n *\n * rerun: the bridge was respawned with no in-flight turn to attach to, so\n * re-drive the runtime's own thread from the workdir snapshot via\n * `continue: true`. Lossy — work in flight at the suspension is\n * recomputed. This is the rare bridge-died fallback; the common slice path\n * is `attach`.\n */\n if (rerunContinue) {\n pendingResumeFlag = false;\n channel.send({\n type: 'start' as const,\n /*\n * A continuation nudge rather than an empty prompt: `continue: true`\n * rehydrates the prior thread, and this is the new user turn that\n * drives it forward. It must be non-empty — an empty text block is\n * rejected by the Anthropic API once the SDK stamps it with\n * `cache_control`.\n */\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(skills.length > 0\n ? { skills: skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n continue: true,\n });\n }\n\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n /*\n * Claude Code has no SDK/control method for compaction — the supported\n * trigger is the `/compact` slash command submitted as user input. Ride\n * the existing user-message rail; the bridge feeds it into the streaming\n * query input and Claude's native compaction handles the rest, emitting a\n * `compact_boundary` + `PostCompact` we observe as a `compaction` event.\n */\n const text =\n customInstructions && customInstructions.trim()\n ? `/compact ${customInstructions.trim()}`\n : '/compact';\n channel.send({ type: 'user-message', text });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n // Tell the channel we are tearing down so the bridge's post-shutdown\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n /*\n * If the bridge's channel already closed (e.g. mid-turn WS drop)\n * there is no one to acknowledge a `stop` message. Synthesize an empty\n * payload — for Claude Code the resume state structurally is `{}`\n * (the conversation lives in the workdir, captured by the sandbox\n * snapshot during the subsequent `sandboxSession.stop()`), so we\n * lose nothing by skipping the round-trip.\n */\n // Tell the channel we are tearing down so the bridge's post-stop\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `claude-code session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n // The bridge exits itself after sending bridge-stop. Give\n // it a moment, then ensure the process is reaped and the channel\n // closed.\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n /*\n * Freeze the host at a precise cursor without stopping the active model\n * turn. `channel.suspend` stops processing inbound frames, drains what\n * was already dispatched, then closes the host socket with reason\n * `'suspended'`. The bridge keeps the turn running and accumulates events\n * past the cursor for the next slice to replay. The sandbox process is\n * deliberately left alive.\n */\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n };\n}\n\n/*\n * Reduce a `HarnessV1Prompt` to the plain user text the bridge forwards\n * to the Claude SDK. File and image parts on the message are not yet\n * supported by the underlying runtime — throw rather than silently drop\n * them so callers learn about the gap instead of seeing mysteriously\n * truncated prompts.\n */\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message: `The claude-code harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { execFileSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { getAiGatewayAuthFromEnv } from '@ai-sdk/harness/utils';\n\nexport type ClaudeCodeAuthOptions = {\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n};\n\n/**\n * Resolve the environment-variable blob the bridge needs to authenticate\n * with Anthropic (directly or via the Vercel AI Gateway). Precedence:\n *\n * 1. Explicit `auth.anthropic` — pin to direct Anthropic auth.\n * 2. Explicit `auth.gateway` — pin to gateway-routed auth.\n * 3. Auto-detect from the host process env: gateway first\n * (`AI_GATEWAY_API_KEY` / `VERCEL_OIDC_TOKEN`), then direct\n * (`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN`).\n */\nexport type ResolveClaudeCodeEnvOptions = {\n /**\n * Returns an API key from a custom source (e.g. a password manager).\n * Used as the last-resort fallback in the auto-detect branch when no\n * static env vars or explicit auth are configured. Defaults to running\n * the `apiKeyHelper` command from `~/.claude/settings.json`, matching\n * the `claude` CLI's own behaviour.\n */\n readApiKeyHelper?: () => string | undefined;\n};\n\nexport function resolveClaudeCodeEnv(\n auth: ClaudeCodeAuthOptions | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n options: ResolveClaudeCodeEnvOptions = {},\n): Record<string, string> {\n const readApiKey = options.readApiKeyHelper ?? readApiKeyHelper;\n if (auth?.anthropic) {\n return pickAnthropic({ explicit: auth.anthropic, processEnv, readApiKey });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (auth?.gateway) {\n return pickGateway({\n explicit: auth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({\n explicit: {},\n gatewayAuthFromEnv,\n });\n }\n\n return pickAnthropic({ processEnv, readApiKey });\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n readApiKey,\n}: {\n explicit?: NonNullable<ClaudeCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n readApiKey: () => string | undefined;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const helperKey = explicit ? undefined : readApiKey();\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY ?? helperKey;\n const authToken =\n explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN ?? helperKey;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\n/**\n * Read the `apiKeyHelper` setting from `~/.claude/settings.json` and run\n * it. The `claude` CLI uses this hook to fetch credentials from password\n * managers and similar tools; mirroring it here lets users with that\n * setup run the harness without having to set `ANTHROPIC_API_KEY`\n * explicitly.\n */\nfunction readApiKeyHelper(): string | undefined {\n const home = homedir();\n if (!home) return undefined;\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return undefined;\n }\n let settings: { apiKeyHelper?: unknown };\n try {\n settings = JSON.parse(raw);\n } catch {\n return undefined;\n }\n const command = settings.apiKeyHelper;\n if (typeof command !== 'string' || command.length === 0) return undefined;\n try {\n const output = execFileSync('sh', ['-c', command], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<ClaudeCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n const baseUrl = explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl;\n const env: Record<string, string> = {};\n if (apiKey) {\n env.AI_GATEWAY_API_KEY = apiKey;\n env.ANTHROPIC_API_KEY = apiKey;\n }\n env.AI_GATEWAY_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\n/*\n * Claude Code's bridge wire protocol. The outbound events, transport frames,\n * shared inbound commands, and `bridge-ready` line all come from the shared\n * `@ai-sdk/harness` protocol — the only Claude-specific piece is the `start`\n * payload, which carries Claude SDK configuration.\n */\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nconst thinkingDisplaySchema = z.enum(['summarized', 'omitted']).optional();\n\nconst thinkingSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('adaptive'),\n display: thinkingDisplaySchema,\n }),\n z.object({\n type: z.literal('enabled'),\n display: thinkingDisplaySchema,\n }),\n z.object({ type: z.literal('disabled') }),\n]);\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n instructions: z.string().optional(),\n thinking: thinkingSchema,\n effort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n maxTurns: z.number().optional(),\n env: z.record(z.string(), z.string()).optional(),\n skills: z.array(z.string()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n // Resume signal. When true, the bridge passes `{ continue: true }` to the\n // Claude SDK so the in-workdir thread state is rehydrated. The host sets this\n // on the first prompt after a cross-process resume.\n continue: z.boolean().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createClaudeCode } from './claude-code-harness';\n\n/**\n * Default `claude-code` harness instance with no overrides — suitable for the\n * common case where the underlying `claude` CLI's defaults are fine.\n * Equivalent to `createClaudeCode()`.\n */\nexport const claudeCode = createClaudeCode();\n\nexport { createClaudeCode } from './claude-code-harness';\nexport { VERSION } from './version';\nexport type { ClaudeCodeHarnessSettings } from './claude-code-harness';\nexport type { ClaudeCodeAuthOptions } from './claude-code-auth';\nexport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\n"],"mappings":"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","names":["z","z","wsUrl","proc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-claude-code",
3
- "version": "1.0.71",
3
+ "version": "1.0.73",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "ws": "^8.21.0",
30
- "@ai-sdk/harness": "1.0.69",
30
+ "@ai-sdk/harness": "1.0.70",
31
31
  "@ai-sdk/provider-utils": "5.0.27"
32
32
  },
33
33
  "peerDependencies": {
@@ -347,6 +347,7 @@ async function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {
347
347
  : {}),
348
348
  systemPrompt: createClaudeCodeSystemPrompt(start.instructions),
349
349
  thinking: start.thinking,
350
+ ...(start.effort !== undefined ? { effort: start.effort } : {}),
350
351
  includePartialMessages: true,
351
352
  // The `PostCompact` hook carries the compaction summary, which the
352
353
  // `compact_boundary` system message does not. Latch it for the unified
@@ -33,6 +33,7 @@ const thinkingSchema = z.discriminatedUnion('type', [
33
33
  export const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({
34
34
  instructions: z.string().optional(),
35
35
  thinking: thinkingSchema,
36
+ effort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),
36
37
  maxTurns: z.number().optional(),
37
38
  env: z.record(z.string(), z.string()).optional(),
38
39
  skills: z.array(z.string()).optional(),
@@ -89,6 +89,11 @@ export type ClaudeCodeHarnessSettings = {
89
89
  * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.
90
90
  */
91
91
  readonly thinking?: ClaudeCodeThinkingConfig;
92
+ /**
93
+ * Controls how much effort Claude applies when adaptive thinking is enabled.
94
+ * Unset uses the Claude Agent SDK default.
95
+ */
96
+ readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';
92
97
  /**
93
98
  * Override the port the bridge binds inside the sandbox. By default the
94
99
  * adapter uses the first port the sandbox declares via `sandbox.ports`.
@@ -919,6 +924,7 @@ export function createClaudeCode(
919
924
  maxTurns: settings.maxTurns,
920
925
  env: settings.env,
921
926
  thinking,
927
+ effort: settings.effort,
922
928
  isResume: true,
923
929
  continueOnFirstPrompt: false,
924
930
  rerunContinue: false,
@@ -1094,6 +1100,7 @@ export function createClaudeCode(
1094
1100
  maxTurns: settings.maxTurns,
1095
1101
  env: settings.env,
1096
1102
  thinking,
1103
+ effort: settings.effort,
1097
1104
  isResume: respawnStrategy !== undefined,
1098
1105
  continueOnFirstPrompt: respawnStrategy !== undefined,
1099
1106
  rerunContinue: respawnStrategy === 'rerun',
@@ -1352,6 +1359,7 @@ function createSession({
1352
1359
  maxTurns,
1353
1360
  env,
1354
1361
  thinking,
1362
+ effort,
1355
1363
  isResume,
1356
1364
  continueOnFirstPrompt,
1357
1365
  rerunContinue,
@@ -1372,6 +1380,7 @@ function createSession({
1372
1380
  maxTurns: number | undefined;
1373
1381
  env: Readonly<Record<string, string>> | undefined;
1374
1382
  thinking: ClaudeCodeThinkingConfig;
1383
+ effort: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | undefined;
1375
1384
  isResume: boolean;
1376
1385
  continueOnFirstPrompt: boolean;
1377
1386
  rerunContinue: boolean;
@@ -1554,6 +1563,7 @@ function createSession({
1554
1563
  maxTurns,
1555
1564
  ...(env !== undefined ? { env } : {}),
1556
1565
  thinking,
1566
+ ...(effort !== undefined ? { effort } : {}),
1557
1567
  ...(skills.length > 0
1558
1568
  ? { skills: skills.map(skill => skill.name) }
1559
1569
  : {}),
@@ -1611,6 +1621,7 @@ function createSession({
1611
1621
  maxTurns,
1612
1622
  ...(env !== undefined ? { env } : {}),
1613
1623
  thinking,
1624
+ ...(effort !== undefined ? { effort } : {}),
1614
1625
  ...(skills.length > 0
1615
1626
  ? { skills: skills.map(skill => skill.name) }
1616
1627
  : {}),