@ai-sdk/harness-opencode 1.0.134 → 1.0.136

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/bridge/index.ts","../../src/bridge/opencode-types.ts","../../src/bridge/opencode-events.ts","../../src/bridge/opencode-context-fallback.ts","../../src/bridge/opencode-usage.ts","../../src/bridge/opencode-finish-step.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/opencode-path.ts","../../src/bridge/opencode-server-auth.ts","../../src/bridge/tool-relay.ts","../../src/bridge/tool-relay-auth.ts","../../src/bridge/question-tool.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, the in-memory event log +\n// monotonic `seq`, resume replay, and the lifecycle/meta files. Any number of\n// hosts may be connected; exactly one of them owns the event stream, and\n// `start`/`resume` transfer that ownership. The adapter supplies only `onStart`\n// (drive its CLI/SDK and translate to wire events) and lifecycle cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport type { ToolResultPart } from '@ai-sdk/provider-utils';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport { HarnessBridgeCapabilityUnsupportedError } from './harness-bridge-capability-unsupported-error';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface Experimental_BridgeUserMessage {\n readonly messageId: string;\n readonly text: string;\n accept(): void;\n reject(error: unknown): void;\n}\n\nexport interface Experimental_BridgeUserMessageQueue extends AsyncIterable<Experimental_BridgeUserMessage> {\n readonly pendingCount: number;\n close(error?: unknown): void;\n}\n\ntype InternalBridgeUserMessageQueue = Experimental_BridgeUserMessageQueue & {\n enqueue(input: { messageId: string; text: string }): void;\n};\n\ntype BridgeUserMessageResponse = {\n type: 'user-message-response';\n messageId: string;\n accepted: boolean;\n error?: { message: string };\n};\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n if (typeof err === 'string') {\n return { message: err };\n }\n if (err !== null && typeof err === 'object') {\n try {\n return { message: JSON.stringify(err) };\n } catch {}\n }\n return { message: String(err) };\n}\n\nfunction createBridgeUserMessageQueue(options: {\n respond(response: BridgeUserMessageResponse): void;\n}): InternalBridgeUserMessageQueue {\n const messages: Experimental_BridgeUserMessage[] = [];\n const waiters: Array<\n (result: IteratorResult<Experimental_BridgeUserMessage>) => void\n > = [];\n const entries = new Map<\n string,\n {\n response?: BridgeUserMessageResponse;\n reject(error: unknown): void;\n }\n >();\n let closed = false;\n let pendingCount = 0;\n\n const enqueue = (input: { messageId: string; text: string }): void => {\n const existing = entries.get(input.messageId);\n if (existing != null) {\n if (existing.response != null) {\n options.respond(existing.response);\n }\n return;\n }\n\n let settled = false;\n const settle = (response: BridgeUserMessageResponse): void => {\n if (settled) return;\n settled = true;\n pendingCount--;\n const entry = entries.get(input.messageId);\n if (entry != null) entry.response = response;\n options.respond(response);\n };\n const message: Experimental_BridgeUserMessage = {\n messageId: input.messageId,\n text: input.text,\n accept: () => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: true,\n });\n },\n reject: error => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: false,\n error: { message: formatBridgeError(error).message },\n });\n },\n };\n entries.set(input.messageId, {\n reject: message.reject,\n });\n pendingCount++;\n\n if (closed) {\n message.reject(\n new Error('The bridge turn is no longer accepting user messages.'),\n );\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter != null) {\n waiter({ done: false, value: message });\n } else {\n messages.push(message);\n }\n };\n\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n const reason =\n error ??\n new Error('The bridge turn ended before accepting the user message.');\n for (const entry of entries.values()) {\n if (entry.response == null) entry.reject(reason);\n }\n messages.length = 0;\n while (waiters.length > 0) {\n waiters.shift()!({ done: true, value: undefined });\n }\n };\n\n return {\n get pendingCount() {\n return pendingCount;\n },\n enqueue,\n close,\n [Symbol.asyncIterator]() {\n return {\n next: () => {\n const message = messages.shift();\n if (message != null) {\n return Promise.resolve({ done: false as const, value: message });\n }\n if (closed) {\n return Promise.resolve({\n done: true as const,\n value: undefined,\n });\n }\n return new Promise<IteratorResult<Experimental_BridgeUserMessage>>(\n resolve => {\n waiters.push(resolve);\n },\n );\n },\n };\n },\n };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n input:\n | string\n | {\n toolCallId: string;\n matches?: (result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n },\n ): Promise<{\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n readonly experimental_userMessages: Experimental_BridgeUserMessageQueue;\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n\n /**\n * Emit a non-fatal bridge warning to stderr using the runtime's harness\n * prefix. This is diagnostic-only: it does not emit a stream event, does not\n * consume a `seq`, and does not fail the turn.\n */\n emitWarning(input: { message: string }): void;\n\n emitError(input: { error: unknown; message?: string }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /**\n * Drive one prompt turn. Rejections surface to the host as an `error`\n * event.\n *\n * Contract: once `turn.abortSignal` fires, wind down promptly — turns are\n * serialized, and a replacement `start` waits up to\n * {@link turnTeardownGraceMs} for this promise to settle before it\n * proceeds anyway.\n */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /**\n * How long a replacement `start` waits for the previous turn's teardown\n * after aborting it, in milliseconds. Turns are serialized so an aborted\n * turn cannot emit into its replacement's event log or overlap its runtime\n * process — but only within this bound: an adapter that does not settle\n * `onStart` after its abort signal fires forfeits the protection for that\n * boundary, and the new turn proceeds anyway rather than blocking forever.\n * The default of ten seconds exceeds the Claude bridge's five-second\n * hard-abort fallback.\n */\n turnTeardownGraceMs?: number;\n /**\n * Produce the adapter-defined runtime resume data for `stop`. Defaults to\n * `{}`.\n */\n onStop?(): unknown | Promise<unknown>;\n /**\n * Perform adapter-defined destruction before the bridge exits.\n */\n onDestroy?(): void | Promise<void>;\n /** WS port. Defaults to `BRIDGE_WS_PORT` env (0 = OS-assigned). */\n port?: number;\n /** Auth token. Defaults to `BRIDGE_CHANNEL_TOKEN` env. */\n token?: string;\n /** Called with the bound port once the server is listening. */\n onListening?(port: number): void;\n /**\n * Tear the process down after `stop` / `destroy`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; messageId?: string; text: string }\n | { type: 'abort' }\n | { type: 'stop' }\n | { type: 'destroy' }\n | { type: 'resume'; lastSeenEventId: number };\n\nconst WS_OPEN = 1;\n\n/**\n * Boot the bridge: bind the WebSocket server, announce `bridge-ready`, and\n * service host connections for the lifetime of the process. Resolves once the\n * server is listening; the process then stays alive on the server until a\n * `stop` / `destroy` exits it.\n */\nexport interface BridgeHandle {\n /** The port the WebSocket server bound to. */\n readonly port: number;\n /** Close the WebSocket server. Does not call `process.exit`. */\n close(): Promise<void>;\n}\n\nexport async function runBridge<TStart extends { type: 'start' }>(\n options: RunBridgeOptions<TStart>,\n): Promise<BridgeHandle> {\n const { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n const teardownGraceMs = options.turnTeardownGraceMs ?? 10_000;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n /*\n * The one connection turn events stream to. A socket claims it by asking for\n * work — `start` (a turn) or `resume` (a catch-up) — never by connecting:\n * every event goes here alone, so claiming on connect would silence a turn\n * already streaming to someone else. Any number of sockets may be connected;\n * the others still exchange control frames, they just get no events.\n */\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: InternalBridgeUserMessageQueue | undefined;\n /**\n * Settles when the in-flight turn has fully wound down — `onStart`\n * returned or threw AND its completion state was recorded. `undefined`\n * between turns. A new `start` fences on this so turns never overlap.\n */\n let activeTurn: Promise<void> | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the in-flight turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n {\n resolve: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => void;\n matches?: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n }\n >();\n const bufferedToolResults: Array<{\n toolCallId: string;\n result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n };\n }> = [];\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(line);\n } catch {\n // Send is best-effort: a dropped socket leaves the event in the log,\n // replayed once the host reconnects and sends `resume`.\n }\n }\n };\n\n const replay = (ws: WebSocket, afterSeq: number): void => {\n for (const entry of eventLog) {\n if (entry.seq > afterSeq && ws.readyState === WS_OPEN) {\n ws.send(entry.line);\n }\n }\n };\n\n // ─── diagnostics ──────────────────────────────────────────────\n const shouldEmitDebugEvent = (\n level: BridgeDebugLevel,\n subsystem: string,\n ): boolean => {\n if (!debugConfig?.enabled) return false;\n const threshold = debugConfig.level ?? 'debug';\n if (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n return subsystemMatches(debugConfig.subsystems, subsystem);\n };\n\n /*\n * Forward sandbox console output. We line-buffer the original writers (kept so\n * output still reaches the real fds) and emit one `sandbox-log` per complete\n * line. `emit` never writes to stdout/stderr, so there is no recursion.\n * Installed lazily the first time a turn enables diagnostics; once installed,\n * capture is gated per-write on `debugConfig.enabled` so a later turn can\n * disable it. Console capture is independent of the subsystem/level filter.\n */\n const rawStdoutWrite = process.stdout.write.bind(process.stdout);\n const rawStderrWrite = process.stderr.write.bind(process.stderr);\n\n const writeErrorToStderr = (input: {\n message: string;\n error: unknown;\n }): void => {\n try {\n const formatted = formatBridgeError(input.error);\n rawStderrWrite(\n `[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`,\n );\n if (formatted.stack) {\n rawStderrWrite(`${formatted.stack}\\n`);\n }\n } catch {}\n };\n\n const emitWarning = (input: { message: string }): void => {\n try {\n for (const line of input.message.split('\\n')) {\n if (line.trim().length > 0) {\n rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n }\n }\n } catch {}\n };\n\n const emitError = (input: { error: unknown; message?: string }): void => {\n writeErrorToStderr({\n message: input.message ?? 'bridge error',\n error: input.error,\n });\n emit({ type: 'error', error: serialiseError(input.error) });\n };\n\n const installConsoleCapture = (): void => {\n if (consoleCaptureInstalled) return;\n consoleCaptureInstalled = true;\n const buffers: { stdout: string; stderr: string } = {\n stdout: '',\n stderr: '',\n };\n const patch =\n (stream: 'stdout' | 'stderr', raw: typeof process.stdout.write) =>\n (chunk: unknown, encoding?: unknown, cb?: unknown): boolean => {\n if (debugConfig?.enabled) {\n try {\n const enc = typeof encoding === 'string' ? encoding : 'utf8';\n const text =\n typeof chunk === 'string'\n ? chunk\n : Buffer.from(chunk as Uint8Array).toString(\n enc as BufferEncoding,\n );\n const combined = buffers[stream] + text.replace(/\\r\\n/g, '\\n');\n const parts = combined.split('\\n');\n buffers[stream] = parts.pop() ?? '';\n for (const line of parts) {\n const trimmed = line.replace(/\\s+$/, '');\n if (trimmed) {\n emit({\n type: 'sandbox-log',\n source: bridgeType,\n stream,\n line: trimmed,\n });\n }\n }\n } catch {\n // Never let capture break real output.\n }\n }\n return (raw as (c: unknown, e?: unknown, cb?: unknown) => boolean)(\n chunk,\n encoding,\n cb,\n );\n };\n process.stdout.write = patch(\n 'stdout',\n rawStdoutWrite,\n ) as typeof process.stdout.write;\n process.stderr.write = patch(\n 'stderr',\n rawStderrWrite,\n ) as typeof process.stderr.write;\n };\n\n // ─── inbound routing ────────────────────────────────────────────────\n const handleInbound = async (\n msg: TStart | InboundControl,\n ws: WebSocket,\n ): Promise<void> => {\n switch (msg.type) {\n case 'start': {\n /*\n * A new turn replaces the active one — but only after the active one\n * has fully wound down. Inbound frames are dispatched concurrently,\n * and the host settles a caller abort immediately, so a retry's\n * `start` can arrive while the aborted turn is still tearing down\n * (e.g. a graceful interrupt). Without this fence the old turn would\n * keep emitting into the new turn's cleared event log, two runtime\n * processes would run side by side, and the old turn's completion\n * would mark the bridge `waiting` underneath the new turn. Abort the\n * old turn to hasten its teardown; adapters are expected to bound\n * that teardown themselves (e.g. a hard-abort fallback), but the\n * runtime does not rely on it: the wait is capped by the teardown\n * grace period, after which the new turn proceeds anyway — the\n * pre-fence overlapping behavior — rather than hanging behind a\n * teardown that never settles.\n */\n for (;;) {\n const pendingTurn = activeTurn;\n if (pendingTurn == null) break;\n turnAbort?.abort();\n currentUserMessages?.close(\n new Error('A new bridge turn replaced the active turn.'),\n );\n let graceTimer: ReturnType<typeof setTimeout> | undefined;\n const settled = await Promise.race([\n pendingTurn.then(() => true as const),\n new Promise<false>(resolve => {\n graceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n graceTimer.unref?.();\n }),\n ]);\n clearTimeout(graceTimer);\n if (!settled) break;\n }\n let turnFinished!: () => void;\n const thisTurn = new Promise<void>(resolve => (turnFinished = resolve));\n activeTurn = thisTurn;\n activeSocket = ws; // asking for a turn claims the event stream\n const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const userMessages = createBridgeUserMessageQueue({ respond: emit });\n const turn: BridgeTurn = {\n emit,\n requestToolResult: requestInput => {\n const request =\n typeof requestInput === 'string'\n ? { toolCallId: requestInput }\n : requestInput;\n const bufferedIndex = bufferedToolResults.findIndex(\n buffered =>\n buffered.toolCallId === request.toolCallId ||\n request.matches?.(buffered.result) === true,\n );\n if (bufferedIndex >= 0) {\n return Promise.resolve(\n bufferedToolResults.splice(bufferedIndex, 1)[0].result,\n );\n }\n return new Promise(resolve => {\n pendingToolResults.set(request.toolCallId, {\n resolve,\n matches: request.matches,\n });\n });\n },\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n experimental_userMessages: userMessages,\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n emitWarning,\n emitError,\n };\n currentUserMessages = userMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\n userMessages.close();\n if (currentUserMessages === userMessages) {\n currentUserMessages = undefined;\n }\n // Only the still-active turn records completion: after a fence\n // timeout a replacement turn is already running, and this stale\n // completion must not mark the bridge waiting underneath it.\n if (activeTurn === thisTurn) {\n activeTurn = undefined;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n turnFinished();\n }\n return;\n }\n case 'tool-result': {\n const result = {\n output: msg.output,\n isError: msg.isError,\n toolResult: msg.toolResult,\n };\n const exactPending = pendingToolResults.get(msg.toolCallId);\n const matchingPending =\n exactPending == null\n ? Array.from(pendingToolResults.entries()).find(\n ([, pending]) => pending.matches?.(result) === true,\n )\n : undefined;\n const pending = exactPending ?? matchingPending?.[1];\n const pendingId =\n exactPending != null ? msg.toolCallId : matchingPending?.[0];\n if (pending != null && pendingId != null) {\n pendingToolResults.delete(pendingId);\n pending.resolve(result);\n } else {\n bufferedToolResults.push({\n toolCallId: msg.toolCallId,\n result,\n });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message': {\n const messageId = msg.messageId ?? randomUUID();\n if (currentUserMessages == null) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: { message: 'The bridge has no active turn to steer.' },\n });\n return;\n }\n if (ws !== activeSocket) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: {\n message: 'The connection does not own the active bridge turn.',\n },\n });\n return;\n }\n currentUserMessages.enqueue({\n messageId,\n text: msg.text,\n });\n return;\n }\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n activeSocket = ws; // asking for a catch-up claims it too\n // Synchronous, so no event can slip out live ahead of the replayed tail.\n replay(ws, msg.lastSeenEventId);\n return;\n case 'destroy':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n await onDestroy?.();\n drainThenExit(ws, 1000, 'destroy');\n return;\n case 'stop': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onStop?.()) ?? {};\n sendControl(ws, { type: 'bridge-stop', data });\n drainThenExit(ws, 1000, 'stop');\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean stop/destroy leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl(ws, {\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n capabilities: { experimental_userMessageResponses: true },\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl(ws, {\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the stream owner's close matters; a socket that never claimed it,\n // or that a later `start`/`resume` displaced, closes as a no-op.\n // Crucially we do NOT abort the in-flight turn: it keeps running and its\n // events accumulate in the log for replay on reconnect.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\n });\n\n ws.on('error', () => {\n // 'close' follows; nothing to do beyond keeping the process alive.\n });\n });\n\n // Surface bridge-internal crashes to the host instead of dying silently.\n process.on('uncaughtException', err => {\n emitError({ error: err, message: 'uncaught exception' });\n });\n process.on('unhandledRejection', err => {\n emitError({ error: err, message: 'unhandled rejection' });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\n/*\n * Control frames answer the socket that sent the frame they reply to, so the\n * target is always explicit. Event streaming is the separate, stateful path\n * (`emit` → `activeSocket`); this one carries no state at all.\n */\nfunction sendControl(\n socket: WebSocket | undefined,\n message: Record<string, unknown>,\n): void {\n if (socket?.readyState === WS_OPEN) {\n try {\n socket.send(JSON.stringify(message));\n } catch {\n // best-effort\n }\n }\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","const name = 'AI_HarnessBridgeCapabilityUnsupportedError';\n\n/**\n * Signals an unsupported capability discovered inside a sandbox bridge.\n * `isInstance` also recognizes the serialized error shape received by the\n * host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n */\nexport class HarnessBridgeCapabilityUnsupportedError extends Error {\n readonly harnessId?: string;\n readonly cause?: unknown;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super(message);\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n this.cause = cause;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessBridgeCapabilityUnsupportedError {\n return (\n error != null &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === name &&\n 'message' in error &&\n typeof error.message === 'string'\n );\n }\n}\n","import {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport { realpathSync } from 'node:fs';\nimport path from 'node:path';\nimport { argv, env as procEnv } from 'node:process';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { StartMessage } from '../opencode-bridge-protocol';\n\nimport {\n createOpencodeClient,\n createOpencodeServer,\n} from '@opencode-ai/sdk/v2';\nimport {\n createTranslationState,\n emitOpenCodeStreamStart,\n getOpenCodeEventSessionId,\n openCodeMessageInfoFromValue,\n type TranslationState,\n unwrapOpenCodeEvent,\n} from './opencode-events';\nimport {\n createAssistantSnapshotBaseline,\n isAssistantSnapshotAfterBaseline,\n type AssistantSnapshotBaseline,\n} from './opencode-context-fallback';\nimport { createEmitStreamEvent, stringValue } from './create-emit-stream-event';\nimport { mapOpenCodeFinishReason } from './opencode-finish-step';\nimport { prependOpenCodeBinToPath } from './opencode-path';\nimport { configureOpenCodeServerAuth } from './opencode-server-auth';\nimport {\n addUsage,\n defaultUsage,\n extractSessionTokens,\n mapUsage,\n subtractSessionTokens,\n type HarnessUsage,\n type OpenCodeTokenUsage,\n} from './opencode-usage';\nimport {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeObject,\n} from './opencode-types';\nimport { startAuthorizedToolRelay, type ToolRelay } from './tool-relay';\nimport {\n openCodeQuestionKey,\n toHarnessQuestionsInput,\n toOpenCodeQuestionResponse,\n type OpenCodeQuestionRequest,\n} from './question-tool';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\ntype OpenCodeClient = ReturnType<typeof createOpencodeClient>;\ntype OpenCodeServer = Awaited<ReturnType<typeof createOpencodeServer>>;\n\ntype RuntimeState = {\n server?: OpenCodeServer;\n client?: OpenCodeClient;\n sessionId?: string;\n relay?: ToolRelay;\n openCodeConfig?: Record<string, unknown>;\n toolNames: Set<string>;\n mcpToolPrefixes: Set<string>;\n};\n\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'askUserQuestions';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n view: 'read',\n read: 'read',\n write: 'write',\n edit: 'edit',\n bash: 'bash',\n glob: 'glob',\n grep: 'grep',\n question: 'askUserQuestions',\n};\n\nconst OPENCODE_TO_WIRE: Readonly<Record<string, string>> = {\n list: 'ls',\n ls: 'ls',\n webfetch: 'webfetch',\n task: 'agent',\n agent: 'agent',\n askUserQuestions: 'question',\n subtask: 'agent',\n};\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'view',\n write: 'write',\n edit: 'edit',\n bash: 'bash',\n glob: 'glob',\n grep: 'grep',\n ls: 'list',\n webfetch: 'webfetch',\n skill: 'skill',\n todowrite: 'todowrite',\n agent: 'agent',\n};\n\nconst TOOL_KIND: Readonly<Record<string, 'readonly' | 'edit' | 'bash'>> = {\n read: 'readonly',\n glob: 'readonly',\n grep: 'readonly',\n ls: 'readonly',\n webfetch: 'readonly',\n write: 'edit',\n edit: 'edit',\n bash: 'bash',\n agent: 'bash',\n skill: 'edit',\n todowrite: 'edit',\n};\nconst HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir ?? emitFatal('Missing --workdir argument.');\nconst bridgeStateDir =\n args.bridgeStateDir ?? emitFatal('Missing --bridge-state-dir argument.');\nconst bootstrapDir = args.bootstrapDir ?? workdir;\nconst skillsDir = args.skillsDir;\nconst runtime: RuntimeState = {\n toolNames: new Set(),\n mcpToolPrefixes: new Set(),\n};\nprependOpenCodeBinToPath({ bootstrapDir, env: procEnv });\n\nawait runBridge<StartMessage>({\n bridgeType: 'opencode',\n bridgeStateDir,\n onStart: runTurn,\n onStop: () =>\n runtime.sessionId ? { openCodeSessionId: runtime.sessionId } : {},\n});\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n let totalUsage: HarnessUsage | undefined;\n try {\n await ensureRuntime({ start, turn, emit });\n const client = runtime.client!;\n if (start.skillsChanged) {\n await client.instance.dispose({ directory: workdir });\n }\n const sessionId = await ensureSession({ client, start, emit });\n await switchSessionModel({ client, sessionId, start });\n\n if (start.operation === 'compact') {\n await runCompaction({ client, sessionId, start, turn, emit });\n } else {\n totalUsage = await runPrompt({ client, sessionId, start, turn, emit });\n }\n } catch (err) {\n turn.emitError({ error: err, message: 'OpenCode turn failed' });\n } finally {\n turn.experimental_userMessages.close();\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: totalUsage ?? defaultUsage(),\n });\n }\n}\n\nasync function switchSessionModel({\n client,\n sessionId,\n start,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<void> {\n const model = modelRefFromStart(start);\n if (model == null) return;\n const response = await client.v2.session.switchModel({\n sessionID: sessionId,\n model: {\n id: model.modelID,\n providerID: model.providerID,\n },\n });\n if (response.error != null) throw response.error;\n}\n\nasync function ensureRuntime({\n start,\n turn,\n emit,\n}: {\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n if (\n runtime.client &&\n isDeepStrictEqual(runtime.openCodeConfig, start.openCodeConfig)\n ) {\n return;\n }\n\n closeRuntime();\n\n try {\n if (start.tools && start.tools.length > 0) {\n runtime.toolNames = new Set(start.tools.map(tool => tool.name));\n runtime.relay = await startToolRelay({\n tools: start.tools,\n emit,\n requestToolResult: turn.requestToolResult,\n });\n }\n\n const serverAuthHeaders = configureOpenCodeServerAuth({ env: procEnv });\n const server = await createOpencodeServer({\n hostname: '127.0.0.1',\n port: 0,\n timeout: 30_000,\n config: buildOpenCodeConfig({\n start,\n relayPort: runtime.relay?.port,\n }) as never,\n });\n runtime.server = server;\n runtime.client = createOpencodeClient({\n baseUrl: server.url,\n directory: workdir,\n headers: serverAuthHeaders,\n });\n const mcpStatus = await runtime.client.mcp.status();\n const mcpServers = asOpenCodeObject(mcpStatus.data) ?? {};\n runtime.mcpToolPrefixes = new Set(\n Object.entries(mcpServers)\n .filter(\n ([serverName, status]) =>\n serverName !== 'harness-tools' &&\n asOpenCodeObject(status)?.status === 'connected',\n )\n .map(([serverName]) => `${sanitizeMcpToolName(serverName)}_`),\n );\n runtime.openCodeConfig = structuredClone(start.openCodeConfig);\n } catch (error) {\n closeRuntime();\n throw error;\n }\n}\n\nfunction closeRuntime(): void {\n runtime.relay?.close();\n runtime.server?.close();\n runtime.server = undefined;\n runtime.client = undefined;\n runtime.relay = undefined;\n runtime.openCodeConfig = undefined;\n runtime.toolNames = new Set();\n runtime.mcpToolPrefixes = new Set();\n}\n\nfunction buildOpenCodeConfig({\n start,\n relayPort,\n}: {\n start: StartMessage;\n relayPort: number | undefined;\n}): Record<string, unknown> {\n const config: Record<string, unknown> = {\n ...withoutAgentPolicyOverrides(start.openCodeConfig),\n share: 'disabled',\n autoupdate: false,\n permission: {\n read: 'allow',\n glob: 'allow',\n grep: 'allow',\n list: 'allow',\n edit: 'ask',\n bash: 'ask',\n external_directory: 'ask',\n webfetch: 'ask',\n doom_loop: 'ask',\n task: 'ask',\n question: 'allow',\n },\n };\n if (start.model) config.model = start.model;\n if (skillsDir) config.skills = { paths: [skillsDir] };\n const inactiveToolNames = resolveInactiveBuiltinToolNames(start);\n const permission = config.permission as Record<string, unknown>;\n for (const toolName of inactiveToolNames) {\n const permissionName = toPermissionToolName(\n PUBLIC_TO_NATIVE[toolName] ?? toolName,\n );\n if (permissionName === 'ls') {\n permission.list = 'ask';\n } else {\n permission[permissionName] = 'ask';\n }\n }\n const provider = buildProviderConfig(start);\n if (provider) config.provider = provider;\n const mcp = { ...start.mcpServers };\n if (relayPort && start.tools && start.tools.length > 0) {\n mcp['harness-tools'] = {\n type: 'local',\n enabled: true,\n command: ['node', `${bootstrapDir}/host-tool-mcp.mjs`],\n environment: {\n TOOL_SCHEMAS: JSON.stringify(\n start.tools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ),\n TOOL_RELAY_URL: `http://127.0.0.1:${relayPort}`,\n },\n };\n }\n if (Object.keys(mcp).length > 0) config.mcp = mcp;\n return config;\n}\n\nfunction withoutAgentPolicyOverrides(\n input: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const config = { ...input };\n for (const key of ['agent', 'mode'] as const) {\n const agents = asOpenCodeObject(config[key]);\n if (!agents) continue;\n config[key] = Object.fromEntries(\n Object.entries(agents).map(([name, value]) => {\n const agent = asOpenCodeObject(value);\n if (!agent) return [name, value];\n const safeAgent = { ...agent };\n delete safeAgent.permission;\n delete safeAgent.tools;\n return [name, safeAgent];\n }),\n );\n }\n return config;\n}\n\nfunction buildProviderConfig(\n start: StartMessage,\n): Record<string, unknown> | undefined {\n const model = splitModel(start.model, start.provider);\n const providerID =\n model.providerID ?? start.provider ?? procEnv.OPENAI_NAME ?? 'anthropic';\n const modelID = model.modelID;\n\n if (procEnv.AI_GATEWAY_API_KEY && procEnv.AI_GATEWAY_BASE_URL) {\n return {\n [providerID]: {\n options: {\n apiKey: procEnv.AI_GATEWAY_API_KEY,\n baseURL: toOpenCodeGatewayBaseUrl(procEnv.AI_GATEWAY_BASE_URL),\n ...(HARNESS_CLIENT_APP\n ? {\n headers: {\n ...start.headers,\n 'x-client-app': HARNESS_CLIENT_APP,\n },\n }\n : start.headers\n ? { headers: start.headers }\n : {}),\n },\n ...(modelID\n ? {\n models: {\n [modelID]: { id: modelID, name: modelID },\n },\n }\n : {}),\n },\n };\n }\n\n if (\n (procEnv.OPENAI_NAME ||\n (providerID !== 'anthropic' && providerID !== 'openai')) &&\n (procEnv.OPENAI_API_KEY || procEnv.OPENAI_BASE_URL)\n ) {\n const openAICompatibleProviderID = procEnv.OPENAI_NAME ?? providerID;\n return {\n [openAICompatibleProviderID]: {\n options: {\n ...(procEnv.OPENAI_API_KEY ? { apiKey: procEnv.OPENAI_API_KEY } : {}),\n ...(procEnv.OPENAI_BASE_URL\n ? { baseURL: procEnv.OPENAI_BASE_URL }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n ...parseOpenAIQueryParams(),\n },\n ...(modelID\n ? {\n models: {\n [modelID]: { id: modelID, name: modelID },\n },\n }\n : {}),\n },\n };\n }\n\n if (\n providerID === 'anthropic' &&\n (procEnv.ANTHROPIC_API_KEY ||\n procEnv.ANTHROPIC_AUTH_TOKEN ||\n procEnv.ANTHROPIC_BASE_URL)\n ) {\n return {\n anthropic: {\n options: {\n ...(procEnv.ANTHROPIC_API_KEY\n ? { apiKey: procEnv.ANTHROPIC_API_KEY }\n : {}),\n ...(procEnv.ANTHROPIC_AUTH_TOKEN\n ? { authToken: procEnv.ANTHROPIC_AUTH_TOKEN }\n : {}),\n ...(procEnv.ANTHROPIC_BASE_URL\n ? { baseURL: procEnv.ANTHROPIC_BASE_URL }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n },\n },\n };\n }\n\n if (\n providerID === 'openai' &&\n (procEnv.OPENAI_API_KEY || procEnv.OPENAI_BASE_URL)\n ) {\n return {\n openai: {\n options: {\n ...(procEnv.OPENAI_API_KEY ? { apiKey: procEnv.OPENAI_API_KEY } : {}),\n ...(procEnv.OPENAI_BASE_URL\n ? { baseURL: procEnv.OPENAI_BASE_URL }\n : {}),\n ...(procEnv.OPENAI_ORGANIZATION\n ? { organization: procEnv.OPENAI_ORGANIZATION }\n : {}),\n ...(procEnv.OPENAI_PROJECT\n ? { project: procEnv.OPENAI_PROJECT }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n ...parseOpenAIQueryParams(),\n },\n },\n };\n }\n}\n\nfunction parseOpenAIQueryParams(): Record<string, unknown> {\n if (!procEnv.OPENAI_QUERY_PARAMS_JSON) return {};\n try {\n const parsed = JSON.parse(procEnv.OPENAI_QUERY_PARAMS_JSON);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { queryParams: parsed };\n }\n } catch {}\n return {};\n}\n\nfunction toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n\nasync function legacySessionGet({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<{ error?: unknown; data?: unknown }> {\n const session = (client as any).session;\n if (!session?.get) return client.v2.session.get({ sessionID: sessionId });\n return session.get({ sessionID: sessionId });\n}\n\nasync function legacySessionCreate({\n client,\n}: {\n client: OpenCodeClient;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.create({});\n}\n\nasync function legacySessionPrompt({\n client,\n sessionId,\n start,\n prompt: promptText,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n prompt?: string;\n}): Promise<{ error?: unknown; data?: unknown }> {\n const session = (client as any).session;\n const submitPrompt = session.promptAsync ?? session.prompt;\n return submitPrompt.call(session, {\n sessionID: sessionId,\n ...(start.instructions ? { system: start.instructions } : {}),\n ...(start.variant ? { variant: start.variant } : {}),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? {\n format: {\n type: 'json_schema' as const,\n schema: start.responseFormat.schema,\n },\n }\n : {}),\n parts: [{ type: 'text', text: promptText ?? start.prompt }],\n });\n}\n\nasync function legacySessionSummarize({\n client,\n sessionId,\n model,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n model: OpenCodeModelRef;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.summarize({\n sessionID: sessionId,\n auto: false,\n providerID: model.providerID,\n modelID: model.modelID,\n });\n}\n\nasync function subscribeLegacyEvents({\n client,\n signal,\n}: {\n client: OpenCodeClient;\n signal: AbortSignal;\n}): Promise<AsyncIterable<unknown> | null> {\n const subscribed = await (client as any).event.subscribe(undefined, {\n signal,\n sseMaxRetryAttempts: 0,\n });\n return getEventStream(subscribed);\n}\n\nfunction readSessionId(data: unknown): string | undefined {\n if (!data || typeof data !== 'object') return undefined;\n const record = data as { id?: unknown; data?: { id?: unknown } };\n if (typeof record.id === 'string') return record.id;\n if (typeof record.data?.id === 'string') return record.data.id;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === 'object' && value !== null && Symbol.asyncIterator in value\n );\n}\n\nfunction getEventStream(source: unknown): AsyncIterable<unknown> | null {\n if (!source || typeof source !== 'object') return null;\n const candidate = source as { stream?: unknown; data?: unknown };\n if (isAsyncIterable(candidate.stream)) return candidate.stream;\n if (isAsyncIterable(candidate.data)) return candidate.data;\n return null;\n}\n\nfunction legacyStatusType(event: OpenCodeEvent): string | undefined {\n const status = event.properties?.status;\n return status && typeof status === 'object'\n ? String((status as { type?: unknown }).type ?? '')\n : undefined;\n}\n\nfunction legacyRetryStatusMessage(event: OpenCodeEvent): string {\n const status = event.properties?.status;\n const details: string[] = [];\n if (status && typeof status === 'object') {\n const retryStatus = status as { attempt?: unknown; message?: unknown };\n if (typeof retryStatus.attempt === 'number') {\n details.push(`attempt ${retryStatus.attempt}`);\n }\n if (typeof retryStatus.message === 'string' && retryStatus.message.trim()) {\n details.push(retryStatus.message.trim());\n }\n }\n return details.length > 0\n ? `OpenCode session retry: ${details.join('; ')}`\n : 'OpenCode session retry';\n}\n\nasync function ensureSession({\n client,\n start,\n emit,\n}: {\n client: OpenCodeClient;\n start: StartMessage;\n emit: Emit;\n}): Promise<string> {\n if (runtime.sessionId) return runtime.sessionId;\n if (start.resumeSessionId) {\n const existing = await legacySessionGet({\n client,\n sessionId: start.resumeSessionId,\n }).catch(() => undefined);\n if (existing && !existing.error) {\n runtime.sessionId = start.resumeSessionId;\n emit({ type: 'bridge-thread', threadId: runtime.sessionId });\n return runtime.sessionId;\n }\n }\n const created = await legacySessionCreate({ client });\n if (created.error) {\n throw new Error(\n `OpenCode session create failed: ${formatError(created.error)}`,\n );\n }\n const id = readSessionId(created.data);\n if (!id) throw new Error('OpenCode session create returned no id.');\n runtime.sessionId = id;\n emit({ type: 'bridge-thread', threadId: id });\n return id;\n}\n\nasync function runPrompt({\n client,\n sessionId,\n start,\n turn,\n emit,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<HarnessUsage | undefined> {\n const eventsAbort = new AbortController();\n const turnSettled = createDeferred<'event' | 'stream-ended'>();\n let sawContent = false;\n let sawFinishStep = false;\n let sawBusy = false;\n let sawStructuredOutput = false;\n let terminalError: string | undefined;\n let submittingUserMessage = false;\n const state = createTranslationState();\n const initialSessionTokens = await readSessionTokens({\n client,\n sessionId,\n }).catch(() => undefined);\n const assistantBaseline = createAssistantSnapshotBaseline(\n await latestAssistantSnapshot({ client, sessionId }),\n );\n const eventsReady = createDeferred<void>();\n let stepUsage: HarnessUsage | undefined;\n let latestSessionTokens: OpenCodeTokenUsage | undefined;\n const eventLoop = consumeEvents({\n client,\n sessionId,\n permissionMode: start.permissionMode,\n builtinToolFiltering: start.builtinToolFiltering,\n turn,\n state,\n emit: msg => {\n if (msg.type === 'text-delta' || msg.type === 'reasoning-delta') {\n sawContent = true;\n }\n if (msg.type === 'finish-step') {\n sawFinishStep = true;\n stepUsage = addUsage({\n left: stepUsage,\n right: msg.usage as HarnessUsage,\n });\n }\n emit(msg);\n },\n signal: eventsAbort.signal,\n onSubscribed: () => eventsReady.resolve(undefined),\n onEvent: event => {\n if (event.type === 'message.updated') {\n emitOpenCodeStreamStart({\n info: event.properties?.info,\n state,\n emit,\n });\n const info = asOpenCodeObject(event.properties?.info);\n if (\n start.responseFormat?.type === 'json' &&\n info?.structured !== undefined\n ) {\n const id = String(info.id ?? randomUUID());\n emit({ type: 'text-start', id });\n emit({\n type: 'text-delta',\n id,\n delta: JSON.stringify(info.structured),\n });\n emit({ type: 'text-end', id });\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n });\n sawFinishStep = true;\n sawStructuredOutput = true;\n if (\n !submittingUserMessage &&\n turn.experimental_userMessages.pendingCount === 0\n ) {\n turn.experimental_userMessages.close();\n turnSettled.resolve('event');\n return true;\n }\n }\n }\n if (event.type === 'session.updated') {\n latestSessionTokens =\n extractSessionTokens(event.properties) ?? latestSessionTokens;\n }\n if (\n event.type === 'session.next.step.failed' ||\n event.type === 'session.error'\n ) {\n const error = formatError(event.properties?.error ?? event);\n if (event.type === 'session.error') {\n terminalError = error;\n }\n turn.experimental_userMessages.close(new Error(error));\n turnSettled.resolve('event');\n return true;\n }\n const status = legacyStatusType(event);\n if (status === 'busy') {\n sawBusy = true;\n } else if (status === 'retry') {\n sawBusy = true;\n turn.emitWarning({ message: legacyRetryStatusMessage(event) });\n } else if (sawBusy && status === 'idle') {\n sawBusy = false;\n if (\n !submittingUserMessage &&\n turn.experimental_userMessages.pendingCount === 0 &&\n (start.responseFormat?.type !== 'json' || sawStructuredOutput)\n ) {\n turn.experimental_userMessages.close();\n turnSettled.resolve('event');\n return true;\n }\n }\n },\n }).finally(() => {\n eventsReady.resolve(undefined);\n turn.experimental_userMessages.close(\n new Error('OpenCode event stream ended before the turn settled.'),\n );\n turnSettled.resolve('stream-ended');\n });\n await eventsReady.promise;\n const userMessageLoop = (async () => {\n for await (const message of turn.experimental_userMessages) {\n submittingUserMessage = true;\n try {\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n prompt: message.text,\n });\n if (prompted.error) {\n message.reject(\n new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`),\n );\n continue;\n }\n message.accept();\n } catch (error) {\n message.reject(error);\n } finally {\n submittingUserMessage = false;\n }\n }\n })();\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n });\n if (prompted.error) {\n eventsAbort.abort();\n turn.experimental_userMessages.close(\n new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`),\n );\n throw new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`);\n }\n const settlement = await turnSettled.promise;\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n await userMessageLoop.catch(() => {});\n if (settlement === 'stream-ended') {\n throw new Error('OpenCode event stream ended before the turn settled.');\n }\n if (terminalError) throw new Error(terminalError);\n if (!sawFinishStep) {\n const emittedFallback = await emitContextFallback({\n client,\n sessionId,\n assistantBaseline,\n state,\n emit,\n emitContent: !sawContent,\n }).catch(() => false);\n if (!emittedFallback) {\n throw new Error(\n 'OpenCode turn settled without a correlated assistant response.',\n );\n }\n }\n const finalSessionTokens =\n (await readSessionTokens({ client, sessionId }).catch(() => undefined)) ??\n latestSessionTokens;\n if (initialSessionTokens && finalSessionTokens) {\n return mapUsage(\n subtractSessionTokens({\n before: initialSessionTokens,\n after: finalSessionTokens,\n }),\n );\n }\n return stepUsage;\n}\n\nasync function runCompaction({\n client,\n sessionId,\n start,\n turn,\n emit,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n const eventsAbort = new AbortController();\n const compactionSettled = createDeferred<void>();\n let sawCompaction = false;\n let sawBusy = false;\n let terminalError: string | undefined;\n const model = await resolveCompactionModel({\n client,\n sessionId,\n start,\n });\n if (!model) {\n throw new Error(\n 'OpenCode compaction requires a previous turn or an explicit model.',\n );\n }\n const eventLoop = consumeEvents({\n client,\n sessionId,\n permissionMode: start.permissionMode,\n builtinToolFiltering: start.builtinToolFiltering,\n turn,\n state: createTranslationState(),\n emit: msg => {\n if (msg.type === 'compaction') sawCompaction = true;\n emit(msg);\n },\n signal: eventsAbort.signal,\n onEvent: event => {\n if (\n event.type === 'session.next.compaction.ended' ||\n event.type === 'session.compacted'\n ) {\n compactionSettled.resolve();\n return true;\n }\n const status = legacyStatusType(event);\n if (status === 'busy') {\n sawBusy = true;\n } else if (status === 'retry') {\n sawBusy = true;\n turn.emitWarning({ message: legacyRetryStatusMessage(event) });\n } else if (sawBusy && status === 'idle') {\n compactionSettled.resolve();\n return true;\n }\n if (event.type === 'session.error') {\n terminalError = formatError(event.properties?.error ?? event);\n compactionSettled.resolve();\n return true;\n }\n },\n });\n const compacted = await legacySessionSummarize({\n client,\n sessionId,\n model,\n });\n if (compacted.error) {\n eventsAbort.abort();\n throw new Error(\n `OpenCode compaction failed: ${formatError(compacted.error)}`,\n );\n }\n await Promise.race([compactionSettled.promise, sleep(250)]);\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n if (terminalError) throw new Error(terminalError);\n if (!sawCompaction) {\n emit({\n type: 'compaction',\n trigger: 'manual',\n summary: '',\n harnessMetadata: {\n opencode: { missingSummary: true },\n },\n });\n }\n}\n\nasync function consumeEvents({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n state,\n emit,\n signal,\n onSubscribed,\n onEvent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n state: TranslationState;\n emit: Emit;\n signal: AbortSignal;\n onSubscribed?: () => void;\n onEvent?: (event: OpenCodeEvent) => boolean | void;\n}): Promise<void> {\n const stream = await subscribeLegacyEvents({ client, signal });\n onSubscribed?.();\n if (!stream) return;\n const taskSessionIds = new Set([sessionId]);\n const registerSubagentSession = (sourceSessionId: string) =>\n function register({\n parentSessionId,\n sessionId: subagentSessionId,\n }: {\n parentSessionId: string;\n sessionId: string;\n }) {\n if (\n parentSessionId === sourceSessionId &&\n taskSessionIds.has(sourceSessionId)\n ) {\n taskSessionIds.add(subagentSessionId);\n }\n };\n const emitStreamEvent = createEmitStreamEvent({\n state,\n emit,\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall: input => authorizeHostToolCall({ ...input, state }),\n onSubagentSession: registerSubagentSession(sessionId),\n isMcpToolName: toolName =>\n [...runtime.mcpToolPrefixes].some(prefix => toolName.startsWith(prefix)),\n stripWorkDir,\n formatError,\n });\n const descendantEventProcessors = new Map<\n string,\n (event: OpenCodeEvent) => void\n >();\n const processDescendantEvent = (\n descendantSessionId: string,\n event: OpenCodeEvent,\n ) => {\n let processEvent = descendantEventProcessors.get(descendantSessionId);\n if (!processEvent) {\n const descendantState = createTranslationState();\n let currentEvent: OpenCodeEvent | undefined;\n let modelId: string | undefined;\n const emittedUsageStepIds = new Set<string>();\n processEvent = createEmitStreamEvent({\n state: descendantState,\n emit: message => {\n if (message.type !== 'finish-step') return;\n const stepId = getSubagentStepId(currentEvent);\n if (!stepId || emittedUsageStepIds.has(stepId)) return;\n emittedUsageStepIds.add(stepId);\n const opencodeMetadata = asOpenCodeObject(\n message.harnessMetadata,\n )?.opencode;\n const cost = asOpenCodeObject(opencodeMetadata)?.cost;\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.subagent-usage',\n version: 1,\n sessionId: descendantSessionId,\n stepId,\n ...(modelId ? { modelId } : {}),\n usage: message.usage,\n ...(typeof cost === 'number' ? { cost } : {}),\n },\n });\n },\n emitWarning: () => undefined,\n emitError: () => undefined,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall: input =>\n authorizeHostToolCall({ ...input, state: descendantState }),\n onSubagentSession: registerSubagentSession(descendantSessionId),\n isMcpToolName: () => false,\n stripWorkDir,\n formatError,\n });\n const emitDescendantEvent = processEvent;\n processEvent = descendantEvent => {\n currentEvent = descendantEvent;\n if (descendantEvent.type === 'message.updated') {\n const info = openCodeMessageInfoFromValue(\n descendantEvent.properties?.info,\n );\n const providerID = stringValue(info?.providerID);\n const modelID = stringValue(info?.modelID);\n if (providerID && modelID) modelId = `${providerID}/${modelID}`;\n }\n emitDescendantEvent(descendantEvent);\n };\n descendantEventProcessors.set(descendantSessionId, processEvent);\n }\n processEvent(event);\n };\n for await (const rawEvent of stream) {\n if (signal.aborted || turn.abortSignal.aborted) break;\n const event = unwrapOpenCodeEvent(rawEvent);\n const eventSessionId = event ? getOpenCodeEventSessionId(event) : undefined;\n if (!event) continue;\n const scopedSessionId =\n !eventSessionId || eventSessionId === sessionId\n ? sessionId\n : taskSessionIds.has(eventSessionId)\n ? eventSessionId\n : undefined;\n if (!scopedSessionId) continue;\n const isDescendant = scopedSessionId !== sessionId;\n if (event.type === 'question.asked') {\n await handleQuestion({\n client,\n turn,\n emit,\n event,\n });\n } else if (event.type === 'permission.v2.asked') {\n await handlePermissionV2({\n client,\n sessionId: scopedSessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n } else if (event.type === 'permission.asked') {\n await handlePermission({\n client,\n sessionId: scopedSessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n } else if (isDescendant) {\n processDescendantEvent(scopedSessionId, event);\n } else {\n emitStreamEvent(event);\n }\n if (isDescendant) continue;\n if (onEvent?.(event)) break;\n }\n}\n\nfunction getSubagentStepId(event: OpenCodeEvent | undefined) {\n if (event?.type === 'message.part.updated') {\n const part = asOpenCodeObject(event.properties?.part);\n if (part?.type !== 'step-finish') return undefined;\n return stringValue(part.id) ?? stringValue(part.messageID) ?? event.id;\n }\n if (event?.type !== 'session.next.step.ended') return undefined;\n return stringValue(event.properties?.stepID) ?? event.id;\n}\n\nasync function handleQuestion({\n client,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const nativeRequest = event.properties as OpenCodeQuestionRequest | undefined;\n if (\n nativeRequest == null ||\n typeof nativeRequest.id !== 'string' ||\n typeof nativeRequest.sessionID !== 'string' ||\n !Array.isArray(nativeRequest.questions)\n ) {\n return;\n }\n const toolCallId = nativeRequest.tool?.callID ?? nativeRequest.id;\n\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: 'askUserQuestions',\n nativeName: 'question',\n input: JSON.stringify(toHarnessQuestionsInput(nativeRequest)),\n providerExecuted: false,\n providerMetadata: {\n opencode: {\n nativeRequest,\n },\n },\n });\n\n const questionKey = openCodeQuestionKey(nativeRequest);\n const result = await turn.requestToolResult({\n toolCallId,\n matches: candidate => {\n const continuedRequest = candidate.toolResult?.providerOptions?.opencode\n ?.nativeRequest as OpenCodeQuestionRequest | undefined;\n return (\n continuedRequest != null &&\n openCodeQuestionKey(continuedRequest) === questionKey\n );\n },\n });\n const nativeResponse = toOpenCodeQuestionResponse({\n nativeRequest,\n output: result.output as Parameters<\n typeof toOpenCodeQuestionResponse\n >[0]['output'],\n });\n\n const response =\n nativeResponse.action === 'reject'\n ? await client.question.reject({\n requestID: nativeRequest.id,\n directory: workdir,\n })\n : await client.question.reply({\n requestID: nativeRequest.id,\n directory: workdir,\n answers: nativeResponse.answers,\n });\n if (response.error != null) {\n throw new Error(\n `OpenCode question response failed: ${formatError(response.error)}`,\n );\n }\n}\n\nfunction sanitizeMcpToolName(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '_');\n}\n\nasync function handlePermissionV2({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const props = event.properties ?? {};\n const requestID = String(props.id ?? '');\n if (!requestID) return;\n const reply = await selectPermissionReply({\n action: String(props.action ?? ''),\n resources: Array.isArray(props.resources)\n ? props.resources.map(String)\n : [],\n requestID,\n toolCallId: String(props.source?.callID ?? requestID),\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n });\n await client.v2.session.permission.reply({\n sessionID: sessionId,\n requestID,\n reply: reply.reply,\n ...(reply.message ? { message: reply.message } : {}),\n });\n}\n\nasync function handlePermission({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const props = event.properties ?? {};\n const requestID = String(props.id ?? '');\n if (!requestID) return;\n const tool = asOpenCodeObject(props.tool);\n const reply = await selectPermissionReply({\n action: String(props.permission ?? ''),\n resources: Array.isArray(props.patterns) ? props.patterns.map(String) : [],\n requestID,\n toolCallId: String(tool?.callID ?? requestID),\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n });\n await client.permission.reply({\n requestID,\n directory: workdir,\n reply: reply.reply,\n ...(reply.message ? { message: reply.message } : {}),\n });\n void sessionId;\n}\n\nasync function selectPermissionReply({\n action,\n resources,\n requestID,\n toolCallId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n}: {\n action: string;\n resources: string[];\n requestID: string;\n toolCallId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<{ reply: 'once' | 'always' | 'reject'; message?: string }> {\n const toolName = toPermissionToolName(action);\n if (\n isBuiltinToolInactive({ toolName, toolFiltering: builtinToolFiltering })\n ) {\n emit({\n type: 'tool-approval-request',\n approvalId: requestID,\n toolCallId,\n });\n const decision = await turn.requestToolApproval(requestID);\n return decision.approved\n ? { reply: 'once' }\n : {\n reply: 'reject',\n ...(decision.reason ? { message: decision.reason } : {}),\n };\n }\n if (!permissionMode || permissionMode === 'allow-all') {\n return { reply: 'always' };\n }\n if (resources.some(resource => isExternalPath(resource))) {\n return { reply: 'reject', message: 'External directory access rejected.' };\n }\n const kind = TOOL_KIND[toolName] ?? 'bash';\n const allowed =\n permissionMode === 'allow-edits'\n ? kind === 'readonly' || kind === 'edit'\n : kind === 'readonly';\n if (allowed) return { reply: 'always' };\n\n emit({\n type: 'tool-approval-request',\n approvalId: requestID,\n toolCallId,\n });\n const decision = await turn.requestToolApproval(requestID);\n return decision.approved\n ? { reply: 'once' }\n : {\n reply: 'reject',\n ...(decision.reason ? { message: decision.reason } : {}),\n };\n}\n\nfunction toPermissionToolName(action: string): string {\n const normalized = action.toLowerCase();\n if (normalized.includes('bash') || normalized.includes('shell'))\n return 'bash';\n if (normalized.includes('edit')) return 'edit';\n if (normalized.includes('write')) return 'write';\n if (normalized.includes('webfetch')) return 'webfetch';\n if (normalized.includes('task') || normalized.includes('agent'))\n return 'agent';\n if (normalized.includes('list')) return 'ls';\n if (normalized.includes('grep')) return 'grep';\n if (normalized.includes('glob')) return 'glob';\n if (normalized.includes('read')) return 'read';\n return toWireToolName(normalized);\n}\n\nfunction resolveInactiveBuiltinToolNames(\n start: StartMessage,\n): ReadonlyArray<string> {\n const toolFiltering = start.builtinToolFiltering;\n if (toolFiltering == null) return [];\n return toolFiltering.mode === 'allow'\n ? Object.keys(PUBLIC_TO_NATIVE).filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n}\n\nfunction isBuiltinToolInactive(input: {\n toolName: string;\n toolFiltering: StartMessage['builtinToolFiltering'];\n}): boolean {\n if (input.toolFiltering == null) return false;\n return input.toolFiltering.mode === 'allow'\n ? !input.toolFiltering.toolNames.includes(input.toolName)\n : input.toolFiltering.toolNames.includes(input.toolName);\n}\n\nfunction isExternalPath(resource: string): boolean {\n if (!path.isAbsolute(resource)) return false;\n return (\n !isPathInsideOrEqual(resource, workdir) &&\n (!skillsDir || !isPathInsideOrEqual(resource, skillsDir))\n );\n}\n\nfunction isPathInsideOrEqual(file: string, root: string): boolean {\n const relative = path.relative(\n canonicalizeForContainment(root),\n canonicalizeForContainment(file),\n );\n return (\n relative === '' ||\n (relative !== '..' &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction canonicalizeForContainment(inputPath: string): string {\n const normalized = path.resolve(inputPath);\n try {\n return realpathSync.native(normalized);\n } catch {\n const parent = path.dirname(normalized);\n return parent === normalized\n ? normalized\n : path.join(\n canonicalizeForContainment(parent),\n path.basename(normalized),\n );\n }\n}\n\nfunction toWireToolName(nativeName: string): string {\n return (\n NATIVE_TO_COMMON[nativeName] ?? OPENCODE_TO_WIRE[nativeName] ?? nativeName\n );\n}\n\nfunction nativeNameField({\n nativeName,\n toolName,\n}: {\n nativeName: string;\n toolName: string;\n}): { nativeName?: string } {\n if (!nativeName || nativeName === toolName || toolName === 'agent') return {};\n return { nativeName };\n}\n\nfunction getHostToolName(\n toolName: string,\n rawToolName: unknown,\n): string | undefined {\n if (runtime.toolNames.has(toolName)) return toolName;\n if (typeof rawToolName === 'string' && runtime.toolNames.has(rawToolName)) {\n return rawToolName;\n }\n if (\n typeof rawToolName === 'string' &&\n rawToolName.startsWith('harness-tools_') &&\n runtime.toolNames.has(rawToolName.slice('harness-tools_'.length))\n ) {\n return rawToolName.slice('harness-tools_'.length);\n }\n}\n\nfunction authorizeHostToolCall({\n callID,\n toolName,\n input,\n state,\n}: {\n callID: string;\n toolName: string;\n input: unknown;\n state: TranslationState;\n}): void {\n if (state.hostToolCallsAuthorized.has(callID)) return;\n state.hostToolCallsAuthorized.add(callID);\n runtime.relay?.authorizeToolCall({ toolName, input });\n}\n\nasync function emitContextFallback({\n client,\n sessionId,\n assistantBaseline,\n state,\n emit,\n emitContent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n assistantBaseline: AssistantSnapshotBaseline;\n state: TranslationState;\n emit: Emit;\n emitContent: boolean;\n}): Promise<boolean> {\n const assistant = await latestAssistantSnapshot({ client, sessionId });\n if (\n !assistant ||\n !isAssistantSnapshotAfterBaseline({\n assistant,\n baseline: assistantBaseline,\n })\n ) {\n return false;\n }\n emitOpenCodeStreamStart({ info: assistant, state, emit });\n if (emitContent && Array.isArray(assistant.contentParts)) {\n for (const part of assistant.contentParts) {\n emitAssistantContentPart(part, emit);\n }\n }\n const rawFinish =\n typeof assistant.finish === 'string'\n ? assistant.finish\n : assistant.error\n ? 'error'\n : 'stop';\n emit({\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(rawFinish),\n raw: rawFinish,\n },\n usage: mapUsage(assistant.tokens),\n ...(typeof assistant.cost === 'number'\n ? {\n harnessMetadata: {\n opencode: { cost: assistant.cost, fallback: true },\n },\n }\n : { harnessMetadata: { opencode: { fallback: true } } }),\n });\n return true;\n}\n\nasync function readSessionTokens({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<OpenCodeTokenUsage | undefined> {\n const session = await legacySessionGet({ client, sessionId });\n if (session.error) return undefined;\n return extractSessionTokens(session.data);\n}\n\ntype AssistantSnapshot = {\n id?: unknown;\n contentParts?: unknown[];\n metadata?: unknown;\n model?: unknown;\n modelID?: unknown;\n providerID?: unknown;\n tokens?: unknown;\n finish?: unknown;\n cost?: unknown;\n error?: unknown;\n};\n\nasync function latestAssistantSnapshot({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<AssistantSnapshot | undefined> {\n const legacy = await (client as any).session\n .messages({ sessionID: sessionId, limit: 20 })\n .catch(() => undefined);\n const legacyAssistant = latestLegacyAssistantMessage(legacy?.data);\n if (legacyAssistant) return legacyAssistant;\n\n const context = await client.v2.session\n .context({ sessionID: sessionId })\n .catch(() => undefined);\n if (!context || context.error) return undefined;\n return latestV2AssistantMessage(context.data);\n}\n\nfunction latestLegacyAssistantMessage(\n data: unknown,\n): AssistantSnapshot | undefined {\n const messages = Array.isArray(data) ? data : [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const item = messages[i];\n if (!item || typeof item !== 'object') continue;\n const record = item as { info?: unknown; parts?: unknown };\n const info = record.info;\n if (\n info &&\n typeof info === 'object' &&\n (info as { role?: unknown }).role === 'assistant'\n ) {\n return {\n ...(info as Record<string, unknown>),\n contentParts: Array.isArray(record.parts) ? record.parts : undefined,\n };\n }\n }\n}\n\nfunction latestV2AssistantMessage(\n data: unknown,\n): AssistantSnapshot | undefined {\n const messages =\n data &&\n typeof data === 'object' &&\n Array.isArray((data as { data?: unknown }).data)\n ? (data as { data: unknown[] }).data\n : Array.isArray(data)\n ? data\n : [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (\n message &&\n typeof message === 'object' &&\n (message as { type?: unknown }).type === 'assistant'\n ) {\n const record = message as Record<string, unknown>;\n return {\n ...record,\n contentParts: Array.isArray(record.content)\n ? record.content\n : undefined,\n };\n }\n }\n}\n\nfunction emitAssistantContentPart(part: unknown, emit: Emit): void {\n if (!part || typeof part !== 'object') return;\n const value = part as { type?: unknown; id?: unknown; text?: unknown };\n if (value.type !== 'text' && value.type !== 'reasoning') return;\n const id =\n typeof value.id === 'string' && value.id.length > 0\n ? value.id\n : `${value.type}-${randomUUID()}`;\n const text = typeof value.text === 'string' ? value.text : '';\n if (value.type === 'text') {\n emit({ type: 'text-start', id });\n if (text) emit({ type: 'text-delta', id, delta: text });\n emit({ type: 'text-end', id });\n return;\n }\n emit({ type: 'reasoning-start', id });\n if (text) emit({ type: 'reasoning-delta', id, delta: text });\n emit({ type: 'reasoning-end', id });\n}\n\nasync function startToolRelay({\n tools,\n emit,\n requestToolResult,\n}: {\n tools: ReadonlyArray<{ name: string }>;\n emit: Emit;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n}): Promise<ToolRelay> {\n return startAuthorizedToolRelay({ tools, emit, requestToolResult });\n}\n\nfunction createDeferred<T>(): {\n promise: Promise<T>;\n resolve(value: T | PromiseLike<T>): void;\n} {\n let resolve!: (value: T | PromiseLike<T>) => void;\n const promise = new Promise<T>(res => {\n resolve = res;\n });\n return { promise, resolve };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction splitModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return { providerID, modelID: rest.join('/') };\n }\n return { providerID: provider, modelID: model };\n}\n\ntype OpenCodeModelRef = { providerID: string; modelID: string };\n\nasync function resolveCompactionModel({\n client,\n sessionId,\n start,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<OpenCodeModelRef | undefined> {\n const assistant = await latestAssistantSnapshot({ client, sessionId }).catch(\n () => undefined,\n );\n const assistantModel = modelRefFromAssistantSnapshot(assistant);\n if (assistantModel) return assistantModel;\n\n const session = await legacySessionGet({ client, sessionId }).catch(\n () => undefined,\n );\n const sessionModel = modelRefFromSessionInfo(session?.data);\n if (sessionModel) return sessionModel;\n\n return modelRefFromStart(start);\n}\n\nfunction modelRefFromAssistantSnapshot(\n assistant: AssistantSnapshot | undefined,\n): OpenCodeModelRef | undefined {\n if (!assistant) return undefined;\n const model = modelRefFromValue(assistant.model);\n if (model) return model;\n\n const direct = modelRefFromValue(assistant);\n if (direct) return direct;\n\n return modelRefFromValue(asOpenCodeObject(assistant.metadata)?.assistant);\n}\n\nfunction modelRefFromSessionInfo(data: unknown): OpenCodeModelRef | undefined {\n const session = asOpenCodeObject(data);\n if (!session) return undefined;\n return modelRefFromValue(session.model) ?? modelRefFromObject(session);\n}\n\nfunction modelRefFromStart(start: StartMessage): OpenCodeModelRef | undefined {\n const model = splitModel(start.model, start.provider);\n if (!model.modelID) return undefined;\n return {\n providerID:\n model.providerID ?? start.provider ?? procEnv.OPENAI_NAME ?? 'anthropic',\n modelID: model.modelID,\n };\n}\n\nfunction modelRefFromValue(value: unknown): OpenCodeModelRef | undefined {\n const model = asOpenCodeObject(value);\n return model ? modelRefFromObject(model) : undefined;\n}\n\nfunction modelRefFromObject(\n value: OpenCodeObject,\n): OpenCodeModelRef | undefined {\n const providerID = stringValue(value.providerID);\n const modelID = stringValue(value.modelID ?? value.id);\n if (!providerID || !modelID) return undefined;\n return { providerID, modelID };\n}\n\nfunction stripWorkDir(file: string): string {\n if (!file) return file;\n const normalized = path.resolve(file);\n const root = path.resolve(workdir);\n return normalized.startsWith(`${root}/`)\n ? normalized.slice(root.length + 1)\n : file;\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n bootstrapDir?: string;\n skillsDir?: string;\n} {\n const out: {\n workdir?: string;\n bridgeStateDir?: string;\n bootstrapDir?: string;\n skillsDir?: string;\n } = {};\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 } else if (args[i] === '--bootstrap-dir' && i + 1 < args.length) {\n out.bootstrapDir = args[++i];\n } else if (args[i] === '--skills-dir' && i + 1 < args.length) {\n out.skillsDir = args[++i];\n }\n }\n return out;\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n const cause = 'cause' in error ? error.cause : undefined;\n if (cause === undefined) return error.message;\n return `${error.message}: ${formatError(cause)}`;\n }\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction emitFatal(message: string): never {\n process.stderr.write(`[OpenCode bridge] ${message}\\n`);\n process.exit(1);\n}\n","export type OpenCodeObject = Record<string, unknown>;\n\nexport type OpenCodeMessageInfo = {\n id?: unknown;\n sessionID?: unknown;\n role?: unknown;\n summary?: unknown;\n error?: unknown;\n type?: unknown;\n providerID?: unknown;\n modelID?: unknown;\n tokens?: unknown;\n};\n\nexport type OpenCodeEventProperties = OpenCodeObject & {\n info?: OpenCodeMessageInfo;\n provider?: { metadata?: unknown };\n source?: { callID?: unknown };\n status?: {\n type?: unknown;\n attempt?: unknown;\n message?: unknown;\n };\n};\n\nexport type OpenCodeEvent = {\n id?: string;\n type?: string;\n properties?: OpenCodeEventProperties;\n};\n\nexport function asOpenCodeObject(value: unknown): OpenCodeObject | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as OpenCodeObject)\n : undefined;\n}\n","import {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeEventProperties,\n type OpenCodeMessageInfo,\n} from './opencode-types';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nexport type TranslationState = {\n streamStarted: boolean;\n textDeltas: Map<string, string>;\n reasoningDeltas: Map<string, string>;\n toolInputs: Map<string, string>;\n toolNames: Map<string, { rawToolName: string; toolName: string }>;\n toolCallsEmitted: Set<string>;\n toolResultsEmitted: Set<string>;\n hostToolCallsAuthorized: Set<string>;\n shellCommands: Map<string, string>;\n messageRoles: Map<string, string>;\n turnUsage: Record<string, unknown> | undefined;\n legacyTextPartIds: Set<string>;\n legacyReasoningPartIds: Set<string>;\n legacyStepFinishPartIds: Set<string>;\n dynamicToolCallIds: Set<string>;\n};\n\nexport function createTranslationState(): TranslationState {\n return {\n streamStarted: false,\n textDeltas: new Map(),\n reasoningDeltas: new Map(),\n toolInputs: new Map(),\n toolNames: new Map(),\n toolCallsEmitted: new Set(),\n toolResultsEmitted: new Set(),\n hostToolCallsAuthorized: new Set(),\n shellCommands: new Map(),\n messageRoles: new Map(),\n turnUsage: undefined,\n legacyTextPartIds: new Set(),\n legacyReasoningPartIds: new Set(),\n legacyStepFinishPartIds: new Set(),\n dynamicToolCallIds: new Set(),\n };\n}\n\nexport function emitOpenCodeStreamStart({\n info,\n state,\n emit,\n}: {\n info: unknown;\n state: TranslationState;\n emit: Emit;\n}): void {\n if (state.streamStarted) return;\n const message = openCodeMessageInfoFromValue(info);\n if (!message) return;\n if (message.role !== 'assistant' && message.type !== 'assistant') return;\n const providerID = stringValue(message.providerID);\n const modelID = stringValue(message.modelID);\n const modelId =\n providerID && modelID ? `${providerID}/${modelID}` : undefined;\n\n state.streamStarted = true;\n emit({ type: 'stream-start', ...(modelId ? { modelId } : {}) });\n}\n\nexport function unwrapOpenCodeEvent(\n rawEvent: unknown,\n): OpenCodeEvent | undefined {\n const raw = asOpenCodeObject(rawEvent);\n if (!raw) return undefined;\n if (raw.type === 'sync' && raw.syncEvent) {\n const sync = asOpenCodeObject(raw.syncEvent);\n if (!sync) return undefined;\n return {\n id: String(sync.id ?? raw.id ?? ''),\n type: stripSyncVersion(String(sync.type ?? '')),\n properties: openCodeEventPropertiesFromValue(sync.data) ?? {},\n };\n }\n return {\n id: typeof raw.id === 'string' ? raw.id : undefined,\n type: typeof raw.type === 'string' ? stripSyncVersion(raw.type) : undefined,\n properties:\n openCodeEventPropertiesFromValue(raw.properties) ??\n openCodeEventPropertiesFromValue(raw.data) ??\n {},\n };\n}\n\nexport function getOpenCodeEventSessionId(\n event: OpenCodeEvent,\n): string | undefined {\n const props = event.properties;\n if (!props) return undefined;\n if (typeof props.sessionID === 'string') return props.sessionID;\n if (typeof props.sessionId === 'string') return props.sessionId;\n if (event.type?.startsWith('session.') && typeof props.id === 'string') {\n return props.id;\n }\n const info = asOpenCodeObject(props.info);\n if (typeof info?.sessionID === 'string') return info.sessionID;\n if (\n (event.type === 'session.created' ||\n event.type === 'session.updated' ||\n event.type === 'session.deleted') &&\n typeof info?.id === 'string'\n ) {\n return info.id;\n }\n const part = props.part;\n const partObject = asOpenCodeObject(part);\n if (typeof partObject?.sessionID === 'string') return partObject.sessionID;\n}\n\nexport function isStepSettlementEvent(event: OpenCodeEvent): boolean {\n return (\n event.type === 'session.next.step.ended' ||\n event.type === 'session.next.step.failed' ||\n event.type === 'session.error'\n );\n}\n\nexport function emitMissingFinalDelta({\n id,\n fullText,\n emittedText,\n emit,\n type,\n}: {\n id: string;\n fullText: string | undefined;\n emittedText: string;\n emit: (msg: Record<string, unknown>) => void;\n type: 'text-delta' | 'reasoning-delta';\n}): void {\n if (\n !fullText ||\n fullText === emittedText ||\n !fullText.startsWith(emittedText)\n ) {\n return;\n }\n emit({ type, id, delta: fullText.slice(emittedText.length) });\n}\n\n/**\n * Translates an OpenCode `message.part.delta` event (a streaming text or\n * reasoning delta) into legacy stream parts.\n */\nexport function emitLegacyPartDelta({\n props,\n state,\n emit,\n}: {\n props: Record<string, unknown>;\n state: TranslationState;\n emit: Emit;\n}): void {\n const field = String(props.field ?? '');\n const delta = String(props.delta ?? '');\n if (!delta) return;\n const messageID = stringValue(props.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return;\n if (field === 'text') {\n const id = legacyPartId({ value: props, fallback: 'legacy-text' });\n // OpenCode publishes reasoning deltas with field:\"text\". If this id was\n // already announced as a reasoning part, route it to reasoning so it is not\n // duplicated as a text part.\n if (state.legacyReasoningPartIds.has(id)) {\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${delta}`,\n );\n emit({ type: 'reasoning-delta', id, delta });\n return;\n }\n startLegacyPart({ ids: state.legacyTextPartIds, id, emit, type: 'text' });\n state.textDeltas.set(id, `${state.textDeltas.get(id) ?? ''}${delta}`);\n emit({ type: 'text-delta', id, delta });\n return;\n }\n if (field === 'reasoning') {\n const id = legacyPartId({ value: props, fallback: 'legacy-reasoning' });\n startLegacyPart({\n ids: state.legacyReasoningPartIds,\n id,\n emit,\n type: 'reasoning',\n });\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${delta}`,\n );\n emit({ type: 'reasoning-delta', id, delta });\n }\n}\n\n/**\n * Translates an OpenCode `message.part.updated` event for a text or reasoning\n * part. Returns `true` when it handled the part.\n */\nexport function emitLegacyTextPartUpdate({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n const textPart = legacyTextPartFromValue(part);\n if (!textPart) return false;\n const id = stringValue(textPart.id);\n if (!id) return true;\n\n const messageID = stringValue(textPart.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return true;\n\n const isReasoning = textPart.type === 'reasoning';\n const ids = isReasoning\n ? state.legacyReasoningPartIds\n : state.legacyTextPartIds;\n const deltaMap = isReasoning ? state.reasoningDeltas : state.textDeltas;\n const deltaType = isReasoning ? 'reasoning-delta' : 'text-delta';\n const text = typeof textPart.text === 'string' ? textPart.text : undefined;\n\n startLegacyPart({\n ids,\n id,\n emit,\n type: isReasoning ? 'reasoning' : 'text',\n });\n\n if (text !== undefined) {\n emitMissingFinalDelta({\n id,\n fullText: text,\n emittedText: deltaMap.get(id) ?? '',\n emit,\n type: deltaType,\n });\n deltaMap.set(id, text);\n }\n\n if (textPart.time?.end != null) {\n ids.delete(id);\n deltaMap.delete(id);\n emit({ type: isReasoning ? 'reasoning-end' : 'text-end', id });\n }\n\n return true;\n}\n\nfunction stripSyncVersion(type: string): string {\n return type.replace(/\\.\\d+$/, '');\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction legacyPartId({\n value,\n fallback,\n}: {\n value: Record<string, unknown>;\n fallback: string;\n}): string {\n return stringValue(value.partID) ?? stringValue(value.id) ?? fallback;\n}\n\nfunction startLegacyPart({\n ids,\n id,\n emit,\n type,\n}: {\n ids: Set<string>;\n id: string;\n emit: Emit;\n type: 'text' | 'reasoning';\n}): void {\n if (ids.has(id)) return;\n ids.add(id);\n emit({ type: `${type}-start`, id });\n}\n\nexport function openCodeMessageInfoFromValue(\n value: unknown,\n): OpenCodeMessageInfo | undefined {\n return asOpenCodeObject(value) as OpenCodeMessageInfo | undefined;\n}\n\nfunction openCodeEventPropertiesFromValue(\n value: unknown,\n): OpenCodeEventProperties | undefined {\n return asOpenCodeObject(value) as OpenCodeEventProperties | undefined;\n}\n\ntype LegacyTextPart = {\n type: 'text' | 'reasoning';\n id?: unknown;\n messageID?: unknown;\n text?: unknown;\n time?: { end?: unknown };\n};\n\nfunction legacyTextPartFromValue(value: unknown): LegacyTextPart | undefined {\n const part = asOpenCodeObject(value);\n if (!part || (part.type !== 'text' && part.type !== 'reasoning')) {\n return undefined;\n }\n return {\n type: part.type,\n id: part.id,\n messageID: part.messageID,\n text: part.text,\n time: asOpenCodeObject(part.time),\n };\n}\n","export type AssistantSnapshotBaseline = {\n assistantExisted: boolean;\n assistantId?: string;\n};\n\nexport function createAssistantSnapshotBaseline(\n assistant: { id?: unknown } | undefined,\n): AssistantSnapshotBaseline {\n return {\n assistantExisted: assistant != null,\n ...(typeof assistant?.id === 'string' ? { assistantId: assistant.id } : {}),\n };\n}\n\nexport function isAssistantSnapshotAfterBaseline({\n assistant,\n baseline,\n}: {\n assistant: { id?: unknown };\n baseline: AssistantSnapshotBaseline;\n}): boolean {\n if (typeof assistant.id !== 'string') return false;\n if (!baseline.assistantExisted) return true;\n return baseline.assistantId != null && assistant.id !== baseline.assistantId;\n}\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport { asOpenCodeObject } from './opencode-types';\n\ntype FinishStepEvent = Extract<HarnessV1StreamPart, { type: 'finish-step' }>;\n\nexport type OpenCodeTokenUsage = {\n readonly input: number;\n readonly output: number;\n readonly reasoning: number;\n readonly cache: {\n readonly read: number;\n readonly write: number;\n };\n};\n\nexport type HarnessUsage = FinishStepEvent['usage'];\n\nexport function mapUsage(tokens: unknown): HarnessUsage {\n const value = extractOpenCodeTokens(tokens) ?? zeroOpenCodeTokens();\n const cacheRead = value.cache.read;\n return {\n inputTokens: {\n total: value.input,\n noCache: Math.max(0, value.input - cacheRead),\n cacheRead,\n cacheWrite: value.cache.write,\n },\n outputTokens: {\n total: value.output + value.reasoning,\n text: value.output,\n reasoning: value.reasoning,\n },\n };\n}\n\nexport function defaultUsage(): HarnessUsage {\n return mapUsage(zeroOpenCodeTokens());\n}\n\nexport function extractSessionTokens(\n value: unknown,\n): OpenCodeTokenUsage | undefined {\n const record = asOpenCodeObject(value) as SessionTokenEnvelope | undefined;\n if (!record) return undefined;\n const tokens =\n extractOpenCodeTokens(record.tokens) ??\n extractOpenCodeTokens(record.info?.tokens) ??\n extractOpenCodeTokens(record.data?.tokens) ??\n extractOpenCodeTokens(record.data?.data?.tokens);\n return tokens;\n}\n\nexport function subtractSessionTokens({\n before,\n after,\n}: {\n before: OpenCodeTokenUsage;\n after: OpenCodeTokenUsage;\n}): OpenCodeTokenUsage {\n return {\n input: diff({ before: before.input, after: after.input }),\n output: diff({ before: before.output, after: after.output }),\n reasoning: diff({ before: before.reasoning, after: after.reasoning }),\n cache: {\n read: diff({ before: before.cache.read, after: after.cache.read }),\n write: diff({ before: before.cache.write, after: after.cache.write }),\n },\n };\n}\n\nexport function addUsage({\n left,\n right,\n}: {\n left: HarnessUsage | undefined;\n right: HarnessUsage;\n}): HarnessUsage {\n if (left == null) return right;\n const leftInput = asTokenGroup(left.inputTokens);\n const rightInput = asTokenGroup(right.inputTokens);\n const leftOutput = asTokenGroup(left.outputTokens);\n const rightOutput = asTokenGroup(right.outputTokens);\n return {\n inputTokens: {\n total: add({ left: leftInput.total, right: rightInput.total }),\n noCache: add({ left: leftInput.noCache, right: rightInput.noCache }),\n cacheRead: add({\n left: leftInput.cacheRead,\n right: rightInput.cacheRead,\n }),\n cacheWrite: add({\n left: leftInput.cacheWrite,\n right: rightInput.cacheWrite,\n }),\n },\n outputTokens: {\n total: add({ left: leftOutput.total, right: rightOutput.total }),\n text: add({ left: leftOutput.text, right: rightOutput.text }),\n reasoning: add({\n left: leftOutput.reasoning,\n right: rightOutput.reasoning,\n }),\n },\n };\n}\n\nfunction extractOpenCodeTokens(value: unknown): OpenCodeTokenUsage | undefined {\n const record = asOpenCodeObject(value);\n const cache = asOpenCodeObject(record?.cache);\n if (!record || !cache) return undefined;\n return {\n input: numberValue(record.input),\n output: numberValue(record.output),\n reasoning: numberValue(record.reasoning),\n cache: {\n read: numberValue(cache.read),\n write: numberValue(cache.write),\n },\n };\n}\n\nfunction zeroOpenCodeTokens(): OpenCodeTokenUsage {\n return {\n input: 0,\n output: 0,\n reasoning: 0,\n cache: { read: 0, write: 0 },\n };\n}\n\nfunction asTokenGroup(value: unknown): Record<string, number | undefined> {\n return (\n (asOpenCodeObject(value) as\n | Record<string, number | undefined>\n | undefined) ?? {}\n );\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction diff({ before, after }: { before: number; after: number }): number {\n return Math.max(0, after - before);\n}\n\nfunction add({\n left,\n right,\n}: {\n left: unknown;\n right: unknown;\n}): number | undefined {\n const leftNumber = typeof left === 'number' ? left : undefined;\n const rightNumber = typeof right === 'number' ? right : undefined;\n return leftNumber == null && rightNumber == null\n ? undefined\n : (leftNumber ?? 0) + (rightNumber ?? 0);\n}\n\ntype SessionTokenEnvelope = {\n tokens?: unknown;\n info?: { tokens?: unknown };\n data?: {\n tokens?: unknown;\n data?: { tokens?: unknown };\n };\n};\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport { mapUsage } from './opencode-usage';\nimport { asOpenCodeObject } from './opencode-types';\n\ntype FinishStepEvent = Extract<HarnessV1StreamPart, { type: 'finish-step' }>;\n\nexport function mapOpenCodeFinishReason(\n reason: string,\n): 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' {\n const normalized = reason.toLowerCase();\n if (normalized.includes('length')) return 'length';\n if (normalized.includes('filter')) return 'content-filter';\n if (normalized.includes('tool')) return 'tool-calls';\n if (normalized.includes('error') || normalized.includes('fail'))\n return 'error';\n if (normalized === 'stop' || normalized === 'end') return 'stop';\n return 'other';\n}\n\nexport function legacyStepFinishPartToFinishStep(\n part: unknown,\n): FinishStepEvent | undefined {\n return translateLegacyStepFinishPart(part)?.event;\n}\n\nexport function translateLegacyStepFinishPart(\n value: unknown,\n): { event: FinishStepEvent; partId?: string } | undefined {\n const part = asOpenCodeObject(value);\n if (!part || part.type !== 'step-finish') return undefined;\n const rawFinish = typeof part.reason === 'string' ? part.reason : 'stop';\n const event: FinishStepEvent = {\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(rawFinish),\n raw: rawFinish,\n },\n usage: mapUsage(part.tokens),\n ...(typeof part.cost === 'number'\n ? { harnessMetadata: { opencode: { cost: part.cost } } }\n : {}),\n };\n return {\n event,\n ...(typeof part.id === 'string' ? { partId: part.id } : {}),\n };\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport {\n emitLegacyPartDelta,\n emitLegacyTextPartUpdate,\n emitMissingFinalDelta,\n emitOpenCodeStreamStart,\n openCodeMessageInfoFromValue,\n type TranslationState,\n} from './opencode-events';\nimport {\n mapOpenCodeFinishReason,\n translateLegacyStepFinishPart,\n} from './opencode-finish-step';\nimport { mapUsage } from './opencode-usage';\nimport {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeEventProperties,\n} from './opencode-types';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\ntype SubagentSession = {\n parentSessionId: string;\n sessionId: string;\n};\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitError,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n stripWorkDir,\n formatError,\n}: {\n state: TranslationState;\n emit: Emit;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n toWireToolName: (nativeName: string) => string;\n nativeNameField: (input: { nativeName: string; toolName: string }) => {\n nativeName?: string;\n };\n getHostToolName: (\n toolName: string,\n rawToolName: unknown,\n ) => string | undefined;\n authorizeHostToolCall: (input: {\n callID: string;\n toolName: string;\n input: unknown;\n }) => void;\n onSubagentSession?: (session: SubagentSession) => void;\n isMcpToolName: (toolName: string) => boolean;\n stripWorkDir: (file: string) => string;\n formatError: (error: unknown) => string;\n}): (event: OpenCodeEvent) => void {\n const compactionMessages = new Set<string>();\n let compactionTrigger: 'auto' | 'manual' = 'auto';\n let compaction:\n | { id: string; trigger: 'auto' | 'manual'; text: Map<string, string> }\n | undefined;\n const finishCompaction = (failed = false) => {\n if (!compaction) return;\n if (failed) {\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.compaction',\n messageId: compaction.id,\n status: 'failed',\n },\n });\n } else {\n emit({\n type: 'compaction',\n trigger: compaction.trigger,\n summary: [...compaction.text.values()].join(''),\n harnessMetadata: { opencode: { messageId: compaction.id } },\n });\n }\n compaction = undefined;\n };\n\n return event => {\n const type = event.type;\n const props = event.properties ?? {};\n\n if (type === 'message.updated') {\n const info = openCodeMessageInfoFromValue(props.info);\n if (info) {\n const id = stringValue(info.id);\n const role = stringValue(info.role);\n if (id && role) state.messageRoles.set(id, role);\n if (id && info.summary === true) {\n if (!compactionMessages.has(id)) {\n compactionMessages.add(id);\n compaction = { id, trigger: compactionTrigger, text: new Map() };\n emitOpenCodeStreamStart({ info, state, emit });\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.compaction',\n messageId: id,\n status: 'started',\n },\n });\n }\n if (info.error && compaction?.id === id) finishCompaction(true);\n }\n }\n return;\n }\n\n if (type === 'session.compacted') {\n finishCompaction();\n return;\n }\n if (type === 'message.part.updated' || type === 'message.part.delta') {\n const part = asOpenCodeObject(props.part);\n if (type === 'message.part.updated' && part?.type === 'compaction') {\n compactionTrigger = part.auto === false ? 'manual' : 'auto';\n return;\n }\n const messageId = stringValue(\n type === 'message.part.updated' ? part?.messageID : props.messageID,\n );\n if (messageId && compactionMessages.has(messageId)) {\n if (type === 'message.part.updated') {\n if (messageId === compaction?.id && part?.type === 'text') {\n const id = stringValue(part.id);\n if (id && typeof part.text === 'string') {\n compaction.text.set(id, part.text);\n }\n }\n emitLegacyStepFinishPart({ part: props.part, state, emit });\n } else if (messageId === compaction?.id && props.field === 'text') {\n const id = stringValue(props.partID);\n if (\n id &&\n compaction.text.has(id) &&\n typeof props.delta === 'string'\n ) {\n compaction.text.set(id, compaction.text.get(id)! + props.delta);\n }\n }\n return;\n }\n }\n\n if (type === 'message.part.delta') {\n emitLegacyPartDelta({ props, state, emit });\n return;\n }\n\n if (type === 'message.part.updated') {\n if (emitLegacyTextPartUpdate({ part: props.part, state, emit })) return;\n if (emitLegacyStepFinishPart({ part: props.part, state, emit })) return;\n emitLegacyToolPart({\n part: props.part,\n state,\n emit,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n });\n return;\n }\n\n if (type === 'session.next.text.started') {\n emit({ type: 'text-start', id: String(props.textID ?? event.id) });\n return;\n }\n if (type === 'session.next.text.delta') {\n const id = String(props.textID ?? event.id);\n state.textDeltas.set(\n id,\n `${state.textDeltas.get(id) ?? ''}${String(props.delta ?? '')}`,\n );\n emit({\n type: 'text-delta',\n id,\n delta: String(props.delta ?? ''),\n });\n return;\n }\n if (type === 'session.next.text.ended') {\n const id = String(props.textID ?? event.id);\n emitMissingFinalDelta({\n id,\n fullText: typeof props.text === 'string' ? props.text : undefined,\n emittedText: state.textDeltas.get(id) ?? '',\n emit,\n type: 'text-delta',\n });\n emit({ type: 'text-end', id });\n return;\n }\n if (type === 'session.next.reasoning.started') {\n emit({\n type: 'reasoning-start',\n id: String(props.reasoningID ?? event.id),\n });\n return;\n }\n if (type === 'session.next.reasoning.delta') {\n const id = String(props.reasoningID ?? event.id);\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${String(props.delta ?? '')}`,\n );\n emit({\n type: 'reasoning-delta',\n id,\n delta: String(props.delta ?? ''),\n });\n return;\n }\n if (type === 'session.next.reasoning.ended') {\n const id = String(props.reasoningID ?? event.id);\n emitMissingFinalDelta({\n id,\n fullText: typeof props.text === 'string' ? props.text : undefined,\n emittedText: state.reasoningDeltas.get(id) ?? '',\n emit,\n type: 'reasoning-delta',\n });\n emit({ type: 'reasoning-end', id });\n return;\n }\n if (type === 'session.next.shell.started') {\n const callID = String(props.callID ?? event.id);\n const command = String(props.command ?? '');\n state.shellCommands.set(callID, command);\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName: 'bash',\n nativeName: 'bash',\n input: JSON.stringify({ command }),\n providerExecuted: true,\n });\n return;\n }\n if (type === 'session.next.shell.ended') {\n const callID = String(props.callID ?? event.id);\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName: 'bash',\n result: {\n command: state.shellCommands.get(callID) ?? '',\n output: String(props.output ?? ''),\n },\n });\n return;\n }\n if (type === 'session.next.tool.input.delta') {\n const callID = String(props.callID ?? event.id);\n state.toolInputs.set(\n callID,\n `${state.toolInputs.get(callID) ?? ''}${String(props.delta ?? '')}`,\n );\n return;\n }\n if (type === 'session.next.tool.input.ended') {\n state.toolInputs.set(\n String(props.callID ?? event.id),\n String(props.text ?? ''),\n );\n return;\n }\n if (type === 'session.next.tool.called') {\n const callID = String(props.callID ?? event.id);\n const rawToolName = String(props.tool ?? 'unknown');\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') {\n return;\n }\n const toolName = toWireToolName(rawToolName);\n state.toolNames.set(callID, { rawToolName, toolName });\n const hostToolName = getHostToolName(toolName, props.tool);\n if (hostToolName) {\n authorizeHostToolCall({\n callID,\n toolName: hostToolName,\n input: props.input ?? parseToolInput(state, props),\n });\n return;\n }\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName,\n ...nativeNameField({ nativeName: rawToolName, toolName }),\n input: JSON.stringify(props.input ?? parseToolInput(state, props)),\n providerExecuted: true,\n ...(isMcpToolName(rawToolName) ? { dynamic: true } : {}),\n ...(props.provider?.metadata\n ? { providerMetadata: props.provider.metadata }\n : {}),\n });\n if (isMcpToolName(rawToolName)) state.dynamicToolCallIds.add(callID);\n return;\n }\n if (\n type === 'session.next.tool.success' ||\n type === 'session.next.tool.failed'\n ) {\n const callID = String(props.callID ?? event.id);\n const cachedTool = state.toolNames.get(callID);\n const rawToolName =\n cachedTool?.rawToolName ??\n String((props as { tool?: unknown }).tool ?? '');\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') {\n return;\n }\n const toolName =\n cachedTool?.toolName ?? toWireToolName(rawToolName || 'unknown');\n if (getHostToolName(toolName, rawToolName)) return;\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName,\n result:\n props.result ??\n props.structured ??\n ('content' in props ? props.content : null) ??\n null,\n ...(type === 'session.next.tool.failed' ? { isError: true } : {}),\n ...(state.dynamicToolCallIds.delete(callID) ? { dynamic: true } : {}),\n });\n return;\n }\n if (type === 'session.next.retried') {\n const error = props.error ?? event;\n if (openCodeErrorFromValue(error)?.isRetryable === false) {\n emitError({\n error,\n message: 'OpenCode session retry failed',\n });\n } else {\n emitWarning({ message: nextRetryEventMessage({ event, formatError }) });\n }\n return;\n }\n if (type === 'session.next.step.ended') {\n closeLegacyOpenParts({ state, emit });\n state.turnUsage = mapUsage(props.tokens);\n emit({\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(String(props.finish ?? 'stop')),\n raw: String(props.finish ?? 'stop'),\n },\n usage: state.turnUsage,\n ...(typeof props.cost === 'number'\n ? { harnessMetadata: { opencode: { cost: props.cost } } }\n : {}),\n });\n return;\n }\n if (type === 'session.next.compaction.ended') {\n emit({\n type: 'compaction',\n trigger: props.reason === 'auto' ? 'auto' : 'manual',\n summary: String(props.text ?? ''),\n harnessMetadata: {\n opencode: {\n recent: String(props.recent ?? ''),\n },\n },\n });\n return;\n }\n if (type === 'file.edited') {\n emit({\n type: 'file-change',\n event: 'modify',\n path: stripWorkDir(String(props.file ?? '')),\n });\n return;\n }\n if (type === 'session.error' || type === 'session.next.step.failed') {\n finishCompaction(true);\n const error = props.error ?? event;\n emitError({\n error,\n message:\n type === 'session.error'\n ? 'OpenCode session error'\n : 'OpenCode step failed',\n });\n }\n };\n}\n\nfunction closeLegacyOpenParts({\n state,\n emit,\n}: {\n state: TranslationState;\n emit: Emit;\n}): void {\n for (const id of state.legacyReasoningPartIds) {\n emit({ type: 'reasoning-end', id });\n state.reasoningDeltas.delete(id);\n }\n state.legacyReasoningPartIds.clear();\n for (const id of state.legacyTextPartIds) {\n emit({ type: 'text-end', id });\n state.textDeltas.delete(id);\n }\n state.legacyTextPartIds.clear();\n}\n\nfunction emitLegacyStepFinishPart({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n const translated = translateLegacyStepFinishPart(part);\n if (!translated) return false;\n const { event, partId: id } = translated;\n if (id) {\n if (state.legacyStepFinishPartIds.has(id)) return true;\n state.legacyStepFinishPartIds.add(id);\n }\n closeLegacyOpenParts({ state, emit });\n state.turnUsage = event.usage as Record<string, unknown>;\n emit(event);\n return true;\n}\n\nfunction emitLegacyToolPart({\n part,\n state,\n emit,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n toWireToolName: (nativeName: string) => string;\n nativeNameField: (input: { nativeName: string; toolName: string }) => {\n nativeName?: string;\n };\n getHostToolName: (\n toolName: string,\n rawToolName: unknown,\n ) => string | undefined;\n authorizeHostToolCall: (input: {\n callID: string;\n toolName: string;\n input: unknown;\n }) => void;\n onSubagentSession?: (session: SubagentSession) => void;\n isMcpToolName: (toolName: string) => boolean;\n}): void {\n const toolPart = legacyToolPartFromValue(part);\n if (!toolPart) return;\n const status = toolPart.status;\n if (status !== 'running' && status !== 'completed' && status !== 'error') {\n return;\n }\n const callID = toolPart.callID;\n const rawToolName = toolPart.tool;\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') return;\n const toolName = toWireToolName(rawToolName);\n if (toolName === 'agent') {\n const metadata = {\n ...toolPart.metadata,\n ...toolPart.state?.metadata,\n };\n const parentSessionId = stringValue(metadata.parentSessionId);\n const sessionId = stringValue(metadata.sessionId);\n if (parentSessionId && sessionId) {\n onSubagentSession?.({ parentSessionId, sessionId });\n }\n }\n state.toolNames.set(callID, { rawToolName, toolName });\n const hostToolName = getHostToolName(toolName, rawToolName);\n if (hostToolName) {\n if (status === 'running') {\n authorizeHostToolCall({\n callID,\n toolName: hostToolName,\n input: toolPart.state?.input ?? {},\n });\n }\n return;\n }\n if (!state.toolCallsEmitted.has(callID)) {\n state.toolCallsEmitted.add(callID);\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName,\n ...nativeNameField({ nativeName: rawToolName, toolName }),\n input: JSON.stringify(legacyToolPartInput(toolPart)),\n providerExecuted: true,\n ...(isMcpToolName(rawToolName) ? { dynamic: true } : {}),\n ...(toolPart.providerMetadata\n ? { providerMetadata: toolPart.providerMetadata }\n : {}),\n });\n if (isMcpToolName(rawToolName)) state.dynamicToolCallIds.add(callID);\n }\n if (\n (status === 'completed' || status === 'error') &&\n !state.toolResultsEmitted.has(callID)\n ) {\n state.toolResultsEmitted.add(callID);\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName,\n result: legacyToolPartOutput(toolPart),\n ...(status === 'error' ? { isError: true } : {}),\n ...(state.dynamicToolCallIds.delete(callID) ? { dynamic: true } : {}),\n });\n }\n}\n\nfunction legacyToolPartInput(part: LegacyToolPart): Record<string, unknown> {\n return {\n ...part.metadata,\n ...part.state?.metadata,\n ...part.state?.input,\n };\n}\n\nfunction legacyToolPartOutput(part: LegacyToolPart): unknown {\n const state = part.state;\n if (state?.status === 'error') {\n return state.error ?? part.error ?? state.result ?? 'tool failed';\n }\n return (\n state?.output ??\n state?.result ??\n state?.structured ??\n state?.content ??\n null\n );\n}\n\nfunction parseToolInput(\n state: TranslationState,\n props: OpenCodeEventProperties,\n): unknown {\n const text = state.toolInputs.get(String(props.callID ?? ''));\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return { input: text };\n }\n}\n\nfunction nextRetryEventMessage({\n event,\n formatError,\n}: {\n event: OpenCodeEvent;\n formatError: (error: unknown) => string;\n}): string {\n const props = event.properties ?? {};\n const details: string[] = [];\n if (typeof props.attempt === 'number') {\n details.push(`attempt ${props.attempt}`);\n }\n const error = props.error;\n const errorDetails = openCodeErrorFromValue(error);\n if (errorDetails) {\n const message =\n stringValue(errorDetails.message) ??\n stringValue(errorDetails.data?.message);\n const statusCode = errorDetails.statusCode;\n if (typeof statusCode === 'number') {\n details.push(`HTTP ${statusCode}`);\n }\n if (message) details.push(message);\n } else if (error != null) {\n details.push(formatError(error));\n }\n return details.length > 0\n ? `OpenCode session retry: ${details.join('; ')}`\n : 'OpenCode session retry';\n}\n\nexport function stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\ntype LegacyToolState = {\n status?: string;\n input?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n output?: unknown;\n result?: unknown;\n structured?: unknown;\n content?: unknown;\n error?: unknown;\n};\n\ntype LegacyToolPart = {\n type: 'tool';\n callID: string;\n tool: string;\n status?: string;\n state?: LegacyToolState;\n metadata?: Record<string, unknown>;\n providerMetadata?: unknown;\n error?: unknown;\n};\n\nfunction legacyToolPartFromValue(value: unknown): LegacyToolPart | undefined {\n const part = asOpenCodeObject(value);\n if (\n !part ||\n part.type !== 'tool' ||\n typeof part.tool !== 'string' ||\n typeof part.callID !== 'string'\n ) {\n return undefined;\n }\n\n const stateObject = asOpenCodeObject(part.state);\n const provider = asOpenCodeObject(part.provider);\n const state = stateObject\n ? {\n status: stringValue(stateObject.status),\n input: asOpenCodeObject(stateObject.input),\n metadata: asOpenCodeObject(stateObject.metadata),\n output: stateObject.output,\n result: stateObject.result,\n structured: stateObject.structured,\n content: stateObject.content,\n error: stateObject.error,\n }\n : undefined;\n\n return {\n type: 'tool',\n callID: part.callID,\n tool: part.tool,\n status:\n typeof part.state === 'string'\n ? part.state\n : (state?.status ?? undefined),\n state,\n metadata: asOpenCodeObject(part.metadata),\n providerMetadata: provider?.metadata,\n error: part.error,\n };\n}\n\ntype OpenCodeErrorDetails = {\n isRetryable?: unknown;\n message?: unknown;\n statusCode?: unknown;\n data?: { message?: unknown };\n};\n\nfunction openCodeErrorFromValue(\n value: unknown,\n): OpenCodeErrorDetails | undefined {\n const error = asOpenCodeObject(value);\n if (!error) return undefined;\n const data = asOpenCodeObject(error.data);\n return {\n isRetryable: error.isRetryable,\n message: error.message,\n statusCode: error.statusCode,\n data: data ? { message: data.message } : undefined,\n };\n}\n","import path from 'node:path';\n\nconst fallbackPath =\n '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';\n\nexport function prependOpenCodeBinToPath({\n bootstrapDir,\n env,\n}: {\n bootstrapDir: string;\n env: NodeJS.ProcessEnv;\n}): void {\n env.PATH = [\n path.join(bootstrapDir, 'node_modules', '.bin'),\n env.PATH || fallbackPath,\n ].join(path.delimiter);\n}\n","import { randomBytes } from 'node:crypto';\n\nexport function configureOpenCodeServerAuth({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): { Authorization: string } {\n const username = env.OPENCODE_SERVER_USERNAME ?? 'opencode';\n const password = randomBytes(32).toString('hex');\n env.OPENCODE_SERVER_PASSWORD = password;\n\n return {\n Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,\n };\n}\n","import { createServer, type Server } from 'node:http';\nimport { ToolRelayAuthorizer, type ToolRelayCall } from './tool-relay-auth';\n\nexport type ToolRelay = {\n port: number;\n close(): void;\n authorizeToolCall(call: ToolRelayCall): void;\n};\n\nexport async function startAuthorizedToolRelay({\n tools,\n emit,\n requestToolResult,\n authorizer = new ToolRelayAuthorizer(),\n}: {\n tools: ReadonlyArray<{ name: string }>;\n emit: (message: Record<string, unknown>) => void;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n authorizer?: ToolRelayAuthorizer;\n}): Promise<ToolRelay> {\n const toolNames = new Set(tools.map(tool => tool.name));\n const server = createServer(async (req, res) => {\n try {\n if (req.method !== 'POST' || req.url !== '/') {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'unauthorized tool relay request' }));\n return;\n }\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n const { requestId, toolName, input } = JSON.parse(body) as {\n requestId: string;\n toolName: string;\n input: unknown;\n };\n\n if (!toolNames.has(toolName)) {\n res.writeHead(403, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({ error: `Tool \"${toolName}\" is not available` }),\n );\n return;\n }\n if (\n !(await authorizer.waitForToolCallAuthorization({ toolName, input }))\n ) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'unauthorized tool relay request' }));\n return;\n }\n\n emit({\n type: 'tool-call',\n toolCallId: requestId,\n toolName,\n input: JSON.stringify(input ?? {}),\n providerExecuted: false,\n });\n\n const { output, isError } = await requestToolResult(requestId);\n emit({\n type: 'tool-result',\n toolCallId: requestId,\n toolName,\n result: output ?? null,\n isError: !!isError,\n });\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ result: output }));\n } catch (error) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n await new Promise<void>(resolve =>\n server.listen(0, '127.0.0.1', () => resolve()),\n );\n const address = server.address();\n if (!address || typeof address === 'string') {\n throw new Error('tool relay did not expose a numeric port');\n }\n return {\n port: address.port,\n close: () => {\n authorizer.close();\n closeServer(server);\n },\n authorizeToolCall: call => authorizer.authorizeToolCall(call),\n };\n}\n\nfunction closeServer(server: Server): void {\n try {\n server.close();\n } catch {}\n}\n","export type ToolRelayCall = {\n toolName: string;\n input: unknown;\n};\n\nexport class ToolRelayAuthorizer {\n private readonly ttlMs: number;\n private readonly now: () => number;\n private readonly authorizations: Array<{ key: string; expiresAt: number }> =\n [];\n private readonly pendingRequests: Array<{\n key: string;\n expiresAt: number;\n timeout: ReturnType<typeof setTimeout>;\n resolve: (authorized: boolean) => void;\n }> = [];\n\n constructor({\n ttlMs = 10_000,\n now = Date.now,\n }: {\n ttlMs?: number;\n now?: () => number;\n } = {}) {\n this.ttlMs = ttlMs;\n this.now = now;\n }\n\n authorizeToolCall(call: ToolRelayCall): void {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const pendingRequestIndex = this.pendingRequests.findIndex(\n request => request.key === key,\n );\n if (pendingRequestIndex !== -1) {\n const [pendingRequest] = this.pendingRequests.splice(\n pendingRequestIndex,\n 1,\n );\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(true);\n return;\n }\n this.authorizations.push({\n key,\n expiresAt: this.now() + this.ttlMs,\n });\n }\n\n waitForToolCallAuthorization(call: ToolRelayCall): Promise<boolean> {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const authorizationIndex = this.authorizations.findIndex(\n authorization => authorization.key === key,\n );\n if (authorizationIndex !== -1) {\n this.authorizations.splice(authorizationIndex, 1);\n return Promise.resolve(true);\n }\n\n const expiresAt = this.now() + this.ttlMs;\n return new Promise(resolve => {\n const pendingRequest = {\n key,\n expiresAt,\n timeout: setTimeout(() => {\n const index = this.pendingRequests.indexOf(pendingRequest);\n if (index !== -1) this.pendingRequests.splice(index, 1);\n resolve(false);\n }, this.ttlMs),\n resolve,\n };\n this.pendingRequests.push(pendingRequest);\n });\n }\n\n close(): void {\n this.authorizations.length = 0;\n for (const pendingRequest of this.pendingRequests.splice(0)) {\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(false);\n }\n }\n\n private pruneExpired(): void {\n const now = this.now();\n for (let i = this.authorizations.length - 1; i >= 0; i--) {\n if (this.authorizations[i].expiresAt <= now) {\n this.authorizations.splice(i, 1);\n }\n }\n for (let i = this.pendingRequests.length - 1; i >= 0; i--) {\n const pendingRequest = this.pendingRequests[i];\n if (pendingRequest.expiresAt <= now) {\n this.pendingRequests.splice(i, 1);\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(false);\n }\n }\n }\n}\n\nfunction toolRelayCallKey({ toolName, input }: ToolRelayCall): string {\n return `${toolName}\\0${canonicalJson(input ?? {})}`;\n}\n\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(normalizeJsonValue(value));\n}\n\nfunction normalizeJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(normalizeJsonValue);\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, normalizeJsonValue(entryValue)]),\n );\n }\n return value;\n}\n","import type {\n HarnessV1QuestionsToolInput,\n HarnessV1QuestionsToolOutput,\n} from '@ai-sdk/harness';\nimport type { QuestionInfo } from '@opencode-ai/sdk/v2';\n\nexport type OpenCodeQuestionRequest = {\n id: string;\n sessionID: string;\n questions: QuestionInfo[];\n tool?: { messageID: string; callID: string };\n};\n\nexport function openCodeQuestionKey(\n nativeRequest: OpenCodeQuestionRequest,\n): string {\n return JSON.stringify(nativeRequest.questions);\n}\n\nexport function toHarnessQuestionsInput(\n nativeRequest: OpenCodeQuestionRequest,\n): HarnessV1QuestionsToolInput {\n return {\n allowPartialAnswers: true,\n questions: nativeRequest.questions.map((question, questionIndex) => ({\n id: `question-${questionIndex + 1}`,\n question: question.question,\n header: question.header,\n options: question.options.map((option, optionIndex) => ({\n id: `option-${optionIndex + 1}`,\n label: option.label,\n description: option.description,\n })),\n ...(question.multiple !== undefined\n ? { allowMultiple: question.multiple }\n : {}),\n ...(question.custom !== undefined\n ? { allowFreeForm: question.custom }\n : {}),\n })),\n };\n}\n\nexport function toOpenCodeQuestionResponse(input: {\n nativeRequest: OpenCodeQuestionRequest;\n output: HarnessV1QuestionsToolOutput;\n}): { action: 'reply'; answers: string[][] } | { action: 'reject' } {\n if (\n input.output.action === 'declined' ||\n input.output.action === 'cancelled'\n ) {\n return { action: 'reject' };\n }\n\n const answers = input.nativeRequest.questions.map(\n (nativeQuestion, questionIndex) => {\n const answer =\n input.output.action === 'answered' ||\n input.output.action === 'partially-answered'\n ? input.output.answers[`question-${questionIndex + 1}`]\n : undefined;\n if (answer == null) return [];\n const selectedLabels = answer.optionIds.flatMap(optionId => {\n const index = positionalIdIndex({\n id: optionId,\n prefix: 'option-',\n });\n const option =\n index == null ? undefined : nativeQuestion.options[index];\n return option == null ? [] : [option.label];\n });\n return answer.freeform === undefined\n ? selectedLabels\n : [...selectedLabels, answer.freeform];\n },\n );\n\n return { action: 'reply', answers };\n}\n\nfunction positionalIdIndex(input: {\n id: string;\n prefix: string;\n}): number | undefined {\n if (!input.id.startsWith(input.prefix)) return undefined;\n const oneBasedIndex = Number(input.id.slice(input.prefix.length));\n return Number.isInteger(oneBasedIndex) && oneBasedIndex > 0\n ? oneBasedIndex - 1\n : undefined;\n}\n"],"mappings":"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","names":["bridgeStateDir","pending","randomUUID","path","procEnv","toWireToolName","nativeNameField","getHostToolName","authorizeHostToolCall","stripWorkDir","formatError","stringValue","bootstrapDir","procEnv","randomUUID","prompted","stringValue","decision","path","args"]}
1
+ {"version":3,"file":"index.mjs","names":["stringValue","procEnv"],"sources":["../../../harness/dist/bridge/index.js","../../src/bridge/opencode-types.ts","../../src/bridge/opencode-events.ts","../../src/bridge/opencode-context-fallback.ts","../../src/bridge/opencode-usage.ts","../../src/bridge/opencode-finish-step.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/opencode-path.ts","../../src/bridge/opencode-server-auth.ts","../../src/bridge/tool-relay-auth.ts","../../src/bridge/tool-relay.ts","../../src/bridge/question-tool.ts","../../src/bridge/index.ts"],"sourcesContent":["import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { env, pid, stdout } from \"node:process\";\nimport { WebSocketServer } from \"ws\";\n//#region src/bridge/harness-bridge-capability-unsupported-error.ts\nconst name = \"AI_HarnessBridgeCapabilityUnsupportedError\";\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*/\nvar HarnessBridgeCapabilityUnsupportedError = class extends Error {\n\tconstructor({ message, harnessId, cause }) {\n\t\tsuper(message);\n\t\tObject.defineProperty(this, \"name\", { value: name });\n\t\tthis.harnessId = harnessId;\n\t\tthis.cause = cause;\n\t}\n\tstatic isInstance(error) {\n\t\treturn error != null && typeof error === \"object\" && \"name\" in error && error.name === name && \"message\" in error && typeof error.message === \"string\";\n\t}\n};\n//#endregion\n//#region src/bridge/index.ts\nconst DEBUG_LEVEL_WEIGHT = {\n\terror: 0,\n\twarn: 1,\n\tinfo: 2,\n\tdebug: 3,\n\ttrace: 4\n};\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(filters, subsystem) {\n\tif (!filters || filters.length === 0) return true;\n\treturn filters.some((filter) => subsystem === filter || subsystem.startsWith(`${filter}.`));\n}\nfunction formatBridgeError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\tif (typeof err === \"string\") return { message: err };\n\tif (err !== null && typeof err === \"object\") try {\n\t\treturn { message: JSON.stringify(err) };\n\t} catch {}\n\treturn { message: String(err) };\n}\nfunction createBridgeUserMessageQueue(options) {\n\tconst messages = [];\n\tconst waiters = [];\n\tconst entries = /* @__PURE__ */ new Map();\n\tlet closed = false;\n\tlet pendingCount = 0;\n\tconst enqueue = (input) => {\n\t\tconst existing = entries.get(input.messageId);\n\t\tif (existing != null) {\n\t\t\tif (existing.response != null) options.respond(existing.response);\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tconst settle = (response) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tpendingCount--;\n\t\t\tconst entry = entries.get(input.messageId);\n\t\t\tif (entry != null) entry.response = response;\n\t\t\toptions.respond(response);\n\t\t};\n\t\tconst message = {\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: input.text,\n\t\t\taccept: () => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: true\n\t\t\t\t});\n\t\t\t},\n\t\t\treject: (error) => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: false,\n\t\t\t\t\terror: { message: formatBridgeError(error).message }\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tentries.set(input.messageId, { reject: message.reject });\n\t\tpendingCount++;\n\t\tif (closed) {\n\t\t\tmessage.reject(/* @__PURE__ */ new Error(\"The bridge turn is no longer accepting user messages.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiters.shift();\n\t\tif (waiter != null) waiter({\n\t\t\tdone: false,\n\t\t\tvalue: message\n\t\t});\n\t\telse messages.push(message);\n\t};\n\tconst close = (error) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tconst reason = error ?? /* @__PURE__ */ new Error(\"The bridge turn ended before accepting the user message.\");\n\t\tfor (const entry of entries.values()) if (entry.response == null) entry.reject(reason);\n\t\tmessages.length = 0;\n\t\twhile (waiters.length > 0) waiters.shift()({\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t});\n\t};\n\treturn {\n\t\tget pendingCount() {\n\t\t\treturn pendingCount;\n\t\t},\n\t\tenqueue,\n\t\tclose,\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn { next: () => {\n\t\t\t\tconst message = messages.shift();\n\t\t\t\tif (message != null) return Promise.resolve({\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: message\n\t\t\t\t});\n\t\t\t\tif (closed) return Promise.resolve({\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t});\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twaiters.push(resolve);\n\t\t\t\t});\n\t\t\t} };\n\t\t}\n\t};\n}\nfunction parseEnvList(value) {\n\tif (!value) return void 0;\n\tconst items = value.split(\",\").map((item) => item.trim()).filter(Boolean);\n\treturn items.length > 0 ? items : void 0;\n}\nconst ENV_TRUTHY = /* @__PURE__ */ new Set([\n\t\"1\",\n\t\"true\",\n\t\"yes\",\n\t\"on\"\n]);\nconst WS_OPEN = 1;\nasync function runBridge(options) {\n\tconst { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n\tconst teardownGraceMs = options.turnTeardownGraceMs ?? 1e4;\n\tconst expectedToken = options.token ?? env.BRIDGE_CHANNEL_TOKEN ?? \"\";\n\tconst bridgeWsPort = options.port ?? parseInt(env.BRIDGE_WS_PORT ?? \"0\", 10);\n\tconst bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n\tconst startConfigPath = `${bridgeStateDir}/start-config.json`;\n\tconst rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n\tconst eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\ttry {\n\t\tawait mkdir(bridgeStateDir, { recursive: true });\n\t} catch {}\n\tlet currentBoundPort = 0;\n\tlet currentTurnState = \"init\";\n\tlet activeSocket;\n\tlet isFirstTurn = true;\n\tlet turnAbort;\n\tlet currentUserMessages;\n\t/**\n\t* Settles when the in-flight turn has fully wound down — `onStart`\n\t* returned or threw AND its completion state was recorded. `undefined`\n\t* between turns. A new `start` fences on this so turns never overlap.\n\t*/\n\tlet activeTurn;\n\tlet debugConfig;\n\tlet consoleCaptureInstalled = false;\n\tconst envDebugEnabled = ENV_TRUTHY.has((env.HARNESS_DEBUG ?? \"\").toLowerCase());\n\tlet seqCounter = 0;\n\tlet eventLog = [];\n\tlet diskBuffer = \"\";\n\tlet flushPromise = null;\n\tconst flushEventsToDisk = async () => {\n\t\twhile (diskBuffer.length > 0) {\n\t\t\tconst buf = diskBuffer;\n\t\t\tdiskBuffer = \"\";\n\t\t\tawait appendFile(eventLogPath, buf).catch(() => {});\n\t\t}\n\t};\n\tconst scheduleEventFlush = () => {\n\t\tif (flushPromise) return;\n\t\tflushPromise = new Promise((resolve) => {\n\t\t\tsetImmediate(() => {\n\t\t\t\tflushEventsToDisk().finally(resolve);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tflushPromise = null;\n\t\t\tif (diskBuffer.length > 0) scheduleEventFlush();\n\t\t});\n\t};\n\tconst flushPendingEventsToDisk = async () => {\n\t\tif (diskBuffer.length > 0 && !flushPromise) scheduleEventFlush();\n\t\tlet inFlight = flushPromise;\n\t\twhile (inFlight) {\n\t\t\tawait inFlight;\n\t\t\tinFlight = flushPromise;\n\t\t}\n\t};\n\tif (env.BRIDGE_REPLAY_FROM_DISK === \"1\" && existsSync(eventLogPath)) try {\n\t\teventLog = readFileSync(eventLogPath, \"utf8\").split(\"\\n\").map((line) => line.trim()).filter(Boolean).map((line) => ({\n\t\t\tseq: JSON.parse(line).seq,\n\t\t\tline\n\t\t}));\n\t\tseqCounter = eventLog.at(-1)?.seq ?? 0;\n\t} catch {\n\t\teventLog = [];\n\t\tseqCounter = 0;\n\t}\n\tconst pendingToolResults = /* @__PURE__ */ new Map();\n\tconst bufferedToolResults = [];\n\tconst pendingToolApprovals = /* @__PURE__ */ new Map();\n\tconst writeBridgeMeta = async (state) => {\n\t\ttry {\n\t\t\tawait writeFile(bridgeMetaPath, JSON.stringify({\n\t\t\t\ttype: bridgeType,\n\t\t\t\tport: currentBoundPort,\n\t\t\t\tstate,\n\t\t\t\tpid\n\t\t\t}));\n\t\t} catch {}\n\t};\n\tconst writeStartConfig = async (start) => {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(start);\n\t\t\tawait writeFile(startConfigPath, serialized);\n\t\t\tif (!existsSync(rerunStartConfigPath)) await writeFile(rerunStartConfigPath, serialized);\n\t\t} catch {}\n\t};\n\tconst emit = (event) => {\n\t\tconst seq = ++seqCounter;\n\t\tconst line = JSON.stringify({\n\t\t\t...event,\n\t\t\tseq\n\t\t});\n\t\teventLog.push({\n\t\t\tseq,\n\t\t\tline\n\t\t});\n\t\tdiskBuffer += `${line}\\n`;\n\t\tscheduleEventFlush();\n\t\tif (activeSocket?.readyState === WS_OPEN) try {\n\t\t\tactiveSocket.send(line);\n\t\t} catch {}\n\t};\n\tconst replay = (ws, afterSeq) => {\n\t\tfor (const entry of eventLog) if (entry.seq > afterSeq && ws.readyState === WS_OPEN) ws.send(entry.line);\n\t};\n\tconst shouldEmitDebugEvent = (level, subsystem) => {\n\t\tif (!debugConfig?.enabled) return false;\n\t\tconst threshold = debugConfig.level ?? \"debug\";\n\t\tif (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n\t\treturn subsystemMatches(debugConfig.subsystems, subsystem);\n\t};\n\tconst rawStdoutWrite = process.stdout.write.bind(process.stdout);\n\tconst rawStderrWrite = process.stderr.write.bind(process.stderr);\n\tconst writeErrorToStderr = (input) => {\n\t\ttry {\n\t\t\tconst formatted = formatBridgeError(input.error);\n\t\t\trawStderrWrite(`[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`);\n\t\t\tif (formatted.stack) rawStderrWrite(`${formatted.stack}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitWarning = (input) => {\n\t\ttry {\n\t\t\tfor (const line of input.message.split(\"\\n\")) if (line.trim().length > 0) rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitError = (input) => {\n\t\twriteErrorToStderr({\n\t\t\tmessage: input.message ?? \"bridge error\",\n\t\t\terror: input.error\n\t\t});\n\t\temit({\n\t\t\ttype: \"error\",\n\t\t\terror: serialiseError(input.error)\n\t\t});\n\t};\n\tconst installConsoleCapture = () => {\n\t\tif (consoleCaptureInstalled) return;\n\t\tconsoleCaptureInstalled = true;\n\t\tconst buffers = {\n\t\t\tstdout: \"\",\n\t\t\tstderr: \"\"\n\t\t};\n\t\tconst patch = (stream, raw) => (chunk, encoding, cb) => {\n\t\t\tif (debugConfig?.enabled) try {\n\t\t\t\tconst enc = typeof encoding === \"string\" ? encoding : \"utf8\";\n\t\t\t\tconst text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(enc);\n\t\t\t\tconst parts = (buffers[stream] + text.replace(/\\r\\n/g, \"\\n\")).split(\"\\n\");\n\t\t\t\tbuffers[stream] = parts.pop() ?? \"\";\n\t\t\t\tfor (const line of parts) {\n\t\t\t\t\tconst trimmed = line.replace(/\\s+$/, \"\");\n\t\t\t\t\tif (trimmed) emit({\n\t\t\t\t\t\ttype: \"sandbox-log\",\n\t\t\t\t\t\tsource: bridgeType,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tline: trimmed\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\treturn raw(chunk, encoding, cb);\n\t\t};\n\t\tprocess.stdout.write = patch(\"stdout\", rawStdoutWrite);\n\t\tprocess.stderr.write = patch(\"stderr\", rawStderrWrite);\n\t};\n\tconst handleInbound = async (msg, ws) => {\n\t\tswitch (msg.type) {\n\t\t\tcase \"start\": {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst pendingTurn = activeTurn;\n\t\t\t\t\tif (pendingTurn == null) break;\n\t\t\t\t\tturnAbort?.abort();\n\t\t\t\t\tcurrentUserMessages?.close(/* @__PURE__ */ new Error(\"A new bridge turn replaced the active turn.\"));\n\t\t\t\t\tlet graceTimer;\n\t\t\t\t\tconst settled = await Promise.race([pendingTurn.then(() => true), new Promise((resolve) => {\n\t\t\t\t\t\tgraceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n\t\t\t\t\t\tgraceTimer.unref?.();\n\t\t\t\t\t})]);\n\t\t\t\t\tclearTimeout(graceTimer);\n\t\t\t\t\tif (!settled) break;\n\t\t\t\t}\n\t\t\t\tlet turnFinished;\n\t\t\t\tconst thisTurn = new Promise((resolve) => turnFinished = resolve);\n\t\t\t\tactiveTurn = thisTurn;\n\t\t\t\tactiveSocket = ws;\n\t\t\t\tconst firstTurn = isFirstTurn;\n\t\t\t\tisFirstTurn = false;\n\t\t\t\teventLog = [];\n\t\t\t\tdiskBuffer = \"\";\n\t\t\t\twriteFile(eventLogPath, \"\").catch(() => {});\n\t\t\t\tturnAbort = new AbortController();\n\t\t\t\tcurrentTurnState = \"running\";\n\t\t\t\twriteStartConfig(msg);\n\t\t\t\twriteBridgeMeta(\"running\");\n\t\t\t\tconst startDebug = msg.debug;\n\t\t\t\tdebugConfig = {\n\t\t\t\t\tenabled: startDebug?.enabled ?? envDebugEnabled,\n\t\t\t\t\tlevel: startDebug?.level ?? env.HARNESS_DEBUG_LEVEL,\n\t\t\t\t\tsubsystems: startDebug?.subsystems ?? parseEnvList(env.HARNESS_DEBUG_SUBSYSTEMS)\n\t\t\t\t};\n\t\t\t\tif (debugConfig.enabled) installConsoleCapture();\n\t\t\t\tconst userMessages = createBridgeUserMessageQueue({ respond: emit });\n\t\t\t\tconst turn = {\n\t\t\t\t\temit,\n\t\t\t\t\trequestToolResult: (requestInput) => {\n\t\t\t\t\t\tconst request = typeof requestInput === \"string\" ? { toolCallId: requestInput } : requestInput;\n\t\t\t\t\t\tconst bufferedIndex = bufferedToolResults.findIndex((buffered) => buffered.toolCallId === request.toolCallId || request.matches?.(buffered.result) === true);\n\t\t\t\t\t\tif (bufferedIndex >= 0) return Promise.resolve(bufferedToolResults.splice(bufferedIndex, 1)[0].result);\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tpendingToolResults.set(request.toolCallId, {\n\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\tmatches: request.matches\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trequestToolApproval: (approvalId) => new Promise((resolve) => {\n\t\t\t\t\t\tpendingToolApprovals.set(approvalId, resolve);\n\t\t\t\t\t}),\n\t\t\t\t\texperimental_userMessages: userMessages,\n\t\t\t\t\tabortSignal: turnAbort.signal,\n\t\t\t\t\tfirstTurn,\n\t\t\t\t\tbridgeLog: (input) => {\n\t\t\t\t\t\tconst level = input.level ?? \"debug\";\n\t\t\t\t\t\tif (!shouldEmitDebugEvent(level, input.subsystem)) return;\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"debug-event\",\n\t\t\t\t\t\t\tlevel,\n\t\t\t\t\t\t\tsubsystem: input.subsystem,\n\t\t\t\t\t\t\tmessage: input.message,\n\t\t\t\t\t\t\t...input.attrs ? { attrs: input.attrs } : {},\n\t\t\t\t\t\t\t...input.error !== void 0 ? { error: formatBridgeError(input.error) } : {}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\temitWarning,\n\t\t\t\t\temitError\n\t\t\t\t};\n\t\t\t\tcurrentUserMessages = userMessages;\n\t\t\t\ttry {\n\t\t\t\t\tawait onStart(msg, turn);\n\t\t\t\t} catch (err) {\n\t\t\t\t\temitError({\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t\tmessage: \"bridge turn failed\"\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tuserMessages.close();\n\t\t\t\t\tif (currentUserMessages === userMessages) currentUserMessages = void 0;\n\t\t\t\t\tif (activeTurn === thisTurn) {\n\t\t\t\t\t\tactiveTurn = void 0;\n\t\t\t\t\t\tcurrentTurnState = \"waiting\";\n\t\t\t\t\t\twriteBridgeMeta(\"waiting\");\n\t\t\t\t\t}\n\t\t\t\t\tturnFinished();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-result\": {\n\t\t\t\tconst result = {\n\t\t\t\t\toutput: msg.output,\n\t\t\t\t\tisError: msg.isError,\n\t\t\t\t\ttoolResult: msg.toolResult\n\t\t\t\t};\n\t\t\t\tconst exactPending = pendingToolResults.get(msg.toolCallId);\n\t\t\t\tconst matchingPending = exactPending == null ? Array.from(pendingToolResults.entries()).find(([, pending]) => pending.matches?.(result) === true) : void 0;\n\t\t\t\tconst pending = exactPending ?? matchingPending?.[1];\n\t\t\t\tconst pendingId = exactPending != null ? msg.toolCallId : matchingPending?.[0];\n\t\t\t\tif (pending != null && pendingId != null) {\n\t\t\t\t\tpendingToolResults.delete(pendingId);\n\t\t\t\t\tpending.resolve(result);\n\t\t\t\t} else bufferedToolResults.push({\n\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-approval-response\": {\n\t\t\t\tconst resolver = pendingToolApprovals.get(msg.approvalId);\n\t\t\t\tif (resolver) {\n\t\t\t\t\tpendingToolApprovals.delete(msg.approvalId);\n\t\t\t\t\tresolver({\n\t\t\t\t\t\tapproved: msg.approved,\n\t\t\t\t\t\treason: msg.reason\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"user-message\": {\n\t\t\t\tconst messageId = msg.messageId ?? randomUUID();\n\t\t\t\tif (currentUserMessages == null) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The bridge has no active turn to steer.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ws !== activeSocket) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The connection does not own the active bridge turn.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentUserMessages.enqueue({\n\t\t\t\t\tmessageId,\n\t\t\t\t\ttext: msg.text\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"abort\":\n\t\t\t\tturnAbort?.abort();\n\t\t\t\treturn;\n\t\t\tcase \"resume\":\n\t\t\t\tactiveSocket = ws;\n\t\t\t\treplay(ws, msg.lastSeenEventId);\n\t\t\t\treturn;\n\t\t\tcase \"destroy\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tawait onDestroy?.();\n\t\t\t\tdrainThenExit(ws, 1e3, \"destroy\");\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"bridge-stop\",\n\t\t\t\t\tdata: await onStop?.() ?? {}\n\t\t\t\t});\n\t\t\t\tdrainThenExit(ws, 1e3, \"stop\");\n\t\t}\n\t};\n\twriteBridgeMeta(\"init\");\n\tconst wss = new WebSocketServer({\n\t\tport: bridgeWsPort,\n\t\thost: \"0.0.0.0\"\n\t});\n\tconst exit = () => {\n\t\tif (options.onExit) {\n\t\t\toptions.onExit();\n\t\t\treturn;\n\t\t}\n\t\twss.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(0), 1e3).unref();\n\t};\n\tconst drainThenExit = (ws, code, reason) => {\n\t\tconst start = Date.now();\n\t\tconst tick = () => {\n\t\t\tif (ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN || Date.now() - start >= 5e3) {\n\t\t\t\tflushPendingEventsToDisk().finally(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tws.close(code, reason);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\texit();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(tick, 10).unref();\n\t\t};\n\t\ttick();\n\t};\n\twss.on(\"listening\", () => {\n\t\tconst addr = wss.address();\n\t\tcurrentBoundPort = typeof addr === \"object\" && addr ? addr.port : 0;\n\t\tcurrentTurnState = \"waiting\";\n\t\twriteBridgeMeta(\"waiting\");\n\t\tstdout.write(JSON.stringify({\n\t\t\ttype: \"bridge-ready\",\n\t\t\tport: currentBoundPort\n\t\t}) + \"\\n\");\n\t\toptions.onListening?.(currentBoundPort);\n\t});\n\twss.on(\"connection\", (ws, req) => {\n\t\tif (new URL(req.url ?? \"/\", \"http://localhost\").searchParams.get(\"agent_bridge_token\") !== expectedToken) {\n\t\t\tws.close(1008, \"unauthorized\");\n\t\t\treturn;\n\t\t}\n\t\tsendControl(ws, {\n\t\t\ttype: \"bridge-hello\",\n\t\t\tstate: currentTurnState,\n\t\t\tlastSeq: seqCounter,\n\t\t\tcapabilities: { experimental_userMessageResponses: true }\n\t\t});\n\t\tws.on(\"message\", (raw) => {\n\t\t\tlet parsed;\n\t\t\ttry {\n\t\t\t\tconst text = typeof raw === \"string\" ? raw : Buffer.from(raw).toString(\"utf8\");\n\t\t\t\tparsed = JSON.parse(text);\n\t\t\t} catch (err) {\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: `protocol parse error: ${err.message}`\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleInbound(parsed, ws);\n\t\t});\n\t\tws.on(\"close\", () => {\n\t\t\tif (activeSocket === ws) activeSocket = void 0;\n\t\t});\n\t\tws.on(\"error\", () => {});\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"uncaught exception\"\n\t\t});\n\t});\n\tprocess.on(\"unhandledRejection\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"unhandled rejection\"\n\t\t});\n\t});\n\tawait new Promise((resolve, reject) => {\n\t\tif (wss.address() != null) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\twss.once(\"listening\", resolve);\n\t\twss.once(\"error\", reject);\n\t});\n\treturn {\n\t\tport: currentBoundPort,\n\t\tclose: () => new Promise((resolve) => {\n\t\t\twss.close(() => resolve());\n\t\t})\n\t};\n}\nfunction sendControl(socket, message) {\n\tif (socket?.readyState === WS_OPEN) try {\n\t\tsocket.send(JSON.stringify(message));\n\t} catch {}\n}\nfunction serialiseError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\treturn err;\n}\n//#endregion\nexport { HarnessBridgeCapabilityUnsupportedError, runBridge };\n\n//# sourceMappingURL=index.js.map","export type OpenCodeObject = Record<string, unknown>;\n\nexport type OpenCodeMessageInfo = {\n id?: unknown;\n sessionID?: unknown;\n role?: unknown;\n summary?: unknown;\n error?: unknown;\n type?: unknown;\n providerID?: unknown;\n modelID?: unknown;\n tokens?: unknown;\n};\n\nexport type OpenCodeEventProperties = OpenCodeObject & {\n info?: OpenCodeMessageInfo;\n provider?: { metadata?: unknown };\n source?: { callID?: unknown };\n status?: {\n type?: unknown;\n attempt?: unknown;\n message?: unknown;\n };\n};\n\nexport type OpenCodeEvent = {\n id?: string;\n type?: string;\n properties?: OpenCodeEventProperties;\n};\n\nexport function asOpenCodeObject(value: unknown): OpenCodeObject | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as OpenCodeObject)\n : undefined;\n}\n","import {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeEventProperties,\n type OpenCodeMessageInfo,\n} from './opencode-types';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nexport type TranslationState = {\n streamStarted: boolean;\n textDeltas: Map<string, string>;\n reasoningDeltas: Map<string, string>;\n toolInputs: Map<string, string>;\n toolNames: Map<string, { rawToolName: string; toolName: string }>;\n toolCallsEmitted: Set<string>;\n toolResultsEmitted: Set<string>;\n hostToolCallsAuthorized: Set<string>;\n shellCommands: Map<string, string>;\n messageRoles: Map<string, string>;\n turnUsage: Record<string, unknown> | undefined;\n legacyTextPartIds: Set<string>;\n legacyReasoningPartIds: Set<string>;\n legacyStepFinishPartIds: Set<string>;\n dynamicToolCallIds: Set<string>;\n};\n\nexport function createTranslationState(): TranslationState {\n return {\n streamStarted: false,\n textDeltas: new Map(),\n reasoningDeltas: new Map(),\n toolInputs: new Map(),\n toolNames: new Map(),\n toolCallsEmitted: new Set(),\n toolResultsEmitted: new Set(),\n hostToolCallsAuthorized: new Set(),\n shellCommands: new Map(),\n messageRoles: new Map(),\n turnUsage: undefined,\n legacyTextPartIds: new Set(),\n legacyReasoningPartIds: new Set(),\n legacyStepFinishPartIds: new Set(),\n dynamicToolCallIds: new Set(),\n };\n}\n\nexport function emitOpenCodeStreamStart({\n info,\n state,\n emit,\n}: {\n info: unknown;\n state: TranslationState;\n emit: Emit;\n}): void {\n if (state.streamStarted) return;\n const message = openCodeMessageInfoFromValue(info);\n if (!message) return;\n if (message.role !== 'assistant' && message.type !== 'assistant') return;\n const providerID = stringValue(message.providerID);\n const modelID = stringValue(message.modelID);\n const modelId =\n providerID && modelID ? `${providerID}/${modelID}` : undefined;\n\n state.streamStarted = true;\n emit({ type: 'stream-start', ...(modelId ? { modelId } : {}) });\n}\n\nexport function unwrapOpenCodeEvent(\n rawEvent: unknown,\n): OpenCodeEvent | undefined {\n const raw = asOpenCodeObject(rawEvent);\n if (!raw) return undefined;\n if (raw.type === 'sync' && raw.syncEvent) {\n const sync = asOpenCodeObject(raw.syncEvent);\n if (!sync) return undefined;\n return {\n id: String(sync.id ?? raw.id ?? ''),\n type: stripSyncVersion(String(sync.type ?? '')),\n properties: openCodeEventPropertiesFromValue(sync.data) ?? {},\n };\n }\n return {\n id: typeof raw.id === 'string' ? raw.id : undefined,\n type: typeof raw.type === 'string' ? stripSyncVersion(raw.type) : undefined,\n properties:\n openCodeEventPropertiesFromValue(raw.properties) ??\n openCodeEventPropertiesFromValue(raw.data) ??\n {},\n };\n}\n\nexport function getOpenCodeEventSessionId(\n event: OpenCodeEvent,\n): string | undefined {\n const props = event.properties;\n if (!props) return undefined;\n if (typeof props.sessionID === 'string') return props.sessionID;\n if (typeof props.sessionId === 'string') return props.sessionId;\n if (event.type?.startsWith('session.') && typeof props.id === 'string') {\n return props.id;\n }\n const info = asOpenCodeObject(props.info);\n if (typeof info?.sessionID === 'string') return info.sessionID;\n if (\n (event.type === 'session.created' ||\n event.type === 'session.updated' ||\n event.type === 'session.deleted') &&\n typeof info?.id === 'string'\n ) {\n return info.id;\n }\n const part = props.part;\n const partObject = asOpenCodeObject(part);\n if (typeof partObject?.sessionID === 'string') return partObject.sessionID;\n}\n\nexport function isStepSettlementEvent(event: OpenCodeEvent): boolean {\n return (\n event.type === 'session.next.step.ended' ||\n event.type === 'session.next.step.failed' ||\n event.type === 'session.error'\n );\n}\n\nexport function emitMissingFinalDelta({\n id,\n fullText,\n emittedText,\n emit,\n type,\n}: {\n id: string;\n fullText: string | undefined;\n emittedText: string;\n emit: (msg: Record<string, unknown>) => void;\n type: 'text-delta' | 'reasoning-delta';\n}): void {\n if (\n !fullText ||\n fullText === emittedText ||\n !fullText.startsWith(emittedText)\n ) {\n return;\n }\n emit({ type, id, delta: fullText.slice(emittedText.length) });\n}\n\n/**\n * Translates an OpenCode `message.part.delta` event (a streaming text or\n * reasoning delta) into legacy stream parts.\n */\nexport function emitLegacyPartDelta({\n props,\n state,\n emit,\n}: {\n props: Record<string, unknown>;\n state: TranslationState;\n emit: Emit;\n}): void {\n const field = String(props.field ?? '');\n const delta = String(props.delta ?? '');\n if (!delta) return;\n const messageID = stringValue(props.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return;\n if (field === 'text') {\n const id = legacyPartId({ value: props, fallback: 'legacy-text' });\n // OpenCode publishes reasoning deltas with field:\"text\". If this id was\n // already announced as a reasoning part, route it to reasoning so it is not\n // duplicated as a text part.\n if (state.legacyReasoningPartIds.has(id)) {\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${delta}`,\n );\n emit({ type: 'reasoning-delta', id, delta });\n return;\n }\n startLegacyPart({ ids: state.legacyTextPartIds, id, emit, type: 'text' });\n state.textDeltas.set(id, `${state.textDeltas.get(id) ?? ''}${delta}`);\n emit({ type: 'text-delta', id, delta });\n return;\n }\n if (field === 'reasoning') {\n const id = legacyPartId({ value: props, fallback: 'legacy-reasoning' });\n startLegacyPart({\n ids: state.legacyReasoningPartIds,\n id,\n emit,\n type: 'reasoning',\n });\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${delta}`,\n );\n emit({ type: 'reasoning-delta', id, delta });\n }\n}\n\n/**\n * Translates an OpenCode `message.part.updated` event for a text or reasoning\n * part. Returns `true` when it handled the part.\n */\nexport function emitLegacyTextPartUpdate({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n const textPart = legacyTextPartFromValue(part);\n if (!textPart) return false;\n const id = stringValue(textPart.id);\n if (!id) return true;\n\n const messageID = stringValue(textPart.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return true;\n\n const isReasoning = textPart.type === 'reasoning';\n const ids = isReasoning\n ? state.legacyReasoningPartIds\n : state.legacyTextPartIds;\n const deltaMap = isReasoning ? state.reasoningDeltas : state.textDeltas;\n const deltaType = isReasoning ? 'reasoning-delta' : 'text-delta';\n const text = typeof textPart.text === 'string' ? textPart.text : undefined;\n\n startLegacyPart({\n ids,\n id,\n emit,\n type: isReasoning ? 'reasoning' : 'text',\n });\n\n if (text !== undefined) {\n emitMissingFinalDelta({\n id,\n fullText: text,\n emittedText: deltaMap.get(id) ?? '',\n emit,\n type: deltaType,\n });\n deltaMap.set(id, text);\n }\n\n if (textPart.time?.end != null) {\n ids.delete(id);\n deltaMap.delete(id);\n emit({ type: isReasoning ? 'reasoning-end' : 'text-end', id });\n }\n\n return true;\n}\n\nfunction stripSyncVersion(type: string): string {\n return type.replace(/\\.\\d+$/, '');\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction legacyPartId({\n value,\n fallback,\n}: {\n value: Record<string, unknown>;\n fallback: string;\n}): string {\n return stringValue(value.partID) ?? stringValue(value.id) ?? fallback;\n}\n\nfunction startLegacyPart({\n ids,\n id,\n emit,\n type,\n}: {\n ids: Set<string>;\n id: string;\n emit: Emit;\n type: 'text' | 'reasoning';\n}): void {\n if (ids.has(id)) return;\n ids.add(id);\n emit({ type: `${type}-start`, id });\n}\n\nexport function openCodeMessageInfoFromValue(\n value: unknown,\n): OpenCodeMessageInfo | undefined {\n return asOpenCodeObject(value) as OpenCodeMessageInfo | undefined;\n}\n\nfunction openCodeEventPropertiesFromValue(\n value: unknown,\n): OpenCodeEventProperties | undefined {\n return asOpenCodeObject(value) as OpenCodeEventProperties | undefined;\n}\n\ntype LegacyTextPart = {\n type: 'text' | 'reasoning';\n id?: unknown;\n messageID?: unknown;\n text?: unknown;\n time?: { end?: unknown };\n};\n\nfunction legacyTextPartFromValue(value: unknown): LegacyTextPart | undefined {\n const part = asOpenCodeObject(value);\n if (!part || (part.type !== 'text' && part.type !== 'reasoning')) {\n return undefined;\n }\n return {\n type: part.type,\n id: part.id,\n messageID: part.messageID,\n text: part.text,\n time: asOpenCodeObject(part.time),\n };\n}\n","export type AssistantSnapshotBaseline = {\n assistantExisted: boolean;\n assistantId?: string;\n};\n\nexport function createAssistantSnapshotBaseline(\n assistant: { id?: unknown } | undefined,\n): AssistantSnapshotBaseline {\n return {\n assistantExisted: assistant != null,\n ...(typeof assistant?.id === 'string' ? { assistantId: assistant.id } : {}),\n };\n}\n\nexport function isAssistantSnapshotAfterBaseline({\n assistant,\n baseline,\n}: {\n assistant: { id?: unknown };\n baseline: AssistantSnapshotBaseline;\n}): boolean {\n if (typeof assistant.id !== 'string') return false;\n if (!baseline.assistantExisted) return true;\n return baseline.assistantId != null && assistant.id !== baseline.assistantId;\n}\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport { asOpenCodeObject } from './opencode-types';\n\ntype FinishStepEvent = Extract<HarnessV1StreamPart, { type: 'finish-step' }>;\n\nexport type OpenCodeTokenUsage = {\n readonly input: number;\n readonly output: number;\n readonly reasoning: number;\n readonly cache: {\n readonly read: number;\n readonly write: number;\n };\n};\n\nexport type HarnessUsage = FinishStepEvent['usage'];\n\nexport function mapUsage(tokens: unknown): HarnessUsage {\n const value = extractOpenCodeTokens(tokens) ?? zeroOpenCodeTokens();\n const cacheRead = value.cache.read;\n return {\n inputTokens: {\n total: value.input,\n noCache: Math.max(0, value.input - cacheRead),\n cacheRead,\n cacheWrite: value.cache.write,\n },\n outputTokens: {\n total: value.output + value.reasoning,\n text: value.output,\n reasoning: value.reasoning,\n },\n };\n}\n\nexport function defaultUsage(): HarnessUsage {\n return mapUsage(zeroOpenCodeTokens());\n}\n\nexport function extractSessionTokens(\n value: unknown,\n): OpenCodeTokenUsage | undefined {\n const record = asOpenCodeObject(value) as SessionTokenEnvelope | undefined;\n if (!record) return undefined;\n const tokens =\n extractOpenCodeTokens(record.tokens) ??\n extractOpenCodeTokens(record.info?.tokens) ??\n extractOpenCodeTokens(record.data?.tokens) ??\n extractOpenCodeTokens(record.data?.data?.tokens);\n return tokens;\n}\n\nexport function subtractSessionTokens({\n before,\n after,\n}: {\n before: OpenCodeTokenUsage;\n after: OpenCodeTokenUsage;\n}): OpenCodeTokenUsage {\n return {\n input: diff({ before: before.input, after: after.input }),\n output: diff({ before: before.output, after: after.output }),\n reasoning: diff({ before: before.reasoning, after: after.reasoning }),\n cache: {\n read: diff({ before: before.cache.read, after: after.cache.read }),\n write: diff({ before: before.cache.write, after: after.cache.write }),\n },\n };\n}\n\nexport function addUsage({\n left,\n right,\n}: {\n left: HarnessUsage | undefined;\n right: HarnessUsage;\n}): HarnessUsage {\n if (left == null) return right;\n const leftInput = asTokenGroup(left.inputTokens);\n const rightInput = asTokenGroup(right.inputTokens);\n const leftOutput = asTokenGroup(left.outputTokens);\n const rightOutput = asTokenGroup(right.outputTokens);\n return {\n inputTokens: {\n total: add({ left: leftInput.total, right: rightInput.total }),\n noCache: add({ left: leftInput.noCache, right: rightInput.noCache }),\n cacheRead: add({\n left: leftInput.cacheRead,\n right: rightInput.cacheRead,\n }),\n cacheWrite: add({\n left: leftInput.cacheWrite,\n right: rightInput.cacheWrite,\n }),\n },\n outputTokens: {\n total: add({ left: leftOutput.total, right: rightOutput.total }),\n text: add({ left: leftOutput.text, right: rightOutput.text }),\n reasoning: add({\n left: leftOutput.reasoning,\n right: rightOutput.reasoning,\n }),\n },\n };\n}\n\nfunction extractOpenCodeTokens(value: unknown): OpenCodeTokenUsage | undefined {\n const record = asOpenCodeObject(value);\n const cache = asOpenCodeObject(record?.cache);\n if (!record || !cache) return undefined;\n return {\n input: numberValue(record.input),\n output: numberValue(record.output),\n reasoning: numberValue(record.reasoning),\n cache: {\n read: numberValue(cache.read),\n write: numberValue(cache.write),\n },\n };\n}\n\nfunction zeroOpenCodeTokens(): OpenCodeTokenUsage {\n return {\n input: 0,\n output: 0,\n reasoning: 0,\n cache: { read: 0, write: 0 },\n };\n}\n\nfunction asTokenGroup(value: unknown): Record<string, number | undefined> {\n return (\n (asOpenCodeObject(value) as\n | Record<string, number | undefined>\n | undefined) ?? {}\n );\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction diff({ before, after }: { before: number; after: number }): number {\n return Math.max(0, after - before);\n}\n\nfunction add({\n left,\n right,\n}: {\n left: unknown;\n right: unknown;\n}): number | undefined {\n const leftNumber = typeof left === 'number' ? left : undefined;\n const rightNumber = typeof right === 'number' ? right : undefined;\n return leftNumber == null && rightNumber == null\n ? undefined\n : (leftNumber ?? 0) + (rightNumber ?? 0);\n}\n\ntype SessionTokenEnvelope = {\n tokens?: unknown;\n info?: { tokens?: unknown };\n data?: {\n tokens?: unknown;\n data?: { tokens?: unknown };\n };\n};\n","import type { HarnessV1StreamPart } from '@ai-sdk/harness';\nimport { mapUsage } from './opencode-usage';\nimport { asOpenCodeObject } from './opencode-types';\n\ntype FinishStepEvent = Extract<HarnessV1StreamPart, { type: 'finish-step' }>;\n\nexport function mapOpenCodeFinishReason(\n reason: string,\n): 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' {\n const normalized = reason.toLowerCase();\n if (normalized.includes('length')) return 'length';\n if (normalized.includes('filter')) return 'content-filter';\n if (normalized.includes('tool')) return 'tool-calls';\n if (normalized.includes('error') || normalized.includes('fail'))\n return 'error';\n if (normalized === 'stop' || normalized === 'end') return 'stop';\n return 'other';\n}\n\nexport function legacyStepFinishPartToFinishStep(\n part: unknown,\n): FinishStepEvent | undefined {\n return translateLegacyStepFinishPart(part)?.event;\n}\n\nexport function translateLegacyStepFinishPart(\n value: unknown,\n): { event: FinishStepEvent; partId?: string } | undefined {\n const part = asOpenCodeObject(value);\n if (!part || part.type !== 'step-finish') return undefined;\n const rawFinish = typeof part.reason === 'string' ? part.reason : 'stop';\n const event: FinishStepEvent = {\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(rawFinish),\n raw: rawFinish,\n },\n usage: mapUsage(part.tokens),\n ...(typeof part.cost === 'number'\n ? { harnessMetadata: { opencode: { cost: part.cost } } }\n : {}),\n };\n return {\n event,\n ...(typeof part.id === 'string' ? { partId: part.id } : {}),\n };\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport {\n emitLegacyPartDelta,\n emitLegacyTextPartUpdate,\n emitMissingFinalDelta,\n emitOpenCodeStreamStart,\n openCodeMessageInfoFromValue,\n type TranslationState,\n} from './opencode-events';\nimport {\n mapOpenCodeFinishReason,\n translateLegacyStepFinishPart,\n} from './opencode-finish-step';\nimport { mapUsage } from './opencode-usage';\nimport {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeEventProperties,\n} from './opencode-types';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\ntype SubagentSession = {\n parentSessionId: string;\n sessionId: string;\n};\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitError,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n stripWorkDir,\n formatError,\n}: {\n state: TranslationState;\n emit: Emit;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n toWireToolName: (nativeName: string) => string;\n nativeNameField: (input: { nativeName: string; toolName: string }) => {\n nativeName?: string;\n };\n getHostToolName: (\n toolName: string,\n rawToolName: unknown,\n ) => string | undefined;\n authorizeHostToolCall: (input: {\n callID: string;\n toolName: string;\n input: unknown;\n }) => void;\n onSubagentSession?: (session: SubagentSession) => void;\n isMcpToolName: (toolName: string) => boolean;\n stripWorkDir: (file: string) => string;\n formatError: (error: unknown) => string;\n}): (event: OpenCodeEvent) => void {\n const compactionMessages = new Set<string>();\n let compactionTrigger: 'auto' | 'manual' = 'auto';\n let compaction:\n | { id: string; trigger: 'auto' | 'manual'; text: Map<string, string> }\n | undefined;\n const finishCompaction = (failed = false) => {\n if (!compaction) return;\n if (failed) {\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.compaction',\n messageId: compaction.id,\n status: 'failed',\n },\n });\n } else {\n emit({\n type: 'compaction',\n trigger: compaction.trigger,\n summary: [...compaction.text.values()].join(''),\n harnessMetadata: { opencode: { messageId: compaction.id } },\n });\n }\n compaction = undefined;\n };\n\n return event => {\n const type = event.type;\n const props = event.properties ?? {};\n\n if (type === 'message.updated') {\n const info = openCodeMessageInfoFromValue(props.info);\n if (info) {\n const id = stringValue(info.id);\n const role = stringValue(info.role);\n if (id && role) state.messageRoles.set(id, role);\n if (id && info.summary === true) {\n if (!compactionMessages.has(id)) {\n compactionMessages.add(id);\n compaction = { id, trigger: compactionTrigger, text: new Map() };\n emitOpenCodeStreamStart({ info, state, emit });\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.compaction',\n messageId: id,\n status: 'started',\n },\n });\n }\n if (info.error && compaction?.id === id) finishCompaction(true);\n }\n }\n return;\n }\n\n if (type === 'session.compacted') {\n finishCompaction();\n return;\n }\n if (type === 'message.part.updated' || type === 'message.part.delta') {\n const part = asOpenCodeObject(props.part);\n if (type === 'message.part.updated' && part?.type === 'compaction') {\n compactionTrigger = part.auto === false ? 'manual' : 'auto';\n return;\n }\n const messageId = stringValue(\n type === 'message.part.updated' ? part?.messageID : props.messageID,\n );\n if (messageId && compactionMessages.has(messageId)) {\n if (type === 'message.part.updated') {\n if (messageId === compaction?.id && part?.type === 'text') {\n const id = stringValue(part.id);\n if (id && typeof part.text === 'string') {\n compaction.text.set(id, part.text);\n }\n }\n emitLegacyStepFinishPart({ part: props.part, state, emit });\n } else if (messageId === compaction?.id && props.field === 'text') {\n const id = stringValue(props.partID);\n if (\n id &&\n compaction.text.has(id) &&\n typeof props.delta === 'string'\n ) {\n compaction.text.set(id, compaction.text.get(id)! + props.delta);\n }\n }\n return;\n }\n }\n\n if (type === 'message.part.delta') {\n emitLegacyPartDelta({ props, state, emit });\n return;\n }\n\n if (type === 'message.part.updated') {\n if (emitLegacyTextPartUpdate({ part: props.part, state, emit })) return;\n if (emitLegacyStepFinishPart({ part: props.part, state, emit })) return;\n emitLegacyToolPart({\n part: props.part,\n state,\n emit,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n });\n return;\n }\n\n if (type === 'session.next.text.started') {\n emit({ type: 'text-start', id: String(props.textID ?? event.id) });\n return;\n }\n if (type === 'session.next.text.delta') {\n const id = String(props.textID ?? event.id);\n state.textDeltas.set(\n id,\n `${state.textDeltas.get(id) ?? ''}${String(props.delta ?? '')}`,\n );\n emit({\n type: 'text-delta',\n id,\n delta: String(props.delta ?? ''),\n });\n return;\n }\n if (type === 'session.next.text.ended') {\n const id = String(props.textID ?? event.id);\n emitMissingFinalDelta({\n id,\n fullText: typeof props.text === 'string' ? props.text : undefined,\n emittedText: state.textDeltas.get(id) ?? '',\n emit,\n type: 'text-delta',\n });\n emit({ type: 'text-end', id });\n return;\n }\n if (type === 'session.next.reasoning.started') {\n emit({\n type: 'reasoning-start',\n id: String(props.reasoningID ?? event.id),\n });\n return;\n }\n if (type === 'session.next.reasoning.delta') {\n const id = String(props.reasoningID ?? event.id);\n state.reasoningDeltas.set(\n id,\n `${state.reasoningDeltas.get(id) ?? ''}${String(props.delta ?? '')}`,\n );\n emit({\n type: 'reasoning-delta',\n id,\n delta: String(props.delta ?? ''),\n });\n return;\n }\n if (type === 'session.next.reasoning.ended') {\n const id = String(props.reasoningID ?? event.id);\n emitMissingFinalDelta({\n id,\n fullText: typeof props.text === 'string' ? props.text : undefined,\n emittedText: state.reasoningDeltas.get(id) ?? '',\n emit,\n type: 'reasoning-delta',\n });\n emit({ type: 'reasoning-end', id });\n return;\n }\n if (type === 'session.next.shell.started') {\n const callID = String(props.callID ?? event.id);\n const command = String(props.command ?? '');\n state.shellCommands.set(callID, command);\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName: 'bash',\n nativeName: 'bash',\n input: JSON.stringify({ command }),\n providerExecuted: true,\n });\n return;\n }\n if (type === 'session.next.shell.ended') {\n const callID = String(props.callID ?? event.id);\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName: 'bash',\n result: {\n command: state.shellCommands.get(callID) ?? '',\n output: String(props.output ?? ''),\n },\n });\n return;\n }\n if (type === 'session.next.tool.input.delta') {\n const callID = String(props.callID ?? event.id);\n state.toolInputs.set(\n callID,\n `${state.toolInputs.get(callID) ?? ''}${String(props.delta ?? '')}`,\n );\n return;\n }\n if (type === 'session.next.tool.input.ended') {\n state.toolInputs.set(\n String(props.callID ?? event.id),\n String(props.text ?? ''),\n );\n return;\n }\n if (type === 'session.next.tool.called') {\n const callID = String(props.callID ?? event.id);\n const rawToolName = String(props.tool ?? 'unknown');\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') {\n return;\n }\n const toolName = toWireToolName(rawToolName);\n state.toolNames.set(callID, { rawToolName, toolName });\n const hostToolName = getHostToolName(toolName, props.tool);\n if (hostToolName) {\n authorizeHostToolCall({\n callID,\n toolName: hostToolName,\n input: props.input ?? parseToolInput(state, props),\n });\n return;\n }\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName,\n ...nativeNameField({ nativeName: rawToolName, toolName }),\n input: JSON.stringify(props.input ?? parseToolInput(state, props)),\n providerExecuted: true,\n ...(isMcpToolName(rawToolName) ? { dynamic: true } : {}),\n ...(props.provider?.metadata\n ? { providerMetadata: props.provider.metadata }\n : {}),\n });\n if (isMcpToolName(rawToolName)) state.dynamicToolCallIds.add(callID);\n return;\n }\n if (\n type === 'session.next.tool.success' ||\n type === 'session.next.tool.failed'\n ) {\n const callID = String(props.callID ?? event.id);\n const cachedTool = state.toolNames.get(callID);\n const rawToolName =\n cachedTool?.rawToolName ??\n String((props as { tool?: unknown }).tool ?? '');\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') {\n return;\n }\n const toolName =\n cachedTool?.toolName ?? toWireToolName(rawToolName || 'unknown');\n if (getHostToolName(toolName, rawToolName)) return;\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName,\n result:\n props.result ??\n props.structured ??\n ('content' in props ? props.content : null) ??\n null,\n ...(type === 'session.next.tool.failed' ? { isError: true } : {}),\n ...(state.dynamicToolCallIds.delete(callID) ? { dynamic: true } : {}),\n });\n return;\n }\n if (type === 'session.next.retried') {\n const error = props.error ?? event;\n if (openCodeErrorFromValue(error)?.isRetryable === false) {\n emitError({\n error,\n message: 'OpenCode session retry failed',\n });\n } else {\n emitWarning({ message: nextRetryEventMessage({ event, formatError }) });\n }\n return;\n }\n if (type === 'session.next.step.ended') {\n closeLegacyOpenParts({ state, emit });\n state.turnUsage = mapUsage(props.tokens);\n emit({\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(String(props.finish ?? 'stop')),\n raw: String(props.finish ?? 'stop'),\n },\n usage: state.turnUsage,\n ...(typeof props.cost === 'number'\n ? { harnessMetadata: { opencode: { cost: props.cost } } }\n : {}),\n });\n return;\n }\n if (type === 'session.next.compaction.ended') {\n emit({\n type: 'compaction',\n trigger: props.reason === 'auto' ? 'auto' : 'manual',\n summary: String(props.text ?? ''),\n harnessMetadata: {\n opencode: {\n recent: String(props.recent ?? ''),\n },\n },\n });\n return;\n }\n if (type === 'file.edited') {\n emit({\n type: 'file-change',\n event: 'modify',\n path: stripWorkDir(String(props.file ?? '')),\n });\n return;\n }\n if (type === 'session.error' || type === 'session.next.step.failed') {\n finishCompaction(true);\n const error = props.error ?? event;\n emitError({\n error,\n message:\n type === 'session.error'\n ? 'OpenCode session error'\n : 'OpenCode step failed',\n });\n }\n };\n}\n\nfunction closeLegacyOpenParts({\n state,\n emit,\n}: {\n state: TranslationState;\n emit: Emit;\n}): void {\n for (const id of state.legacyReasoningPartIds) {\n emit({ type: 'reasoning-end', id });\n state.reasoningDeltas.delete(id);\n }\n state.legacyReasoningPartIds.clear();\n for (const id of state.legacyTextPartIds) {\n emit({ type: 'text-end', id });\n state.textDeltas.delete(id);\n }\n state.legacyTextPartIds.clear();\n}\n\nfunction emitLegacyStepFinishPart({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n const translated = translateLegacyStepFinishPart(part);\n if (!translated) return false;\n const { event, partId: id } = translated;\n if (id) {\n if (state.legacyStepFinishPartIds.has(id)) return true;\n state.legacyStepFinishPartIds.add(id);\n }\n closeLegacyOpenParts({ state, emit });\n state.turnUsage = event.usage as Record<string, unknown>;\n emit(event);\n return true;\n}\n\nfunction emitLegacyToolPart({\n part,\n state,\n emit,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall,\n onSubagentSession,\n isMcpToolName,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n toWireToolName: (nativeName: string) => string;\n nativeNameField: (input: { nativeName: string; toolName: string }) => {\n nativeName?: string;\n };\n getHostToolName: (\n toolName: string,\n rawToolName: unknown,\n ) => string | undefined;\n authorizeHostToolCall: (input: {\n callID: string;\n toolName: string;\n input: unknown;\n }) => void;\n onSubagentSession?: (session: SubagentSession) => void;\n isMcpToolName: (toolName: string) => boolean;\n}): void {\n const toolPart = legacyToolPartFromValue(part);\n if (!toolPart) return;\n const status = toolPart.status;\n if (status !== 'running' && status !== 'completed' && status !== 'error') {\n return;\n }\n const callID = toolPart.callID;\n const rawToolName = toolPart.tool;\n if (rawToolName === 'StructuredOutput' || rawToolName === 'question') return;\n const toolName = toWireToolName(rawToolName);\n if (toolName === 'agent') {\n const metadata = {\n ...toolPart.metadata,\n ...toolPart.state?.metadata,\n };\n const parentSessionId = stringValue(metadata.parentSessionId);\n const sessionId = stringValue(metadata.sessionId);\n if (parentSessionId && sessionId) {\n onSubagentSession?.({ parentSessionId, sessionId });\n }\n }\n state.toolNames.set(callID, { rawToolName, toolName });\n const hostToolName = getHostToolName(toolName, rawToolName);\n if (hostToolName) {\n if (status === 'running') {\n authorizeHostToolCall({\n callID,\n toolName: hostToolName,\n input: toolPart.state?.input ?? {},\n });\n }\n return;\n }\n if (!state.toolCallsEmitted.has(callID)) {\n state.toolCallsEmitted.add(callID);\n emit({\n type: 'tool-call',\n toolCallId: callID,\n toolName,\n ...nativeNameField({ nativeName: rawToolName, toolName }),\n input: JSON.stringify(legacyToolPartInput(toolPart)),\n providerExecuted: true,\n ...(isMcpToolName(rawToolName) ? { dynamic: true } : {}),\n ...(toolPart.providerMetadata\n ? { providerMetadata: toolPart.providerMetadata }\n : {}),\n });\n if (isMcpToolName(rawToolName)) state.dynamicToolCallIds.add(callID);\n }\n if (\n (status === 'completed' || status === 'error') &&\n !state.toolResultsEmitted.has(callID)\n ) {\n state.toolResultsEmitted.add(callID);\n emit({\n type: 'tool-result',\n toolCallId: callID,\n toolName,\n result: legacyToolPartOutput(toolPart),\n ...(status === 'error' ? { isError: true } : {}),\n ...(state.dynamicToolCallIds.delete(callID) ? { dynamic: true } : {}),\n });\n }\n}\n\nfunction legacyToolPartInput(part: LegacyToolPart): Record<string, unknown> {\n return {\n ...part.metadata,\n ...part.state?.metadata,\n ...part.state?.input,\n };\n}\n\nfunction legacyToolPartOutput(part: LegacyToolPart): unknown {\n const state = part.state;\n if (state?.status === 'error') {\n return state.error ?? part.error ?? state.result ?? 'tool failed';\n }\n return (\n state?.output ??\n state?.result ??\n state?.structured ??\n state?.content ??\n null\n );\n}\n\nfunction parseToolInput(\n state: TranslationState,\n props: OpenCodeEventProperties,\n): unknown {\n const text = state.toolInputs.get(String(props.callID ?? ''));\n if (!text) return {};\n try {\n return JSON.parse(text);\n } catch {\n return { input: text };\n }\n}\n\nfunction nextRetryEventMessage({\n event,\n formatError,\n}: {\n event: OpenCodeEvent;\n formatError: (error: unknown) => string;\n}): string {\n const props = event.properties ?? {};\n const details: string[] = [];\n if (typeof props.attempt === 'number') {\n details.push(`attempt ${props.attempt}`);\n }\n const error = props.error;\n const errorDetails = openCodeErrorFromValue(error);\n if (errorDetails) {\n const message =\n stringValue(errorDetails.message) ??\n stringValue(errorDetails.data?.message);\n const statusCode = errorDetails.statusCode;\n if (typeof statusCode === 'number') {\n details.push(`HTTP ${statusCode}`);\n }\n if (message) details.push(message);\n } else if (error != null) {\n details.push(formatError(error));\n }\n return details.length > 0\n ? `OpenCode session retry: ${details.join('; ')}`\n : 'OpenCode session retry';\n}\n\nexport function stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\ntype LegacyToolState = {\n status?: string;\n input?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n output?: unknown;\n result?: unknown;\n structured?: unknown;\n content?: unknown;\n error?: unknown;\n};\n\ntype LegacyToolPart = {\n type: 'tool';\n callID: string;\n tool: string;\n status?: string;\n state?: LegacyToolState;\n metadata?: Record<string, unknown>;\n providerMetadata?: unknown;\n error?: unknown;\n};\n\nfunction legacyToolPartFromValue(value: unknown): LegacyToolPart | undefined {\n const part = asOpenCodeObject(value);\n if (\n !part ||\n part.type !== 'tool' ||\n typeof part.tool !== 'string' ||\n typeof part.callID !== 'string'\n ) {\n return undefined;\n }\n\n const stateObject = asOpenCodeObject(part.state);\n const provider = asOpenCodeObject(part.provider);\n const state = stateObject\n ? {\n status: stringValue(stateObject.status),\n input: asOpenCodeObject(stateObject.input),\n metadata: asOpenCodeObject(stateObject.metadata),\n output: stateObject.output,\n result: stateObject.result,\n structured: stateObject.structured,\n content: stateObject.content,\n error: stateObject.error,\n }\n : undefined;\n\n return {\n type: 'tool',\n callID: part.callID,\n tool: part.tool,\n status:\n typeof part.state === 'string'\n ? part.state\n : (state?.status ?? undefined),\n state,\n metadata: asOpenCodeObject(part.metadata),\n providerMetadata: provider?.metadata,\n error: part.error,\n };\n}\n\ntype OpenCodeErrorDetails = {\n isRetryable?: unknown;\n message?: unknown;\n statusCode?: unknown;\n data?: { message?: unknown };\n};\n\nfunction openCodeErrorFromValue(\n value: unknown,\n): OpenCodeErrorDetails | undefined {\n const error = asOpenCodeObject(value);\n if (!error) return undefined;\n const data = asOpenCodeObject(error.data);\n return {\n isRetryable: error.isRetryable,\n message: error.message,\n statusCode: error.statusCode,\n data: data ? { message: data.message } : undefined,\n };\n}\n","import path from 'node:path';\n\nconst fallbackPath =\n '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin';\n\nexport function prependOpenCodeBinToPath({\n bootstrapDir,\n env,\n}: {\n bootstrapDir: string;\n env: NodeJS.ProcessEnv;\n}): void {\n env.PATH = [\n path.join(bootstrapDir, 'node_modules', '.bin'),\n env.PATH || fallbackPath,\n ].join(path.delimiter);\n}\n","import { randomBytes } from 'node:crypto';\n\nexport function configureOpenCodeServerAuth({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): { Authorization: string } {\n const username = env.OPENCODE_SERVER_USERNAME ?? 'opencode';\n const password = randomBytes(32).toString('hex');\n env.OPENCODE_SERVER_PASSWORD = password;\n\n return {\n Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,\n };\n}\n","export type ToolRelayCall = {\n toolName: string;\n input: unknown;\n};\n\nexport class ToolRelayAuthorizer {\n private readonly ttlMs: number;\n private readonly now: () => number;\n private readonly authorizations: Array<{ key: string; expiresAt: number }> =\n [];\n private readonly pendingRequests: Array<{\n key: string;\n expiresAt: number;\n timeout: ReturnType<typeof setTimeout>;\n resolve: (authorized: boolean) => void;\n }> = [];\n\n constructor({\n ttlMs = 10_000,\n now = Date.now,\n }: {\n ttlMs?: number;\n now?: () => number;\n } = {}) {\n this.ttlMs = ttlMs;\n this.now = now;\n }\n\n authorizeToolCall(call: ToolRelayCall): void {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const pendingRequestIndex = this.pendingRequests.findIndex(\n request => request.key === key,\n );\n if (pendingRequestIndex !== -1) {\n const [pendingRequest] = this.pendingRequests.splice(\n pendingRequestIndex,\n 1,\n );\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(true);\n return;\n }\n this.authorizations.push({\n key,\n expiresAt: this.now() + this.ttlMs,\n });\n }\n\n waitForToolCallAuthorization(call: ToolRelayCall): Promise<boolean> {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const authorizationIndex = this.authorizations.findIndex(\n authorization => authorization.key === key,\n );\n if (authorizationIndex !== -1) {\n this.authorizations.splice(authorizationIndex, 1);\n return Promise.resolve(true);\n }\n\n const expiresAt = this.now() + this.ttlMs;\n return new Promise(resolve => {\n const pendingRequest = {\n key,\n expiresAt,\n timeout: setTimeout(() => {\n const index = this.pendingRequests.indexOf(pendingRequest);\n if (index !== -1) this.pendingRequests.splice(index, 1);\n resolve(false);\n }, this.ttlMs),\n resolve,\n };\n this.pendingRequests.push(pendingRequest);\n });\n }\n\n close(): void {\n this.authorizations.length = 0;\n for (const pendingRequest of this.pendingRequests.splice(0)) {\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(false);\n }\n }\n\n private pruneExpired(): void {\n const now = this.now();\n for (let i = this.authorizations.length - 1; i >= 0; i--) {\n if (this.authorizations[i].expiresAt <= now) {\n this.authorizations.splice(i, 1);\n }\n }\n for (let i = this.pendingRequests.length - 1; i >= 0; i--) {\n const pendingRequest = this.pendingRequests[i];\n if (pendingRequest.expiresAt <= now) {\n this.pendingRequests.splice(i, 1);\n clearTimeout(pendingRequest.timeout);\n pendingRequest.resolve(false);\n }\n }\n }\n}\n\nfunction toolRelayCallKey({ toolName, input }: ToolRelayCall): string {\n return `${toolName}\\0${canonicalJson(input ?? {})}`;\n}\n\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(normalizeJsonValue(value));\n}\n\nfunction normalizeJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(normalizeJsonValue);\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, normalizeJsonValue(entryValue)]),\n );\n }\n return value;\n}\n","import { createServer, type Server } from 'node:http';\nimport { ToolRelayAuthorizer, type ToolRelayCall } from './tool-relay-auth';\n\nexport type ToolRelay = {\n port: number;\n close(): void;\n authorizeToolCall(call: ToolRelayCall): void;\n};\n\nexport async function startAuthorizedToolRelay({\n tools,\n emit,\n requestToolResult,\n authorizer = new ToolRelayAuthorizer(),\n}: {\n tools: ReadonlyArray<{ name: string }>;\n emit: (message: Record<string, unknown>) => void;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n authorizer?: ToolRelayAuthorizer;\n}): Promise<ToolRelay> {\n const toolNames = new Set(tools.map(tool => tool.name));\n const server = createServer(async (req, res) => {\n try {\n if (req.method !== 'POST' || req.url !== '/') {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'unauthorized tool relay request' }));\n return;\n }\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks).toString('utf8');\n const { requestId, toolName, input } = JSON.parse(body) as {\n requestId: string;\n toolName: string;\n input: unknown;\n };\n\n if (!toolNames.has(toolName)) {\n res.writeHead(403, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({ error: `Tool \"${toolName}\" is not available` }),\n );\n return;\n }\n if (\n !(await authorizer.waitForToolCallAuthorization({ toolName, input }))\n ) {\n res.writeHead(401, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'unauthorized tool relay request' }));\n return;\n }\n\n emit({\n type: 'tool-call',\n toolCallId: requestId,\n toolName,\n input: JSON.stringify(input ?? {}),\n providerExecuted: false,\n });\n\n const { output, isError } = await requestToolResult(requestId);\n emit({\n type: 'tool-result',\n toolCallId: requestId,\n toolName,\n result: output ?? null,\n isError: !!isError,\n });\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ result: output }));\n } catch (error) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n await new Promise<void>(resolve =>\n server.listen(0, '127.0.0.1', () => resolve()),\n );\n const address = server.address();\n if (!address || typeof address === 'string') {\n throw new Error('tool relay did not expose a numeric port');\n }\n return {\n port: address.port,\n close: () => {\n authorizer.close();\n closeServer(server);\n },\n authorizeToolCall: call => authorizer.authorizeToolCall(call),\n };\n}\n\nfunction closeServer(server: Server): void {\n try {\n server.close();\n } catch {}\n}\n","import type {\n HarnessV1QuestionsToolInput,\n HarnessV1QuestionsToolOutput,\n} from '@ai-sdk/harness';\nimport type { QuestionInfo } from '@opencode-ai/sdk/v2';\n\nexport type OpenCodeQuestionRequest = {\n id: string;\n sessionID: string;\n questions: QuestionInfo[];\n tool?: { messageID: string; callID: string };\n};\n\nexport function openCodeQuestionKey(\n nativeRequest: OpenCodeQuestionRequest,\n): string {\n return JSON.stringify(nativeRequest.questions);\n}\n\nexport function toHarnessQuestionsInput(\n nativeRequest: OpenCodeQuestionRequest,\n): HarnessV1QuestionsToolInput {\n return {\n allowPartialAnswers: true,\n questions: nativeRequest.questions.map((question, questionIndex) => ({\n id: `question-${questionIndex + 1}`,\n question: question.question,\n header: question.header,\n options: question.options.map((option, optionIndex) => ({\n id: `option-${optionIndex + 1}`,\n label: option.label,\n description: option.description,\n })),\n ...(question.multiple !== undefined\n ? { allowMultiple: question.multiple }\n : {}),\n ...(question.custom !== undefined\n ? { allowFreeForm: question.custom }\n : {}),\n })),\n };\n}\n\nexport function toOpenCodeQuestionResponse(input: {\n nativeRequest: OpenCodeQuestionRequest;\n output: HarnessV1QuestionsToolOutput;\n}): { action: 'reply'; answers: string[][] } | { action: 'reject' } {\n if (\n input.output.action === 'declined' ||\n input.output.action === 'cancelled'\n ) {\n return { action: 'reject' };\n }\n\n const answers = input.nativeRequest.questions.map(\n (nativeQuestion, questionIndex) => {\n const answer =\n input.output.action === 'answered' ||\n input.output.action === 'partially-answered'\n ? input.output.answers[`question-${questionIndex + 1}`]\n : undefined;\n if (answer == null) return [];\n const selectedLabels = answer.optionIds.flatMap(optionId => {\n const index = positionalIdIndex({\n id: optionId,\n prefix: 'option-',\n });\n const option =\n index == null ? undefined : nativeQuestion.options[index];\n return option == null ? [] : [option.label];\n });\n return answer.freeform === undefined\n ? selectedLabels\n : [...selectedLabels, answer.freeform];\n },\n );\n\n return { action: 'reply', answers };\n}\n\nfunction positionalIdIndex(input: {\n id: string;\n prefix: string;\n}): number | undefined {\n if (!input.id.startsWith(input.prefix)) return undefined;\n const oneBasedIndex = Number(input.id.slice(input.prefix.length));\n return Number.isInteger(oneBasedIndex) && oneBasedIndex > 0\n ? oneBasedIndex - 1\n : undefined;\n}\n","import {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport { realpathSync } from 'node:fs';\nimport path from 'node:path';\nimport { argv, env as procEnv } from 'node:process';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { StartMessage } from '../opencode-bridge-protocol';\n\nimport {\n createOpencodeClient,\n createOpencodeServer,\n} from '@opencode-ai/sdk/v2';\nimport {\n createTranslationState,\n emitOpenCodeStreamStart,\n getOpenCodeEventSessionId,\n openCodeMessageInfoFromValue,\n type TranslationState,\n unwrapOpenCodeEvent,\n} from './opencode-events';\nimport {\n createAssistantSnapshotBaseline,\n isAssistantSnapshotAfterBaseline,\n type AssistantSnapshotBaseline,\n} from './opencode-context-fallback';\nimport { createEmitStreamEvent, stringValue } from './create-emit-stream-event';\nimport { mapOpenCodeFinishReason } from './opencode-finish-step';\nimport { prependOpenCodeBinToPath } from './opencode-path';\nimport { configureOpenCodeServerAuth } from './opencode-server-auth';\nimport {\n addUsage,\n defaultUsage,\n extractSessionTokens,\n mapUsage,\n subtractSessionTokens,\n type HarnessUsage,\n type OpenCodeTokenUsage,\n} from './opencode-usage';\nimport {\n asOpenCodeObject,\n type OpenCodeEvent,\n type OpenCodeObject,\n} from './opencode-types';\nimport { startAuthorizedToolRelay, type ToolRelay } from './tool-relay';\nimport {\n openCodeQuestionKey,\n toHarnessQuestionsInput,\n toOpenCodeQuestionResponse,\n type OpenCodeQuestionRequest,\n} from './question-tool';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\ntype OpenCodeClient = ReturnType<typeof createOpencodeClient>;\ntype OpenCodeServer = Awaited<ReturnType<typeof createOpencodeServer>>;\n\ntype RuntimeState = {\n server?: OpenCodeServer;\n client?: OpenCodeClient;\n sessionId?: string;\n relay?: ToolRelay;\n openCodeConfig?: Record<string, unknown>;\n toolNames: Set<string>;\n mcpToolPrefixes: Set<string>;\n};\n\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'askUserQuestions';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n view: 'read',\n read: 'read',\n write: 'write',\n edit: 'edit',\n bash: 'bash',\n glob: 'glob',\n grep: 'grep',\n question: 'askUserQuestions',\n};\n\nconst OPENCODE_TO_WIRE: Readonly<Record<string, string>> = {\n list: 'ls',\n ls: 'ls',\n webfetch: 'webfetch',\n task: 'agent',\n agent: 'agent',\n askUserQuestions: 'question',\n subtask: 'agent',\n};\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'view',\n write: 'write',\n edit: 'edit',\n bash: 'bash',\n glob: 'glob',\n grep: 'grep',\n ls: 'list',\n webfetch: 'webfetch',\n skill: 'skill',\n todowrite: 'todowrite',\n agent: 'agent',\n};\n\nconst TOOL_KIND: Readonly<Record<string, 'readonly' | 'edit' | 'bash'>> = {\n read: 'readonly',\n glob: 'readonly',\n grep: 'readonly',\n ls: 'readonly',\n webfetch: 'readonly',\n write: 'edit',\n edit: 'edit',\n bash: 'bash',\n agent: 'bash',\n skill: 'edit',\n todowrite: 'edit',\n};\nconst HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir ?? emitFatal('Missing --workdir argument.');\nconst bridgeStateDir =\n args.bridgeStateDir ?? emitFatal('Missing --bridge-state-dir argument.');\nconst bootstrapDir = args.bootstrapDir ?? workdir;\nconst skillsDir = args.skillsDir;\nconst runtime: RuntimeState = {\n toolNames: new Set(),\n mcpToolPrefixes: new Set(),\n};\nprependOpenCodeBinToPath({ bootstrapDir, env: procEnv });\n\nawait runBridge<StartMessage>({\n bridgeType: 'opencode',\n bridgeStateDir,\n onStart: runTurn,\n onStop: () =>\n runtime.sessionId ? { openCodeSessionId: runtime.sessionId } : {},\n});\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n let totalUsage: HarnessUsage | undefined;\n try {\n await ensureRuntime({ start, turn, emit });\n const client = runtime.client!;\n if (start.skillsChanged) {\n await client.instance.dispose({ directory: workdir });\n }\n const sessionId = await ensureSession({ client, start, emit });\n await switchSessionModel({ client, sessionId, start });\n\n if (start.operation === 'compact') {\n await runCompaction({ client, sessionId, start, turn, emit });\n } else {\n totalUsage = await runPrompt({ client, sessionId, start, turn, emit });\n }\n } catch (err) {\n turn.emitError({ error: err, message: 'OpenCode turn failed' });\n } finally {\n turn.experimental_userMessages.close();\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: totalUsage ?? defaultUsage(),\n });\n }\n}\n\nasync function switchSessionModel({\n client,\n sessionId,\n start,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<void> {\n const model = modelRefFromStart(start);\n if (model == null) return;\n const response = await client.v2.session.switchModel({\n sessionID: sessionId,\n model: {\n id: model.modelID,\n providerID: model.providerID,\n },\n });\n if (response.error != null) throw response.error;\n}\n\nasync function ensureRuntime({\n start,\n turn,\n emit,\n}: {\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n if (\n runtime.client &&\n isDeepStrictEqual(runtime.openCodeConfig, start.openCodeConfig)\n ) {\n return;\n }\n\n closeRuntime();\n\n try {\n if (start.tools && start.tools.length > 0) {\n runtime.toolNames = new Set(start.tools.map(tool => tool.name));\n runtime.relay = await startToolRelay({\n tools: start.tools,\n emit,\n requestToolResult: turn.requestToolResult,\n });\n }\n\n const serverAuthHeaders = configureOpenCodeServerAuth({ env: procEnv });\n const server = await createOpencodeServer({\n hostname: '127.0.0.1',\n port: 0,\n timeout: 30_000,\n config: buildOpenCodeConfig({\n start,\n relayPort: runtime.relay?.port,\n }) as never,\n });\n runtime.server = server;\n runtime.client = createOpencodeClient({\n baseUrl: server.url,\n directory: workdir,\n headers: serverAuthHeaders,\n });\n const mcpStatus = await runtime.client.mcp.status();\n const mcpServers = asOpenCodeObject(mcpStatus.data) ?? {};\n runtime.mcpToolPrefixes = new Set(\n Object.entries(mcpServers)\n .filter(\n ([serverName, status]) =>\n serverName !== 'harness-tools' &&\n asOpenCodeObject(status)?.status === 'connected',\n )\n .map(([serverName]) => `${sanitizeMcpToolName(serverName)}_`),\n );\n runtime.openCodeConfig = structuredClone(start.openCodeConfig);\n } catch (error) {\n closeRuntime();\n throw error;\n }\n}\n\nfunction closeRuntime(): void {\n runtime.relay?.close();\n runtime.server?.close();\n runtime.server = undefined;\n runtime.client = undefined;\n runtime.relay = undefined;\n runtime.openCodeConfig = undefined;\n runtime.toolNames = new Set();\n runtime.mcpToolPrefixes = new Set();\n}\n\nfunction buildOpenCodeConfig({\n start,\n relayPort,\n}: {\n start: StartMessage;\n relayPort: number | undefined;\n}): Record<string, unknown> {\n const config: Record<string, unknown> = {\n ...withoutAgentPolicyOverrides(start.openCodeConfig),\n share: 'disabled',\n autoupdate: false,\n permission: {\n read: 'allow',\n glob: 'allow',\n grep: 'allow',\n list: 'allow',\n edit: 'ask',\n bash: 'ask',\n external_directory: 'ask',\n webfetch: 'ask',\n doom_loop: 'ask',\n task: 'ask',\n question: 'allow',\n },\n };\n if (start.model) config.model = start.model;\n if (skillsDir) config.skills = { paths: [skillsDir] };\n const inactiveToolNames = resolveInactiveBuiltinToolNames(start);\n const permission = config.permission as Record<string, unknown>;\n for (const toolName of inactiveToolNames) {\n const permissionName = toPermissionToolName(\n PUBLIC_TO_NATIVE[toolName] ?? toolName,\n );\n if (permissionName === 'ls') {\n permission.list = 'ask';\n } else {\n permission[permissionName] = 'ask';\n }\n }\n const provider = buildProviderConfig(start);\n if (provider) config.provider = provider;\n const mcp = { ...start.mcpServers };\n if (relayPort && start.tools && start.tools.length > 0) {\n mcp['harness-tools'] = {\n type: 'local',\n enabled: true,\n command: ['node', `${bootstrapDir}/host-tool-mcp.mjs`],\n environment: {\n TOOL_SCHEMAS: JSON.stringify(\n start.tools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ),\n TOOL_RELAY_URL: `http://127.0.0.1:${relayPort}`,\n },\n };\n }\n if (Object.keys(mcp).length > 0) config.mcp = mcp;\n return config;\n}\n\nfunction withoutAgentPolicyOverrides(\n input: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const config = { ...input };\n for (const key of ['agent', 'mode'] as const) {\n const agents = asOpenCodeObject(config[key]);\n if (!agents) continue;\n config[key] = Object.fromEntries(\n Object.entries(agents).map(([name, value]) => {\n const agent = asOpenCodeObject(value);\n if (!agent) return [name, value];\n const safeAgent = { ...agent };\n delete safeAgent.permission;\n delete safeAgent.tools;\n return [name, safeAgent];\n }),\n );\n }\n return config;\n}\n\nfunction buildProviderConfig(\n start: StartMessage,\n): Record<string, unknown> | undefined {\n const model = splitModel(start.model, start.provider);\n const providerID =\n model.providerID ?? start.provider ?? procEnv.OPENAI_NAME ?? 'anthropic';\n const modelID = model.modelID;\n\n if (procEnv.AI_GATEWAY_API_KEY && procEnv.AI_GATEWAY_BASE_URL) {\n return {\n [providerID]: {\n options: {\n apiKey: procEnv.AI_GATEWAY_API_KEY,\n baseURL: toOpenCodeGatewayBaseUrl(procEnv.AI_GATEWAY_BASE_URL),\n ...(HARNESS_CLIENT_APP\n ? {\n headers: {\n ...start.headers,\n 'x-client-app': HARNESS_CLIENT_APP,\n },\n }\n : start.headers\n ? { headers: start.headers }\n : {}),\n },\n ...(modelID\n ? {\n models: {\n [modelID]: { id: modelID, name: modelID },\n },\n }\n : {}),\n },\n };\n }\n\n if (\n (procEnv.OPENAI_NAME ||\n (providerID !== 'anthropic' && providerID !== 'openai')) &&\n (procEnv.OPENAI_API_KEY || procEnv.OPENAI_BASE_URL)\n ) {\n const openAICompatibleProviderID = procEnv.OPENAI_NAME ?? providerID;\n return {\n [openAICompatibleProviderID]: {\n options: {\n ...(procEnv.OPENAI_API_KEY ? { apiKey: procEnv.OPENAI_API_KEY } : {}),\n ...(procEnv.OPENAI_BASE_URL\n ? { baseURL: procEnv.OPENAI_BASE_URL }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n ...parseOpenAIQueryParams(),\n },\n ...(modelID\n ? {\n models: {\n [modelID]: { id: modelID, name: modelID },\n },\n }\n : {}),\n },\n };\n }\n\n if (\n providerID === 'anthropic' &&\n (procEnv.ANTHROPIC_API_KEY ||\n procEnv.ANTHROPIC_AUTH_TOKEN ||\n procEnv.ANTHROPIC_BASE_URL)\n ) {\n return {\n anthropic: {\n options: {\n ...(procEnv.ANTHROPIC_API_KEY\n ? { apiKey: procEnv.ANTHROPIC_API_KEY }\n : {}),\n ...(procEnv.ANTHROPIC_AUTH_TOKEN\n ? { authToken: procEnv.ANTHROPIC_AUTH_TOKEN }\n : {}),\n ...(procEnv.ANTHROPIC_BASE_URL\n ? { baseURL: procEnv.ANTHROPIC_BASE_URL }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n },\n },\n };\n }\n\n if (\n providerID === 'openai' &&\n (procEnv.OPENAI_API_KEY || procEnv.OPENAI_BASE_URL)\n ) {\n return {\n openai: {\n options: {\n ...(procEnv.OPENAI_API_KEY ? { apiKey: procEnv.OPENAI_API_KEY } : {}),\n ...(procEnv.OPENAI_BASE_URL\n ? { baseURL: procEnv.OPENAI_BASE_URL }\n : {}),\n ...(procEnv.OPENAI_ORGANIZATION\n ? { organization: procEnv.OPENAI_ORGANIZATION }\n : {}),\n ...(procEnv.OPENAI_PROJECT\n ? { project: procEnv.OPENAI_PROJECT }\n : {}),\n ...(start.headers ? { headers: start.headers } : {}),\n ...parseOpenAIQueryParams(),\n },\n },\n };\n }\n}\n\nfunction parseOpenAIQueryParams(): Record<string, unknown> {\n if (!procEnv.OPENAI_QUERY_PARAMS_JSON) return {};\n try {\n const parsed = JSON.parse(procEnv.OPENAI_QUERY_PARAMS_JSON);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return { queryParams: parsed };\n }\n } catch {}\n return {};\n}\n\nfunction toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n\nasync function legacySessionGet({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<{ error?: unknown; data?: unknown }> {\n const session = (client as any).session;\n if (!session?.get) return client.v2.session.get({ sessionID: sessionId });\n return session.get({ sessionID: sessionId });\n}\n\nasync function legacySessionCreate({\n client,\n}: {\n client: OpenCodeClient;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.create({});\n}\n\nasync function legacySessionPrompt({\n client,\n sessionId,\n start,\n prompt: promptText,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n prompt?: string;\n}): Promise<{ error?: unknown; data?: unknown }> {\n const session = (client as any).session;\n const submitPrompt = session.promptAsync ?? session.prompt;\n return submitPrompt.call(session, {\n sessionID: sessionId,\n ...(start.instructions ? { system: start.instructions } : {}),\n ...(start.variant ? { variant: start.variant } : {}),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? {\n format: {\n type: 'json_schema' as const,\n schema: start.responseFormat.schema,\n },\n }\n : {}),\n parts: [{ type: 'text', text: promptText ?? start.prompt }],\n });\n}\n\nasync function legacySessionSummarize({\n client,\n sessionId,\n model,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n model: OpenCodeModelRef;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.summarize({\n sessionID: sessionId,\n auto: false,\n providerID: model.providerID,\n modelID: model.modelID,\n });\n}\n\nasync function subscribeLegacyEvents({\n client,\n signal,\n}: {\n client: OpenCodeClient;\n signal: AbortSignal;\n}): Promise<AsyncIterable<unknown> | null> {\n const subscribed = await (client as any).event.subscribe(undefined, {\n signal,\n sseMaxRetryAttempts: 0,\n });\n return getEventStream(subscribed);\n}\n\nfunction readSessionId(data: unknown): string | undefined {\n if (!data || typeof data !== 'object') return undefined;\n const record = data as { id?: unknown; data?: { id?: unknown } };\n if (typeof record.id === 'string') return record.id;\n if (typeof record.data?.id === 'string') return record.data.id;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === 'object' && value !== null && Symbol.asyncIterator in value\n );\n}\n\nfunction getEventStream(source: unknown): AsyncIterable<unknown> | null {\n if (!source || typeof source !== 'object') return null;\n const candidate = source as { stream?: unknown; data?: unknown };\n if (isAsyncIterable(candidate.stream)) return candidate.stream;\n if (isAsyncIterable(candidate.data)) return candidate.data;\n return null;\n}\n\nfunction legacyStatusType(event: OpenCodeEvent): string | undefined {\n const status = event.properties?.status;\n return status && typeof status === 'object'\n ? String((status as { type?: unknown }).type ?? '')\n : undefined;\n}\n\nfunction legacyRetryStatusMessage(event: OpenCodeEvent): string {\n const status = event.properties?.status;\n const details: string[] = [];\n if (status && typeof status === 'object') {\n const retryStatus = status as { attempt?: unknown; message?: unknown };\n if (typeof retryStatus.attempt === 'number') {\n details.push(`attempt ${retryStatus.attempt}`);\n }\n if (typeof retryStatus.message === 'string' && retryStatus.message.trim()) {\n details.push(retryStatus.message.trim());\n }\n }\n return details.length > 0\n ? `OpenCode session retry: ${details.join('; ')}`\n : 'OpenCode session retry';\n}\n\nasync function ensureSession({\n client,\n start,\n emit,\n}: {\n client: OpenCodeClient;\n start: StartMessage;\n emit: Emit;\n}): Promise<string> {\n if (runtime.sessionId) return runtime.sessionId;\n if (start.resumeSessionId) {\n const existing = await legacySessionGet({\n client,\n sessionId: start.resumeSessionId,\n }).catch(() => undefined);\n if (existing && !existing.error) {\n runtime.sessionId = start.resumeSessionId;\n emit({ type: 'bridge-thread', threadId: runtime.sessionId });\n return runtime.sessionId;\n }\n }\n const created = await legacySessionCreate({ client });\n if (created.error) {\n throw new Error(\n `OpenCode session create failed: ${formatError(created.error)}`,\n );\n }\n const id = readSessionId(created.data);\n if (!id) throw new Error('OpenCode session create returned no id.');\n runtime.sessionId = id;\n emit({ type: 'bridge-thread', threadId: id });\n return id;\n}\n\nasync function runPrompt({\n client,\n sessionId,\n start,\n turn,\n emit,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<HarnessUsage | undefined> {\n const eventsAbort = new AbortController();\n const turnSettled = createDeferred<'event' | 'stream-ended'>();\n let sawContent = false;\n let sawFinishStep = false;\n let sawBusy = false;\n let sawStructuredOutput = false;\n let terminalError: string | undefined;\n let submittingUserMessage = false;\n const state = createTranslationState();\n const initialSessionTokens = await readSessionTokens({\n client,\n sessionId,\n }).catch(() => undefined);\n const assistantBaseline = createAssistantSnapshotBaseline(\n await latestAssistantSnapshot({ client, sessionId }),\n );\n const eventsReady = createDeferred<void>();\n let stepUsage: HarnessUsage | undefined;\n let latestSessionTokens: OpenCodeTokenUsage | undefined;\n const eventLoop = consumeEvents({\n client,\n sessionId,\n permissionMode: start.permissionMode,\n builtinToolFiltering: start.builtinToolFiltering,\n turn,\n state,\n emit: msg => {\n if (msg.type === 'text-delta' || msg.type === 'reasoning-delta') {\n sawContent = true;\n }\n if (msg.type === 'finish-step') {\n sawFinishStep = true;\n stepUsage = addUsage({\n left: stepUsage,\n right: msg.usage as HarnessUsage,\n });\n }\n emit(msg);\n },\n signal: eventsAbort.signal,\n onSubscribed: () => eventsReady.resolve(undefined),\n onEvent: event => {\n if (event.type === 'message.updated') {\n emitOpenCodeStreamStart({\n info: event.properties?.info,\n state,\n emit,\n });\n const info = asOpenCodeObject(event.properties?.info);\n if (\n start.responseFormat?.type === 'json' &&\n info?.structured !== undefined\n ) {\n const id = String(info.id ?? randomUUID());\n emit({ type: 'text-start', id });\n emit({\n type: 'text-delta',\n id,\n delta: JSON.stringify(info.structured),\n });\n emit({ type: 'text-end', id });\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n });\n sawFinishStep = true;\n sawStructuredOutput = true;\n if (\n !submittingUserMessage &&\n turn.experimental_userMessages.pendingCount === 0\n ) {\n turn.experimental_userMessages.close();\n turnSettled.resolve('event');\n return true;\n }\n }\n }\n if (event.type === 'session.updated') {\n latestSessionTokens =\n extractSessionTokens(event.properties) ?? latestSessionTokens;\n }\n if (\n event.type === 'session.next.step.failed' ||\n event.type === 'session.error'\n ) {\n const error = formatError(event.properties?.error ?? event);\n if (event.type === 'session.error') {\n terminalError = error;\n }\n turn.experimental_userMessages.close(new Error(error));\n turnSettled.resolve('event');\n return true;\n }\n const status = legacyStatusType(event);\n if (status === 'busy') {\n sawBusy = true;\n } else if (status === 'retry') {\n sawBusy = true;\n turn.emitWarning({ message: legacyRetryStatusMessage(event) });\n } else if (sawBusy && status === 'idle') {\n sawBusy = false;\n if (\n !submittingUserMessage &&\n turn.experimental_userMessages.pendingCount === 0 &&\n (start.responseFormat?.type !== 'json' || sawStructuredOutput)\n ) {\n turn.experimental_userMessages.close();\n turnSettled.resolve('event');\n return true;\n }\n }\n },\n }).finally(() => {\n eventsReady.resolve(undefined);\n turn.experimental_userMessages.close(\n new Error('OpenCode event stream ended before the turn settled.'),\n );\n turnSettled.resolve('stream-ended');\n });\n await eventsReady.promise;\n const userMessageLoop = (async () => {\n for await (const message of turn.experimental_userMessages) {\n submittingUserMessage = true;\n try {\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n prompt: message.text,\n });\n if (prompted.error) {\n message.reject(\n new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`),\n );\n continue;\n }\n message.accept();\n } catch (error) {\n message.reject(error);\n } finally {\n submittingUserMessage = false;\n }\n }\n })();\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n });\n if (prompted.error) {\n eventsAbort.abort();\n turn.experimental_userMessages.close(\n new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`),\n );\n throw new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`);\n }\n const settlement = await turnSettled.promise;\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n await userMessageLoop.catch(() => {});\n if (settlement === 'stream-ended') {\n throw new Error('OpenCode event stream ended before the turn settled.');\n }\n if (terminalError) throw new Error(terminalError);\n if (!sawFinishStep) {\n const emittedFallback = await emitContextFallback({\n client,\n sessionId,\n assistantBaseline,\n state,\n emit,\n emitContent: !sawContent,\n }).catch(() => false);\n if (!emittedFallback) {\n throw new Error(\n 'OpenCode turn settled without a correlated assistant response.',\n );\n }\n }\n const finalSessionTokens =\n (await readSessionTokens({ client, sessionId }).catch(() => undefined)) ??\n latestSessionTokens;\n if (initialSessionTokens && finalSessionTokens) {\n return mapUsage(\n subtractSessionTokens({\n before: initialSessionTokens,\n after: finalSessionTokens,\n }),\n );\n }\n return stepUsage;\n}\n\nasync function runCompaction({\n client,\n sessionId,\n start,\n turn,\n emit,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n const eventsAbort = new AbortController();\n const compactionSettled = createDeferred<void>();\n let sawCompaction = false;\n let sawBusy = false;\n let terminalError: string | undefined;\n const model = await resolveCompactionModel({\n client,\n sessionId,\n start,\n });\n if (!model) {\n throw new Error(\n 'OpenCode compaction requires a previous turn or an explicit model.',\n );\n }\n const eventLoop = consumeEvents({\n client,\n sessionId,\n permissionMode: start.permissionMode,\n builtinToolFiltering: start.builtinToolFiltering,\n turn,\n state: createTranslationState(),\n emit: msg => {\n if (msg.type === 'compaction') sawCompaction = true;\n emit(msg);\n },\n signal: eventsAbort.signal,\n onEvent: event => {\n if (\n event.type === 'session.next.compaction.ended' ||\n event.type === 'session.compacted'\n ) {\n compactionSettled.resolve();\n return true;\n }\n const status = legacyStatusType(event);\n if (status === 'busy') {\n sawBusy = true;\n } else if (status === 'retry') {\n sawBusy = true;\n turn.emitWarning({ message: legacyRetryStatusMessage(event) });\n } else if (sawBusy && status === 'idle') {\n compactionSettled.resolve();\n return true;\n }\n if (event.type === 'session.error') {\n terminalError = formatError(event.properties?.error ?? event);\n compactionSettled.resolve();\n return true;\n }\n },\n });\n const compacted = await legacySessionSummarize({\n client,\n sessionId,\n model,\n });\n if (compacted.error) {\n eventsAbort.abort();\n throw new Error(\n `OpenCode compaction failed: ${formatError(compacted.error)}`,\n );\n }\n await Promise.race([compactionSettled.promise, sleep(250)]);\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n if (terminalError) throw new Error(terminalError);\n if (!sawCompaction) {\n emit({\n type: 'compaction',\n trigger: 'manual',\n summary: '',\n harnessMetadata: {\n opencode: { missingSummary: true },\n },\n });\n }\n}\n\nasync function consumeEvents({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n state,\n emit,\n signal,\n onSubscribed,\n onEvent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n state: TranslationState;\n emit: Emit;\n signal: AbortSignal;\n onSubscribed?: () => void;\n onEvent?: (event: OpenCodeEvent) => boolean | void;\n}): Promise<void> {\n const stream = await subscribeLegacyEvents({ client, signal });\n onSubscribed?.();\n if (!stream) return;\n const taskSessionIds = new Set([sessionId]);\n const registerSubagentSession = (sourceSessionId: string) =>\n function register({\n parentSessionId,\n sessionId: subagentSessionId,\n }: {\n parentSessionId: string;\n sessionId: string;\n }) {\n if (\n parentSessionId === sourceSessionId &&\n taskSessionIds.has(sourceSessionId)\n ) {\n taskSessionIds.add(subagentSessionId);\n }\n };\n const emitStreamEvent = createEmitStreamEvent({\n state,\n emit,\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall: input => authorizeHostToolCall({ ...input, state }),\n onSubagentSession: registerSubagentSession(sessionId),\n isMcpToolName: toolName =>\n [...runtime.mcpToolPrefixes].some(prefix => toolName.startsWith(prefix)),\n stripWorkDir,\n formatError,\n });\n const descendantEventProcessors = new Map<\n string,\n (event: OpenCodeEvent) => void\n >();\n const processDescendantEvent = (\n descendantSessionId: string,\n event: OpenCodeEvent,\n ) => {\n let processEvent = descendantEventProcessors.get(descendantSessionId);\n if (!processEvent) {\n const descendantState = createTranslationState();\n let currentEvent: OpenCodeEvent | undefined;\n let modelId: string | undefined;\n const emittedUsageStepIds = new Set<string>();\n processEvent = createEmitStreamEvent({\n state: descendantState,\n emit: message => {\n if (message.type !== 'finish-step') return;\n const stepId = getSubagentStepId(currentEvent);\n if (!stepId || emittedUsageStepIds.has(stepId)) return;\n emittedUsageStepIds.add(stepId);\n const opencodeMetadata = asOpenCodeObject(\n message.harnessMetadata,\n )?.opencode;\n const cost = asOpenCodeObject(opencodeMetadata)?.cost;\n emit({\n type: 'raw',\n rawValue: {\n type: 'opencode.subagent-usage',\n version: 1,\n sessionId: descendantSessionId,\n stepId,\n ...(modelId ? { modelId } : {}),\n usage: message.usage,\n ...(typeof cost === 'number' ? { cost } : {}),\n },\n });\n },\n emitWarning: () => undefined,\n emitError: () => undefined,\n toWireToolName,\n nativeNameField,\n getHostToolName,\n authorizeHostToolCall: input =>\n authorizeHostToolCall({ ...input, state: descendantState }),\n onSubagentSession: registerSubagentSession(descendantSessionId),\n isMcpToolName: () => false,\n stripWorkDir,\n formatError,\n });\n const emitDescendantEvent = processEvent;\n processEvent = descendantEvent => {\n currentEvent = descendantEvent;\n if (descendantEvent.type === 'message.updated') {\n const info = openCodeMessageInfoFromValue(\n descendantEvent.properties?.info,\n );\n const providerID = stringValue(info?.providerID);\n const modelID = stringValue(info?.modelID);\n if (providerID && modelID) modelId = `${providerID}/${modelID}`;\n }\n emitDescendantEvent(descendantEvent);\n };\n descendantEventProcessors.set(descendantSessionId, processEvent);\n }\n processEvent(event);\n };\n for await (const rawEvent of stream) {\n if (signal.aborted || turn.abortSignal.aborted) break;\n const event = unwrapOpenCodeEvent(rawEvent);\n const eventSessionId = event ? getOpenCodeEventSessionId(event) : undefined;\n if (!event) continue;\n const scopedSessionId =\n !eventSessionId || eventSessionId === sessionId\n ? sessionId\n : taskSessionIds.has(eventSessionId)\n ? eventSessionId\n : undefined;\n if (!scopedSessionId) continue;\n const isDescendant = scopedSessionId !== sessionId;\n if (event.type === 'question.asked') {\n await handleQuestion({\n client,\n turn,\n emit,\n event,\n });\n } else if (event.type === 'permission.v2.asked') {\n await handlePermissionV2({\n client,\n sessionId: scopedSessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n } else if (event.type === 'permission.asked') {\n await handlePermission({\n client,\n sessionId: scopedSessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n } else if (isDescendant) {\n processDescendantEvent(scopedSessionId, event);\n } else {\n emitStreamEvent(event);\n }\n if (isDescendant) continue;\n if (onEvent?.(event)) break;\n }\n}\n\nfunction getSubagentStepId(event: OpenCodeEvent | undefined) {\n if (event?.type === 'message.part.updated') {\n const part = asOpenCodeObject(event.properties?.part);\n if (part?.type !== 'step-finish') return undefined;\n return stringValue(part.id) ?? stringValue(part.messageID) ?? event.id;\n }\n if (event?.type !== 'session.next.step.ended') return undefined;\n return stringValue(event.properties?.stepID) ?? event.id;\n}\n\nasync function handleQuestion({\n client,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const nativeRequest = event.properties as OpenCodeQuestionRequest | undefined;\n if (\n nativeRequest == null ||\n typeof nativeRequest.id !== 'string' ||\n typeof nativeRequest.sessionID !== 'string' ||\n !Array.isArray(nativeRequest.questions)\n ) {\n return;\n }\n const toolCallId = nativeRequest.tool?.callID ?? nativeRequest.id;\n\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: 'askUserQuestions',\n nativeName: 'question',\n input: JSON.stringify(toHarnessQuestionsInput(nativeRequest)),\n providerExecuted: false,\n providerMetadata: {\n opencode: {\n nativeRequest,\n },\n },\n });\n\n const questionKey = openCodeQuestionKey(nativeRequest);\n const result = await turn.requestToolResult({\n toolCallId,\n matches: candidate => {\n const continuedRequest = candidate.toolResult?.providerOptions?.opencode\n ?.nativeRequest as OpenCodeQuestionRequest | undefined;\n return (\n continuedRequest != null &&\n openCodeQuestionKey(continuedRequest) === questionKey\n );\n },\n });\n const nativeResponse = toOpenCodeQuestionResponse({\n nativeRequest,\n output: result.output as Parameters<\n typeof toOpenCodeQuestionResponse\n >[0]['output'],\n });\n\n const response =\n nativeResponse.action === 'reject'\n ? await client.question.reject({\n requestID: nativeRequest.id,\n directory: workdir,\n })\n : await client.question.reply({\n requestID: nativeRequest.id,\n directory: workdir,\n answers: nativeResponse.answers,\n });\n if (response.error != null) {\n throw new Error(\n `OpenCode question response failed: ${formatError(response.error)}`,\n );\n }\n}\n\nfunction sanitizeMcpToolName(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '_');\n}\n\nasync function handlePermissionV2({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const props = event.properties ?? {};\n const requestID = String(props.id ?? '');\n if (!requestID) return;\n const reply = await selectPermissionReply({\n action: String(props.action ?? ''),\n resources: Array.isArray(props.resources)\n ? props.resources.map(String)\n : [],\n requestID,\n toolCallId: String(props.source?.callID ?? requestID),\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n });\n await client.v2.session.permission.reply({\n sessionID: sessionId,\n requestID,\n reply: reply.reply,\n ...(reply.message ? { message: reply.message } : {}),\n });\n}\n\nasync function handlePermission({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n event: OpenCodeEvent;\n}): Promise<void> {\n const props = event.properties ?? {};\n const requestID = String(props.id ?? '');\n if (!requestID) return;\n const tool = asOpenCodeObject(props.tool);\n const reply = await selectPermissionReply({\n action: String(props.permission ?? ''),\n resources: Array.isArray(props.patterns) ? props.patterns.map(String) : [],\n requestID,\n toolCallId: String(tool?.callID ?? requestID),\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n });\n await client.permission.reply({\n requestID,\n directory: workdir,\n reply: reply.reply,\n ...(reply.message ? { message: reply.message } : {}),\n });\n void sessionId;\n}\n\nasync function selectPermissionReply({\n action,\n resources,\n requestID,\n toolCallId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n}: {\n action: string;\n resources: string[];\n requestID: string;\n toolCallId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<{ reply: 'once' | 'always' | 'reject'; message?: string }> {\n const toolName = toPermissionToolName(action);\n if (\n isBuiltinToolInactive({ toolName, toolFiltering: builtinToolFiltering })\n ) {\n emit({\n type: 'tool-approval-request',\n approvalId: requestID,\n toolCallId,\n });\n const decision = await turn.requestToolApproval(requestID);\n return decision.approved\n ? { reply: 'once' }\n : {\n reply: 'reject',\n ...(decision.reason ? { message: decision.reason } : {}),\n };\n }\n if (!permissionMode || permissionMode === 'allow-all') {\n return { reply: 'always' };\n }\n if (resources.some(resource => isExternalPath(resource))) {\n return { reply: 'reject', message: 'External directory access rejected.' };\n }\n const kind = TOOL_KIND[toolName] ?? 'bash';\n const allowed =\n permissionMode === 'allow-edits'\n ? kind === 'readonly' || kind === 'edit'\n : kind === 'readonly';\n if (allowed) return { reply: 'always' };\n\n emit({\n type: 'tool-approval-request',\n approvalId: requestID,\n toolCallId,\n });\n const decision = await turn.requestToolApproval(requestID);\n return decision.approved\n ? { reply: 'once' }\n : {\n reply: 'reject',\n ...(decision.reason ? { message: decision.reason } : {}),\n };\n}\n\nfunction toPermissionToolName(action: string): string {\n const normalized = action.toLowerCase();\n if (normalized.includes('bash') || normalized.includes('shell'))\n return 'bash';\n if (normalized.includes('edit')) return 'edit';\n if (normalized.includes('write')) return 'write';\n if (normalized.includes('webfetch')) return 'webfetch';\n if (normalized.includes('task') || normalized.includes('agent'))\n return 'agent';\n if (normalized.includes('list')) return 'ls';\n if (normalized.includes('grep')) return 'grep';\n if (normalized.includes('glob')) return 'glob';\n if (normalized.includes('read')) return 'read';\n return toWireToolName(normalized);\n}\n\nfunction resolveInactiveBuiltinToolNames(\n start: StartMessage,\n): ReadonlyArray<string> {\n const toolFiltering = start.builtinToolFiltering;\n if (toolFiltering == null) return [];\n return toolFiltering.mode === 'allow'\n ? Object.keys(PUBLIC_TO_NATIVE).filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n}\n\nfunction isBuiltinToolInactive(input: {\n toolName: string;\n toolFiltering: StartMessage['builtinToolFiltering'];\n}): boolean {\n if (input.toolFiltering == null) return false;\n return input.toolFiltering.mode === 'allow'\n ? !input.toolFiltering.toolNames.includes(input.toolName)\n : input.toolFiltering.toolNames.includes(input.toolName);\n}\n\nfunction isExternalPath(resource: string): boolean {\n if (!path.isAbsolute(resource)) return false;\n return (\n !isPathInsideOrEqual(resource, workdir) &&\n (!skillsDir || !isPathInsideOrEqual(resource, skillsDir))\n );\n}\n\nfunction isPathInsideOrEqual(file: string, root: string): boolean {\n const relative = path.relative(\n canonicalizeForContainment(root),\n canonicalizeForContainment(file),\n );\n return (\n relative === '' ||\n (relative !== '..' &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction canonicalizeForContainment(inputPath: string): string {\n const normalized = path.resolve(inputPath);\n try {\n return realpathSync.native(normalized);\n } catch {\n const parent = path.dirname(normalized);\n return parent === normalized\n ? normalized\n : path.join(\n canonicalizeForContainment(parent),\n path.basename(normalized),\n );\n }\n}\n\nfunction toWireToolName(nativeName: string): string {\n return (\n NATIVE_TO_COMMON[nativeName] ?? OPENCODE_TO_WIRE[nativeName] ?? nativeName\n );\n}\n\nfunction nativeNameField({\n nativeName,\n toolName,\n}: {\n nativeName: string;\n toolName: string;\n}): { nativeName?: string } {\n if (!nativeName || nativeName === toolName || toolName === 'agent') return {};\n return { nativeName };\n}\n\nfunction getHostToolName(\n toolName: string,\n rawToolName: unknown,\n): string | undefined {\n if (runtime.toolNames.has(toolName)) return toolName;\n if (typeof rawToolName === 'string' && runtime.toolNames.has(rawToolName)) {\n return rawToolName;\n }\n if (\n typeof rawToolName === 'string' &&\n rawToolName.startsWith('harness-tools_') &&\n runtime.toolNames.has(rawToolName.slice('harness-tools_'.length))\n ) {\n return rawToolName.slice('harness-tools_'.length);\n }\n}\n\nfunction authorizeHostToolCall({\n callID,\n toolName,\n input,\n state,\n}: {\n callID: string;\n toolName: string;\n input: unknown;\n state: TranslationState;\n}): void {\n if (state.hostToolCallsAuthorized.has(callID)) return;\n state.hostToolCallsAuthorized.add(callID);\n runtime.relay?.authorizeToolCall({ toolName, input });\n}\n\nasync function emitContextFallback({\n client,\n sessionId,\n assistantBaseline,\n state,\n emit,\n emitContent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n assistantBaseline: AssistantSnapshotBaseline;\n state: TranslationState;\n emit: Emit;\n emitContent: boolean;\n}): Promise<boolean> {\n const assistant = await latestAssistantSnapshot({ client, sessionId });\n if (\n !assistant ||\n !isAssistantSnapshotAfterBaseline({\n assistant,\n baseline: assistantBaseline,\n })\n ) {\n return false;\n }\n emitOpenCodeStreamStart({ info: assistant, state, emit });\n if (emitContent && Array.isArray(assistant.contentParts)) {\n for (const part of assistant.contentParts) {\n emitAssistantContentPart(part, emit);\n }\n }\n const rawFinish =\n typeof assistant.finish === 'string'\n ? assistant.finish\n : assistant.error\n ? 'error'\n : 'stop';\n emit({\n type: 'finish-step',\n finishReason: {\n unified: mapOpenCodeFinishReason(rawFinish),\n raw: rawFinish,\n },\n usage: mapUsage(assistant.tokens),\n ...(typeof assistant.cost === 'number'\n ? {\n harnessMetadata: {\n opencode: { cost: assistant.cost, fallback: true },\n },\n }\n : { harnessMetadata: { opencode: { fallback: true } } }),\n });\n return true;\n}\n\nasync function readSessionTokens({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<OpenCodeTokenUsage | undefined> {\n const session = await legacySessionGet({ client, sessionId });\n if (session.error) return undefined;\n return extractSessionTokens(session.data);\n}\n\ntype AssistantSnapshot = {\n id?: unknown;\n contentParts?: unknown[];\n metadata?: unknown;\n model?: unknown;\n modelID?: unknown;\n providerID?: unknown;\n tokens?: unknown;\n finish?: unknown;\n cost?: unknown;\n error?: unknown;\n};\n\nasync function latestAssistantSnapshot({\n client,\n sessionId,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n}): Promise<AssistantSnapshot | undefined> {\n const legacy = await (client as any).session\n .messages({ sessionID: sessionId, limit: 20 })\n .catch(() => undefined);\n const legacyAssistant = latestLegacyAssistantMessage(legacy?.data);\n if (legacyAssistant) return legacyAssistant;\n\n const context = await client.v2.session\n .context({ sessionID: sessionId })\n .catch(() => undefined);\n if (!context || context.error) return undefined;\n return latestV2AssistantMessage(context.data);\n}\n\nfunction latestLegacyAssistantMessage(\n data: unknown,\n): AssistantSnapshot | undefined {\n const messages = Array.isArray(data) ? data : [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const item = messages[i];\n if (!item || typeof item !== 'object') continue;\n const record = item as { info?: unknown; parts?: unknown };\n const info = record.info;\n if (\n info &&\n typeof info === 'object' &&\n (info as { role?: unknown }).role === 'assistant'\n ) {\n return {\n ...(info as Record<string, unknown>),\n contentParts: Array.isArray(record.parts) ? record.parts : undefined,\n };\n }\n }\n}\n\nfunction latestV2AssistantMessage(\n data: unknown,\n): AssistantSnapshot | undefined {\n const messages =\n data &&\n typeof data === 'object' &&\n Array.isArray((data as { data?: unknown }).data)\n ? (data as { data: unknown[] }).data\n : Array.isArray(data)\n ? data\n : [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (\n message &&\n typeof message === 'object' &&\n (message as { type?: unknown }).type === 'assistant'\n ) {\n const record = message as Record<string, unknown>;\n return {\n ...record,\n contentParts: Array.isArray(record.content)\n ? record.content\n : undefined,\n };\n }\n }\n}\n\nfunction emitAssistantContentPart(part: unknown, emit: Emit): void {\n if (!part || typeof part !== 'object') return;\n const value = part as { type?: unknown; id?: unknown; text?: unknown };\n if (value.type !== 'text' && value.type !== 'reasoning') return;\n const id =\n typeof value.id === 'string' && value.id.length > 0\n ? value.id\n : `${value.type}-${randomUUID()}`;\n const text = typeof value.text === 'string' ? value.text : '';\n if (value.type === 'text') {\n emit({ type: 'text-start', id });\n if (text) emit({ type: 'text-delta', id, delta: text });\n emit({ type: 'text-end', id });\n return;\n }\n emit({ type: 'reasoning-start', id });\n if (text) emit({ type: 'reasoning-delta', id, delta: text });\n emit({ type: 'reasoning-end', id });\n}\n\nasync function startToolRelay({\n tools,\n emit,\n requestToolResult,\n}: {\n tools: ReadonlyArray<{ name: string }>;\n emit: Emit;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n}): Promise<ToolRelay> {\n return startAuthorizedToolRelay({ tools, emit, requestToolResult });\n}\n\nfunction createDeferred<T>(): {\n promise: Promise<T>;\n resolve(value: T | PromiseLike<T>): void;\n} {\n let resolve!: (value: T | PromiseLike<T>) => void;\n const promise = new Promise<T>(res => {\n resolve = res;\n });\n return { promise, resolve };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction splitModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return { providerID, modelID: rest.join('/') };\n }\n return { providerID: provider, modelID: model };\n}\n\ntype OpenCodeModelRef = { providerID: string; modelID: string };\n\nasync function resolveCompactionModel({\n client,\n sessionId,\n start,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<OpenCodeModelRef | undefined> {\n const assistant = await latestAssistantSnapshot({ client, sessionId }).catch(\n () => undefined,\n );\n const assistantModel = modelRefFromAssistantSnapshot(assistant);\n if (assistantModel) return assistantModel;\n\n const session = await legacySessionGet({ client, sessionId }).catch(\n () => undefined,\n );\n const sessionModel = modelRefFromSessionInfo(session?.data);\n if (sessionModel) return sessionModel;\n\n return modelRefFromStart(start);\n}\n\nfunction modelRefFromAssistantSnapshot(\n assistant: AssistantSnapshot | undefined,\n): OpenCodeModelRef | undefined {\n if (!assistant) return undefined;\n const model = modelRefFromValue(assistant.model);\n if (model) return model;\n\n const direct = modelRefFromValue(assistant);\n if (direct) return direct;\n\n return modelRefFromValue(asOpenCodeObject(assistant.metadata)?.assistant);\n}\n\nfunction modelRefFromSessionInfo(data: unknown): OpenCodeModelRef | undefined {\n const session = asOpenCodeObject(data);\n if (!session) return undefined;\n return modelRefFromValue(session.model) ?? modelRefFromObject(session);\n}\n\nfunction modelRefFromStart(start: StartMessage): OpenCodeModelRef | undefined {\n const model = splitModel(start.model, start.provider);\n if (!model.modelID) return undefined;\n return {\n providerID:\n model.providerID ?? start.provider ?? procEnv.OPENAI_NAME ?? 'anthropic',\n modelID: model.modelID,\n };\n}\n\nfunction modelRefFromValue(value: unknown): OpenCodeModelRef | undefined {\n const model = asOpenCodeObject(value);\n return model ? modelRefFromObject(model) : undefined;\n}\n\nfunction modelRefFromObject(\n value: OpenCodeObject,\n): OpenCodeModelRef | undefined {\n const providerID = stringValue(value.providerID);\n const modelID = stringValue(value.modelID ?? value.id);\n if (!providerID || !modelID) return undefined;\n return { providerID, modelID };\n}\n\nfunction stripWorkDir(file: string): string {\n if (!file) return file;\n const normalized = path.resolve(file);\n const root = path.resolve(workdir);\n return normalized.startsWith(`${root}/`)\n ? normalized.slice(root.length + 1)\n : file;\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n bootstrapDir?: string;\n skillsDir?: string;\n} {\n const out: {\n workdir?: string;\n bridgeStateDir?: string;\n bootstrapDir?: string;\n skillsDir?: string;\n } = {};\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 } else if (args[i] === '--bootstrap-dir' && i + 1 < args.length) {\n out.bootstrapDir = args[++i];\n } else if (args[i] === '--skills-dir' && i + 1 < args.length) {\n out.skillsDir = args[++i];\n }\n }\n return out;\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n const cause = 'cause' in error ? error.cause : undefined;\n if (cause === undefined) return error.message;\n return `${error.message}: ${formatError(cause)}`;\n }\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction emitFatal(message: string): never {\n process.stderr.write(`[OpenCode bridge] ${message}\\n`);\n process.exit(1);\n}\n"],"mappings":"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"}