@ai-sdk/harness-opencode 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/bridge/index.mjs +3 -1
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bridge/index.ts +4 -0
- package/src/index.ts +1 -0
- package/src/opencode-harness.ts +7 -0
- package/src/version.ts +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @ai-sdk/harness-opencode
|
|
2
2
|
|
|
3
|
+
## 1.0.21
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [ac306ed]
|
|
8
|
+
- @ai-sdk/provider-utils@5.0.6
|
|
9
|
+
- @ai-sdk/harness@1.0.21
|
|
10
|
+
|
|
11
|
+
## 1.0.20
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- b2d0306: feat(harness): send `User-Agent` and `x-client-app` headers in harness adapters
|
|
16
|
+
- Updated dependencies [b7aa06a]
|
|
17
|
+
- @ai-sdk/harness@1.0.20
|
|
18
|
+
|
|
3
19
|
## 1.0.19
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/dist/bridge/index.mjs
CHANGED
|
@@ -762,6 +762,7 @@ var TOOL_KIND = {
|
|
|
762
762
|
skill: "edit",
|
|
763
763
|
todowrite: "edit"
|
|
764
764
|
};
|
|
765
|
+
var HARNESS_CLIENT_APP = procEnv2.AI_SDK_HARNESS_CLIENT_APP;
|
|
765
766
|
var args = parseArgs(argv.slice(2));
|
|
766
767
|
var workdir = args.workdir ?? emitFatal("Missing --workdir argument.");
|
|
767
768
|
var bridgeStateDir = args.bridgeStateDir ?? emitFatal("Missing --bridge-state-dir argument.");
|
|
@@ -894,7 +895,8 @@ function buildProviderConfig(start) {
|
|
|
894
895
|
[providerID]: {
|
|
895
896
|
options: {
|
|
896
897
|
apiKey: procEnv2.AI_GATEWAY_API_KEY,
|
|
897
|
-
baseURL: toOpenCodeGatewayBaseUrl(procEnv2.AI_GATEWAY_BASE_URL)
|
|
898
|
+
baseURL: toOpenCodeGatewayBaseUrl(procEnv2.AI_GATEWAY_BASE_URL),
|
|
899
|
+
...HARNESS_CLIENT_APP ? { headers: { "x-client-app": HARNESS_CLIENT_APP } } : {}
|
|
898
900
|
},
|
|
899
901
|
...modelID ? {
|
|
900
902
|
models: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../src/bridge/index.ts","../../src/bridge/opencode-events.ts","../../src/bridge/opencode-path.ts","../../src/bridge/opencode-usage.ts","../../src/bridge/tool-relay-auth.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, single-flight connection\n// replacement, the in-memory event log + monotonic `seq`, resume replay, and\n// the lifecycle/meta files. The adapter supplies only `onStart` (drive its\n// CLI/SDK and translate to wire events) and `onDetach` (its resume payload).\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return { message: String(err) };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n toolCallId: string,\n ): Promise<{ output: unknown; isError?: boolean }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n /**\n * Live queue of mid-turn user messages. The runtime pushes inbound\n * `user-message` text here; the adapter drains it as its runtime accepts\n * interactive input.\n */\n readonly pendingUserMessages: string[];\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /** Drive one prompt turn. Rejections surface to the host as an `error` event. */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /** Produce the adapter-defined resume payload for a `detach`. Defaults to `{}`. */\n onDetach?(): unknown | Promise<unknown>;\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 a `shutdown` / `detach`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; text: string }\n | { type: 'abort' }\n | { type: 'shutdown' }\n | { type: 'detach' }\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 * `shutdown` / `detach` 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, onDetach } = options;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: string[] | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the just-interrupted turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n (output: { output: unknown; isError?: boolean }) => void\n >();\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const sendControl = (msg: Record<string, unknown>): void => {\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(JSON.stringify(msg));\n } catch {\n // best-effort\n }\n }\n };\n\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (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 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 const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const turn: BridgeTurn = {\n emit,\n requestToolResult: toolCallId =>\n new Promise(resolve => {\n pendingToolResults.set(toolCallId, resolve);\n }),\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n pendingUserMessages: [],\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n };\n currentUserMessages = turn.pendingUserMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emit({ type: 'error', error: serialiseError(err) });\n } finally {\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n return;\n }\n case 'tool-result': {\n const resolver = pendingToolResults.get(msg.toolCallId);\n if (resolver) {\n pendingToolResults.delete(msg.toolCallId);\n resolver({ output: msg.output, isError: msg.isError });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message':\n currentUserMessages?.push(msg.text);\n return;\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n replay(ws, msg.lastSeenEventId);\n return;\n case 'shutdown':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n drainThenExit(ws, 1000, 'shutdown');\n return;\n case 'detach': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onDetach?.()) ?? {};\n sendControl({ type: 'bridge-detach', data });\n drainThenExit(ws, 1000, 'detach');\n return;\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean shutdown/detach leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Single-flight: a fresh authorized connection *replaces* the active one\n // (the host reconnecting after a drop). The previous socket's close is a\n // no-op below because it is no longer `activeSocket`.\n activeSocket = ws;\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl({\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl({\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the *current* socket's close matters. A stale socket (already\n // replaced by a reconnect) closing is a no-op. Crucially we do NOT abort\n // the in-flight turn — it keeps running and its events accumulate in the\n // log for replay when the host reconnects.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\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 emit({ type: 'error', error: serialiseError(err) });\n });\n process.on('unhandledRejection', err => {\n emit({ type: 'error', error: serialiseError(err) });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","import {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport { mkdirSync } from 'node:fs';\nimport { createServer, type Server } from 'node:http';\nimport path from 'node:path';\nimport { argv, env as procEnv } from 'node:process';\nimport type { StartMessage } from '../opencode-bridge-protocol';\n\nimport {\n createOpencodeClient,\n createOpencodeServer,\n} from '@opencode-ai/sdk/v2';\nimport {\n emitMissingFinalDelta,\n getOpenCodeEventSessionId,\n isStepSettlementEvent,\n type OpenCodeEvent,\n unwrapOpenCodeEvent,\n} from './opencode-events';\nimport { prependOpenCodeBinToPath } from './opencode-path';\nimport {\n addUsage,\n defaultUsage,\n extractSessionTokens,\n mapUsage,\n subtractSessionTokens,\n type HarnessUsage,\n type OpenCodeTokenUsage,\n} from './opencode-usage';\nimport {\n ToolRelayAuthorizer,\n isToolRelayRequestFromAllowedProcess,\n type ToolRelayCall,\n} from './tool-relay-auth';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\ntype OpenCodeClient = ReturnType<typeof createOpencodeClient>;\ntype OpenCodeServer = Awaited<ReturnType<typeof createOpencodeServer>>;\ntype ToolRelay = {\n port: number;\n close(): void;\n authorizeToolCall(call: ToolRelayCall): void;\n};\n\ntype RuntimeState = {\n server?: OpenCodeServer;\n client?: OpenCodeClient;\n sessionId?: string;\n relay?: ToolRelay;\n toolNames: Set<string>;\n};\n\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep';\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};\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 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};\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 = { toolNames: new Set() };\nprependOpenCodeBinToPath({ bootstrapDir, env: procEnv });\n\nmkdirSync(process.env.HOME ?? '/tmp/opencode-home', { recursive: true });\n\nawait runBridge<StartMessage>({\n bridgeType: 'opencode',\n bridgeStateDir,\n onStart: runTurn,\n onDetach: () =>\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 const sessionId = await ensureSession({ client, start, emit });\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 emit({ type: 'error', error: serialiseError(err) });\n } finally {\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: totalUsage ?? defaultUsage(),\n });\n }\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 (runtime.client) return;\n\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 allowedScriptPaths: [`${bootstrapDir}/host-tool-mcp.mjs`],\n tools: start.tools,\n emit,\n requestToolResult: turn.requestToolResult,\n });\n }\n\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 });\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 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 },\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 if (relayPort && start.tools && start.tools.length > 0) {\n config.mcp = {\n '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 }\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 },\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 ...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 },\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 ...parseOpenAIQueryParams(),\n },\n },\n };\n }\n\n return undefined;\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}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.prompt({\n sessionID: sessionId,\n ...(start.instructions ? { system: start.instructions } : {}),\n ...(start.variant ? { variant: start.variant } : {}),\n parts: [{ type: 'text', text: 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 return undefined;\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 legacyStatusMessage(event: OpenCodeEvent): string | undefined {\n const status = event.properties?.status;\n if (!status || typeof status !== 'object') return undefined;\n const message = (status as { message?: unknown }).message;\n return typeof message === 'string' ? message : undefined;\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<void>();\n let sawContent = false;\n let sawFinishStep = false;\n let sawBusy = false;\n let terminalError: string | undefined;\n const initialSessionTokens = await readSessionTokens({\n client,\n sessionId,\n }).catch(() => undefined);\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 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 onEvent: event => {\n if (event.type === 'session.updated') {\n latestSessionTokens =\n extractSessionTokens(event.properties) ?? latestSessionTokens;\n }\n if (isStepSettlementEvent(event)) {\n turnSettled.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 terminalError = legacyStatusMessage(event) ?? 'Session retry';\n turnSettled.resolve();\n return true;\n } else if (sawBusy && status === 'idle') {\n turnSettled.resolve();\n return true;\n }\n if (event.type === 'session.error') {\n terminalError = formatError(event.properties?.error ?? event);\n turnSettled.resolve();\n return true;\n }\n },\n }).finally(() => turnSettled.resolve());\n emit({\n type: 'stream-start',\n ...(start.model ? { modelId: start.model } : {}),\n });\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n });\n if (prompted.error) {\n eventsAbort.abort();\n throw new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`);\n }\n await turnSettled.promise;\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n if (terminalError) throw new Error(terminalError);\n if (!sawFinishStep) {\n const emittedFallback = await emitContextFallback({\n client,\n sessionId,\n emit,\n emitContent: !sawContent,\n }).catch(() => false);\n if (!emittedFallback) {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n harnessMetadata: { opencode: { fallback: true, missingContext: true } },\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 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 terminalError = legacyStatusMessage(event) ?? 'Session retry';\n compactionSettled.resolve();\n return true;\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 emit,\n signal,\n onEvent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n signal: AbortSignal;\n onEvent?: (event: OpenCodeEvent) => boolean | void;\n}): Promise<void> {\n const stream = await subscribeLegacyEvents({ client, signal });\n if (!stream) return;\n const state = createTranslationState();\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 || (eventSessionId && eventSessionId !== sessionId)) continue;\n await translateAndEmit({\n event,\n state,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n client,\n turn,\n emit,\n });\n if (onEvent?.(event)) break;\n }\n}\n\ntype TranslationState = {\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};\n\nfunction createTranslationState(): TranslationState {\n return {\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 };\n}\n\nasync function translateAndEmit({\n event,\n state,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n client,\n turn,\n emit,\n}: {\n event: OpenCodeEvent;\n state: TranslationState;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n client: OpenCodeClient;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n const type = event.type;\n const props = event.properties ?? {};\n\n if (type === 'message.updated') {\n const info = props.info;\n if (isRecord(info)) {\n const id = stringValue(info.id);\n const role = stringValue(info.role);\n if (id && role) state.messageRoles.set(id, role);\n }\n return;\n }\n\n if (type === 'message.part.delta') {\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 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 return;\n }\n\n if (type === 'message.part.updated') {\n if (emitLegacyTextPartUpdate({ part: props.part, state, emit })) return;\n emitLegacyToolPart({ part: props.part, state, emit });\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 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 state,\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 ...(props.provider?.metadata\n ? { providerMetadata: props.provider.metadata }\n : {}),\n });\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 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 });\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: mapFinishReason(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 emit({ type: 'error', error: formatError(props.error ?? event) });\n return;\n }\n if (type === 'permission.v2.asked') {\n await handlePermissionV2({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n return;\n }\n if (type === 'permission.asked') {\n await handlePermission({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n }\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\nfunction emitLegacyTextPartUpdate({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n if (!isRecord(part)) return false;\n if (part.type !== 'text' && part.type !== 'reasoning') return false;\n const id = stringValue(part.id);\n if (!id) return true;\n\n const messageID = stringValue(part.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return true;\n\n const isReasoning = part.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 part.text === 'string' ? part.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 (legacyPartEnded(part)) {\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 legacyPartEnded(part: Record<string, unknown>): boolean {\n return isRecord(part.time) && part.time.end != null;\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 emitLegacyToolPart({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): void {\n if (!part || typeof part !== 'object') return;\n const toolPart = part as Record<string, any>;\n if (toolPart.type !== 'tool') return;\n const status = legacyToolPartStatus(toolPart);\n if (status !== 'running' && status !== 'completed' && status !== 'error') {\n return;\n }\n if (\n typeof toolPart.tool !== 'string' ||\n typeof toolPart.callID !== 'string'\n ) {\n return;\n }\n const callID = toolPart.callID;\n const rawToolName = toolPart.tool;\n const toolName = toWireToolName(rawToolName);\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: legacyToolPartInput(toolPart),\n state,\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 ...(toolPart.provider?.metadata\n ? { providerMetadata: toolPart.provider.metadata }\n : {}),\n });\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 });\n }\n}\n\nfunction legacyToolPartStatus(part: Record<string, any>): string | undefined {\n return typeof part.state === 'string'\n ? part.state\n : typeof part.state === 'object' && part.state !== null\n ? String(part.state.status ?? '')\n : undefined;\n}\n\nfunction legacyToolPartInput(\n part: Record<string, any>,\n): Record<string, unknown> {\n const state =\n typeof part.state === 'object' && part.state !== null\n ? (part.state as Record<string, any>)\n : undefined;\n return {\n ...(isRecord(part.metadata) ? part.metadata : {}),\n ...(isRecord(state?.metadata) ? state.metadata : {}),\n ...(isRecord(state?.input) ? state.input : {}),\n };\n}\n\nfunction legacyToolPartOutput(part: Record<string, any>): unknown {\n const state =\n typeof part.state === 'object' && part.state !== null\n ? (part.state as Record<string, any>)\n : undefined;\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 isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction parseToolInput(\n state: TranslationState,\n props: Record<string, any>,\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\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:\n typeof props.source === 'object' &&\n props.source !== null &&\n 'callID' in props.source\n ? String((props.source as { callID?: unknown }).callID)\n : 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 reply = await selectPermissionReply({\n action: String(props.permission ?? ''),\n resources: Array.isArray(props.patterns) ? props.patterns.map(String) : [],\n requestID,\n toolCallId:\n typeof props.tool === 'object' &&\n props.tool !== null &&\n 'callID' in props.tool\n ? String((props.tool as { callID?: unknown }).callID)\n : 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 (resources.some(resource => isExternalPath(resource))) {\n return { reply: 'reject', message: 'External directory access rejected.' };\n }\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 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 const normalized = path.resolve(resource);\n return (\n !isPathInsideOrEqual(normalized, workdir) &&\n (!skillsDir || !isPathInsideOrEqual(normalized, skillsDir))\n );\n}\n\nfunction isPathInsideOrEqual(file: string, root: string): boolean {\n const normalizedRoot = path.resolve(root);\n return file === normalizedRoot || file.startsWith(`${normalizedRoot}/`);\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 return undefined;\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 emit,\n emitContent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n emit: Emit;\n emitContent: boolean;\n}): Promise<boolean> {\n const assistant = await latestAssistantSnapshot({ client, sessionId });\n if (!assistant) return false;\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: mapFinishReason(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 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 return undefined;\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 return undefined;\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\nfunction mapFinishReason(\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\nasync function startToolRelay({\n allowedScriptPaths,\n tools,\n emit,\n requestToolResult,\n}: {\n allowedScriptPaths: ReadonlyArray<string>;\n tools: ReadonlyArray<{ name: string }>;\n emit: Emit;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n}): Promise<ToolRelay> {\n const toolNames = new Set(tools.map(t => t.name));\n const allowedScriptPathSet = new Set(allowedScriptPaths);\n const authorizer = new ToolRelayAuthorizer();\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 const authorized =\n authorizer.consumeToolCall({ toolName, input }) ||\n (await isToolRelayRequestFromAllowedProcess({\n socket: req.socket,\n allowedScriptPaths: allowedScriptPathSet,\n }));\n if (!authorized) {\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: () => closeServer(server),\n authorizeToolCall: call => authorizer.authorizeToolCall(call),\n };\n}\n\nfunction closeServer(server: Server): void {\n try {\n server.close();\n } catch {}\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 if (isRecord(assistant.metadata)) {\n return modelRefFromValue(assistant.metadata.assistant);\n }\n return undefined;\n}\n\nfunction modelRefFromSessionInfo(data: unknown): OpenCodeModelRef | undefined {\n if (!isRecord(data)) return undefined;\n return modelRefFromValue(data.model) ?? modelRefFromValue(data);\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 if (!isRecord(value)) return 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 stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\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) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\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\nfunction emitFatal(message: string): never {\n process.stderr.write(`[opencode bridge] ${message}\\n`);\n process.exit(1);\n}\n","export type OpenCodeEvent = {\n id?: string;\n type?: string;\n properties?: Record<string, any>;\n};\n\nexport function unwrapOpenCodeEvent(\n rawEvent: unknown,\n): OpenCodeEvent | undefined {\n if (!rawEvent || typeof rawEvent !== 'object') return undefined;\n const raw = rawEvent as Record<string, any>;\n if (raw.type === 'sync' && raw.syncEvent) {\n const sync = raw.syncEvent as Record<string, any>;\n return {\n id: String(sync.id ?? raw.id ?? ''),\n type: stripSyncVersion(String(sync.type ?? '')),\n properties: asRecord(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: asRecord(raw.properties) ?? asRecord(raw.data) ?? {},\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 part = props.part;\n if (\n part &&\n typeof part === 'object' &&\n !Array.isArray(part) &&\n typeof (part as { sessionID?: unknown }).sessionID === 'string'\n ) {\n return (part as { sessionID: string }).sessionID;\n }\n return undefined;\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\nfunction stripSyncVersion(type: string): string {\n return type.replace(/\\.\\d+$/, '');\n}\n\nfunction asRecord(value: unknown): Record<string, any> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n return value as Record<string, any>;\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","export 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 = Record<string, unknown>;\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 = asRecord(value);\n if (!record) return undefined;\n const tokens =\n extractOpenCodeTokens(record.tokens) ??\n extractOpenCodeTokens(asRecord(record.info)?.tokens) ??\n extractOpenCodeTokens(asRecord(record.data)?.tokens) ??\n extractOpenCodeTokens(asRecord(asRecord(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 = asRecord(value);\n const cache = asRecord(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 asRecord(value) ?? {};\n}\n\nfunction asRecord(value: unknown): Record<string, any> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n return value as Record<string, any>;\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","import { readdir, readFile, readlink } from 'node:fs/promises';\nimport type { Socket } from 'node:net';\n\nexport 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\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 this.authorizations.push({\n key: toolRelayCallKey(call),\n expiresAt: this.now() + this.ttlMs,\n });\n }\n\n consumeToolCall(call: ToolRelayCall): boolean {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const index = this.authorizations.findIndex(auth => auth.key === key);\n if (index === -1) return false;\n this.authorizations.splice(index, 1);\n return true;\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 }\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\nexport async function isToolRelayRequestFromAllowedProcess({\n socket,\n allowedScriptPaths,\n}: {\n socket: Socket;\n allowedScriptPaths: ReadonlySet<string>;\n}): Promise<boolean> {\n if (process.platform !== 'linux') return false;\n if (!socket.remotePort || !socket.localPort) return false;\n\n const inode = await findTcpSocketInode({\n clientPort: socket.remotePort,\n serverPort: socket.localPort,\n });\n if (!inode) return false;\n\n const cmdline = await findProcessCmdlineForSocketInode({ inode });\n return cmdline?.some(arg => allowedScriptPaths.has(arg)) ?? false;\n}\n\nasync function findTcpSocketInode({\n clientPort,\n serverPort,\n}: {\n clientPort: number;\n serverPort: number;\n}): Promise<string | undefined> {\n for (const tablePath of ['/proc/net/tcp', '/proc/net/tcp6']) {\n const table = await readFile(tablePath, 'utf8').catch(() => undefined);\n if (!table) continue;\n for (const line of table.split('\\n').slice(1)) {\n const columns = line.trim().split(/\\s+/);\n if (columns.length < 10) continue;\n const local = parseProcNetAddress(columns[1]);\n const remote = parseProcNetAddress(columns[2]);\n if (\n local?.port === clientPort &&\n remote?.port === serverPort &&\n columns[9] !== '0'\n ) {\n return columns[9];\n }\n }\n }\n return undefined;\n}\n\nfunction parseProcNetAddress(value: string): { port: number } | undefined {\n const [, portHex] = value.split(':');\n if (!portHex) return undefined;\n return { port: Number.parseInt(portHex, 16) };\n}\n\nasync function findProcessCmdlineForSocketInode({\n inode,\n}: {\n inode: string;\n}): Promise<string[] | undefined> {\n const procEntries = await readdir('/proc', { withFileTypes: true }).catch(\n () => [],\n );\n for (const entry of procEntries) {\n if (!entry.isDirectory() || !/^\\d+$/.test(entry.name)) continue;\n const fdDir = `/proc/${entry.name}/fd`;\n const fds = await readdir(fdDir).catch(() => []);\n for (const fd of fds) {\n const target = await readlink(`${fdDir}/${fd}`).catch(() => undefined);\n if (target !== `socket:[${inode}]`) continue;\n const cmdline = await readFile(`/proc/${entry.name}/cmdline`, 'utf8')\n .then(value => value.split('\\0').filter(Boolean))\n .catch(() => undefined);\n if (cmdline) return cmdline;\n }\n }\n return undefined;\n}\n"],"mappings":"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","names":["bridgeStateDir","path","procEnv","bootstrapDir","asRecord","procEnv","serialiseError","decision","path","args"]}
|
|
1
|
+
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../src/bridge/index.ts","../../src/bridge/opencode-events.ts","../../src/bridge/opencode-path.ts","../../src/bridge/opencode-usage.ts","../../src/bridge/tool-relay-auth.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, single-flight connection\n// replacement, the in-memory event log + monotonic `seq`, resume replay, and\n// the lifecycle/meta files. The adapter supplies only `onStart` (drive its\n// CLI/SDK and translate to wire events) and `onDetach` (its resume payload).\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return { message: String(err) };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n toolCallId: string,\n ): Promise<{ output: unknown; isError?: boolean }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n /**\n * Live queue of mid-turn user messages. The runtime pushes inbound\n * `user-message` text here; the adapter drains it as its runtime accepts\n * interactive input.\n */\n readonly pendingUserMessages: string[];\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /** Drive one prompt turn. Rejections surface to the host as an `error` event. */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /** Produce the adapter-defined resume payload for a `detach`. Defaults to `{}`. */\n onDetach?(): unknown | Promise<unknown>;\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 a `shutdown` / `detach`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; text: string }\n | { type: 'abort' }\n | { type: 'shutdown' }\n | { type: 'detach' }\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 * `shutdown` / `detach` 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, onDetach } = options;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: string[] | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the just-interrupted turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n (output: { output: unknown; isError?: boolean }) => void\n >();\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const sendControl = (msg: Record<string, unknown>): void => {\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(JSON.stringify(msg));\n } catch {\n // best-effort\n }\n }\n };\n\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (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 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 const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const turn: BridgeTurn = {\n emit,\n requestToolResult: toolCallId =>\n new Promise(resolve => {\n pendingToolResults.set(toolCallId, resolve);\n }),\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n pendingUserMessages: [],\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n };\n currentUserMessages = turn.pendingUserMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emit({ type: 'error', error: serialiseError(err) });\n } finally {\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n return;\n }\n case 'tool-result': {\n const resolver = pendingToolResults.get(msg.toolCallId);\n if (resolver) {\n pendingToolResults.delete(msg.toolCallId);\n resolver({ output: msg.output, isError: msg.isError });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message':\n currentUserMessages?.push(msg.text);\n return;\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n replay(ws, msg.lastSeenEventId);\n return;\n case 'shutdown':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n drainThenExit(ws, 1000, 'shutdown');\n return;\n case 'detach': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onDetach?.()) ?? {};\n sendControl({ type: 'bridge-detach', data });\n drainThenExit(ws, 1000, 'detach');\n return;\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean shutdown/detach leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Single-flight: a fresh authorized connection *replaces* the active one\n // (the host reconnecting after a drop). The previous socket's close is a\n // no-op below because it is no longer `activeSocket`.\n activeSocket = ws;\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl({\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl({\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the *current* socket's close matters. A stale socket (already\n // replaced by a reconnect) closing is a no-op. Crucially we do NOT abort\n // the in-flight turn — it keeps running and its events accumulate in the\n // log for replay when the host reconnects.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\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 emit({ type: 'error', error: serialiseError(err) });\n });\n process.on('unhandledRejection', err => {\n emit({ type: 'error', error: serialiseError(err) });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","import {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport { mkdirSync } from 'node:fs';\nimport { createServer, type Server } from 'node:http';\nimport path from 'node:path';\nimport { argv, env as procEnv } from 'node:process';\nimport type { StartMessage } from '../opencode-bridge-protocol';\n\nimport {\n createOpencodeClient,\n createOpencodeServer,\n} from '@opencode-ai/sdk/v2';\nimport {\n emitMissingFinalDelta,\n getOpenCodeEventSessionId,\n isStepSettlementEvent,\n type OpenCodeEvent,\n unwrapOpenCodeEvent,\n} from './opencode-events';\nimport { prependOpenCodeBinToPath } from './opencode-path';\nimport {\n addUsage,\n defaultUsage,\n extractSessionTokens,\n mapUsage,\n subtractSessionTokens,\n type HarnessUsage,\n type OpenCodeTokenUsage,\n} from './opencode-usage';\nimport {\n ToolRelayAuthorizer,\n isToolRelayRequestFromAllowedProcess,\n type ToolRelayCall,\n} from './tool-relay-auth';\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\ntype OpenCodeClient = ReturnType<typeof createOpencodeClient>;\ntype OpenCodeServer = Awaited<ReturnType<typeof createOpencodeServer>>;\ntype ToolRelay = {\n port: number;\n close(): void;\n authorizeToolCall(call: ToolRelayCall): void;\n};\n\ntype RuntimeState = {\n server?: OpenCodeServer;\n client?: OpenCodeClient;\n sessionId?: string;\n relay?: ToolRelay;\n toolNames: Set<string>;\n};\n\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep';\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};\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 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 = { toolNames: new Set() };\nprependOpenCodeBinToPath({ bootstrapDir, env: procEnv });\n\nmkdirSync(process.env.HOME ?? '/tmp/opencode-home', { recursive: true });\n\nawait runBridge<StartMessage>({\n bridgeType: 'opencode',\n bridgeStateDir,\n onStart: runTurn,\n onDetach: () =>\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 const sessionId = await ensureSession({ client, start, emit });\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 emit({ type: 'error', error: serialiseError(err) });\n } finally {\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: totalUsage ?? defaultUsage(),\n });\n }\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 (runtime.client) return;\n\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 allowedScriptPaths: [`${bootstrapDir}/host-tool-mcp.mjs`],\n tools: start.tools,\n emit,\n requestToolResult: turn.requestToolResult,\n });\n }\n\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 });\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 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 },\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 if (relayPort && start.tools && start.tools.length > 0) {\n config.mcp = {\n '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 }\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 ? { headers: { 'x-client-app': HARNESS_CLIENT_APP } }\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 ...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 },\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 ...parseOpenAIQueryParams(),\n },\n },\n };\n }\n\n return undefined;\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}: {\n client: OpenCodeClient;\n sessionId: string;\n start: StartMessage;\n}): Promise<{ error?: unknown; data?: unknown }> {\n return (client as any).session.prompt({\n sessionID: sessionId,\n ...(start.instructions ? { system: start.instructions } : {}),\n ...(start.variant ? { variant: start.variant } : {}),\n parts: [{ type: 'text', text: 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 return undefined;\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 legacyStatusMessage(event: OpenCodeEvent): string | undefined {\n const status = event.properties?.status;\n if (!status || typeof status !== 'object') return undefined;\n const message = (status as { message?: unknown }).message;\n return typeof message === 'string' ? message : undefined;\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<void>();\n let sawContent = false;\n let sawFinishStep = false;\n let sawBusy = false;\n let terminalError: string | undefined;\n const initialSessionTokens = await readSessionTokens({\n client,\n sessionId,\n }).catch(() => undefined);\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 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 onEvent: event => {\n if (event.type === 'session.updated') {\n latestSessionTokens =\n extractSessionTokens(event.properties) ?? latestSessionTokens;\n }\n if (isStepSettlementEvent(event)) {\n turnSettled.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 terminalError = legacyStatusMessage(event) ?? 'Session retry';\n turnSettled.resolve();\n return true;\n } else if (sawBusy && status === 'idle') {\n turnSettled.resolve();\n return true;\n }\n if (event.type === 'session.error') {\n terminalError = formatError(event.properties?.error ?? event);\n turnSettled.resolve();\n return true;\n }\n },\n }).finally(() => turnSettled.resolve());\n emit({\n type: 'stream-start',\n ...(start.model ? { modelId: start.model } : {}),\n });\n const prompted = await legacySessionPrompt({\n client,\n sessionId,\n start,\n });\n if (prompted.error) {\n eventsAbort.abort();\n throw new Error(`OpenCode prompt failed: ${formatError(prompted.error)}`);\n }\n await turnSettled.promise;\n eventsAbort.abort();\n await eventLoop.catch(() => {});\n if (terminalError) throw new Error(terminalError);\n if (!sawFinishStep) {\n const emittedFallback = await emitContextFallback({\n client,\n sessionId,\n emit,\n emitContent: !sawContent,\n }).catch(() => false);\n if (!emittedFallback) {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n harnessMetadata: { opencode: { fallback: true, missingContext: true } },\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 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 terminalError = legacyStatusMessage(event) ?? 'Session retry';\n compactionSettled.resolve();\n return true;\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 emit,\n signal,\n onEvent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n turn: BridgeTurn;\n emit: Emit;\n signal: AbortSignal;\n onEvent?: (event: OpenCodeEvent) => boolean | void;\n}): Promise<void> {\n const stream = await subscribeLegacyEvents({ client, signal });\n if (!stream) return;\n const state = createTranslationState();\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 || (eventSessionId && eventSessionId !== sessionId)) continue;\n await translateAndEmit({\n event,\n state,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n client,\n turn,\n emit,\n });\n if (onEvent?.(event)) break;\n }\n}\n\ntype TranslationState = {\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};\n\nfunction createTranslationState(): TranslationState {\n return {\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 };\n}\n\nasync function translateAndEmit({\n event,\n state,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n client,\n turn,\n emit,\n}: {\n event: OpenCodeEvent;\n state: TranslationState;\n sessionId: string;\n permissionMode: StartMessage['permissionMode'];\n builtinToolFiltering: StartMessage['builtinToolFiltering'];\n client: OpenCodeClient;\n turn: BridgeTurn;\n emit: Emit;\n}): Promise<void> {\n const type = event.type;\n const props = event.properties ?? {};\n\n if (type === 'message.updated') {\n const info = props.info;\n if (isRecord(info)) {\n const id = stringValue(info.id);\n const role = stringValue(info.role);\n if (id && role) state.messageRoles.set(id, role);\n }\n return;\n }\n\n if (type === 'message.part.delta') {\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 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 return;\n }\n\n if (type === 'message.part.updated') {\n if (emitLegacyTextPartUpdate({ part: props.part, state, emit })) return;\n emitLegacyToolPart({ part: props.part, state, emit });\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 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 state,\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 ...(props.provider?.metadata\n ? { providerMetadata: props.provider.metadata }\n : {}),\n });\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 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 });\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: mapFinishReason(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 emit({ type: 'error', error: formatError(props.error ?? event) });\n return;\n }\n if (type === 'permission.v2.asked') {\n await handlePermissionV2({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n return;\n }\n if (type === 'permission.asked') {\n await handlePermission({\n client,\n sessionId,\n permissionMode,\n builtinToolFiltering,\n turn,\n emit,\n event,\n });\n }\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\nfunction emitLegacyTextPartUpdate({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): boolean {\n if (!isRecord(part)) return false;\n if (part.type !== 'text' && part.type !== 'reasoning') return false;\n const id = stringValue(part.id);\n if (!id) return true;\n\n const messageID = stringValue(part.messageID);\n if (messageID && state.messageRoles.get(messageID) === 'user') return true;\n\n const isReasoning = part.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 part.text === 'string' ? part.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 (legacyPartEnded(part)) {\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 legacyPartEnded(part: Record<string, unknown>): boolean {\n return isRecord(part.time) && part.time.end != null;\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 emitLegacyToolPart({\n part,\n state,\n emit,\n}: {\n part: unknown;\n state: TranslationState;\n emit: Emit;\n}): void {\n if (!part || typeof part !== 'object') return;\n const toolPart = part as Record<string, any>;\n if (toolPart.type !== 'tool') return;\n const status = legacyToolPartStatus(toolPart);\n if (status !== 'running' && status !== 'completed' && status !== 'error') {\n return;\n }\n if (\n typeof toolPart.tool !== 'string' ||\n typeof toolPart.callID !== 'string'\n ) {\n return;\n }\n const callID = toolPart.callID;\n const rawToolName = toolPart.tool;\n const toolName = toWireToolName(rawToolName);\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: legacyToolPartInput(toolPart),\n state,\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 ...(toolPart.provider?.metadata\n ? { providerMetadata: toolPart.provider.metadata }\n : {}),\n });\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 });\n }\n}\n\nfunction legacyToolPartStatus(part: Record<string, any>): string | undefined {\n return typeof part.state === 'string'\n ? part.state\n : typeof part.state === 'object' && part.state !== null\n ? String(part.state.status ?? '')\n : undefined;\n}\n\nfunction legacyToolPartInput(\n part: Record<string, any>,\n): Record<string, unknown> {\n const state =\n typeof part.state === 'object' && part.state !== null\n ? (part.state as Record<string, any>)\n : undefined;\n return {\n ...(isRecord(part.metadata) ? part.metadata : {}),\n ...(isRecord(state?.metadata) ? state.metadata : {}),\n ...(isRecord(state?.input) ? state.input : {}),\n };\n}\n\nfunction legacyToolPartOutput(part: Record<string, any>): unknown {\n const state =\n typeof part.state === 'object' && part.state !== null\n ? (part.state as Record<string, any>)\n : undefined;\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 isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction parseToolInput(\n state: TranslationState,\n props: Record<string, any>,\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\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:\n typeof props.source === 'object' &&\n props.source !== null &&\n 'callID' in props.source\n ? String((props.source as { callID?: unknown }).callID)\n : 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 reply = await selectPermissionReply({\n action: String(props.permission ?? ''),\n resources: Array.isArray(props.patterns) ? props.patterns.map(String) : [],\n requestID,\n toolCallId:\n typeof props.tool === 'object' &&\n props.tool !== null &&\n 'callID' in props.tool\n ? String((props.tool as { callID?: unknown }).callID)\n : 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 (resources.some(resource => isExternalPath(resource))) {\n return { reply: 'reject', message: 'External directory access rejected.' };\n }\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 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 const normalized = path.resolve(resource);\n return (\n !isPathInsideOrEqual(normalized, workdir) &&\n (!skillsDir || !isPathInsideOrEqual(normalized, skillsDir))\n );\n}\n\nfunction isPathInsideOrEqual(file: string, root: string): boolean {\n const normalizedRoot = path.resolve(root);\n return file === normalizedRoot || file.startsWith(`${normalizedRoot}/`);\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 return undefined;\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 emit,\n emitContent,\n}: {\n client: OpenCodeClient;\n sessionId: string;\n emit: Emit;\n emitContent: boolean;\n}): Promise<boolean> {\n const assistant = await latestAssistantSnapshot({ client, sessionId });\n if (!assistant) return false;\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: mapFinishReason(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 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 return undefined;\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 return undefined;\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\nfunction mapFinishReason(\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\nasync function startToolRelay({\n allowedScriptPaths,\n tools,\n emit,\n requestToolResult,\n}: {\n allowedScriptPaths: ReadonlyArray<string>;\n tools: ReadonlyArray<{ name: string }>;\n emit: Emit;\n requestToolResult: (\n toolCallId: string,\n ) => Promise<{ output: unknown; isError?: boolean }>;\n}): Promise<ToolRelay> {\n const toolNames = new Set(tools.map(t => t.name));\n const allowedScriptPathSet = new Set(allowedScriptPaths);\n const authorizer = new ToolRelayAuthorizer();\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 const authorized =\n authorizer.consumeToolCall({ toolName, input }) ||\n (await isToolRelayRequestFromAllowedProcess({\n socket: req.socket,\n allowedScriptPaths: allowedScriptPathSet,\n }));\n if (!authorized) {\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: () => closeServer(server),\n authorizeToolCall: call => authorizer.authorizeToolCall(call),\n };\n}\n\nfunction closeServer(server: Server): void {\n try {\n server.close();\n } catch {}\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 if (isRecord(assistant.metadata)) {\n return modelRefFromValue(assistant.metadata.assistant);\n }\n return undefined;\n}\n\nfunction modelRefFromSessionInfo(data: unknown): OpenCodeModelRef | undefined {\n if (!isRecord(data)) return undefined;\n return modelRefFromValue(data.model) ?? modelRefFromValue(data);\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 if (!isRecord(value)) return 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 stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\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) return error.message;\n if (typeof error === 'string') return error;\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\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\nfunction emitFatal(message: string): never {\n process.stderr.write(`[opencode bridge] ${message}\\n`);\n process.exit(1);\n}\n","export type OpenCodeEvent = {\n id?: string;\n type?: string;\n properties?: Record<string, any>;\n};\n\nexport function unwrapOpenCodeEvent(\n rawEvent: unknown,\n): OpenCodeEvent | undefined {\n if (!rawEvent || typeof rawEvent !== 'object') return undefined;\n const raw = rawEvent as Record<string, any>;\n if (raw.type === 'sync' && raw.syncEvent) {\n const sync = raw.syncEvent as Record<string, any>;\n return {\n id: String(sync.id ?? raw.id ?? ''),\n type: stripSyncVersion(String(sync.type ?? '')),\n properties: asRecord(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: asRecord(raw.properties) ?? asRecord(raw.data) ?? {},\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 part = props.part;\n if (\n part &&\n typeof part === 'object' &&\n !Array.isArray(part) &&\n typeof (part as { sessionID?: unknown }).sessionID === 'string'\n ) {\n return (part as { sessionID: string }).sessionID;\n }\n return undefined;\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\nfunction stripSyncVersion(type: string): string {\n return type.replace(/\\.\\d+$/, '');\n}\n\nfunction asRecord(value: unknown): Record<string, any> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n return value as Record<string, any>;\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","export 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 = Record<string, unknown>;\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 = asRecord(value);\n if (!record) return undefined;\n const tokens =\n extractOpenCodeTokens(record.tokens) ??\n extractOpenCodeTokens(asRecord(record.info)?.tokens) ??\n extractOpenCodeTokens(asRecord(record.data)?.tokens) ??\n extractOpenCodeTokens(asRecord(asRecord(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 = asRecord(value);\n const cache = asRecord(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 asRecord(value) ?? {};\n}\n\nfunction asRecord(value: unknown): Record<string, any> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n return undefined;\n return value as Record<string, any>;\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","import { readdir, readFile, readlink } from 'node:fs/promises';\nimport type { Socket } from 'node:net';\n\nexport 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\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 this.authorizations.push({\n key: toolRelayCallKey(call),\n expiresAt: this.now() + this.ttlMs,\n });\n }\n\n consumeToolCall(call: ToolRelayCall): boolean {\n this.pruneExpired();\n const key = toolRelayCallKey(call);\n const index = this.authorizations.findIndex(auth => auth.key === key);\n if (index === -1) return false;\n this.authorizations.splice(index, 1);\n return true;\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 }\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\nexport async function isToolRelayRequestFromAllowedProcess({\n socket,\n allowedScriptPaths,\n}: {\n socket: Socket;\n allowedScriptPaths: ReadonlySet<string>;\n}): Promise<boolean> {\n if (process.platform !== 'linux') return false;\n if (!socket.remotePort || !socket.localPort) return false;\n\n const inode = await findTcpSocketInode({\n clientPort: socket.remotePort,\n serverPort: socket.localPort,\n });\n if (!inode) return false;\n\n const cmdline = await findProcessCmdlineForSocketInode({ inode });\n return cmdline?.some(arg => allowedScriptPaths.has(arg)) ?? false;\n}\n\nasync function findTcpSocketInode({\n clientPort,\n serverPort,\n}: {\n clientPort: number;\n serverPort: number;\n}): Promise<string | undefined> {\n for (const tablePath of ['/proc/net/tcp', '/proc/net/tcp6']) {\n const table = await readFile(tablePath, 'utf8').catch(() => undefined);\n if (!table) continue;\n for (const line of table.split('\\n').slice(1)) {\n const columns = line.trim().split(/\\s+/);\n if (columns.length < 10) continue;\n const local = parseProcNetAddress(columns[1]);\n const remote = parseProcNetAddress(columns[2]);\n if (\n local?.port === clientPort &&\n remote?.port === serverPort &&\n columns[9] !== '0'\n ) {\n return columns[9];\n }\n }\n }\n return undefined;\n}\n\nfunction parseProcNetAddress(value: string): { port: number } | undefined {\n const [, portHex] = value.split(':');\n if (!portHex) return undefined;\n return { port: Number.parseInt(portHex, 16) };\n}\n\nasync function findProcessCmdlineForSocketInode({\n inode,\n}: {\n inode: string;\n}): Promise<string[] | undefined> {\n const procEntries = await readdir('/proc', { withFileTypes: true }).catch(\n () => [],\n );\n for (const entry of procEntries) {\n if (!entry.isDirectory() || !/^\\d+$/.test(entry.name)) continue;\n const fdDir = `/proc/${entry.name}/fd`;\n const fds = await readdir(fdDir).catch(() => []);\n for (const fd of fds) {\n const target = await readlink(`${fdDir}/${fd}`).catch(() => undefined);\n if (target !== `socket:[${inode}]`) continue;\n const cmdline = await readFile(`/proc/${entry.name}/cmdline`, 'utf8')\n .then(value => value.split('\\0').filter(Boolean))\n .catch(() => undefined);\n if (cmdline) return cmdline;\n }\n }\n return undefined;\n}\n"],"mappings":"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","names":["bridgeStateDir","path","procEnv","bootstrapDir","asRecord","procEnv","serialiseError","decision","path","args"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -104,6 +104,8 @@ declare const OPENCODE_BUILTIN_TOOLS: {
|
|
|
104
104
|
};
|
|
105
105
|
declare function createOpenCode(settings?: OpenCodeHarnessSettings): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS>;
|
|
106
106
|
|
|
107
|
+
declare const VERSION: string;
|
|
108
|
+
|
|
107
109
|
/**
|
|
108
110
|
* Default `openCode` harness instance with no overrides. Equivalent to
|
|
109
111
|
* `createOpenCode()`.
|
|
@@ -172,4 +174,4 @@ declare const openCode: _ai_sdk_harness.HarnessV1<{
|
|
|
172
174
|
}, any, any>;
|
|
173
175
|
}>;
|
|
174
176
|
|
|
175
|
-
export { type OpenCodeAuthOptions, type OpenCodeHarnessSettings, createOpenCode, openCode };
|
|
177
|
+
export { type OpenCodeAuthOptions, type OpenCodeHarnessSettings, VERSION, createOpenCode, openCode };
|
package/dist/index.js
CHANGED
|
@@ -163,7 +163,11 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
|
|
|
163
163
|
...harnessV1BridgeInboundCommandSchemas
|
|
164
164
|
]);
|
|
165
165
|
|
|
166
|
+
// src/version.ts
|
|
167
|
+
var VERSION = true ? "1.0.21" : "0.0.0-test";
|
|
168
|
+
|
|
166
169
|
// src/opencode-harness.ts
|
|
170
|
+
var OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;
|
|
167
171
|
var optionalStringRecord = z2.record(z2.string(), z2.unknown()).optional();
|
|
168
172
|
var OPENCODE_BUILTIN_TOOLS = {
|
|
169
173
|
read: commonTool("read", {
|
|
@@ -404,6 +408,7 @@ function createOpenCode(settings = {}) {
|
|
|
404
408
|
model: settings.model,
|
|
405
409
|
provider: settings.provider
|
|
406
410
|
}),
|
|
411
|
+
AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,
|
|
407
412
|
BRIDGE_CHANNEL_TOKEN: token,
|
|
408
413
|
BRIDGE_WS_PORT: String(port),
|
|
409
414
|
HOME: sandboxHomeDir,
|
|
@@ -987,6 +992,7 @@ function extractUserText(prompt) {
|
|
|
987
992
|
// src/index.ts
|
|
988
993
|
var openCode = createOpenCode();
|
|
989
994
|
export {
|
|
995
|
+
VERSION,
|
|
990
996
|
createOpenCode,
|
|
991
997
|
openCode
|
|
992
998
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1Bootstrap,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n classifyDiskLog,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n readonly startupTimeoutMs?: number;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst BOOTSTRAP_DIR = '/tmp/harness/opencode';\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: BOOTSTRAP_DIR,\n files: [\n { path: `${BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n { path: `${BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n { command: `mkdir -p ${BOOTSTRAP_DIR}` },\n {\n command: `pnpm --dir ${BOOTSTRAP_DIR} install --frozen-lockfile --store-dir ${BOOTSTRAP_DIR}/.pnpm-store`,\n },\n {\n command: `cd ${BOOTSTRAP_DIR} && node node_modules/opencode-ai/postinstall.mjs && ./node_modules/.bin/opencode --version`,\n },\n ],\n };\n return cachedBootstrap;\n },\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const session = sandboxSession.restricted();\n const sandboxId = sandboxSession.id;\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${sandboxSession.defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n\n if (coords) {\n try {\n const attachUrl =\n (await sandboxSession.getPortUrl({\n port: coords.port,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(coords.token)}`;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () => openWebSocket(attachUrl),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n session.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort(sandboxSession, settings.port);\n const token = randomBytes(32).toString('hex');\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: session,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const env = {\n ...resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n }),\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await session.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await session.spawn({\n command: `node ${BOOTSTRAP_DIR}/bridge.mjs --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(BOOTSTRAP_DIR)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: () =>\n new Error('opencode bridge did not become ready in time.'),\n createExitError: () =>\n new Error('opencode bridge exited before becoming ready.'),\n });\n void drainRest(proc.stdout);\n void forwardBridgeStderr(proc.stderr);\n\n const wsUrl =\n (await sandboxSession.getPortUrl({\n port: boundPort,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(token)}`;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () => openWebSocket(wsUrl),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n });\n },\n };\n}\n\nfunction resolveBridgePort(\n sandboxSession: HarnessV1NetworkSandboxSession,\n override: number | undefined,\n): number {\n if (override !== undefined) return override;\n if (sandboxSession.ports.length > 0) return sandboxSession.ports[0];\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The opencode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nasync function forwardBridgeStderr(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n if (value) {\n const trimmed = value.endsWith('\\n') ? value.slice(0, -1) : value;\n if (trimmed.length > 0) {\n console.log(`[bridge stderr] ${trimmed}`);\n }\n }\n }\n } catch {}\n}\n\nasync function drainRest(stream: ReadableStream<Uint8Array>): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } catch {}\n}\n\nfunction openWebSocket(url: string): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url);\n const onOpen = () => {\n ws.off('error', onError);\n resolve(ws);\n };\n const onError = (err: Error) => {\n ws.off('open', onOpen);\n reject(err);\n };\n ws.once('open', onOpen);\n ws.once('error', onError);\n });\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let instructionsApplied = isResume;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('opencode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n submitUserMessage: async text => {\n channel.send({ type: 'user-message', text });\n },\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n const applyInstructions =\n !instructionsApplied && !!promptOpts.instructions;\n instructionsApplied = true;\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(applyInstructions ? { instructions: promptOpts.instructions } : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'shutdown' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `opencode session ${sessionId} did not reply to detach within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-detach', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'detach' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The opencode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { getAiGatewayAuthFromEnv } from '@ai-sdk/harness/utils';\n\nexport type OpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (auth?.openaiCompatible) {\n return pickOpenAICompatible(auth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (auth?.openai) {\n return pickOpenAI({ explicit: auth.openai, processEnv });\n }\n } else if (auth?.anthropic) {\n return pickAnthropic({ explicit: auth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (auth?.gateway) {\n return pickGateway({ explicit: auth.gateway, gatewayAuthFromEnv });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<OpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<OpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<OpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<OpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n env.AI_GATEWAY_BASE_URL = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type { OpenCodeAuthOptions } from './opencode-auth';\n"],"mappings":"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","names":["z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1Bootstrap,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n classifyDiskLog,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\nimport { VERSION } from './version';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n readonly startupTimeoutMs?: number;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst BOOTSTRAP_DIR = '/tmp/harness/opencode';\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: BOOTSTRAP_DIR,\n files: [\n { path: `${BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n { path: `${BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n { command: `mkdir -p ${BOOTSTRAP_DIR}` },\n {\n command: `pnpm --dir ${BOOTSTRAP_DIR} install --frozen-lockfile --store-dir ${BOOTSTRAP_DIR}/.pnpm-store`,\n },\n {\n command: `cd ${BOOTSTRAP_DIR} && node node_modules/opencode-ai/postinstall.mjs && ./node_modules/.bin/opencode --version`,\n },\n ],\n };\n return cachedBootstrap;\n },\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const session = sandboxSession.restricted();\n const sandboxId = sandboxSession.id;\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${sandboxSession.defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n\n if (coords) {\n try {\n const attachUrl =\n (await sandboxSession.getPortUrl({\n port: coords.port,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(coords.token)}`;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () => openWebSocket(attachUrl),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n session.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort(sandboxSession, settings.port);\n const token = randomBytes(32).toString('hex');\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: session,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const env = {\n ...resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n }),\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await session.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await session.spawn({\n command: `node ${BOOTSTRAP_DIR}/bridge.mjs --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(BOOTSTRAP_DIR)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: session,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: () =>\n new Error('opencode bridge did not become ready in time.'),\n createExitError: () =>\n new Error('opencode bridge exited before becoming ready.'),\n });\n void drainRest(proc.stdout);\n void forwardBridgeStderr(proc.stderr);\n\n const wsUrl =\n (await sandboxSession.getPortUrl({\n port: boundPort,\n protocol: 'ws',\n })) + `?agent_bridge_token=${encodeURIComponent(token)}`;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () => openWebSocket(wsUrl),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n });\n },\n };\n}\n\nfunction resolveBridgePort(\n sandboxSession: HarnessV1NetworkSandboxSession,\n override: number | undefined,\n): number {\n if (override !== undefined) return override;\n if (sandboxSession.ports.length > 0) return sandboxSession.ports[0];\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The opencode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nasync function forwardBridgeStderr(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n if (value) {\n const trimmed = value.endsWith('\\n') ? value.slice(0, -1) : value;\n if (trimmed.length > 0) {\n console.log(`[bridge stderr] ${trimmed}`);\n }\n }\n }\n } catch {}\n}\n\nasync function drainRest(stream: ReadableStream<Uint8Array>): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } catch {}\n}\n\nfunction openWebSocket(url: string): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url);\n const onOpen = () => {\n ws.off('error', onError);\n resolve(ws);\n };\n const onError = (err: Error) => {\n ws.off('open', onOpen);\n reject(err);\n };\n ws.once('open', onOpen);\n ws.once('error', onError);\n });\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let instructionsApplied = isResume;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('opencode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n submitUserMessage: async text => {\n channel.send({ type: 'user-message', text });\n },\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n const applyInstructions =\n !instructionsApplied && !!promptOpts.instructions;\n instructionsApplied = true;\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(applyInstructions ? { instructions: promptOpts.instructions } : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'shutdown' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `opencode session ${sessionId} did not reply to detach within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-detach', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'detach' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `opencode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n sandboxId,\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The opencode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { getAiGatewayAuthFromEnv } from '@ai-sdk/harness/utils';\n\nexport type OpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (auth?.openaiCompatible) {\n return pickOpenAICompatible(auth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (auth?.openai) {\n return pickOpenAI({ explicit: auth.openai, processEnv });\n }\n } else if (auth?.anthropic) {\n return pickAnthropic({ explicit: auth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (auth?.gateway) {\n return pickGateway({ explicit: auth.gateway, gatewayAuthFromEnv });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<OpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<OpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<OpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<OpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n env.AI_GATEWAY_BASE_URL = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport { VERSION } from './version';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type { OpenCodeAuthOptions } from './opencode-auth';\n"],"mappings":"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","names":["z","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-opencode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"ws": "8.21.0",
|
|
30
|
-
"@ai-sdk/harness": "1.0.
|
|
31
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
30
|
+
"@ai-sdk/harness": "1.0.21",
|
|
31
|
+
"@ai-sdk/provider-utils": "5.0.6"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"zod": "^3.25.76 || ^4.1.8"
|
package/src/bridge/index.ts
CHANGED
|
@@ -109,6 +109,7 @@ const TOOL_KIND: Readonly<Record<string, 'readonly' | 'edit' | 'bash'>> = {
|
|
|
109
109
|
skill: 'edit',
|
|
110
110
|
todowrite: 'edit',
|
|
111
111
|
};
|
|
112
|
+
const HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;
|
|
112
113
|
|
|
113
114
|
const args = parseArgs(argv.slice(2));
|
|
114
115
|
const workdir = args.workdir ?? emitFatal('Missing --workdir argument.');
|
|
@@ -265,6 +266,9 @@ function buildProviderConfig(
|
|
|
265
266
|
options: {
|
|
266
267
|
apiKey: procEnv.AI_GATEWAY_API_KEY,
|
|
267
268
|
baseURL: toOpenCodeGatewayBaseUrl(procEnv.AI_GATEWAY_BASE_URL),
|
|
269
|
+
...(HARNESS_CLIENT_APP
|
|
270
|
+
? { headers: { 'x-client-app': HARNESS_CLIENT_APP } }
|
|
271
|
+
: {}),
|
|
268
272
|
},
|
|
269
273
|
...(modelID
|
|
270
274
|
? {
|
package/src/index.ts
CHANGED
|
@@ -7,5 +7,6 @@ import { createOpenCode } from './opencode-harness';
|
|
|
7
7
|
export const openCode = createOpenCode();
|
|
8
8
|
|
|
9
9
|
export { createOpenCode } from './opencode-harness';
|
|
10
|
+
export { VERSION } from './version';
|
|
10
11
|
export type { OpenCodeHarnessSettings } from './opencode-harness';
|
|
11
12
|
export type { OpenCodeAuthOptions } from './opencode-auth';
|
package/src/opencode-harness.ts
CHANGED
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
type InboundMessage,
|
|
48
48
|
type OutboundMessage,
|
|
49
49
|
} from './opencode-bridge-protocol';
|
|
50
|
+
import { VERSION } from './version';
|
|
50
51
|
|
|
51
52
|
type OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;
|
|
52
53
|
type OpenCodeRespawnStrategy = 'replay' | 'rerun';
|
|
@@ -55,6 +56,11 @@ type WriteSkillsResult = {
|
|
|
55
56
|
readonly skillsDir: string;
|
|
56
57
|
};
|
|
57
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Value to use in User-Agent and `x-client-app` headers.
|
|
61
|
+
*/
|
|
62
|
+
const OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;
|
|
63
|
+
|
|
58
64
|
export type OpenCodeHarnessSettings = {
|
|
59
65
|
readonly auth?: OpenCodeAuthOptions;
|
|
60
66
|
readonly model?: string;
|
|
@@ -344,6 +350,7 @@ export function createOpenCode(
|
|
|
344
350
|
model: settings.model,
|
|
345
351
|
provider: settings.provider,
|
|
346
352
|
}),
|
|
353
|
+
AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,
|
|
347
354
|
BRIDGE_CHANNEL_TOKEN: token,
|
|
348
355
|
BRIDGE_WS_PORT: String(port),
|
|
349
356
|
HOME: sandboxHomeDir,
|