@ai-sdk/harness-codex 1.0.167 → 1.0.168

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @ai-sdk/harness-codex
2
2
 
3
+ ## 1.0.168
4
+
5
+ ### Patch Changes
6
+
7
+ - 68db1af: fix(harness-codex): enable web search for Responses Lite models when using OpenAI API key or subscription auth
8
+ - Updated dependencies [57086ff]
9
+ - Updated dependencies [95348b3]
10
+ - @ai-sdk/provider-utils@5.0.70
11
+ - @ai-sdk/harness@1.0.166
12
+
3
13
  ## 1.0.167
4
14
 
5
15
  ### Patch Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AI SDK - Codex Harness
2
2
 
3
- `HarnessV1` adapter backed by the [Codex CLI](https://www.npmjs.com/package/@openai/codex). The adapter runs Codex app-server inside a sandbox and communicates with it over JSON-RPC. A bridge process connects app-server to the host over a WebSocket on a sandbox-proxied loopback port.
3
+ `HarnessV1` adapter backed by the [Codex CLI](https://www.npmjs.com/package/@openai/codex). The adapter runs Codex app-server inside a sandbox and communicates with it over JSON-RPC.
4
4
 
5
5
  -> **Note**: This package is experimental.
6
6
 
@@ -2114,6 +2114,7 @@ const bridgeStateDir = requireArg({
2114
2114
  name: "--bridge-state-dir"
2115
2115
  });
2116
2116
  const HARNESS_CLIENT_APP = env.AI_SDK_HARNESS_CLIENT_APP;
2117
+ const STANDALONE_WEB_SEARCH_BASE_URLS = /* @__PURE__ */ new Set(["https://api.openai.com/v1", "https://chatgpt.com/backend-api/codex"]);
2117
2118
  const threadState = { id: void 0 };
2118
2119
  const appServer = createCodexAppServerRuntime();
2119
2120
  await runBridge({
@@ -2191,6 +2192,7 @@ function resolveCodexRuntime({ start }) {
2191
2192
  env_key: "CODEX_API_KEY",
2192
2193
  wire_api: "responses",
2193
2194
  supports_websockets: false,
2195
+ ...STANDALONE_WEB_SEARCH_BASE_URLS.has(apiBaseUrl.replace(/\/+$/, "")) ? { supports_standalone_web_search: true } : {},
2194
2196
  ...start.headers != null || hasGatewayAuth && HARNESS_CLIENT_APP ? { http_headers: {
2195
2197
  ...start.headers,
2196
2198
  ...hasGatewayAuth && HARNESS_CLIENT_APP ? {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["asRecord","asRecord","procEnv"],"sources":["../../../harness/dist/bridge/index.js","../../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-app-server-driver.ts","../../src/bridge/codex-step-tracker.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/index.ts"],"sourcesContent":["import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { env, pid, stdout } from \"node:process\";\nimport { WebSocketServer } from \"ws\";\n//#region src/bridge/harness-bridge-capability-unsupported-error.ts\nconst name = \"AI_HarnessBridgeCapabilityUnsupportedError\";\n/**\n* Signals an unsupported capability discovered inside a sandbox bridge.\n* `isInstance` also recognizes the serialized error shape received by the\n* host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n*/\nvar HarnessBridgeCapabilityUnsupportedError = class extends Error {\n\tconstructor({ message, harnessId, cause }) {\n\t\tsuper(message);\n\t\tObject.defineProperty(this, \"name\", { value: name });\n\t\tthis.harnessId = harnessId;\n\t\tthis.cause = cause;\n\t}\n\tstatic isInstance(error) {\n\t\treturn error != null && typeof error === \"object\" && \"name\" in error && error.name === name && \"message\" in error && typeof error.message === \"string\";\n\t}\n};\n//#endregion\n//#region src/utils/convert-harness-tool-model-output.ts\nfunction getNormalizedInlineImage(part) {\n\tif (part.type === \"file\" && part.mediaType.startsWith(\"image/\") && part.mediaType !== \"image/*\" && part.data.type === \"data\" && typeof part.data.data === \"string\") return {\n\t\tdata: part.data.data,\n\t\tmediaType: part.mediaType\n\t};\n}\nfunction convertHarnessToolModelOutput({ output }) {\n\tswitch (output.type) {\n\t\tcase \"text\":\n\t\tcase \"error-text\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: output.value\n\t\t\t}],\n\t\t\tisError: output.type === \"error-text\"\n\t\t};\n\t\tcase \"json\":\n\t\tcase \"error-json\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: JSON.stringify(output.value)\n\t\t\t}],\n\t\t\tisError: output.type === \"error-json\"\n\t\t};\n\t\tcase \"execution-denied\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: output.reason ?? \"Tool execution denied.\"\n\t\t\t}],\n\t\t\tisError: true\n\t\t};\n\t\tcase \"content\": return {\n\t\t\tcontent: output.value.map((part) => {\n\t\t\t\tif (part.type === \"text\") return {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: part.text\n\t\t\t\t};\n\t\t\t\tconst image = getNormalizedInlineImage(part);\n\t\t\t\tif (image != null) return {\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\t...image\n\t\t\t\t};\n\t\t\t\tthrow new HarnessBridgeCapabilityUnsupportedError({ message: `Harnesses support only text and inline images in tool model output; unsupported content '${part.type}'.` });\n\t\t\t}),\n\t\t\tisError: false\n\t\t};\n\t}\n}\n//#endregion\n//#region src/bridge/index.ts\nconst DEBUG_LEVEL_WEIGHT = {\n\terror: 0,\n\twarn: 1,\n\tinfo: 2,\n\tdebug: 3,\n\ttrace: 4\n};\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(filters, subsystem) {\n\tif (!filters || filters.length === 0) return true;\n\treturn filters.some((filter) => subsystem === filter || subsystem.startsWith(`${filter}.`));\n}\nfunction formatBridgeError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\tif (typeof err === \"string\") return { message: err };\n\tif (err !== null && typeof err === \"object\") try {\n\t\treturn { message: JSON.stringify(err) };\n\t} catch {}\n\treturn { message: String(err) };\n}\nfunction createBridgeUserMessageQueue(options) {\n\tconst messages = [];\n\tconst waiters = [];\n\tconst entries = /* @__PURE__ */ new Map();\n\tlet closed = false;\n\tlet pendingCount = 0;\n\tconst enqueue = (input) => {\n\t\tconst existing = entries.get(input.messageId);\n\t\tif (existing != null) {\n\t\t\tif (existing.response != null) options.respond(existing.response);\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tconst settle = (response) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tpendingCount--;\n\t\t\tconst entry = entries.get(input.messageId);\n\t\t\tif (entry != null) entry.response = response;\n\t\t\toptions.respond(response);\n\t\t};\n\t\tconst message = {\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: input.text,\n\t\t\taccept: () => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: true\n\t\t\t\t});\n\t\t\t},\n\t\t\treject: (error) => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: false,\n\t\t\t\t\terror: { message: formatBridgeError(error).message }\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tentries.set(input.messageId, { reject: message.reject });\n\t\tpendingCount++;\n\t\tif (closed) {\n\t\t\tmessage.reject(/* @__PURE__ */ new Error(\"The bridge turn is no longer accepting user messages.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiters.shift();\n\t\tif (waiter != null) waiter({\n\t\t\tdone: false,\n\t\t\tvalue: message\n\t\t});\n\t\telse messages.push(message);\n\t};\n\tconst close = (error) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tconst reason = error ?? /* @__PURE__ */ new Error(\"The bridge turn ended before accepting the user message.\");\n\t\tfor (const entry of entries.values()) if (entry.response == null) entry.reject(reason);\n\t\tmessages.length = 0;\n\t\twhile (waiters.length > 0) waiters.shift()({\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t});\n\t};\n\treturn {\n\t\tget pendingCount() {\n\t\t\treturn pendingCount;\n\t\t},\n\t\tenqueue,\n\t\tclose,\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn { next: () => {\n\t\t\t\tconst message = messages.shift();\n\t\t\t\tif (message != null) return Promise.resolve({\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: message\n\t\t\t\t});\n\t\t\t\tif (closed) return Promise.resolve({\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t});\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twaiters.push(resolve);\n\t\t\t\t});\n\t\t\t} };\n\t\t}\n\t};\n}\nfunction parseEnvList(value) {\n\tif (!value) return void 0;\n\tconst items = value.split(\",\").map((item) => item.trim()).filter(Boolean);\n\treturn items.length > 0 ? items : void 0;\n}\nconst ENV_TRUTHY = /* @__PURE__ */ new Set([\n\t\"1\",\n\t\"true\",\n\t\"yes\",\n\t\"on\"\n]);\nconst WS_OPEN = 1;\nasync function runBridge(options) {\n\tconst { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n\tconst teardownGraceMs = options.turnTeardownGraceMs ?? 1e4;\n\tconst expectedToken = options.token ?? env.BRIDGE_CHANNEL_TOKEN ?? \"\";\n\tconst bridgeWsPort = options.port ?? parseInt(env.BRIDGE_WS_PORT ?? \"0\", 10);\n\tconst bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n\tconst startConfigPath = `${bridgeStateDir}/start-config.json`;\n\tconst rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n\tconst eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\ttry {\n\t\tawait mkdir(bridgeStateDir, { recursive: true });\n\t} catch {}\n\tlet currentBoundPort = 0;\n\tlet currentTurnState = \"init\";\n\tlet activeSocket;\n\tlet isFirstTurn = true;\n\tlet turnAbort;\n\tlet currentUserMessages;\n\t/**\n\t* Settles when the in-flight turn has fully wound down — `onStart`\n\t* returned or threw AND its completion state was recorded. `undefined`\n\t* between turns. A new `start` fences on this so turns never overlap.\n\t*/\n\tlet activeTurn;\n\tlet debugConfig;\n\tlet consoleCaptureInstalled = false;\n\tconst envDebugEnabled = ENV_TRUTHY.has((env.HARNESS_DEBUG ?? \"\").toLowerCase());\n\tlet seqCounter = 0;\n\tlet eventLog = [];\n\tlet diskBuffer = \"\";\n\tlet flushPromise = null;\n\tconst flushEventsToDisk = async () => {\n\t\twhile (diskBuffer.length > 0) {\n\t\t\tconst buf = diskBuffer;\n\t\t\tdiskBuffer = \"\";\n\t\t\tawait appendFile(eventLogPath, buf).catch(() => {});\n\t\t}\n\t};\n\tconst scheduleEventFlush = () => {\n\t\tif (flushPromise) return;\n\t\tflushPromise = new Promise((resolve) => {\n\t\t\tsetImmediate(() => {\n\t\t\t\tflushEventsToDisk().finally(resolve);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tflushPromise = null;\n\t\t\tif (diskBuffer.length > 0) scheduleEventFlush();\n\t\t});\n\t};\n\tconst flushPendingEventsToDisk = async () => {\n\t\tif (diskBuffer.length > 0 && !flushPromise) scheduleEventFlush();\n\t\tlet inFlight = flushPromise;\n\t\twhile (inFlight) {\n\t\t\tawait inFlight;\n\t\t\tinFlight = flushPromise;\n\t\t}\n\t};\n\tif (env.BRIDGE_REPLAY_FROM_DISK === \"1\" && existsSync(eventLogPath)) try {\n\t\teventLog = readFileSync(eventLogPath, \"utf8\").split(\"\\n\").map((line) => line.trim()).filter(Boolean).map((line) => ({\n\t\t\tseq: JSON.parse(line).seq,\n\t\t\tline\n\t\t}));\n\t\tseqCounter = eventLog.at(-1)?.seq ?? 0;\n\t} catch {\n\t\teventLog = [];\n\t\tseqCounter = 0;\n\t}\n\tconst pendingToolResults = /* @__PURE__ */ new Map();\n\tconst bufferedToolResults = [];\n\tconst pendingToolApprovals = /* @__PURE__ */ new Map();\n\tconst writeBridgeMeta = async (state) => {\n\t\ttry {\n\t\t\tawait writeFile(bridgeMetaPath, JSON.stringify({\n\t\t\t\ttype: bridgeType,\n\t\t\t\tport: currentBoundPort,\n\t\t\t\tstate,\n\t\t\t\tpid\n\t\t\t}));\n\t\t} catch {}\n\t};\n\tconst writeStartConfig = async (start) => {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(start);\n\t\t\tawait writeFile(startConfigPath, serialized);\n\t\t\tif (!existsSync(rerunStartConfigPath)) await writeFile(rerunStartConfigPath, serialized);\n\t\t} catch {}\n\t};\n\tconst emit = (event) => {\n\t\tconst seq = ++seqCounter;\n\t\tconst line = JSON.stringify({\n\t\t\t...event,\n\t\t\tseq\n\t\t});\n\t\teventLog.push({\n\t\t\tseq,\n\t\t\tline\n\t\t});\n\t\tdiskBuffer += `${line}\\n`;\n\t\tscheduleEventFlush();\n\t\tif (activeSocket?.readyState === WS_OPEN) try {\n\t\t\tactiveSocket.send(line);\n\t\t} catch {}\n\t};\n\tconst replay = (ws, afterSeq) => {\n\t\tfor (const entry of eventLog) if (entry.seq > afterSeq && ws.readyState === WS_OPEN) ws.send(entry.line);\n\t};\n\tconst shouldEmitDebugEvent = (level, subsystem) => {\n\t\tif (!debugConfig?.enabled) return false;\n\t\tconst threshold = debugConfig.level ?? \"debug\";\n\t\tif (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n\t\treturn subsystemMatches(debugConfig.subsystems, subsystem);\n\t};\n\tconst rawStdoutWrite = process.stdout.write.bind(process.stdout);\n\tconst rawStderrWrite = process.stderr.write.bind(process.stderr);\n\tconst writeErrorToStderr = (input) => {\n\t\ttry {\n\t\t\tconst formatted = formatBridgeError(input.error);\n\t\t\trawStderrWrite(`[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`);\n\t\t\tif (formatted.stack) rawStderrWrite(`${formatted.stack}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitWarning = (input) => {\n\t\ttry {\n\t\t\tfor (const line of input.message.split(\"\\n\")) if (line.trim().length > 0) rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitError = (input) => {\n\t\twriteErrorToStderr({\n\t\t\tmessage: input.message ?? \"bridge error\",\n\t\t\terror: input.error\n\t\t});\n\t\temit({\n\t\t\ttype: \"error\",\n\t\t\terror: serialiseError(input.error)\n\t\t});\n\t};\n\tconst installConsoleCapture = () => {\n\t\tif (consoleCaptureInstalled) return;\n\t\tconsoleCaptureInstalled = true;\n\t\tconst buffers = {\n\t\t\tstdout: \"\",\n\t\t\tstderr: \"\"\n\t\t};\n\t\tconst patch = (stream, raw) => (chunk, encoding, cb) => {\n\t\t\tif (debugConfig?.enabled) try {\n\t\t\t\tconst enc = typeof encoding === \"string\" ? encoding : \"utf8\";\n\t\t\t\tconst text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(enc);\n\t\t\t\tconst parts = (buffers[stream] + text.replace(/\\r\\n/g, \"\\n\")).split(\"\\n\");\n\t\t\t\tbuffers[stream] = parts.pop() ?? \"\";\n\t\t\t\tfor (const line of parts) {\n\t\t\t\t\tconst trimmed = line.replace(/\\s+$/, \"\");\n\t\t\t\t\tif (trimmed) emit({\n\t\t\t\t\t\ttype: \"sandbox-log\",\n\t\t\t\t\t\tsource: bridgeType,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tline: trimmed\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\treturn raw(chunk, encoding, cb);\n\t\t};\n\t\tprocess.stdout.write = patch(\"stdout\", rawStdoutWrite);\n\t\tprocess.stderr.write = patch(\"stderr\", rawStderrWrite);\n\t};\n\tconst handleInbound = async (msg, ws) => {\n\t\tswitch (msg.type) {\n\t\t\tcase \"start\": {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst pendingTurn = activeTurn;\n\t\t\t\t\tif (pendingTurn == null) break;\n\t\t\t\t\tturnAbort?.abort();\n\t\t\t\t\tcurrentUserMessages?.close(/* @__PURE__ */ new Error(\"A new bridge turn replaced the active turn.\"));\n\t\t\t\t\tlet graceTimer;\n\t\t\t\t\tconst settled = await Promise.race([pendingTurn.then(() => true), new Promise((resolve) => {\n\t\t\t\t\t\tgraceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n\t\t\t\t\t\tgraceTimer.unref?.();\n\t\t\t\t\t})]);\n\t\t\t\t\tclearTimeout(graceTimer);\n\t\t\t\t\tif (!settled) break;\n\t\t\t\t}\n\t\t\t\tlet turnFinished;\n\t\t\t\tconst thisTurn = new Promise((resolve) => turnFinished = resolve);\n\t\t\t\tactiveTurn = thisTurn;\n\t\t\t\tactiveSocket = ws;\n\t\t\t\tconst firstTurn = isFirstTurn;\n\t\t\t\tisFirstTurn = false;\n\t\t\t\teventLog = [];\n\t\t\t\tdiskBuffer = \"\";\n\t\t\t\twriteFile(eventLogPath, \"\").catch(() => {});\n\t\t\t\tturnAbort = new AbortController();\n\t\t\t\tcurrentTurnState = \"running\";\n\t\t\t\twriteStartConfig(msg);\n\t\t\t\twriteBridgeMeta(\"running\");\n\t\t\t\tconst startDebug = msg.debug;\n\t\t\t\tdebugConfig = {\n\t\t\t\t\tenabled: startDebug?.enabled ?? envDebugEnabled,\n\t\t\t\t\tlevel: startDebug?.level ?? env.HARNESS_DEBUG_LEVEL,\n\t\t\t\t\tsubsystems: startDebug?.subsystems ?? parseEnvList(env.HARNESS_DEBUG_SUBSYSTEMS)\n\t\t\t\t};\n\t\t\t\tif (debugConfig.enabled) installConsoleCapture();\n\t\t\t\tconst userMessages = createBridgeUserMessageQueue({ respond: emit });\n\t\t\t\tconst turn = {\n\t\t\t\t\temit,\n\t\t\t\t\trequestToolResult: (requestInput) => {\n\t\t\t\t\t\tconst request = typeof requestInput === \"string\" ? { toolCallId: requestInput } : requestInput;\n\t\t\t\t\t\tconst bufferedIndex = bufferedToolResults.findIndex((buffered) => buffered.toolCallId === request.toolCallId || request.matches?.(buffered.result) === true);\n\t\t\t\t\t\tif (bufferedIndex >= 0) return Promise.resolve(bufferedToolResults.splice(bufferedIndex, 1)[0].result);\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tpendingToolResults.set(request.toolCallId, {\n\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\tmatches: request.matches\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trequestToolApproval: (approvalId) => new Promise((resolve) => {\n\t\t\t\t\t\tpendingToolApprovals.set(approvalId, resolve);\n\t\t\t\t\t}),\n\t\t\t\t\texperimental_userMessages: userMessages,\n\t\t\t\t\tabortSignal: turnAbort.signal,\n\t\t\t\t\tfirstTurn,\n\t\t\t\t\tbridgeLog: (input) => {\n\t\t\t\t\t\tconst level = input.level ?? \"debug\";\n\t\t\t\t\t\tif (!shouldEmitDebugEvent(level, input.subsystem)) return;\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"debug-event\",\n\t\t\t\t\t\t\tlevel,\n\t\t\t\t\t\t\tsubsystem: input.subsystem,\n\t\t\t\t\t\t\tmessage: input.message,\n\t\t\t\t\t\t\t...input.attrs ? { attrs: input.attrs } : {},\n\t\t\t\t\t\t\t...input.error !== void 0 ? { error: formatBridgeError(input.error) } : {}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\temitWarning,\n\t\t\t\t\temitError\n\t\t\t\t};\n\t\t\t\tcurrentUserMessages = userMessages;\n\t\t\t\ttry {\n\t\t\t\t\tawait onStart(msg, turn);\n\t\t\t\t} catch (err) {\n\t\t\t\t\temitError({\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t\tmessage: \"bridge turn failed\"\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tuserMessages.close();\n\t\t\t\t\tif (currentUserMessages === userMessages) currentUserMessages = void 0;\n\t\t\t\t\tif (activeTurn === thisTurn) {\n\t\t\t\t\t\tactiveTurn = void 0;\n\t\t\t\t\t\tcurrentTurnState = \"waiting\";\n\t\t\t\t\t\twriteBridgeMeta(\"waiting\");\n\t\t\t\t\t}\n\t\t\t\t\tturnFinished();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-result\": {\n\t\t\t\tconst result = {\n\t\t\t\t\toutput: msg.output,\n\t\t\t\t\tisError: msg.isError,\n\t\t\t\t\ttoolResult: msg.toolResult\n\t\t\t\t};\n\t\t\t\tconst exactPending = pendingToolResults.get(msg.toolCallId);\n\t\t\t\tconst matchingPending = exactPending == null ? Array.from(pendingToolResults.entries()).find(([, pending]) => pending.matches?.(result) === true) : void 0;\n\t\t\t\tconst pending = exactPending ?? matchingPending?.[1];\n\t\t\t\tconst pendingId = exactPending != null ? msg.toolCallId : matchingPending?.[0];\n\t\t\t\tif (pending != null && pendingId != null) {\n\t\t\t\t\tpendingToolResults.delete(pendingId);\n\t\t\t\t\tpending.resolve(result);\n\t\t\t\t} else bufferedToolResults.push({\n\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-approval-response\": {\n\t\t\t\tconst resolver = pendingToolApprovals.get(msg.approvalId);\n\t\t\t\tif (resolver) {\n\t\t\t\t\tpendingToolApprovals.delete(msg.approvalId);\n\t\t\t\t\tresolver({\n\t\t\t\t\t\tapproved: msg.approved,\n\t\t\t\t\t\treason: msg.reason\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"user-message\": {\n\t\t\t\tconst messageId = msg.messageId ?? randomUUID();\n\t\t\t\tif (currentUserMessages == null) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The bridge has no active turn to steer.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ws !== activeSocket) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The connection does not own the active bridge turn.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentUserMessages.enqueue({\n\t\t\t\t\tmessageId,\n\t\t\t\t\ttext: msg.text\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"abort\":\n\t\t\t\tturnAbort?.abort();\n\t\t\t\treturn;\n\t\t\tcase \"resume\":\n\t\t\t\tactiveSocket = ws;\n\t\t\t\treplay(ws, msg.lastSeenEventId);\n\t\t\t\treturn;\n\t\t\tcase \"destroy\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tawait onDestroy?.();\n\t\t\t\tdrainThenExit(ws, 1e3, \"destroy\");\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"bridge-stop\",\n\t\t\t\t\tdata: await onStop?.() ?? {}\n\t\t\t\t});\n\t\t\t\tdrainThenExit(ws, 1e3, \"stop\");\n\t\t}\n\t};\n\twriteBridgeMeta(\"init\");\n\tconst wss = new WebSocketServer({\n\t\tport: bridgeWsPort,\n\t\thost: \"0.0.0.0\"\n\t});\n\tconst exit = () => {\n\t\tif (options.onExit) {\n\t\t\toptions.onExit();\n\t\t\treturn;\n\t\t}\n\t\twss.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(0), 1e3).unref();\n\t};\n\tconst drainThenExit = (ws, code, reason) => {\n\t\tconst start = Date.now();\n\t\tconst tick = () => {\n\t\t\tif (ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN || Date.now() - start >= 5e3) {\n\t\t\t\tflushPendingEventsToDisk().finally(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tws.close(code, reason);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\texit();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(tick, 10).unref();\n\t\t};\n\t\ttick();\n\t};\n\twss.on(\"listening\", () => {\n\t\tconst addr = wss.address();\n\t\tcurrentBoundPort = typeof addr === \"object\" && addr ? addr.port : 0;\n\t\tcurrentTurnState = \"waiting\";\n\t\twriteBridgeMeta(\"waiting\");\n\t\tstdout.write(JSON.stringify({\n\t\t\ttype: \"bridge-ready\",\n\t\t\tport: currentBoundPort\n\t\t}) + \"\\n\");\n\t\toptions.onListening?.(currentBoundPort);\n\t});\n\twss.on(\"connection\", (ws, req) => {\n\t\tif (new URL(req.url ?? \"/\", \"http://localhost\").searchParams.get(\"agent_bridge_token\") !== expectedToken) {\n\t\t\tws.close(1008, \"unauthorized\");\n\t\t\treturn;\n\t\t}\n\t\tsendControl(ws, {\n\t\t\ttype: \"bridge-hello\",\n\t\t\tstate: currentTurnState,\n\t\t\tlastSeq: seqCounter,\n\t\t\tcapabilities: { experimental_userMessageResponses: true }\n\t\t});\n\t\tws.on(\"message\", (raw) => {\n\t\t\tlet parsed;\n\t\t\ttry {\n\t\t\t\tconst text = typeof raw === \"string\" ? raw : Buffer.from(raw).toString(\"utf8\");\n\t\t\t\tparsed = JSON.parse(text);\n\t\t\t} catch (err) {\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: `protocol parse error: ${err.message}`\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleInbound(parsed, ws);\n\t\t});\n\t\tws.on(\"close\", () => {\n\t\t\tif (activeSocket === ws) activeSocket = void 0;\n\t\t});\n\t\tws.on(\"error\", () => {});\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"uncaught exception\"\n\t\t});\n\t});\n\tprocess.on(\"unhandledRejection\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"unhandled rejection\"\n\t\t});\n\t});\n\tawait new Promise((resolve, reject) => {\n\t\tif (wss.address() != null) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\twss.once(\"listening\", resolve);\n\t\twss.once(\"error\", reject);\n\t});\n\treturn {\n\t\tport: currentBoundPort,\n\t\tclose: () => new Promise((resolve) => {\n\t\t\twss.close(() => resolve());\n\t\t})\n\t};\n}\nfunction sendControl(socket, message) {\n\tif (socket?.readyState === WS_OPEN) try {\n\t\tsocket.send(JSON.stringify(message));\n\t} catch {}\n}\nfunction serialiseError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\treturn err;\n}\n//#endregion\nexport { HarnessBridgeCapabilityUnsupportedError, convertHarnessToolModelOutput, runBridge };\n\n//# sourceMappingURL=index.js.map","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 status: normalizeMcpStatus(item.status),\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 normalizeMcpStatus(\n value: unknown,\n): 'in_progress' | 'completed' | 'failed' | undefined {\n if (value === 'inProgress') return 'in_progress';\n if (value === 'completed' || value === 'failed') return value;\n return undefined;\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 {\n convertHarnessToolModelOutput,\n type BridgeTurn,\n} 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 /*\n * The model Codex reported in the `thread/start` / `thread/resume` response\n * for the loaded thread, keyed by the model the bridge requested. Turns on an\n * already-loaded thread skip those requests, so the reported model is reused\n * while the requested model is unchanged.\n */\n let loadedThreadModel:\n | { requestedModel: string | undefined; modelId: string | undefined }\n | 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 loadedThreadModel = 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 stepTracker: active.options.stepTracker,\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 loadedThreadModel = 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 loadedThreadModel = {\n requestedModel: codexModel,\n modelId: readOptionalString(asRecord(threadResponse)?.model),\n };\n }\n handler.announceThread(currentTurn.threadId!);\n const threadModel = loadedThreadModel;\n const streamStartModelId =\n threadModel != null &&\n threadModel.requestedModel === codexModel &&\n threadModel.modelId != null\n ? threadModel.modelId\n : codexModel;\n emit({\n type: 'stream-start',\n ...(streamStartModelId ? { modelId: streamStartModelId } : {}),\n });\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:\n typeof start.prompt === 'string'\n ? [{ type: 'text', text: start.prompt, text_elements: [] }]\n : start.prompt.map(part =>\n part.type === 'text'\n ? { type: 'text', text: part.text, text_elements: [] }\n : {\n type: 'image',\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n ),\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 stepTracker,\n}: {\n request: CodexAppServerRequest;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n emit: Emit;\n requestToolResult: BridgeTurn['requestToolResult'];\n stepTracker: CodexStepTracker;\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 callId = params.callId;\n stepTracker.awaitHostInput({ itemId: callId });\n const result = await requestToolResult(callId).finally(() =>\n stepTracker.resolveHostInput({ itemId: callId }),\n );\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 if (result.toolResult != null) {\n const converted = convertHarnessToolModelOutput({\n output: result.toolResult.output,\n });\n return {\n contentItems: converted.content.map(part =>\n part.type === 'text'\n ? { type: 'inputText', text: part.text }\n : {\n type: 'inputImage',\n imageUrl: `data:${part.mediaType};base64,${part.data}`,\n },\n ),\n success: result.isError !== true && !converted.isError,\n };\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\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : 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 awaitHostInput(input: { itemId: string }): void;\n resolveHostInput(input: { itemId: string }): void;\n};\n\nexport function createCodexStepTracker(input: {\n send: Emit;\n}): CodexStepTracker {\n let stepOpen = false;\n const pendingToolItemIds = new Set<string>();\n /*\n * Dynamic tool calls waiting for the host to return their result. When\n * every pending tool item waits on the host, Codex cannot make progress, so\n * the tracker emits an early `finish-step` that lets the host pause the\n * turn. The step stays open until the regular `finish-step`.\n */\n const hostInputWaitingItemIds = new Set<string>();\n const earlyFinishStepItemIds = 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 earlyFinishStepItemIds.clear();\n };\n\n const emitEarlyFinishStepIfReady = (): void => {\n if (!stepOpen || pendingToolItemIds.size === 0) return;\n for (const itemId of pendingToolItemIds) {\n if (!hostInputWaitingItemIds.has(itemId)) return;\n }\n const uncovered = [...pendingToolItemIds].filter(\n itemId => !earlyFinishStepItemIds.has(itemId),\n );\n if (uncovered.length === 0) return;\n for (const itemId of uncovered) earlyFinishStepItemIds.add(itemId);\n input.send({\n type: 'finish-step',\n finishReason: { unified: 'tool-calls', raw: 'host-input' },\n usage: defaultUsage(),\n harnessMetadata: { codex: { inferredStep: true } },\n });\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 emitEarlyFinishStepIfReady();\n } else if (event.type === 'item.completed') {\n if (itemId) pendingToolItemIds.delete(itemId);\n finishStep();\n }\n }\n },\n finishTurn() {\n pendingToolItemIds.clear();\n hostInputWaitingItemIds.clear();\n finishStep();\n },\n awaitHostInput({ itemId }) {\n stepOpen = true;\n pendingToolItemIds.add(itemId);\n hostInputWaitingItemIds.add(itemId);\n emitEarlyFinishStepIfReady();\n },\n resolveHostInput({ itemId }) {\n hostInputWaitingItemIds.delete(itemId);\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 ...(item.status === 'failed' ? { isError: true } : {}),\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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"}
1
+ {"version":3,"file":"index.mjs","names":["asRecord","asRecord","procEnv"],"sources":["../../../harness/dist/bridge/index.js","../../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-app-server-driver.ts","../../src/bridge/codex-step-tracker.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/index.ts"],"sourcesContent":["import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { env, pid, stdout } from \"node:process\";\nimport { WebSocketServer } from \"ws\";\n//#region src/bridge/harness-bridge-capability-unsupported-error.ts\nconst name = \"AI_HarnessBridgeCapabilityUnsupportedError\";\n/**\n* Signals an unsupported capability discovered inside a sandbox bridge.\n* `isInstance` also recognizes the serialized error shape received by the\n* host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n*/\nvar HarnessBridgeCapabilityUnsupportedError = class extends Error {\n\tconstructor({ message, harnessId, cause }) {\n\t\tsuper(message);\n\t\tObject.defineProperty(this, \"name\", { value: name });\n\t\tthis.harnessId = harnessId;\n\t\tthis.cause = cause;\n\t}\n\tstatic isInstance(error) {\n\t\treturn error != null && typeof error === \"object\" && \"name\" in error && error.name === name && \"message\" in error && typeof error.message === \"string\";\n\t}\n};\n//#endregion\n//#region src/utils/convert-harness-tool-model-output.ts\nfunction getNormalizedInlineImage(part) {\n\tif (part.type === \"file\" && part.mediaType.startsWith(\"image/\") && part.mediaType !== \"image/*\" && part.data.type === \"data\" && typeof part.data.data === \"string\") return {\n\t\tdata: part.data.data,\n\t\tmediaType: part.mediaType\n\t};\n}\nfunction convertHarnessToolModelOutput({ output }) {\n\tswitch (output.type) {\n\t\tcase \"text\":\n\t\tcase \"error-text\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: output.value\n\t\t\t}],\n\t\t\tisError: output.type === \"error-text\"\n\t\t};\n\t\tcase \"json\":\n\t\tcase \"error-json\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: JSON.stringify(output.value)\n\t\t\t}],\n\t\t\tisError: output.type === \"error-json\"\n\t\t};\n\t\tcase \"execution-denied\": return {\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: output.reason ?? \"Tool execution denied.\"\n\t\t\t}],\n\t\t\tisError: true\n\t\t};\n\t\tcase \"content\": return {\n\t\t\tcontent: output.value.map((part) => {\n\t\t\t\tif (part.type === \"text\") return {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: part.text\n\t\t\t\t};\n\t\t\t\tconst image = getNormalizedInlineImage(part);\n\t\t\t\tif (image != null) return {\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\t...image\n\t\t\t\t};\n\t\t\t\tthrow new HarnessBridgeCapabilityUnsupportedError({ message: `Harnesses support only text and inline images in tool model output; unsupported content '${part.type}'.` });\n\t\t\t}),\n\t\t\tisError: false\n\t\t};\n\t}\n}\n//#endregion\n//#region src/bridge/index.ts\nconst DEBUG_LEVEL_WEIGHT = {\n\terror: 0,\n\twarn: 1,\n\tinfo: 2,\n\tdebug: 3,\n\ttrace: 4\n};\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(filters, subsystem) {\n\tif (!filters || filters.length === 0) return true;\n\treturn filters.some((filter) => subsystem === filter || subsystem.startsWith(`${filter}.`));\n}\nfunction formatBridgeError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\tif (typeof err === \"string\") return { message: err };\n\tif (err !== null && typeof err === \"object\") try {\n\t\treturn { message: JSON.stringify(err) };\n\t} catch {}\n\treturn { message: String(err) };\n}\nfunction createBridgeUserMessageQueue(options) {\n\tconst messages = [];\n\tconst waiters = [];\n\tconst entries = /* @__PURE__ */ new Map();\n\tlet closed = false;\n\tlet pendingCount = 0;\n\tconst enqueue = (input) => {\n\t\tconst existing = entries.get(input.messageId);\n\t\tif (existing != null) {\n\t\t\tif (existing.response != null) options.respond(existing.response);\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tconst settle = (response) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tpendingCount--;\n\t\t\tconst entry = entries.get(input.messageId);\n\t\t\tif (entry != null) entry.response = response;\n\t\t\toptions.respond(response);\n\t\t};\n\t\tconst message = {\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: input.text,\n\t\t\taccept: () => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: true\n\t\t\t\t});\n\t\t\t},\n\t\t\treject: (error) => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: false,\n\t\t\t\t\terror: { message: formatBridgeError(error).message }\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tentries.set(input.messageId, { reject: message.reject });\n\t\tpendingCount++;\n\t\tif (closed) {\n\t\t\tmessage.reject(/* @__PURE__ */ new Error(\"The bridge turn is no longer accepting user messages.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiters.shift();\n\t\tif (waiter != null) waiter({\n\t\t\tdone: false,\n\t\t\tvalue: message\n\t\t});\n\t\telse messages.push(message);\n\t};\n\tconst close = (error) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tconst reason = error ?? /* @__PURE__ */ new Error(\"The bridge turn ended before accepting the user message.\");\n\t\tfor (const entry of entries.values()) if (entry.response == null) entry.reject(reason);\n\t\tmessages.length = 0;\n\t\twhile (waiters.length > 0) waiters.shift()({\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t});\n\t};\n\treturn {\n\t\tget pendingCount() {\n\t\t\treturn pendingCount;\n\t\t},\n\t\tenqueue,\n\t\tclose,\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn { next: () => {\n\t\t\t\tconst message = messages.shift();\n\t\t\t\tif (message != null) return Promise.resolve({\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: message\n\t\t\t\t});\n\t\t\t\tif (closed) return Promise.resolve({\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t});\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twaiters.push(resolve);\n\t\t\t\t});\n\t\t\t} };\n\t\t}\n\t};\n}\nfunction parseEnvList(value) {\n\tif (!value) return void 0;\n\tconst items = value.split(\",\").map((item) => item.trim()).filter(Boolean);\n\treturn items.length > 0 ? items : void 0;\n}\nconst ENV_TRUTHY = /* @__PURE__ */ new Set([\n\t\"1\",\n\t\"true\",\n\t\"yes\",\n\t\"on\"\n]);\nconst WS_OPEN = 1;\nasync function runBridge(options) {\n\tconst { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n\tconst teardownGraceMs = options.turnTeardownGraceMs ?? 1e4;\n\tconst expectedToken = options.token ?? env.BRIDGE_CHANNEL_TOKEN ?? \"\";\n\tconst bridgeWsPort = options.port ?? parseInt(env.BRIDGE_WS_PORT ?? \"0\", 10);\n\tconst bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n\tconst startConfigPath = `${bridgeStateDir}/start-config.json`;\n\tconst rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n\tconst eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\ttry {\n\t\tawait mkdir(bridgeStateDir, { recursive: true });\n\t} catch {}\n\tlet currentBoundPort = 0;\n\tlet currentTurnState = \"init\";\n\tlet activeSocket;\n\tlet isFirstTurn = true;\n\tlet turnAbort;\n\tlet currentUserMessages;\n\t/**\n\t* Settles when the in-flight turn has fully wound down — `onStart`\n\t* returned or threw AND its completion state was recorded. `undefined`\n\t* between turns. A new `start` fences on this so turns never overlap.\n\t*/\n\tlet activeTurn;\n\tlet debugConfig;\n\tlet consoleCaptureInstalled = false;\n\tconst envDebugEnabled = ENV_TRUTHY.has((env.HARNESS_DEBUG ?? \"\").toLowerCase());\n\tlet seqCounter = 0;\n\tlet eventLog = [];\n\tlet diskBuffer = \"\";\n\tlet flushPromise = null;\n\tconst flushEventsToDisk = async () => {\n\t\twhile (diskBuffer.length > 0) {\n\t\t\tconst buf = diskBuffer;\n\t\t\tdiskBuffer = \"\";\n\t\t\tawait appendFile(eventLogPath, buf).catch(() => {});\n\t\t}\n\t};\n\tconst scheduleEventFlush = () => {\n\t\tif (flushPromise) return;\n\t\tflushPromise = new Promise((resolve) => {\n\t\t\tsetImmediate(() => {\n\t\t\t\tflushEventsToDisk().finally(resolve);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tflushPromise = null;\n\t\t\tif (diskBuffer.length > 0) scheduleEventFlush();\n\t\t});\n\t};\n\tconst flushPendingEventsToDisk = async () => {\n\t\tif (diskBuffer.length > 0 && !flushPromise) scheduleEventFlush();\n\t\tlet inFlight = flushPromise;\n\t\twhile (inFlight) {\n\t\t\tawait inFlight;\n\t\t\tinFlight = flushPromise;\n\t\t}\n\t};\n\tif (env.BRIDGE_REPLAY_FROM_DISK === \"1\" && existsSync(eventLogPath)) try {\n\t\teventLog = readFileSync(eventLogPath, \"utf8\").split(\"\\n\").map((line) => line.trim()).filter(Boolean).map((line) => ({\n\t\t\tseq: JSON.parse(line).seq,\n\t\t\tline\n\t\t}));\n\t\tseqCounter = eventLog.at(-1)?.seq ?? 0;\n\t} catch {\n\t\teventLog = [];\n\t\tseqCounter = 0;\n\t}\n\tconst pendingToolResults = /* @__PURE__ */ new Map();\n\tconst bufferedToolResults = [];\n\tconst pendingToolApprovals = /* @__PURE__ */ new Map();\n\tconst writeBridgeMeta = async (state) => {\n\t\ttry {\n\t\t\tawait writeFile(bridgeMetaPath, JSON.stringify({\n\t\t\t\ttype: bridgeType,\n\t\t\t\tport: currentBoundPort,\n\t\t\t\tstate,\n\t\t\t\tpid\n\t\t\t}));\n\t\t} catch {}\n\t};\n\tconst writeStartConfig = async (start) => {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(start);\n\t\t\tawait writeFile(startConfigPath, serialized);\n\t\t\tif (!existsSync(rerunStartConfigPath)) await writeFile(rerunStartConfigPath, serialized);\n\t\t} catch {}\n\t};\n\tconst emit = (event) => {\n\t\tconst seq = ++seqCounter;\n\t\tconst line = JSON.stringify({\n\t\t\t...event,\n\t\t\tseq\n\t\t});\n\t\teventLog.push({\n\t\t\tseq,\n\t\t\tline\n\t\t});\n\t\tdiskBuffer += `${line}\\n`;\n\t\tscheduleEventFlush();\n\t\tif (activeSocket?.readyState === WS_OPEN) try {\n\t\t\tactiveSocket.send(line);\n\t\t} catch {}\n\t};\n\tconst replay = (ws, afterSeq) => {\n\t\tfor (const entry of eventLog) if (entry.seq > afterSeq && ws.readyState === WS_OPEN) ws.send(entry.line);\n\t};\n\tconst shouldEmitDebugEvent = (level, subsystem) => {\n\t\tif (!debugConfig?.enabled) return false;\n\t\tconst threshold = debugConfig.level ?? \"debug\";\n\t\tif (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n\t\treturn subsystemMatches(debugConfig.subsystems, subsystem);\n\t};\n\tconst rawStdoutWrite = process.stdout.write.bind(process.stdout);\n\tconst rawStderrWrite = process.stderr.write.bind(process.stderr);\n\tconst writeErrorToStderr = (input) => {\n\t\ttry {\n\t\t\tconst formatted = formatBridgeError(input.error);\n\t\t\trawStderrWrite(`[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`);\n\t\t\tif (formatted.stack) rawStderrWrite(`${formatted.stack}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitWarning = (input) => {\n\t\ttry {\n\t\t\tfor (const line of input.message.split(\"\\n\")) if (line.trim().length > 0) rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitError = (input) => {\n\t\twriteErrorToStderr({\n\t\t\tmessage: input.message ?? \"bridge error\",\n\t\t\terror: input.error\n\t\t});\n\t\temit({\n\t\t\ttype: \"error\",\n\t\t\terror: serialiseError(input.error)\n\t\t});\n\t};\n\tconst installConsoleCapture = () => {\n\t\tif (consoleCaptureInstalled) return;\n\t\tconsoleCaptureInstalled = true;\n\t\tconst buffers = {\n\t\t\tstdout: \"\",\n\t\t\tstderr: \"\"\n\t\t};\n\t\tconst patch = (stream, raw) => (chunk, encoding, cb) => {\n\t\t\tif (debugConfig?.enabled) try {\n\t\t\t\tconst enc = typeof encoding === \"string\" ? encoding : \"utf8\";\n\t\t\t\tconst text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(enc);\n\t\t\t\tconst parts = (buffers[stream] + text.replace(/\\r\\n/g, \"\\n\")).split(\"\\n\");\n\t\t\t\tbuffers[stream] = parts.pop() ?? \"\";\n\t\t\t\tfor (const line of parts) {\n\t\t\t\t\tconst trimmed = line.replace(/\\s+$/, \"\");\n\t\t\t\t\tif (trimmed) emit({\n\t\t\t\t\t\ttype: \"sandbox-log\",\n\t\t\t\t\t\tsource: bridgeType,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tline: trimmed\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\treturn raw(chunk, encoding, cb);\n\t\t};\n\t\tprocess.stdout.write = patch(\"stdout\", rawStdoutWrite);\n\t\tprocess.stderr.write = patch(\"stderr\", rawStderrWrite);\n\t};\n\tconst handleInbound = async (msg, ws) => {\n\t\tswitch (msg.type) {\n\t\t\tcase \"start\": {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst pendingTurn = activeTurn;\n\t\t\t\t\tif (pendingTurn == null) break;\n\t\t\t\t\tturnAbort?.abort();\n\t\t\t\t\tcurrentUserMessages?.close(/* @__PURE__ */ new Error(\"A new bridge turn replaced the active turn.\"));\n\t\t\t\t\tlet graceTimer;\n\t\t\t\t\tconst settled = await Promise.race([pendingTurn.then(() => true), new Promise((resolve) => {\n\t\t\t\t\t\tgraceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n\t\t\t\t\t\tgraceTimer.unref?.();\n\t\t\t\t\t})]);\n\t\t\t\t\tclearTimeout(graceTimer);\n\t\t\t\t\tif (!settled) break;\n\t\t\t\t}\n\t\t\t\tlet turnFinished;\n\t\t\t\tconst thisTurn = new Promise((resolve) => turnFinished = resolve);\n\t\t\t\tactiveTurn = thisTurn;\n\t\t\t\tactiveSocket = ws;\n\t\t\t\tconst firstTurn = isFirstTurn;\n\t\t\t\tisFirstTurn = false;\n\t\t\t\teventLog = [];\n\t\t\t\tdiskBuffer = \"\";\n\t\t\t\twriteFile(eventLogPath, \"\").catch(() => {});\n\t\t\t\tturnAbort = new AbortController();\n\t\t\t\tcurrentTurnState = \"running\";\n\t\t\t\twriteStartConfig(msg);\n\t\t\t\twriteBridgeMeta(\"running\");\n\t\t\t\tconst startDebug = msg.debug;\n\t\t\t\tdebugConfig = {\n\t\t\t\t\tenabled: startDebug?.enabled ?? envDebugEnabled,\n\t\t\t\t\tlevel: startDebug?.level ?? env.HARNESS_DEBUG_LEVEL,\n\t\t\t\t\tsubsystems: startDebug?.subsystems ?? parseEnvList(env.HARNESS_DEBUG_SUBSYSTEMS)\n\t\t\t\t};\n\t\t\t\tif (debugConfig.enabled) installConsoleCapture();\n\t\t\t\tconst userMessages = createBridgeUserMessageQueue({ respond: emit });\n\t\t\t\tconst turn = {\n\t\t\t\t\temit,\n\t\t\t\t\trequestToolResult: (requestInput) => {\n\t\t\t\t\t\tconst request = typeof requestInput === \"string\" ? { toolCallId: requestInput } : requestInput;\n\t\t\t\t\t\tconst bufferedIndex = bufferedToolResults.findIndex((buffered) => buffered.toolCallId === request.toolCallId || request.matches?.(buffered.result) === true);\n\t\t\t\t\t\tif (bufferedIndex >= 0) return Promise.resolve(bufferedToolResults.splice(bufferedIndex, 1)[0].result);\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tpendingToolResults.set(request.toolCallId, {\n\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\tmatches: request.matches\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trequestToolApproval: (approvalId) => new Promise((resolve) => {\n\t\t\t\t\t\tpendingToolApprovals.set(approvalId, resolve);\n\t\t\t\t\t}),\n\t\t\t\t\texperimental_userMessages: userMessages,\n\t\t\t\t\tabortSignal: turnAbort.signal,\n\t\t\t\t\tfirstTurn,\n\t\t\t\t\tbridgeLog: (input) => {\n\t\t\t\t\t\tconst level = input.level ?? \"debug\";\n\t\t\t\t\t\tif (!shouldEmitDebugEvent(level, input.subsystem)) return;\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"debug-event\",\n\t\t\t\t\t\t\tlevel,\n\t\t\t\t\t\t\tsubsystem: input.subsystem,\n\t\t\t\t\t\t\tmessage: input.message,\n\t\t\t\t\t\t\t...input.attrs ? { attrs: input.attrs } : {},\n\t\t\t\t\t\t\t...input.error !== void 0 ? { error: formatBridgeError(input.error) } : {}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\temitWarning,\n\t\t\t\t\temitError\n\t\t\t\t};\n\t\t\t\tcurrentUserMessages = userMessages;\n\t\t\t\ttry {\n\t\t\t\t\tawait onStart(msg, turn);\n\t\t\t\t} catch (err) {\n\t\t\t\t\temitError({\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t\tmessage: \"bridge turn failed\"\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tuserMessages.close();\n\t\t\t\t\tif (currentUserMessages === userMessages) currentUserMessages = void 0;\n\t\t\t\t\tif (activeTurn === thisTurn) {\n\t\t\t\t\t\tactiveTurn = void 0;\n\t\t\t\t\t\tcurrentTurnState = \"waiting\";\n\t\t\t\t\t\twriteBridgeMeta(\"waiting\");\n\t\t\t\t\t}\n\t\t\t\t\tturnFinished();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-result\": {\n\t\t\t\tconst result = {\n\t\t\t\t\toutput: msg.output,\n\t\t\t\t\tisError: msg.isError,\n\t\t\t\t\ttoolResult: msg.toolResult\n\t\t\t\t};\n\t\t\t\tconst exactPending = pendingToolResults.get(msg.toolCallId);\n\t\t\t\tconst matchingPending = exactPending == null ? Array.from(pendingToolResults.entries()).find(([, pending]) => pending.matches?.(result) === true) : void 0;\n\t\t\t\tconst pending = exactPending ?? matchingPending?.[1];\n\t\t\t\tconst pendingId = exactPending != null ? msg.toolCallId : matchingPending?.[0];\n\t\t\t\tif (pending != null && pendingId != null) {\n\t\t\t\t\tpendingToolResults.delete(pendingId);\n\t\t\t\t\tpending.resolve(result);\n\t\t\t\t} else bufferedToolResults.push({\n\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-approval-response\": {\n\t\t\t\tconst resolver = pendingToolApprovals.get(msg.approvalId);\n\t\t\t\tif (resolver) {\n\t\t\t\t\tpendingToolApprovals.delete(msg.approvalId);\n\t\t\t\t\tresolver({\n\t\t\t\t\t\tapproved: msg.approved,\n\t\t\t\t\t\treason: msg.reason\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"user-message\": {\n\t\t\t\tconst messageId = msg.messageId ?? randomUUID();\n\t\t\t\tif (currentUserMessages == null) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The bridge has no active turn to steer.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ws !== activeSocket) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The connection does not own the active bridge turn.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentUserMessages.enqueue({\n\t\t\t\t\tmessageId,\n\t\t\t\t\ttext: msg.text\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"abort\":\n\t\t\t\tturnAbort?.abort();\n\t\t\t\treturn;\n\t\t\tcase \"resume\":\n\t\t\t\tactiveSocket = ws;\n\t\t\t\treplay(ws, msg.lastSeenEventId);\n\t\t\t\treturn;\n\t\t\tcase \"destroy\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tawait onDestroy?.();\n\t\t\t\tdrainThenExit(ws, 1e3, \"destroy\");\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"bridge-stop\",\n\t\t\t\t\tdata: await onStop?.() ?? {}\n\t\t\t\t});\n\t\t\t\tdrainThenExit(ws, 1e3, \"stop\");\n\t\t}\n\t};\n\twriteBridgeMeta(\"init\");\n\tconst wss = new WebSocketServer({\n\t\tport: bridgeWsPort,\n\t\thost: \"0.0.0.0\"\n\t});\n\tconst exit = () => {\n\t\tif (options.onExit) {\n\t\t\toptions.onExit();\n\t\t\treturn;\n\t\t}\n\t\twss.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(0), 1e3).unref();\n\t};\n\tconst drainThenExit = (ws, code, reason) => {\n\t\tconst start = Date.now();\n\t\tconst tick = () => {\n\t\t\tif (ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN || Date.now() - start >= 5e3) {\n\t\t\t\tflushPendingEventsToDisk().finally(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tws.close(code, reason);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\texit();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(tick, 10).unref();\n\t\t};\n\t\ttick();\n\t};\n\twss.on(\"listening\", () => {\n\t\tconst addr = wss.address();\n\t\tcurrentBoundPort = typeof addr === \"object\" && addr ? addr.port : 0;\n\t\tcurrentTurnState = \"waiting\";\n\t\twriteBridgeMeta(\"waiting\");\n\t\tstdout.write(JSON.stringify({\n\t\t\ttype: \"bridge-ready\",\n\t\t\tport: currentBoundPort\n\t\t}) + \"\\n\");\n\t\toptions.onListening?.(currentBoundPort);\n\t});\n\twss.on(\"connection\", (ws, req) => {\n\t\tif (new URL(req.url ?? \"/\", \"http://localhost\").searchParams.get(\"agent_bridge_token\") !== expectedToken) {\n\t\t\tws.close(1008, \"unauthorized\");\n\t\t\treturn;\n\t\t}\n\t\tsendControl(ws, {\n\t\t\ttype: \"bridge-hello\",\n\t\t\tstate: currentTurnState,\n\t\t\tlastSeq: seqCounter,\n\t\t\tcapabilities: { experimental_userMessageResponses: true }\n\t\t});\n\t\tws.on(\"message\", (raw) => {\n\t\t\tlet parsed;\n\t\t\ttry {\n\t\t\t\tconst text = typeof raw === \"string\" ? raw : Buffer.from(raw).toString(\"utf8\");\n\t\t\t\tparsed = JSON.parse(text);\n\t\t\t} catch (err) {\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: `protocol parse error: ${err.message}`\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleInbound(parsed, ws);\n\t\t});\n\t\tws.on(\"close\", () => {\n\t\t\tif (activeSocket === ws) activeSocket = void 0;\n\t\t});\n\t\tws.on(\"error\", () => {});\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"uncaught exception\"\n\t\t});\n\t});\n\tprocess.on(\"unhandledRejection\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"unhandled rejection\"\n\t\t});\n\t});\n\tawait new Promise((resolve, reject) => {\n\t\tif (wss.address() != null) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\twss.once(\"listening\", resolve);\n\t\twss.once(\"error\", reject);\n\t});\n\treturn {\n\t\tport: currentBoundPort,\n\t\tclose: () => new Promise((resolve) => {\n\t\t\twss.close(() => resolve());\n\t\t})\n\t};\n}\nfunction sendControl(socket, message) {\n\tif (socket?.readyState === WS_OPEN) try {\n\t\tsocket.send(JSON.stringify(message));\n\t} catch {}\n}\nfunction serialiseError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\treturn err;\n}\n//#endregion\nexport { HarnessBridgeCapabilityUnsupportedError, convertHarnessToolModelOutput, runBridge };\n\n//# sourceMappingURL=index.js.map","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 status: normalizeMcpStatus(item.status),\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 normalizeMcpStatus(\n value: unknown,\n): 'in_progress' | 'completed' | 'failed' | undefined {\n if (value === 'inProgress') return 'in_progress';\n if (value === 'completed' || value === 'failed') return value;\n return undefined;\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 {\n convertHarnessToolModelOutput,\n type BridgeTurn,\n} 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 /*\n * The model Codex reported in the `thread/start` / `thread/resume` response\n * for the loaded thread, keyed by the model the bridge requested. Turns on an\n * already-loaded thread skip those requests, so the reported model is reused\n * while the requested model is unchanged.\n */\n let loadedThreadModel:\n | { requestedModel: string | undefined; modelId: string | undefined }\n | 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 loadedThreadModel = 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 stepTracker: active.options.stepTracker,\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 loadedThreadModel = 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 loadedThreadModel = {\n requestedModel: codexModel,\n modelId: readOptionalString(asRecord(threadResponse)?.model),\n };\n }\n handler.announceThread(currentTurn.threadId!);\n const threadModel = loadedThreadModel;\n const streamStartModelId =\n threadModel != null &&\n threadModel.requestedModel === codexModel &&\n threadModel.modelId != null\n ? threadModel.modelId\n : codexModel;\n emit({\n type: 'stream-start',\n ...(streamStartModelId ? { modelId: streamStartModelId } : {}),\n });\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:\n typeof start.prompt === 'string'\n ? [{ type: 'text', text: start.prompt, text_elements: [] }]\n : start.prompt.map(part =>\n part.type === 'text'\n ? { type: 'text', text: part.text, text_elements: [] }\n : {\n type: 'image',\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n ),\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 stepTracker,\n}: {\n request: CodexAppServerRequest;\n dynamicTools: ReturnType<typeof createDynamicTools>;\n emit: Emit;\n requestToolResult: BridgeTurn['requestToolResult'];\n stepTracker: CodexStepTracker;\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 callId = params.callId;\n stepTracker.awaitHostInput({ itemId: callId });\n const result = await requestToolResult(callId).finally(() =>\n stepTracker.resolveHostInput({ itemId: callId }),\n );\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 if (result.toolResult != null) {\n const converted = convertHarnessToolModelOutput({\n output: result.toolResult.output,\n });\n return {\n contentItems: converted.content.map(part =>\n part.type === 'text'\n ? { type: 'inputText', text: part.text }\n : {\n type: 'inputImage',\n imageUrl: `data:${part.mediaType};base64,${part.data}`,\n },\n ),\n success: result.isError !== true && !converted.isError,\n };\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\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : 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 awaitHostInput(input: { itemId: string }): void;\n resolveHostInput(input: { itemId: string }): void;\n};\n\nexport function createCodexStepTracker(input: {\n send: Emit;\n}): CodexStepTracker {\n let stepOpen = false;\n const pendingToolItemIds = new Set<string>();\n /*\n * Dynamic tool calls waiting for the host to return their result. When\n * every pending tool item waits on the host, Codex cannot make progress, so\n * the tracker emits an early `finish-step` that lets the host pause the\n * turn. The step stays open until the regular `finish-step`.\n */\n const hostInputWaitingItemIds = new Set<string>();\n const earlyFinishStepItemIds = 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 earlyFinishStepItemIds.clear();\n };\n\n const emitEarlyFinishStepIfReady = (): void => {\n if (!stepOpen || pendingToolItemIds.size === 0) return;\n for (const itemId of pendingToolItemIds) {\n if (!hostInputWaitingItemIds.has(itemId)) return;\n }\n const uncovered = [...pendingToolItemIds].filter(\n itemId => !earlyFinishStepItemIds.has(itemId),\n );\n if (uncovered.length === 0) return;\n for (const itemId of uncovered) earlyFinishStepItemIds.add(itemId);\n input.send({\n type: 'finish-step',\n finishReason: { unified: 'tool-calls', raw: 'host-input' },\n usage: defaultUsage(),\n harnessMetadata: { codex: { inferredStep: true } },\n });\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 emitEarlyFinishStepIfReady();\n } else if (event.type === 'item.completed') {\n if (itemId) pendingToolItemIds.delete(itemId);\n finishStep();\n }\n }\n },\n finishTurn() {\n pendingToolItemIds.clear();\n hostInputWaitingItemIds.clear();\n finishStep();\n },\n awaitHostInput({ itemId }) {\n stepOpen = true;\n pendingToolItemIds.add(itemId);\n hostInputWaitingItemIds.add(itemId);\n emitEarlyFinishStepIfReady();\n },\n resolveHostInput({ itemId }) {\n hostInputWaitingItemIds.delete(itemId);\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 ...(item.status === 'failed' ? { isError: true } : {}),\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\n/*\n * Base URLs known to serve Codex's standalone search route (`/alpha/search`).\n * Responses Lite models can only search through that route, and Codex only\n * enables it for custom providers that opt in.\n */\nconst STANDALONE_WEB_SEARCH_BASE_URLS = new Set([\n 'https://api.openai.com/v1',\n 'https://chatgpt.com/backend-api/codex',\n]);\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 ...(STANDALONE_WEB_SEARCH_BASE_URLS.has(apiBaseUrl.replace(/\\/+$/, ''))\n ? { supports_standalone_web_search: true }\n : {}),\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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"}
package/dist/index.js CHANGED
@@ -399,7 +399,7 @@ const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({
399
399
  z.discriminatedUnion("type", [startMessageSchema, ...harnessV1BridgeInboundCommandSchemas]);
400
400
  //#endregion
401
401
  //#region src/version.ts
402
- const VERSION = "1.0.167";
402
+ const VERSION = "1.0.168";
403
403
  //#endregion
404
404
  //#region src/codex-harness.ts
405
405
  const 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.167",
3
+ "version": "1.0.168",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -26,9 +26,9 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@ai-sdk/harness": "1.0.165",
29
+ "@ai-sdk/harness": "1.0.166",
30
30
  "@ai-sdk/provider": "4.0.34",
31
- "@ai-sdk/provider-utils": "5.0.69",
31
+ "@ai-sdk/provider-utils": "5.0.70",
32
32
  "ws": "^8.21.0"
33
33
  },
34
34
  "peerDependencies": {
@@ -24,6 +24,16 @@ const bridgeStateDir = requireArg({
24
24
  });
25
25
  const HARNESS_CLIENT_APP = procEnv.AI_SDK_HARNESS_CLIENT_APP;
26
26
 
27
+ /*
28
+ * Base URLs known to serve Codex's standalone search route (`/alpha/search`).
29
+ * Responses Lite models can only search through that route, and Codex only
30
+ * enables it for custom providers that opt in.
31
+ */
32
+ const STANDALONE_WEB_SEARCH_BASE_URLS = new Set([
33
+ 'https://api.openai.com/v1',
34
+ 'https://chatgpt.com/backend-api/codex',
35
+ ]);
36
+
27
37
  const threadState: { id: string | undefined } = { id: undefined };
28
38
  const appServer = createCodexAppServerRuntime();
29
39
 
@@ -149,6 +159,9 @@ function resolveCodexRuntime({ start }: { start: StartMessage }): CodexRuntime {
149
159
  env_key: 'CODEX_API_KEY',
150
160
  wire_api: 'responses',
151
161
  supports_websockets: false,
162
+ ...(STANDALONE_WEB_SEARCH_BASE_URLS.has(apiBaseUrl.replace(/\/+$/, ''))
163
+ ? { supports_standalone_web_search: true }
164
+ : {}),
152
165
  ...(start.headers != null || (hasGatewayAuth && HARNESS_CLIENT_APP)
153
166
  ? {
154
167
  http_headers: {