@ai-sdk/harness-codex 1.0.129 → 1.0.131
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 +17 -0
- package/dist/bridge/index.mjs +8 -3
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
- package/src/bridge/create-emit-stream-event.ts +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @ai-sdk/harness-codex
|
|
2
2
|
|
|
3
|
+
## 1.0.131
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 76772ff: fix(harness-codex): preserve MCP server identity in emitted tool names
|
|
8
|
+
- Updated dependencies [e3605f6]
|
|
9
|
+
- Updated dependencies [e5aeb11]
|
|
10
|
+
- Updated dependencies [d99d6dc]
|
|
11
|
+
- @ai-sdk/provider-utils@5.0.50
|
|
12
|
+
- @ai-sdk/harness@1.0.129
|
|
13
|
+
|
|
14
|
+
## 1.0.130
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- @ai-sdk/harness@1.0.128
|
|
19
|
+
|
|
3
20
|
## 1.0.129
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/bridge/index.mjs
CHANGED
|
@@ -1912,6 +1912,10 @@ var NATIVE_TO_COMMON = {
|
|
|
1912
1912
|
function toCommonName(nativeName) {
|
|
1913
1913
|
return NATIVE_TO_COMMON[nativeName] ?? nativeName;
|
|
1914
1914
|
}
|
|
1915
|
+
function getMcpToolName(item) {
|
|
1916
|
+
const toolName = item.tool ?? "unknown";
|
|
1917
|
+
return item.server != null && item.server.length > 0 ? `mcp__${item.server}__${toolName}` : toolName;
|
|
1918
|
+
}
|
|
1915
1919
|
function createEmitStreamEvent({
|
|
1916
1920
|
send,
|
|
1917
1921
|
stepTracker,
|
|
@@ -2031,12 +2035,13 @@ function createEmitStreamEvent({
|
|
|
2031
2035
|
return;
|
|
2032
2036
|
}
|
|
2033
2037
|
if (item.type === "mcp_tool_call") {
|
|
2038
|
+
const toolName = getMcpToolName(item);
|
|
2034
2039
|
if (event.type === "item.started") {
|
|
2035
2040
|
send({
|
|
2036
2041
|
type: "tool-call",
|
|
2037
2042
|
toolCallId: id,
|
|
2038
|
-
toolName
|
|
2039
|
-
nativeName:
|
|
2043
|
+
toolName,
|
|
2044
|
+
nativeName: toolName,
|
|
2040
2045
|
input: JSON.stringify(item.arguments ?? {}),
|
|
2041
2046
|
providerExecuted: true,
|
|
2042
2047
|
dynamic: true
|
|
@@ -2045,7 +2050,7 @@ function createEmitStreamEvent({
|
|
|
2045
2050
|
send({
|
|
2046
2051
|
type: "tool-result",
|
|
2047
2052
|
toolCallId: id,
|
|
2048
|
-
toolName
|
|
2053
|
+
toolName,
|
|
2049
2054
|
result: extractMcpToolCallResult(item),
|
|
2050
2055
|
dynamic: true
|
|
2051
2056
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/bridge/codex-app-server-driver.ts","../../src/bridge/codex-tool-filtering.ts","../../src/bridge/codex-app-server-client.ts","../../src/bridge/create-app-server-event-handler.ts","../../src/bridge/codex-tool-filtering-hook.ts","../../src/bridge/codex-step-tracker.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/index.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, the in-memory event log +\n// monotonic `seq`, resume replay, and the lifecycle/meta files. Any number of\n// hosts may be connected; exactly one of them owns the event stream, and\n// `start`/`resume` transfer that ownership. The adapter supplies only `onStart`\n// (drive its CLI/SDK and translate to wire events) and lifecycle cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport type { ToolResultPart } from '@ai-sdk/provider-utils';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport { HarnessBridgeCapabilityUnsupportedError } from './harness-bridge-capability-unsupported-error';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface Experimental_BridgeUserMessage {\n readonly messageId: string;\n readonly text: string;\n accept(): void;\n reject(error: unknown): void;\n}\n\nexport interface Experimental_BridgeUserMessageQueue extends AsyncIterable<Experimental_BridgeUserMessage> {\n readonly pendingCount: number;\n close(error?: unknown): void;\n}\n\ntype InternalBridgeUserMessageQueue = Experimental_BridgeUserMessageQueue & {\n enqueue(input: { messageId: string; text: string }): void;\n};\n\ntype BridgeUserMessageResponse = {\n type: 'user-message-response';\n messageId: string;\n accepted: boolean;\n error?: { message: string };\n};\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n if (typeof err === 'string') {\n return { message: err };\n }\n if (err !== null && typeof err === 'object') {\n try {\n return { message: JSON.stringify(err) };\n } catch {}\n }\n return { message: String(err) };\n}\n\nfunction createBridgeUserMessageQueue(options: {\n respond(response: BridgeUserMessageResponse): void;\n}): InternalBridgeUserMessageQueue {\n const messages: Experimental_BridgeUserMessage[] = [];\n const waiters: Array<\n (result: IteratorResult<Experimental_BridgeUserMessage>) => void\n > = [];\n const entries = new Map<\n string,\n {\n response?: BridgeUserMessageResponse;\n reject(error: unknown): void;\n }\n >();\n let closed = false;\n let pendingCount = 0;\n\n const enqueue = (input: { messageId: string; text: string }): void => {\n const existing = entries.get(input.messageId);\n if (existing != null) {\n if (existing.response != null) {\n options.respond(existing.response);\n }\n return;\n }\n\n let settled = false;\n const settle = (response: BridgeUserMessageResponse): void => {\n if (settled) return;\n settled = true;\n pendingCount--;\n const entry = entries.get(input.messageId);\n if (entry != null) entry.response = response;\n options.respond(response);\n };\n const message: Experimental_BridgeUserMessage = {\n messageId: input.messageId,\n text: input.text,\n accept: () => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: true,\n });\n },\n reject: error => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: false,\n error: { message: formatBridgeError(error).message },\n });\n },\n };\n entries.set(input.messageId, {\n reject: message.reject,\n });\n pendingCount++;\n\n if (closed) {\n message.reject(\n new Error('The bridge turn is no longer accepting user messages.'),\n );\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter != null) {\n waiter({ done: false, value: message });\n } else {\n messages.push(message);\n }\n };\n\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n const reason =\n error ??\n new Error('The bridge turn ended before accepting the user message.');\n for (const entry of entries.values()) {\n if (entry.response == null) entry.reject(reason);\n }\n messages.length = 0;\n while (waiters.length > 0) {\n waiters.shift()!({ done: true, value: undefined });\n }\n };\n\n return {\n get pendingCount() {\n return pendingCount;\n },\n enqueue,\n close,\n [Symbol.asyncIterator]() {\n return {\n next: () => {\n const message = messages.shift();\n if (message != null) {\n return Promise.resolve({ done: false as const, value: message });\n }\n if (closed) {\n return Promise.resolve({\n done: true as const,\n value: undefined,\n });\n }\n return new Promise<IteratorResult<Experimental_BridgeUserMessage>>(\n resolve => {\n waiters.push(resolve);\n },\n );\n },\n };\n },\n };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n input:\n | string\n | {\n toolCallId: string;\n matches?: (result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n },\n ): Promise<{\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n readonly experimental_userMessages: Experimental_BridgeUserMessageQueue;\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n\n /**\n * Emit a non-fatal bridge warning to stderr using the runtime's harness\n * prefix. This is diagnostic-only: it does not emit a stream event, does not\n * consume a `seq`, and does not fail the turn.\n */\n emitWarning(input: { message: string }): void;\n\n emitError(input: { error: unknown; message?: string }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /**\n * Drive one prompt turn. Rejections surface to the host as an `error`\n * event.\n *\n * Contract: once `turn.abortSignal` fires, wind down promptly — turns are\n * serialized, and a replacement `start` waits up to\n * {@link turnTeardownGraceMs} for this promise to settle before it\n * proceeds anyway.\n */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /**\n * How long a replacement `start` waits for the previous turn's teardown\n * after aborting it, in milliseconds. Turns are serialized so an aborted\n * turn cannot emit into its replacement's event log or overlap its runtime\n * process — but only within this bound: an adapter that does not settle\n * `onStart` after its abort signal fires forfeits the protection for that\n * boundary, and the new turn proceeds anyway rather than blocking forever.\n * The default of ten seconds exceeds the Claude bridge's five-second\n * hard-abort fallback.\n */\n turnTeardownGraceMs?: number;\n /**\n * Produce the adapter-defined runtime resume data for `stop`. Defaults to\n * `{}`.\n */\n onStop?(): unknown | Promise<unknown>;\n /**\n * Perform adapter-defined destruction before the bridge exits.\n */\n onDestroy?(): void | Promise<void>;\n /** WS port. Defaults to `BRIDGE_WS_PORT` env (0 = OS-assigned). */\n port?: number;\n /** Auth token. Defaults to `BRIDGE_CHANNEL_TOKEN` env. */\n token?: string;\n /** Called with the bound port once the server is listening. */\n onListening?(port: number): void;\n /**\n * Tear the process down after `stop` / `destroy`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; messageId?: string; text: string }\n | { type: 'abort' }\n | { type: 'stop' }\n | { type: 'destroy' }\n | { type: 'resume'; lastSeenEventId: number };\n\nconst WS_OPEN = 1;\n\n/**\n * Boot the bridge: bind the WebSocket server, announce `bridge-ready`, and\n * service host connections for the lifetime of the process. Resolves once the\n * server is listening; the process then stays alive on the server until a\n * `stop` / `destroy` exits it.\n */\nexport interface BridgeHandle {\n /** The port the WebSocket server bound to. */\n readonly port: number;\n /** Close the WebSocket server. Does not call `process.exit`. */\n close(): Promise<void>;\n}\n\nexport async function runBridge<TStart extends { type: 'start' }>(\n options: RunBridgeOptions<TStart>,\n): Promise<BridgeHandle> {\n const { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n const teardownGraceMs = options.turnTeardownGraceMs ?? 10_000;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n /*\n * The one connection turn events stream to. A socket claims it by asking for\n * work — `start` (a turn) or `resume` (a catch-up) — never by connecting:\n * every event goes here alone, so claiming on connect would silence a turn\n * already streaming to someone else. Any number of sockets may be connected;\n * the others still exchange control frames, they just get no events.\n */\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: InternalBridgeUserMessageQueue | undefined;\n /**\n * Settles when the in-flight turn has fully wound down — `onStart`\n * returned or threw AND its completion state was recorded. `undefined`\n * between turns. A new `start` fences on this so turns never overlap.\n */\n let activeTurn: Promise<void> | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the in-flight turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n {\n resolve: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => void;\n matches?: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n }\n >();\n const bufferedToolResults: Array<{\n toolCallId: string;\n result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n };\n }> = [];\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(line);\n } catch {\n // Send is best-effort: a dropped socket leaves the event in the log,\n // replayed once the host reconnects and sends `resume`.\n }\n }\n };\n\n const replay = (ws: WebSocket, afterSeq: number): void => {\n for (const entry of eventLog) {\n if (entry.seq > afterSeq && ws.readyState === WS_OPEN) {\n ws.send(entry.line);\n }\n }\n };\n\n // ─── diagnostics ──────────────────────────────────────────────\n const shouldEmitDebugEvent = (\n level: BridgeDebugLevel,\n subsystem: string,\n ): boolean => {\n if (!debugConfig?.enabled) return false;\n const threshold = debugConfig.level ?? 'debug';\n if (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n return subsystemMatches(debugConfig.subsystems, subsystem);\n };\n\n /*\n * Forward sandbox console output. We line-buffer the original writers (kept so\n * output still reaches the real fds) and emit one `sandbox-log` per complete\n * line. `emit` never writes to stdout/stderr, so there is no recursion.\n * Installed lazily the first time a turn enables diagnostics; once installed,\n * capture is gated per-write on `debugConfig.enabled` so a later turn can\n * disable it. Console capture is independent of the subsystem/level filter.\n */\n const rawStdoutWrite = process.stdout.write.bind(process.stdout);\n const rawStderrWrite = process.stderr.write.bind(process.stderr);\n\n const writeErrorToStderr = (input: {\n message: string;\n error: unknown;\n }): void => {\n try {\n const formatted = formatBridgeError(input.error);\n rawStderrWrite(\n `[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`,\n );\n if (formatted.stack) {\n rawStderrWrite(`${formatted.stack}\\n`);\n }\n } catch {}\n };\n\n const emitWarning = (input: { message: string }): void => {\n try {\n for (const line of input.message.split('\\n')) {\n if (line.trim().length > 0) {\n rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n }\n }\n } catch {}\n };\n\n const emitError = (input: { error: unknown; message?: string }): void => {\n writeErrorToStderr({\n message: input.message ?? 'bridge error',\n error: input.error,\n });\n emit({ type: 'error', error: serialiseError(input.error) });\n };\n\n const installConsoleCapture = (): void => {\n if (consoleCaptureInstalled) return;\n consoleCaptureInstalled = true;\n const buffers: { stdout: string; stderr: string } = {\n stdout: '',\n stderr: '',\n };\n const patch =\n (stream: 'stdout' | 'stderr', raw: typeof process.stdout.write) =>\n (chunk: unknown, encoding?: unknown, cb?: unknown): boolean => {\n if (debugConfig?.enabled) {\n try {\n const enc = typeof encoding === 'string' ? encoding : 'utf8';\n const text =\n typeof chunk === 'string'\n ? chunk\n : Buffer.from(chunk as Uint8Array).toString(\n enc as BufferEncoding,\n );\n const combined = buffers[stream] + text.replace(/\\r\\n/g, '\\n');\n const parts = combined.split('\\n');\n buffers[stream] = parts.pop() ?? '';\n for (const line of parts) {\n const trimmed = line.replace(/\\s+$/, '');\n if (trimmed) {\n emit({\n type: 'sandbox-log',\n source: bridgeType,\n stream,\n line: trimmed,\n });\n }\n }\n } catch {\n // Never let capture break real output.\n }\n }\n return (raw as (c: unknown, e?: unknown, cb?: unknown) => boolean)(\n chunk,\n encoding,\n cb,\n );\n };\n process.stdout.write = patch(\n 'stdout',\n rawStdoutWrite,\n ) as typeof process.stdout.write;\n process.stderr.write = patch(\n 'stderr',\n rawStderrWrite,\n ) as typeof process.stderr.write;\n };\n\n // ─── inbound routing ────────────────────────────────────────────────\n const handleInbound = async (\n msg: TStart | InboundControl,\n ws: WebSocket,\n ): Promise<void> => {\n switch (msg.type) {\n case 'start': {\n /*\n * A new turn replaces the active one — but only after the active one\n * has fully wound down. Inbound frames are dispatched concurrently,\n * and the host settles a caller abort immediately, so a retry's\n * `start` can arrive while the aborted turn is still tearing down\n * (e.g. a graceful interrupt). Without this fence the old turn would\n * keep emitting into the new turn's cleared event log, two runtime\n * processes would run side by side, and the old turn's completion\n * would mark the bridge `waiting` underneath the new turn. Abort the\n * old turn to hasten its teardown; adapters are expected to bound\n * that teardown themselves (e.g. a hard-abort fallback), but the\n * runtime does not rely on it: the wait is capped by the teardown\n * grace period, after which the new turn proceeds anyway — the\n * pre-fence overlapping behavior — rather than hanging behind a\n * teardown that never settles.\n */\n for (;;) {\n const pendingTurn = activeTurn;\n if (pendingTurn == null) break;\n turnAbort?.abort();\n currentUserMessages?.close(\n new Error('A new bridge turn replaced the active turn.'),\n );\n let graceTimer: ReturnType<typeof setTimeout> | undefined;\n const settled = await Promise.race([\n pendingTurn.then(() => true as const),\n new Promise<false>(resolve => {\n graceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n graceTimer.unref?.();\n }),\n ]);\n clearTimeout(graceTimer);\n if (!settled) break;\n }\n let turnFinished!: () => void;\n const thisTurn = new Promise<void>(resolve => (turnFinished = resolve));\n activeTurn = thisTurn;\n activeSocket = ws; // asking for a turn claims the event stream\n const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const userMessages = createBridgeUserMessageQueue({ respond: emit });\n const turn: BridgeTurn = {\n emit,\n requestToolResult: requestInput => {\n const request =\n typeof requestInput === 'string'\n ? { toolCallId: requestInput }\n : requestInput;\n const bufferedIndex = bufferedToolResults.findIndex(\n buffered =>\n buffered.toolCallId === request.toolCallId ||\n request.matches?.(buffered.result) === true,\n );\n if (bufferedIndex >= 0) {\n return Promise.resolve(\n bufferedToolResults.splice(bufferedIndex, 1)[0].result,\n );\n }\n return new Promise(resolve => {\n pendingToolResults.set(request.toolCallId, {\n resolve,\n matches: request.matches,\n });\n });\n },\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n experimental_userMessages: userMessages,\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n emitWarning,\n emitError,\n };\n currentUserMessages = userMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\n userMessages.close();\n if (currentUserMessages === userMessages) {\n currentUserMessages = undefined;\n }\n // Only the still-active turn records completion: after a fence\n // timeout a replacement turn is already running, and this stale\n // completion must not mark the bridge waiting underneath it.\n if (activeTurn === thisTurn) {\n activeTurn = undefined;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n turnFinished();\n }\n return;\n }\n case 'tool-result': {\n const result = {\n output: msg.output,\n isError: msg.isError,\n toolResult: msg.toolResult,\n };\n const exactPending = pendingToolResults.get(msg.toolCallId);\n const matchingPending =\n exactPending == null\n ? Array.from(pendingToolResults.entries()).find(\n ([, pending]) => pending.matches?.(result) === true,\n )\n : undefined;\n const pending = exactPending ?? matchingPending?.[1];\n const pendingId =\n exactPending != null ? msg.toolCallId : matchingPending?.[0];\n if (pending != null && pendingId != null) {\n pendingToolResults.delete(pendingId);\n pending.resolve(result);\n } else {\n bufferedToolResults.push({\n toolCallId: msg.toolCallId,\n result,\n });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message': {\n const messageId = msg.messageId ?? randomUUID();\n if (currentUserMessages == null) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: { message: 'The bridge has no active turn to steer.' },\n });\n return;\n }\n if (ws !== activeSocket) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: {\n message: 'The connection does not own the active bridge turn.',\n },\n });\n return;\n }\n currentUserMessages.enqueue({\n messageId,\n text: msg.text,\n });\n return;\n }\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n activeSocket = ws; // asking for a catch-up claims it too\n // Synchronous, so no event can slip out live ahead of the replayed tail.\n replay(ws, msg.lastSeenEventId);\n return;\n case 'destroy':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n await onDestroy?.();\n drainThenExit(ws, 1000, 'destroy');\n return;\n case 'stop': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onStop?.()) ?? {};\n sendControl(ws, { type: 'bridge-stop', data });\n drainThenExit(ws, 1000, 'stop');\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean stop/destroy leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl(ws, {\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n capabilities: { experimental_userMessageResponses: true },\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl(ws, {\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the stream owner's close matters; a socket that never claimed it,\n // or that a later `start`/`resume` displaced, closes as a no-op.\n // Crucially we do NOT abort the in-flight turn: it keeps running and its\n // events accumulate in the log for replay on reconnect.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\n });\n\n ws.on('error', () => {\n // 'close' follows; nothing to do beyond keeping the process alive.\n });\n });\n\n // Surface bridge-internal crashes to the host instead of dying silently.\n process.on('uncaughtException', err => {\n emitError({ error: err, message: 'uncaught exception' });\n });\n process.on('unhandledRejection', err => {\n emitError({ error: err, message: 'unhandled rejection' });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\n/*\n * Control frames answer the socket that sent the frame they reply to, so the\n * target is always explicit. Event streaming is the separate, stateful path\n * (`emit` → `activeSocket`); this one carries no state at all.\n */\nfunction sendControl(\n socket: WebSocket | undefined,\n message: Record<string, unknown>,\n): void {\n if (socket?.readyState === WS_OPEN) {\n try {\n socket.send(JSON.stringify(message));\n } catch {\n // best-effort\n }\n }\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","const name = 'AI_HarnessBridgeCapabilityUnsupportedError';\n\n/**\n * Signals an unsupported capability discovered inside a sandbox bridge.\n * `isInstance` also recognizes the serialized error shape received by the\n * host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n */\nexport class HarnessBridgeCapabilityUnsupportedError extends Error {\n readonly harnessId?: string;\n readonly cause?: unknown;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super(message);\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n this.cause = cause;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessBridgeCapabilityUnsupportedError {\n return (\n error != null &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === name &&\n 'message' in error &&\n typeof error.message === 'string'\n );\n }\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport { createHash } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\nimport type { StartMessage } from '../codex-bridge-protocol';\nimport { resolveCodexBuiltinToolPolicy } from './codex-tool-filtering';\nimport {\n CodexAppServerClient,\n type CodexAppServerRequest,\n} from './codex-app-server-client';\nimport {\n createAppServerEventHandler,\n type AppServerTurnResult,\n} from './create-app-server-event-handler';\nimport type { CodexStepTracker } from './codex-step-tracker';\nimport type { CodexEvent } from './create-emit-stream-event';\nimport { isDeepStrictEqual } from 'node:util';\nimport {\n assertTrustedApplyPatchHook,\n createTrustedApplyPatchHook,\n} from './codex-tool-filtering-hook';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nconst CODEX_CLI_PATH = fileURLToPath(\n new URL('./node_modules/@openai/codex/bin/codex.js', import.meta.url),\n);\n\ntype RunTurnOptions = {\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n workdir: string;\n threadId: string | undefined;\n codexModel: string | undefined;\n codexConfig: Record<string, unknown>;\n stepTracker: CodexStepTracker;\n emitStreamEvent: (event: CodexEvent) => void;\n};\n\ntype ActiveTurn = {\n threadId: string | undefined;\n turnId: string | undefined;\n handler: ReturnType<typeof createAppServerEventHandler>;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n options: RunTurnOptions;\n fail(error: unknown): void;\n};\n\nexport function createCodexAppServerRuntime(): {\n runTurn(options: RunTurnOptions): Promise<void>;\n close(): Promise<void>;\n} {\n let client: CodexAppServerClient | undefined;\n let loadedThreadId: string | undefined;\n let loadedConfig: Record<string, unknown> | undefined;\n let activeTurn: ActiveTurn | undefined;\n\n const close = async (): Promise<void> => {\n const previous = client;\n client = undefined;\n loadedThreadId = undefined;\n loadedConfig = undefined;\n await previous?.close();\n };\n\n const runTurn = async (options: RunTurnOptions): Promise<void> => {\n const { start, turn, emit, workdir, threadId, codexModel, codexConfig } =\n options;\n if (activeTurn != null) throw new Error('A Codex turn is already active.');\n const toolPolicy = resolveCodexBuiltinToolPolicy({\n builtinToolFiltering: start.builtinToolFiltering,\n webSearch: start.webSearch,\n });\n const trustedHook = toolPolicy.denyApplyPatchWithHook\n ? createTrustedApplyPatchHook({ codexConfig })\n : undefined;\n const nextConfig = {\n ...(trustedHook?.threadConfig ?? codexConfig),\n web_search: toolPolicy.webSearchMode,\n ...(toolPolicy.disabled.bash || toolPolicy.disabled.view_image\n ? {\n features: {\n ...asRecord(codexConfig.features),\n ...(toolPolicy.disabled.bash ? { shell_tool: false } : {}),\n ...(toolPolicy.disabled.view_image ? { view_image: false } : {}),\n },\n }\n : {}),\n };\n const processConfig = {\n thread: nextConfig,\n cliOverrides: trustedHook?.cliOverrides ?? [],\n };\n if (client != null && !isDeepStrictEqual(loadedConfig, processConfig)) {\n await close();\n }\n const handler = createAppServerEventHandler({\n stepTracker: options.stepTracker,\n emitStreamEvent: options.emitStreamEvent,\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n });\n const dynamicTools = createDynamicTools(start.tools ?? []);\n let rejectProtocolFailure: (error: unknown) => void = () => {};\n const protocolFailure = new Promise<never>((_, reject) => {\n rejectProtocolFailure = reject;\n });\n const currentTurn: ActiveTurn = {\n threadId,\n turnId: undefined,\n handler,\n dynamicTools,\n options,\n fail: rejectProtocolFailure,\n };\n activeTurn = currentTurn;\n let initialized = false;\n if (client == null) {\n const created = new CodexAppServerClient({\n executable: process.execPath,\n args: createCodexAppServerArgs({\n cliOverrides: trustedHook?.cliOverrides,\n }),\n cwd: workdir,\n env: process.env,\n onNotification: notification => {\n if (client !== created || activeTurn == null) return;\n const params = asRecord(notification.params);\n if (\n notification.method === 'turn/started' &&\n params?.threadId === activeTurn.threadId &&\n activeTurn.turnId == null\n ) {\n const turnId = asRecord(params?.turn)?.id;\n if (typeof turnId === 'string') activeTurn.turnId = turnId;\n }\n activeTurn.handler.handle(notification);\n },\n onRequest: request => {\n const active = activeTurn;\n const params = asRecord(request.params);\n if (\n client !== created ||\n active == null ||\n params?.threadId !== active.threadId ||\n params?.turnId !== active.turnId ||\n active.turnId == null\n ) {\n return Promise.reject(\n new Error(\n 'Codex app-server requested a tool for an inactive turn.',\n ),\n );\n }\n return handleAppServerRequest({\n request,\n dynamicTools: active.dynamicTools,\n emit: active.options.emit,\n requestToolResult: active.options.turn.requestToolResult,\n }).catch(error => {\n active.fail(error);\n throw error;\n });\n },\n onStderr: text => {\n const message = text.trim();\n if (message.length > 0) {\n activeTurn?.options.turn.bridgeLog({\n level: 'debug',\n subsystem: 'codex.app-server.stderr',\n message,\n });\n }\n },\n });\n client = created;\n loadedConfig = processConfig;\n initialized = true;\n }\n const runningClient = client;\n const clientFailure = runningClient.waitUntilFailure();\n const exitFailure = runningClient\n .waitUntilExit()\n .then(({ code, signal }) => {\n throw new Error(\n `Codex app-server exited before the turn completed (code ${code ?? 'null'}, signal ${signal ?? 'null'}).`,\n );\n });\n let removeAbortListener = () => {};\n const abortFailure = new Promise<never>((_, reject) => {\n const onAbort = () => {\n if (currentTurn.threadId != null && currentTurn.turnId != null) {\n void runningClient\n .request({\n method: 'turn/interrupt',\n params: {\n threadId: currentTurn.threadId,\n turnId: currentTurn.turnId,\n },\n })\n .catch(() => {});\n }\n reject(\n turn.abortSignal.reason ?? new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turn.abortSignal.aborted) onAbort();\n else {\n turn.abortSignal.addEventListener('abort', onAbort, { once: true });\n removeAbortListener = () =>\n turn.abortSignal.removeEventListener('abort', onAbort);\n }\n });\n const raceWithProcess = <T>({ operation }: { operation: Promise<T> }) =>\n Promise.race([\n operation,\n abortFailure,\n protocolFailure,\n clientFailure,\n exitFailure,\n ]);\n let stopSteering = () => {};\n const steeringStopped = new Promise<void>(resolve => {\n stopSteering = resolve;\n });\n const userMessageLoop = async () => {\n for await (const message of turn.experimental_userMessages) {\n try {\n const response = await Promise.race([\n raceWithProcess({\n operation: runningClient.request({\n method: 'turn/steer',\n params: {\n threadId: currentTurn.threadId!,\n expectedTurnId: currentTurn.turnId!,\n clientUserMessageId: message.messageId,\n input: [\n { type: 'text', text: message.text, text_elements: [] },\n ],\n },\n }),\n }),\n steeringStopped.then(() => {\n throw new Error(\n 'The Codex turn ended before accepting the user message.',\n );\n }),\n ]);\n if (asRecord(response)?.turnId !== currentTurn.turnId) {\n throw new Error(\n 'Codex app-server turn/steer returned an unexpected turn ID.',\n );\n }\n message.accept();\n } catch (error) {\n message.reject(error);\n }\n }\n };\n let keepClient = false;\n try {\n if (initialized) {\n await raceWithProcess({\n operation: runningClient.initialize({\n clientName: 'ai-sdk-harness-codex',\n clientVersion: '1',\n }),\n });\n }\n if (start.restartThread && loadedThreadId != null) {\n await raceWithProcess({\n operation: runningClient.request({\n method: 'thread/unsubscribe',\n params: { threadId: loadedThreadId },\n }),\n });\n loadedThreadId = undefined;\n }\n if (trustedHook != null) {\n const hooks = await raceWithProcess({\n operation: runningClient.request({\n method: 'hooks/list',\n params: {},\n }),\n });\n assertTrustedApplyPatchHook({ response: hooks, hook: trustedHook });\n }\n const threadMethod = threadId == null ? 'thread/start' : 'thread/resume';\n if (loadedThreadId !== threadId || threadId == null) {\n const threadResponse = await raceWithProcess({\n operation: runningClient.request({\n method: threadMethod,\n params:\n threadId == null\n ? {\n ...createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig: nextConfig,\n }),\n dynamicTools: dynamicTools.specs,\n experimentalRawEvents: true,\n }\n : {\n threadId,\n ...createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig: nextConfig,\n }),\n excludeTurns: true,\n },\n }),\n });\n assertCodexThreadPermissions({\n response: threadResponse,\n method: threadMethod,\n });\n currentTurn.threadId = readNestedString({\n value: threadResponse,\n path: ['thread', 'id'],\n method: threadMethod,\n });\n loadedThreadId = currentTurn.threadId;\n }\n handler.announceThread(currentTurn.threadId!);\n emit({ type: 'stream-start' });\n const turnResponse = await raceWithProcess({\n operation: runningClient.request({\n method: 'turn/start',\n params: createTurnParams({\n threadId: currentTurn.threadId!,\n start,\n codexModel,\n disableEnvironments: toolPolicy.disableEnvironments,\n }),\n }),\n });\n currentTurn.turnId = readNestedString({\n value: turnResponse,\n path: ['turn', 'id'],\n method: 'turn/start',\n });\n handler.setTurnId(currentTurn.turnId);\n void userMessageLoop();\n const result = await raceWithProcess({\n operation: handler.waitForCompletion(),\n });\n keepClient = true;\n assertSuccessfulTurn(result);\n } catch (error) {\n if (turn.abortSignal.aborted && currentTurn.turnId != null) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n keepClient = await Promise.race([\n handler.waitForCompletion().then(() => true),\n new Promise<boolean>(resolve => {\n timer = setTimeout(() => resolve(false), 5_000);\n }),\n clientFailure.then(\n () => false,\n () => false,\n ),\n ]);\n } finally {\n clearTimeout(timer);\n }\n }\n throw error;\n } finally {\n turn.experimental_userMessages.close();\n stopSteering();\n removeAbortListener();\n if (activeTurn === currentTurn) activeTurn = undefined;\n if (!keepClient) await close();\n }\n };\n\n return { runTurn, close };\n}\n\nexport function createCodexAppServerArgs({\n cliOverrides = [],\n}: {\n cliOverrides?: string[];\n} = {}): string[] {\n return [\n CODEX_CLI_PATH,\n '--config',\n 'sandbox_mode=\"danger-full-access\"',\n '--config',\n 'approval_policy=\"never\"',\n ...cliOverrides.flatMap(override => ['--config', override]),\n 'app-server',\n '--stdio',\n ];\n}\n\nexport function createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig,\n}: {\n start: StartMessage;\n workdir: string;\n codexModel: string | undefined;\n codexConfig: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n ...(codexModel == null ? {} : { model: codexModel }),\n cwd: workdir,\n approvalPolicy: 'never',\n sandbox: 'danger-full-access',\n config: {\n ...codexConfig,\n web_search:\n codexConfig.web_search ?? (start.webSearch ? 'live' : 'disabled'),\n },\n };\n}\n\nexport function createTurnParams({\n threadId,\n start,\n codexModel,\n disableEnvironments = false,\n}: {\n threadId: string;\n start: StartMessage;\n codexModel: string | undefined;\n disableEnvironments?: boolean;\n}): Record<string, unknown> {\n return {\n threadId,\n ...(disableEnvironments ? { environments: [] } : {}),\n input: [{ type: 'text', text: start.prompt, text_elements: [] }],\n approvalPolicy: 'never',\n sandboxPolicy: {\n type: 'externalSandbox',\n networkAccess: 'enabled',\n },\n ...(codexModel == null ? {} : { model: codexModel }),\n ...(start.reasoningEffort == null ? {} : { effort: start.reasoningEffort }),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? { outputSchema: start.responseFormat.schema }\n : {}),\n };\n}\n\nexport function assertCodexThreadPermissions({\n response,\n method,\n}: {\n response: unknown;\n method: string;\n}): void {\n const value = asRecord(response);\n const sandbox = asRecord(value?.sandbox);\n if (\n value?.approvalPolicy !== 'never' ||\n sandbox?.type !== 'dangerFullAccess'\n ) {\n throw new Error(\n `Codex app-server ${method} did not disable approvals and its platform sandbox.`,\n );\n }\n}\n\nexport function createDynamicTools(\n tools: ReadonlyArray<{\n name: string;\n description?: string;\n inputSchema?: unknown;\n }>,\n): {\n specs: Array<Record<string, unknown>>;\n originalNameByAlias: ReadonlyMap<string, string>;\n} {\n const validOriginalNames = new Set(\n tools.map(tool => tool.name).filter(isValidDynamicToolName),\n );\n const usedAliases = new Set<string>();\n const originalNameByAlias = new Map<string, string>();\n const specs = tools.map((tool, index) => {\n let alias = tool.name;\n if (!isValidDynamicToolName(alias) || usedAliases.has(alias)) {\n const digest = createHash('sha256')\n .update(tool.name)\n .digest('hex')\n .slice(0, 16);\n const base = `ai_sdk_tool_${digest}`;\n alias = base;\n let suffix = index;\n while (usedAliases.has(alias) || validOriginalNames.has(alias)) {\n alias = `${base}_${suffix++}`;\n }\n }\n usedAliases.add(alias);\n originalNameByAlias.set(alias, tool.name);\n return {\n type: 'function',\n name: alias,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema ?? {},\n };\n });\n return { specs, originalNameByAlias };\n}\n\nfunction isValidDynamicToolName(name: string): boolean {\n return (\n name.length > 0 &&\n name.length <= 128 &&\n /^[a-zA-Z0-9_-]+$/.test(name) &&\n name !== 'mcp' &&\n !name.startsWith('mcp__')\n );\n}\n\nexport async function handleAppServerRequest({\n request,\n dynamicTools,\n emit,\n requestToolResult,\n}: {\n request: CodexAppServerRequest;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n emit: Emit;\n requestToolResult: BridgeTurn['requestToolResult'];\n}): Promise<unknown> {\n if (request.method !== 'item/tool/call') {\n throw new Error(\n `Codex app-server requested unsupported method '${request.method}'.`,\n );\n }\n const params = asRecord(request.params);\n if (\n params == null ||\n typeof params.callId !== 'string' ||\n typeof params.tool !== 'string'\n ) {\n throw new Error('Codex app-server sent an invalid dynamic tool request.');\n }\n const originalToolName = dynamicTools.originalNameByAlias.get(params.tool);\n if (originalToolName == null) {\n throw new Error(\n `Codex app-server requested unknown dynamic tool '${params.tool}'.`,\n );\n }\n emit({\n type: 'tool-call',\n toolCallId: params.callId,\n toolName: originalToolName,\n input: JSON.stringify(params.arguments ?? {}),\n providerExecuted: false,\n });\n const result = await requestToolResult(params.callId);\n emit({\n type: 'tool-result',\n toolCallId: params.callId,\n toolName: originalToolName,\n result: result.output ?? null,\n isError: result.isError === true,\n });\n return {\n contentItems: [\n { type: 'inputText', text: serializeToolOutput(result.output) },\n ],\n success: result.isError !== true,\n };\n}\n\nfunction serializeToolOutput(output: unknown): string {\n if (typeof output === 'string') return output;\n try {\n return JSON.stringify(output) ?? String(output);\n } catch {\n return String(output);\n }\n}\n\nfunction readNestedString({\n value,\n path,\n method,\n}: {\n value: unknown;\n path: string[];\n method: string;\n}): string {\n let current: unknown = value;\n for (const segment of path) current = asRecord(current)?.[segment];\n if (typeof current !== 'string' || current.length === 0) {\n throw new Error(`Codex app-server ${method} returned an invalid response.`);\n }\n return current;\n}\n\nfunction assertSuccessfulTurn(result: AppServerTurnResult): void {\n if (result.status === 'completed') return;\n if (result.status === 'interrupted') {\n throw new DOMException('Codex turn was interrupted.', 'AbortError');\n }\n throw new Error(\n result.error ?? `Codex turn ended with status '${result.status}'.`,\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n","export type CodexBuiltinToolPolicy = {\n readonly disabled: {\n readonly bash: boolean;\n readonly webSearch: boolean;\n readonly apply_patch: boolean;\n readonly view_image: boolean;\n };\n readonly disableEnvironments: boolean;\n readonly denyApplyPatchWithHook: boolean;\n readonly webSearchMode: 'live' | 'disabled';\n};\n\nexport function resolveCodexBuiltinToolPolicy({\n builtinToolFiltering,\n webSearch,\n}: {\n builtinToolFiltering:\n | { mode: 'allow' | 'deny'; toolNames: string[] }\n | undefined;\n webSearch: boolean | undefined;\n}): CodexBuiltinToolPolicy {\n const included = (toolName: string) =>\n builtinToolFiltering == null ||\n (builtinToolFiltering.mode === 'allow'\n ? builtinToolFiltering.toolNames.includes(toolName)\n : !builtinToolFiltering.toolNames.includes(toolName));\n const disabled = {\n bash: !included('bash'),\n webSearch: !included('webSearch'),\n apply_patch: !included('apply_patch'),\n view_image: !included('view_image'),\n };\n const disableEnvironments =\n disabled.bash && disabled.apply_patch && disabled.view_image;\n\n return {\n disabled,\n disableEnvironments,\n denyApplyPatchWithHook: disabled.apply_patch && !disableEnvironments,\n webSearchMode: webSearch && !disabled.webSearch ? 'live' : 'disabled',\n };\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\n\ntype JsonRpcId = number | string;\n\ntype JsonRpcError = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type CodexAppServerNotification = {\n method: string;\n params?: unknown;\n};\n\nexport type CodexAppServerRequest = CodexAppServerNotification & {\n id: JsonRpcId;\n};\n\nexport class CodexAppServerRequestError extends Error {\n readonly method: string;\n readonly code: number;\n readonly data: unknown;\n\n constructor({ method, error }: { method: string; error: JsonRpcError }) {\n super(`Codex app-server ${method} failed: ${error.message}`);\n this.name = 'CodexAppServerRequestError';\n this.method = method;\n this.code = error.code;\n this.data = error.data;\n }\n}\n\nexport class CodexAppServerClient {\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly onNotification: (\n notification: CodexAppServerNotification,\n ) => void;\n private readonly onRequest: (\n request: CodexAppServerRequest,\n ) => Promise<unknown>;\n private readonly onStderr: (text: string) => void;\n private readonly pending = new Map<\n JsonRpcId,\n {\n method: string;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n }\n >();\n private nextRequestId = 1;\n private stdoutBuffer = '';\n private parseQueue = Promise.resolve();\n private closed = false;\n private failure: unknown;\n private readonly failed: Promise<unknown>;\n private resolveFailure: (error: unknown) => void = () => {};\n private exitResult: {\n code: number | null;\n signal: NodeJS.Signals | null;\n } | null = null;\n private readonly exited: Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }>;\n\n constructor({\n executable,\n args,\n cwd,\n env,\n onNotification,\n onRequest,\n onStderr,\n }: {\n executable: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n onNotification: (notification: CodexAppServerNotification) => void;\n onRequest: (request: CodexAppServerRequest) => Promise<unknown>;\n onStderr: (text: string) => void;\n }) {\n this.onNotification = onNotification;\n this.onRequest = onRequest;\n this.onStderr = onStderr;\n this.failed = new Promise(resolve => {\n this.resolveFailure = resolve;\n });\n this.child = spawn(executable, args, {\n cwd,\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n this.exited = new Promise(resolve => {\n this.child.once('exit', (code, signal) => {\n this.exitResult = { code, signal };\n this.fail(\n new Error(\n `Codex app-server exited (code ${code ?? 'null'}, signal ${signal ?? 'null'}).`,\n ),\n );\n resolve(this.exitResult);\n });\n });\n this.child.once('error', error => this.fail(error));\n this.child.stdout.setEncoding('utf8');\n this.child.stdout.on('data', chunk => this.consumeStdout(String(chunk)));\n this.child.stderr.setEncoding('utf8');\n this.child.stderr.on('data', chunk => this.onStderr(String(chunk)));\n }\n\n async initialize({\n clientName,\n clientVersion,\n }: {\n clientName: string;\n clientVersion: string;\n }): Promise<void> {\n await this.request({\n method: 'initialize',\n params: {\n clientInfo: { name: clientName, version: clientVersion },\n capabilities: { experimentalApi: true },\n },\n });\n this.notify({ method: 'initialized' });\n }\n\n request({\n method,\n params,\n }: {\n method: string;\n params?: unknown;\n }): Promise<unknown> {\n if (this.closed || this.exitResult != null) {\n return Promise.reject(new Error('Codex app-server is not running.'));\n }\n const id = this.nextRequestId++;\n const response = new Promise<unknown>((resolve, reject) => {\n this.pending.set(id, { method, resolve, reject });\n });\n try {\n this.write({ id, method, ...(params === undefined ? {} : { params }) });\n } catch (error) {\n this.pending.delete(id);\n return Promise.reject(error);\n }\n return response;\n }\n\n notify({ method, params }: { method: string; params?: unknown }): void {\n this.write({ method, ...(params === undefined ? {} : { params }) });\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.child.stdin.end();\n if (await this.waitForExit({ timeoutMs: 500 })) return;\n this.child.kill('SIGTERM');\n if (await this.waitForExit({ timeoutMs: 1_000 })) return;\n this.child.kill('SIGKILL');\n await this.waitForExit({ timeoutMs: 1_000 });\n }\n\n waitUntilExit(): Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }> {\n return this.exited;\n }\n\n waitUntilFailure(): Promise<never> {\n return this.failed.then(error => {\n throw error;\n });\n }\n\n private write(message: Record<string, unknown>): void {\n if (this.closed || this.exitResult != null || !this.child.stdin.writable) {\n throw new Error('Codex app-server is not writable.');\n }\n this.child.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n private consumeStdout(chunk: string): void {\n this.stdoutBuffer += chunk;\n let newline = this.stdoutBuffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.stdoutBuffer.slice(0, newline).trim();\n this.stdoutBuffer = this.stdoutBuffer.slice(newline + 1);\n if (line.length > 0) {\n this.parseQueue = this.parseQueue\n .then(() => this.processLine(line))\n .catch(error => this.fail(error));\n }\n newline = this.stdoutBuffer.indexOf('\\n');\n }\n }\n\n private async processLine(line: string): Promise<void> {\n /*\n * Bridge code runs in an isolated runtime where provider-utils is not\n * available. The app-server is the bridge's own child process, and every\n * JSON-RPC field consumed below is checked before it is used.\n */\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n throw new Error('Codex app-server wrote an invalid JSON-RPC message.');\n }\n if (!isRecord(message)) {\n throw new Error('Codex app-server wrote an invalid JSON-RPC message.');\n }\n if (typeof message.method === 'string') {\n if (isJsonRpcId(message.id)) {\n void this.handleServerRequest({\n id: message.id,\n method: message.method,\n ...(message.params === undefined ? {} : { params: message.params }),\n });\n } else {\n this.onNotification({\n method: message.method,\n ...(message.params === undefined ? {} : { params: message.params }),\n });\n }\n return;\n }\n if (!isJsonRpcId(message.id)) {\n throw new Error('Codex app-server response is missing a valid id.');\n }\n const pending = this.pending.get(message.id);\n if (pending == null) return;\n this.pending.delete(message.id);\n if (isJsonRpcError(message.error)) {\n pending.reject(\n new CodexAppServerRequestError({\n method: pending.method,\n error: message.error,\n }),\n );\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(message, 'result')) {\n pending.reject(\n new Error(`Codex app-server ${pending.method} response has no result.`),\n );\n return;\n }\n pending.resolve(message.result);\n }\n\n private async handleServerRequest(\n request: CodexAppServerRequest,\n ): Promise<void> {\n try {\n const result = await this.onRequest(request);\n if (!this.closed && this.exitResult == null) {\n this.write({ id: request.id, result });\n }\n } catch (error) {\n if (!this.closed && this.exitResult == null) {\n this.write({\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n }\n\n private failPending(error: unknown): void {\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n }\n\n private fail(error: unknown): void {\n this.failPending(error);\n if (this.failure !== undefined) return;\n this.failure = error;\n this.resolveFailure(error);\n }\n\n private async waitForExit({\n timeoutMs,\n }: {\n timeoutMs: number;\n }): Promise<boolean> {\n if (this.exitResult != null) return true;\n return Promise.race([\n this.exited.then(() => true),\n new Promise<boolean>(resolve => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n timer.unref?.();\n }),\n ]);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isJsonRpcId(value: unknown): value is JsonRpcId {\n return typeof value === 'string' || typeof value === 'number';\n}\n\nfunction isJsonRpcError(value: unknown): value is JsonRpcError {\n return (\n isRecord(value) &&\n typeof value.code === 'number' &&\n typeof value.message === 'string'\n );\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport type { CodexStepTracker } from './codex-step-tracker';\nimport type { CodexEvent, CodexItem } from './create-emit-stream-event';\nimport type { CodexAppServerNotification } from './codex-app-server-client';\n\ntype UsageBreakdown = {\n inputTokens: number;\n cachedInputTokens: number;\n cacheWriteInputTokens: number;\n outputTokens: number;\n};\n\nexport type AppServerTurnResult = {\n status: string;\n error?: string;\n};\n\ntype NativeToolName = 'apply_patch' | 'view_image';\n\ntype NativeToolCall = {\n name: NativeToolName;\n resultEmitted: boolean;\n successConfirmed: boolean;\n};\n\nexport function createAppServerEventHandler({\n stepTracker,\n emitStreamEvent,\n emitWarning,\n emitError,\n}: {\n stepTracker: CodexStepTracker;\n emitStreamEvent: (event: CodexEvent) => void;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n}): {\n announceThread(threadId: string): void;\n handle(notification: CodexAppServerNotification): void;\n setTurnId(turnId: string): void;\n waitForCompletion(): Promise<AppServerTurnResult>;\n} {\n let activeThreadId: string | undefined;\n let activeTurnId: string | undefined;\n let settled = false;\n let accumulatedUsage: UsageBreakdown = emptyUsageBreakdown();\n let lastCumulativeUsageKey: string | undefined;\n const textByItem = new Map<string, string>();\n const reasoningByItem = new Map<string, string>();\n const nativeToolCalls = new Map<string, NativeToolCall>();\n let resolveCompletion: (result: AppServerTurnResult) => void = () => {};\n const completion = new Promise<AppServerTurnResult>(resolve => {\n resolveCompletion = resolve;\n });\n const announceThread = (threadId: string): void => {\n if (activeThreadId != null) return;\n activeThreadId = threadId;\n emitStreamEvent({ type: 'thread.started', thread_id: threadId });\n };\n\n const handleItem = ({\n eventType,\n params,\n }: {\n eventType: 'item.started' | 'item.completed';\n params: Record<string, unknown>;\n }): void => {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId })) return;\n const item = asRecord(params.item);\n if (item == null || typeof item.type !== 'string') return;\n if (eventType === 'item.completed' && typeof item.id === 'string') {\n const call = nativeToolCalls.get(item.id);\n if (call?.name === 'apply_patch' && item.type === 'fileChange') {\n call.successConfirmed = item.status === 'completed';\n } else if (call?.name === 'view_image' && item.type === 'imageView') {\n call.successConfirmed = true;\n }\n }\n const normalized = normalizeItem({ item, textByItem, reasoningByItem });\n if (normalized == null) return;\n if (normalized.type === 'dynamic_tool_call') {\n stepTracker.observeEvent({\n event: { type: eventType, item: normalized },\n itemId: normalized.id,\n });\n return;\n }\n emitStreamEvent({ type: eventType, item: normalized });\n };\n\n const emitNativeToolResult = ({\n callId,\n result,\n }: {\n callId: string;\n result: unknown;\n }): void => {\n const call = nativeToolCalls.get(callId);\n if (call == null || call.resultEmitted) return;\n call.resultEmitted = true;\n emitStreamEvent({\n type: 'item.completed',\n item: {\n type: 'native_tool',\n id: callId,\n tool: call.name,\n result,\n ...(!call.successConfirmed ? { isError: true } : {}),\n },\n });\n };\n\n const handleRawItem = (params: Record<string, unknown>): void => {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId })) return;\n const item = asRecord(params.item);\n if (item == null) return;\n const toolCall = normalizeNativeToolCall({ item });\n if (toolCall != null) {\n if (nativeToolCalls.has(toolCall.callId)) return;\n nativeToolCalls.set(toolCall.callId, {\n name: toolCall.name,\n resultEmitted: false,\n successConfirmed: false,\n });\n emitStreamEvent({\n type: 'item.started',\n item: {\n type: 'native_tool',\n id: toolCall.callId,\n tool: toolCall.name,\n input: toolCall.input,\n },\n });\n return;\n }\n if (typeof item.call_id !== 'string') return;\n const call = nativeToolCalls.get(item.call_id);\n if (\n call == null ||\n (call.name === 'apply_patch'\n ? item.type !== 'custom_tool_call_output'\n : item.type !== 'function_call_output') ||\n !Object.prototype.hasOwnProperty.call(item, 'output')\n ) {\n return;\n }\n emitNativeToolResult({\n callId: item.call_id,\n result:\n call.name === 'view_image' &&\n call.successConfirmed &&\n Array.isArray(item.output) &&\n item.output.length === 0\n ? 'Image viewed.'\n : item.output,\n });\n };\n\n return {\n announceThread,\n setTurnId(turnId) {\n activeTurnId = turnId;\n },\n handle(notification) {\n const params = asRecord(notification.params);\n if (notification.method === 'thread/started') {\n const thread = asRecord(params?.thread);\n if (typeof thread?.id === 'string') announceThread(thread.id);\n return;\n }\n if (notification.method === 'turn/started') {\n const turn = asRecord(params?.turn);\n if (\n params?.threadId === activeThreadId &&\n typeof turn?.id === 'string'\n ) {\n activeTurnId = turn.id;\n }\n return;\n }\n if (notification.method === 'item/started' && params != null) {\n handleItem({ eventType: 'item.started', params });\n return;\n }\n if (notification.method === 'item/completed' && params != null) {\n handleItem({ eventType: 'item.completed', params });\n return;\n }\n if (\n notification.method === 'rawResponseItem/completed' &&\n params != null\n ) {\n handleRawItem(params);\n return;\n }\n if (\n notification.method === 'item/agentMessage/delta' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId }) &&\n typeof params.itemId === 'string' &&\n typeof params.delta === 'string'\n ) {\n const text = (textByItem.get(params.itemId) ?? '') + params.delta;\n textByItem.set(params.itemId, text);\n emitStreamEvent({\n type: 'item.updated',\n item: { type: 'agent_message', id: params.itemId, text },\n });\n return;\n }\n if (\n notification.method === 'item/reasoning/summaryTextDelta' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId }) &&\n typeof params.itemId === 'string' &&\n typeof params.delta === 'string'\n ) {\n const text = (reasoningByItem.get(params.itemId) ?? '') + params.delta;\n reasoningByItem.set(params.itemId, text);\n emitStreamEvent({\n type: 'item.updated',\n item: { type: 'reasoning', id: params.itemId, text },\n });\n return;\n }\n if (\n notification.method === 'thread/tokenUsage/updated' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId })\n ) {\n const tokenUsage = asRecord(params.tokenUsage);\n const total = readUsageBreakdown(tokenUsage?.total);\n const last = readUsageBreakdown(tokenUsage?.last);\n if (total != null && last != null) {\n const key = usageKey(total);\n if (key !== lastCumulativeUsageKey) {\n lastCumulativeUsageKey = key;\n accumulatedUsage = addUsage({\n total: accumulatedUsage,\n increment: last,\n });\n }\n }\n return;\n }\n if (notification.method === 'error' && params != null) {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId }))\n return;\n const error = asRecord(params.error);\n const message =\n typeof error?.message === 'string'\n ? error.message\n : 'Codex app-server reported an error.';\n if (params.willRetry === true) {\n emitWarning({ message });\n } else {\n emitError({ error: message, message: 'codex turn failed' });\n }\n return;\n }\n if (\n (notification.method === 'warning' ||\n notification.method === 'configWarning' ||\n notification.method === 'deprecationNotice') &&\n typeof params?.message === 'string'\n ) {\n emitWarning({ message: params.message });\n return;\n }\n if (\n notification.method === 'turn/completed' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId })\n ) {\n if (settled) return;\n settled = true;\n const turn = asRecord(params.turn);\n const status =\n typeof turn?.status === 'string' ? turn.status : 'failed';\n const turnError = asRecord(turn?.error);\n if (status === 'completed') {\n for (const [callId, call] of nativeToolCalls) {\n if (call.resultEmitted) continue;\n emitNativeToolResult({\n callId,\n result: call.successConfirmed\n ? call.name === 'apply_patch'\n ? 'Patch applied.'\n : 'Image viewed.'\n : 'Codex did not report the tool result.',\n });\n }\n }\n emitStreamEvent({\n type: 'turn.completed',\n usage: toLegacyUsage(accumulatedUsage),\n });\n resolveCompletion({\n status,\n ...(typeof turnError?.message === 'string'\n ? { error: turnError.message }\n : {}),\n });\n }\n },\n waitForCompletion: () => completion,\n };\n}\n\nfunction normalizeNativeToolCall({\n item,\n}: {\n item: Record<string, unknown>;\n}): { callId: string; name: NativeToolName; input: string } | undefined {\n if (\n item.namespace != null ||\n typeof item.call_id !== 'string' ||\n item.call_id.length === 0\n ) {\n return undefined;\n }\n if (\n item.type === 'custom_tool_call' &&\n item.name === 'apply_patch' &&\n typeof item.input === 'string'\n ) {\n return {\n callId: item.call_id,\n name: 'apply_patch',\n input: JSON.stringify(item.input),\n };\n }\n if (\n item.type === 'function_call' &&\n item.name === 'view_image' &&\n typeof item.arguments === 'string'\n ) {\n return {\n callId: item.call_id,\n name: 'view_image',\n input: item.arguments,\n };\n }\n return undefined;\n}\n\nfunction normalizeItem({\n item,\n textByItem,\n reasoningByItem,\n}: {\n item: Record<string, unknown>;\n textByItem: Map<string, string>;\n reasoningByItem: Map<string, string>;\n}): CodexItem | undefined {\n const id = typeof item.id === 'string' ? item.id : undefined;\n if (item.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text : '';\n if (id != null) textByItem.set(id, text);\n return { type: 'agent_message', id, text };\n }\n if (item.type === 'reasoning') {\n const summary = stringArray(item.summary).join('\\n\\n');\n const content = stringArray(item.content).join('\\n\\n');\n const text = summary || reasoningByItem.get(id ?? '') || content;\n if (id != null) reasoningByItem.set(id, text);\n return { type: 'reasoning', id, text };\n }\n if (item.type === 'commandExecution') {\n return {\n type: 'command_execution',\n id,\n command: typeof item.command === 'string' ? item.command : '',\n exit_code: typeof item.exitCode === 'number' ? item.exitCode : undefined,\n aggregated_output:\n typeof item.aggregatedOutput === 'string'\n ? item.aggregatedOutput\n : undefined,\n status: normalizeCommandStatus(item.status),\n };\n }\n if (item.type === 'mcpToolCall') {\n const result = asRecord(item.result);\n return {\n type: 'mcp_tool_call',\n id,\n server: typeof item.server === 'string' ? item.server : undefined,\n tool: typeof item.tool === 'string' ? item.tool : undefined,\n arguments: item.arguments,\n result:\n result == null\n ? item.result\n : {\n content: result.content,\n structured_content: result.structuredContent,\n },\n error: asRecord(item.error) as { message?: string } | undefined,\n };\n }\n if (item.type === 'dynamicToolCall') {\n return { type: 'dynamic_tool_call', id };\n }\n if (item.type === 'webSearch') {\n return {\n type: 'web_search',\n id,\n query: typeof item.query === 'string' ? item.query : undefined,\n action: asRecord(item.action) ?? undefined,\n result: item.results,\n };\n }\n if (item.type === 'fileChange') {\n return {\n type: 'file_change',\n id,\n changes: Array.isArray(item.changes)\n ? item.changes.flatMap(change => {\n const value = asRecord(change);\n const kind = asRecord(value?.kind)?.type;\n return typeof value?.path === 'string' &&\n (kind === 'add' || kind === 'delete' || kind === 'update')\n ? [{ path: value.path, kind }]\n : [];\n })\n : [],\n };\n }\n if (item.type === 'plan') return { type: 'todo_list', id };\n return undefined;\n}\n\nfunction normalizeCommandStatus(\n value: unknown,\n): 'in_progress' | 'completed' | 'failed' {\n if (value === 'completed') return 'completed';\n if (value === 'inProgress') return 'in_progress';\n return 'failed';\n}\n\nfunction matchesActiveTurn({\n params,\n activeThreadId,\n activeTurnId,\n}: {\n params: Record<string, unknown>;\n activeThreadId: string | undefined;\n activeTurnId: string | undefined;\n}): boolean {\n const nestedTurn = asRecord(params.turn);\n const turnId =\n typeof params.turnId === 'string'\n ? params.turnId\n : typeof nestedTurn?.id === 'string'\n ? nestedTurn.id\n : undefined;\n return (\n activeThreadId != null &&\n activeTurnId != null &&\n params.threadId === activeThreadId &&\n turnId === activeTurnId\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : [];\n}\n\nfunction emptyUsageBreakdown(): UsageBreakdown {\n return {\n inputTokens: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n outputTokens: 0,\n };\n}\n\nfunction readUsageBreakdown(value: unknown): UsageBreakdown | undefined {\n const usage = asRecord(value);\n if (usage == null) return undefined;\n return {\n inputTokens: numberOrZero(usage.inputTokens),\n cachedInputTokens: numberOrZero(usage.cachedInputTokens),\n cacheWriteInputTokens: numberOrZero(usage.cacheWriteInputTokens),\n outputTokens: numberOrZero(usage.outputTokens),\n };\n}\n\nfunction addUsage({\n total,\n increment,\n}: {\n total: UsageBreakdown;\n increment: UsageBreakdown;\n}): UsageBreakdown {\n return {\n inputTokens: total.inputTokens + increment.inputTokens,\n cachedInputTokens: total.cachedInputTokens + increment.cachedInputTokens,\n cacheWriteInputTokens:\n total.cacheWriteInputTokens + increment.cacheWriteInputTokens,\n outputTokens: total.outputTokens + increment.outputTokens,\n };\n}\n\nfunction usageKey(usage: UsageBreakdown): string {\n return [\n usage.inputTokens,\n usage.cachedInputTokens,\n usage.cacheWriteInputTokens,\n usage.outputTokens,\n ].join(':');\n}\n\nfunction toLegacyUsage(usage: UsageBreakdown): Record<string, number> {\n return {\n input_tokens: usage.inputTokens,\n cached_input_tokens: usage.cachedInputTokens,\n cache_write_input_tokens: usage.cacheWriteInputTokens,\n output_tokens: usage.outputTokens,\n };\n}\n\nfunction numberOrZero(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\n\nconst MATCHER = '^apply_patch$';\nconst TIMEOUT_SECONDS = 10;\nconst COMMAND =\n \"printf '%s\\\\n' \\\"Tool 'apply_patch' is inactive due to the HarnessAgent tool filtering policy.\\\" >&2; exit 2\";\n\nexport type TrustedApplyPatchHook = {\n cliOverrides: string[];\n threadConfig: Record<string, unknown>;\n key: string;\n hash: string;\n command: string;\n};\n\nexport function createTrustedApplyPatchHook({\n codexConfig,\n}: {\n codexConfig: Record<string, unknown>;\n}): TrustedApplyPatchHook {\n const threadConfig = { ...codexConfig };\n const hooks = { ...asRecord(threadConfig.hooks) };\n delete threadConfig.hooks;\n\n for (const [key, value] of Object.entries(threadConfig)) {\n if (!key.startsWith('hooks.')) continue;\n const name = key.slice('hooks.'.length);\n if (name.startsWith('state.')) {\n hooks.state = {\n ...asRecord(hooks.state),\n [name.slice('state.'.length)]: value,\n };\n } else {\n hooks[name] = value;\n }\n delete threadConfig[key];\n }\n\n const userGroups = hooks.PreToolUse ?? [];\n if (!Array.isArray(userGroups)) {\n throw new Error('Codex config hooks.PreToolUse must be an array.');\n }\n\n const handler = {\n type: 'command',\n command: COMMAND,\n timeout: TIMEOUT_SECONDS,\n async: false,\n };\n const hash = `sha256:${createHash('sha256')\n .update(\n JSON.stringify(\n canonicalize({\n event_name: 'pre_tool_use',\n matcher: MATCHER,\n hooks: [handler],\n }),\n ),\n )\n .digest('hex')}`;\n const sourcePath =\n process.platform === 'win32'\n ? path.win32.resolve('C:\\\\', '<session-flags>/config.toml')\n : path.posix.resolve('/', '<session-flags>/config.toml');\n const key = `${sourcePath}:pre_tool_use:${userGroups.length}:0`;\n\n hooks.PreToolUse = [...userGroups, { matcher: MATCHER, hooks: [handler] }];\n hooks.state = {\n ...asRecord(hooks.state),\n [key]: { enabled: true, trusted_hash: hash },\n };\n\n return {\n cliOverrides: [`hooks=${toTomlInline(hooks)}`, 'features.hooks=true'],\n threadConfig,\n key,\n hash,\n command: COMMAND,\n };\n}\n\nexport function assertTrustedApplyPatchHook({\n response,\n hook,\n}: {\n response: unknown;\n hook: TrustedApplyPatchHook;\n}): void {\n const data = asRecord(response)?.data;\n const entry = Array.isArray(data) && data.length === 1 ? data[0] : null;\n const record = asRecord(entry);\n const matches = Array.isArray(record?.hooks)\n ? record.hooks.filter(item => asRecord(item)?.key === hook.key)\n : [];\n const match = matches.length === 1 ? asRecord(matches[0]) : undefined;\n if (\n !match ||\n match.eventName !== 'preToolUse' ||\n match.handlerType !== 'command' ||\n match.command !== hook.command ||\n match.matcher !== MATCHER ||\n match.currentHash !== hook.hash ||\n match.enabled !== true ||\n match.trustStatus !== 'trusted' ||\n (Array.isArray(record?.errors) && record.errors.length > 0)\n ) {\n throw new Error(\n 'Codex app-server did not load the trusted apply_patch filtering hook.',\n );\n }\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => [key, canonicalize(item)]),\n );\n }\n return value;\n}\n\nfunction toTomlInline(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(toTomlInline).join(',')}]`;\n }\n if (value != null && typeof value === 'object') {\n return `{${Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => `${JSON.stringify(key)}=${toTomlInline(item)}`)\n .join(',')}}`;\n }\n throw new Error('Codex hook configuration contains an unsupported value.');\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n","import type { BridgeEvent } from '@ai-sdk/harness/bridge';\n\ntype Emit = (msg: BridgeEvent) => void;\n\nexport type CodexStepTrackerItem = {\n type: string;\n};\n\nexport type CodexStepTrackerEvent = {\n type: string;\n item?: CodexStepTrackerItem;\n};\n\nexport type CodexStepTracker = {\n observeEvent(input: {\n event: CodexStepTrackerEvent;\n itemId: string | undefined;\n }): void;\n finishTurn(): void;\n};\n\nexport function createCodexStepTracker(input: {\n send: Emit;\n}): CodexStepTracker {\n let stepOpen = false;\n const pendingToolItemIds = new Set<string>();\n\n const finishStep = (): void => {\n if (!stepOpen || pendingToolItemIds.size > 0) return;\n input.send({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n harnessMetadata: { codex: { inferredStep: true } },\n });\n stepOpen = false;\n };\n\n return {\n observeEvent({ event, itemId }) {\n const item = event.item;\n if (!item || !isStepItem(item)) return;\n\n stepOpen = true;\n\n if (isToolStepItem(item)) {\n if (event.type === 'item.started' && itemId) {\n pendingToolItemIds.add(itemId);\n } else if (event.type === 'item.completed') {\n if (itemId) pendingToolItemIds.delete(itemId);\n finishStep();\n }\n }\n },\n finishTurn() {\n pendingToolItemIds.clear();\n finishStep();\n },\n };\n}\n\nfunction isStepItem(item: CodexStepTrackerItem): boolean {\n return isModelStepItem(item) || isToolStepItem(item);\n}\n\nfunction isModelStepItem(item: CodexStepTrackerItem): boolean {\n return item.type === 'reasoning' || item.type === 'agent_message';\n}\n\nfunction isToolStepItem(item: CodexStepTrackerItem): boolean {\n return (\n item.type === 'command_execution' ||\n item.type === 'native_tool' ||\n item.type === 'mcp_tool_call' ||\n item.type === 'dynamic_tool_call' ||\n item.type === 'web_search' ||\n item.type === 'file_change' ||\n item.type === 'todo_list'\n );\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import type { HarnessV1BuiltinToolName } from '@ai-sdk/harness';\nimport type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport type { CodexStepTracker } from './codex-step-tracker';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type CodexItem = {\n type: string;\n id?: string;\n text?: string;\n command?: string;\n exit_code?: number;\n aggregated_output?: string;\n status?: 'in_progress' | 'completed' | 'failed';\n server?: string;\n tool?: string;\n input?: string;\n isError?: boolean;\n arguments?: unknown;\n result?: { content?: unknown; structured_content?: unknown } | unknown;\n error?: { message?: string };\n query?: string;\n action?: {\n query?: string;\n [key: string]: unknown;\n };\n message?: string;\n changes?: ReadonlyArray<{\n path: string;\n kind: 'add' | 'delete' | 'update';\n }>;\n};\n\nexport type CodexEvent = {\n type:\n | 'thread.started'\n | 'turn.completed'\n | 'turn.failed'\n | 'error'\n | 'item.started'\n | 'item.updated'\n | 'item.completed';\n item?: CodexItem;\n usage?: Record<string, number>;\n error?: { message: string };\n message?: string;\n thread_id?: string;\n};\n\n/*\n * Native Codex tool name → cross-harness common name. Tools outside this map\n * (e.g. MCP tools the model invokes by name) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\nconst NATIVE_TO_COMMON: Readonly<Record<string, HarnessV1BuiltinToolName>> = {\n shell: 'bash',\n web_search: 'webSearch',\n};\n\nfunction toCommonName(nativeName: string): HarnessV1BuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nexport function createEmitStreamEvent({\n send,\n stepTracker,\n setTurnUsage,\n setThreadId,\n emitWarning,\n emitError,\n}: {\n send: Emit;\n stepTracker: CodexStepTracker;\n setTurnUsage: (usage: Record<string, unknown>) => void;\n setThreadId: (threadId: string) => void;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n}): (event: CodexEvent) => void {\n const textByItem = new Map<string, string>();\n const reasoningByItem = new Map<string, string>();\n const emittedWebSearchToolCalls = new Set<string>();\n\n return event => {\n if (\n event.type === 'thread.started' &&\n typeof event.thread_id === 'string'\n ) {\n setThreadId(event.thread_id);\n // Announce to the host so it can include the id in resume state.\n send({ type: 'bridge-thread', threadId: event.thread_id });\n }\n if (event.type === 'turn.completed') {\n if (event.usage) setTurnUsage(mapUsage(event.usage));\n stepTracker.finishTurn();\n return;\n }\n if (event.type === 'turn.failed') {\n emitError({\n error: event.error?.message ?? 'codex turn failed',\n message: 'codex turn failed',\n });\n return;\n }\n if (event.type === 'error') {\n emitError({\n error: event.message ?? 'codex error',\n message: 'codex stream error',\n });\n return;\n }\n if (!event.item) return;\n const item = event.item;\n const id = item.id ?? randomUUID();\n const observeStep = (): void => {\n stepTracker.observeEvent({ event, itemId: id });\n };\n\n if (item.type === 'native_tool' && item.tool != null) {\n if (event.type === 'item.started' && item.input != null) {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: item.tool,\n input: item.input,\n providerExecuted: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: item.tool,\n result: item.result,\n ...(item.isError ? { isError: true } : {}),\n });\n }\n stepTracker.observeEvent({ event, itemId: `native-tool:${id}` });\n return;\n }\n\n if (item.type === 'agent_message' && typeof item.text === 'string') {\n /*\n * The presence of `id` in `textByItem` — not the `item.started` event —\n * marks the text part as opened. Codex does not guarantee an\n * `item.started` event carrying text precedes the first `item.updated`\n * with text, so keying the `text-start` off the event type can emit a\n * `text-delta` for a part that was never opened. Opening lazily on the\n * first event with text keeps `text-start` before any `text-delta`.\n */\n if (!textByItem.has(id)) {\n send({ type: 'text-start', id });\n textByItem.set(id, '');\n }\n const last = textByItem.get(id) ?? '';\n const next = item.text;\n if (next.length > last.length) {\n send({ type: 'text-delta', id, delta: next.slice(last.length) });\n textByItem.set(id, next);\n }\n if (event.type === 'item.completed') send({ type: 'text-end', id });\n observeStep();\n return;\n }\n\n if (item.type === 'reasoning' && typeof item.text === 'string') {\n if (!reasoningByItem.has(id)) {\n send({ type: 'reasoning-start', id });\n reasoningByItem.set(id, '');\n }\n const last = reasoningByItem.get(id) ?? '';\n const next = item.text;\n if (next.length > last.length) {\n send({ type: 'reasoning-delta', id, delta: next.slice(last.length) });\n reasoningByItem.set(id, next);\n }\n if (event.type === 'item.completed') send({ type: 'reasoning-end', id });\n observeStep();\n return;\n }\n\n if (item.type === 'command_execution') {\n const nativeName = 'shell';\n if (event.type === 'item.started') {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n nativeName,\n input: JSON.stringify({ command: item.command ?? '' }),\n providerExecuted: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n result: {\n exitCode: item.exit_code ?? null,\n output: item.aggregated_output ?? '',\n status: item.status ?? 'completed',\n },\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'mcp_tool_call') {\n if (event.type === 'item.started') {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: item.tool ?? 'unknown',\n nativeName: item.tool ?? 'unknown',\n input: JSON.stringify(item.arguments ?? {}),\n providerExecuted: true,\n dynamic: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: item.tool ?? 'unknown',\n result: extractMcpToolCallResult(item),\n dynamic: true,\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'web_search') {\n const nativeName = 'web_search';\n const query = getWebSearchQuery(item);\n if (event.type === 'item.started' || event.type === 'item.updated') {\n if (query !== undefined) {\n emitWebSearchToolCall({\n id,\n query,\n nativeName,\n emittedWebSearchToolCalls,\n send,\n });\n }\n } else if (event.type === 'item.completed') {\n emitWebSearchToolCall({\n id,\n query: query ?? '',\n nativeName,\n emittedWebSearchToolCalls,\n send,\n });\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n result: item.result ?? item.action ?? null,\n });\n emittedWebSearchToolCalls.delete(id);\n }\n observeStep();\n return;\n }\n\n if (item.type === 'file_change' && event.type === 'item.completed') {\n for (const change of item.changes ?? []) {\n send({\n type: 'file-change',\n event:\n change.kind === 'add'\n ? 'create'\n : change.kind === 'delete'\n ? 'delete'\n : 'modify',\n path: change.path,\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'error' && event.type === 'item.completed') {\n const message =\n typeof item.message === 'string' && item.message.trim()\n ? item.message\n : 'codex reported a non-fatal error item';\n emitWarning({ message });\n }\n };\n}\n\nfunction getWebSearchQuery(item: CodexItem): string | undefined {\n if (typeof item.query === 'string' && item.query.length > 0) {\n return item.query;\n }\n if (typeof item.action?.query === 'string' && item.action.query.length > 0) {\n return item.action.query;\n }\n}\n\nfunction emitWebSearchToolCall({\n id,\n query,\n nativeName,\n emittedWebSearchToolCalls,\n send,\n}: {\n id: string;\n query: string;\n nativeName: string;\n emittedWebSearchToolCalls: Set<string>;\n send: Emit;\n}): void {\n if (emittedWebSearchToolCalls.has(id)) return;\n emittedWebSearchToolCalls.add(id);\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n nativeName,\n input: JSON.stringify({ query }),\n providerExecuted: true,\n });\n}\n\nfunction extractMcpToolCallResult(item: CodexItem): unknown {\n if (\n item.result === undefined ||\n item.result === null ||\n typeof item.result !== 'object'\n ) {\n return item.error?.message ? { error: item.error.message } : null;\n }\n const result = item.result as {\n content?: unknown;\n structured_content?: unknown;\n };\n if (\n result.structured_content !== undefined &&\n result.structured_content !== null\n ) {\n return result.structured_content;\n }\n return result.content ?? null;\n}\n\nfunction mapUsage(usage: Record<string, number>): Record<string, unknown> {\n const input = usage.input_tokens ?? 0;\n const cacheRead = usage.cached_input_tokens ?? 0;\n const cacheWrite = usage.cache_write_input_tokens ?? 0;\n return {\n inputTokens: {\n total: input,\n noCache: Math.max(0, input - cacheRead - cacheWrite),\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: usage.output_tokens ?? 0,\n text: usage.output_tokens ?? 0,\n },\n };\n}\n","/*\n * This long-running bridge process runs Codex app-server in the sandbox. The\n * shared bridge runtime owns the WebSocket transport, authentication,\n * reconnects, event replay, and lifecycle files; this entry point supplies the\n * Codex-specific turn implementation.\n */\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport type { StartMessage } from '../codex-bridge-protocol';\nimport { createCodexAppServerRuntime } from './codex-app-server-driver';\nimport { createCodexStepTracker, defaultUsage } from './codex-step-tracker';\nimport { createEmitStreamEvent } from './create-emit-stream-event';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = requireArg({ value: args.workdir, name: '--workdir' });\nconst bridgeStateDir = requireArg({\n value: args.bridgeStateDir,\n name: '--bridge-state-dir',\n});\nconst HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;\n\nconst threadState: { id: string | undefined } = { id: undefined };\nconst appServer = createCodexAppServerRuntime();\n\nawait runBridge<StartMessage>({\n bridgeType: 'codex',\n bridgeStateDir,\n onStart: runTurn,\n onStop: async () => {\n const data = threadState.id ? { threadId: threadState.id } : {};\n await appServer.close();\n return data;\n },\n onDestroy: () => appServer.close(),\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n if (start.restartThread) {\n threadState.id = undefined;\n } else if (\n typeof start.resumeThreadId === 'string' &&\n start.resumeThreadId.length > 0\n ) {\n threadState.id = start.resumeThreadId;\n }\n\n const runtime = resolveCodexRuntime({ start });\n let turnUsage: Record<string, unknown> = defaultUsage();\n const stepTracker = createCodexStepTracker({ send: emit });\n const emitStreamEvent = createEmitStreamEvent({\n send: emit,\n stepTracker,\n setTurnUsage: usage => (turnUsage = usage),\n setThreadId: threadId => (threadState.id = threadId),\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n });\n\n try {\n await appServer.runTurn({\n start,\n turn,\n emit,\n workdir,\n threadId: threadState.id,\n codexModel: runtime.codexModel,\n codexConfig: runtime.codexConfig,\n stepTracker,\n emitStreamEvent,\n });\n } catch (error) {\n if (!turn.abortSignal.aborted) {\n turn.emitError({ error, message: 'codex turn failed' });\n }\n return;\n }\n\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage,\n });\n}\n\ntype CodexRuntime = {\n codexConfig: Record<string, unknown>;\n codexModel: string | undefined;\n};\n\nfunction resolveCodexRuntime({ start }: { start: StartMessage }): CodexRuntime {\n const codexConfig: Record<string, unknown> = {\n ...start.codexConfig,\n developer_instructions: [\n start.instructions,\n 'Only respond with your `final` message once you have fully addressed the user request.',\n ]\n .filter((instruction): instruction is string => Boolean(instruction))\n .join('\\n\\n'),\n model_reasoning_summary: 'detailed',\n };\n\n const gatewayBaseUrl = procEnv.AI_GATEWAY_BASE_URL;\n const hasGatewayAuth = Boolean(procEnv.AI_GATEWAY_API_KEY || gatewayBaseUrl);\n if (hasGatewayAuth && !gatewayBaseUrl) {\n throw new Error(\n 'AI Gateway auth was selected but AI_GATEWAY_BASE_URL is missing from the Codex bridge environment.',\n );\n }\n /*\n * The standalone app-server deliberately ignores CODEX_API_KEY for its\n * built-in OpenAI provider. A custom provider with an explicit env_key keeps\n * direct credentials process-local.\n */\n const apiBaseUrl = hasGatewayAuth\n ? gatewayBaseUrl\n : (procEnv.OPENAI_BASE_URL ??\n (procEnv.CODEX_API_KEY != null || start.headers != null\n ? 'https://api.openai.com/v1'\n : undefined));\n const codexModel =\n start.model && hasGatewayAuth && !start.model.includes('/')\n ? `openai/${start.model}`\n : start.model;\n /*\n * AI Gateway only returns populated reasoning summaries for its\n * creator-qualified model IDs. Codex treats qualified IDs as custom model\n * metadata, so its reasoning-summary capability must also be forced on for\n * the OpenAI Gateway route.\n */\n if (hasGatewayAuth && codexModel?.startsWith('openai/')) {\n codexConfig.model_supports_reasoning_summaries = true;\n }\n if (apiBaseUrl) {\n codexConfig.preferred_auth_method = 'apikey';\n codexConfig.model_provider = 'agent_bridge_openai';\n codexConfig.model_providers = {\n agent_bridge_openai: {\n name: procEnv.CODEX_MODEL_PROVIDER_NAME || 'Agent Bridge OpenAI',\n base_url: apiBaseUrl,\n env_key: 'CODEX_API_KEY',\n wire_api: 'responses',\n supports_websockets: false,\n ...(start.headers != null || (hasGatewayAuth && HARNESS_CLIENT_APP)\n ? {\n http_headers: {\n ...start.headers,\n ...(hasGatewayAuth && HARNESS_CLIENT_APP\n ? {\n 'User-Agent': HARNESS_CLIENT_APP,\n 'x-client-app': HARNESS_CLIENT_APP,\n }\n : {}),\n },\n }\n : {}),\n },\n };\n }\n if (start.mcpServers != null) {\n codexConfig.mcp_servers = start.mcpServers;\n }\n return { codexConfig, codexModel };\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: {\n workdir?: string;\n bridgeStateDir?: 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 }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n\nfunction requireArg({\n value,\n name,\n}: {\n value: string | undefined;\n name: string;\n}): string {\n if (!value) {\n emitFatal(`Missing ${name} argument.`);\n }\n return value;\n}\n"],"mappings":"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","names":["bridgeStateDir","pending","createHash","args","asRecord","key","runTurn","workdir","asRecord","createHash","path","randomUUID","procEnv","stdout","args"]}
|
|
1
|
+
{"version":3,"sources":["../../../harness/src/bridge/index.ts","../../../harness/src/bridge/harness-bridge-capability-unsupported-error.ts","../../src/bridge/codex-app-server-driver.ts","../../src/bridge/codex-tool-filtering.ts","../../src/bridge/codex-app-server-client.ts","../../src/bridge/create-app-server-event-handler.ts","../../src/bridge/codex-tool-filtering-hook.ts","../../src/bridge/codex-step-tracker.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/index.ts"],"sourcesContent":["// Shared in-sandbox bridge runtime. Adapter `bridge.mjs` bundles re-bundle\n// this module (tsup inlines it; `ws` stays external and resolves from the\n// sandbox-installed node_modules). It owns everything generic to the bridge\n// transport — the WebSocket server, token auth, the in-memory event log +\n// monotonic `seq`, resume replay, and the lifecycle/meta files. Any number of\n// hosts may be connected; exactly one of them owns the event stream, and\n// `start`/`resume` transfer that ownership. The adapter supplies only `onStart`\n// (drive its CLI/SDK and translate to wire events) and lifecycle cleanup hooks.\n\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { env as procEnv, pid, stdout } from 'node:process';\nimport type { ToolResultPart } from '@ai-sdk/provider-utils';\nimport { WebSocketServer, type WebSocket } from 'ws';\n\nexport { HarnessBridgeCapabilityUnsupportedError } from './harness-bridge-capability-unsupported-error';\n\nexport type BridgeState = 'init' | 'waiting' | 'running' | 'draining' | 'done';\n\n/** Outbound turn event the adapter emits. `seq` is added by the runtime. */\nexport type BridgeEvent = Record<string, unknown> & { type: string };\n\nexport type BridgeDebugLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport interface Experimental_BridgeUserMessage {\n readonly messageId: string;\n readonly text: string;\n accept(): void;\n reject(error: unknown): void;\n}\n\nexport interface Experimental_BridgeUserMessageQueue extends AsyncIterable<Experimental_BridgeUserMessage> {\n readonly pendingCount: number;\n close(error?: unknown): void;\n}\n\ntype InternalBridgeUserMessageQueue = Experimental_BridgeUserMessageQueue & {\n enqueue(input: { messageId: string; text: string }): void;\n};\n\ntype BridgeUserMessageResponse = {\n type: 'user-message-response';\n messageId: string;\n accepted: boolean;\n error?: { message: string };\n};\n\n/**\n * Per-session diagnostics config. The host resolves it from settings +\n * env and sends it on `start.debug`; the bridge gates console capture and\n * structured `debug-event`s on it. When disabled, nothing is captured or\n * emitted and no `seq` is consumed.\n */\nexport interface BridgeDebugConfig {\n enabled?: boolean;\n level?: BridgeDebugLevel;\n subsystems?: string[];\n}\n\nconst DEBUG_LEVEL_WEIGHT: Record<BridgeDebugLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(\n filters: string[] | undefined,\n subsystem: string,\n): boolean {\n if (!filters || filters.length === 0) return true;\n return filters.some(\n filter => subsystem === filter || subsystem.startsWith(`${filter}.`),\n );\n}\n\nfunction formatBridgeError(err: unknown): {\n name?: string;\n message: string;\n stack?: string;\n} {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n if (typeof err === 'string') {\n return { message: err };\n }\n if (err !== null && typeof err === 'object') {\n try {\n return { message: JSON.stringify(err) };\n } catch {}\n }\n return { message: String(err) };\n}\n\nfunction createBridgeUserMessageQueue(options: {\n respond(response: BridgeUserMessageResponse): void;\n}): InternalBridgeUserMessageQueue {\n const messages: Experimental_BridgeUserMessage[] = [];\n const waiters: Array<\n (result: IteratorResult<Experimental_BridgeUserMessage>) => void\n > = [];\n const entries = new Map<\n string,\n {\n response?: BridgeUserMessageResponse;\n reject(error: unknown): void;\n }\n >();\n let closed = false;\n let pendingCount = 0;\n\n const enqueue = (input: { messageId: string; text: string }): void => {\n const existing = entries.get(input.messageId);\n if (existing != null) {\n if (existing.response != null) {\n options.respond(existing.response);\n }\n return;\n }\n\n let settled = false;\n const settle = (response: BridgeUserMessageResponse): void => {\n if (settled) return;\n settled = true;\n pendingCount--;\n const entry = entries.get(input.messageId);\n if (entry != null) entry.response = response;\n options.respond(response);\n };\n const message: Experimental_BridgeUserMessage = {\n messageId: input.messageId,\n text: input.text,\n accept: () => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: true,\n });\n },\n reject: error => {\n settle({\n type: 'user-message-response',\n messageId: input.messageId,\n accepted: false,\n error: { message: formatBridgeError(error).message },\n });\n },\n };\n entries.set(input.messageId, {\n reject: message.reject,\n });\n pendingCount++;\n\n if (closed) {\n message.reject(\n new Error('The bridge turn is no longer accepting user messages.'),\n );\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter != null) {\n waiter({ done: false, value: message });\n } else {\n messages.push(message);\n }\n };\n\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n const reason =\n error ??\n new Error('The bridge turn ended before accepting the user message.');\n for (const entry of entries.values()) {\n if (entry.response == null) entry.reject(reason);\n }\n messages.length = 0;\n while (waiters.length > 0) {\n waiters.shift()!({ done: true, value: undefined });\n }\n };\n\n return {\n get pendingCount() {\n return pendingCount;\n },\n enqueue,\n close,\n [Symbol.asyncIterator]() {\n return {\n next: () => {\n const message = messages.shift();\n if (message != null) {\n return Promise.resolve({ done: false as const, value: message });\n }\n if (closed) {\n return Promise.resolve({\n done: true as const,\n value: undefined,\n });\n }\n return new Promise<IteratorResult<Experimental_BridgeUserMessage>>(\n resolve => {\n waiters.push(resolve);\n },\n );\n },\n };\n },\n };\n}\n\nfunction parseEnvList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\n/**\n * Per-turn surface handed to {@link RunBridgeOptions.onStart}. The adapter\n * drives its runtime against these primitives; the runtime owns the transport.\n */\nexport interface BridgeTurn {\n /**\n * Emit a turn event to the host. Stamps a monotonic `seq`, appends to the\n * in-memory replay log, and sends to the live socket (best-effort — if the\n * host is mid-reconnect the event waits in the log and is replayed on\n * resume).\n */\n emit(event: BridgeEvent): void;\n\n /**\n * Register interest in a host-executed tool result and resolve when the\n * matching `tool-result` arrives. The adapter emits the `tool-call` event\n * itself (via {@link emit}) using the same `toolCallId`.\n */\n requestToolResult(\n input:\n | string\n | {\n toolCallId: string;\n matches?: (result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n },\n ): Promise<{\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }>;\n\n /**\n * Register interest in a host approval decision and resolve when the matching\n * `tool-approval-response` arrives. The adapter emits the\n * `tool-approval-request` event itself using the same `approvalId`.\n */\n requestToolApproval(\n approvalId: string,\n ): Promise<{ approved: boolean; reason?: string }>;\n\n readonly experimental_userMessages: Experimental_BridgeUserMessageQueue;\n\n /** Aborts when the host sends `abort`. */\n readonly abortSignal: AbortSignal;\n\n /** True for the first turn since this bridge process started. */\n readonly firstTurn: boolean;\n\n /**\n * Emit a structured diagnostic. Gated by the session's debug level +\n * subsystem filter; a no-op when diagnostics are disabled. Adapters use this\n * for runtime-level instrumentation; raw `console.*` output is captured and\n * forwarded automatically.\n */\n bridgeLog(input: {\n level?: BridgeDebugLevel;\n subsystem: string;\n message: string;\n attrs?: Record<string, unknown>;\n error?: unknown;\n }): void;\n\n /**\n * Emit a non-fatal bridge warning to stderr using the runtime's harness\n * prefix. This is diagnostic-only: it does not emit a stream event, does not\n * consume a `seq`, and does not fail the turn.\n */\n emitWarning(input: { message: string }): void;\n\n emitError(input: { error: unknown; message?: string }): void;\n}\n\nexport interface RunBridgeOptions<TStart extends { type: 'start' }> {\n /** Identifier written into `bridge-meta.json` (`'claude-code'` / `'codex'`). */\n bridgeType: string;\n /** Directory for `bridge-meta.json` / `start-config.json`. Created if absent. */\n bridgeStateDir: string;\n /**\n * Drive one prompt turn. Rejections surface to the host as an `error`\n * event.\n *\n * Contract: once `turn.abortSignal` fires, wind down promptly — turns are\n * serialized, and a replacement `start` waits up to\n * {@link turnTeardownGraceMs} for this promise to settle before it\n * proceeds anyway.\n */\n onStart(start: TStart, turn: BridgeTurn): Promise<void>;\n /**\n * How long a replacement `start` waits for the previous turn's teardown\n * after aborting it, in milliseconds. Turns are serialized so an aborted\n * turn cannot emit into its replacement's event log or overlap its runtime\n * process — but only within this bound: an adapter that does not settle\n * `onStart` after its abort signal fires forfeits the protection for that\n * boundary, and the new turn proceeds anyway rather than blocking forever.\n * The default of ten seconds exceeds the Claude bridge's five-second\n * hard-abort fallback.\n */\n turnTeardownGraceMs?: number;\n /**\n * Produce the adapter-defined runtime resume data for `stop`. Defaults to\n * `{}`.\n */\n onStop?(): unknown | Promise<unknown>;\n /**\n * Perform adapter-defined destruction before the bridge exits.\n */\n onDestroy?(): void | Promise<void>;\n /** WS port. Defaults to `BRIDGE_WS_PORT` env (0 = OS-assigned). */\n port?: number;\n /** Auth token. Defaults to `BRIDGE_CHANNEL_TOKEN` env. */\n token?: string;\n /** Called with the bound port once the server is listening. */\n onListening?(port: number): void;\n /**\n * Tear the process down after `stop` / `destroy`. Defaults to closing\n * the server and calling `process.exit(0)`. Overridable for tests.\n */\n onExit?(): void;\n}\n\ntype InboundControl =\n | {\n type: 'tool-result';\n toolCallId: string;\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }\n | {\n type: 'tool-approval-response';\n approvalId: string;\n approved: boolean;\n reason?: string;\n }\n | { type: 'user-message'; messageId?: string; text: string }\n | { type: 'abort' }\n | { type: 'stop' }\n | { type: 'destroy' }\n | { type: 'resume'; lastSeenEventId: number };\n\nconst WS_OPEN = 1;\n\n/**\n * Boot the bridge: bind the WebSocket server, announce `bridge-ready`, and\n * service host connections for the lifetime of the process. Resolves once the\n * server is listening; the process then stays alive on the server until a\n * `stop` / `destroy` exits it.\n */\nexport interface BridgeHandle {\n /** The port the WebSocket server bound to. */\n readonly port: number;\n /** Close the WebSocket server. Does not call `process.exit`. */\n close(): Promise<void>;\n}\n\nexport async function runBridge<TStart extends { type: 'start' }>(\n options: RunBridgeOptions<TStart>,\n): Promise<BridgeHandle> {\n const { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n const teardownGraceMs = options.turnTeardownGraceMs ?? 10_000;\n const expectedToken = options.token ?? procEnv.BRIDGE_CHANNEL_TOKEN ?? '';\n const bridgeWsPort =\n options.port ?? parseInt(procEnv.BRIDGE_WS_PORT ?? '0', 10);\n\n const bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n const startConfigPath = `${bridgeStateDir}/start-config.json`;\n const rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n const eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\n try {\n await mkdir(bridgeStateDir, { recursive: true });\n } catch {\n // Best-effort; the bridge still runs without its state files.\n }\n\n // ─── mutable runtime state ──────────────────────────────────────────\n let currentBoundPort = 0;\n let currentTurnState: BridgeState = 'init';\n /*\n * The one connection turn events stream to. A socket claims it by asking for\n * work — `start` (a turn) or `resume` (a catch-up) — never by connecting:\n * every event goes here alone, so claiming on connect would silence a turn\n * already streaming to someone else. Any number of sockets may be connected;\n * the others still exchange control frames, they just get no events.\n */\n let activeSocket: WebSocket | undefined;\n let isFirstTurn = true;\n let turnAbort: AbortController | undefined;\n let currentUserMessages: InternalBridgeUserMessageQueue | undefined;\n /**\n * Settles when the in-flight turn has fully wound down — `onStart`\n * returned or threw AND its completion state was recorded. `undefined`\n * between turns. A new `start` fences on this so turns never overlap.\n */\n let activeTurn: Promise<void> | undefined;\n\n // Diagnostics. Resolved per turn from `start.debug` with a sandbox-side\n // env fallback; gates console capture + structured `debug-event`s.\n let debugConfig: BridgeDebugConfig | undefined;\n let consoleCaptureInstalled = false;\n const envDebugEnabled = ENV_TRUTHY.has(\n (procEnv.HARNESS_DEBUG ?? '').toLowerCase(),\n );\n\n // Replay log. `seq` is monotonic across the whole process — never reset —\n // because the host's `SandboxChannel` cursor (`lastSeenEventId`) lives across\n // turns. The log *contents* are cleared at the start of each turn to bound\n // memory; the just-finished turn stays replayable until the next `start`.\n let seqCounter = 0;\n let eventLog: Array<{ seq: number; line: string }> = [];\n\n /*\n * Disk mirror of the in-memory replay log. The in-memory log is lost when the\n * bridge process dies; the on-disk `event-log.ndjson` survives in the sandbox\n * filesystem so a respawned bridge (started with `BRIDGE_REPLAY_FROM_DISK=1`)\n * can reload the in-flight turn and serve a host's resume cursor —\n * `replay` recovery. Writes are batched on `setImmediate` (single-flight via\n * `flushPromise`) to keep `emit` off the disk hot path.\n */\n let diskBuffer = '';\n let flushPromise: Promise<void> | null = null;\n\n const flushEventsToDisk = async (): Promise<void> => {\n while (diskBuffer.length > 0) {\n const buf = diskBuffer;\n diskBuffer = '';\n await appendFile(eventLogPath, buf).catch(() => {\n // Best-effort crash-recovery mirror; the in-memory log is the source of\n // truth for the live connection.\n });\n }\n };\n\n const scheduleEventFlush = (): void => {\n if (flushPromise) return;\n flushPromise = new Promise<void>(resolve => {\n setImmediate(() => {\n void flushEventsToDisk().finally(resolve);\n });\n }).finally(() => {\n flushPromise = null;\n if (diskBuffer.length > 0) {\n scheduleEventFlush();\n }\n });\n };\n\n const flushPendingEventsToDisk = async (): Promise<void> => {\n if (diskBuffer.length > 0 && !flushPromise) {\n scheduleEventFlush();\n }\n // Await each in-flight flush, re-reading `flushPromise` after every await\n // since a fresh flush may have been scheduled for buffer that arrived while\n // we waited.\n let inFlight = flushPromise;\n while (inFlight) {\n await inFlight;\n inFlight = flushPromise;\n }\n };\n\n /*\n * When respawned for `replay`, reload the previous turn's log from disk before\n * accepting any connection so the very first `resume{lastSeenEventId}` can be\n * served the tail (including the terminal `finish`). The seq counter is\n * restored to the last persisted seq so it stays aligned with the host's\n * long-lived cursor. The file is NOT truncated in this mode — only a fresh\n * `start` (next turn) clears it.\n */\n const replayFromDisk = procEnv.BRIDGE_REPLAY_FROM_DISK === '1';\n if (replayFromDisk && existsSync(eventLogPath)) {\n try {\n const lines = readFileSync(eventLogPath, 'utf8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n eventLog = lines.map(line => ({\n seq: (JSON.parse(line) as { seq: number }).seq,\n line,\n }));\n seqCounter = eventLog.at(-1)?.seq ?? 0;\n } catch {\n // Corrupt/partial log: fall back to an empty log; the host then degrades\n // to `rerun` instead of replaying a malformed tail.\n eventLog = [];\n seqCounter = 0;\n }\n }\n\n const pendingToolResults = new Map<\n string,\n {\n resolve: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => void;\n matches?: (output: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n }) => boolean;\n }\n >();\n const bufferedToolResults: Array<{\n toolCallId: string;\n result: {\n output: unknown;\n isError?: boolean;\n toolResult?: ToolResultPart;\n };\n }> = [];\n const pendingToolApprovals = new Map<\n string,\n (response: { approved: boolean; reason?: string }) => void\n >();\n\n // ─── persistence (best-effort meta + start config) ──────────────────\n const writeBridgeMeta = async (state: BridgeState): Promise<void> => {\n try {\n await writeFile(\n bridgeMetaPath,\n JSON.stringify({\n type: bridgeType,\n port: currentBoundPort,\n state,\n pid,\n }),\n );\n } catch {\n // Best-effort resilience metadata; not load-bearing for the active turn.\n }\n };\n\n const writeStartConfig = async (start: unknown): Promise<void> => {\n try {\n const serialized = JSON.stringify(start);\n await writeFile(startConfigPath, serialized);\n // Frozen copy: written once, restored over start-config.json by future\n // rerun-mode recovery to re-run the original turn from scratch.\n if (!existsSync(rerunStartConfigPath)) {\n await writeFile(rerunStartConfigPath, serialized);\n }\n } catch {\n // Best-effort.\n }\n };\n\n // ─── wire send + replay ─────────────────────────────────────────────\n const emit = (event: BridgeEvent): void => {\n const seq = ++seqCounter;\n const line = JSON.stringify({ ...event, seq });\n eventLog.push({ seq, line });\n diskBuffer += `${line}\\n`;\n scheduleEventFlush();\n if (activeSocket?.readyState === WS_OPEN) {\n try {\n activeSocket.send(line);\n } catch {\n // Send is best-effort: a dropped socket leaves the event in the log,\n // replayed once the host reconnects and sends `resume`.\n }\n }\n };\n\n const replay = (ws: WebSocket, afterSeq: number): void => {\n for (const entry of eventLog) {\n if (entry.seq > afterSeq && ws.readyState === WS_OPEN) {\n ws.send(entry.line);\n }\n }\n };\n\n // ─── diagnostics ──────────────────────────────────────────────\n const shouldEmitDebugEvent = (\n level: BridgeDebugLevel,\n subsystem: string,\n ): boolean => {\n if (!debugConfig?.enabled) return false;\n const threshold = debugConfig.level ?? 'debug';\n if (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n return subsystemMatches(debugConfig.subsystems, subsystem);\n };\n\n /*\n * Forward sandbox console output. We line-buffer the original writers (kept so\n * output still reaches the real fds) and emit one `sandbox-log` per complete\n * line. `emit` never writes to stdout/stderr, so there is no recursion.\n * Installed lazily the first time a turn enables diagnostics; once installed,\n * capture is gated per-write on `debugConfig.enabled` so a later turn can\n * disable it. Console capture is independent of the subsystem/level filter.\n */\n const rawStdoutWrite = process.stdout.write.bind(process.stdout);\n const rawStderrWrite = process.stderr.write.bind(process.stderr);\n\n const writeErrorToStderr = (input: {\n message: string;\n error: unknown;\n }): void => {\n try {\n const formatted = formatBridgeError(input.error);\n rawStderrWrite(\n `[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`,\n );\n if (formatted.stack) {\n rawStderrWrite(`${formatted.stack}\\n`);\n }\n } catch {}\n };\n\n const emitWarning = (input: { message: string }): void => {\n try {\n for (const line of input.message.split('\\n')) {\n if (line.trim().length > 0) {\n rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n }\n }\n } catch {}\n };\n\n const emitError = (input: { error: unknown; message?: string }): void => {\n writeErrorToStderr({\n message: input.message ?? 'bridge error',\n error: input.error,\n });\n emit({ type: 'error', error: serialiseError(input.error) });\n };\n\n const installConsoleCapture = (): void => {\n if (consoleCaptureInstalled) return;\n consoleCaptureInstalled = true;\n const buffers: { stdout: string; stderr: string } = {\n stdout: '',\n stderr: '',\n };\n const patch =\n (stream: 'stdout' | 'stderr', raw: typeof process.stdout.write) =>\n (chunk: unknown, encoding?: unknown, cb?: unknown): boolean => {\n if (debugConfig?.enabled) {\n try {\n const enc = typeof encoding === 'string' ? encoding : 'utf8';\n const text =\n typeof chunk === 'string'\n ? chunk\n : Buffer.from(chunk as Uint8Array).toString(\n enc as BufferEncoding,\n );\n const combined = buffers[stream] + text.replace(/\\r\\n/g, '\\n');\n const parts = combined.split('\\n');\n buffers[stream] = parts.pop() ?? '';\n for (const line of parts) {\n const trimmed = line.replace(/\\s+$/, '');\n if (trimmed) {\n emit({\n type: 'sandbox-log',\n source: bridgeType,\n stream,\n line: trimmed,\n });\n }\n }\n } catch {\n // Never let capture break real output.\n }\n }\n return (raw as (c: unknown, e?: unknown, cb?: unknown) => boolean)(\n chunk,\n encoding,\n cb,\n );\n };\n process.stdout.write = patch(\n 'stdout',\n rawStdoutWrite,\n ) as typeof process.stdout.write;\n process.stderr.write = patch(\n 'stderr',\n rawStderrWrite,\n ) as typeof process.stderr.write;\n };\n\n // ─── inbound routing ────────────────────────────────────────────────\n const handleInbound = async (\n msg: TStart | InboundControl,\n ws: WebSocket,\n ): Promise<void> => {\n switch (msg.type) {\n case 'start': {\n /*\n * A new turn replaces the active one — but only after the active one\n * has fully wound down. Inbound frames are dispatched concurrently,\n * and the host settles a caller abort immediately, so a retry's\n * `start` can arrive while the aborted turn is still tearing down\n * (e.g. a graceful interrupt). Without this fence the old turn would\n * keep emitting into the new turn's cleared event log, two runtime\n * processes would run side by side, and the old turn's completion\n * would mark the bridge `waiting` underneath the new turn. Abort the\n * old turn to hasten its teardown; adapters are expected to bound\n * that teardown themselves (e.g. a hard-abort fallback), but the\n * runtime does not rely on it: the wait is capped by the teardown\n * grace period, after which the new turn proceeds anyway — the\n * pre-fence overlapping behavior — rather than hanging behind a\n * teardown that never settles.\n */\n for (;;) {\n const pendingTurn = activeTurn;\n if (pendingTurn == null) break;\n turnAbort?.abort();\n currentUserMessages?.close(\n new Error('A new bridge turn replaced the active turn.'),\n );\n let graceTimer: ReturnType<typeof setTimeout> | undefined;\n const settled = await Promise.race([\n pendingTurn.then(() => true as const),\n new Promise<false>(resolve => {\n graceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n graceTimer.unref?.();\n }),\n ]);\n clearTimeout(graceTimer);\n if (!settled) break;\n }\n let turnFinished!: () => void;\n const thisTurn = new Promise<void>(resolve => (turnFinished = resolve));\n activeTurn = thisTurn;\n activeSocket = ws; // asking for a turn claims the event stream\n const firstTurn = isFirstTurn;\n isFirstTurn = false;\n eventLog = []; // clear previous turn; keep seqCounter monotonic\n // Mirror the in-memory clear to disk: the log tracks only the current\n // turn. Discard any unflushed tail from the prior turn first.\n diskBuffer = '';\n void writeFile(eventLogPath, '').catch(() => {});\n turnAbort = new AbortController();\n currentTurnState = 'running';\n void writeStartConfig(msg);\n void writeBridgeMeta('running');\n const startDebug = (msg as { debug?: BridgeDebugConfig }).debug;\n debugConfig = {\n enabled: startDebug?.enabled ?? envDebugEnabled,\n level:\n startDebug?.level ??\n (procEnv.HARNESS_DEBUG_LEVEL as BridgeDebugLevel | undefined),\n subsystems:\n startDebug?.subsystems ??\n parseEnvList(procEnv.HARNESS_DEBUG_SUBSYSTEMS),\n };\n if (debugConfig.enabled) {\n installConsoleCapture();\n }\n const userMessages = createBridgeUserMessageQueue({ respond: emit });\n const turn: BridgeTurn = {\n emit,\n requestToolResult: requestInput => {\n const request =\n typeof requestInput === 'string'\n ? { toolCallId: requestInput }\n : requestInput;\n const bufferedIndex = bufferedToolResults.findIndex(\n buffered =>\n buffered.toolCallId === request.toolCallId ||\n request.matches?.(buffered.result) === true,\n );\n if (bufferedIndex >= 0) {\n return Promise.resolve(\n bufferedToolResults.splice(bufferedIndex, 1)[0].result,\n );\n }\n return new Promise(resolve => {\n pendingToolResults.set(request.toolCallId, {\n resolve,\n matches: request.matches,\n });\n });\n },\n requestToolApproval: approvalId =>\n new Promise(resolve => {\n pendingToolApprovals.set(approvalId, resolve);\n }),\n experimental_userMessages: userMessages,\n abortSignal: turnAbort.signal,\n firstTurn,\n bridgeLog: input => {\n const level = input.level ?? 'debug';\n if (!shouldEmitDebugEvent(level, input.subsystem)) return;\n emit({\n type: 'debug-event',\n level,\n subsystem: input.subsystem,\n message: input.message,\n ...(input.attrs ? { attrs: input.attrs } : {}),\n ...(input.error !== undefined\n ? { error: formatBridgeError(input.error) }\n : {}),\n });\n },\n emitWarning,\n emitError,\n };\n currentUserMessages = userMessages;\n try {\n await onStart(msg as TStart, turn);\n } catch (err) {\n emitError({ error: err, message: 'bridge turn failed' });\n } finally {\n userMessages.close();\n if (currentUserMessages === userMessages) {\n currentUserMessages = undefined;\n }\n // Only the still-active turn records completion: after a fence\n // timeout a replacement turn is already running, and this stale\n // completion must not mark the bridge waiting underneath it.\n if (activeTurn === thisTurn) {\n activeTurn = undefined;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n }\n turnFinished();\n }\n return;\n }\n case 'tool-result': {\n const result = {\n output: msg.output,\n isError: msg.isError,\n toolResult: msg.toolResult,\n };\n const exactPending = pendingToolResults.get(msg.toolCallId);\n const matchingPending =\n exactPending == null\n ? Array.from(pendingToolResults.entries()).find(\n ([, pending]) => pending.matches?.(result) === true,\n )\n : undefined;\n const pending = exactPending ?? matchingPending?.[1];\n const pendingId =\n exactPending != null ? msg.toolCallId : matchingPending?.[0];\n if (pending != null && pendingId != null) {\n pendingToolResults.delete(pendingId);\n pending.resolve(result);\n } else {\n bufferedToolResults.push({\n toolCallId: msg.toolCallId,\n result,\n });\n }\n return;\n }\n case 'tool-approval-response': {\n const resolver = pendingToolApprovals.get(msg.approvalId);\n if (resolver) {\n pendingToolApprovals.delete(msg.approvalId);\n resolver({ approved: msg.approved, reason: msg.reason });\n }\n return;\n }\n case 'user-message': {\n const messageId = msg.messageId ?? randomUUID();\n if (currentUserMessages == null) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: { message: 'The bridge has no active turn to steer.' },\n });\n return;\n }\n if (ws !== activeSocket) {\n sendControl(ws, {\n type: 'user-message-response',\n messageId,\n accepted: false,\n error: {\n message: 'The connection does not own the active bridge turn.',\n },\n });\n return;\n }\n currentUserMessages.enqueue({\n messageId,\n text: msg.text,\n });\n return;\n }\n case 'abort':\n turnAbort?.abort();\n return;\n case 'resume':\n activeSocket = ws; // asking for a catch-up claims it too\n // Synchronous, so no event can slip out live ahead of the replayed tail.\n replay(ws, msg.lastSeenEventId);\n return;\n case 'destroy':\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n await onDestroy?.();\n drainThenExit(ws, 1000, 'destroy');\n return;\n case 'stop': {\n currentTurnState = 'done';\n void writeBridgeMeta('done');\n const data = (await onStop?.()) ?? {};\n sendControl(ws, { type: 'bridge-stop', data });\n drainThenExit(ws, 1000, 'stop');\n }\n }\n };\n\n // ─── server ─────────────────────────────────────────────────────────\n void writeBridgeMeta('init');\n\n const wss = new WebSocketServer({ port: bridgeWsPort, host: '0.0.0.0' });\n\n const exit = (): void => {\n if (options.onExit) {\n options.onExit();\n return;\n }\n wss.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000).unref();\n };\n\n const drainThenExit = (ws: WebSocket, code: number, reason: string): void => {\n const start = Date.now();\n const tick = (): void => {\n const drained = ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN;\n if (drained || Date.now() - start >= 5_000) {\n // Flush the on-disk log so a clean stop/destroy leaves a complete\n // event-log.ndjson for any later replay recovery.\n void flushPendingEventsToDisk().finally(() => {\n try {\n ws.close(code, reason);\n } finally {\n exit();\n }\n });\n return;\n }\n setTimeout(tick, 10).unref();\n };\n tick();\n };\n\n wss.on('listening', () => {\n const addr = wss.address();\n currentBoundPort = typeof addr === 'object' && addr ? addr.port : 0;\n currentTurnState = 'waiting';\n void writeBridgeMeta('waiting');\n stdout.write(\n JSON.stringify({\n type: 'bridge-ready',\n port: currentBoundPort,\n }) + '\\n',\n );\n options.onListening?.(currentBoundPort);\n });\n\n wss.on('connection', (ws: WebSocket, req: { url?: string }) => {\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.searchParams.get('agent_bridge_token') !== expectedToken) {\n ws.close(1008, 'unauthorized');\n return;\n }\n\n // Announce liveness the instant we accept. Some sandbox runtimes complete\n // the host-side WS handshake before the connection is forwarded here; the\n // host waits for this frame before sending `start`/`resume`.\n sendControl(ws, {\n type: 'bridge-hello',\n state: currentTurnState,\n lastSeq: seqCounter,\n capabilities: { experimental_userMessageResponses: true },\n });\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n let parsed: TStart | InboundControl;\n try {\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n parsed = JSON.parse(text) as TStart | InboundControl;\n } catch (err) {\n sendControl(ws, {\n type: 'error',\n error: `protocol parse error: ${(err as Error).message}`,\n });\n return;\n }\n void handleInbound(parsed, ws);\n });\n\n ws.on('close', () => {\n // Only the stream owner's close matters; a socket that never claimed it,\n // or that a later `start`/`resume` displaced, closes as a no-op.\n // Crucially we do NOT abort the in-flight turn: it keeps running and its\n // events accumulate in the log for replay on reconnect.\n if (activeSocket === ws) {\n activeSocket = undefined;\n }\n });\n\n ws.on('error', () => {\n // 'close' follows; nothing to do beyond keeping the process alive.\n });\n });\n\n // Surface bridge-internal crashes to the host instead of dying silently.\n process.on('uncaughtException', err => {\n emitError({ error: err, message: 'uncaught exception' });\n });\n process.on('unhandledRejection', err => {\n emitError({ error: err, message: 'unhandled rejection' });\n });\n\n await new Promise<void>((resolve, reject) => {\n if (wss.address() != null) {\n resolve();\n return;\n }\n\n wss.once('listening', resolve);\n wss.once('error', reject);\n });\n\n return {\n port: currentBoundPort,\n close: () =>\n new Promise<void>(resolve => {\n wss.close(() => resolve());\n }),\n };\n}\n\n/*\n * Control frames answer the socket that sent the frame they reply to, so the\n * target is always explicit. Event streaming is the separate, stateful path\n * (`emit` → `activeSocket`); this one carries no state at all.\n */\nfunction sendControl(\n socket: WebSocket | undefined,\n message: Record<string, unknown>,\n): void {\n if (socket?.readyState === WS_OPEN) {\n try {\n socket.send(JSON.stringify(message));\n } catch {\n // best-effort\n }\n }\n}\n\nfunction serialiseError(err: unknown): unknown {\n if (err instanceof Error) {\n return { name: err.name, message: err.message, stack: err.stack };\n }\n return err;\n}\n","const name = 'AI_HarnessBridgeCapabilityUnsupportedError';\n\n/**\n * Signals an unsupported capability discovered inside a sandbox bridge.\n * `isInstance` also recognizes the serialized error shape received by the\n * host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n */\nexport class HarnessBridgeCapabilityUnsupportedError extends Error {\n readonly harnessId?: string;\n readonly cause?: unknown;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super(message);\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n this.cause = cause;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessBridgeCapabilityUnsupportedError {\n return (\n error != null &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === name &&\n 'message' in error &&\n typeof error.message === 'string'\n );\n }\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport { createHash } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\nimport type { StartMessage } from '../codex-bridge-protocol';\nimport { resolveCodexBuiltinToolPolicy } from './codex-tool-filtering';\nimport {\n CodexAppServerClient,\n type CodexAppServerRequest,\n} from './codex-app-server-client';\nimport {\n createAppServerEventHandler,\n type AppServerTurnResult,\n} from './create-app-server-event-handler';\nimport type { CodexStepTracker } from './codex-step-tracker';\nimport type { CodexEvent } from './create-emit-stream-event';\nimport { isDeepStrictEqual } from 'node:util';\nimport {\n assertTrustedApplyPatchHook,\n createTrustedApplyPatchHook,\n} from './codex-tool-filtering-hook';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nconst CODEX_CLI_PATH = fileURLToPath(\n new URL('./node_modules/@openai/codex/bin/codex.js', import.meta.url),\n);\n\ntype RunTurnOptions = {\n start: StartMessage;\n turn: BridgeTurn;\n emit: Emit;\n workdir: string;\n threadId: string | undefined;\n codexModel: string | undefined;\n codexConfig: Record<string, unknown>;\n stepTracker: CodexStepTracker;\n emitStreamEvent: (event: CodexEvent) => void;\n};\n\ntype ActiveTurn = {\n threadId: string | undefined;\n turnId: string | undefined;\n handler: ReturnType<typeof createAppServerEventHandler>;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n options: RunTurnOptions;\n fail(error: unknown): void;\n};\n\nexport function createCodexAppServerRuntime(): {\n runTurn(options: RunTurnOptions): Promise<void>;\n close(): Promise<void>;\n} {\n let client: CodexAppServerClient | undefined;\n let loadedThreadId: string | undefined;\n let loadedConfig: Record<string, unknown> | undefined;\n let activeTurn: ActiveTurn | undefined;\n\n const close = async (): Promise<void> => {\n const previous = client;\n client = undefined;\n loadedThreadId = undefined;\n loadedConfig = undefined;\n await previous?.close();\n };\n\n const runTurn = async (options: RunTurnOptions): Promise<void> => {\n const { start, turn, emit, workdir, threadId, codexModel, codexConfig } =\n options;\n if (activeTurn != null) throw new Error('A Codex turn is already active.');\n const toolPolicy = resolveCodexBuiltinToolPolicy({\n builtinToolFiltering: start.builtinToolFiltering,\n webSearch: start.webSearch,\n });\n const trustedHook = toolPolicy.denyApplyPatchWithHook\n ? createTrustedApplyPatchHook({ codexConfig })\n : undefined;\n const nextConfig = {\n ...(trustedHook?.threadConfig ?? codexConfig),\n web_search: toolPolicy.webSearchMode,\n ...(toolPolicy.disabled.bash || toolPolicy.disabled.view_image\n ? {\n features: {\n ...asRecord(codexConfig.features),\n ...(toolPolicy.disabled.bash ? { shell_tool: false } : {}),\n ...(toolPolicy.disabled.view_image ? { view_image: false } : {}),\n },\n }\n : {}),\n };\n const processConfig = {\n thread: nextConfig,\n cliOverrides: trustedHook?.cliOverrides ?? [],\n };\n if (client != null && !isDeepStrictEqual(loadedConfig, processConfig)) {\n await close();\n }\n const handler = createAppServerEventHandler({\n stepTracker: options.stepTracker,\n emitStreamEvent: options.emitStreamEvent,\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n });\n const dynamicTools = createDynamicTools(start.tools ?? []);\n let rejectProtocolFailure: (error: unknown) => void = () => {};\n const protocolFailure = new Promise<never>((_, reject) => {\n rejectProtocolFailure = reject;\n });\n const currentTurn: ActiveTurn = {\n threadId,\n turnId: undefined,\n handler,\n dynamicTools,\n options,\n fail: rejectProtocolFailure,\n };\n activeTurn = currentTurn;\n let initialized = false;\n if (client == null) {\n const created = new CodexAppServerClient({\n executable: process.execPath,\n args: createCodexAppServerArgs({\n cliOverrides: trustedHook?.cliOverrides,\n }),\n cwd: workdir,\n env: process.env,\n onNotification: notification => {\n if (client !== created || activeTurn == null) return;\n const params = asRecord(notification.params);\n if (\n notification.method === 'turn/started' &&\n params?.threadId === activeTurn.threadId &&\n activeTurn.turnId == null\n ) {\n const turnId = asRecord(params?.turn)?.id;\n if (typeof turnId === 'string') activeTurn.turnId = turnId;\n }\n activeTurn.handler.handle(notification);\n },\n onRequest: request => {\n const active = activeTurn;\n const params = asRecord(request.params);\n if (\n client !== created ||\n active == null ||\n params?.threadId !== active.threadId ||\n params?.turnId !== active.turnId ||\n active.turnId == null\n ) {\n return Promise.reject(\n new Error(\n 'Codex app-server requested a tool for an inactive turn.',\n ),\n );\n }\n return handleAppServerRequest({\n request,\n dynamicTools: active.dynamicTools,\n emit: active.options.emit,\n requestToolResult: active.options.turn.requestToolResult,\n }).catch(error => {\n active.fail(error);\n throw error;\n });\n },\n onStderr: text => {\n const message = text.trim();\n if (message.length > 0) {\n activeTurn?.options.turn.bridgeLog({\n level: 'debug',\n subsystem: 'codex.app-server.stderr',\n message,\n });\n }\n },\n });\n client = created;\n loadedConfig = processConfig;\n initialized = true;\n }\n const runningClient = client;\n const clientFailure = runningClient.waitUntilFailure();\n const exitFailure = runningClient\n .waitUntilExit()\n .then(({ code, signal }) => {\n throw new Error(\n `Codex app-server exited before the turn completed (code ${code ?? 'null'}, signal ${signal ?? 'null'}).`,\n );\n });\n let removeAbortListener = () => {};\n const abortFailure = new Promise<never>((_, reject) => {\n const onAbort = () => {\n if (currentTurn.threadId != null && currentTurn.turnId != null) {\n void runningClient\n .request({\n method: 'turn/interrupt',\n params: {\n threadId: currentTurn.threadId,\n turnId: currentTurn.turnId,\n },\n })\n .catch(() => {});\n }\n reject(\n turn.abortSignal.reason ?? new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turn.abortSignal.aborted) onAbort();\n else {\n turn.abortSignal.addEventListener('abort', onAbort, { once: true });\n removeAbortListener = () =>\n turn.abortSignal.removeEventListener('abort', onAbort);\n }\n });\n const raceWithProcess = <T>({ operation }: { operation: Promise<T> }) =>\n Promise.race([\n operation,\n abortFailure,\n protocolFailure,\n clientFailure,\n exitFailure,\n ]);\n let stopSteering = () => {};\n const steeringStopped = new Promise<void>(resolve => {\n stopSteering = resolve;\n });\n const userMessageLoop = async () => {\n for await (const message of turn.experimental_userMessages) {\n try {\n const response = await Promise.race([\n raceWithProcess({\n operation: runningClient.request({\n method: 'turn/steer',\n params: {\n threadId: currentTurn.threadId!,\n expectedTurnId: currentTurn.turnId!,\n clientUserMessageId: message.messageId,\n input: [\n { type: 'text', text: message.text, text_elements: [] },\n ],\n },\n }),\n }),\n steeringStopped.then(() => {\n throw new Error(\n 'The Codex turn ended before accepting the user message.',\n );\n }),\n ]);\n if (asRecord(response)?.turnId !== currentTurn.turnId) {\n throw new Error(\n 'Codex app-server turn/steer returned an unexpected turn ID.',\n );\n }\n message.accept();\n } catch (error) {\n message.reject(error);\n }\n }\n };\n let keepClient = false;\n try {\n if (initialized) {\n await raceWithProcess({\n operation: runningClient.initialize({\n clientName: 'ai-sdk-harness-codex',\n clientVersion: '1',\n }),\n });\n }\n if (start.restartThread && loadedThreadId != null) {\n await raceWithProcess({\n operation: runningClient.request({\n method: 'thread/unsubscribe',\n params: { threadId: loadedThreadId },\n }),\n });\n loadedThreadId = undefined;\n }\n if (trustedHook != null) {\n const hooks = await raceWithProcess({\n operation: runningClient.request({\n method: 'hooks/list',\n params: {},\n }),\n });\n assertTrustedApplyPatchHook({ response: hooks, hook: trustedHook });\n }\n const threadMethod = threadId == null ? 'thread/start' : 'thread/resume';\n if (loadedThreadId !== threadId || threadId == null) {\n const threadResponse = await raceWithProcess({\n operation: runningClient.request({\n method: threadMethod,\n params:\n threadId == null\n ? {\n ...createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig: nextConfig,\n }),\n dynamicTools: dynamicTools.specs,\n experimentalRawEvents: true,\n }\n : {\n threadId,\n ...createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig: nextConfig,\n }),\n excludeTurns: true,\n },\n }),\n });\n assertCodexThreadPermissions({\n response: threadResponse,\n method: threadMethod,\n });\n currentTurn.threadId = readNestedString({\n value: threadResponse,\n path: ['thread', 'id'],\n method: threadMethod,\n });\n loadedThreadId = currentTurn.threadId;\n }\n handler.announceThread(currentTurn.threadId!);\n emit({ type: 'stream-start' });\n const turnResponse = await raceWithProcess({\n operation: runningClient.request({\n method: 'turn/start',\n params: createTurnParams({\n threadId: currentTurn.threadId!,\n start,\n codexModel,\n disableEnvironments: toolPolicy.disableEnvironments,\n }),\n }),\n });\n currentTurn.turnId = readNestedString({\n value: turnResponse,\n path: ['turn', 'id'],\n method: 'turn/start',\n });\n handler.setTurnId(currentTurn.turnId);\n void userMessageLoop();\n const result = await raceWithProcess({\n operation: handler.waitForCompletion(),\n });\n keepClient = true;\n assertSuccessfulTurn(result);\n } catch (error) {\n if (turn.abortSignal.aborted && currentTurn.turnId != null) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n keepClient = await Promise.race([\n handler.waitForCompletion().then(() => true),\n new Promise<boolean>(resolve => {\n timer = setTimeout(() => resolve(false), 5_000);\n }),\n clientFailure.then(\n () => false,\n () => false,\n ),\n ]);\n } finally {\n clearTimeout(timer);\n }\n }\n throw error;\n } finally {\n turn.experimental_userMessages.close();\n stopSteering();\n removeAbortListener();\n if (activeTurn === currentTurn) activeTurn = undefined;\n if (!keepClient) await close();\n }\n };\n\n return { runTurn, close };\n}\n\nexport function createCodexAppServerArgs({\n cliOverrides = [],\n}: {\n cliOverrides?: string[];\n} = {}): string[] {\n return [\n CODEX_CLI_PATH,\n '--config',\n 'sandbox_mode=\"danger-full-access\"',\n '--config',\n 'approval_policy=\"never\"',\n ...cliOverrides.flatMap(override => ['--config', override]),\n 'app-server',\n '--stdio',\n ];\n}\n\nexport function createThreadParams({\n start,\n workdir,\n codexModel,\n codexConfig,\n}: {\n start: StartMessage;\n workdir: string;\n codexModel: string | undefined;\n codexConfig: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n ...(codexModel == null ? {} : { model: codexModel }),\n cwd: workdir,\n approvalPolicy: 'never',\n sandbox: 'danger-full-access',\n config: {\n ...codexConfig,\n web_search:\n codexConfig.web_search ?? (start.webSearch ? 'live' : 'disabled'),\n },\n };\n}\n\nexport function createTurnParams({\n threadId,\n start,\n codexModel,\n disableEnvironments = false,\n}: {\n threadId: string;\n start: StartMessage;\n codexModel: string | undefined;\n disableEnvironments?: boolean;\n}): Record<string, unknown> {\n return {\n threadId,\n ...(disableEnvironments ? { environments: [] } : {}),\n input: [{ type: 'text', text: start.prompt, text_elements: [] }],\n approvalPolicy: 'never',\n sandboxPolicy: {\n type: 'externalSandbox',\n networkAccess: 'enabled',\n },\n ...(codexModel == null ? {} : { model: codexModel }),\n ...(start.reasoningEffort == null ? {} : { effort: start.reasoningEffort }),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? { outputSchema: start.responseFormat.schema }\n : {}),\n };\n}\n\nexport function assertCodexThreadPermissions({\n response,\n method,\n}: {\n response: unknown;\n method: string;\n}): void {\n const value = asRecord(response);\n const sandbox = asRecord(value?.sandbox);\n if (\n value?.approvalPolicy !== 'never' ||\n sandbox?.type !== 'dangerFullAccess'\n ) {\n throw new Error(\n `Codex app-server ${method} did not disable approvals and its platform sandbox.`,\n );\n }\n}\n\nexport function createDynamicTools(\n tools: ReadonlyArray<{\n name: string;\n description?: string;\n inputSchema?: unknown;\n }>,\n): {\n specs: Array<Record<string, unknown>>;\n originalNameByAlias: ReadonlyMap<string, string>;\n} {\n const validOriginalNames = new Set(\n tools.map(tool => tool.name).filter(isValidDynamicToolName),\n );\n const usedAliases = new Set<string>();\n const originalNameByAlias = new Map<string, string>();\n const specs = tools.map((tool, index) => {\n let alias = tool.name;\n if (!isValidDynamicToolName(alias) || usedAliases.has(alias)) {\n const digest = createHash('sha256')\n .update(tool.name)\n .digest('hex')\n .slice(0, 16);\n const base = `ai_sdk_tool_${digest}`;\n alias = base;\n let suffix = index;\n while (usedAliases.has(alias) || validOriginalNames.has(alias)) {\n alias = `${base}_${suffix++}`;\n }\n }\n usedAliases.add(alias);\n originalNameByAlias.set(alias, tool.name);\n return {\n type: 'function',\n name: alias,\n description: tool.description ?? '',\n inputSchema: tool.inputSchema ?? {},\n };\n });\n return { specs, originalNameByAlias };\n}\n\nfunction isValidDynamicToolName(name: string): boolean {\n return (\n name.length > 0 &&\n name.length <= 128 &&\n /^[a-zA-Z0-9_-]+$/.test(name) &&\n name !== 'mcp' &&\n !name.startsWith('mcp__')\n );\n}\n\nexport async function handleAppServerRequest({\n request,\n dynamicTools,\n emit,\n requestToolResult,\n}: {\n request: CodexAppServerRequest;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n emit: Emit;\n requestToolResult: BridgeTurn['requestToolResult'];\n}): Promise<unknown> {\n if (request.method !== 'item/tool/call') {\n throw new Error(\n `Codex app-server requested unsupported method '${request.method}'.`,\n );\n }\n const params = asRecord(request.params);\n if (\n params == null ||\n typeof params.callId !== 'string' ||\n typeof params.tool !== 'string'\n ) {\n throw new Error('Codex app-server sent an invalid dynamic tool request.');\n }\n const originalToolName = dynamicTools.originalNameByAlias.get(params.tool);\n if (originalToolName == null) {\n throw new Error(\n `Codex app-server requested unknown dynamic tool '${params.tool}'.`,\n );\n }\n emit({\n type: 'tool-call',\n toolCallId: params.callId,\n toolName: originalToolName,\n input: JSON.stringify(params.arguments ?? {}),\n providerExecuted: false,\n });\n const result = await requestToolResult(params.callId);\n emit({\n type: 'tool-result',\n toolCallId: params.callId,\n toolName: originalToolName,\n result: result.output ?? null,\n isError: result.isError === true,\n });\n return {\n contentItems: [\n { type: 'inputText', text: serializeToolOutput(result.output) },\n ],\n success: result.isError !== true,\n };\n}\n\nfunction serializeToolOutput(output: unknown): string {\n if (typeof output === 'string') return output;\n try {\n return JSON.stringify(output) ?? String(output);\n } catch {\n return String(output);\n }\n}\n\nfunction readNestedString({\n value,\n path,\n method,\n}: {\n value: unknown;\n path: string[];\n method: string;\n}): string {\n let current: unknown = value;\n for (const segment of path) current = asRecord(current)?.[segment];\n if (typeof current !== 'string' || current.length === 0) {\n throw new Error(`Codex app-server ${method} returned an invalid response.`);\n }\n return current;\n}\n\nfunction assertSuccessfulTurn(result: AppServerTurnResult): void {\n if (result.status === 'completed') return;\n if (result.status === 'interrupted') {\n throw new DOMException('Codex turn was interrupted.', 'AbortError');\n }\n throw new Error(\n result.error ?? `Codex turn ended with status '${result.status}'.`,\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n","export type CodexBuiltinToolPolicy = {\n readonly disabled: {\n readonly bash: boolean;\n readonly webSearch: boolean;\n readonly apply_patch: boolean;\n readonly view_image: boolean;\n };\n readonly disableEnvironments: boolean;\n readonly denyApplyPatchWithHook: boolean;\n readonly webSearchMode: 'live' | 'disabled';\n};\n\nexport function resolveCodexBuiltinToolPolicy({\n builtinToolFiltering,\n webSearch,\n}: {\n builtinToolFiltering:\n | { mode: 'allow' | 'deny'; toolNames: string[] }\n | undefined;\n webSearch: boolean | undefined;\n}): CodexBuiltinToolPolicy {\n const included = (toolName: string) =>\n builtinToolFiltering == null ||\n (builtinToolFiltering.mode === 'allow'\n ? builtinToolFiltering.toolNames.includes(toolName)\n : !builtinToolFiltering.toolNames.includes(toolName));\n const disabled = {\n bash: !included('bash'),\n webSearch: !included('webSearch'),\n apply_patch: !included('apply_patch'),\n view_image: !included('view_image'),\n };\n const disableEnvironments =\n disabled.bash && disabled.apply_patch && disabled.view_image;\n\n return {\n disabled,\n disableEnvironments,\n denyApplyPatchWithHook: disabled.apply_patch && !disableEnvironments,\n webSearchMode: webSearch && !disabled.webSearch ? 'live' : 'disabled',\n };\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\n\ntype JsonRpcId = number | string;\n\ntype JsonRpcError = {\n code: number;\n message: string;\n data?: unknown;\n};\n\nexport type CodexAppServerNotification = {\n method: string;\n params?: unknown;\n};\n\nexport type CodexAppServerRequest = CodexAppServerNotification & {\n id: JsonRpcId;\n};\n\nexport class CodexAppServerRequestError extends Error {\n readonly method: string;\n readonly code: number;\n readonly data: unknown;\n\n constructor({ method, error }: { method: string; error: JsonRpcError }) {\n super(`Codex app-server ${method} failed: ${error.message}`);\n this.name = 'CodexAppServerRequestError';\n this.method = method;\n this.code = error.code;\n this.data = error.data;\n }\n}\n\nexport class CodexAppServerClient {\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly onNotification: (\n notification: CodexAppServerNotification,\n ) => void;\n private readonly onRequest: (\n request: CodexAppServerRequest,\n ) => Promise<unknown>;\n private readonly onStderr: (text: string) => void;\n private readonly pending = new Map<\n JsonRpcId,\n {\n method: string;\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n }\n >();\n private nextRequestId = 1;\n private stdoutBuffer = '';\n private parseQueue = Promise.resolve();\n private closed = false;\n private failure: unknown;\n private readonly failed: Promise<unknown>;\n private resolveFailure: (error: unknown) => void = () => {};\n private exitResult: {\n code: number | null;\n signal: NodeJS.Signals | null;\n } | null = null;\n private readonly exited: Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }>;\n\n constructor({\n executable,\n args,\n cwd,\n env,\n onNotification,\n onRequest,\n onStderr,\n }: {\n executable: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n onNotification: (notification: CodexAppServerNotification) => void;\n onRequest: (request: CodexAppServerRequest) => Promise<unknown>;\n onStderr: (text: string) => void;\n }) {\n this.onNotification = onNotification;\n this.onRequest = onRequest;\n this.onStderr = onStderr;\n this.failed = new Promise(resolve => {\n this.resolveFailure = resolve;\n });\n this.child = spawn(executable, args, {\n cwd,\n env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n this.exited = new Promise(resolve => {\n this.child.once('exit', (code, signal) => {\n this.exitResult = { code, signal };\n this.fail(\n new Error(\n `Codex app-server exited (code ${code ?? 'null'}, signal ${signal ?? 'null'}).`,\n ),\n );\n resolve(this.exitResult);\n });\n });\n this.child.once('error', error => this.fail(error));\n this.child.stdout.setEncoding('utf8');\n this.child.stdout.on('data', chunk => this.consumeStdout(String(chunk)));\n this.child.stderr.setEncoding('utf8');\n this.child.stderr.on('data', chunk => this.onStderr(String(chunk)));\n }\n\n async initialize({\n clientName,\n clientVersion,\n }: {\n clientName: string;\n clientVersion: string;\n }): Promise<void> {\n await this.request({\n method: 'initialize',\n params: {\n clientInfo: { name: clientName, version: clientVersion },\n capabilities: { experimentalApi: true },\n },\n });\n this.notify({ method: 'initialized' });\n }\n\n request({\n method,\n params,\n }: {\n method: string;\n params?: unknown;\n }): Promise<unknown> {\n if (this.closed || this.exitResult != null) {\n return Promise.reject(new Error('Codex app-server is not running.'));\n }\n const id = this.nextRequestId++;\n const response = new Promise<unknown>((resolve, reject) => {\n this.pending.set(id, { method, resolve, reject });\n });\n try {\n this.write({ id, method, ...(params === undefined ? {} : { params }) });\n } catch (error) {\n this.pending.delete(id);\n return Promise.reject(error);\n }\n return response;\n }\n\n notify({ method, params }: { method: string; params?: unknown }): void {\n this.write({ method, ...(params === undefined ? {} : { params }) });\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.child.stdin.end();\n if (await this.waitForExit({ timeoutMs: 500 })) return;\n this.child.kill('SIGTERM');\n if (await this.waitForExit({ timeoutMs: 1_000 })) return;\n this.child.kill('SIGKILL');\n await this.waitForExit({ timeoutMs: 1_000 });\n }\n\n waitUntilExit(): Promise<{\n code: number | null;\n signal: NodeJS.Signals | null;\n }> {\n return this.exited;\n }\n\n waitUntilFailure(): Promise<never> {\n return this.failed.then(error => {\n throw error;\n });\n }\n\n private write(message: Record<string, unknown>): void {\n if (this.closed || this.exitResult != null || !this.child.stdin.writable) {\n throw new Error('Codex app-server is not writable.');\n }\n this.child.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n private consumeStdout(chunk: string): void {\n this.stdoutBuffer += chunk;\n let newline = this.stdoutBuffer.indexOf('\\n');\n while (newline !== -1) {\n const line = this.stdoutBuffer.slice(0, newline).trim();\n this.stdoutBuffer = this.stdoutBuffer.slice(newline + 1);\n if (line.length > 0) {\n this.parseQueue = this.parseQueue\n .then(() => this.processLine(line))\n .catch(error => this.fail(error));\n }\n newline = this.stdoutBuffer.indexOf('\\n');\n }\n }\n\n private async processLine(line: string): Promise<void> {\n /*\n * Bridge code runs in an isolated runtime where provider-utils is not\n * available. The app-server is the bridge's own child process, and every\n * JSON-RPC field consumed below is checked before it is used.\n */\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n throw new Error('Codex app-server wrote an invalid JSON-RPC message.');\n }\n if (!isRecord(message)) {\n throw new Error('Codex app-server wrote an invalid JSON-RPC message.');\n }\n if (typeof message.method === 'string') {\n if (isJsonRpcId(message.id)) {\n void this.handleServerRequest({\n id: message.id,\n method: message.method,\n ...(message.params === undefined ? {} : { params: message.params }),\n });\n } else {\n this.onNotification({\n method: message.method,\n ...(message.params === undefined ? {} : { params: message.params }),\n });\n }\n return;\n }\n if (!isJsonRpcId(message.id)) {\n throw new Error('Codex app-server response is missing a valid id.');\n }\n const pending = this.pending.get(message.id);\n if (pending == null) return;\n this.pending.delete(message.id);\n if (isJsonRpcError(message.error)) {\n pending.reject(\n new CodexAppServerRequestError({\n method: pending.method,\n error: message.error,\n }),\n );\n return;\n }\n if (!Object.prototype.hasOwnProperty.call(message, 'result')) {\n pending.reject(\n new Error(`Codex app-server ${pending.method} response has no result.`),\n );\n return;\n }\n pending.resolve(message.result);\n }\n\n private async handleServerRequest(\n request: CodexAppServerRequest,\n ): Promise<void> {\n try {\n const result = await this.onRequest(request);\n if (!this.closed && this.exitResult == null) {\n this.write({ id: request.id, result });\n }\n } catch (error) {\n if (!this.closed && this.exitResult == null) {\n this.write({\n id: request.id,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n }\n }\n\n private failPending(error: unknown): void {\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n }\n\n private fail(error: unknown): void {\n this.failPending(error);\n if (this.failure !== undefined) return;\n this.failure = error;\n this.resolveFailure(error);\n }\n\n private async waitForExit({\n timeoutMs,\n }: {\n timeoutMs: number;\n }): Promise<boolean> {\n if (this.exitResult != null) return true;\n return Promise.race([\n this.exited.then(() => true),\n new Promise<boolean>(resolve => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n timer.unref?.();\n }),\n ]);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isJsonRpcId(value: unknown): value is JsonRpcId {\n return typeof value === 'string' || typeof value === 'number';\n}\n\nfunction isJsonRpcError(value: unknown): value is JsonRpcError {\n return (\n isRecord(value) &&\n typeof value.code === 'number' &&\n typeof value.message === 'string'\n );\n}\n","import type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport type { CodexStepTracker } from './codex-step-tracker';\nimport type { CodexEvent, CodexItem } from './create-emit-stream-event';\nimport type { CodexAppServerNotification } from './codex-app-server-client';\n\ntype UsageBreakdown = {\n inputTokens: number;\n cachedInputTokens: number;\n cacheWriteInputTokens: number;\n outputTokens: number;\n};\n\nexport type AppServerTurnResult = {\n status: string;\n error?: string;\n};\n\ntype NativeToolName = 'apply_patch' | 'view_image';\n\ntype NativeToolCall = {\n name: NativeToolName;\n resultEmitted: boolean;\n successConfirmed: boolean;\n};\n\nexport function createAppServerEventHandler({\n stepTracker,\n emitStreamEvent,\n emitWarning,\n emitError,\n}: {\n stepTracker: CodexStepTracker;\n emitStreamEvent: (event: CodexEvent) => void;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n}): {\n announceThread(threadId: string): void;\n handle(notification: CodexAppServerNotification): void;\n setTurnId(turnId: string): void;\n waitForCompletion(): Promise<AppServerTurnResult>;\n} {\n let activeThreadId: string | undefined;\n let activeTurnId: string | undefined;\n let settled = false;\n let accumulatedUsage: UsageBreakdown = emptyUsageBreakdown();\n let lastCumulativeUsageKey: string | undefined;\n const textByItem = new Map<string, string>();\n const reasoningByItem = new Map<string, string>();\n const nativeToolCalls = new Map<string, NativeToolCall>();\n let resolveCompletion: (result: AppServerTurnResult) => void = () => {};\n const completion = new Promise<AppServerTurnResult>(resolve => {\n resolveCompletion = resolve;\n });\n const announceThread = (threadId: string): void => {\n if (activeThreadId != null) return;\n activeThreadId = threadId;\n emitStreamEvent({ type: 'thread.started', thread_id: threadId });\n };\n\n const handleItem = ({\n eventType,\n params,\n }: {\n eventType: 'item.started' | 'item.completed';\n params: Record<string, unknown>;\n }): void => {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId })) return;\n const item = asRecord(params.item);\n if (item == null || typeof item.type !== 'string') return;\n if (eventType === 'item.completed' && typeof item.id === 'string') {\n const call = nativeToolCalls.get(item.id);\n if (call?.name === 'apply_patch' && item.type === 'fileChange') {\n call.successConfirmed = item.status === 'completed';\n } else if (call?.name === 'view_image' && item.type === 'imageView') {\n call.successConfirmed = true;\n }\n }\n const normalized = normalizeItem({ item, textByItem, reasoningByItem });\n if (normalized == null) return;\n if (normalized.type === 'dynamic_tool_call') {\n stepTracker.observeEvent({\n event: { type: eventType, item: normalized },\n itemId: normalized.id,\n });\n return;\n }\n emitStreamEvent({ type: eventType, item: normalized });\n };\n\n const emitNativeToolResult = ({\n callId,\n result,\n }: {\n callId: string;\n result: unknown;\n }): void => {\n const call = nativeToolCalls.get(callId);\n if (call == null || call.resultEmitted) return;\n call.resultEmitted = true;\n emitStreamEvent({\n type: 'item.completed',\n item: {\n type: 'native_tool',\n id: callId,\n tool: call.name,\n result,\n ...(!call.successConfirmed ? { isError: true } : {}),\n },\n });\n };\n\n const handleRawItem = (params: Record<string, unknown>): void => {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId })) return;\n const item = asRecord(params.item);\n if (item == null) return;\n const toolCall = normalizeNativeToolCall({ item });\n if (toolCall != null) {\n if (nativeToolCalls.has(toolCall.callId)) return;\n nativeToolCalls.set(toolCall.callId, {\n name: toolCall.name,\n resultEmitted: false,\n successConfirmed: false,\n });\n emitStreamEvent({\n type: 'item.started',\n item: {\n type: 'native_tool',\n id: toolCall.callId,\n tool: toolCall.name,\n input: toolCall.input,\n },\n });\n return;\n }\n if (typeof item.call_id !== 'string') return;\n const call = nativeToolCalls.get(item.call_id);\n if (\n call == null ||\n (call.name === 'apply_patch'\n ? item.type !== 'custom_tool_call_output'\n : item.type !== 'function_call_output') ||\n !Object.prototype.hasOwnProperty.call(item, 'output')\n ) {\n return;\n }\n emitNativeToolResult({\n callId: item.call_id,\n result:\n call.name === 'view_image' &&\n call.successConfirmed &&\n Array.isArray(item.output) &&\n item.output.length === 0\n ? 'Image viewed.'\n : item.output,\n });\n };\n\n return {\n announceThread,\n setTurnId(turnId) {\n activeTurnId = turnId;\n },\n handle(notification) {\n const params = asRecord(notification.params);\n if (notification.method === 'thread/started') {\n const thread = asRecord(params?.thread);\n if (typeof thread?.id === 'string') announceThread(thread.id);\n return;\n }\n if (notification.method === 'turn/started') {\n const turn = asRecord(params?.turn);\n if (\n params?.threadId === activeThreadId &&\n typeof turn?.id === 'string'\n ) {\n activeTurnId = turn.id;\n }\n return;\n }\n if (notification.method === 'item/started' && params != null) {\n handleItem({ eventType: 'item.started', params });\n return;\n }\n if (notification.method === 'item/completed' && params != null) {\n handleItem({ eventType: 'item.completed', params });\n return;\n }\n if (\n notification.method === 'rawResponseItem/completed' &&\n params != null\n ) {\n handleRawItem(params);\n return;\n }\n if (\n notification.method === 'item/agentMessage/delta' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId }) &&\n typeof params.itemId === 'string' &&\n typeof params.delta === 'string'\n ) {\n const text = (textByItem.get(params.itemId) ?? '') + params.delta;\n textByItem.set(params.itemId, text);\n emitStreamEvent({\n type: 'item.updated',\n item: { type: 'agent_message', id: params.itemId, text },\n });\n return;\n }\n if (\n notification.method === 'item/reasoning/summaryTextDelta' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId }) &&\n typeof params.itemId === 'string' &&\n typeof params.delta === 'string'\n ) {\n const text = (reasoningByItem.get(params.itemId) ?? '') + params.delta;\n reasoningByItem.set(params.itemId, text);\n emitStreamEvent({\n type: 'item.updated',\n item: { type: 'reasoning', id: params.itemId, text },\n });\n return;\n }\n if (\n notification.method === 'thread/tokenUsage/updated' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId })\n ) {\n const tokenUsage = asRecord(params.tokenUsage);\n const total = readUsageBreakdown(tokenUsage?.total);\n const last = readUsageBreakdown(tokenUsage?.last);\n if (total != null && last != null) {\n const key = usageKey(total);\n if (key !== lastCumulativeUsageKey) {\n lastCumulativeUsageKey = key;\n accumulatedUsage = addUsage({\n total: accumulatedUsage,\n increment: last,\n });\n }\n }\n return;\n }\n if (notification.method === 'error' && params != null) {\n if (!matchesActiveTurn({ params, activeThreadId, activeTurnId }))\n return;\n const error = asRecord(params.error);\n const message =\n typeof error?.message === 'string'\n ? error.message\n : 'Codex app-server reported an error.';\n if (params.willRetry === true) {\n emitWarning({ message });\n } else {\n emitError({ error: message, message: 'codex turn failed' });\n }\n return;\n }\n if (\n (notification.method === 'warning' ||\n notification.method === 'configWarning' ||\n notification.method === 'deprecationNotice') &&\n typeof params?.message === 'string'\n ) {\n emitWarning({ message: params.message });\n return;\n }\n if (\n notification.method === 'turn/completed' &&\n params != null &&\n matchesActiveTurn({ params, activeThreadId, activeTurnId })\n ) {\n if (settled) return;\n settled = true;\n const turn = asRecord(params.turn);\n const status =\n typeof turn?.status === 'string' ? turn.status : 'failed';\n const turnError = asRecord(turn?.error);\n if (status === 'completed') {\n for (const [callId, call] of nativeToolCalls) {\n if (call.resultEmitted) continue;\n emitNativeToolResult({\n callId,\n result: call.successConfirmed\n ? call.name === 'apply_patch'\n ? 'Patch applied.'\n : 'Image viewed.'\n : 'Codex did not report the tool result.',\n });\n }\n }\n emitStreamEvent({\n type: 'turn.completed',\n usage: toLegacyUsage(accumulatedUsage),\n });\n resolveCompletion({\n status,\n ...(typeof turnError?.message === 'string'\n ? { error: turnError.message }\n : {}),\n });\n }\n },\n waitForCompletion: () => completion,\n };\n}\n\nfunction normalizeNativeToolCall({\n item,\n}: {\n item: Record<string, unknown>;\n}): { callId: string; name: NativeToolName; input: string } | undefined {\n if (\n item.namespace != null ||\n typeof item.call_id !== 'string' ||\n item.call_id.length === 0\n ) {\n return undefined;\n }\n if (\n item.type === 'custom_tool_call' &&\n item.name === 'apply_patch' &&\n typeof item.input === 'string'\n ) {\n return {\n callId: item.call_id,\n name: 'apply_patch',\n input: JSON.stringify(item.input),\n };\n }\n if (\n item.type === 'function_call' &&\n item.name === 'view_image' &&\n typeof item.arguments === 'string'\n ) {\n return {\n callId: item.call_id,\n name: 'view_image',\n input: item.arguments,\n };\n }\n return undefined;\n}\n\nfunction normalizeItem({\n item,\n textByItem,\n reasoningByItem,\n}: {\n item: Record<string, unknown>;\n textByItem: Map<string, string>;\n reasoningByItem: Map<string, string>;\n}): CodexItem | undefined {\n const id = typeof item.id === 'string' ? item.id : undefined;\n if (item.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text : '';\n if (id != null) textByItem.set(id, text);\n return { type: 'agent_message', id, text };\n }\n if (item.type === 'reasoning') {\n const summary = stringArray(item.summary).join('\\n\\n');\n const content = stringArray(item.content).join('\\n\\n');\n const text = summary || reasoningByItem.get(id ?? '') || content;\n if (id != null) reasoningByItem.set(id, text);\n return { type: 'reasoning', id, text };\n }\n if (item.type === 'commandExecution') {\n return {\n type: 'command_execution',\n id,\n command: typeof item.command === 'string' ? item.command : '',\n exit_code: typeof item.exitCode === 'number' ? item.exitCode : undefined,\n aggregated_output:\n typeof item.aggregatedOutput === 'string'\n ? item.aggregatedOutput\n : undefined,\n status: normalizeCommandStatus(item.status),\n };\n }\n if (item.type === 'mcpToolCall') {\n const result = asRecord(item.result);\n return {\n type: 'mcp_tool_call',\n id,\n server: typeof item.server === 'string' ? item.server : undefined,\n tool: typeof item.tool === 'string' ? item.tool : undefined,\n arguments: item.arguments,\n result:\n result == null\n ? item.result\n : {\n content: result.content,\n structured_content: result.structuredContent,\n },\n error: asRecord(item.error) as { message?: string } | undefined,\n };\n }\n if (item.type === 'dynamicToolCall') {\n return { type: 'dynamic_tool_call', id };\n }\n if (item.type === 'webSearch') {\n return {\n type: 'web_search',\n id,\n query: typeof item.query === 'string' ? item.query : undefined,\n action: asRecord(item.action) ?? undefined,\n result: item.results,\n };\n }\n if (item.type === 'fileChange') {\n return {\n type: 'file_change',\n id,\n changes: Array.isArray(item.changes)\n ? item.changes.flatMap(change => {\n const value = asRecord(change);\n const kind = asRecord(value?.kind)?.type;\n return typeof value?.path === 'string' &&\n (kind === 'add' || kind === 'delete' || kind === 'update')\n ? [{ path: value.path, kind }]\n : [];\n })\n : [],\n };\n }\n if (item.type === 'plan') return { type: 'todo_list', id };\n return undefined;\n}\n\nfunction normalizeCommandStatus(\n value: unknown,\n): 'in_progress' | 'completed' | 'failed' {\n if (value === 'completed') return 'completed';\n if (value === 'inProgress') return 'in_progress';\n return 'failed';\n}\n\nfunction matchesActiveTurn({\n params,\n activeThreadId,\n activeTurnId,\n}: {\n params: Record<string, unknown>;\n activeThreadId: string | undefined;\n activeTurnId: string | undefined;\n}): boolean {\n const nestedTurn = asRecord(params.turn);\n const turnId =\n typeof params.turnId === 'string'\n ? params.turnId\n : typeof nestedTurn?.id === 'string'\n ? nestedTurn.id\n : undefined;\n return (\n activeThreadId != null &&\n activeTurnId != null &&\n params.threadId === activeThreadId &&\n turnId === activeTurnId\n );\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : [];\n}\n\nfunction emptyUsageBreakdown(): UsageBreakdown {\n return {\n inputTokens: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n outputTokens: 0,\n };\n}\n\nfunction readUsageBreakdown(value: unknown): UsageBreakdown | undefined {\n const usage = asRecord(value);\n if (usage == null) return undefined;\n return {\n inputTokens: numberOrZero(usage.inputTokens),\n cachedInputTokens: numberOrZero(usage.cachedInputTokens),\n cacheWriteInputTokens: numberOrZero(usage.cacheWriteInputTokens),\n outputTokens: numberOrZero(usage.outputTokens),\n };\n}\n\nfunction addUsage({\n total,\n increment,\n}: {\n total: UsageBreakdown;\n increment: UsageBreakdown;\n}): UsageBreakdown {\n return {\n inputTokens: total.inputTokens + increment.inputTokens,\n cachedInputTokens: total.cachedInputTokens + increment.cachedInputTokens,\n cacheWriteInputTokens:\n total.cacheWriteInputTokens + increment.cacheWriteInputTokens,\n outputTokens: total.outputTokens + increment.outputTokens,\n };\n}\n\nfunction usageKey(usage: UsageBreakdown): string {\n return [\n usage.inputTokens,\n usage.cachedInputTokens,\n usage.cacheWriteInputTokens,\n usage.outputTokens,\n ].join(':');\n}\n\nfunction toLegacyUsage(usage: UsageBreakdown): Record<string, number> {\n return {\n input_tokens: usage.inputTokens,\n cached_input_tokens: usage.cachedInputTokens,\n cache_write_input_tokens: usage.cacheWriteInputTokens,\n output_tokens: usage.outputTokens,\n };\n}\n\nfunction numberOrZero(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\n\nconst MATCHER = '^apply_patch$';\nconst TIMEOUT_SECONDS = 10;\nconst COMMAND =\n \"printf '%s\\\\n' \\\"Tool 'apply_patch' is inactive due to the HarnessAgent tool filtering policy.\\\" >&2; exit 2\";\n\nexport type TrustedApplyPatchHook = {\n cliOverrides: string[];\n threadConfig: Record<string, unknown>;\n key: string;\n hash: string;\n command: string;\n};\n\nexport function createTrustedApplyPatchHook({\n codexConfig,\n}: {\n codexConfig: Record<string, unknown>;\n}): TrustedApplyPatchHook {\n const threadConfig = { ...codexConfig };\n const hooks = { ...asRecord(threadConfig.hooks) };\n delete threadConfig.hooks;\n\n for (const [key, value] of Object.entries(threadConfig)) {\n if (!key.startsWith('hooks.')) continue;\n const name = key.slice('hooks.'.length);\n if (name.startsWith('state.')) {\n hooks.state = {\n ...asRecord(hooks.state),\n [name.slice('state.'.length)]: value,\n };\n } else {\n hooks[name] = value;\n }\n delete threadConfig[key];\n }\n\n const userGroups = hooks.PreToolUse ?? [];\n if (!Array.isArray(userGroups)) {\n throw new Error('Codex config hooks.PreToolUse must be an array.');\n }\n\n const handler = {\n type: 'command',\n command: COMMAND,\n timeout: TIMEOUT_SECONDS,\n async: false,\n };\n const hash = `sha256:${createHash('sha256')\n .update(\n JSON.stringify(\n canonicalize({\n event_name: 'pre_tool_use',\n matcher: MATCHER,\n hooks: [handler],\n }),\n ),\n )\n .digest('hex')}`;\n const sourcePath =\n process.platform === 'win32'\n ? path.win32.resolve('C:\\\\', '<session-flags>/config.toml')\n : path.posix.resolve('/', '<session-flags>/config.toml');\n const key = `${sourcePath}:pre_tool_use:${userGroups.length}:0`;\n\n hooks.PreToolUse = [...userGroups, { matcher: MATCHER, hooks: [handler] }];\n hooks.state = {\n ...asRecord(hooks.state),\n [key]: { enabled: true, trusted_hash: hash },\n };\n\n return {\n cliOverrides: [`hooks=${toTomlInline(hooks)}`, 'features.hooks=true'],\n threadConfig,\n key,\n hash,\n command: COMMAND,\n };\n}\n\nexport function assertTrustedApplyPatchHook({\n response,\n hook,\n}: {\n response: unknown;\n hook: TrustedApplyPatchHook;\n}): void {\n const data = asRecord(response)?.data;\n const entry = Array.isArray(data) && data.length === 1 ? data[0] : null;\n const record = asRecord(entry);\n const matches = Array.isArray(record?.hooks)\n ? record.hooks.filter(item => asRecord(item)?.key === hook.key)\n : [];\n const match = matches.length === 1 ? asRecord(matches[0]) : undefined;\n if (\n !match ||\n match.eventName !== 'preToolUse' ||\n match.handlerType !== 'command' ||\n match.command !== hook.command ||\n match.matcher !== MATCHER ||\n match.currentHash !== hook.hash ||\n match.enabled !== true ||\n match.trustStatus !== 'trusted' ||\n (Array.isArray(record?.errors) && record.errors.length > 0)\n ) {\n throw new Error(\n 'Codex app-server did not load the trusted apply_patch filtering hook.',\n );\n }\n}\n\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, item]) => [key, canonicalize(item)]),\n );\n }\n return value;\n}\n\nfunction toTomlInline(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) {\n return String(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(toTomlInline).join(',')}]`;\n }\n if (value != null && typeof value === 'object') {\n return `{${Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => `${JSON.stringify(key)}=${toTomlInline(item)}`)\n .join(',')}}`;\n }\n throw new Error('Codex hook configuration contains an unsupported value.');\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n","import type { BridgeEvent } from '@ai-sdk/harness/bridge';\n\ntype Emit = (msg: BridgeEvent) => void;\n\nexport type CodexStepTrackerItem = {\n type: string;\n};\n\nexport type CodexStepTrackerEvent = {\n type: string;\n item?: CodexStepTrackerItem;\n};\n\nexport type CodexStepTracker = {\n observeEvent(input: {\n event: CodexStepTrackerEvent;\n itemId: string | undefined;\n }): void;\n finishTurn(): void;\n};\n\nexport function createCodexStepTracker(input: {\n send: Emit;\n}): CodexStepTracker {\n let stepOpen = false;\n const pendingToolItemIds = new Set<string>();\n\n const finishStep = (): void => {\n if (!stepOpen || pendingToolItemIds.size > 0) return;\n input.send({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: defaultUsage(),\n harnessMetadata: { codex: { inferredStep: true } },\n });\n stepOpen = false;\n };\n\n return {\n observeEvent({ event, itemId }) {\n const item = event.item;\n if (!item || !isStepItem(item)) return;\n\n stepOpen = true;\n\n if (isToolStepItem(item)) {\n if (event.type === 'item.started' && itemId) {\n pendingToolItemIds.add(itemId);\n } else if (event.type === 'item.completed') {\n if (itemId) pendingToolItemIds.delete(itemId);\n finishStep();\n }\n }\n },\n finishTurn() {\n pendingToolItemIds.clear();\n finishStep();\n },\n };\n}\n\nfunction isStepItem(item: CodexStepTrackerItem): boolean {\n return isModelStepItem(item) || isToolStepItem(item);\n}\n\nfunction isModelStepItem(item: CodexStepTrackerItem): boolean {\n return item.type === 'reasoning' || item.type === 'agent_message';\n}\n\nfunction isToolStepItem(item: CodexStepTrackerItem): boolean {\n return (\n item.type === 'command_execution' ||\n item.type === 'native_tool' ||\n item.type === 'mcp_tool_call' ||\n item.type === 'dynamic_tool_call' ||\n item.type === 'web_search' ||\n item.type === 'file_change' ||\n item.type === 'todo_list'\n );\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import type { HarnessV1BuiltinToolName } from '@ai-sdk/harness';\nimport type { BridgeTurn } from '@ai-sdk/harness/bridge';\nimport { randomUUID } from 'node:crypto';\nimport type { CodexStepTracker } from './codex-step-tracker';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type CodexItem = {\n type: string;\n id?: string;\n text?: string;\n command?: string;\n exit_code?: number;\n aggregated_output?: string;\n status?: 'in_progress' | 'completed' | 'failed';\n server?: string;\n tool?: string;\n input?: string;\n isError?: boolean;\n arguments?: unknown;\n result?: { content?: unknown; structured_content?: unknown } | unknown;\n error?: { message?: string };\n query?: string;\n action?: {\n query?: string;\n [key: string]: unknown;\n };\n message?: string;\n changes?: ReadonlyArray<{\n path: string;\n kind: 'add' | 'delete' | 'update';\n }>;\n};\n\nexport type CodexEvent = {\n type:\n | 'thread.started'\n | 'turn.completed'\n | 'turn.failed'\n | 'error'\n | 'item.started'\n | 'item.updated'\n | 'item.completed';\n item?: CodexItem;\n usage?: Record<string, number>;\n error?: { message: string };\n message?: string;\n thread_id?: string;\n};\n\n/*\n * Native Codex tool name → cross-harness common name. Tools outside this map\n * (e.g. MCP tools the model invokes by name) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\nconst NATIVE_TO_COMMON: Readonly<Record<string, HarnessV1BuiltinToolName>> = {\n shell: 'bash',\n web_search: 'webSearch',\n};\n\nfunction toCommonName(nativeName: string): HarnessV1BuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nfunction getMcpToolName(item: CodexItem): string {\n const toolName = item.tool ?? 'unknown';\n return item.server != null && item.server.length > 0\n ? `mcp__${item.server}__${toolName}`\n : toolName;\n}\n\nexport function createEmitStreamEvent({\n send,\n stepTracker,\n setTurnUsage,\n setThreadId,\n emitWarning,\n emitError,\n}: {\n send: Emit;\n stepTracker: CodexStepTracker;\n setTurnUsage: (usage: Record<string, unknown>) => void;\n setThreadId: (threadId: string) => void;\n emitWarning: BridgeTurn['emitWarning'];\n emitError: BridgeTurn['emitError'];\n}): (event: CodexEvent) => void {\n const textByItem = new Map<string, string>();\n const reasoningByItem = new Map<string, string>();\n const emittedWebSearchToolCalls = new Set<string>();\n\n return event => {\n if (\n event.type === 'thread.started' &&\n typeof event.thread_id === 'string'\n ) {\n setThreadId(event.thread_id);\n // Announce to the host so it can include the id in resume state.\n send({ type: 'bridge-thread', threadId: event.thread_id });\n }\n if (event.type === 'turn.completed') {\n if (event.usage) setTurnUsage(mapUsage(event.usage));\n stepTracker.finishTurn();\n return;\n }\n if (event.type === 'turn.failed') {\n emitError({\n error: event.error?.message ?? 'codex turn failed',\n message: 'codex turn failed',\n });\n return;\n }\n if (event.type === 'error') {\n emitError({\n error: event.message ?? 'codex error',\n message: 'codex stream error',\n });\n return;\n }\n if (!event.item) return;\n const item = event.item;\n const id = item.id ?? randomUUID();\n const observeStep = (): void => {\n stepTracker.observeEvent({ event, itemId: id });\n };\n\n if (item.type === 'native_tool' && item.tool != null) {\n if (event.type === 'item.started' && item.input != null) {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: item.tool,\n input: item.input,\n providerExecuted: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: item.tool,\n result: item.result,\n ...(item.isError ? { isError: true } : {}),\n });\n }\n stepTracker.observeEvent({ event, itemId: `native-tool:${id}` });\n return;\n }\n\n if (item.type === 'agent_message' && typeof item.text === 'string') {\n /*\n * The presence of `id` in `textByItem` — not the `item.started` event —\n * marks the text part as opened. Codex does not guarantee an\n * `item.started` event carrying text precedes the first `item.updated`\n * with text, so keying the `text-start` off the event type can emit a\n * `text-delta` for a part that was never opened. Opening lazily on the\n * first event with text keeps `text-start` before any `text-delta`.\n */\n if (!textByItem.has(id)) {\n send({ type: 'text-start', id });\n textByItem.set(id, '');\n }\n const last = textByItem.get(id) ?? '';\n const next = item.text;\n if (next.length > last.length) {\n send({ type: 'text-delta', id, delta: next.slice(last.length) });\n textByItem.set(id, next);\n }\n if (event.type === 'item.completed') send({ type: 'text-end', id });\n observeStep();\n return;\n }\n\n if (item.type === 'reasoning' && typeof item.text === 'string') {\n if (!reasoningByItem.has(id)) {\n send({ type: 'reasoning-start', id });\n reasoningByItem.set(id, '');\n }\n const last = reasoningByItem.get(id) ?? '';\n const next = item.text;\n if (next.length > last.length) {\n send({ type: 'reasoning-delta', id, delta: next.slice(last.length) });\n reasoningByItem.set(id, next);\n }\n if (event.type === 'item.completed') send({ type: 'reasoning-end', id });\n observeStep();\n return;\n }\n\n if (item.type === 'command_execution') {\n const nativeName = 'shell';\n if (event.type === 'item.started') {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n nativeName,\n input: JSON.stringify({ command: item.command ?? '' }),\n providerExecuted: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n result: {\n exitCode: item.exit_code ?? null,\n output: item.aggregated_output ?? '',\n status: item.status ?? 'completed',\n },\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'mcp_tool_call') {\n const toolName = getMcpToolName(item);\n if (event.type === 'item.started') {\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName,\n nativeName: toolName,\n input: JSON.stringify(item.arguments ?? {}),\n providerExecuted: true,\n dynamic: true,\n });\n } else if (event.type === 'item.completed') {\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName,\n result: extractMcpToolCallResult(item),\n dynamic: true,\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'web_search') {\n const nativeName = 'web_search';\n const query = getWebSearchQuery(item);\n if (event.type === 'item.started' || event.type === 'item.updated') {\n if (query !== undefined) {\n emitWebSearchToolCall({\n id,\n query,\n nativeName,\n emittedWebSearchToolCalls,\n send,\n });\n }\n } else if (event.type === 'item.completed') {\n emitWebSearchToolCall({\n id,\n query: query ?? '',\n nativeName,\n emittedWebSearchToolCalls,\n send,\n });\n send({\n type: 'tool-result',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n result: item.result ?? item.action ?? null,\n });\n emittedWebSearchToolCalls.delete(id);\n }\n observeStep();\n return;\n }\n\n if (item.type === 'file_change' && event.type === 'item.completed') {\n for (const change of item.changes ?? []) {\n send({\n type: 'file-change',\n event:\n change.kind === 'add'\n ? 'create'\n : change.kind === 'delete'\n ? 'delete'\n : 'modify',\n path: change.path,\n });\n }\n observeStep();\n return;\n }\n\n if (item.type === 'error' && event.type === 'item.completed') {\n const message =\n typeof item.message === 'string' && item.message.trim()\n ? item.message\n : 'codex reported a non-fatal error item';\n emitWarning({ message });\n }\n };\n}\n\nfunction getWebSearchQuery(item: CodexItem): string | undefined {\n if (typeof item.query === 'string' && item.query.length > 0) {\n return item.query;\n }\n if (typeof item.action?.query === 'string' && item.action.query.length > 0) {\n return item.action.query;\n }\n}\n\nfunction emitWebSearchToolCall({\n id,\n query,\n nativeName,\n emittedWebSearchToolCalls,\n send,\n}: {\n id: string;\n query: string;\n nativeName: string;\n emittedWebSearchToolCalls: Set<string>;\n send: Emit;\n}): void {\n if (emittedWebSearchToolCalls.has(id)) return;\n emittedWebSearchToolCalls.add(id);\n send({\n type: 'tool-call',\n toolCallId: id,\n toolName: toCommonName(nativeName),\n nativeName,\n input: JSON.stringify({ query }),\n providerExecuted: true,\n });\n}\n\nfunction extractMcpToolCallResult(item: CodexItem): unknown {\n if (\n item.result === undefined ||\n item.result === null ||\n typeof item.result !== 'object'\n ) {\n return item.error?.message ? { error: item.error.message } : null;\n }\n const result = item.result as {\n content?: unknown;\n structured_content?: unknown;\n };\n if (\n result.structured_content !== undefined &&\n result.structured_content !== null\n ) {\n return result.structured_content;\n }\n return result.content ?? null;\n}\n\nfunction mapUsage(usage: Record<string, number>): Record<string, unknown> {\n const input = usage.input_tokens ?? 0;\n const cacheRead = usage.cached_input_tokens ?? 0;\n const cacheWrite = usage.cache_write_input_tokens ?? 0;\n return {\n inputTokens: {\n total: input,\n noCache: Math.max(0, input - cacheRead - cacheWrite),\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: usage.output_tokens ?? 0,\n text: usage.output_tokens ?? 0,\n },\n };\n}\n","/*\n * This long-running bridge process runs Codex app-server in the sandbox. The\n * shared bridge runtime owns the WebSocket transport, authentication,\n * reconnects, event replay, and lifecycle files; this entry point supplies the\n * Codex-specific turn implementation.\n */\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n} from '@ai-sdk/harness/bridge';\nimport type { StartMessage } from '../codex-bridge-protocol';\nimport { createCodexAppServerRuntime } from './codex-app-server-driver';\nimport { createCodexStepTracker, defaultUsage } from './codex-step-tracker';\nimport { createEmitStreamEvent } from './create-emit-stream-event';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = requireArg({ value: args.workdir, name: '--workdir' });\nconst bridgeStateDir = requireArg({\n value: args.bridgeStateDir,\n name: '--bridge-state-dir',\n});\nconst HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;\n\nconst threadState: { id: string | undefined } = { id: undefined };\nconst appServer = createCodexAppServerRuntime();\n\nawait runBridge<StartMessage>({\n bridgeType: 'codex',\n bridgeStateDir,\n onStart: runTurn,\n onStop: async () => {\n const data = threadState.id ? { threadId: threadState.id } : {};\n await appServer.close();\n return data;\n },\n onDestroy: () => appServer.close(),\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n if (start.restartThread) {\n threadState.id = undefined;\n } else if (\n typeof start.resumeThreadId === 'string' &&\n start.resumeThreadId.length > 0\n ) {\n threadState.id = start.resumeThreadId;\n }\n\n const runtime = resolveCodexRuntime({ start });\n let turnUsage: Record<string, unknown> = defaultUsage();\n const stepTracker = createCodexStepTracker({ send: emit });\n const emitStreamEvent = createEmitStreamEvent({\n send: emit,\n stepTracker,\n setTurnUsage: usage => (turnUsage = usage),\n setThreadId: threadId => (threadState.id = threadId),\n emitWarning: turn.emitWarning,\n emitError: turn.emitError,\n });\n\n try {\n await appServer.runTurn({\n start,\n turn,\n emit,\n workdir,\n threadId: threadState.id,\n codexModel: runtime.codexModel,\n codexConfig: runtime.codexConfig,\n stepTracker,\n emitStreamEvent,\n });\n } catch (error) {\n if (!turn.abortSignal.aborted) {\n turn.emitError({ error, message: 'codex turn failed' });\n }\n return;\n }\n\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage,\n });\n}\n\ntype CodexRuntime = {\n codexConfig: Record<string, unknown>;\n codexModel: string | undefined;\n};\n\nfunction resolveCodexRuntime({ start }: { start: StartMessage }): CodexRuntime {\n const codexConfig: Record<string, unknown> = {\n ...start.codexConfig,\n developer_instructions: [\n start.instructions,\n 'Only respond with your `final` message once you have fully addressed the user request.',\n ]\n .filter((instruction): instruction is string => Boolean(instruction))\n .join('\\n\\n'),\n model_reasoning_summary: 'detailed',\n };\n\n const gatewayBaseUrl = procEnv.AI_GATEWAY_BASE_URL;\n const hasGatewayAuth = Boolean(procEnv.AI_GATEWAY_API_KEY || gatewayBaseUrl);\n if (hasGatewayAuth && !gatewayBaseUrl) {\n throw new Error(\n 'AI Gateway auth was selected but AI_GATEWAY_BASE_URL is missing from the Codex bridge environment.',\n );\n }\n /*\n * The standalone app-server deliberately ignores CODEX_API_KEY for its\n * built-in OpenAI provider. A custom provider with an explicit env_key keeps\n * direct credentials process-local.\n */\n const apiBaseUrl = hasGatewayAuth\n ? gatewayBaseUrl\n : (procEnv.OPENAI_BASE_URL ??\n (procEnv.CODEX_API_KEY != null || start.headers != null\n ? 'https://api.openai.com/v1'\n : undefined));\n const codexModel =\n start.model && hasGatewayAuth && !start.model.includes('/')\n ? `openai/${start.model}`\n : start.model;\n /*\n * AI Gateway only returns populated reasoning summaries for its\n * creator-qualified model IDs. Codex treats qualified IDs as custom model\n * metadata, so its reasoning-summary capability must also be forced on for\n * the OpenAI Gateway route.\n */\n if (hasGatewayAuth && codexModel?.startsWith('openai/')) {\n codexConfig.model_supports_reasoning_summaries = true;\n }\n if (apiBaseUrl) {\n codexConfig.preferred_auth_method = 'apikey';\n codexConfig.model_provider = 'agent_bridge_openai';\n codexConfig.model_providers = {\n agent_bridge_openai: {\n name: procEnv.CODEX_MODEL_PROVIDER_NAME || 'Agent Bridge OpenAI',\n base_url: apiBaseUrl,\n env_key: 'CODEX_API_KEY',\n wire_api: 'responses',\n supports_websockets: false,\n ...(start.headers != null || (hasGatewayAuth && HARNESS_CLIENT_APP)\n ? {\n http_headers: {\n ...start.headers,\n ...(hasGatewayAuth && HARNESS_CLIENT_APP\n ? {\n 'User-Agent': HARNESS_CLIENT_APP,\n 'x-client-app': HARNESS_CLIENT_APP,\n }\n : {}),\n },\n }\n : {}),\n },\n };\n }\n if (start.mcpServers != null) {\n codexConfig.mcp_servers = start.mcpServers;\n }\n return { codexConfig, codexModel };\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: {\n workdir?: string;\n bridgeStateDir?: 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 }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n\nfunction requireArg({\n value,\n name,\n}: {\n value: string | undefined;\n name: string;\n}): string {\n if (!value) {\n emitFatal(`Missing ${name} argument.`);\n }\n return value;\n}\n"],"mappings":"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","names":["bridgeStateDir","pending","createHash","args","asRecord","key","runTurn","workdir","asRecord","createHash","path","randomUUID","procEnv","stdout","args"]}
|
package/dist/index.js
CHANGED
|
@@ -533,7 +533,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
|
|
|
533
533
|
]);
|
|
534
534
|
|
|
535
535
|
// src/version.ts
|
|
536
|
-
var VERSION = true ? "1.0.
|
|
536
|
+
var VERSION = true ? "1.0.131" : "0.0.0-test";
|
|
537
537
|
|
|
538
538
|
// src/codex-harness.ts
|
|
539
539
|
var DEFAULT_CODEX_MODEL = "gpt-5.5";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-codex",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.131",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/harness": "1.0.
|
|
30
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
29
|
+
"@ai-sdk/harness": "1.0.129",
|
|
30
|
+
"@ai-sdk/provider-utils": "5.0.50",
|
|
31
31
|
"ws": "^8.21.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -62,6 +62,13 @@ function toCommonName(nativeName: string): HarnessV1BuiltinToolName | string {
|
|
|
62
62
|
return NATIVE_TO_COMMON[nativeName] ?? nativeName;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
function getMcpToolName(item: CodexItem): string {
|
|
66
|
+
const toolName = item.tool ?? 'unknown';
|
|
67
|
+
return item.server != null && item.server.length > 0
|
|
68
|
+
? `mcp__${item.server}__${toolName}`
|
|
69
|
+
: toolName;
|
|
70
|
+
}
|
|
71
|
+
|
|
65
72
|
export function createEmitStreamEvent({
|
|
66
73
|
send,
|
|
67
74
|
stepTracker,
|
|
@@ -206,12 +213,13 @@ export function createEmitStreamEvent({
|
|
|
206
213
|
}
|
|
207
214
|
|
|
208
215
|
if (item.type === 'mcp_tool_call') {
|
|
216
|
+
const toolName = getMcpToolName(item);
|
|
209
217
|
if (event.type === 'item.started') {
|
|
210
218
|
send({
|
|
211
219
|
type: 'tool-call',
|
|
212
220
|
toolCallId: id,
|
|
213
|
-
toolName
|
|
214
|
-
nativeName:
|
|
221
|
+
toolName,
|
|
222
|
+
nativeName: toolName,
|
|
215
223
|
input: JSON.stringify(item.arguments ?? {}),
|
|
216
224
|
providerExecuted: true,
|
|
217
225
|
dynamic: true,
|
|
@@ -220,7 +228,7 @@ export function createEmitStreamEvent({
|
|
|
220
228
|
send({
|
|
221
229
|
type: 'tool-result',
|
|
222
230
|
toolCallId: id,
|
|
223
|
-
toolName
|
|
231
|
+
toolName,
|
|
224
232
|
result: extractMcpToolCallResult(item),
|
|
225
233
|
dynamic: true,
|
|
226
234
|
});
|