@ai-sdk/harness-claude-code 1.0.149 → 1.0.150

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,16 @@
1
1
  # @ai-sdk/harness-claude-code
2
2
 
3
+ ## 1.0.150
4
+
5
+ ### Patch Changes
6
+
7
+ - 0887035: fix(harness-claude-code): close compaction events emitted outside a model step
8
+ - 714f3fc: fix(harness-claude-code): report host tool calls rejected by MCP input validation
9
+ - Updated dependencies [4dbc902]
10
+ - @ai-sdk/provider@4.0.26
11
+ - @ai-sdk/harness@1.0.146
12
+ - @ai-sdk/provider-utils@5.0.58
13
+
3
14
  ## 1.0.149
4
15
 
5
16
  ### Patch Changes
@@ -5,6 +5,7 @@ import { argv, env, pid, stdout } from "node:process";
5
5
  import { WebSocketServer } from "ws";
6
6
  import * as claudeAgentSdk from "@anthropic-ai/claude-agent-sdk";
7
7
  import * as mcpServerModule from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import { isDeepStrictEqual } from "node:util";
8
9
  import { z } from "zod/v4";
9
10
  //#region ../harness/dist/bridge/index.js
10
11
  const DEBUG_LEVEL_WEIGHT = {
@@ -632,7 +633,8 @@ function createClaudeStreamEventState() {
632
633
  pendingStepUsage: void 0,
633
634
  pendingResponseUsage: void 0,
634
635
  stepOpen: false,
635
- mcpToolUseIds: /* @__PURE__ */ new Set(),
636
+ mcpToolCalls: /* @__PURE__ */ new Map(),
637
+ mcpHandlerCalls: /* @__PURE__ */ new Map(),
636
638
  externalMcpToolUseIds: /* @__PURE__ */ new Set(),
637
639
  structuredOutputToolUseIds: /* @__PURE__ */ new Set(),
638
640
  observedTerminalError: void 0
@@ -729,7 +731,10 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
729
731
  }
730
732
  if (block.name.startsWith(HOST_TOOL_PREFIX)) {
731
733
  state.pendingStepToolUseIds.add(block.id);
732
- state.mcpToolUseIds.add(block.id);
734
+ state.mcpToolCalls.set(block.id, {
735
+ toolName: block.name.slice(20),
736
+ input: block.input ?? {}
737
+ });
733
738
  opensStep = true;
734
739
  continue;
735
740
  }
@@ -767,9 +772,37 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
767
772
  const toolUseResult = messageContent.filter((block) => block.type === "tool_result").length === 1 ? msg.tool_use_result : void 0;
768
773
  for (const block of messageContent) if (block.type === "tool_result" && typeof block.tool_use_id === "string") {
769
774
  if (state.structuredOutputToolUseIds.delete(block.tool_use_id)) continue;
770
- if (state.mcpToolUseIds.has(block.tool_use_id)) {
771
- state.mcpToolUseIds.delete(block.tool_use_id);
775
+ const mcpToolCall = state.mcpToolCalls.get(block.tool_use_id);
776
+ if (mcpToolCall != null) {
777
+ const handlerReportedCall = takeMcpHandlerCall({
778
+ state,
779
+ toolCallId: block.tool_use_id,
780
+ toolCall: mcpToolCall
781
+ });
782
+ state.mcpToolCalls.delete(block.tool_use_id);
772
783
  state.pendingStepToolUseIds.delete(block.tool_use_id);
784
+ if (handlerReportedCall) continue;
785
+ const isError = !!block.is_error;
786
+ const result = toolUseResult !== void 0 ? toolUseResult : resolveToolResult({
787
+ toolName: mcpToolCall.toolName,
788
+ dynamic: false,
789
+ isError,
790
+ rawContent: block.content
791
+ });
792
+ emit({
793
+ type: "tool-call",
794
+ toolCallId: block.tool_use_id,
795
+ toolName: mcpToolCall.toolName,
796
+ input: JSON.stringify(mcpToolCall.input),
797
+ providerExecuted: true
798
+ });
799
+ emit({
800
+ type: "tool-result",
801
+ toolCallId: block.tool_use_id,
802
+ toolName: mcpToolCall.toolName,
803
+ result,
804
+ isError
805
+ });
773
806
  continue;
774
807
  }
775
808
  state.approvalRequestedToolUseIds.delete(block.tool_use_id);
@@ -801,6 +834,20 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
801
834
  }
802
835
  };
803
836
  }
837
+ function takeMcpHandlerCall({ state, toolCallId, toolCall }) {
838
+ if (state.mcpHandlerCalls.delete(toolCallId)) return true;
839
+ for (const [handlerCallId, handlerCall] of state.mcpHandlerCalls) if (handlerCall.toolName === toolCall.toolName && isDeepStrictEqual(handlerCall.input, toolCall.input)) {
840
+ state.mcpHandlerCalls.delete(handlerCallId);
841
+ return true;
842
+ }
843
+ const matchingHandlerCallIds = Array.from(state.mcpHandlerCalls).filter(([, handlerCall]) => handlerCall.toolName === toolCall.toolName).map(([handlerCallId]) => handlerCallId);
844
+ const matchingToolCallCount = Array.from(state.mcpToolCalls.values()).filter((pendingCall) => pendingCall.toolName === toolCall.toolName).length;
845
+ if (matchingHandlerCallIds.length > 0 && matchingHandlerCallIds.length === matchingToolCallCount) {
846
+ state.mcpHandlerCalls.delete(matchingHandlerCallIds[0]);
847
+ return true;
848
+ }
849
+ return false;
850
+ }
804
851
  function finishApprovalStep({ state, emit, approvalId }) {
805
852
  state.stepOpen = true;
806
853
  state.pendingStepToolUseIds.delete(approvalId);
@@ -1414,6 +1461,10 @@ async function runTurn(start, turn) {
1414
1461
  const [input, extra] = handlerArgs;
1415
1462
  const metadataToolCallId = extra._meta?.["claudecode/toolUseId"];
1416
1463
  const toolCallId = typeof metadataToolCallId === "string" ? metadataToolCallId : randomUUID();
1464
+ streamEventState.mcpHandlerCalls.set(toolCallId, {
1465
+ toolName: tool.name,
1466
+ input
1467
+ });
1417
1468
  emit({
1418
1469
  type: "tool-call",
1419
1470
  toolCallId,
@@ -1443,7 +1494,15 @@ async function runTurn(start, turn) {
1443
1494
  instance: server
1444
1495
  };
1445
1496
  }
1446
- const compaction = createCompactionLatch((event) => emit(event));
1497
+ const compaction = createCompactionLatch((event) => {
1498
+ const hasOpenStep = streamEventState.stepOpen;
1499
+ emit(event);
1500
+ if (!hasOpenStep) emitFinishStep({
1501
+ state: streamEventState,
1502
+ emit,
1503
+ usage: void 0
1504
+ });
1505
+ });
1447
1506
  const queryInput = createQueryInput({
1448
1507
  initialUserMessage: start.prompt,
1449
1508
  userMessages: turn.experimental_userMessages,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["procEnv"],"sources":["../../../harness/dist/bridge/index.js","../../src/bridge/compaction-latch.ts","../../src/bridge/claude-code-system-prompt.ts","../../src/bridge/claude-skills-option.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/json-schema-to-zod.ts","../../src/bridge/tool-filtering.ts","../../src/bridge/question-tool.ts","../../src/bridge/index.ts"],"sourcesContent":["import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { env, pid, stdout } from \"node:process\";\nimport { WebSocketServer } from \"ws\";\n//#region src/bridge/harness-bridge-capability-unsupported-error.ts\nconst name = \"AI_HarnessBridgeCapabilityUnsupportedError\";\n/**\n* Signals an unsupported capability discovered inside a sandbox bridge.\n* `isInstance` also recognizes the serialized error shape received by the\n* host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n*/\nvar HarnessBridgeCapabilityUnsupportedError = class extends Error {\n\tconstructor({ message, harnessId, cause }) {\n\t\tsuper(message);\n\t\tObject.defineProperty(this, \"name\", { value: name });\n\t\tthis.harnessId = harnessId;\n\t\tthis.cause = cause;\n\t}\n\tstatic isInstance(error) {\n\t\treturn error != null && typeof error === \"object\" && \"name\" in error && error.name === name && \"message\" in error && typeof error.message === \"string\";\n\t}\n};\n//#endregion\n//#region src/bridge/index.ts\nconst DEBUG_LEVEL_WEIGHT = {\n\terror: 0,\n\twarn: 1,\n\tinfo: 2,\n\tdebug: 3,\n\ttrace: 4\n};\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(filters, subsystem) {\n\tif (!filters || filters.length === 0) return true;\n\treturn filters.some((filter) => subsystem === filter || subsystem.startsWith(`${filter}.`));\n}\nfunction formatBridgeError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\tif (typeof err === \"string\") return { message: err };\n\tif (err !== null && typeof err === \"object\") try {\n\t\treturn { message: JSON.stringify(err) };\n\t} catch {}\n\treturn { message: String(err) };\n}\nfunction createBridgeUserMessageQueue(options) {\n\tconst messages = [];\n\tconst waiters = [];\n\tconst entries = /* @__PURE__ */ new Map();\n\tlet closed = false;\n\tlet pendingCount = 0;\n\tconst enqueue = (input) => {\n\t\tconst existing = entries.get(input.messageId);\n\t\tif (existing != null) {\n\t\t\tif (existing.response != null) options.respond(existing.response);\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tconst settle = (response) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tpendingCount--;\n\t\t\tconst entry = entries.get(input.messageId);\n\t\t\tif (entry != null) entry.response = response;\n\t\t\toptions.respond(response);\n\t\t};\n\t\tconst message = {\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: input.text,\n\t\t\taccept: () => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: true\n\t\t\t\t});\n\t\t\t},\n\t\t\treject: (error) => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: false,\n\t\t\t\t\terror: { message: formatBridgeError(error).message }\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tentries.set(input.messageId, { reject: message.reject });\n\t\tpendingCount++;\n\t\tif (closed) {\n\t\t\tmessage.reject(/* @__PURE__ */ new Error(\"The bridge turn is no longer accepting user messages.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiters.shift();\n\t\tif (waiter != null) waiter({\n\t\t\tdone: false,\n\t\t\tvalue: message\n\t\t});\n\t\telse messages.push(message);\n\t};\n\tconst close = (error) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tconst reason = error ?? /* @__PURE__ */ new Error(\"The bridge turn ended before accepting the user message.\");\n\t\tfor (const entry of entries.values()) if (entry.response == null) entry.reject(reason);\n\t\tmessages.length = 0;\n\t\twhile (waiters.length > 0) waiters.shift()({\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t});\n\t};\n\treturn {\n\t\tget pendingCount() {\n\t\t\treturn pendingCount;\n\t\t},\n\t\tenqueue,\n\t\tclose,\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn { next: () => {\n\t\t\t\tconst message = messages.shift();\n\t\t\t\tif (message != null) return Promise.resolve({\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: message\n\t\t\t\t});\n\t\t\t\tif (closed) return Promise.resolve({\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t});\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twaiters.push(resolve);\n\t\t\t\t});\n\t\t\t} };\n\t\t}\n\t};\n}\nfunction parseEnvList(value) {\n\tif (!value) return void 0;\n\tconst items = value.split(\",\").map((item) => item.trim()).filter(Boolean);\n\treturn items.length > 0 ? items : void 0;\n}\nconst ENV_TRUTHY = /* @__PURE__ */ new Set([\n\t\"1\",\n\t\"true\",\n\t\"yes\",\n\t\"on\"\n]);\nconst WS_OPEN = 1;\nasync function runBridge(options) {\n\tconst { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n\tconst teardownGraceMs = options.turnTeardownGraceMs ?? 1e4;\n\tconst expectedToken = options.token ?? env.BRIDGE_CHANNEL_TOKEN ?? \"\";\n\tconst bridgeWsPort = options.port ?? parseInt(env.BRIDGE_WS_PORT ?? \"0\", 10);\n\tconst bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n\tconst startConfigPath = `${bridgeStateDir}/start-config.json`;\n\tconst rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n\tconst eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\ttry {\n\t\tawait mkdir(bridgeStateDir, { recursive: true });\n\t} catch {}\n\tlet currentBoundPort = 0;\n\tlet currentTurnState = \"init\";\n\tlet activeSocket;\n\tlet isFirstTurn = true;\n\tlet turnAbort;\n\tlet currentUserMessages;\n\t/**\n\t* Settles when the in-flight turn has fully wound down — `onStart`\n\t* returned or threw AND its completion state was recorded. `undefined`\n\t* between turns. A new `start` fences on this so turns never overlap.\n\t*/\n\tlet activeTurn;\n\tlet debugConfig;\n\tlet consoleCaptureInstalled = false;\n\tconst envDebugEnabled = ENV_TRUTHY.has((env.HARNESS_DEBUG ?? \"\").toLowerCase());\n\tlet seqCounter = 0;\n\tlet eventLog = [];\n\tlet diskBuffer = \"\";\n\tlet flushPromise = null;\n\tconst flushEventsToDisk = async () => {\n\t\twhile (diskBuffer.length > 0) {\n\t\t\tconst buf = diskBuffer;\n\t\t\tdiskBuffer = \"\";\n\t\t\tawait appendFile(eventLogPath, buf).catch(() => {});\n\t\t}\n\t};\n\tconst scheduleEventFlush = () => {\n\t\tif (flushPromise) return;\n\t\tflushPromise = new Promise((resolve) => {\n\t\t\tsetImmediate(() => {\n\t\t\t\tflushEventsToDisk().finally(resolve);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tflushPromise = null;\n\t\t\tif (diskBuffer.length > 0) scheduleEventFlush();\n\t\t});\n\t};\n\tconst flushPendingEventsToDisk = async () => {\n\t\tif (diskBuffer.length > 0 && !flushPromise) scheduleEventFlush();\n\t\tlet inFlight = flushPromise;\n\t\twhile (inFlight) {\n\t\t\tawait inFlight;\n\t\t\tinFlight = flushPromise;\n\t\t}\n\t};\n\tif (env.BRIDGE_REPLAY_FROM_DISK === \"1\" && existsSync(eventLogPath)) try {\n\t\teventLog = readFileSync(eventLogPath, \"utf8\").split(\"\\n\").map((line) => line.trim()).filter(Boolean).map((line) => ({\n\t\t\tseq: JSON.parse(line).seq,\n\t\t\tline\n\t\t}));\n\t\tseqCounter = eventLog.at(-1)?.seq ?? 0;\n\t} catch {\n\t\teventLog = [];\n\t\tseqCounter = 0;\n\t}\n\tconst pendingToolResults = /* @__PURE__ */ new Map();\n\tconst bufferedToolResults = [];\n\tconst pendingToolApprovals = /* @__PURE__ */ new Map();\n\tconst writeBridgeMeta = async (state) => {\n\t\ttry {\n\t\t\tawait writeFile(bridgeMetaPath, JSON.stringify({\n\t\t\t\ttype: bridgeType,\n\t\t\t\tport: currentBoundPort,\n\t\t\t\tstate,\n\t\t\t\tpid\n\t\t\t}));\n\t\t} catch {}\n\t};\n\tconst writeStartConfig = async (start) => {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(start);\n\t\t\tawait writeFile(startConfigPath, serialized);\n\t\t\tif (!existsSync(rerunStartConfigPath)) await writeFile(rerunStartConfigPath, serialized);\n\t\t} catch {}\n\t};\n\tconst emit = (event) => {\n\t\tconst seq = ++seqCounter;\n\t\tconst line = JSON.stringify({\n\t\t\t...event,\n\t\t\tseq\n\t\t});\n\t\teventLog.push({\n\t\t\tseq,\n\t\t\tline\n\t\t});\n\t\tdiskBuffer += `${line}\\n`;\n\t\tscheduleEventFlush();\n\t\tif (activeSocket?.readyState === WS_OPEN) try {\n\t\t\tactiveSocket.send(line);\n\t\t} catch {}\n\t};\n\tconst replay = (ws, afterSeq) => {\n\t\tfor (const entry of eventLog) if (entry.seq > afterSeq && ws.readyState === WS_OPEN) ws.send(entry.line);\n\t};\n\tconst shouldEmitDebugEvent = (level, subsystem) => {\n\t\tif (!debugConfig?.enabled) return false;\n\t\tconst threshold = debugConfig.level ?? \"debug\";\n\t\tif (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n\t\treturn subsystemMatches(debugConfig.subsystems, subsystem);\n\t};\n\tconst rawStdoutWrite = process.stdout.write.bind(process.stdout);\n\tconst rawStderrWrite = process.stderr.write.bind(process.stderr);\n\tconst writeErrorToStderr = (input) => {\n\t\ttry {\n\t\t\tconst formatted = formatBridgeError(input.error);\n\t\t\trawStderrWrite(`[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`);\n\t\t\tif (formatted.stack) rawStderrWrite(`${formatted.stack}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitWarning = (input) => {\n\t\ttry {\n\t\t\tfor (const line of input.message.split(\"\\n\")) if (line.trim().length > 0) rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitError = (input) => {\n\t\twriteErrorToStderr({\n\t\t\tmessage: input.message ?? \"bridge error\",\n\t\t\terror: input.error\n\t\t});\n\t\temit({\n\t\t\ttype: \"error\",\n\t\t\terror: serialiseError(input.error)\n\t\t});\n\t};\n\tconst installConsoleCapture = () => {\n\t\tif (consoleCaptureInstalled) return;\n\t\tconsoleCaptureInstalled = true;\n\t\tconst buffers = {\n\t\t\tstdout: \"\",\n\t\t\tstderr: \"\"\n\t\t};\n\t\tconst patch = (stream, raw) => (chunk, encoding, cb) => {\n\t\t\tif (debugConfig?.enabled) try {\n\t\t\t\tconst enc = typeof encoding === \"string\" ? encoding : \"utf8\";\n\t\t\t\tconst text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(enc);\n\t\t\t\tconst parts = (buffers[stream] + text.replace(/\\r\\n/g, \"\\n\")).split(\"\\n\");\n\t\t\t\tbuffers[stream] = parts.pop() ?? \"\";\n\t\t\t\tfor (const line of parts) {\n\t\t\t\t\tconst trimmed = line.replace(/\\s+$/, \"\");\n\t\t\t\t\tif (trimmed) emit({\n\t\t\t\t\t\ttype: \"sandbox-log\",\n\t\t\t\t\t\tsource: bridgeType,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tline: trimmed\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\treturn raw(chunk, encoding, cb);\n\t\t};\n\t\tprocess.stdout.write = patch(\"stdout\", rawStdoutWrite);\n\t\tprocess.stderr.write = patch(\"stderr\", rawStderrWrite);\n\t};\n\tconst handleInbound = async (msg, ws) => {\n\t\tswitch (msg.type) {\n\t\t\tcase \"start\": {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst pendingTurn = activeTurn;\n\t\t\t\t\tif (pendingTurn == null) break;\n\t\t\t\t\tturnAbort?.abort();\n\t\t\t\t\tcurrentUserMessages?.close(/* @__PURE__ */ new Error(\"A new bridge turn replaced the active turn.\"));\n\t\t\t\t\tlet graceTimer;\n\t\t\t\t\tconst settled = await Promise.race([pendingTurn.then(() => true), new Promise((resolve) => {\n\t\t\t\t\t\tgraceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n\t\t\t\t\t\tgraceTimer.unref?.();\n\t\t\t\t\t})]);\n\t\t\t\t\tclearTimeout(graceTimer);\n\t\t\t\t\tif (!settled) break;\n\t\t\t\t}\n\t\t\t\tlet turnFinished;\n\t\t\t\tconst thisTurn = new Promise((resolve) => turnFinished = resolve);\n\t\t\t\tactiveTurn = thisTurn;\n\t\t\t\tactiveSocket = ws;\n\t\t\t\tconst firstTurn = isFirstTurn;\n\t\t\t\tisFirstTurn = false;\n\t\t\t\teventLog = [];\n\t\t\t\tdiskBuffer = \"\";\n\t\t\t\twriteFile(eventLogPath, \"\").catch(() => {});\n\t\t\t\tturnAbort = new AbortController();\n\t\t\t\tcurrentTurnState = \"running\";\n\t\t\t\twriteStartConfig(msg);\n\t\t\t\twriteBridgeMeta(\"running\");\n\t\t\t\tconst startDebug = msg.debug;\n\t\t\t\tdebugConfig = {\n\t\t\t\t\tenabled: startDebug?.enabled ?? envDebugEnabled,\n\t\t\t\t\tlevel: startDebug?.level ?? env.HARNESS_DEBUG_LEVEL,\n\t\t\t\t\tsubsystems: startDebug?.subsystems ?? parseEnvList(env.HARNESS_DEBUG_SUBSYSTEMS)\n\t\t\t\t};\n\t\t\t\tif (debugConfig.enabled) installConsoleCapture();\n\t\t\t\tconst userMessages = createBridgeUserMessageQueue({ respond: emit });\n\t\t\t\tconst turn = {\n\t\t\t\t\temit,\n\t\t\t\t\trequestToolResult: (requestInput) => {\n\t\t\t\t\t\tconst request = typeof requestInput === \"string\" ? { toolCallId: requestInput } : requestInput;\n\t\t\t\t\t\tconst bufferedIndex = bufferedToolResults.findIndex((buffered) => buffered.toolCallId === request.toolCallId || request.matches?.(buffered.result) === true);\n\t\t\t\t\t\tif (bufferedIndex >= 0) return Promise.resolve(bufferedToolResults.splice(bufferedIndex, 1)[0].result);\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tpendingToolResults.set(request.toolCallId, {\n\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\tmatches: request.matches\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trequestToolApproval: (approvalId) => new Promise((resolve) => {\n\t\t\t\t\t\tpendingToolApprovals.set(approvalId, resolve);\n\t\t\t\t\t}),\n\t\t\t\t\texperimental_userMessages: userMessages,\n\t\t\t\t\tabortSignal: turnAbort.signal,\n\t\t\t\t\tfirstTurn,\n\t\t\t\t\tbridgeLog: (input) => {\n\t\t\t\t\t\tconst level = input.level ?? \"debug\";\n\t\t\t\t\t\tif (!shouldEmitDebugEvent(level, input.subsystem)) return;\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"debug-event\",\n\t\t\t\t\t\t\tlevel,\n\t\t\t\t\t\t\tsubsystem: input.subsystem,\n\t\t\t\t\t\t\tmessage: input.message,\n\t\t\t\t\t\t\t...input.attrs ? { attrs: input.attrs } : {},\n\t\t\t\t\t\t\t...input.error !== void 0 ? { error: formatBridgeError(input.error) } : {}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\temitWarning,\n\t\t\t\t\temitError\n\t\t\t\t};\n\t\t\t\tcurrentUserMessages = userMessages;\n\t\t\t\ttry {\n\t\t\t\t\tawait onStart(msg, turn);\n\t\t\t\t} catch (err) {\n\t\t\t\t\temitError({\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t\tmessage: \"bridge turn failed\"\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tuserMessages.close();\n\t\t\t\t\tif (currentUserMessages === userMessages) currentUserMessages = void 0;\n\t\t\t\t\tif (activeTurn === thisTurn) {\n\t\t\t\t\t\tactiveTurn = void 0;\n\t\t\t\t\t\tcurrentTurnState = \"waiting\";\n\t\t\t\t\t\twriteBridgeMeta(\"waiting\");\n\t\t\t\t\t}\n\t\t\t\t\tturnFinished();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-result\": {\n\t\t\t\tconst result = {\n\t\t\t\t\toutput: msg.output,\n\t\t\t\t\tisError: msg.isError,\n\t\t\t\t\ttoolResult: msg.toolResult\n\t\t\t\t};\n\t\t\t\tconst exactPending = pendingToolResults.get(msg.toolCallId);\n\t\t\t\tconst matchingPending = exactPending == null ? Array.from(pendingToolResults.entries()).find(([, pending]) => pending.matches?.(result) === true) : void 0;\n\t\t\t\tconst pending = exactPending ?? matchingPending?.[1];\n\t\t\t\tconst pendingId = exactPending != null ? msg.toolCallId : matchingPending?.[0];\n\t\t\t\tif (pending != null && pendingId != null) {\n\t\t\t\t\tpendingToolResults.delete(pendingId);\n\t\t\t\t\tpending.resolve(result);\n\t\t\t\t} else bufferedToolResults.push({\n\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-approval-response\": {\n\t\t\t\tconst resolver = pendingToolApprovals.get(msg.approvalId);\n\t\t\t\tif (resolver) {\n\t\t\t\t\tpendingToolApprovals.delete(msg.approvalId);\n\t\t\t\t\tresolver({\n\t\t\t\t\t\tapproved: msg.approved,\n\t\t\t\t\t\treason: msg.reason\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"user-message\": {\n\t\t\t\tconst messageId = msg.messageId ?? randomUUID();\n\t\t\t\tif (currentUserMessages == null) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The bridge has no active turn to steer.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ws !== activeSocket) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The connection does not own the active bridge turn.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentUserMessages.enqueue({\n\t\t\t\t\tmessageId,\n\t\t\t\t\ttext: msg.text\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"abort\":\n\t\t\t\tturnAbort?.abort();\n\t\t\t\treturn;\n\t\t\tcase \"resume\":\n\t\t\t\tactiveSocket = ws;\n\t\t\t\treplay(ws, msg.lastSeenEventId);\n\t\t\t\treturn;\n\t\t\tcase \"destroy\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tawait onDestroy?.();\n\t\t\t\tdrainThenExit(ws, 1e3, \"destroy\");\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"bridge-stop\",\n\t\t\t\t\tdata: await onStop?.() ?? {}\n\t\t\t\t});\n\t\t\t\tdrainThenExit(ws, 1e3, \"stop\");\n\t\t}\n\t};\n\twriteBridgeMeta(\"init\");\n\tconst wss = new WebSocketServer({\n\t\tport: bridgeWsPort,\n\t\thost: \"0.0.0.0\"\n\t});\n\tconst exit = () => {\n\t\tif (options.onExit) {\n\t\t\toptions.onExit();\n\t\t\treturn;\n\t\t}\n\t\twss.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(0), 1e3).unref();\n\t};\n\tconst drainThenExit = (ws, code, reason) => {\n\t\tconst start = Date.now();\n\t\tconst tick = () => {\n\t\t\tif (ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN || Date.now() - start >= 5e3) {\n\t\t\t\tflushPendingEventsToDisk().finally(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tws.close(code, reason);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\texit();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(tick, 10).unref();\n\t\t};\n\t\ttick();\n\t};\n\twss.on(\"listening\", () => {\n\t\tconst addr = wss.address();\n\t\tcurrentBoundPort = typeof addr === \"object\" && addr ? addr.port : 0;\n\t\tcurrentTurnState = \"waiting\";\n\t\twriteBridgeMeta(\"waiting\");\n\t\tstdout.write(JSON.stringify({\n\t\t\ttype: \"bridge-ready\",\n\t\t\tport: currentBoundPort\n\t\t}) + \"\\n\");\n\t\toptions.onListening?.(currentBoundPort);\n\t});\n\twss.on(\"connection\", (ws, req) => {\n\t\tif (new URL(req.url ?? \"/\", \"http://localhost\").searchParams.get(\"agent_bridge_token\") !== expectedToken) {\n\t\t\tws.close(1008, \"unauthorized\");\n\t\t\treturn;\n\t\t}\n\t\tsendControl(ws, {\n\t\t\ttype: \"bridge-hello\",\n\t\t\tstate: currentTurnState,\n\t\t\tlastSeq: seqCounter,\n\t\t\tcapabilities: { experimental_userMessageResponses: true }\n\t\t});\n\t\tws.on(\"message\", (raw) => {\n\t\t\tlet parsed;\n\t\t\ttry {\n\t\t\t\tconst text = typeof raw === \"string\" ? raw : Buffer.from(raw).toString(\"utf8\");\n\t\t\t\tparsed = JSON.parse(text);\n\t\t\t} catch (err) {\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: `protocol parse error: ${err.message}`\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleInbound(parsed, ws);\n\t\t});\n\t\tws.on(\"close\", () => {\n\t\t\tif (activeSocket === ws) activeSocket = void 0;\n\t\t});\n\t\tws.on(\"error\", () => {});\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"uncaught exception\"\n\t\t});\n\t});\n\tprocess.on(\"unhandledRejection\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"unhandled rejection\"\n\t\t});\n\t});\n\tawait new Promise((resolve, reject) => {\n\t\tif (wss.address() != null) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\twss.once(\"listening\", resolve);\n\t\twss.once(\"error\", reject);\n\t});\n\treturn {\n\t\tport: currentBoundPort,\n\t\tclose: () => new Promise((resolve) => {\n\t\t\twss.close(() => resolve());\n\t\t})\n\t};\n}\nfunction sendControl(socket, message) {\n\tif (socket?.readyState === WS_OPEN) try {\n\t\tsocket.send(JSON.stringify(message));\n\t} catch {}\n}\nfunction serialiseError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\treturn err;\n}\n//#endregion\nexport { HarnessBridgeCapabilityUnsupportedError, runBridge };\n\n//# sourceMappingURL=index.js.map","/*\n * Claude reports a compaction in two pieces whose arrival order is not\n * guaranteed: the `compact_boundary` system message (trigger + token counts)\n * and the `PostCompact` hook (the summary text). The harness `compaction`\n * event needs fields from both, so this latch holds each half and emits a\n * single merged event once both have arrived, then resets for the next\n * compaction in the same turn.\n */\n\nexport type CompactionBoundary = {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionEvent = {\n type: 'compaction';\n trigger: 'manual' | 'auto';\n summary: string;\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionLatch = {\n onBoundary(boundary: CompactionBoundary): void;\n onSummary(summary: string): void;\n};\n\nexport function createCompactionLatch(\n emit: (event: CompactionEvent) => void,\n): CompactionLatch {\n let boundary: CompactionBoundary | undefined;\n let summary: string | undefined;\n\n const tryEmit = (): void => {\n if (!boundary || summary === undefined) return;\n emit({\n type: 'compaction',\n trigger: boundary.trigger,\n summary,\n ...(boundary.tokensBefore !== undefined\n ? { tokensBefore: boundary.tokensBefore }\n : {}),\n ...(boundary.tokensAfter !== undefined\n ? { tokensAfter: boundary.tokensAfter }\n : {}),\n });\n boundary = undefined;\n summary = undefined;\n };\n\n return {\n onBoundary(next) {\n boundary = next;\n tryEmit();\n },\n onSummary(next) {\n summary = next;\n tryEmit();\n },\n };\n}\n","export function createClaudeCodeSystemPrompt(instructions?: string): {\n type: 'preset';\n preset: 'claude_code';\n append?: string;\n} {\n return {\n type: 'preset',\n preset: 'claude_code',\n ...(instructions ? { append: instructions } : {}),\n };\n}\n","export function toClaudeSkillsOption(\n skills: ReadonlyArray<string> | undefined,\n): 'all' | undefined {\n /*\n * The Claude Agent SDK treats `skills: string[]` as an allowlist, which hides\n * built-in/default skills. When the harness writes project skills, ask Claude\n * to enable every discovered skill so bundled defaults and project skills are\n * both visible.\n */\n return skills && skills.length > 0 ? 'all' : undefined;\n}\n","import { randomUUID } from 'node:crypto';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type ClaudeMessage = {\n type?: string;\n subtype?: string;\n parent_tool_use_id?: string | null;\n model?: string;\n error?: string;\n error_status?: number | null;\n attempt?: number;\n max_retries?: number;\n retry_delay_ms?: number;\n patch?: { status?: string; error?: string };\n compact_metadata?: {\n trigger: 'manual' | 'auto';\n pre_tokens?: number;\n post_tokens?: number;\n };\n event?: {\n type?: string;\n index?: number;\n usage?: Record<string, unknown>;\n message?: {\n usage?: Record<string, unknown>;\n };\n content_block?: {\n type?: string;\n id?: string;\n name?: string;\n };\n delta?: {\n type?: string;\n text?: string;\n thinking?: string;\n partial_json?: string;\n };\n };\n message?: {\n content?: string | ReadonlyArray<MessageBlock>;\n usage?: Record<string, unknown>;\n };\n result?: string;\n /** Result-message error flags; distinct from `error_status` (`api_retry`). */\n is_error?: boolean;\n api_error_status?: number | null;\n errors?: ReadonlyArray<string>;\n usage?: Record<string, unknown>;\n total_cost_usd?: number;\n structured_output?: unknown;\n tool_use_result?: unknown;\n};\n\ntype MessageBlock = {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n};\n\nexport type ClaudeStreamEventState = {\n /*\n * Map of native tool-use id → tool name. Claude assistant messages emit\n * `tool_use` blocks with both `id` and `name`; the matching `tool_result`\n * block on a later user message carries only `tool_use_id`, so without this\n * map the tool-result event would have to emit `toolName: 'unknown'`.\n */\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n partialBlocks: Map<number, PartialBlock>;\n stepUsage: Record<string, unknown> | undefined;\n pendingStepToolUseIds: Set<string>;\n pendingStepAssistantUsage: Record<string, unknown> | undefined;\n pendingStepDeltaUsage: Record<string, unknown> | undefined;\n pendingStepUsage: Record<string, unknown> | undefined;\n pendingResponseUsage: Record<string, unknown> | undefined;\n stepOpen: boolean;\n /*\n * Tool-use ids that originated from the MCP server hosting user-supplied\n * tools. The MCP handler emits its own `tool-call`/`tool-result` pair with\n * the user-facing tool name, so the duplicate `tool_result` block Claude\n * reports for the underlying native id must be suppressed.\n */\n mcpToolUseIds: Set<string>;\n externalMcpToolUseIds: Set<string>;\n structuredOutputToolUseIds: Set<string>;\n observedTerminalError: string | undefined;\n};\n\ntype PartialBlock =\n | { id: string; kind: 'text' | 'thinking' }\n | { id: string; kind: 'tool-input' };\n\nexport function createClaudeStreamEventState(): ClaudeStreamEventState {\n return {\n nativeToolCallNames: new Map(),\n approvalRequestedToolUseIds: new Set(),\n partialBlocks: new Map(),\n stepUsage: undefined,\n pendingStepToolUseIds: new Set(),\n pendingStepAssistantUsage: undefined,\n pendingStepDeltaUsage: undefined,\n pendingStepUsage: undefined,\n pendingResponseUsage: undefined,\n stepOpen: false,\n mcpToolUseIds: new Set(),\n externalMcpToolUseIds: new Set(),\n structuredOutputToolUseIds: new Set(),\n observedTerminalError: undefined,\n };\n}\n\nconst UNRECOVERABLE_API_RETRY_STATUSES = new Set([401, 403, 404]);\nconst HOST_TOOL_PREFIX = 'mcp__harness-tools__';\nconst RAW_TASK_MESSAGE_SUBTYPES = new Set([\n 'background_tasks_changed',\n 'task_started',\n 'task_progress',\n 'task_updated',\n 'task_notification',\n]);\n\nexport function isExternalMcpTool(nativeName: string): boolean {\n return (\n nativeName.startsWith('mcp__') && !nativeName.startsWith(HOST_TOOL_PREFIX)\n );\n}\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitTerminalError,\n onCompactionBoundary,\n toCommonName,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n emitWarning: (warning: { message: string }) => void;\n emitTerminalError: (message: string | undefined) => void;\n onCompactionBoundary: (boundary: {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n }) => void;\n toCommonName: (nativeName: string) => string;\n}): (event: ClaudeMessage) => void {\n let streamStarted = false;\n\n return msg => {\n const type = msg.type;\n\n // Emit `stream-start` once, on the first message, carrying the model the\n // CLI resolved to (the `system`/`init` message reports it — this is the\n // default model when none was configured).\n if (!streamStarted) {\n const initModel =\n type === 'system' &&\n msg.subtype === 'init' &&\n typeof (msg as { model?: unknown }).model === 'string'\n ? (msg as { model: string }).model\n : undefined;\n emit({\n type: 'stream-start',\n ...(initModel ? { modelId: initModel } : {}),\n });\n streamStarted = true;\n }\n\n if (type === 'system' && msg.subtype === 'api_retry') {\n if (\n typeof msg.error_status === 'number' &&\n UNRECOVERABLE_API_RETRY_STATUSES.has(msg.error_status)\n ) {\n emitTerminalError(\n `HTTP ${msg.error_status}: ${msg.error ?? 'provider request failed'}`,\n );\n return;\n }\n\n emitWarning({ message: formatApiRetryWarning(msg) });\n return;\n }\n\n if (typeof msg.error === 'string' && msg.error.trim()) {\n state.observedTerminalError = msg.error.trim();\n }\n\n if (\n type === 'auth_status' &&\n typeof msg.error === 'string' &&\n msg.error.trim()\n ) {\n emitTerminalError(msg.error);\n return;\n }\n\n if (\n type === 'system' &&\n msg.subtype === 'task_updated' &&\n msg.patch?.status === 'failed' &&\n typeof msg.patch.error === 'string'\n ) {\n emitTerminalError(msg.patch.error);\n return;\n }\n\n if (type === 'system' && msg.subtype === 'compact_boundary') {\n const meta = msg.compact_metadata;\n if (meta) {\n onCompactionBoundary({\n trigger: meta.trigger,\n ...(typeof meta.pre_tokens === 'number'\n ? { tokensBefore: meta.pre_tokens }\n : {}),\n ...(typeof meta.post_tokens === 'number'\n ? { tokensAfter: meta.post_tokens }\n : {}),\n });\n }\n return;\n }\n\n if (\n type === 'tool_progress' ||\n type === 'rate_limit_event' ||\n (type === 'system' &&\n msg.subtype != null &&\n RAW_TASK_MESSAGE_SUBTYPES.has(msg.subtype))\n ) {\n emit({ type: 'raw', rawValue: msg });\n return;\n }\n\n // Messages emitted by a Task-tool subagent carry the parent tool-use id.\n // Forward them for correlation and nested rendering, but do not map them\n // into regular stream parts or let them affect the parent step.\n if (msg.parent_tool_use_id != null) {\n emit({ type: 'raw', rawValue: msg });\n return;\n }\n\n if (type === 'stream_event') {\n handleStreamEvent({\n event: msg.event,\n message: msg,\n state,\n send: emit,\n toCommonName,\n });\n return;\n }\n\n const messageContent = msg.message?.content;\n if (type === 'assistant' && Array.isArray(messageContent)) {\n const usage = toUsageRecord(msg.message?.usage);\n const toolUseIds: string[] = [];\n let opensStep = false;\n for (const block of messageContent) {\n if (\n block.type === 'tool_use' &&\n typeof block.id === 'string' &&\n typeof block.name === 'string'\n ) {\n toolUseIds.push(block.id);\n if (block.name === 'StructuredOutput') {\n state.structuredOutputToolUseIds.add(block.id);\n continue;\n }\n if (block.name.startsWith(HOST_TOOL_PREFIX)) {\n state.pendingStepToolUseIds.add(block.id);\n state.mcpToolUseIds.add(block.id);\n opensStep = true;\n continue;\n }\n state.nativeToolCallNames.set(block.id, block.name);\n if (block.name === 'AskUserQuestion') {\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n continue;\n }\n const dynamic = isExternalMcpTool(block.name);\n if (dynamic) state.externalMcpToolUseIds.add(block.id);\n if (state.approvalRequestedToolUseIds.has(block.id)) {\n continue;\n }\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n emit({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: toCommonName(block.name),\n nativeName: block.name,\n input: JSON.stringify(block.input ?? {}),\n providerExecuted: true,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n }\n if (opensStep || toolUseIds.length === 0) {\n state.stepOpen = true;\n if (usage) {\n state.pendingStepAssistantUsage = usage;\n updatePendingStepUsage(state);\n }\n }\n return;\n }\n\n if (type === 'user' && Array.isArray(messageContent)) {\n const toolResultBlocks = messageContent.filter(\n block => block.type === 'tool_result',\n );\n const toolUseResult =\n toolResultBlocks.length === 1 ? msg.tool_use_result : undefined;\n\n for (const block of messageContent) {\n if (\n block.type === 'tool_result' &&\n typeof block.tool_use_id === 'string'\n ) {\n if (state.structuredOutputToolUseIds.delete(block.tool_use_id)) {\n continue;\n }\n if (state.mcpToolUseIds.has(block.tool_use_id)) {\n state.mcpToolUseIds.delete(block.tool_use_id);\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n continue;\n }\n state.approvalRequestedToolUseIds.delete(block.tool_use_id);\n const nativeName =\n state.nativeToolCallNames.get(block.tool_use_id) ?? 'unknown';\n state.nativeToolCallNames.delete(block.tool_use_id);\n const toolName = toCommonName(nativeName);\n const dynamic = state.externalMcpToolUseIds.delete(block.tool_use_id);\n const isError = !!block.is_error;\n const result =\n toolUseResult !== undefined\n ? toolUseResult\n : resolveToolResult({\n toolName,\n dynamic,\n isError,\n rawContent: block.content,\n });\n emit({\n type: 'tool-result',\n toolCallId: block.tool_use_id,\n toolName,\n result,\n isError,\n ...(dynamic ? { dynamic: true } : {}),\n });\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n }\n }\n closeStepIfReady({ state, emit });\n }\n };\n}\n\nexport function finishApprovalStep({\n state,\n emit,\n approvalId,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n approvalId: string;\n}): void {\n state.stepOpen = true;\n state.pendingStepToolUseIds.delete(approvalId);\n closeStepIfReady({ state, emit });\n}\n\nexport function emitFinishStep({\n state,\n emit,\n usage,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n usage: Record<string, unknown> | undefined;\n}): void {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: usage ?? defaultUsage(),\n });\n state.stepUsage = usage ?? state.stepUsage;\n state.pendingStepAssistantUsage = undefined;\n state.pendingStepDeltaUsage = undefined;\n state.pendingStepUsage = undefined;\n state.pendingStepToolUseIds = new Set();\n state.stepOpen = false;\n}\n\nfunction closeStepIfReady({\n state,\n emit,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n}): void {\n if (\n !state.stepOpen ||\n state.pendingStepToolUseIds.size > 0 ||\n state.partialBlocks.size > 0\n ) {\n return;\n }\n emitFinishStep({ state, emit, usage: state.pendingStepUsage });\n}\n\nfunction formatApiRetryWarning(msg: ClaudeMessage): string {\n const details: string[] = [];\n if (typeof msg.attempt === 'number') {\n const maxRetries =\n typeof msg.max_retries === 'number' ? `/${msg.max_retries}` : '';\n details.push(`attempt ${msg.attempt}${maxRetries}`);\n }\n if (typeof msg.error_status === 'number') {\n details.push(`HTTP ${msg.error_status}`);\n }\n if (typeof msg.retry_delay_ms === 'number') {\n details.push(`retrying in ${msg.retry_delay_ms}ms`);\n }\n if (msg.error) details.push(msg.error);\n return details.length > 0\n ? `Claude Code API retry: ${details.join('; ')}`\n : 'Claude Code API retry';\n}\n\nfunction handleStreamEvent({\n event,\n message,\n state,\n send,\n toCommonName,\n}: {\n event: ClaudeMessage['event'] | undefined;\n message: ClaudeMessage;\n state: ClaudeStreamEventState;\n send: Emit;\n toCommonName: (nativeName: string) => string;\n}): void {\n if (!event) return;\n\n if (event.type === 'message_start') {\n state.pendingResponseUsage = toUsageRecord(event.message?.usage);\n return;\n }\n\n if (event.type === 'message_delta') {\n const usage = toUsageRecord(event.usage);\n if (usage) {\n state.pendingResponseUsage = mergeNonNullUsage(\n state.pendingResponseUsage,\n usage,\n );\n state.pendingStepDeltaUsage = mergeNonNullUsage(\n state.pendingStepDeltaUsage,\n usage,\n );\n updatePendingStepUsage(state);\n }\n return;\n }\n\n if (event.type === 'message_stop') {\n send({\n type: 'raw',\n rawValue: {\n ...message,\n usage: state.pendingResponseUsage ?? {},\n },\n });\n state.pendingResponseUsage = undefined;\n return;\n }\n\n if (typeof event.index !== 'number') return;\n const index = event.index;\n const partialBlocks = state.partialBlocks;\n\n if (event.type === 'content_block_start') {\n const blockType = event.content_block?.type;\n if (blockType === 'text') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'text' });\n send({ type: 'text-start', id });\n } else if (blockType === 'thinking') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'thinking' });\n send({ type: 'reasoning-start', id });\n } else if (\n blockType === 'tool_use' &&\n typeof event.content_block?.id === 'string' &&\n typeof event.content_block.name === 'string'\n ) {\n const id = event.content_block.id;\n const nativeName = event.content_block.name;\n if (nativeName === 'StructuredOutput') {\n return;\n }\n if (nativeName === 'AskUserQuestion') {\n return;\n }\n const hostToolName = nativeName.startsWith(HOST_TOOL_PREFIX)\n ? nativeName.slice(HOST_TOOL_PREFIX.length)\n : undefined;\n const dynamic = isExternalMcpTool(nativeName);\n partialBlocks.set(index, { id, kind: 'tool-input' });\n send({\n type: 'tool-input-start',\n id,\n toolName: hostToolName ?? toCommonName(nativeName),\n providerExecuted: hostToolName === undefined,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n return;\n }\n\n if (event.type === 'content_block_delta') {\n const block = partialBlocks.get(index);\n if (!block) return;\n if (\n block.kind === 'text' &&\n event.delta?.type === 'text_delta' &&\n typeof event.delta.text === 'string'\n ) {\n send({ type: 'text-delta', id: block.id, delta: event.delta.text });\n } else if (\n block.kind === 'thinking' &&\n event.delta?.type === 'thinking_delta' &&\n typeof event.delta.thinking === 'string'\n ) {\n send({\n type: 'reasoning-delta',\n id: block.id,\n delta: event.delta.thinking,\n });\n } else if (\n block.kind === 'tool-input' &&\n event.delta?.type === 'input_json_delta' &&\n typeof event.delta.partial_json === 'string'\n ) {\n send({\n type: 'tool-input-delta',\n id: block.id,\n delta: event.delta.partial_json,\n });\n }\n return;\n }\n\n if (event.type === 'content_block_stop') {\n const block = partialBlocks.get(index);\n if (!block) return;\n partialBlocks.delete(index);\n if (block.kind === 'text') {\n send({ type: 'text-end', id: block.id });\n } else if (block.kind === 'thinking') {\n send({ type: 'reasoning-end', id: block.id });\n } else {\n send({ type: 'tool-input-end', id: block.id });\n }\n }\n}\n\nfunction toUsageRecord(usage: unknown): Record<string, unknown> | undefined {\n return usage != null && typeof usage === 'object'\n ? (usage as Record<string, unknown>)\n : undefined;\n}\n\nfunction mergeNonNullUsage(\n current: Record<string, unknown> | undefined,\n update: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = { ...current };\n for (const [key, value] of Object.entries(update)) {\n if (value != null) {\n merged[key] = value;\n }\n }\n return merged;\n}\n\nfunction updatePendingStepUsage(state: ClaudeStreamEventState): void {\n const assistantUsage = state.pendingStepAssistantUsage;\n const deltaUsage = state.pendingStepDeltaUsage;\n state.pendingStepUsage = mapUsage(\n assistantUsage || deltaUsage\n ? { ...assistantUsage, ...deltaUsage }\n : undefined,\n );\n}\n\nfunction isTextEntry(entry: unknown): entry is { text?: unknown } {\n return entry != null && typeof entry === 'object' && 'text' in entry;\n}\n\nfunction stringifyContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(entry =>\n isTextEntry(entry) ? String(entry.text ?? '') : JSON.stringify(entry),\n )\n .join('');\n }\n return JSON.stringify(content);\n}\n\nfunction hasNonTextContent(content: unknown): boolean {\n return Array.isArray(content) && content.some(entry => !isTextEntry(entry));\n}\n\nfunction resolveToolResult({\n toolName,\n dynamic,\n isError,\n rawContent,\n}: {\n toolName: string;\n dynamic: boolean;\n isError: boolean;\n rawContent: unknown;\n}): unknown {\n /*\n * Claude Code's Bash tool does not report the command's real numeric exit\n * code — the SDK exposes only stdout/stderr text and an is_error flag.\n * Consumers (and the example UI) render bash failures from an `exitCode`\n * field on a structured result, the shape Codex's shell tool provides\n * natively. When Claude omits `tool_use_result`, derive a binary code from\n * is_error: 1 on failure, 0 on success. This fallback is a stand-in for\n * failed/succeeded, not the process's true exit status.\n */\n if (toolName === 'bash') {\n return { exitCode: isError ? 1 : 0, stdout: stringifyContent(rawContent) };\n }\n // Must precede the MCP branch: flattening a non-text block to base64 text\n // is not recoverable by parsing it back.\n if (hasNonTextContent(rawContent)) return rawContent;\n const content = stringifyContent(rawContent);\n return dynamic ? parseMcpToolResult(content) : content;\n}\n\nfunction parseMcpToolResult(content: string): unknown {\n try {\n const parsed = JSON.parse(content);\n // `JSON.parse` also succeeds on scalars; keep those as the string sent.\n return parsed !== null && typeof parsed === 'object' ? parsed : content;\n } catch {\n return content;\n }\n}\n\nexport function mapUsage(usage: unknown): Record<string, unknown> | undefined {\n if (!usage || typeof usage !== 'object') return undefined;\n const u = usage as {\n input_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n };\n return {\n inputTokens: {\n total:\n (u.input_tokens ?? 0) +\n (u.cache_creation_input_tokens ?? 0) +\n (u.cache_read_input_tokens ?? 0),\n noCache: u.input_tokens ?? 0,\n cacheRead: u.cache_read_input_tokens ?? 0,\n cacheWrite: u.cache_creation_input_tokens ?? 0,\n },\n outputTokens: {\n total: u.output_tokens ?? 0,\n text: u.output_tokens ?? 0,\n },\n };\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import { z } from 'zod/v4';\n\ntype JsonLiteral = string | number | boolean | null;\n\nexport type JsonSchemaObject = {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaObject>;\n additionalProperties?: boolean | JsonSchemaObject;\n required?: string[];\n items?: JsonSchemaObject | JsonSchemaObject[];\n enum?: unknown[];\n const?: unknown;\n oneOf?: JsonSchemaObject[];\n anyOf?: JsonSchemaObject[];\n nullable?: boolean;\n};\n\ntype ZodShape = Record<string, z.ZodTypeAny>;\n\nexport function jsonSchemaToZodObject(input: unknown) {\n const schema = isJsonSchemaObject(input) ? input : {};\n return toZodObject(schema);\n}\n\nfunction toZodObject(schema: JsonSchemaObject) {\n const object = z.object(toZodShape(schema));\n if (schema.additionalProperties === false) return object.strict();\n\n // JSON Schema allows additional properties by default; Zod strips them.\n return object.catchall(\n isJsonSchemaObject(schema.additionalProperties)\n ? toZodType(schema.additionalProperties)\n : z.unknown(),\n );\n}\n\nfunction toZodShape(schema: JsonSchemaObject | undefined): ZodShape {\n if (!schema?.properties) return {};\n const required = new Set(schema.required);\n const shape: ZodShape = {};\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propType = toZodType(propSchema);\n let propertyType = required.has(key) ? propType : propType.optional();\n if (propSchema.description) {\n propertyType = propertyType.describe(propSchema.description);\n }\n shape[key] = propertyType;\n }\n return shape;\n}\n\nfunction toZodType(schema: JsonSchemaObject | undefined): z.ZodTypeAny {\n if (!schema) return z.any();\n\n let zType =\n zodForConst(schema) ??\n zodForEnum(schema) ??\n zodForUnion(schema) ??\n zodForType(schema);\n\n if (isNullable(schema)) zType = zType.nullable();\n if (schema.description) zType = zType.describe(schema.description);\n return zType;\n}\n\nfunction zodForType(schema: JsonSchemaObject): z.ZodTypeAny {\n const types = getNonNullTypes(schema);\n if (types.length > 1) return z.any();\n if (Array.isArray(schema.type) && types.length === 0) return z.null();\n const type = types[0] ?? (schema.properties ? 'object' : undefined);\n\n switch (type) {\n case 'string':\n return z.string();\n case 'number':\n return z.number();\n case 'integer':\n return z.number().int();\n case 'boolean':\n return z.boolean();\n case 'array':\n return z.array(\n Array.isArray(schema.items) ? z.any() : toZodType(schema.items),\n );\n case 'object':\n return toZodObject(schema);\n case 'null':\n return z.null();\n default:\n return z.any();\n }\n}\n\nfunction zodForConst(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!('const' in schema)) return undefined;\n return isJsonLiteral(schema.const) ? z.literal(schema.const) : z.any();\n}\n\nfunction zodForEnum(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!Array.isArray(schema.enum)) return undefined;\n if (!schema.enum.every(isJsonLiteral)) return z.any();\n return zodForLiterals(schema.enum);\n}\n\nfunction zodForUnion(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n const unionSchemas = schema.anyOf ?? schema.oneOf;\n if (!unionSchemas || unionSchemas.length < 2) return undefined;\n\n const options = unionSchemas.map(item => toZodType(item)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(options);\n}\n\nfunction zodForLiterals(values: JsonLiteral[]): z.ZodTypeAny {\n if (values.length === 0) return z.any();\n if (values.length === 1) return z.literal(values[0]);\n\n const literals = values.map(value => z.literal(value)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(literals);\n}\n\nfunction getNonNullTypes(schema: JsonSchemaObject): string[] {\n return Array.isArray(schema.type)\n ? schema.type.filter(type => type !== 'null')\n : ([schema.type].filter(Boolean) as string[]);\n}\n\nfunction isNullable(schema: JsonSchemaObject): boolean {\n return (\n schema.nullable === true ||\n (Array.isArray(schema.type) && schema.type.includes('null'))\n );\n}\n\nfunction isJsonSchemaObject(input: unknown): input is JsonSchemaObject {\n return input != null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction isJsonLiteral(value: unknown): value is JsonLiteral {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n","import type { StartMessage } from '../claude-code-bridge-protocol';\n\ntype BuiltinToolFiltering = StartMessage['builtinToolFiltering'];\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'Read',\n write: 'Write',\n edit: 'Edit',\n bash: 'Bash',\n glob: 'Glob',\n grep: 'Grep',\n webSearch: 'WebSearch',\n WebFetch: 'WebFetch',\n NotebookEdit: 'NotebookEdit',\n TodoWrite: 'TodoWrite',\n Agent: 'Agent',\n TaskCreate: 'TaskCreate',\n TaskGet: 'TaskGet',\n TaskUpdate: 'TaskUpdate',\n TaskList: 'TaskList',\n TaskStop: 'TaskStop',\n TaskOutput: 'TaskOutput',\n Monitor: 'Monitor',\n ListMcpResources: 'ListMcpResources',\n ReadMcpResource: 'ReadMcpResource',\n ExitPlanMode: 'ExitPlanMode',\n EnterWorktree: 'EnterWorktree',\n ExitWorktree: 'ExitWorktree',\n askUserQuestions: 'AskUserQuestion',\n Skill: 'Skill',\n ToolSearch: 'ToolSearch',\n};\n\nconst PUBLIC_TOOL_NAMES = Object.keys(PUBLIC_TO_NATIVE);\n\nfunction toNativeName(toolName: string): string {\n return PUBLIC_TO_NATIVE[toolName] ?? toolName;\n}\n\nexport function resolveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] | undefined {\n if (toolFiltering == null || toolFiltering.mode === 'deny') return undefined;\n return toolFiltering.toolNames.map(name => toNativeName(name));\n}\n\nexport function resolveInactiveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] {\n if (toolFiltering == null) return [];\n const inactiveToolNames =\n toolFiltering.mode === 'allow'\n ? PUBLIC_TOOL_NAMES.filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n return inactiveToolNames.map(name => toNativeName(name));\n}\n","import type {\n HarnessV1QuestionsToolInput,\n HarnessV1QuestionsToolOutput,\n} from '@ai-sdk/harness';\nimport type { AskUserQuestionInput } from '@anthropic-ai/claude-agent-sdk/sdk-tools.js';\n\ntype ClaudeCodeQuestion = AskUserQuestionInput['questions'][number];\n\nexport function claudeCodeQuestionKey(\n nativeInput: AskUserQuestionInput,\n): string {\n return JSON.stringify(nativeInput.questions);\n}\n\nexport function toHarnessQuestionsInput(\n nativeInput: AskUserQuestionInput,\n): HarnessV1QuestionsToolInput {\n return {\n allowPartialAnswers: true,\n questions: nativeInput.questions.map((question, questionIndex) => ({\n id: `question-${questionIndex + 1}`,\n question: question.question,\n header: question.header,\n options: question.options.map((option, optionIndex) => ({\n id: `option-${optionIndex + 1}`,\n label: option.label,\n description: option.description,\n ...(option.preview !== undefined ? { preview: option.preview } : {}),\n })),\n allowMultiple: question.multiSelect,\n allowFreeForm: true,\n })),\n };\n}\n\nexport function toClaudeCodeQuestionResult(input: {\n nativeInput: AskUserQuestionInput;\n output: HarnessV1QuestionsToolOutput;\n}):\n | {\n behavior: 'allow';\n updatedInput: AskUserQuestionInput & { answers: Record<string, string> };\n }\n | { behavior: 'deny'; message: string } {\n const output = input.output;\n if (output.action === 'declined' || output.action === 'cancelled') {\n return {\n behavior: 'deny',\n message: `The user ${output.action} the questions.`,\n };\n }\n\n const canonicalInput = toHarnessQuestionsInput(input.nativeInput);\n const answers = Object.fromEntries(\n canonicalInput.questions.flatMap((question, questionIndex) => {\n const answer = output.answers[question.id];\n if (answer == null) return [];\n const nativeQuestion = input.nativeInput.questions[questionIndex];\n return [\n [\n nativeQuestion.question,\n toClaudeCodeAnswer({\n nativeQuestion,\n optionIds: answer.optionIds,\n freeform: answer.freeform,\n }),\n ],\n ];\n }),\n );\n\n return {\n behavior: 'allow',\n updatedInput: { ...input.nativeInput, answers },\n };\n}\n\nfunction toClaudeCodeAnswer(input: {\n nativeQuestion: ClaudeCodeQuestion;\n optionIds: string[];\n freeform: string | undefined;\n}): string {\n if (input.freeform !== undefined) return input.freeform;\n const labels = input.optionIds.flatMap(optionId => {\n const index = positionalIdIndex({ id: optionId, prefix: 'option-' });\n const option =\n index == null ? undefined : input.nativeQuestion.options[index];\n return option == null ? [] : [option.label];\n });\n return input.nativeQuestion.multiSelect\n ? labels.join(', ')\n : (labels[0] ?? '');\n}\n\nfunction positionalIdIndex(input: {\n id: string;\n prefix: string;\n}): number | undefined {\n if (!input.id.startsWith(input.prefix)) return undefined;\n const oneBasedIndex = Number(input.id.slice(input.prefix.length));\n return Number.isInteger(oneBasedIndex) && oneBasedIndex > 0\n ? oneBasedIndex - 1\n : undefined;\n}\n","// Long-running bridge that runs inside a sandbox alongside the `claude` CLI.\n// The generic transport — WebSocket server, token auth, single-flight\n// reconnect, the in-memory event log + `seq`, resume replay, and the\n// lifecycle/meta files — lives in the shared `@ai-sdk/harness/bridge` runtime.\n// This file supplies only the Claude-specific turn driver.\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n type Experimental_BridgeUserMessage,\n type Experimental_BridgeUserMessageQueue,\n} from '@ai-sdk/harness/bridge';\nimport { createCompactionLatch } from './compaction-latch';\nimport type { StartMessage } from '../claude-code-bridge-protocol';\nimport { randomUUID } from 'node:crypto';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\n/*\n * CONSTRAINT — the third-party imports below are NEVER bundled into the\n * compiled `bridge/index.mjs`. They are declared `external` in\n * tsdown.config.ts and resolved at runtime from the node_modules that this\n * bridge installs *inside the sandbox* from `src/bridge/package.json` (and\n * its pinned `pnpm-lock.yaml`). That bridge package.json — NOT this host\n * package — is the single source of truth for these packages and their\n * versions; the published `@ai-sdk/harness-claude-code` package does not\n * provide them at runtime.\n *\n * When adding or changing a third-party import here you MUST keep all three\n * in sync, or the bridge will either get the dependency bundled in or fail\n * to resolve it in the sandbox:\n * 1. the import statement below,\n * 2. the `external` array in tsdown.config.ts, and\n * 3. the dependency entry in `src/bridge/package.json`.\n */\nimport * as claudeAgentSdk from '@anthropic-ai/claude-agent-sdk';\nimport type {\n HookCallback,\n HookJSONOutput,\n} from '@anthropic-ai/claude-agent-sdk';\nimport * as mcpServerModule from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createClaudeCodeSystemPrompt } from './claude-code-system-prompt';\nimport { toClaudeSkillsOption } from './claude-skills-option';\nimport {\n createClaudeStreamEventState,\n createEmitStreamEvent,\n defaultUsage,\n emitFinishStep,\n finishApprovalStep,\n isExternalMcpTool,\n mapUsage,\n type ClaudeMessage,\n} from './create-emit-stream-event';\nimport { jsonSchemaToZodObject } from './json-schema-to-zod';\nimport {\n resolveInactiveNativeTools,\n resolveNativeTools,\n} from './tool-filtering';\nimport {\n claudeCodeQuestionKey,\n toClaudeCodeQuestionResult,\n toHarnessQuestionsInput,\n} from './question-tool';\n\n/*\n * Native Claude Code tool name → cross-harness common name. Tools outside this\n * map (e.g. `WebFetch`, `NotebookEdit`) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'webSearch'\n | 'askUserQuestions';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n Bash: 'bash',\n Glob: 'glob',\n Grep: 'grep',\n WebSearch: 'webSearch',\n AskUserQuestion: 'askUserQuestions',\n};\n\nconst NATIVE_TOOL_KINDS: Readonly<\n Record<string, 'readonly' | 'edit' | 'bash'>\n> = {\n Read: 'readonly',\n Glob: 'readonly',\n Grep: 'readonly',\n WebSearch: 'readonly',\n WebFetch: 'readonly',\n TaskGet: 'readonly',\n TaskList: 'readonly',\n TaskOutput: 'readonly',\n ListMcpResources: 'readonly',\n ReadMcpResource: 'readonly',\n Write: 'edit',\n Edit: 'edit',\n NotebookEdit: 'edit',\n TodoWrite: 'edit',\n TaskCreate: 'edit',\n TaskUpdate: 'edit',\n TaskStop: 'edit',\n EnterWorktree: 'edit',\n ExitWorktree: 'edit',\n ExitPlanMode: 'edit',\n Skill: 'readonly',\n AskUserQuestion: 'readonly',\n ToolSearch: 'readonly',\n Bash: 'bash',\n Monitor: 'bash',\n};\n\nfunction toCommonName(nativeName: string): CommonBuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir;\nconst bridgeStateDir = args.bridgeStateDir;\nif (!workdir) {\n emitFatal('Missing --workdir argument.');\n}\nif (!bridgeStateDir) {\n emitFatal('Missing --bridge-state-dir argument.');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst claudeSdk = claudeAgentSdk as any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst mcpModule = mcpServerModule as any;\n\n/**\n * The Claude session id most recently reported by the SDK, captured from the\n * message stream. Every turn in this bridge process may fork a new id (the\n * SDK's `continue`/`resume` create a new session linked to the previous one),\n * so the latest observation is the one a later resume must name.\n */\nlet lastClaudeSessionId: string | undefined;\n\nawait runBridge<StartMessage>({\n bridgeType: 'claude-code',\n bridgeStateDir,\n onStart: runTurn,\n // Claude Code's conversation state lives in the runtime's own store, keyed\n // by working directory. The resume payload names the exact conversation so a\n // later resume does not have to fall back to \"most recent in this workdir\".\n onStop: () =>\n lastClaudeSessionId == null ? {} : { claudeSessionId: lastClaudeSessionId },\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nfunction createPermissionOptions(input: {\n start: StartMessage;\n inactiveNativeTools: readonly string[];\n turn: BridgeTurn;\n emit: Emit;\n finishApprovalStep: (approvalId: string) => void;\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n}): Record<string, unknown> {\n const permissionMode = input.start.permissionMode ?? 'allow-all';\n const inactiveNativeTools = new Set(input.inactiveNativeTools);\n const permissionSettings = createPermissionSettings({\n permissionMode,\n inactiveNativeTools,\n });\n\n const baseOptions = {\n permissionMode:\n permissionMode === 'allow-all'\n ? 'bypassPermissions'\n : permissionMode === 'allow-edits'\n ? 'acceptEdits'\n : 'default',\n allowDangerouslySkipPermissions: permissionMode === 'allow-all',\n ...(permissionSettings ? { settings: permissionSettings } : {}),\n };\n\n if (permissionMode === 'allow-all') {\n return {\n ...baseOptions,\n /*\n * Claude Code exposes AskUserQuestion in headless SDK sessions only\n * when a permission prompt tool is configured. The stdio prompt tool\n * preserves that tool surface without supplying the canUseTool callback\n * that bypassPermissions guarantees it will never invoke.\n */\n permissionPromptToolName: 'stdio',\n };\n }\n\n return {\n ...baseOptions,\n canUseTool: async (\n toolName: string,\n toolInput: Record<string, unknown>,\n options: { toolUseID: string },\n ) => {\n if (toolName.startsWith('mcp__harness-tools__')) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n if (\n !inactiveNativeTools.has(toolName) &&\n !nativeToolRequiresApproval({\n nativeName: toolName,\n permissionMode,\n })\n ) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n\n const approvalId = options.toolUseID;\n input.approvalRequestedToolUseIds.add(approvalId);\n input.nativeToolCallNames.set(approvalId, toolName);\n input.emit({\n type: 'tool-call',\n toolCallId: approvalId,\n toolName: toCommonName(toolName),\n nativeName: toolName,\n input: JSON.stringify(toolInput ?? {}),\n providerExecuted: true,\n ...(isExternalMcpTool(toolName) ? { dynamic: true } : {}),\n });\n input.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: approvalId,\n });\n input.finishApprovalStep(approvalId);\n\n const decision = await input.turn.requestToolApproval(approvalId);\n return decision.approved\n ? { behavior: 'allow', updatedInput: toolInput, toolUseID: approvalId }\n : {\n behavior: 'deny',\n message: decision.reason ?? 'Denied',\n toolUseID: approvalId,\n };\n },\n };\n}\n\nfunction createQuestionPreToolUseHook(input: {\n turn: BridgeTurn;\n emit: Emit;\n nativeToolCallNames: Map<string, string>;\n}): HookCallback {\n return async (hookInput, toolUseID): Promise<HookJSONOutput> => {\n if (\n hookInput.hook_event_name !== 'PreToolUse' ||\n hookInput.tool_name !== 'AskUserQuestion'\n ) {\n return {};\n }\n\n const nativeInput = hookInput.tool_input as Parameters<\n typeof toHarnessQuestionsInput\n >[0];\n const canonicalInput = toHarnessQuestionsInput(nativeInput);\n const toolCallId = toolUseID ?? hookInput.tool_use_id;\n input.nativeToolCallNames.set(toolCallId, hookInput.tool_name);\n input.emit({\n type: 'tool-call',\n toolCallId,\n toolName: 'askUserQuestions',\n nativeName: hookInput.tool_name,\n input: JSON.stringify(canonicalInput),\n providerExecuted: false,\n providerMetadata: {\n 'claude-code': {\n nativeRequest: nativeInput,\n },\n },\n });\n\n const questionKey = claudeCodeQuestionKey(nativeInput);\n const result = await input.turn.requestToolResult({\n toolCallId,\n matches: candidate => {\n const nativeRequest = candidate.toolResult?.providerOptions?.[\n 'claude-code'\n ]?.nativeRequest as\n | Parameters<typeof claudeCodeQuestionKey>[0]\n | undefined;\n return (\n nativeRequest != null &&\n claudeCodeQuestionKey(nativeRequest) === questionKey\n );\n },\n });\n const nativeResult = toClaudeCodeQuestionResult({\n nativeInput,\n output: result.output as Parameters<\n typeof toClaudeCodeQuestionResult\n >[0]['output'],\n });\n\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n ...(nativeResult.behavior === 'allow'\n ? {\n permissionDecision: 'allow',\n updatedInput: {\n ...nativeResult.updatedInput,\n } as Record<string, unknown>,\n }\n : {\n permissionDecision: 'deny',\n permissionDecisionReason: nativeResult.message,\n }),\n },\n };\n };\n}\n\nfunction createPermissionSettings(input: {\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n inactiveNativeTools: ReadonlySet<string>;\n}): Record<string, unknown> | undefined {\n const askRules = new Set<string>();\n for (const [nativeName, kind] of Object.entries(NATIVE_TOOL_KINDS)) {\n if (\n input.inactiveNativeTools.has(nativeName) ||\n (input.permissionMode === 'allow-reads'\n ? kind === 'edit' || kind === 'bash'\n : input.permissionMode === 'allow-edits'\n ? kind === 'bash'\n : false)\n ) {\n askRules.add(`${nativeName}(*)`);\n }\n }\n\n if (askRules.size === 0) return undefined;\n\n return {\n permissions: { ask: [...askRules] },\n sandbox: { autoAllowBashIfSandboxed: false },\n };\n}\n\nfunction nativeToolRequiresApproval(input: {\n nativeName: string;\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n}): boolean {\n if (input.permissionMode === 'allow-all') return false;\n const kind = NATIVE_TOOL_KINDS[input.nativeName] ?? 'edit';\n if (input.permissionMode === 'allow-edits') return kind === 'bash';\n return kind === 'edit' || kind === 'bash';\n}\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n // Local controller for the Claude query. Aborted either by the host (via the\n // shared runtime's `turn.abortSignal`) or by us on a terminal error.\n const abortCtl = new AbortController();\n // A host abort prefers the SDK's graceful `interrupt()` — Esc semantics: the\n // in-flight turn is persisted to the session transcript and settles with an\n // interrupted result, so a later resume (including the user's own\n // `claude --resume`) still sees the work done before the interrupt. The hard\n // abort kills the CLI process and loses that turn's records, so it is only\n // the fallback — armed unconditionally, because aborting an already-settled\n // query is a no-op — and the immediate path when the abort arrives before\n // the query exists.\n let gracefulAbort: (() => void) | undefined;\n let hardAbortTimer: ReturnType<typeof setTimeout> | undefined;\n const onHostAbort = (): void => {\n if (gracefulAbort) {\n gracefulAbort();\n } else {\n abortCtl.abort();\n }\n };\n if (turn.abortSignal.aborted) {\n abortCtl.abort();\n } else {\n turn.abortSignal.addEventListener('abort', onHostAbort, { once: true });\n }\n\n const streamEventState = createClaudeStreamEventState();\n\n const mcpServers: Record<string, unknown> = { ...start.mcpServers };\n if (start.tools && start.tools.length > 0) {\n const server = new mcpModule.McpServer({\n name: 'harness-tools',\n version: '1.0.0',\n });\n for (const tool of start.tools) {\n server.registerTool(\n tool.name,\n {\n description: tool.description ?? '',\n inputSchema: jsonSchemaToZodObject(tool.inputSchema),\n },\n async (\n ...handlerArgs: [\n Record<string, unknown>,\n { requestId: string | number; _meta?: Record<string, unknown> },\n ]\n ) => {\n const [input, extra] = handlerArgs;\n const metadataToolCallId = extra._meta?.['claudecode/toolUseId'];\n const toolCallId =\n typeof metadataToolCallId === 'string'\n ? metadataToolCallId\n : randomUUID();\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: tool.name,\n input: JSON.stringify(input),\n providerExecuted: false,\n });\n const { output, isError } = await turn.requestToolResult(toolCallId);\n emit({\n type: 'tool-result',\n toolCallId,\n toolName: tool.name,\n result: output ?? null,\n isError: !!isError,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(output ?? null) }],\n isError,\n };\n },\n );\n }\n mcpServers['harness-tools'] = {\n type: 'sdk',\n name: 'harness-tools',\n instance: server,\n };\n }\n\n // Compaction observation: merge Claude's `compact_boundary` message and\n // `PostCompact` hook (which arrive in either order) into one `compaction`\n // event. See `createCompactionLatch`.\n const compaction = createCompactionLatch(event => emit(event));\n\n // `stream-start` is emitted lazily on the first SDK message (below) so it can\n // carry the model the CLI resolved to, reported on the `system`/`init` message.\n\n const queryInput = createQueryInput({\n initialUserMessage: start.prompt,\n userMessages: turn.experimental_userMessages,\n abortSignal: abortCtl.signal,\n });\n const skillsOption = toClaudeSkillsOption(start.skills);\n const nativeTools = resolveNativeTools(start.builtinToolFiltering);\n const inactiveNativeTools = resolveInactiveNativeTools(\n start.builtinToolFiltering,\n );\n const permissionOptions = createPermissionOptions({\n start,\n inactiveNativeTools,\n turn,\n emit,\n finishApprovalStep: approvalId => {\n finishApprovalStep({ state: streamEventState, emit, approvalId });\n },\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds,\n });\n const questionPreToolUseHook = createQuestionPreToolUseHook({\n turn,\n emit,\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n });\n\n const q = claudeSdk.query({\n prompt: queryInput.input,\n options: {\n ...(start.model ? { model: start.model } : {}),\n ...(start.maxTurns !== undefined ? { maxTurns: start.maxTurns } : {}),\n ...(start.agentProgressSummaries !== undefined\n ? { agentProgressSummaries: start.agentProgressSummaries }\n : {}),\n ...(start.forwardSubagentText !== undefined\n ? { forwardSubagentText: start.forwardSubagentText }\n : {}),\n ...(start.env !== undefined ? { env: { ...procEnv, ...start.env } } : {}),\n ...(skillsOption ? { skills: skillsOption } : {}),\n ...(nativeTools !== undefined ? { tools: nativeTools } : {}),\n ...(inactiveNativeTools.length > 0\n ? { disallowedTools: inactiveNativeTools }\n : {}),\n systemPrompt: createClaudeCodeSystemPrompt(start.instructions),\n thinking: start.thinking,\n ...(start.effort !== undefined ? { effort: start.effort } : {}),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? {\n outputFormat: {\n type: 'json_schema' as const,\n schema: start.responseFormat.schema,\n },\n }\n : {}),\n includePartialMessages: true,\n // The `PostCompact` hook carries the compaction summary, which the\n // `compact_boundary` system message does not. Latch it for the unified\n // `compaction` event; return an empty output so compaction proceeds.\n hooks: {\n PreToolUse: [\n {\n matcher: 'AskUserQuestion',\n hooks: [questionPreToolUseHook],\n },\n ],\n PostCompact: [\n {\n hooks: [\n async (input: { compact_summary?: unknown }) => {\n if (typeof input?.compact_summary === 'string') {\n compaction.onSummary(input.compact_summary);\n }\n return {};\n },\n ],\n },\n ],\n },\n // Continuation rule, most specific first.\n //\n // `resumeSessionId` names the exact conversation and is what a\n // cross-process resume should use: `continue` means \"most recent thread\n // in this workdir\", which silently picks the wrong one once anything\n // else has run there. The bridge also retains the id observed during its\n // previous query, so every later query stays pinned to that conversation\n // even when the host detached and reattached between turns. `resume` and\n // `continue` are mutually exclusive in the SDK.\n //\n // Otherwise the host can force-continue by setting `start.continue`,\n // and turns after the first fall back to the legacy cwd-based behavior\n // when no exact id was observed.\n ...((start.resumeSessionId ?? lastClaudeSessionId)\n ? { resume: start.resumeSessionId ?? lastClaudeSessionId }\n : start.continue === true || !turn.firstTurn\n ? { continue: true }\n : {}),\n ...permissionOptions,\n mcpServers,\n cwd: workdir,\n abortSignal: abortCtl.signal,\n },\n });\n\n gracefulAbort = () => {\n // Backstop for the whole teardown, not just the interrupt call: if the\n // stream has not settled five seconds after a graceful interrupt was\n // requested, fall back to the hard abort. Aborting an already-settled\n // query is a no-op, and `unref` keeps the timer from pinning the bridge\n // process open on its own.\n hardAbortTimer = setTimeout(() => abortCtl.abort(), 5000);\n hardAbortTimer.unref?.();\n void Promise.resolve()\n .then(() => q.interrupt())\n .catch(() => abortCtl.abort());\n };\n let turnUsage: Record<string, unknown> | undefined;\n let totalCostUsd: number | undefined;\n let emittedTerminalError = false;\n let emittedTerminalFinish = false;\n\n const emitTerminalError = (message: string | undefined): void => {\n const normalized = message?.trim();\n if (!normalized || emittedTerminalError || emittedTerminalFinish) return;\n streamEventState.observedTerminalError = normalized;\n emittedTerminalError = true;\n // A turn the host itself stopped ends with an error-shaped result by\n // construction (an interrupted query reports a diagnostic, not success);\n // reporting the host's own stop as a terminal error makes every clean\n // interrupt look like a malfunction. The host has already settled the\n // turn on its side.\n if (!turn.abortSignal.aborted) {\n turn.emitError({\n error: normalized,\n message: 'claude-code terminal error',\n });\n }\n queryInput.close();\n abortCtl.abort();\n };\n\n const emitStreamEvent = createEmitStreamEvent({\n state: streamEventState,\n emit,\n emitWarning: turn.emitWarning,\n emitTerminalError,\n onCompactionBoundary: boundary => compaction.onBoundary(boundary),\n toCommonName,\n });\n\n try {\n for await (const msg of q as AsyncIterable<ClaudeMessage>) {\n if (abortCtl.signal.aborted) break;\n\n const type = msg.type;\n\n if (type === 'command_lifecycle') {\n queryInput.handleLifecycle(msg);\n }\n\n // Every SDK message carries the session id of the conversation it\n // belongs to. Track the latest so the stop payload and the terminal\n // finish metadata name the exact conversation.\n const sessionId = (msg as { session_id?: unknown }).session_id;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n lastClaudeSessionId = sessionId;\n }\n\n emitStreamEvent(msg);\n\n if (type === 'result') {\n if (msg.subtype === 'success') {\n // `success` does not mean the turn succeeded: the CLI flags a rejected\n // request with `is_error` and puts the message in `result`, which the\n // empty-result rescue below cannot catch.\n if (msg.is_error) {\n emitTerminalError(\n msg.result?.trim() ||\n streamEventState.observedTerminalError ||\n (typeof msg.api_error_status === 'number'\n ? `Claude Code reported an API error (HTTP ${msg.api_error_status})`\n : 'Claude Code reported a failed result'),\n );\n continue;\n }\n const emptyResult = !msg.result?.trim?.();\n if (emptyResult && streamEventState.observedTerminalError) {\n emitTerminalError(streamEventState.observedTerminalError);\n continue;\n }\n const usage = msg.usage ?? msg.message?.usage;\n const harnessUsage = mapUsage(usage);\n if (harnessUsage) turnUsage = addUsage(turnUsage, harnessUsage);\n if (typeof msg.total_cost_usd === 'number') {\n totalCostUsd = msg.total_cost_usd;\n }\n if (\n start.responseFormat?.type === 'json' &&\n msg.structured_output !== undefined\n ) {\n const id = randomUUID();\n emit({ type: 'text-start', id });\n emit({\n type: 'text-delta',\n id,\n delta: JSON.stringify(msg.structured_output),\n });\n emit({ type: 'text-end', id });\n streamEventState.stepOpen = true;\n }\n if (streamEventState.stepOpen) {\n emitFinishStep({\n state: streamEventState,\n emit,\n usage: streamEventState.pendingStepUsage ?? harnessUsage,\n });\n }\n if (!queryInput.answersSentMessage(msg)) continue;\n queryInput.observeResult();\n if (!queryInput.hasActiveUserMessages()) {\n queryInput.close();\n break;\n }\n } else {\n emitTerminalError(\n (Array.isArray(msg.errors) ? msg.errors.join('\\n') : undefined) ||\n streamEventState.observedTerminalError ||\n msg.result ||\n 'Unknown error',\n );\n }\n continue;\n }\n\n if (queryInput.hasObservedResult && !queryInput.hasActiveUserMessages()) {\n queryInput.close();\n break;\n }\n }\n } catch (err) {\n // Same reasoning as `emitTerminalError`: a throw after the host's own\n // abort (e.g. the hard-abort fallback killing the CLI mid-iteration, or\n // a rejected `interrupt()`) is the stop the host asked for, not a\n // malfunction. The host has already settled the turn on its side.\n if (\n !turn.abortSignal.aborted &&\n !(abortCtl.signal.aborted && emittedTerminalError)\n ) {\n turn.emitError({ error: err, message: 'claude-code turn failed' });\n }\n return;\n } finally {\n // The turn is over; disarm the host-abort path first. An abort of this\n // turn's signal arriving after this point (e.g. an `abort` message racing\n // the next `start`) must not interrupt the disposed query or arm the\n // hard-abort fallback timer for it.\n gracefulAbort = undefined;\n if (hardAbortTimer != null) clearTimeout(hardAbortTimer);\n turn.abortSignal.removeEventListener('abort', onHostAbort);\n queryInput.close();\n // Dispose the query explicitly: with streaming input the SDK keeps its\n // CLI subprocess alive for more user messages, and a turn that ended\n // through an interrupt or error path can otherwise leak that process —\n // observed as orphaned `claude` processes holding the very conversation\n // the next turn continues.\n try {\n await (q as { return?: (value?: unknown) => Promise<unknown> }).return?.(\n undefined,\n );\n } catch {\n // Best effort; the abort controller tears the process down otherwise.\n }\n }\n\n if (emittedTerminalError) return;\n emittedTerminalFinish = true;\n void emittedTerminalFinish;\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage ?? streamEventState.stepUsage ?? defaultUsage(),\n ...(totalCostUsd !== undefined || lastClaudeSessionId !== undefined\n ? {\n harnessMetadata: {\n 'claude-code': {\n ...(totalCostUsd !== undefined ? { costUsd: totalCostUsd } : {}),\n // The conversation this turn belongs to, resumable outside the\n // SDK with `claude --resume <sessionId>` and captured by the\n // adapter for exact cross-process resume.\n ...(lastClaudeSessionId !== undefined\n ? { sessionId: lastClaudeSessionId }\n : {}),\n },\n },\n }\n : {}),\n });\n}\n\nfunction createQueryInput({\n initialUserMessage,\n userMessages,\n abortSignal,\n}: {\n initialUserMessage: string;\n userMessages: Experimental_BridgeUserMessageQueue;\n abortSignal: AbortSignal;\n}): {\n input: AsyncIterable<unknown>;\n close(error?: unknown): void;\n handleLifecycle(message: ClaudeMessage): void;\n hasActiveUserMessages(): boolean;\n answersSentMessage(result: ClaudeMessage): boolean;\n observeResult(): void;\n readonly hasObservedResult: boolean;\n} {\n let closed = false;\n let observedResult = false;\n const submittedMessages = new Map<string, Experimental_BridgeUserMessage>();\n const initialMessageId = randomUUID();\n const sentMessageIds = new Set<string>([initialMessageId]);\n let cliEchoesMessageIds = false;\n const noteEcho = (ids: readonly unknown[]): boolean => {\n const echoed = ids.some(\n id => typeof id === 'string' && sentMessageIds.has(id),\n );\n if (echoed) cliEchoesMessageIds = true;\n return echoed;\n };\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n userMessages.close(error);\n };\n if (abortSignal.aborted) {\n close(abortSignal.reason);\n } else {\n abortSignal.addEventListener('abort', () => close(abortSignal.reason), {\n once: true,\n });\n }\n\n const toUserMessage = (options: {\n text: string;\n messageId: string;\n priority?: 'next';\n }): unknown => ({\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: options.text }],\n },\n parent_tool_use_id: null,\n uuid: options.messageId,\n ...(options.priority == null ? {} : { priority: options.priority }),\n });\n\n const messageIterator = userMessages[Symbol.asyncIterator]();\n\n return {\n close,\n handleLifecycle: message => {\n const lifecycle = message as ClaudeMessage & {\n command_uuid?: string;\n state?: 'queued' | 'started' | 'completed' | 'cancelled' | 'discarded';\n };\n if (lifecycle.command_uuid == null || lifecycle.state == null) return;\n noteEcho([lifecycle.command_uuid]);\n if (\n lifecycle.command_uuid === initialMessageId &&\n (lifecycle.state === 'cancelled' || lifecycle.state === 'discarded')\n ) {\n observedResult = true;\n }\n const submitted = submittedMessages.get(lifecycle.command_uuid);\n if (submitted == null) return;\n if (lifecycle.state === 'queued' || lifecycle.state === 'started') {\n submitted.accept();\n return;\n }\n if (lifecycle.state === 'cancelled' || lifecycle.state === 'discarded') {\n submitted.reject(\n new Error(`Claude Code ${lifecycle.state} the user message.`),\n );\n }\n submittedMessages.delete(lifecycle.command_uuid);\n },\n hasActiveUserMessages: () =>\n submittedMessages.size > 0 || userMessages.pendingCount > 0,\n answersSentMessage: result => {\n const { user_message_uuid, user_message_uuids, origin } = result as {\n user_message_uuid?: unknown;\n user_message_uuids?: unknown;\n origin?: { kind?: string };\n };\n const echoed = noteEcho([\n user_message_uuid,\n ...(Array.isArray(user_message_uuids) ? user_message_uuids : []),\n ]);\n return (\n echoed || (!cliEchoesMessageIds && origin?.kind !== 'task-notification')\n );\n },\n observeResult: () => {\n observedResult = true;\n },\n get hasObservedResult() {\n return observedResult;\n },\n input: {\n [Symbol.asyncIterator]() {\n let sentInitial = false;\n return {\n async next() {\n if (closed || abortSignal.aborted) {\n return {\n value: undefined,\n done: true,\n } as IteratorResult<unknown>;\n }\n if (!sentInitial) {\n sentInitial = true;\n return {\n value: toUserMessage({\n text: initialUserMessage,\n messageId: initialMessageId,\n }),\n done: false,\n };\n }\n const nextMessage = await messageIterator.next();\n if (nextMessage.done) {\n return {\n value: undefined,\n done: true,\n } as IteratorResult<unknown>;\n }\n submittedMessages.set(\n nextMessage.value.messageId,\n nextMessage.value,\n );\n sentMessageIds.add(nextMessage.value.messageId);\n return {\n value: toUserMessage({\n text: nextMessage.value.text,\n messageId: nextMessage.value.messageId,\n priority: 'next',\n }),\n done: false,\n };\n },\n };\n },\n },\n };\n}\n\nfunction addUsage(\n total: Record<string, unknown> | undefined,\n usage: Record<string, unknown>,\n): Record<string, unknown> {\n if (total == null) return usage;\n const result: Record<string, unknown> = { ...total };\n for (const [key, value] of Object.entries(usage)) {\n const previous = result[key];\n if (typeof value === 'number' && typeof previous === 'number') {\n result[key] = previous + value;\n } else if (\n value != null &&\n previous != null &&\n typeof value === 'object' &&\n typeof previous === 'object' &&\n !Array.isArray(value) &&\n !Array.isArray(previous)\n ) {\n result[key] = addUsage(\n previous as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: { workdir?: string; bridgeStateDir?: string } = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--workdir' && i + 1 < args.length) {\n out.workdir = args[++i];\n } else if (args[i] === '--bridge-state-dir' && i + 1 < args.length) {\n out.bridgeStateDir = args[++i];\n }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["procEnv"],"sources":["../../../harness/dist/bridge/index.js","../../src/bridge/compaction-latch.ts","../../src/bridge/claude-code-system-prompt.ts","../../src/bridge/claude-skills-option.ts","../../src/bridge/create-emit-stream-event.ts","../../src/bridge/json-schema-to-zod.ts","../../src/bridge/tool-filtering.ts","../../src/bridge/question-tool.ts","../../src/bridge/index.ts"],"sourcesContent":["import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { env, pid, stdout } from \"node:process\";\nimport { WebSocketServer } from \"ws\";\n//#region src/bridge/harness-bridge-capability-unsupported-error.ts\nconst name = \"AI_HarnessBridgeCapabilityUnsupportedError\";\n/**\n* Signals an unsupported capability discovered inside a sandbox bridge.\n* `isInstance` also recognizes the serialized error shape received by the\n* host, where it can be translated to `HarnessCapabilityUnsupportedError`.\n*/\nvar HarnessBridgeCapabilityUnsupportedError = class extends Error {\n\tconstructor({ message, harnessId, cause }) {\n\t\tsuper(message);\n\t\tObject.defineProperty(this, \"name\", { value: name });\n\t\tthis.harnessId = harnessId;\n\t\tthis.cause = cause;\n\t}\n\tstatic isInstance(error) {\n\t\treturn error != null && typeof error === \"object\" && \"name\" in error && error.name === name && \"message\" in error && typeof error.message === \"string\";\n\t}\n};\n//#endregion\n//#region src/bridge/index.ts\nconst DEBUG_LEVEL_WEIGHT = {\n\terror: 0,\n\twarn: 1,\n\tinfo: 2,\n\tdebug: 3,\n\ttrace: 4\n};\n/** Exact-or-dotted-prefix subsystem match (`'bridge'` matches `'bridge.turn'`). */\nfunction subsystemMatches(filters, subsystem) {\n\tif (!filters || filters.length === 0) return true;\n\treturn filters.some((filter) => subsystem === filter || subsystem.startsWith(`${filter}.`));\n}\nfunction formatBridgeError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\tif (typeof err === \"string\") return { message: err };\n\tif (err !== null && typeof err === \"object\") try {\n\t\treturn { message: JSON.stringify(err) };\n\t} catch {}\n\treturn { message: String(err) };\n}\nfunction createBridgeUserMessageQueue(options) {\n\tconst messages = [];\n\tconst waiters = [];\n\tconst entries = /* @__PURE__ */ new Map();\n\tlet closed = false;\n\tlet pendingCount = 0;\n\tconst enqueue = (input) => {\n\t\tconst existing = entries.get(input.messageId);\n\t\tif (existing != null) {\n\t\t\tif (existing.response != null) options.respond(existing.response);\n\t\t\treturn;\n\t\t}\n\t\tlet settled = false;\n\t\tconst settle = (response) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tpendingCount--;\n\t\t\tconst entry = entries.get(input.messageId);\n\t\t\tif (entry != null) entry.response = response;\n\t\t\toptions.respond(response);\n\t\t};\n\t\tconst message = {\n\t\t\tmessageId: input.messageId,\n\t\t\ttext: input.text,\n\t\t\taccept: () => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: true\n\t\t\t\t});\n\t\t\t},\n\t\t\treject: (error) => {\n\t\t\t\tsettle({\n\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\tmessageId: input.messageId,\n\t\t\t\t\taccepted: false,\n\t\t\t\t\terror: { message: formatBridgeError(error).message }\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tentries.set(input.messageId, { reject: message.reject });\n\t\tpendingCount++;\n\t\tif (closed) {\n\t\t\tmessage.reject(/* @__PURE__ */ new Error(\"The bridge turn is no longer accepting user messages.\"));\n\t\t\treturn;\n\t\t}\n\t\tconst waiter = waiters.shift();\n\t\tif (waiter != null) waiter({\n\t\t\tdone: false,\n\t\t\tvalue: message\n\t\t});\n\t\telse messages.push(message);\n\t};\n\tconst close = (error) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tconst reason = error ?? /* @__PURE__ */ new Error(\"The bridge turn ended before accepting the user message.\");\n\t\tfor (const entry of entries.values()) if (entry.response == null) entry.reject(reason);\n\t\tmessages.length = 0;\n\t\twhile (waiters.length > 0) waiters.shift()({\n\t\t\tdone: true,\n\t\t\tvalue: void 0\n\t\t});\n\t};\n\treturn {\n\t\tget pendingCount() {\n\t\t\treturn pendingCount;\n\t\t},\n\t\tenqueue,\n\t\tclose,\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn { next: () => {\n\t\t\t\tconst message = messages.shift();\n\t\t\t\tif (message != null) return Promise.resolve({\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: message\n\t\t\t\t});\n\t\t\t\tif (closed) return Promise.resolve({\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: void 0\n\t\t\t\t});\n\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\twaiters.push(resolve);\n\t\t\t\t});\n\t\t\t} };\n\t\t}\n\t};\n}\nfunction parseEnvList(value) {\n\tif (!value) return void 0;\n\tconst items = value.split(\",\").map((item) => item.trim()).filter(Boolean);\n\treturn items.length > 0 ? items : void 0;\n}\nconst ENV_TRUTHY = /* @__PURE__ */ new Set([\n\t\"1\",\n\t\"true\",\n\t\"yes\",\n\t\"on\"\n]);\nconst WS_OPEN = 1;\nasync function runBridge(options) {\n\tconst { bridgeType, bridgeStateDir, onStart, onStop, onDestroy } = options;\n\tconst teardownGraceMs = options.turnTeardownGraceMs ?? 1e4;\n\tconst expectedToken = options.token ?? env.BRIDGE_CHANNEL_TOKEN ?? \"\";\n\tconst bridgeWsPort = options.port ?? parseInt(env.BRIDGE_WS_PORT ?? \"0\", 10);\n\tconst bridgeMetaPath = `${bridgeStateDir}/bridge-meta.json`;\n\tconst startConfigPath = `${bridgeStateDir}/start-config.json`;\n\tconst rerunStartConfigPath = `${bridgeStateDir}/rerun-start-config.json`;\n\tconst eventLogPath = `${bridgeStateDir}/event-log.ndjson`;\n\ttry {\n\t\tawait mkdir(bridgeStateDir, { recursive: true });\n\t} catch {}\n\tlet currentBoundPort = 0;\n\tlet currentTurnState = \"init\";\n\tlet activeSocket;\n\tlet isFirstTurn = true;\n\tlet turnAbort;\n\tlet currentUserMessages;\n\t/**\n\t* Settles when the in-flight turn has fully wound down — `onStart`\n\t* returned or threw AND its completion state was recorded. `undefined`\n\t* between turns. A new `start` fences on this so turns never overlap.\n\t*/\n\tlet activeTurn;\n\tlet debugConfig;\n\tlet consoleCaptureInstalled = false;\n\tconst envDebugEnabled = ENV_TRUTHY.has((env.HARNESS_DEBUG ?? \"\").toLowerCase());\n\tlet seqCounter = 0;\n\tlet eventLog = [];\n\tlet diskBuffer = \"\";\n\tlet flushPromise = null;\n\tconst flushEventsToDisk = async () => {\n\t\twhile (diskBuffer.length > 0) {\n\t\t\tconst buf = diskBuffer;\n\t\t\tdiskBuffer = \"\";\n\t\t\tawait appendFile(eventLogPath, buf).catch(() => {});\n\t\t}\n\t};\n\tconst scheduleEventFlush = () => {\n\t\tif (flushPromise) return;\n\t\tflushPromise = new Promise((resolve) => {\n\t\t\tsetImmediate(() => {\n\t\t\t\tflushEventsToDisk().finally(resolve);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tflushPromise = null;\n\t\t\tif (diskBuffer.length > 0) scheduleEventFlush();\n\t\t});\n\t};\n\tconst flushPendingEventsToDisk = async () => {\n\t\tif (diskBuffer.length > 0 && !flushPromise) scheduleEventFlush();\n\t\tlet inFlight = flushPromise;\n\t\twhile (inFlight) {\n\t\t\tawait inFlight;\n\t\t\tinFlight = flushPromise;\n\t\t}\n\t};\n\tif (env.BRIDGE_REPLAY_FROM_DISK === \"1\" && existsSync(eventLogPath)) try {\n\t\teventLog = readFileSync(eventLogPath, \"utf8\").split(\"\\n\").map((line) => line.trim()).filter(Boolean).map((line) => ({\n\t\t\tseq: JSON.parse(line).seq,\n\t\t\tline\n\t\t}));\n\t\tseqCounter = eventLog.at(-1)?.seq ?? 0;\n\t} catch {\n\t\teventLog = [];\n\t\tseqCounter = 0;\n\t}\n\tconst pendingToolResults = /* @__PURE__ */ new Map();\n\tconst bufferedToolResults = [];\n\tconst pendingToolApprovals = /* @__PURE__ */ new Map();\n\tconst writeBridgeMeta = async (state) => {\n\t\ttry {\n\t\t\tawait writeFile(bridgeMetaPath, JSON.stringify({\n\t\t\t\ttype: bridgeType,\n\t\t\t\tport: currentBoundPort,\n\t\t\t\tstate,\n\t\t\t\tpid\n\t\t\t}));\n\t\t} catch {}\n\t};\n\tconst writeStartConfig = async (start) => {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(start);\n\t\t\tawait writeFile(startConfigPath, serialized);\n\t\t\tif (!existsSync(rerunStartConfigPath)) await writeFile(rerunStartConfigPath, serialized);\n\t\t} catch {}\n\t};\n\tconst emit = (event) => {\n\t\tconst seq = ++seqCounter;\n\t\tconst line = JSON.stringify({\n\t\t\t...event,\n\t\t\tseq\n\t\t});\n\t\teventLog.push({\n\t\t\tseq,\n\t\t\tline\n\t\t});\n\t\tdiskBuffer += `${line}\\n`;\n\t\tscheduleEventFlush();\n\t\tif (activeSocket?.readyState === WS_OPEN) try {\n\t\t\tactiveSocket.send(line);\n\t\t} catch {}\n\t};\n\tconst replay = (ws, afterSeq) => {\n\t\tfor (const entry of eventLog) if (entry.seq > afterSeq && ws.readyState === WS_OPEN) ws.send(entry.line);\n\t};\n\tconst shouldEmitDebugEvent = (level, subsystem) => {\n\t\tif (!debugConfig?.enabled) return false;\n\t\tconst threshold = debugConfig.level ?? \"debug\";\n\t\tif (DEBUG_LEVEL_WEIGHT[level] > DEBUG_LEVEL_WEIGHT[threshold]) return false;\n\t\treturn subsystemMatches(debugConfig.subsystems, subsystem);\n\t};\n\tconst rawStdoutWrite = process.stdout.write.bind(process.stdout);\n\tconst rawStderrWrite = process.stderr.write.bind(process.stderr);\n\tconst writeErrorToStderr = (input) => {\n\t\ttry {\n\t\t\tconst formatted = formatBridgeError(input.error);\n\t\t\trawStderrWrite(`[harness:${bridgeType}:error] ${input.message}: ${formatted.message}\\n`);\n\t\t\tif (formatted.stack) rawStderrWrite(`${formatted.stack}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitWarning = (input) => {\n\t\ttry {\n\t\t\tfor (const line of input.message.split(\"\\n\")) if (line.trim().length > 0) rawStderrWrite(`[harness:${bridgeType}:warn] ${line}\\n`);\n\t\t} catch {}\n\t};\n\tconst emitError = (input) => {\n\t\twriteErrorToStderr({\n\t\t\tmessage: input.message ?? \"bridge error\",\n\t\t\terror: input.error\n\t\t});\n\t\temit({\n\t\t\ttype: \"error\",\n\t\t\terror: serialiseError(input.error)\n\t\t});\n\t};\n\tconst installConsoleCapture = () => {\n\t\tif (consoleCaptureInstalled) return;\n\t\tconsoleCaptureInstalled = true;\n\t\tconst buffers = {\n\t\t\tstdout: \"\",\n\t\t\tstderr: \"\"\n\t\t};\n\t\tconst patch = (stream, raw) => (chunk, encoding, cb) => {\n\t\t\tif (debugConfig?.enabled) try {\n\t\t\t\tconst enc = typeof encoding === \"string\" ? encoding : \"utf8\";\n\t\t\t\tconst text = typeof chunk === \"string\" ? chunk : Buffer.from(chunk).toString(enc);\n\t\t\t\tconst parts = (buffers[stream] + text.replace(/\\r\\n/g, \"\\n\")).split(\"\\n\");\n\t\t\t\tbuffers[stream] = parts.pop() ?? \"\";\n\t\t\t\tfor (const line of parts) {\n\t\t\t\t\tconst trimmed = line.replace(/\\s+$/, \"\");\n\t\t\t\t\tif (trimmed) emit({\n\t\t\t\t\t\ttype: \"sandbox-log\",\n\t\t\t\t\t\tsource: bridgeType,\n\t\t\t\t\t\tstream,\n\t\t\t\t\t\tline: trimmed\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t\treturn raw(chunk, encoding, cb);\n\t\t};\n\t\tprocess.stdout.write = patch(\"stdout\", rawStdoutWrite);\n\t\tprocess.stderr.write = patch(\"stderr\", rawStderrWrite);\n\t};\n\tconst handleInbound = async (msg, ws) => {\n\t\tswitch (msg.type) {\n\t\t\tcase \"start\": {\n\t\t\t\tfor (;;) {\n\t\t\t\t\tconst pendingTurn = activeTurn;\n\t\t\t\t\tif (pendingTurn == null) break;\n\t\t\t\t\tturnAbort?.abort();\n\t\t\t\t\tcurrentUserMessages?.close(/* @__PURE__ */ new Error(\"A new bridge turn replaced the active turn.\"));\n\t\t\t\t\tlet graceTimer;\n\t\t\t\t\tconst settled = await Promise.race([pendingTurn.then(() => true), new Promise((resolve) => {\n\t\t\t\t\t\tgraceTimer = setTimeout(() => resolve(false), teardownGraceMs);\n\t\t\t\t\t\tgraceTimer.unref?.();\n\t\t\t\t\t})]);\n\t\t\t\t\tclearTimeout(graceTimer);\n\t\t\t\t\tif (!settled) break;\n\t\t\t\t}\n\t\t\t\tlet turnFinished;\n\t\t\t\tconst thisTurn = new Promise((resolve) => turnFinished = resolve);\n\t\t\t\tactiveTurn = thisTurn;\n\t\t\t\tactiveSocket = ws;\n\t\t\t\tconst firstTurn = isFirstTurn;\n\t\t\t\tisFirstTurn = false;\n\t\t\t\teventLog = [];\n\t\t\t\tdiskBuffer = \"\";\n\t\t\t\twriteFile(eventLogPath, \"\").catch(() => {});\n\t\t\t\tturnAbort = new AbortController();\n\t\t\t\tcurrentTurnState = \"running\";\n\t\t\t\twriteStartConfig(msg);\n\t\t\t\twriteBridgeMeta(\"running\");\n\t\t\t\tconst startDebug = msg.debug;\n\t\t\t\tdebugConfig = {\n\t\t\t\t\tenabled: startDebug?.enabled ?? envDebugEnabled,\n\t\t\t\t\tlevel: startDebug?.level ?? env.HARNESS_DEBUG_LEVEL,\n\t\t\t\t\tsubsystems: startDebug?.subsystems ?? parseEnvList(env.HARNESS_DEBUG_SUBSYSTEMS)\n\t\t\t\t};\n\t\t\t\tif (debugConfig.enabled) installConsoleCapture();\n\t\t\t\tconst userMessages = createBridgeUserMessageQueue({ respond: emit });\n\t\t\t\tconst turn = {\n\t\t\t\t\temit,\n\t\t\t\t\trequestToolResult: (requestInput) => {\n\t\t\t\t\t\tconst request = typeof requestInput === \"string\" ? { toolCallId: requestInput } : requestInput;\n\t\t\t\t\t\tconst bufferedIndex = bufferedToolResults.findIndex((buffered) => buffered.toolCallId === request.toolCallId || request.matches?.(buffered.result) === true);\n\t\t\t\t\t\tif (bufferedIndex >= 0) return Promise.resolve(bufferedToolResults.splice(bufferedIndex, 1)[0].result);\n\t\t\t\t\t\treturn new Promise((resolve) => {\n\t\t\t\t\t\t\tpendingToolResults.set(request.toolCallId, {\n\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\tmatches: request.matches\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\trequestToolApproval: (approvalId) => new Promise((resolve) => {\n\t\t\t\t\t\tpendingToolApprovals.set(approvalId, resolve);\n\t\t\t\t\t}),\n\t\t\t\t\texperimental_userMessages: userMessages,\n\t\t\t\t\tabortSignal: turnAbort.signal,\n\t\t\t\t\tfirstTurn,\n\t\t\t\t\tbridgeLog: (input) => {\n\t\t\t\t\t\tconst level = input.level ?? \"debug\";\n\t\t\t\t\t\tif (!shouldEmitDebugEvent(level, input.subsystem)) return;\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"debug-event\",\n\t\t\t\t\t\t\tlevel,\n\t\t\t\t\t\t\tsubsystem: input.subsystem,\n\t\t\t\t\t\t\tmessage: input.message,\n\t\t\t\t\t\t\t...input.attrs ? { attrs: input.attrs } : {},\n\t\t\t\t\t\t\t...input.error !== void 0 ? { error: formatBridgeError(input.error) } : {}\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\temitWarning,\n\t\t\t\t\temitError\n\t\t\t\t};\n\t\t\t\tcurrentUserMessages = userMessages;\n\t\t\t\ttry {\n\t\t\t\t\tawait onStart(msg, turn);\n\t\t\t\t} catch (err) {\n\t\t\t\t\temitError({\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t\tmessage: \"bridge turn failed\"\n\t\t\t\t\t});\n\t\t\t\t} finally {\n\t\t\t\t\tuserMessages.close();\n\t\t\t\t\tif (currentUserMessages === userMessages) currentUserMessages = void 0;\n\t\t\t\t\tif (activeTurn === thisTurn) {\n\t\t\t\t\t\tactiveTurn = void 0;\n\t\t\t\t\t\tcurrentTurnState = \"waiting\";\n\t\t\t\t\t\twriteBridgeMeta(\"waiting\");\n\t\t\t\t\t}\n\t\t\t\t\tturnFinished();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-result\": {\n\t\t\t\tconst result = {\n\t\t\t\t\toutput: msg.output,\n\t\t\t\t\tisError: msg.isError,\n\t\t\t\t\ttoolResult: msg.toolResult\n\t\t\t\t};\n\t\t\t\tconst exactPending = pendingToolResults.get(msg.toolCallId);\n\t\t\t\tconst matchingPending = exactPending == null ? Array.from(pendingToolResults.entries()).find(([, pending]) => pending.matches?.(result) === true) : void 0;\n\t\t\t\tconst pending = exactPending ?? matchingPending?.[1];\n\t\t\t\tconst pendingId = exactPending != null ? msg.toolCallId : matchingPending?.[0];\n\t\t\t\tif (pending != null && pendingId != null) {\n\t\t\t\t\tpendingToolResults.delete(pendingId);\n\t\t\t\t\tpending.resolve(result);\n\t\t\t\t} else bufferedToolResults.push({\n\t\t\t\t\ttoolCallId: msg.toolCallId,\n\t\t\t\t\tresult\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"tool-approval-response\": {\n\t\t\t\tconst resolver = pendingToolApprovals.get(msg.approvalId);\n\t\t\t\tif (resolver) {\n\t\t\t\t\tpendingToolApprovals.delete(msg.approvalId);\n\t\t\t\t\tresolver({\n\t\t\t\t\t\tapproved: msg.approved,\n\t\t\t\t\t\treason: msg.reason\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"user-message\": {\n\t\t\t\tconst messageId = msg.messageId ?? randomUUID();\n\t\t\t\tif (currentUserMessages == null) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The bridge has no active turn to steer.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ws !== activeSocket) {\n\t\t\t\t\tsendControl(ws, {\n\t\t\t\t\t\ttype: \"user-message-response\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\taccepted: false,\n\t\t\t\t\t\terror: { message: \"The connection does not own the active bridge turn.\" }\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrentUserMessages.enqueue({\n\t\t\t\t\tmessageId,\n\t\t\t\t\ttext: msg.text\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"abort\":\n\t\t\t\tturnAbort?.abort();\n\t\t\t\treturn;\n\t\t\tcase \"resume\":\n\t\t\t\tactiveSocket = ws;\n\t\t\t\treplay(ws, msg.lastSeenEventId);\n\t\t\t\treturn;\n\t\t\tcase \"destroy\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tawait onDestroy?.();\n\t\t\t\tdrainThenExit(ws, 1e3, \"destroy\");\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tcurrentTurnState = \"done\";\n\t\t\t\twriteBridgeMeta(\"done\");\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"bridge-stop\",\n\t\t\t\t\tdata: await onStop?.() ?? {}\n\t\t\t\t});\n\t\t\t\tdrainThenExit(ws, 1e3, \"stop\");\n\t\t}\n\t};\n\twriteBridgeMeta(\"init\");\n\tconst wss = new WebSocketServer({\n\t\tport: bridgeWsPort,\n\t\thost: \"0.0.0.0\"\n\t});\n\tconst exit = () => {\n\t\tif (options.onExit) {\n\t\t\toptions.onExit();\n\t\t\treturn;\n\t\t}\n\t\twss.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(0), 1e3).unref();\n\t};\n\tconst drainThenExit = (ws, code, reason) => {\n\t\tconst start = Date.now();\n\t\tconst tick = () => {\n\t\t\tif (ws.bufferedAmount === 0 || ws.readyState !== WS_OPEN || Date.now() - start >= 5e3) {\n\t\t\t\tflushPendingEventsToDisk().finally(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tws.close(code, reason);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\texit();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(tick, 10).unref();\n\t\t};\n\t\ttick();\n\t};\n\twss.on(\"listening\", () => {\n\t\tconst addr = wss.address();\n\t\tcurrentBoundPort = typeof addr === \"object\" && addr ? addr.port : 0;\n\t\tcurrentTurnState = \"waiting\";\n\t\twriteBridgeMeta(\"waiting\");\n\t\tstdout.write(JSON.stringify({\n\t\t\ttype: \"bridge-ready\",\n\t\t\tport: currentBoundPort\n\t\t}) + \"\\n\");\n\t\toptions.onListening?.(currentBoundPort);\n\t});\n\twss.on(\"connection\", (ws, req) => {\n\t\tif (new URL(req.url ?? \"/\", \"http://localhost\").searchParams.get(\"agent_bridge_token\") !== expectedToken) {\n\t\t\tws.close(1008, \"unauthorized\");\n\t\t\treturn;\n\t\t}\n\t\tsendControl(ws, {\n\t\t\ttype: \"bridge-hello\",\n\t\t\tstate: currentTurnState,\n\t\t\tlastSeq: seqCounter,\n\t\t\tcapabilities: { experimental_userMessageResponses: true }\n\t\t});\n\t\tws.on(\"message\", (raw) => {\n\t\t\tlet parsed;\n\t\t\ttry {\n\t\t\t\tconst text = typeof raw === \"string\" ? raw : Buffer.from(raw).toString(\"utf8\");\n\t\t\t\tparsed = JSON.parse(text);\n\t\t\t} catch (err) {\n\t\t\t\tsendControl(ws, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: `protocol parse error: ${err.message}`\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleInbound(parsed, ws);\n\t\t});\n\t\tws.on(\"close\", () => {\n\t\t\tif (activeSocket === ws) activeSocket = void 0;\n\t\t});\n\t\tws.on(\"error\", () => {});\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"uncaught exception\"\n\t\t});\n\t});\n\tprocess.on(\"unhandledRejection\", (err) => {\n\t\temitError({\n\t\t\terror: err,\n\t\t\tmessage: \"unhandled rejection\"\n\t\t});\n\t});\n\tawait new Promise((resolve, reject) => {\n\t\tif (wss.address() != null) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\twss.once(\"listening\", resolve);\n\t\twss.once(\"error\", reject);\n\t});\n\treturn {\n\t\tport: currentBoundPort,\n\t\tclose: () => new Promise((resolve) => {\n\t\t\twss.close(() => resolve());\n\t\t})\n\t};\n}\nfunction sendControl(socket, message) {\n\tif (socket?.readyState === WS_OPEN) try {\n\t\tsocket.send(JSON.stringify(message));\n\t} catch {}\n}\nfunction serialiseError(err) {\n\tif (err instanceof Error) return {\n\t\tname: err.name,\n\t\tmessage: err.message,\n\t\tstack: err.stack\n\t};\n\treturn err;\n}\n//#endregion\nexport { HarnessBridgeCapabilityUnsupportedError, runBridge };\n\n//# sourceMappingURL=index.js.map","/*\n * Claude reports a compaction in two pieces whose arrival order is not\n * guaranteed: the `compact_boundary` system message (trigger + token counts)\n * and the `PostCompact` hook (the summary text). The harness `compaction`\n * event needs fields from both, so this latch holds each half and emits a\n * single merged event once both have arrived, then resets for the next\n * compaction in the same turn.\n */\n\nexport type CompactionBoundary = {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionEvent = {\n type: 'compaction';\n trigger: 'manual' | 'auto';\n summary: string;\n tokensBefore?: number;\n tokensAfter?: number;\n};\n\nexport type CompactionLatch = {\n onBoundary(boundary: CompactionBoundary): void;\n onSummary(summary: string): void;\n};\n\nexport function createCompactionLatch(\n emit: (event: CompactionEvent) => void,\n): CompactionLatch {\n let boundary: CompactionBoundary | undefined;\n let summary: string | undefined;\n\n const tryEmit = (): void => {\n if (!boundary || summary === undefined) return;\n emit({\n type: 'compaction',\n trigger: boundary.trigger,\n summary,\n ...(boundary.tokensBefore !== undefined\n ? { tokensBefore: boundary.tokensBefore }\n : {}),\n ...(boundary.tokensAfter !== undefined\n ? { tokensAfter: boundary.tokensAfter }\n : {}),\n });\n boundary = undefined;\n summary = undefined;\n };\n\n return {\n onBoundary(next) {\n boundary = next;\n tryEmit();\n },\n onSummary(next) {\n summary = next;\n tryEmit();\n },\n };\n}\n","export function createClaudeCodeSystemPrompt(instructions?: string): {\n type: 'preset';\n preset: 'claude_code';\n append?: string;\n} {\n return {\n type: 'preset',\n preset: 'claude_code',\n ...(instructions ? { append: instructions } : {}),\n };\n}\n","export function toClaudeSkillsOption(\n skills: ReadonlyArray<string> | undefined,\n): 'all' | undefined {\n /*\n * The Claude Agent SDK treats `skills: string[]` as an allowlist, which hides\n * built-in/default skills. When the harness writes project skills, ask Claude\n * to enable every discovered skill so bundled defaults and project skills are\n * both visible.\n */\n return skills && skills.length > 0 ? 'all' : undefined;\n}\n","import { randomUUID } from 'node:crypto';\nimport { isDeepStrictEqual } from 'node:util';\n\ntype Emit = (message: Record<string, unknown>) => void;\n\nexport type ClaudeMessage = {\n type?: string;\n subtype?: string;\n parent_tool_use_id?: string | null;\n model?: string;\n error?: string;\n error_status?: number | null;\n attempt?: number;\n max_retries?: number;\n retry_delay_ms?: number;\n patch?: { status?: string; error?: string };\n compact_metadata?: {\n trigger: 'manual' | 'auto';\n pre_tokens?: number;\n post_tokens?: number;\n };\n event?: {\n type?: string;\n index?: number;\n usage?: Record<string, unknown>;\n message?: {\n usage?: Record<string, unknown>;\n };\n content_block?: {\n type?: string;\n id?: string;\n name?: string;\n };\n delta?: {\n type?: string;\n text?: string;\n thinking?: string;\n partial_json?: string;\n };\n };\n message?: {\n content?: string | ReadonlyArray<MessageBlock>;\n usage?: Record<string, unknown>;\n };\n result?: string;\n /** Result-message error flags; distinct from `error_status` (`api_retry`). */\n is_error?: boolean;\n api_error_status?: number | null;\n errors?: ReadonlyArray<string>;\n usage?: Record<string, unknown>;\n total_cost_usd?: number;\n structured_output?: unknown;\n tool_use_result?: unknown;\n};\n\ntype MessageBlock = {\n type: string;\n text?: string;\n thinking?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n};\n\nexport type ClaudeStreamEventState = {\n /*\n * Map of native tool-use id → tool name. Claude assistant messages emit\n * `tool_use` blocks with both `id` and `name`; the matching `tool_result`\n * block on a later user message carries only `tool_use_id`, so without this\n * map the tool-result event would have to emit `toolName: 'unknown'`.\n */\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n partialBlocks: Map<number, PartialBlock>;\n stepUsage: Record<string, unknown> | undefined;\n pendingStepToolUseIds: Set<string>;\n pendingStepAssistantUsage: Record<string, unknown> | undefined;\n pendingStepDeltaUsage: Record<string, unknown> | undefined;\n pendingStepUsage: Record<string, unknown> | undefined;\n pendingResponseUsage: Record<string, unknown> | undefined;\n stepOpen: boolean;\n /*\n * Host-tool calls reported by Claude. The MCP handler normally emits its own\n * `tool-call`/`tool-result` pair, but MCP input validation can reject a call\n * before that handler runs. Retaining the call lets the mapper report that\n * rejected attempt when the corresponding SDK result arrives.\n */\n mcpToolCalls: Map<string, { toolName: string; input: unknown }>;\n /*\n * Host-tool calls that reached the MCP handler. These records let the SDK\n * result mapper suppress the duplicate native result. Input-based matching\n * preserves deduplication when Claude omits or changes the tool-use metadata.\n */\n mcpHandlerCalls: Map<string, { toolName: string; input: unknown }>;\n externalMcpToolUseIds: Set<string>;\n structuredOutputToolUseIds: Set<string>;\n observedTerminalError: string | undefined;\n};\n\ntype PartialBlock =\n | { id: string; kind: 'text' | 'thinking' }\n | { id: string; kind: 'tool-input' };\n\nexport function createClaudeStreamEventState(): ClaudeStreamEventState {\n return {\n nativeToolCallNames: new Map(),\n approvalRequestedToolUseIds: new Set(),\n partialBlocks: new Map(),\n stepUsage: undefined,\n pendingStepToolUseIds: new Set(),\n pendingStepAssistantUsage: undefined,\n pendingStepDeltaUsage: undefined,\n pendingStepUsage: undefined,\n pendingResponseUsage: undefined,\n stepOpen: false,\n mcpToolCalls: new Map(),\n mcpHandlerCalls: new Map(),\n externalMcpToolUseIds: new Set(),\n structuredOutputToolUseIds: new Set(),\n observedTerminalError: undefined,\n };\n}\n\nconst UNRECOVERABLE_API_RETRY_STATUSES = new Set([401, 403, 404]);\nconst HOST_TOOL_PREFIX = 'mcp__harness-tools__';\nconst RAW_TASK_MESSAGE_SUBTYPES = new Set([\n 'background_tasks_changed',\n 'task_started',\n 'task_progress',\n 'task_updated',\n 'task_notification',\n]);\n\nexport function isExternalMcpTool(nativeName: string): boolean {\n return (\n nativeName.startsWith('mcp__') && !nativeName.startsWith(HOST_TOOL_PREFIX)\n );\n}\n\nexport function createEmitStreamEvent({\n state,\n emit,\n emitWarning,\n emitTerminalError,\n onCompactionBoundary,\n toCommonName,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n emitWarning: (warning: { message: string }) => void;\n emitTerminalError: (message: string | undefined) => void;\n onCompactionBoundary: (boundary: {\n trigger: 'manual' | 'auto';\n tokensBefore?: number;\n tokensAfter?: number;\n }) => void;\n toCommonName: (nativeName: string) => string;\n}): (event: ClaudeMessage) => void {\n let streamStarted = false;\n\n return msg => {\n const type = msg.type;\n\n // Emit `stream-start` once, on the first message, carrying the model the\n // CLI resolved to (the `system`/`init` message reports it — this is the\n // default model when none was configured).\n if (!streamStarted) {\n const initModel =\n type === 'system' &&\n msg.subtype === 'init' &&\n typeof (msg as { model?: unknown }).model === 'string'\n ? (msg as { model: string }).model\n : undefined;\n emit({\n type: 'stream-start',\n ...(initModel ? { modelId: initModel } : {}),\n });\n streamStarted = true;\n }\n\n if (type === 'system' && msg.subtype === 'api_retry') {\n if (\n typeof msg.error_status === 'number' &&\n UNRECOVERABLE_API_RETRY_STATUSES.has(msg.error_status)\n ) {\n emitTerminalError(\n `HTTP ${msg.error_status}: ${msg.error ?? 'provider request failed'}`,\n );\n return;\n }\n\n emitWarning({ message: formatApiRetryWarning(msg) });\n return;\n }\n\n if (typeof msg.error === 'string' && msg.error.trim()) {\n state.observedTerminalError = msg.error.trim();\n }\n\n if (\n type === 'auth_status' &&\n typeof msg.error === 'string' &&\n msg.error.trim()\n ) {\n emitTerminalError(msg.error);\n return;\n }\n\n if (\n type === 'system' &&\n msg.subtype === 'task_updated' &&\n msg.patch?.status === 'failed' &&\n typeof msg.patch.error === 'string'\n ) {\n emitTerminalError(msg.patch.error);\n return;\n }\n\n if (type === 'system' && msg.subtype === 'compact_boundary') {\n const meta = msg.compact_metadata;\n if (meta) {\n onCompactionBoundary({\n trigger: meta.trigger,\n ...(typeof meta.pre_tokens === 'number'\n ? { tokensBefore: meta.pre_tokens }\n : {}),\n ...(typeof meta.post_tokens === 'number'\n ? { tokensAfter: meta.post_tokens }\n : {}),\n });\n }\n return;\n }\n\n if (\n type === 'tool_progress' ||\n type === 'rate_limit_event' ||\n (type === 'system' &&\n msg.subtype != null &&\n RAW_TASK_MESSAGE_SUBTYPES.has(msg.subtype))\n ) {\n emit({ type: 'raw', rawValue: msg });\n return;\n }\n\n // Messages emitted by a Task-tool subagent carry the parent tool-use id.\n // Forward them for correlation and nested rendering, but do not map them\n // into regular stream parts or let them affect the parent step.\n if (msg.parent_tool_use_id != null) {\n emit({ type: 'raw', rawValue: msg });\n return;\n }\n\n if (type === 'stream_event') {\n handleStreamEvent({\n event: msg.event,\n message: msg,\n state,\n send: emit,\n toCommonName,\n });\n return;\n }\n\n const messageContent = msg.message?.content;\n if (type === 'assistant' && Array.isArray(messageContent)) {\n const usage = toUsageRecord(msg.message?.usage);\n const toolUseIds: string[] = [];\n let opensStep = false;\n for (const block of messageContent) {\n if (\n block.type === 'tool_use' &&\n typeof block.id === 'string' &&\n typeof block.name === 'string'\n ) {\n toolUseIds.push(block.id);\n if (block.name === 'StructuredOutput') {\n state.structuredOutputToolUseIds.add(block.id);\n continue;\n }\n if (block.name.startsWith(HOST_TOOL_PREFIX)) {\n state.pendingStepToolUseIds.add(block.id);\n state.mcpToolCalls.set(block.id, {\n toolName: block.name.slice(HOST_TOOL_PREFIX.length),\n input: block.input ?? {},\n });\n opensStep = true;\n continue;\n }\n state.nativeToolCallNames.set(block.id, block.name);\n if (block.name === 'AskUserQuestion') {\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n continue;\n }\n const dynamic = isExternalMcpTool(block.name);\n if (dynamic) state.externalMcpToolUseIds.add(block.id);\n if (state.approvalRequestedToolUseIds.has(block.id)) {\n continue;\n }\n state.pendingStepToolUseIds.add(block.id);\n opensStep = true;\n emit({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: toCommonName(block.name),\n nativeName: block.name,\n input: JSON.stringify(block.input ?? {}),\n providerExecuted: true,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n }\n if (opensStep || toolUseIds.length === 0) {\n state.stepOpen = true;\n if (usage) {\n state.pendingStepAssistantUsage = usage;\n updatePendingStepUsage(state);\n }\n }\n return;\n }\n\n if (type === 'user' && Array.isArray(messageContent)) {\n const toolResultBlocks = messageContent.filter(\n block => block.type === 'tool_result',\n );\n const toolUseResult =\n toolResultBlocks.length === 1 ? msg.tool_use_result : undefined;\n\n for (const block of messageContent) {\n if (\n block.type === 'tool_result' &&\n typeof block.tool_use_id === 'string'\n ) {\n if (state.structuredOutputToolUseIds.delete(block.tool_use_id)) {\n continue;\n }\n const mcpToolCall = state.mcpToolCalls.get(block.tool_use_id);\n if (mcpToolCall != null) {\n const handlerReportedCall = takeMcpHandlerCall({\n state,\n toolCallId: block.tool_use_id,\n toolCall: mcpToolCall,\n });\n state.mcpToolCalls.delete(block.tool_use_id);\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n if (handlerReportedCall) {\n continue;\n }\n\n const isError = !!block.is_error;\n const result =\n toolUseResult !== undefined\n ? toolUseResult\n : resolveToolResult({\n toolName: mcpToolCall.toolName,\n dynamic: false,\n isError,\n rawContent: block.content,\n });\n emit({\n type: 'tool-call',\n toolCallId: block.tool_use_id,\n toolName: mcpToolCall.toolName,\n input: JSON.stringify(mcpToolCall.input),\n // MCP rejected this call before asking the host to execute it.\n providerExecuted: true,\n });\n emit({\n type: 'tool-result',\n toolCallId: block.tool_use_id,\n toolName: mcpToolCall.toolName,\n result,\n isError,\n });\n continue;\n }\n state.approvalRequestedToolUseIds.delete(block.tool_use_id);\n const nativeName =\n state.nativeToolCallNames.get(block.tool_use_id) ?? 'unknown';\n state.nativeToolCallNames.delete(block.tool_use_id);\n const toolName = toCommonName(nativeName);\n const dynamic = state.externalMcpToolUseIds.delete(block.tool_use_id);\n const isError = !!block.is_error;\n const result =\n toolUseResult !== undefined\n ? toolUseResult\n : resolveToolResult({\n toolName,\n dynamic,\n isError,\n rawContent: block.content,\n });\n emit({\n type: 'tool-result',\n toolCallId: block.tool_use_id,\n toolName,\n result,\n isError,\n ...(dynamic ? { dynamic: true } : {}),\n });\n state.pendingStepToolUseIds.delete(block.tool_use_id);\n }\n }\n closeStepIfReady({ state, emit });\n }\n };\n}\n\nfunction takeMcpHandlerCall({\n state,\n toolCallId,\n toolCall,\n}: {\n state: ClaudeStreamEventState;\n toolCallId: string;\n toolCall: { toolName: string; input: unknown };\n}): boolean {\n if (state.mcpHandlerCalls.delete(toolCallId)) {\n return true;\n }\n\n for (const [handlerCallId, handlerCall] of state.mcpHandlerCalls) {\n if (\n handlerCall.toolName === toolCall.toolName &&\n isDeepStrictEqual(handlerCall.input, toolCall.input)\n ) {\n state.mcpHandlerCalls.delete(handlerCallId);\n return true;\n }\n }\n\n const matchingHandlerCallIds = Array.from(state.mcpHandlerCalls)\n .filter(([, handlerCall]) => handlerCall.toolName === toolCall.toolName)\n .map(([handlerCallId]) => handlerCallId);\n const matchingToolCallCount = Array.from(state.mcpToolCalls.values()).filter(\n pendingCall => pendingCall.toolName === toolCall.toolName,\n ).length;\n\n if (\n matchingHandlerCallIds.length > 0 &&\n matchingHandlerCallIds.length === matchingToolCallCount\n ) {\n state.mcpHandlerCalls.delete(matchingHandlerCallIds[0]);\n return true;\n }\n\n return false;\n}\n\nexport function finishApprovalStep({\n state,\n emit,\n approvalId,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n approvalId: string;\n}): void {\n state.stepOpen = true;\n state.pendingStepToolUseIds.delete(approvalId);\n closeStepIfReady({ state, emit });\n}\n\nexport function emitFinishStep({\n state,\n emit,\n usage,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n usage: Record<string, unknown> | undefined;\n}): void {\n emit({\n type: 'finish-step',\n finishReason: { unified: 'stop', raw: 'stop' },\n usage: usage ?? defaultUsage(),\n });\n state.stepUsage = usage ?? state.stepUsage;\n state.pendingStepAssistantUsage = undefined;\n state.pendingStepDeltaUsage = undefined;\n state.pendingStepUsage = undefined;\n state.pendingStepToolUseIds = new Set();\n state.stepOpen = false;\n}\n\nfunction closeStepIfReady({\n state,\n emit,\n}: {\n state: ClaudeStreamEventState;\n emit: Emit;\n}): void {\n if (\n !state.stepOpen ||\n state.pendingStepToolUseIds.size > 0 ||\n state.partialBlocks.size > 0\n ) {\n return;\n }\n emitFinishStep({ state, emit, usage: state.pendingStepUsage });\n}\n\nfunction formatApiRetryWarning(msg: ClaudeMessage): string {\n const details: string[] = [];\n if (typeof msg.attempt === 'number') {\n const maxRetries =\n typeof msg.max_retries === 'number' ? `/${msg.max_retries}` : '';\n details.push(`attempt ${msg.attempt}${maxRetries}`);\n }\n if (typeof msg.error_status === 'number') {\n details.push(`HTTP ${msg.error_status}`);\n }\n if (typeof msg.retry_delay_ms === 'number') {\n details.push(`retrying in ${msg.retry_delay_ms}ms`);\n }\n if (msg.error) details.push(msg.error);\n return details.length > 0\n ? `Claude Code API retry: ${details.join('; ')}`\n : 'Claude Code API retry';\n}\n\nfunction handleStreamEvent({\n event,\n message,\n state,\n send,\n toCommonName,\n}: {\n event: ClaudeMessage['event'] | undefined;\n message: ClaudeMessage;\n state: ClaudeStreamEventState;\n send: Emit;\n toCommonName: (nativeName: string) => string;\n}): void {\n if (!event) return;\n\n if (event.type === 'message_start') {\n state.pendingResponseUsage = toUsageRecord(event.message?.usage);\n return;\n }\n\n if (event.type === 'message_delta') {\n const usage = toUsageRecord(event.usage);\n if (usage) {\n state.pendingResponseUsage = mergeNonNullUsage(\n state.pendingResponseUsage,\n usage,\n );\n state.pendingStepDeltaUsage = mergeNonNullUsage(\n state.pendingStepDeltaUsage,\n usage,\n );\n updatePendingStepUsage(state);\n }\n return;\n }\n\n if (event.type === 'message_stop') {\n send({\n type: 'raw',\n rawValue: {\n ...message,\n usage: state.pendingResponseUsage ?? {},\n },\n });\n state.pendingResponseUsage = undefined;\n return;\n }\n\n if (typeof event.index !== 'number') return;\n const index = event.index;\n const partialBlocks = state.partialBlocks;\n\n if (event.type === 'content_block_start') {\n const blockType = event.content_block?.type;\n if (blockType === 'text') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'text' });\n send({ type: 'text-start', id });\n } else if (blockType === 'thinking') {\n const id = randomUUID();\n partialBlocks.set(index, { id, kind: 'thinking' });\n send({ type: 'reasoning-start', id });\n } else if (\n blockType === 'tool_use' &&\n typeof event.content_block?.id === 'string' &&\n typeof event.content_block.name === 'string'\n ) {\n const id = event.content_block.id;\n const nativeName = event.content_block.name;\n if (nativeName === 'StructuredOutput') {\n return;\n }\n if (nativeName === 'AskUserQuestion') {\n return;\n }\n const hostToolName = nativeName.startsWith(HOST_TOOL_PREFIX)\n ? nativeName.slice(HOST_TOOL_PREFIX.length)\n : undefined;\n const dynamic = isExternalMcpTool(nativeName);\n partialBlocks.set(index, { id, kind: 'tool-input' });\n send({\n type: 'tool-input-start',\n id,\n toolName: hostToolName ?? toCommonName(nativeName),\n providerExecuted: hostToolName === undefined,\n ...(dynamic ? { dynamic: true } : {}),\n });\n }\n return;\n }\n\n if (event.type === 'content_block_delta') {\n const block = partialBlocks.get(index);\n if (!block) return;\n if (\n block.kind === 'text' &&\n event.delta?.type === 'text_delta' &&\n typeof event.delta.text === 'string'\n ) {\n send({ type: 'text-delta', id: block.id, delta: event.delta.text });\n } else if (\n block.kind === 'thinking' &&\n event.delta?.type === 'thinking_delta' &&\n typeof event.delta.thinking === 'string'\n ) {\n send({\n type: 'reasoning-delta',\n id: block.id,\n delta: event.delta.thinking,\n });\n } else if (\n block.kind === 'tool-input' &&\n event.delta?.type === 'input_json_delta' &&\n typeof event.delta.partial_json === 'string'\n ) {\n send({\n type: 'tool-input-delta',\n id: block.id,\n delta: event.delta.partial_json,\n });\n }\n return;\n }\n\n if (event.type === 'content_block_stop') {\n const block = partialBlocks.get(index);\n if (!block) return;\n partialBlocks.delete(index);\n if (block.kind === 'text') {\n send({ type: 'text-end', id: block.id });\n } else if (block.kind === 'thinking') {\n send({ type: 'reasoning-end', id: block.id });\n } else {\n send({ type: 'tool-input-end', id: block.id });\n }\n }\n}\n\nfunction toUsageRecord(usage: unknown): Record<string, unknown> | undefined {\n return usage != null && typeof usage === 'object'\n ? (usage as Record<string, unknown>)\n : undefined;\n}\n\nfunction mergeNonNullUsage(\n current: Record<string, unknown> | undefined,\n update: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = { ...current };\n for (const [key, value] of Object.entries(update)) {\n if (value != null) {\n merged[key] = value;\n }\n }\n return merged;\n}\n\nfunction updatePendingStepUsage(state: ClaudeStreamEventState): void {\n const assistantUsage = state.pendingStepAssistantUsage;\n const deltaUsage = state.pendingStepDeltaUsage;\n state.pendingStepUsage = mapUsage(\n assistantUsage || deltaUsage\n ? { ...assistantUsage, ...deltaUsage }\n : undefined,\n );\n}\n\nfunction isTextEntry(entry: unknown): entry is { text?: unknown } {\n return entry != null && typeof entry === 'object' && 'text' in entry;\n}\n\nfunction stringifyContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map(entry =>\n isTextEntry(entry) ? String(entry.text ?? '') : JSON.stringify(entry),\n )\n .join('');\n }\n return JSON.stringify(content);\n}\n\nfunction hasNonTextContent(content: unknown): boolean {\n return Array.isArray(content) && content.some(entry => !isTextEntry(entry));\n}\n\nfunction resolveToolResult({\n toolName,\n dynamic,\n isError,\n rawContent,\n}: {\n toolName: string;\n dynamic: boolean;\n isError: boolean;\n rawContent: unknown;\n}): unknown {\n /*\n * Claude Code's Bash tool does not report the command's real numeric exit\n * code — the SDK exposes only stdout/stderr text and an is_error flag.\n * Consumers (and the example UI) render bash failures from an `exitCode`\n * field on a structured result, the shape Codex's shell tool provides\n * natively. When Claude omits `tool_use_result`, derive a binary code from\n * is_error: 1 on failure, 0 on success. This fallback is a stand-in for\n * failed/succeeded, not the process's true exit status.\n */\n if (toolName === 'bash') {\n return { exitCode: isError ? 1 : 0, stdout: stringifyContent(rawContent) };\n }\n // Must precede the MCP branch: flattening a non-text block to base64 text\n // is not recoverable by parsing it back.\n if (hasNonTextContent(rawContent)) return rawContent;\n const content = stringifyContent(rawContent);\n return dynamic ? parseMcpToolResult(content) : content;\n}\n\nfunction parseMcpToolResult(content: string): unknown {\n try {\n const parsed = JSON.parse(content);\n // `JSON.parse` also succeeds on scalars; keep those as the string sent.\n return parsed !== null && typeof parsed === 'object' ? parsed : content;\n } catch {\n return content;\n }\n}\n\nexport function mapUsage(usage: unknown): Record<string, unknown> | undefined {\n if (!usage || typeof usage !== 'object') return undefined;\n const u = usage as {\n input_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n };\n return {\n inputTokens: {\n total:\n (u.input_tokens ?? 0) +\n (u.cache_creation_input_tokens ?? 0) +\n (u.cache_read_input_tokens ?? 0),\n noCache: u.input_tokens ?? 0,\n cacheRead: u.cache_read_input_tokens ?? 0,\n cacheWrite: u.cache_creation_input_tokens ?? 0,\n },\n outputTokens: {\n total: u.output_tokens ?? 0,\n text: u.output_tokens ?? 0,\n },\n };\n}\n\nexport function defaultUsage(): Record<string, unknown> {\n return {\n inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },\n outputTokens: { total: 0, text: 0 },\n };\n}\n","import { z } from 'zod/v4';\n\ntype JsonLiteral = string | number | boolean | null;\n\nexport type JsonSchemaObject = {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaObject>;\n additionalProperties?: boolean | JsonSchemaObject;\n required?: string[];\n items?: JsonSchemaObject | JsonSchemaObject[];\n enum?: unknown[];\n const?: unknown;\n oneOf?: JsonSchemaObject[];\n anyOf?: JsonSchemaObject[];\n nullable?: boolean;\n};\n\ntype ZodShape = Record<string, z.ZodTypeAny>;\n\nexport function jsonSchemaToZodObject(input: unknown) {\n const schema = isJsonSchemaObject(input) ? input : {};\n return toZodObject(schema);\n}\n\nfunction toZodObject(schema: JsonSchemaObject) {\n const object = z.object(toZodShape(schema));\n if (schema.additionalProperties === false) return object.strict();\n\n // JSON Schema allows additional properties by default; Zod strips them.\n return object.catchall(\n isJsonSchemaObject(schema.additionalProperties)\n ? toZodType(schema.additionalProperties)\n : z.unknown(),\n );\n}\n\nfunction toZodShape(schema: JsonSchemaObject | undefined): ZodShape {\n if (!schema?.properties) return {};\n const required = new Set(schema.required);\n const shape: ZodShape = {};\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n const propType = toZodType(propSchema);\n let propertyType = required.has(key) ? propType : propType.optional();\n if (propSchema.description) {\n propertyType = propertyType.describe(propSchema.description);\n }\n shape[key] = propertyType;\n }\n return shape;\n}\n\nfunction toZodType(schema: JsonSchemaObject | undefined): z.ZodTypeAny {\n if (!schema) return z.any();\n\n let zType =\n zodForConst(schema) ??\n zodForEnum(schema) ??\n zodForUnion(schema) ??\n zodForType(schema);\n\n if (isNullable(schema)) zType = zType.nullable();\n if (schema.description) zType = zType.describe(schema.description);\n return zType;\n}\n\nfunction zodForType(schema: JsonSchemaObject): z.ZodTypeAny {\n const types = getNonNullTypes(schema);\n if (types.length > 1) return z.any();\n if (Array.isArray(schema.type) && types.length === 0) return z.null();\n const type = types[0] ?? (schema.properties ? 'object' : undefined);\n\n switch (type) {\n case 'string':\n return z.string();\n case 'number':\n return z.number();\n case 'integer':\n return z.number().int();\n case 'boolean':\n return z.boolean();\n case 'array':\n return z.array(\n Array.isArray(schema.items) ? z.any() : toZodType(schema.items),\n );\n case 'object':\n return toZodObject(schema);\n case 'null':\n return z.null();\n default:\n return z.any();\n }\n}\n\nfunction zodForConst(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!('const' in schema)) return undefined;\n return isJsonLiteral(schema.const) ? z.literal(schema.const) : z.any();\n}\n\nfunction zodForEnum(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n if (!Array.isArray(schema.enum)) return undefined;\n if (!schema.enum.every(isJsonLiteral)) return z.any();\n return zodForLiterals(schema.enum);\n}\n\nfunction zodForUnion(schema: JsonSchemaObject): z.ZodTypeAny | undefined {\n const unionSchemas = schema.anyOf ?? schema.oneOf;\n if (!unionSchemas || unionSchemas.length < 2) return undefined;\n\n const options = unionSchemas.map(item => toZodType(item)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(options);\n}\n\nfunction zodForLiterals(values: JsonLiteral[]): z.ZodTypeAny {\n if (values.length === 0) return z.any();\n if (values.length === 1) return z.literal(values[0]);\n\n const literals = values.map(value => z.literal(value)) as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ];\n return z.union(literals);\n}\n\nfunction getNonNullTypes(schema: JsonSchemaObject): string[] {\n return Array.isArray(schema.type)\n ? schema.type.filter(type => type !== 'null')\n : ([schema.type].filter(Boolean) as string[]);\n}\n\nfunction isNullable(schema: JsonSchemaObject): boolean {\n return (\n schema.nullable === true ||\n (Array.isArray(schema.type) && schema.type.includes('null'))\n );\n}\n\nfunction isJsonSchemaObject(input: unknown): input is JsonSchemaObject {\n return input != null && typeof input === 'object' && !Array.isArray(input);\n}\n\nfunction isJsonLiteral(value: unknown): value is JsonLiteral {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n","import type { StartMessage } from '../claude-code-bridge-protocol';\n\ntype BuiltinToolFiltering = StartMessage['builtinToolFiltering'];\n\nconst PUBLIC_TO_NATIVE: Readonly<Record<string, string>> = {\n read: 'Read',\n write: 'Write',\n edit: 'Edit',\n bash: 'Bash',\n glob: 'Glob',\n grep: 'Grep',\n webSearch: 'WebSearch',\n WebFetch: 'WebFetch',\n NotebookEdit: 'NotebookEdit',\n TodoWrite: 'TodoWrite',\n Agent: 'Agent',\n TaskCreate: 'TaskCreate',\n TaskGet: 'TaskGet',\n TaskUpdate: 'TaskUpdate',\n TaskList: 'TaskList',\n TaskStop: 'TaskStop',\n TaskOutput: 'TaskOutput',\n Monitor: 'Monitor',\n ListMcpResources: 'ListMcpResources',\n ReadMcpResource: 'ReadMcpResource',\n ExitPlanMode: 'ExitPlanMode',\n EnterWorktree: 'EnterWorktree',\n ExitWorktree: 'ExitWorktree',\n askUserQuestions: 'AskUserQuestion',\n Skill: 'Skill',\n ToolSearch: 'ToolSearch',\n};\n\nconst PUBLIC_TOOL_NAMES = Object.keys(PUBLIC_TO_NATIVE);\n\nfunction toNativeName(toolName: string): string {\n return PUBLIC_TO_NATIVE[toolName] ?? toolName;\n}\n\nexport function resolveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] | undefined {\n if (toolFiltering == null || toolFiltering.mode === 'deny') return undefined;\n return toolFiltering.toolNames.map(name => toNativeName(name));\n}\n\nexport function resolveInactiveNativeTools(\n toolFiltering: BuiltinToolFiltering,\n): string[] {\n if (toolFiltering == null) return [];\n const inactiveToolNames =\n toolFiltering.mode === 'allow'\n ? PUBLIC_TOOL_NAMES.filter(\n name => !toolFiltering.toolNames.includes(name),\n )\n : toolFiltering.toolNames;\n return inactiveToolNames.map(name => toNativeName(name));\n}\n","import type {\n HarnessV1QuestionsToolInput,\n HarnessV1QuestionsToolOutput,\n} from '@ai-sdk/harness';\nimport type { AskUserQuestionInput } from '@anthropic-ai/claude-agent-sdk/sdk-tools.js';\n\ntype ClaudeCodeQuestion = AskUserQuestionInput['questions'][number];\n\nexport function claudeCodeQuestionKey(\n nativeInput: AskUserQuestionInput,\n): string {\n return JSON.stringify(nativeInput.questions);\n}\n\nexport function toHarnessQuestionsInput(\n nativeInput: AskUserQuestionInput,\n): HarnessV1QuestionsToolInput {\n return {\n allowPartialAnswers: true,\n questions: nativeInput.questions.map((question, questionIndex) => ({\n id: `question-${questionIndex + 1}`,\n question: question.question,\n header: question.header,\n options: question.options.map((option, optionIndex) => ({\n id: `option-${optionIndex + 1}`,\n label: option.label,\n description: option.description,\n ...(option.preview !== undefined ? { preview: option.preview } : {}),\n })),\n allowMultiple: question.multiSelect,\n allowFreeForm: true,\n })),\n };\n}\n\nexport function toClaudeCodeQuestionResult(input: {\n nativeInput: AskUserQuestionInput;\n output: HarnessV1QuestionsToolOutput;\n}):\n | {\n behavior: 'allow';\n updatedInput: AskUserQuestionInput & { answers: Record<string, string> };\n }\n | { behavior: 'deny'; message: string } {\n const output = input.output;\n if (output.action === 'declined' || output.action === 'cancelled') {\n return {\n behavior: 'deny',\n message: `The user ${output.action} the questions.`,\n };\n }\n\n const canonicalInput = toHarnessQuestionsInput(input.nativeInput);\n const answers = Object.fromEntries(\n canonicalInput.questions.flatMap((question, questionIndex) => {\n const answer = output.answers[question.id];\n if (answer == null) return [];\n const nativeQuestion = input.nativeInput.questions[questionIndex];\n return [\n [\n nativeQuestion.question,\n toClaudeCodeAnswer({\n nativeQuestion,\n optionIds: answer.optionIds,\n freeform: answer.freeform,\n }),\n ],\n ];\n }),\n );\n\n return {\n behavior: 'allow',\n updatedInput: { ...input.nativeInput, answers },\n };\n}\n\nfunction toClaudeCodeAnswer(input: {\n nativeQuestion: ClaudeCodeQuestion;\n optionIds: string[];\n freeform: string | undefined;\n}): string {\n if (input.freeform !== undefined) return input.freeform;\n const labels = input.optionIds.flatMap(optionId => {\n const index = positionalIdIndex({ id: optionId, prefix: 'option-' });\n const option =\n index == null ? undefined : input.nativeQuestion.options[index];\n return option == null ? [] : [option.label];\n });\n return input.nativeQuestion.multiSelect\n ? labels.join(', ')\n : (labels[0] ?? '');\n}\n\nfunction positionalIdIndex(input: {\n id: string;\n prefix: string;\n}): number | undefined {\n if (!input.id.startsWith(input.prefix)) return undefined;\n const oneBasedIndex = Number(input.id.slice(input.prefix.length));\n return Number.isInteger(oneBasedIndex) && oneBasedIndex > 0\n ? oneBasedIndex - 1\n : undefined;\n}\n","// Long-running bridge that runs inside a sandbox alongside the `claude` CLI.\n// The generic transport — WebSocket server, token auth, single-flight\n// reconnect, the in-memory event log + `seq`, resume replay, and the\n// lifecycle/meta files — lives in the shared `@ai-sdk/harness/bridge` runtime.\n// This file supplies only the Claude-specific turn driver.\n\nimport {\n runBridge,\n type BridgeEvent,\n type BridgeTurn,\n type Experimental_BridgeUserMessage,\n type Experimental_BridgeUserMessageQueue,\n} from '@ai-sdk/harness/bridge';\nimport { createCompactionLatch } from './compaction-latch';\nimport type { StartMessage } from '../claude-code-bridge-protocol';\nimport { randomUUID } from 'node:crypto';\nimport { argv, env as procEnv, stdout } from 'node:process';\n\n/*\n * CONSTRAINT — the third-party imports below are NEVER bundled into the\n * compiled `bridge/index.mjs`. They are declared `external` in\n * tsdown.config.ts and resolved at runtime from the node_modules that this\n * bridge installs *inside the sandbox* from `src/bridge/package.json` (and\n * its pinned `pnpm-lock.yaml`). That bridge package.json — NOT this host\n * package — is the single source of truth for these packages and their\n * versions; the published `@ai-sdk/harness-claude-code` package does not\n * provide them at runtime.\n *\n * When adding or changing a third-party import here you MUST keep all three\n * in sync, or the bridge will either get the dependency bundled in or fail\n * to resolve it in the sandbox:\n * 1. the import statement below,\n * 2. the `external` array in tsdown.config.ts, and\n * 3. the dependency entry in `src/bridge/package.json`.\n */\nimport * as claudeAgentSdk from '@anthropic-ai/claude-agent-sdk';\nimport type {\n HookCallback,\n HookJSONOutput,\n} from '@anthropic-ai/claude-agent-sdk';\nimport * as mcpServerModule from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { createClaudeCodeSystemPrompt } from './claude-code-system-prompt';\nimport { toClaudeSkillsOption } from './claude-skills-option';\nimport {\n createClaudeStreamEventState,\n createEmitStreamEvent,\n defaultUsage,\n emitFinishStep,\n finishApprovalStep,\n isExternalMcpTool,\n mapUsage,\n type ClaudeMessage,\n} from './create-emit-stream-event';\nimport { jsonSchemaToZodObject } from './json-schema-to-zod';\nimport {\n resolveInactiveNativeTools,\n resolveNativeTools,\n} from './tool-filtering';\nimport {\n claudeCodeQuestionKey,\n toClaudeCodeQuestionResult,\n toHarnessQuestionsInput,\n} from './question-tool';\n\n/*\n * Native Claude Code tool name → cross-harness common name. Tools outside this\n * map (e.g. `WebFetch`, `NotebookEdit`) have no common equivalent; their\n * native name is forwarded as-is on `tool-call` events.\n */\ntype CommonBuiltinToolName =\n | 'read'\n | 'write'\n | 'edit'\n | 'bash'\n | 'glob'\n | 'grep'\n | 'webSearch'\n | 'askUserQuestions';\n\nconst NATIVE_TO_COMMON: Readonly<Record<string, CommonBuiltinToolName>> = {\n Read: 'read',\n Write: 'write',\n Edit: 'edit',\n Bash: 'bash',\n Glob: 'glob',\n Grep: 'grep',\n WebSearch: 'webSearch',\n AskUserQuestion: 'askUserQuestions',\n};\n\nconst NATIVE_TOOL_KINDS: Readonly<\n Record<string, 'readonly' | 'edit' | 'bash'>\n> = {\n Read: 'readonly',\n Glob: 'readonly',\n Grep: 'readonly',\n WebSearch: 'readonly',\n WebFetch: 'readonly',\n TaskGet: 'readonly',\n TaskList: 'readonly',\n TaskOutput: 'readonly',\n ListMcpResources: 'readonly',\n ReadMcpResource: 'readonly',\n Write: 'edit',\n Edit: 'edit',\n NotebookEdit: 'edit',\n TodoWrite: 'edit',\n TaskCreate: 'edit',\n TaskUpdate: 'edit',\n TaskStop: 'edit',\n EnterWorktree: 'edit',\n ExitWorktree: 'edit',\n ExitPlanMode: 'edit',\n Skill: 'readonly',\n AskUserQuestion: 'readonly',\n ToolSearch: 'readonly',\n Bash: 'bash',\n Monitor: 'bash',\n};\n\nfunction toCommonName(nativeName: string): CommonBuiltinToolName | string {\n return NATIVE_TO_COMMON[nativeName] ?? nativeName;\n}\n\nconst args = parseArgs(argv.slice(2));\nconst workdir = args.workdir;\nconst bridgeStateDir = args.bridgeStateDir;\nif (!workdir) {\n emitFatal('Missing --workdir argument.');\n}\nif (!bridgeStateDir) {\n emitFatal('Missing --bridge-state-dir argument.');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst claudeSdk = claudeAgentSdk as any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst mcpModule = mcpServerModule as any;\n\n/**\n * The Claude session id most recently reported by the SDK, captured from the\n * message stream. Every turn in this bridge process may fork a new id (the\n * SDK's `continue`/`resume` create a new session linked to the previous one),\n * so the latest observation is the one a later resume must name.\n */\nlet lastClaudeSessionId: string | undefined;\n\nawait runBridge<StartMessage>({\n bridgeType: 'claude-code',\n bridgeStateDir,\n onStart: runTurn,\n // Claude Code's conversation state lives in the runtime's own store, keyed\n // by working directory. The resume payload names the exact conversation so a\n // later resume does not have to fall back to \"most recent in this workdir\".\n onStop: () =>\n lastClaudeSessionId == null ? {} : { claudeSessionId: lastClaudeSessionId },\n});\n\ntype Emit = (msg: Record<string, unknown>) => void;\n\nfunction createPermissionOptions(input: {\n start: StartMessage;\n inactiveNativeTools: readonly string[];\n turn: BridgeTurn;\n emit: Emit;\n finishApprovalStep: (approvalId: string) => void;\n nativeToolCallNames: Map<string, string>;\n approvalRequestedToolUseIds: Set<string>;\n}): Record<string, unknown> {\n const permissionMode = input.start.permissionMode ?? 'allow-all';\n const inactiveNativeTools = new Set(input.inactiveNativeTools);\n const permissionSettings = createPermissionSettings({\n permissionMode,\n inactiveNativeTools,\n });\n\n const baseOptions = {\n permissionMode:\n permissionMode === 'allow-all'\n ? 'bypassPermissions'\n : permissionMode === 'allow-edits'\n ? 'acceptEdits'\n : 'default',\n allowDangerouslySkipPermissions: permissionMode === 'allow-all',\n ...(permissionSettings ? { settings: permissionSettings } : {}),\n };\n\n if (permissionMode === 'allow-all') {\n return {\n ...baseOptions,\n /*\n * Claude Code exposes AskUserQuestion in headless SDK sessions only\n * when a permission prompt tool is configured. The stdio prompt tool\n * preserves that tool surface without supplying the canUseTool callback\n * that bypassPermissions guarantees it will never invoke.\n */\n permissionPromptToolName: 'stdio',\n };\n }\n\n return {\n ...baseOptions,\n canUseTool: async (\n toolName: string,\n toolInput: Record<string, unknown>,\n options: { toolUseID: string },\n ) => {\n if (toolName.startsWith('mcp__harness-tools__')) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n if (\n !inactiveNativeTools.has(toolName) &&\n !nativeToolRequiresApproval({\n nativeName: toolName,\n permissionMode,\n })\n ) {\n return { behavior: 'allow', updatedInput: toolInput };\n }\n\n const approvalId = options.toolUseID;\n input.approvalRequestedToolUseIds.add(approvalId);\n input.nativeToolCallNames.set(approvalId, toolName);\n input.emit({\n type: 'tool-call',\n toolCallId: approvalId,\n toolName: toCommonName(toolName),\n nativeName: toolName,\n input: JSON.stringify(toolInput ?? {}),\n providerExecuted: true,\n ...(isExternalMcpTool(toolName) ? { dynamic: true } : {}),\n });\n input.emit({\n type: 'tool-approval-request',\n approvalId,\n toolCallId: approvalId,\n });\n input.finishApprovalStep(approvalId);\n\n const decision = await input.turn.requestToolApproval(approvalId);\n return decision.approved\n ? { behavior: 'allow', updatedInput: toolInput, toolUseID: approvalId }\n : {\n behavior: 'deny',\n message: decision.reason ?? 'Denied',\n toolUseID: approvalId,\n };\n },\n };\n}\n\nfunction createQuestionPreToolUseHook(input: {\n turn: BridgeTurn;\n emit: Emit;\n nativeToolCallNames: Map<string, string>;\n}): HookCallback {\n return async (hookInput, toolUseID): Promise<HookJSONOutput> => {\n if (\n hookInput.hook_event_name !== 'PreToolUse' ||\n hookInput.tool_name !== 'AskUserQuestion'\n ) {\n return {};\n }\n\n const nativeInput = hookInput.tool_input as Parameters<\n typeof toHarnessQuestionsInput\n >[0];\n const canonicalInput = toHarnessQuestionsInput(nativeInput);\n const toolCallId = toolUseID ?? hookInput.tool_use_id;\n input.nativeToolCallNames.set(toolCallId, hookInput.tool_name);\n input.emit({\n type: 'tool-call',\n toolCallId,\n toolName: 'askUserQuestions',\n nativeName: hookInput.tool_name,\n input: JSON.stringify(canonicalInput),\n providerExecuted: false,\n providerMetadata: {\n 'claude-code': {\n nativeRequest: nativeInput,\n },\n },\n });\n\n const questionKey = claudeCodeQuestionKey(nativeInput);\n const result = await input.turn.requestToolResult({\n toolCallId,\n matches: candidate => {\n const nativeRequest = candidate.toolResult?.providerOptions?.[\n 'claude-code'\n ]?.nativeRequest as\n | Parameters<typeof claudeCodeQuestionKey>[0]\n | undefined;\n return (\n nativeRequest != null &&\n claudeCodeQuestionKey(nativeRequest) === questionKey\n );\n },\n });\n const nativeResult = toClaudeCodeQuestionResult({\n nativeInput,\n output: result.output as Parameters<\n typeof toClaudeCodeQuestionResult\n >[0]['output'],\n });\n\n return {\n hookSpecificOutput: {\n hookEventName: 'PreToolUse',\n ...(nativeResult.behavior === 'allow'\n ? {\n permissionDecision: 'allow',\n updatedInput: {\n ...nativeResult.updatedInput,\n } as Record<string, unknown>,\n }\n : {\n permissionDecision: 'deny',\n permissionDecisionReason: nativeResult.message,\n }),\n },\n };\n };\n}\n\nfunction createPermissionSettings(input: {\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n inactiveNativeTools: ReadonlySet<string>;\n}): Record<string, unknown> | undefined {\n const askRules = new Set<string>();\n for (const [nativeName, kind] of Object.entries(NATIVE_TOOL_KINDS)) {\n if (\n input.inactiveNativeTools.has(nativeName) ||\n (input.permissionMode === 'allow-reads'\n ? kind === 'edit' || kind === 'bash'\n : input.permissionMode === 'allow-edits'\n ? kind === 'bash'\n : false)\n ) {\n askRules.add(`${nativeName}(*)`);\n }\n }\n\n if (askRules.size === 0) return undefined;\n\n return {\n permissions: { ask: [...askRules] },\n sandbox: { autoAllowBashIfSandboxed: false },\n };\n}\n\nfunction nativeToolRequiresApproval(input: {\n nativeName: string;\n permissionMode: 'allow-reads' | 'allow-edits' | 'allow-all';\n}): boolean {\n if (input.permissionMode === 'allow-all') return false;\n const kind = NATIVE_TOOL_KINDS[input.nativeName] ?? 'edit';\n if (input.permissionMode === 'allow-edits') return kind === 'bash';\n return kind === 'edit' || kind === 'bash';\n}\n\nasync function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {\n const emit: Emit = msg => turn.emit(msg as BridgeEvent);\n\n // Local controller for the Claude query. Aborted either by the host (via the\n // shared runtime's `turn.abortSignal`) or by us on a terminal error.\n const abortCtl = new AbortController();\n // A host abort prefers the SDK's graceful `interrupt()` — Esc semantics: the\n // in-flight turn is persisted to the session transcript and settles with an\n // interrupted result, so a later resume (including the user's own\n // `claude --resume`) still sees the work done before the interrupt. The hard\n // abort kills the CLI process and loses that turn's records, so it is only\n // the fallback — armed unconditionally, because aborting an already-settled\n // query is a no-op — and the immediate path when the abort arrives before\n // the query exists.\n let gracefulAbort: (() => void) | undefined;\n let hardAbortTimer: ReturnType<typeof setTimeout> | undefined;\n const onHostAbort = (): void => {\n if (gracefulAbort) {\n gracefulAbort();\n } else {\n abortCtl.abort();\n }\n };\n if (turn.abortSignal.aborted) {\n abortCtl.abort();\n } else {\n turn.abortSignal.addEventListener('abort', onHostAbort, { once: true });\n }\n\n const streamEventState = createClaudeStreamEventState();\n\n const mcpServers: Record<string, unknown> = { ...start.mcpServers };\n if (start.tools && start.tools.length > 0) {\n const server = new mcpModule.McpServer({\n name: 'harness-tools',\n version: '1.0.0',\n });\n for (const tool of start.tools) {\n server.registerTool(\n tool.name,\n {\n description: tool.description ?? '',\n inputSchema: jsonSchemaToZodObject(tool.inputSchema),\n },\n async (\n ...handlerArgs: [\n Record<string, unknown>,\n { requestId: string | number; _meta?: Record<string, unknown> },\n ]\n ) => {\n const [input, extra] = handlerArgs;\n const metadataToolCallId = extra._meta?.['claudecode/toolUseId'];\n const toolCallId =\n typeof metadataToolCallId === 'string'\n ? metadataToolCallId\n : randomUUID();\n streamEventState.mcpHandlerCalls.set(toolCallId, {\n toolName: tool.name,\n input,\n });\n emit({\n type: 'tool-call',\n toolCallId,\n toolName: tool.name,\n input: JSON.stringify(input),\n providerExecuted: false,\n });\n const { output, isError } = await turn.requestToolResult(toolCallId);\n emit({\n type: 'tool-result',\n toolCallId,\n toolName: tool.name,\n result: output ?? null,\n isError: !!isError,\n });\n return {\n content: [{ type: 'text', text: JSON.stringify(output ?? null) }],\n isError,\n };\n },\n );\n }\n mcpServers['harness-tools'] = {\n type: 'sdk',\n name: 'harness-tools',\n instance: server,\n };\n }\n\n // Compaction observation: merge Claude's `compact_boundary` message and\n // `PostCompact` hook (which arrive in either order) into one `compaction`\n // event. See `createCompactionLatch`.\n const compaction = createCompactionLatch(event => {\n const hasOpenStep = streamEventState.stepOpen;\n emit(event);\n // The harness translates compaction into synthetic step content. When\n // Claude reports it outside a model step, close that synthetic step here;\n // otherwise the existing model step will close it with its own usage.\n if (!hasOpenStep) {\n emitFinishStep({\n state: streamEventState,\n emit,\n usage: undefined,\n });\n }\n });\n\n // `stream-start` is emitted lazily on the first SDK message (below) so it can\n // carry the model the CLI resolved to, reported on the `system`/`init` message.\n\n const queryInput = createQueryInput({\n initialUserMessage: start.prompt,\n userMessages: turn.experimental_userMessages,\n abortSignal: abortCtl.signal,\n });\n const skillsOption = toClaudeSkillsOption(start.skills);\n const nativeTools = resolveNativeTools(start.builtinToolFiltering);\n const inactiveNativeTools = resolveInactiveNativeTools(\n start.builtinToolFiltering,\n );\n const permissionOptions = createPermissionOptions({\n start,\n inactiveNativeTools,\n turn,\n emit,\n finishApprovalStep: approvalId => {\n finishApprovalStep({ state: streamEventState, emit, approvalId });\n },\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds,\n });\n const questionPreToolUseHook = createQuestionPreToolUseHook({\n turn,\n emit,\n nativeToolCallNames: streamEventState.nativeToolCallNames,\n });\n\n const q = claudeSdk.query({\n prompt: queryInput.input,\n options: {\n ...(start.model ? { model: start.model } : {}),\n ...(start.maxTurns !== undefined ? { maxTurns: start.maxTurns } : {}),\n ...(start.agentProgressSummaries !== undefined\n ? { agentProgressSummaries: start.agentProgressSummaries }\n : {}),\n ...(start.forwardSubagentText !== undefined\n ? { forwardSubagentText: start.forwardSubagentText }\n : {}),\n ...(start.env !== undefined ? { env: { ...procEnv, ...start.env } } : {}),\n ...(skillsOption ? { skills: skillsOption } : {}),\n ...(nativeTools !== undefined ? { tools: nativeTools } : {}),\n ...(inactiveNativeTools.length > 0\n ? { disallowedTools: inactiveNativeTools }\n : {}),\n systemPrompt: createClaudeCodeSystemPrompt(start.instructions),\n thinking: start.thinking,\n ...(start.effort !== undefined ? { effort: start.effort } : {}),\n ...(start.responseFormat?.type === 'json' &&\n start.responseFormat.schema != null\n ? {\n outputFormat: {\n type: 'json_schema' as const,\n schema: start.responseFormat.schema,\n },\n }\n : {}),\n includePartialMessages: true,\n // The `PostCompact` hook carries the compaction summary, which the\n // `compact_boundary` system message does not. Latch it for the unified\n // `compaction` event; return an empty output so compaction proceeds.\n hooks: {\n PreToolUse: [\n {\n matcher: 'AskUserQuestion',\n hooks: [questionPreToolUseHook],\n },\n ],\n PostCompact: [\n {\n hooks: [\n async (input: { compact_summary?: unknown }) => {\n if (typeof input?.compact_summary === 'string') {\n compaction.onSummary(input.compact_summary);\n }\n return {};\n },\n ],\n },\n ],\n },\n // Continuation rule, most specific first.\n //\n // `resumeSessionId` names the exact conversation and is what a\n // cross-process resume should use: `continue` means \"most recent thread\n // in this workdir\", which silently picks the wrong one once anything\n // else has run there. The bridge also retains the id observed during its\n // previous query, so every later query stays pinned to that conversation\n // even when the host detached and reattached between turns. `resume` and\n // `continue` are mutually exclusive in the SDK.\n //\n // Otherwise the host can force-continue by setting `start.continue`,\n // and turns after the first fall back to the legacy cwd-based behavior\n // when no exact id was observed.\n ...((start.resumeSessionId ?? lastClaudeSessionId)\n ? { resume: start.resumeSessionId ?? lastClaudeSessionId }\n : start.continue === true || !turn.firstTurn\n ? { continue: true }\n : {}),\n ...permissionOptions,\n mcpServers,\n cwd: workdir,\n abortSignal: abortCtl.signal,\n },\n });\n\n gracefulAbort = () => {\n // Backstop for the whole teardown, not just the interrupt call: if the\n // stream has not settled five seconds after a graceful interrupt was\n // requested, fall back to the hard abort. Aborting an already-settled\n // query is a no-op, and `unref` keeps the timer from pinning the bridge\n // process open on its own.\n hardAbortTimer = setTimeout(() => abortCtl.abort(), 5000);\n hardAbortTimer.unref?.();\n void Promise.resolve()\n .then(() => q.interrupt())\n .catch(() => abortCtl.abort());\n };\n let turnUsage: Record<string, unknown> | undefined;\n let totalCostUsd: number | undefined;\n let emittedTerminalError = false;\n let emittedTerminalFinish = false;\n\n const emitTerminalError = (message: string | undefined): void => {\n const normalized = message?.trim();\n if (!normalized || emittedTerminalError || emittedTerminalFinish) return;\n streamEventState.observedTerminalError = normalized;\n emittedTerminalError = true;\n // A turn the host itself stopped ends with an error-shaped result by\n // construction (an interrupted query reports a diagnostic, not success);\n // reporting the host's own stop as a terminal error makes every clean\n // interrupt look like a malfunction. The host has already settled the\n // turn on its side.\n if (!turn.abortSignal.aborted) {\n turn.emitError({\n error: normalized,\n message: 'claude-code terminal error',\n });\n }\n queryInput.close();\n abortCtl.abort();\n };\n\n const emitStreamEvent = createEmitStreamEvent({\n state: streamEventState,\n emit,\n emitWarning: turn.emitWarning,\n emitTerminalError,\n onCompactionBoundary: boundary => compaction.onBoundary(boundary),\n toCommonName,\n });\n\n try {\n for await (const msg of q as AsyncIterable<ClaudeMessage>) {\n if (abortCtl.signal.aborted) break;\n\n const type = msg.type;\n\n if (type === 'command_lifecycle') {\n queryInput.handleLifecycle(msg);\n }\n\n // Every SDK message carries the session id of the conversation it\n // belongs to. Track the latest so the stop payload and the terminal\n // finish metadata name the exact conversation.\n const sessionId = (msg as { session_id?: unknown }).session_id;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n lastClaudeSessionId = sessionId;\n }\n\n emitStreamEvent(msg);\n\n if (type === 'result') {\n if (msg.subtype === 'success') {\n // `success` does not mean the turn succeeded: the CLI flags a rejected\n // request with `is_error` and puts the message in `result`, which the\n // empty-result rescue below cannot catch.\n if (msg.is_error) {\n emitTerminalError(\n msg.result?.trim() ||\n streamEventState.observedTerminalError ||\n (typeof msg.api_error_status === 'number'\n ? `Claude Code reported an API error (HTTP ${msg.api_error_status})`\n : 'Claude Code reported a failed result'),\n );\n continue;\n }\n const emptyResult = !msg.result?.trim?.();\n if (emptyResult && streamEventState.observedTerminalError) {\n emitTerminalError(streamEventState.observedTerminalError);\n continue;\n }\n const usage = msg.usage ?? msg.message?.usage;\n const harnessUsage = mapUsage(usage);\n if (harnessUsage) turnUsage = addUsage(turnUsage, harnessUsage);\n if (typeof msg.total_cost_usd === 'number') {\n totalCostUsd = msg.total_cost_usd;\n }\n if (\n start.responseFormat?.type === 'json' &&\n msg.structured_output !== undefined\n ) {\n const id = randomUUID();\n emit({ type: 'text-start', id });\n emit({\n type: 'text-delta',\n id,\n delta: JSON.stringify(msg.structured_output),\n });\n emit({ type: 'text-end', id });\n streamEventState.stepOpen = true;\n }\n if (streamEventState.stepOpen) {\n emitFinishStep({\n state: streamEventState,\n emit,\n usage: streamEventState.pendingStepUsage ?? harnessUsage,\n });\n }\n if (!queryInput.answersSentMessage(msg)) continue;\n queryInput.observeResult();\n if (!queryInput.hasActiveUserMessages()) {\n queryInput.close();\n break;\n }\n } else {\n emitTerminalError(\n (Array.isArray(msg.errors) ? msg.errors.join('\\n') : undefined) ||\n streamEventState.observedTerminalError ||\n msg.result ||\n 'Unknown error',\n );\n }\n continue;\n }\n\n if (queryInput.hasObservedResult && !queryInput.hasActiveUserMessages()) {\n queryInput.close();\n break;\n }\n }\n } catch (err) {\n // Same reasoning as `emitTerminalError`: a throw after the host's own\n // abort (e.g. the hard-abort fallback killing the CLI mid-iteration, or\n // a rejected `interrupt()`) is the stop the host asked for, not a\n // malfunction. The host has already settled the turn on its side.\n if (\n !turn.abortSignal.aborted &&\n !(abortCtl.signal.aborted && emittedTerminalError)\n ) {\n turn.emitError({ error: err, message: 'claude-code turn failed' });\n }\n return;\n } finally {\n // The turn is over; disarm the host-abort path first. An abort of this\n // turn's signal arriving after this point (e.g. an `abort` message racing\n // the next `start`) must not interrupt the disposed query or arm the\n // hard-abort fallback timer for it.\n gracefulAbort = undefined;\n if (hardAbortTimer != null) clearTimeout(hardAbortTimer);\n turn.abortSignal.removeEventListener('abort', onHostAbort);\n queryInput.close();\n // Dispose the query explicitly: with streaming input the SDK keeps its\n // CLI subprocess alive for more user messages, and a turn that ended\n // through an interrupt or error path can otherwise leak that process —\n // observed as orphaned `claude` processes holding the very conversation\n // the next turn continues.\n try {\n await (q as { return?: (value?: unknown) => Promise<unknown> }).return?.(\n undefined,\n );\n } catch {\n // Best effort; the abort controller tears the process down otherwise.\n }\n }\n\n if (emittedTerminalError) return;\n emittedTerminalFinish = true;\n void emittedTerminalFinish;\n emit({\n type: 'finish',\n finishReason: { unified: 'stop', raw: 'stop' },\n totalUsage: turnUsage ?? streamEventState.stepUsage ?? defaultUsage(),\n ...(totalCostUsd !== undefined || lastClaudeSessionId !== undefined\n ? {\n harnessMetadata: {\n 'claude-code': {\n ...(totalCostUsd !== undefined ? { costUsd: totalCostUsd } : {}),\n // The conversation this turn belongs to, resumable outside the\n // SDK with `claude --resume <sessionId>` and captured by the\n // adapter for exact cross-process resume.\n ...(lastClaudeSessionId !== undefined\n ? { sessionId: lastClaudeSessionId }\n : {}),\n },\n },\n }\n : {}),\n });\n}\n\nfunction createQueryInput({\n initialUserMessage,\n userMessages,\n abortSignal,\n}: {\n initialUserMessage: string;\n userMessages: Experimental_BridgeUserMessageQueue;\n abortSignal: AbortSignal;\n}): {\n input: AsyncIterable<unknown>;\n close(error?: unknown): void;\n handleLifecycle(message: ClaudeMessage): void;\n hasActiveUserMessages(): boolean;\n answersSentMessage(result: ClaudeMessage): boolean;\n observeResult(): void;\n readonly hasObservedResult: boolean;\n} {\n let closed = false;\n let observedResult = false;\n const submittedMessages = new Map<string, Experimental_BridgeUserMessage>();\n const initialMessageId = randomUUID();\n const sentMessageIds = new Set<string>([initialMessageId]);\n let cliEchoesMessageIds = false;\n const noteEcho = (ids: readonly unknown[]): boolean => {\n const echoed = ids.some(\n id => typeof id === 'string' && sentMessageIds.has(id),\n );\n if (echoed) cliEchoesMessageIds = true;\n return echoed;\n };\n const close = (error?: unknown): void => {\n if (closed) return;\n closed = true;\n userMessages.close(error);\n };\n if (abortSignal.aborted) {\n close(abortSignal.reason);\n } else {\n abortSignal.addEventListener('abort', () => close(abortSignal.reason), {\n once: true,\n });\n }\n\n const toUserMessage = (options: {\n text: string;\n messageId: string;\n priority?: 'next';\n }): unknown => ({\n type: 'user',\n message: {\n role: 'user',\n content: [{ type: 'text', text: options.text }],\n },\n parent_tool_use_id: null,\n uuid: options.messageId,\n ...(options.priority == null ? {} : { priority: options.priority }),\n });\n\n const messageIterator = userMessages[Symbol.asyncIterator]();\n\n return {\n close,\n handleLifecycle: message => {\n const lifecycle = message as ClaudeMessage & {\n command_uuid?: string;\n state?: 'queued' | 'started' | 'completed' | 'cancelled' | 'discarded';\n };\n if (lifecycle.command_uuid == null || lifecycle.state == null) return;\n noteEcho([lifecycle.command_uuid]);\n if (\n lifecycle.command_uuid === initialMessageId &&\n (lifecycle.state === 'cancelled' || lifecycle.state === 'discarded')\n ) {\n observedResult = true;\n }\n const submitted = submittedMessages.get(lifecycle.command_uuid);\n if (submitted == null) return;\n if (lifecycle.state === 'queued' || lifecycle.state === 'started') {\n submitted.accept();\n return;\n }\n if (lifecycle.state === 'cancelled' || lifecycle.state === 'discarded') {\n submitted.reject(\n new Error(`Claude Code ${lifecycle.state} the user message.`),\n );\n }\n submittedMessages.delete(lifecycle.command_uuid);\n },\n hasActiveUserMessages: () =>\n submittedMessages.size > 0 || userMessages.pendingCount > 0,\n answersSentMessage: result => {\n const { user_message_uuid, user_message_uuids, origin } = result as {\n user_message_uuid?: unknown;\n user_message_uuids?: unknown;\n origin?: { kind?: string };\n };\n const echoed = noteEcho([\n user_message_uuid,\n ...(Array.isArray(user_message_uuids) ? user_message_uuids : []),\n ]);\n return (\n echoed || (!cliEchoesMessageIds && origin?.kind !== 'task-notification')\n );\n },\n observeResult: () => {\n observedResult = true;\n },\n get hasObservedResult() {\n return observedResult;\n },\n input: {\n [Symbol.asyncIterator]() {\n let sentInitial = false;\n return {\n async next() {\n if (closed || abortSignal.aborted) {\n return {\n value: undefined,\n done: true,\n } as IteratorResult<unknown>;\n }\n if (!sentInitial) {\n sentInitial = true;\n return {\n value: toUserMessage({\n text: initialUserMessage,\n messageId: initialMessageId,\n }),\n done: false,\n };\n }\n const nextMessage = await messageIterator.next();\n if (nextMessage.done) {\n return {\n value: undefined,\n done: true,\n } as IteratorResult<unknown>;\n }\n submittedMessages.set(\n nextMessage.value.messageId,\n nextMessage.value,\n );\n sentMessageIds.add(nextMessage.value.messageId);\n return {\n value: toUserMessage({\n text: nextMessage.value.text,\n messageId: nextMessage.value.messageId,\n priority: 'next',\n }),\n done: false,\n };\n },\n };\n },\n },\n };\n}\n\nfunction addUsage(\n total: Record<string, unknown> | undefined,\n usage: Record<string, unknown>,\n): Record<string, unknown> {\n if (total == null) return usage;\n const result: Record<string, unknown> = { ...total };\n for (const [key, value] of Object.entries(usage)) {\n const previous = result[key];\n if (typeof value === 'number' && typeof previous === 'number') {\n result[key] = previous + value;\n } else if (\n value != null &&\n previous != null &&\n typeof value === 'object' &&\n typeof previous === 'object' &&\n !Array.isArray(value) &&\n !Array.isArray(previous)\n ) {\n result[key] = addUsage(\n previous as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction parseArgs(args: string[]): {\n workdir?: string;\n bridgeStateDir?: string;\n} {\n const out: { workdir?: string; bridgeStateDir?: string } = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--workdir' && i + 1 < args.length) {\n out.workdir = args[++i];\n } else if (args[i] === '--bridge-state-dir' && i + 1 < args.length) {\n out.bridgeStateDir = args[++i];\n }\n }\n return out;\n}\n\nfunction emitFatal(message: string): never {\n stdout.write(JSON.stringify({ type: 'bridge-fatal', message }) + '\\n');\n process.exit(1);\n}\n"],"mappings":";;;;;;;;;;AAyBA,MAAM,qBAAqB;CAC1B,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACR;;AAEA,SAAS,iBAAiB,SAAS,WAAW;CAC7C,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,OAAO;CAC7C,OAAO,QAAQ,MAAM,WAAW,cAAc,UAAU,UAAU,WAAW,GAAG,OAAO,EAAE,CAAC;AAC3F;AACA,SAAS,kBAAkB,KAAK;CAC/B,IAAI,eAAe,OAAO,OAAO;EAChC,MAAM,IAAI;EACV,SAAS,IAAI;EACb,OAAO,IAAI;CACZ;CACA,IAAI,OAAO,QAAQ,UAAU,OAAO,EAAE,SAAS,IAAI;CACnD,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU,IAAI;EAChD,OAAO,EAAE,SAAS,KAAK,UAAU,GAAG,EAAE;CACvC,QAAQ,CAAC;CACT,OAAO,EAAE,SAAS,OAAO,GAAG,EAAE;AAC/B;AACA,SAAS,6BAA6B,SAAS;CAC9C,MAAM,WAAW,CAAC;CAClB,MAAM,UAAU,CAAC;CACjB,MAAM,0BAA0B,IAAI,IAAI;CACxC,IAAI,SAAS;CACb,IAAI,eAAe;CACnB,MAAM,WAAW,UAAU;EAC1B,MAAM,WAAW,QAAQ,IAAI,MAAM,SAAS;EAC5C,IAAI,YAAY,MAAM;GACrB,IAAI,SAAS,YAAY,MAAM,QAAQ,QAAQ,SAAS,QAAQ;GAChE;EACD;EACA,IAAI,UAAU;EACd,MAAM,UAAU,aAAa;GAC5B,IAAI,SAAS;GACb,UAAU;GACV;GACA,MAAM,QAAQ,QAAQ,IAAI,MAAM,SAAS;GACzC,IAAI,SAAS,MAAM,MAAM,WAAW;GACpC,QAAQ,QAAQ,QAAQ;EACzB;EACA,MAAM,UAAU;GACf,WAAW,MAAM;GACjB,MAAM,MAAM;GACZ,cAAc;IACb,OAAO;KACN,MAAM;KACN,WAAW,MAAM;KACjB,UAAU;IACX,CAAC;GACF;GACA,SAAS,UAAU;IAClB,OAAO;KACN,MAAM;KACN,WAAW,MAAM;KACjB,UAAU;KACV,OAAO,EAAE,SAAS,kBAAkB,KAAK,CAAC,CAAC,QAAQ;IACpD,CAAC;GACF;EACD;EACA,QAAQ,IAAI,MAAM,WAAW,EAAE,QAAQ,QAAQ,OAAO,CAAC;EACvD;EACA,IAAI,QAAQ;GACX,QAAQ,uBAAuB,IAAI,MAAM,uDAAuD,CAAC;GACjG;EACD;EACA,MAAM,SAAS,QAAQ,MAAM;EAC7B,IAAI,UAAU,MAAM,OAAO;GAC1B,MAAM;GACN,OAAO;EACR,CAAC;OACI,SAAS,KAAK,OAAO;CAC3B;CACA,MAAM,SAAS,UAAU;EACxB,IAAI,QAAQ;EACZ,SAAS;EACT,MAAM,SAAS,yBAAyB,IAAI,MAAM,0DAA0D;EAC5G,KAAK,MAAM,SAAS,QAAQ,OAAO,GAAG,IAAI,MAAM,YAAY,MAAM,MAAM,OAAO,MAAM;EACrF,SAAS,SAAS;EAClB,OAAO,QAAQ,SAAS,GAAG,QAAQ,MAAM,CAAC,CAAC;GAC1C,MAAM;GACN,OAAO,KAAK;EACb,CAAC;CACF;CACA,OAAO;EACN,IAAI,eAAe;GAClB,OAAO;EACR;EACA;EACA;EACA,CAAC,OAAO,iBAAiB;GACxB,OAAO,EAAE,YAAY;IACpB,MAAM,UAAU,SAAS,MAAM;IAC/B,IAAI,WAAW,MAAM,OAAO,QAAQ,QAAQ;KAC3C,MAAM;KACN,OAAO;IACR,CAAC;IACD,IAAI,QAAQ,OAAO,QAAQ,QAAQ;KAClC,MAAM;KACN,OAAO,KAAK;IACb,CAAC;IACD,OAAO,IAAI,SAAS,YAAY;KAC/B,QAAQ,KAAK,OAAO;IACrB,CAAC;GACF,EAAE;EACH;CACD;AACD;AACA,SAAS,aAAa,OAAO;CAC5B,IAAI,CAAC,OAAO,OAAO,KAAK;CACxB,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;CACxE,OAAO,MAAM,SAAS,IAAI,QAAQ,KAAK;AACxC;AACA,MAAM,6BAA6B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;AACD,CAAC;AACD,MAAM,UAAU;AAChB,eAAe,UAAU,SAAS;CACjC,MAAM,EAAE,YAAY,gBAAgB,SAAS,QAAQ,cAAc;CACnE,MAAM,kBAAkB,QAAQ,uBAAuB;CACvD,MAAM,gBAAgB,QAAQ,SAAS,IAAI,wBAAwB;CACnE,MAAM,eAAe,QAAQ,QAAQ,SAAS,IAAI,kBAAkB,KAAK,EAAE;CAC3E,MAAM,iBAAiB,GAAG,eAAe;CACzC,MAAM,kBAAkB,GAAG,eAAe;CAC1C,MAAM,uBAAuB,GAAG,eAAe;CAC/C,MAAM,eAAe,GAAG,eAAe;CACvC,IAAI;EACH,MAAM,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;CAChD,QAAQ,CAAC;CACT,IAAI,mBAAmB;CACvB,IAAI,mBAAmB;CACvB,IAAI;CACJ,IAAI,cAAc;CAClB,IAAI;CACJ,IAAI;;;;;;CAMJ,IAAI;CACJ,IAAI;CACJ,IAAI,0BAA0B;CAC9B,MAAM,kBAAkB,WAAW,KAAK,IAAI,iBAAiB,GAAA,CAAI,YAAY,CAAC;CAC9E,IAAI,aAAa;CACjB,IAAI,WAAW,CAAC;CAChB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,MAAM,oBAAoB,YAAY;EACrC,OAAO,WAAW,SAAS,GAAG;GAC7B,MAAM,MAAM;GACZ,aAAa;GACb,MAAM,WAAW,cAAc,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;EACnD;CACD;CACA,MAAM,2BAA2B;EAChC,IAAI,cAAc;EAClB,eAAe,IAAI,SAAS,YAAY;GACvC,mBAAmB;IAClB,kBAAkB,CAAC,CAAC,QAAQ,OAAO;GACpC,CAAC;EACF,CAAC,CAAC,CAAC,cAAc;GAChB,eAAe;GACf,IAAI,WAAW,SAAS,GAAG,mBAAmB;EAC/C,CAAC;CACF;CACA,MAAM,2BAA2B,YAAY;EAC5C,IAAI,WAAW,SAAS,KAAK,CAAC,cAAc,mBAAmB;EAC/D,IAAI,WAAW;EACf,OAAO,UAAU;GAChB,MAAM;GACN,WAAW;EACZ;CACD;CACA,IAAI,IAAI,4BAA4B,OAAO,WAAW,YAAY,GAAG,IAAI;EACxE,WAAW,aAAa,cAAc,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,UAAU;GACnH,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC;GACtB;EACD,EAAE;EACF,aAAa,SAAS,GAAG,EAAE,CAAC,EAAE,OAAO;CACtC,QAAQ;EACP,WAAW,CAAC;EACZ,aAAa;CACd;CACA,MAAM,qCAAqC,IAAI,IAAI;CACnD,MAAM,sBAAsB,CAAC;CAC7B,MAAM,uCAAuC,IAAI,IAAI;CACrD,MAAM,kBAAkB,OAAO,UAAU;EACxC,IAAI;GACH,MAAM,UAAU,gBAAgB,KAAK,UAAU;IAC9C,MAAM;IACN,MAAM;IACN;IACA;GACD,CAAC,CAAC;EACH,QAAQ,CAAC;CACV;CACA,MAAM,mBAAmB,OAAO,UAAU;EACzC,IAAI;GACH,MAAM,aAAa,KAAK,UAAU,KAAK;GACvC,MAAM,UAAU,iBAAiB,UAAU;GAC3C,IAAI,CAAC,WAAW,oBAAoB,GAAG,MAAM,UAAU,sBAAsB,UAAU;EACxF,QAAQ,CAAC;CACV;CACA,MAAM,QAAQ,UAAU;EACvB,MAAM,MAAM,EAAE;EACd,MAAM,OAAO,KAAK,UAAU;GAC3B,GAAG;GACH;EACD,CAAC;EACD,SAAS,KAAK;GACb;GACA;EACD,CAAC;EACD,cAAc,GAAG,KAAK;EACtB,mBAAmB;EACnB,IAAI,cAAc,eAAe,SAAS,IAAI;GAC7C,aAAa,KAAK,IAAI;EACvB,QAAQ,CAAC;CACV;CACA,MAAM,UAAU,IAAI,aAAa;EAChC,KAAK,MAAM,SAAS,UAAU,IAAI,MAAM,MAAM,YAAY,GAAG,eAAe,SAAS,GAAG,KAAK,MAAM,IAAI;CACxG;CACA,MAAM,wBAAwB,OAAO,cAAc;EAClD,IAAI,CAAC,aAAa,SAAS,OAAO;EAClC,MAAM,YAAY,YAAY,SAAS;EACvC,IAAI,mBAAmB,SAAS,mBAAmB,YAAY,OAAO;EACtE,OAAO,iBAAiB,YAAY,YAAY,SAAS;CAC1D;CACA,MAAM,iBAAiB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;CAC/D,MAAM,iBAAiB,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM;CAC/D,MAAM,sBAAsB,UAAU;EACrC,IAAI;GACH,MAAM,YAAY,kBAAkB,MAAM,KAAK;GAC/C,eAAe,YAAY,WAAW,UAAU,MAAM,QAAQ,IAAI,UAAU,QAAQ,GAAG;GACvF,IAAI,UAAU,OAAO,eAAe,GAAG,UAAU,MAAM,GAAG;EAC3D,QAAQ,CAAC;CACV;CACA,MAAM,eAAe,UAAU;EAC9B,IAAI;GACH,KAAK,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,eAAe,YAAY,WAAW,SAAS,KAAK,GAAG;EAClI,QAAQ,CAAC;CACV;CACA,MAAM,aAAa,UAAU;EAC5B,mBAAmB;GAClB,SAAS,MAAM,WAAW;GAC1B,OAAO,MAAM;EACd,CAAC;EACD,KAAK;GACJ,MAAM;GACN,OAAO,eAAe,MAAM,KAAK;EAClC,CAAC;CACF;CACA,MAAM,8BAA8B;EACnC,IAAI,yBAAyB;EAC7B,0BAA0B;EAC1B,MAAM,UAAU;GACf,QAAQ;GACR,QAAQ;EACT;EACA,MAAM,SAAS,QAAQ,SAAS,OAAO,UAAU,OAAO;GACvD,IAAI,aAAa,SAAS,IAAI;IAC7B,MAAM,MAAM,OAAO,aAAa,WAAW,WAAW;IACtD,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG;IAChF,MAAM,SAAS,QAAQ,UAAU,KAAK,QAAQ,SAAS,IAAI,EAAA,CAAG,MAAM,IAAI;IACxE,QAAQ,UAAU,MAAM,IAAI,KAAK;IACjC,KAAK,MAAM,QAAQ,OAAO;KACzB,MAAM,UAAU,KAAK,QAAQ,QAAQ,EAAE;KACvC,IAAI,SAAS,KAAK;MACjB,MAAM;MACN,QAAQ;MACR;MACA,MAAM;KACP,CAAC;IACF;GACD,QAAQ,CAAC;GACT,OAAO,IAAI,OAAO,UAAU,EAAE;EAC/B;EACA,QAAQ,OAAO,QAAQ,MAAM,UAAU,cAAc;EACrD,QAAQ,OAAO,QAAQ,MAAM,UAAU,cAAc;CACtD;CACA,MAAM,gBAAgB,OAAO,KAAK,OAAO;EACxC,QAAQ,IAAI,MAAZ;GACC,KAAK,SAAS;IACb,SAAS;KACR,MAAM,cAAc;KACpB,IAAI,eAAe,MAAM;KACzB,WAAW,MAAM;KACjB,qBAAqB,sBAAsB,IAAI,MAAM,6CAA6C,CAAC;KACnG,IAAI;KACJ,MAAM,UAAU,MAAM,QAAQ,KAAK,CAAC,YAAY,WAAW,IAAI,GAAG,IAAI,SAAS,YAAY;MAC1F,aAAa,iBAAiB,QAAQ,KAAK,GAAG,eAAe;MAC7D,WAAW,QAAQ;KACpB,CAAC,CAAC,CAAC;KACH,aAAa,UAAU;KACvB,IAAI,CAAC,SAAS;IACf;IACA,IAAI;IACJ,MAAM,WAAW,IAAI,SAAS,YAAY,eAAe,OAAO;IAChE,aAAa;IACb,eAAe;IACf,MAAM,YAAY;IAClB,cAAc;IACd,WAAW,CAAC;IACZ,aAAa;IACb,UAAU,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1C,YAAY,IAAI,gBAAgB;IAChC,mBAAmB;IACnB,iBAAiB,GAAG;IACpB,gBAAgB,SAAS;IACzB,MAAM,aAAa,IAAI;IACvB,cAAc;KACb,SAAS,YAAY,WAAW;KAChC,OAAO,YAAY,SAAS,IAAI;KAChC,YAAY,YAAY,cAAc,aAAa,IAAI,wBAAwB;IAChF;IACA,IAAI,YAAY,SAAS,sBAAsB;IAC/C,MAAM,eAAe,6BAA6B,EAAE,SAAS,KAAK,CAAC;IACnE,MAAM,OAAO;KACZ;KACA,oBAAoB,iBAAiB;MACpC,MAAM,UAAU,OAAO,iBAAiB,WAAW,EAAE,YAAY,aAAa,IAAI;MAClF,MAAM,gBAAgB,oBAAoB,WAAW,aAAa,SAAS,eAAe,QAAQ,cAAc,QAAQ,UAAU,SAAS,MAAM,MAAM,IAAI;MAC3J,IAAI,iBAAiB,GAAG,OAAO,QAAQ,QAAQ,oBAAoB,OAAO,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;MACrG,OAAO,IAAI,SAAS,YAAY;OAC/B,mBAAmB,IAAI,QAAQ,YAAY;QAC1C;QACA,SAAS,QAAQ;OAClB,CAAC;MACF,CAAC;KACF;KACA,sBAAsB,eAAe,IAAI,SAAS,YAAY;MAC7D,qBAAqB,IAAI,YAAY,OAAO;KAC7C,CAAC;KACD,2BAA2B;KAC3B,aAAa,UAAU;KACvB;KACA,YAAY,UAAU;MACrB,MAAM,QAAQ,MAAM,SAAS;MAC7B,IAAI,CAAC,qBAAqB,OAAO,MAAM,SAAS,GAAG;MACnD,KAAK;OACJ,MAAM;OACN;OACA,WAAW,MAAM;OACjB,SAAS,MAAM;OACf,GAAG,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;OAC3C,GAAG,MAAM,UAAU,KAAK,IAAI,EAAE,OAAO,kBAAkB,MAAM,KAAK,EAAE,IAAI,CAAC;MAC1E,CAAC;KACF;KACA;KACA;IACD;IACA,sBAAsB;IACtB,IAAI;KACH,MAAM,QAAQ,KAAK,IAAI;IACxB,SAAS,KAAK;KACb,UAAU;MACT,OAAO;MACP,SAAS;KACV,CAAC;IACF,UAAU;KACT,aAAa,MAAM;KACnB,IAAI,wBAAwB,cAAc,sBAAsB,KAAK;KACrE,IAAI,eAAe,UAAU;MAC5B,aAAa,KAAK;MAClB,mBAAmB;MACnB,gBAAgB,SAAS;KAC1B;KACA,aAAa;IACd;IACA;GACD;GACA,KAAK,eAAe;IACnB,MAAM,SAAS;KACd,QAAQ,IAAI;KACZ,SAAS,IAAI;KACb,YAAY,IAAI;IACjB;IACA,MAAM,eAAe,mBAAmB,IAAI,IAAI,UAAU;IAC1D,MAAM,kBAAkB,gBAAgB,OAAO,MAAM,KAAK,mBAAmB,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,QAAQ,UAAU,MAAM,MAAM,IAAI,IAAI,KAAK;IACzJ,MAAM,UAAU,gBAAgB,kBAAkB;IAClD,MAAM,YAAY,gBAAgB,OAAO,IAAI,aAAa,kBAAkB;IAC5E,IAAI,WAAW,QAAQ,aAAa,MAAM;KACzC,mBAAmB,OAAO,SAAS;KACnC,QAAQ,QAAQ,MAAM;IACvB,OAAO,oBAAoB,KAAK;KAC/B,YAAY,IAAI;KAChB;IACD,CAAC;IACD;GACD;GACA,KAAK,0BAA0B;IAC9B,MAAM,WAAW,qBAAqB,IAAI,IAAI,UAAU;IACxD,IAAI,UAAU;KACb,qBAAqB,OAAO,IAAI,UAAU;KAC1C,SAAS;MACR,UAAU,IAAI;MACd,QAAQ,IAAI;KACb,CAAC;IACF;IACA;GACD;GACA,KAAK,gBAAgB;IACpB,MAAM,YAAY,IAAI,aAAa,WAAW;IAC9C,IAAI,uBAAuB,MAAM;KAChC,YAAY,IAAI;MACf,MAAM;MACN;MACA,UAAU;MACV,OAAO,EAAE,SAAS,0CAA0C;KAC7D,CAAC;KACD;IACD;IACA,IAAI,OAAO,cAAc;KACxB,YAAY,IAAI;MACf,MAAM;MACN;MACA,UAAU;MACV,OAAO,EAAE,SAAS,sDAAsD;KACzE,CAAC;KACD;IACD;IACA,oBAAoB,QAAQ;KAC3B;KACA,MAAM,IAAI;IACX,CAAC;IACD;GACD;GACA,KAAK;IACJ,WAAW,MAAM;IACjB;GACD,KAAK;IACJ,eAAe;IACf,OAAO,IAAI,IAAI,eAAe;IAC9B;GACD,KAAK;IACJ,mBAAmB;IACnB,gBAAgB,MAAM;IACtB,MAAM,YAAY;IAClB,cAAc,IAAI,KAAK,SAAS;IAChC;GACD,KAAK;IACJ,mBAAmB;IACnB,gBAAgB,MAAM;IACtB,YAAY,IAAI;KACf,MAAM;KACN,MAAM,MAAM,SAAS,KAAK,CAAC;IAC5B,CAAC;IACD,cAAc,IAAI,KAAK,MAAM;EAC/B;CACD;CACA,gBAAgB,MAAM;CACtB,MAAM,MAAM,IAAI,gBAAgB;EAC/B,MAAM;EACN,MAAM;CACP,CAAC;CACD,MAAM,aAAa;EAClB,IAAI,QAAQ,QAAQ;GACnB,QAAQ,OAAO;GACf;EACD;EACA,IAAI,YAAY,QAAQ,KAAK,CAAC,CAAC;EAC/B,iBAAiB,QAAQ,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM;CAC9C;CACA,MAAM,iBAAiB,IAAI,MAAM,WAAW;EAC3C,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,aAAa;GAClB,IAAI,GAAG,mBAAmB,KAAK,GAAG,eAAe,WAAW,KAAK,IAAI,IAAI,SAAS,KAAK;IACtF,yBAAyB,CAAC,CAAC,cAAc;KACxC,IAAI;MACH,GAAG,MAAM,MAAM,MAAM;KACtB,UAAU;MACT,KAAK;KACN;IACD,CAAC;IACD;GACD;GACA,WAAW,MAAM,EAAE,CAAC,CAAC,MAAM;EAC5B;EACA,KAAK;CACN;CACA,IAAI,GAAG,mBAAmB;EACzB,MAAM,OAAO,IAAI,QAAQ;EACzB,mBAAmB,OAAO,SAAS,YAAY,OAAO,KAAK,OAAO;EAClE,mBAAmB;EACnB,gBAAgB,SAAS;EACzB,OAAO,MAAM,KAAK,UAAU;GAC3B,MAAM;GACN,MAAM;EACP,CAAC,IAAI,IAAI;EACT,QAAQ,cAAc,gBAAgB;CACvC,CAAC;CACD,IAAI,GAAG,eAAe,IAAI,QAAQ;EACjC,IAAI,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB,CAAC,CAAC,aAAa,IAAI,oBAAoB,MAAM,eAAe;GACzG,GAAG,MAAM,MAAM,cAAc;GAC7B;EACD;EACA,YAAY,IAAI;GACf,MAAM;GACN,OAAO;GACP,SAAS;GACT,cAAc,EAAE,mCAAmC,KAAK;EACzD,CAAC;EACD,GAAG,GAAG,YAAY,QAAQ;GACzB,IAAI;GACJ,IAAI;IACH,MAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,MAAM;IAC7E,SAAS,KAAK,MAAM,IAAI;GACzB,SAAS,KAAK;IACb,YAAY,IAAI;KACf,MAAM;KACN,OAAO,yBAAyB,IAAI;IACrC,CAAC;IACD;GACD;GACA,cAAc,QAAQ,EAAE;EACzB,CAAC;EACD,GAAG,GAAG,eAAe;GACpB,IAAI,iBAAiB,IAAI,eAAe,KAAK;EAC9C,CAAC;EACD,GAAG,GAAG,eAAe,CAAC,CAAC;CACxB,CAAC;CACD,QAAQ,GAAG,sBAAsB,QAAQ;EACxC,UAAU;GACT,OAAO;GACP,SAAS;EACV,CAAC;CACF,CAAC;CACD,QAAQ,GAAG,uBAAuB,QAAQ;EACzC,UAAU;GACT,OAAO;GACP,SAAS;EACV,CAAC;CACF,CAAC;CACD,MAAM,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,IAAI,QAAQ,KAAK,MAAM;GAC1B,QAAQ;GACR;EACD;EACA,IAAI,KAAK,aAAa,OAAO;EAC7B,IAAI,KAAK,SAAS,MAAM;CACzB,CAAC;CACD,OAAO;EACN,MAAM;EACN,aAAa,IAAI,SAAS,YAAY;GACrC,IAAI,YAAY,QAAQ,CAAC;EAC1B,CAAC;CACF;AACD;AACA,SAAS,YAAY,QAAQ,SAAS;CACrC,IAAI,QAAQ,eAAe,SAAS,IAAI;EACvC,OAAO,KAAK,KAAK,UAAU,OAAO,CAAC;CACpC,QAAQ,CAAC;AACV;AACA,SAAS,eAAe,KAAK;CAC5B,IAAI,eAAe,OAAO,OAAO;EAChC,MAAM,IAAI;EACV,SAAS,IAAI;EACb,OAAO,IAAI;CACZ;CACA,OAAO;AACR;;;ACrjBA,SAAgB,sBACd,MACiB;CACjB,IAAI;CACJ,IAAI;CAEJ,MAAM,gBAAsB;EAC1B,IAAI,CAAC,YAAY,YAAY,KAAA,GAAW;EACxC,KAAK;GACH,MAAM;GACN,SAAS,SAAS;GAClB;GACA,GAAI,SAAS,iBAAiB,KAAA,IAC1B,EAAE,cAAc,SAAS,aAAa,IACtC,CAAC;GACL,GAAI,SAAS,gBAAgB,KAAA,IACzB,EAAE,aAAa,SAAS,YAAY,IACpC,CAAC;EACP,CAAC;EACD,WAAW,KAAA;EACX,UAAU,KAAA;CACZ;CAEA,OAAO;EACL,WAAW,MAAM;GACf,WAAW;GACX,QAAQ;EACV;EACA,UAAU,MAAM;GACd,UAAU;GACV,QAAQ;EACV;CACF;AACF;;;AC7DA,SAAgB,6BAA6B,cAI3C;CACA,OAAO;EACL,MAAM;EACN,QAAQ;EACR,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;CACjD;AACF;;;ACVA,SAAgB,qBACd,QACmB;CAOnB,OAAO,UAAU,OAAO,SAAS,IAAI,QAAQ,KAAA;AAC/C;;;ACgGA,SAAgB,+BAAuD;CACrE,OAAO;EACL,qCAAqB,IAAI,IAAI;EAC7B,6CAA6B,IAAI,IAAI;EACrC,+BAAe,IAAI,IAAI;EACvB,WAAW,KAAA;EACX,uCAAuB,IAAI,IAAI;EAC/B,2BAA2B,KAAA;EAC3B,uBAAuB,KAAA;EACvB,kBAAkB,KAAA;EAClB,sBAAsB,KAAA;EACtB,UAAU;EACV,8BAAc,IAAI,IAAI;EACtB,iCAAiB,IAAI,IAAI;EACzB,uCAAuB,IAAI,IAAI;EAC/B,4CAA4B,IAAI,IAAI;EACpC,uBAAuB,KAAA;CACzB;AACF;AAEA,MAAM,mDAAmC,IAAI,IAAI;CAAC;CAAK;CAAK;AAAG,CAAC;AAChE,MAAM,mBAAmB;AACzB,MAAM,4CAA4B,IAAI,IAAI;CACxC;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,kBAAkB,YAA6B;CAC7D,OACE,WAAW,WAAW,OAAO,KAAK,CAAC,WAAW,WAAW,gBAAgB;AAE7E;AAEA,SAAgB,sBAAsB,EACpC,OACA,MACA,aACA,mBACA,sBACA,gBAYiC;CACjC,IAAI,gBAAgB;CAEpB,QAAO,QAAO;EACZ,MAAM,OAAO,IAAI;EAKjB,IAAI,CAAC,eAAe;GAClB,MAAM,YACJ,SAAS,YACT,IAAI,YAAY,UAChB,OAAQ,IAA4B,UAAU,WACzC,IAA0B,QAC3B,KAAA;GACN,KAAK;IACH,MAAM;IACN,GAAI,YAAY,EAAE,SAAS,UAAU,IAAI,CAAC;GAC5C,CAAC;GACD,gBAAgB;EAClB;EAEA,IAAI,SAAS,YAAY,IAAI,YAAY,aAAa;GACpD,IACE,OAAO,IAAI,iBAAiB,YAC5B,iCAAiC,IAAI,IAAI,YAAY,GACrD;IACA,kBACE,QAAQ,IAAI,aAAa,IAAI,IAAI,SAAS,2BAC5C;IACA;GACF;GAEA,YAAY,EAAE,SAAS,sBAAsB,GAAG,EAAE,CAAC;GACnD;EACF;EAEA,IAAI,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,KAAK,GAClD,MAAM,wBAAwB,IAAI,MAAM,KAAK;EAG/C,IACE,SAAS,iBACT,OAAO,IAAI,UAAU,YACrB,IAAI,MAAM,KAAK,GACf;GACA,kBAAkB,IAAI,KAAK;GAC3B;EACF;EAEA,IACE,SAAS,YACT,IAAI,YAAY,kBAChB,IAAI,OAAO,WAAW,YACtB,OAAO,IAAI,MAAM,UAAU,UAC3B;GACA,kBAAkB,IAAI,MAAM,KAAK;GACjC;EACF;EAEA,IAAI,SAAS,YAAY,IAAI,YAAY,oBAAoB;GAC3D,MAAM,OAAO,IAAI;GACjB,IAAI,MACF,qBAAqB;IACnB,SAAS,KAAK;IACd,GAAI,OAAO,KAAK,eAAe,WAC3B,EAAE,cAAc,KAAK,WAAW,IAChC,CAAC;IACL,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;GACP,CAAC;GAEH;EACF;EAEA,IACE,SAAS,mBACT,SAAS,sBACR,SAAS,YACR,IAAI,WAAW,QACf,0BAA0B,IAAI,IAAI,OAAO,GAC3C;GACA,KAAK;IAAE,MAAM;IAAO,UAAU;GAAI,CAAC;GACnC;EACF;EAKA,IAAI,IAAI,sBAAsB,MAAM;GAClC,KAAK;IAAE,MAAM;IAAO,UAAU;GAAI,CAAC;GACnC;EACF;EAEA,IAAI,SAAS,gBAAgB;GAC3B,kBAAkB;IAChB,OAAO,IAAI;IACX,SAAS;IACT;IACA,MAAM;IACN;GACF,CAAC;GACD;EACF;EAEA,MAAM,iBAAiB,IAAI,SAAS;EACpC,IAAI,SAAS,eAAe,MAAM,QAAQ,cAAc,GAAG;GACzD,MAAM,QAAQ,cAAc,IAAI,SAAS,KAAK;GAC9C,MAAM,aAAuB,CAAC;GAC9B,IAAI,YAAY;GAChB,KAAK,MAAM,SAAS,gBAClB,IACE,MAAM,SAAS,cACf,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,SAAS,UACtB;IACA,WAAW,KAAK,MAAM,EAAE;IACxB,IAAI,MAAM,SAAS,oBAAoB;KACrC,MAAM,2BAA2B,IAAI,MAAM,EAAE;KAC7C;IACF;IACA,IAAI,MAAM,KAAK,WAAW,gBAAgB,GAAG;KAC3C,MAAM,sBAAsB,IAAI,MAAM,EAAE;KACxC,MAAM,aAAa,IAAI,MAAM,IAAI;MAC/B,UAAU,MAAM,KAAK,MAAM,EAAuB;MAClD,OAAO,MAAM,SAAS,CAAC;KACzB,CAAC;KACD,YAAY;KACZ;IACF;IACA,MAAM,oBAAoB,IAAI,MAAM,IAAI,MAAM,IAAI;IAClD,IAAI,MAAM,SAAS,mBAAmB;KACpC,MAAM,sBAAsB,IAAI,MAAM,EAAE;KACxC,YAAY;KACZ;IACF;IACA,MAAM,UAAU,kBAAkB,MAAM,IAAI;IAC5C,IAAI,SAAS,MAAM,sBAAsB,IAAI,MAAM,EAAE;IACrD,IAAI,MAAM,4BAA4B,IAAI,MAAM,EAAE,GAChD;IAEF,MAAM,sBAAsB,IAAI,MAAM,EAAE;IACxC,YAAY;IACZ,KAAK;KACH,MAAM;KACN,YAAY,MAAM;KAClB,UAAU,aAAa,MAAM,IAAI;KACjC,YAAY,MAAM;KAClB,OAAO,KAAK,UAAU,MAAM,SAAS,CAAC,CAAC;KACvC,kBAAkB;KAClB,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,CAAC;GACH;GAEF,IAAI,aAAa,WAAW,WAAW,GAAG;IACxC,MAAM,WAAW;IACjB,IAAI,OAAO;KACT,MAAM,4BAA4B;KAClC,uBAAuB,KAAK;IAC9B;GACF;GACA;EACF;EAEA,IAAI,SAAS,UAAU,MAAM,QAAQ,cAAc,GAAG;GAIpD,MAAM,gBAHmB,eAAe,QACtC,UAAS,MAAM,SAAS,aAGT,CAAC,CAAC,WAAW,IAAI,IAAI,kBAAkB,KAAA;GAExD,KAAK,MAAM,SAAS,gBAClB,IACE,MAAM,SAAS,iBACf,OAAO,MAAM,gBAAgB,UAC7B;IACA,IAAI,MAAM,2BAA2B,OAAO,MAAM,WAAW,GAC3D;IAEF,MAAM,cAAc,MAAM,aAAa,IAAI,MAAM,WAAW;IAC5D,IAAI,eAAe,MAAM;KACvB,MAAM,sBAAsB,mBAAmB;MAC7C;MACA,YAAY,MAAM;MAClB,UAAU;KACZ,CAAC;KACD,MAAM,aAAa,OAAO,MAAM,WAAW;KAC3C,MAAM,sBAAsB,OAAO,MAAM,WAAW;KACpD,IAAI,qBACF;KAGF,MAAM,UAAU,CAAC,CAAC,MAAM;KACxB,MAAM,SACJ,kBAAkB,KAAA,IACd,gBACA,kBAAkB;MAChB,UAAU,YAAY;MACtB,SAAS;MACT;MACA,YAAY,MAAM;KACpB,CAAC;KACP,KAAK;MACH,MAAM;MACN,YAAY,MAAM;MAClB,UAAU,YAAY;MACtB,OAAO,KAAK,UAAU,YAAY,KAAK;MAEvC,kBAAkB;KACpB,CAAC;KACD,KAAK;MACH,MAAM;MACN,YAAY,MAAM;MAClB,UAAU,YAAY;MACtB;MACA;KACF,CAAC;KACD;IACF;IACA,MAAM,4BAA4B,OAAO,MAAM,WAAW;IAC1D,MAAM,aACJ,MAAM,oBAAoB,IAAI,MAAM,WAAW,KAAK;IACtD,MAAM,oBAAoB,OAAO,MAAM,WAAW;IAClD,MAAM,WAAW,aAAa,UAAU;IACxC,MAAM,UAAU,MAAM,sBAAsB,OAAO,MAAM,WAAW;IACpE,MAAM,UAAU,CAAC,CAAC,MAAM;IACxB,MAAM,SACJ,kBAAkB,KAAA,IACd,gBACA,kBAAkB;KAChB;KACA;KACA;KACA,YAAY,MAAM;IACpB,CAAC;IACP,KAAK;KACH,MAAM;KACN,YAAY,MAAM;KAClB;KACA;KACA;KACA,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,CAAC;IACD,MAAM,sBAAsB,OAAO,MAAM,WAAW;GACtD;GAEF,iBAAiB;IAAE;IAAO;GAAK,CAAC;EAClC;CACF;AACF;AAEA,SAAS,mBAAmB,EAC1B,OACA,YACA,YAKU;CACV,IAAI,MAAM,gBAAgB,OAAO,UAAU,GACzC,OAAO;CAGT,KAAK,MAAM,CAAC,eAAe,gBAAgB,MAAM,iBAC/C,IACE,YAAY,aAAa,SAAS,YAClC,kBAAkB,YAAY,OAAO,SAAS,KAAK,GACnD;EACA,MAAM,gBAAgB,OAAO,aAAa;EAC1C,OAAO;CACT;CAGF,MAAM,yBAAyB,MAAM,KAAK,MAAM,eAAe,CAAC,CAC7D,QAAQ,GAAG,iBAAiB,YAAY,aAAa,SAAS,QAAQ,CAAC,CACvE,KAAK,CAAC,mBAAmB,aAAa;CACzC,MAAM,wBAAwB,MAAM,KAAK,MAAM,aAAa,OAAO,CAAC,CAAC,CAAC,QACpE,gBAAe,YAAY,aAAa,SAAS,QACnD,CAAC,CAAC;CAEF,IACE,uBAAuB,SAAS,KAChC,uBAAuB,WAAW,uBAClC;EACA,MAAM,gBAAgB,OAAO,uBAAuB,EAAE;EACtD,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAgB,mBAAmB,EACjC,OACA,MACA,cAKO;CACP,MAAM,WAAW;CACjB,MAAM,sBAAsB,OAAO,UAAU;CAC7C,iBAAiB;EAAE;EAAO;CAAK,CAAC;AAClC;AAEA,SAAgB,eAAe,EAC7B,OACA,MACA,SAKO;CACP,KAAK;EACH,MAAM;EACN,cAAc;GAAE,SAAS;GAAQ,KAAK;EAAO;EAC7C,OAAO,SAAS,aAAa;CAC/B,CAAC;CACD,MAAM,YAAY,SAAS,MAAM;CACjC,MAAM,4BAA4B,KAAA;CAClC,MAAM,wBAAwB,KAAA;CAC9B,MAAM,mBAAmB,KAAA;CACzB,MAAM,wCAAwB,IAAI,IAAI;CACtC,MAAM,WAAW;AACnB;AAEA,SAAS,iBAAiB,EACxB,OACA,QAIO;CACP,IACE,CAAC,MAAM,YACP,MAAM,sBAAsB,OAAO,KACnC,MAAM,cAAc,OAAO,GAE3B;CAEF,eAAe;EAAE;EAAO;EAAM,OAAO,MAAM;CAAiB,CAAC;AAC/D;AAEA,SAAS,sBAAsB,KAA4B;CACzD,MAAM,UAAoB,CAAC;CAC3B,IAAI,OAAO,IAAI,YAAY,UAAU;EACnC,MAAM,aACJ,OAAO,IAAI,gBAAgB,WAAW,IAAI,IAAI,gBAAgB;EAChE,QAAQ,KAAK,WAAW,IAAI,UAAU,YAAY;CACpD;CACA,IAAI,OAAO,IAAI,iBAAiB,UAC9B,QAAQ,KAAK,QAAQ,IAAI,cAAc;CAEzC,IAAI,OAAO,IAAI,mBAAmB,UAChC,QAAQ,KAAK,eAAe,IAAI,eAAe,GAAG;CAEpD,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,KAAK;CACrC,OAAO,QAAQ,SAAS,IACpB,0BAA0B,QAAQ,KAAK,IAAI,MAC3C;AACN;AAEA,SAAS,kBAAkB,EACzB,OACA,SACA,OACA,MACA,gBAOO;CACP,IAAI,CAAC,OAAO;CAEZ,IAAI,MAAM,SAAS,iBAAiB;EAClC,MAAM,uBAAuB,cAAc,MAAM,SAAS,KAAK;EAC/D;CACF;CAEA,IAAI,MAAM,SAAS,iBAAiB;EAClC,MAAM,QAAQ,cAAc,MAAM,KAAK;EACvC,IAAI,OAAO;GACT,MAAM,uBAAuB,kBAC3B,MAAM,sBACN,KACF;GACA,MAAM,wBAAwB,kBAC5B,MAAM,uBACN,KACF;GACA,uBAAuB,KAAK;EAC9B;EACA;CACF;CAEA,IAAI,MAAM,SAAS,gBAAgB;EACjC,KAAK;GACH,MAAM;GACN,UAAU;IACR,GAAG;IACH,OAAO,MAAM,wBAAwB,CAAC;GACxC;EACF,CAAC;EACD,MAAM,uBAAuB,KAAA;EAC7B;CACF;CAEA,IAAI,OAAO,MAAM,UAAU,UAAU;CACrC,MAAM,QAAQ,MAAM;CACpB,MAAM,gBAAgB,MAAM;CAE5B,IAAI,MAAM,SAAS,uBAAuB;EACxC,MAAM,YAAY,MAAM,eAAe;EACvC,IAAI,cAAc,QAAQ;GACxB,MAAM,KAAK,WAAW;GACtB,cAAc,IAAI,OAAO;IAAE;IAAI,MAAM;GAAO,CAAC;GAC7C,KAAK;IAAE,MAAM;IAAc;GAAG,CAAC;EACjC,OAAO,IAAI,cAAc,YAAY;GACnC,MAAM,KAAK,WAAW;GACtB,cAAc,IAAI,OAAO;IAAE;IAAI,MAAM;GAAW,CAAC;GACjD,KAAK;IAAE,MAAM;IAAmB;GAAG,CAAC;EACtC,OAAO,IACL,cAAc,cACd,OAAO,MAAM,eAAe,OAAO,YACnC,OAAO,MAAM,cAAc,SAAS,UACpC;GACA,MAAM,KAAK,MAAM,cAAc;GAC/B,MAAM,aAAa,MAAM,cAAc;GACvC,IAAI,eAAe,oBACjB;GAEF,IAAI,eAAe,mBACjB;GAEF,MAAM,eAAe,WAAW,WAAW,gBAAgB,IACvD,WAAW,MAAM,EAAuB,IACxC,KAAA;GACJ,MAAM,UAAU,kBAAkB,UAAU;GAC5C,cAAc,IAAI,OAAO;IAAE;IAAI,MAAM;GAAa,CAAC;GACnD,KAAK;IACH,MAAM;IACN;IACA,UAAU,gBAAgB,aAAa,UAAU;IACjD,kBAAkB,iBAAiB,KAAA;IACnC,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;GACrC,CAAC;EACH;EACA;CACF;CAEA,IAAI,MAAM,SAAS,uBAAuB;EACxC,MAAM,QAAQ,cAAc,IAAI,KAAK;EACrC,IAAI,CAAC,OAAO;EACZ,IACE,MAAM,SAAS,UACf,MAAM,OAAO,SAAS,gBACtB,OAAO,MAAM,MAAM,SAAS,UAE5B,KAAK;GAAE,MAAM;GAAc,IAAI,MAAM;GAAI,OAAO,MAAM,MAAM;EAAK,CAAC;OAC7D,IACL,MAAM,SAAS,cACf,MAAM,OAAO,SAAS,oBACtB,OAAO,MAAM,MAAM,aAAa,UAEhC,KAAK;GACH,MAAM;GACN,IAAI,MAAM;GACV,OAAO,MAAM,MAAM;EACrB,CAAC;OACI,IACL,MAAM,SAAS,gBACf,MAAM,OAAO,SAAS,sBACtB,OAAO,MAAM,MAAM,iBAAiB,UAEpC,KAAK;GACH,MAAM;GACN,IAAI,MAAM;GACV,OAAO,MAAM,MAAM;EACrB,CAAC;EAEH;CACF;CAEA,IAAI,MAAM,SAAS,sBAAsB;EACvC,MAAM,QAAQ,cAAc,IAAI,KAAK;EACrC,IAAI,CAAC,OAAO;EACZ,cAAc,OAAO,KAAK;EAC1B,IAAI,MAAM,SAAS,QACjB,KAAK;GAAE,MAAM;GAAY,IAAI,MAAM;EAAG,CAAC;OAClC,IAAI,MAAM,SAAS,YACxB,KAAK;GAAE,MAAM;GAAiB,IAAI,MAAM;EAAG,CAAC;OAE5C,KAAK;GAAE,MAAM;GAAkB,IAAI,MAAM;EAAG,CAAC;CAEjD;AACF;AAEA,SAAS,cAAc,OAAqD;CAC1E,OAAO,SAAS,QAAQ,OAAO,UAAU,WACpC,QACD,KAAA;AACN;AAEA,SAAS,kBACP,SACA,QACyB;CACzB,MAAM,SAAS,EAAE,GAAG,QAAQ;CAC5B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,SAAS,MACX,OAAO,OAAO;CAGlB,OAAO;AACT;AAEA,SAAS,uBAAuB,OAAqC;CACnE,MAAM,iBAAiB,MAAM;CAC7B,MAAM,aAAa,MAAM;CACzB,MAAM,mBAAmB,SACvB,kBAAkB,aACd;EAAE,GAAG;EAAgB,GAAG;CAAW,IACnC,KAAA,CACN;AACF;AAEA,SAAS,YAAY,OAA6C;CAChE,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,UAAU;AACjE;AAEA,SAAS,iBAAiB,SAA0B;CAClD,IAAI,OAAO,YAAY,UAAU,OAAO;CACxC,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO,QACJ,KAAI,UACH,YAAY,KAAK,IAAI,OAAO,MAAM,QAAQ,EAAE,IAAI,KAAK,UAAU,KAAK,CACtE,CAAC,CACA,KAAK,EAAE;CAEZ,OAAO,KAAK,UAAU,OAAO;AAC/B;AAEA,SAAS,kBAAkB,SAA2B;CACpD,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAK,UAAS,CAAC,YAAY,KAAK,CAAC;AAC5E;AAEA,SAAS,kBAAkB,EACzB,UACA,SACA,SACA,cAMU;CAUV,IAAI,aAAa,QACf,OAAO;EAAE,UAAU,UAAU,IAAI;EAAG,QAAQ,iBAAiB,UAAU;CAAE;CAI3E,IAAI,kBAAkB,UAAU,GAAG,OAAO;CAC1C,MAAM,UAAU,iBAAiB,UAAU;CAC3C,OAAO,UAAU,mBAAmB,OAAO,IAAI;AACjD;AAEA,SAAS,mBAAmB,SAA0B;CACpD,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,OAAO;EAEjC,OAAO,WAAW,QAAQ,OAAO,WAAW,WAAW,SAAS;CAClE,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,SAAS,OAAqD;CAC5E,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,KAAA;CAChD,MAAM,IAAI;CAMV,OAAO;EACL,aAAa;GACX,QACG,EAAE,gBAAgB,MAClB,EAAE,+BAA+B,MACjC,EAAE,2BAA2B;GAChC,SAAS,EAAE,gBAAgB;GAC3B,WAAW,EAAE,2BAA2B;GACxC,YAAY,EAAE,+BAA+B;EAC/C;EACA,cAAc;GACZ,OAAO,EAAE,iBAAiB;GAC1B,MAAM,EAAE,iBAAiB;EAC3B;CACF;AACF;AAEA,SAAgB,eAAwC;CACtD,OAAO;EACL,aAAa;GAAE,OAAO;GAAG,SAAS;GAAG,WAAW;GAAG,YAAY;EAAE;EACjE,cAAc;GAAE,OAAO;GAAG,MAAM;EAAE;CACpC;AACF;;;AC3vBA,SAAgB,sBAAsB,OAAgB;CAEpD,OAAO,YADQ,mBAAmB,KAAK,IAAI,QAAQ,CAAC,CAC3B;AAC3B;AAEA,SAAS,YAAY,QAA0B;CAC7C,MAAM,SAAS,EAAE,OAAO,WAAW,MAAM,CAAC;CAC1C,IAAI,OAAO,yBAAyB,OAAO,OAAO,OAAO,OAAO;CAGhE,OAAO,OAAO,SACZ,mBAAmB,OAAO,oBAAoB,IAC1C,UAAU,OAAO,oBAAoB,IACrC,EAAE,QAAQ,CAChB;AACF;AAEA,SAAS,WAAW,QAAgD;CAClE,IAAI,CAAC,QAAQ,YAAY,OAAO,CAAC;CACjC,MAAM,WAAW,IAAI,IAAI,OAAO,QAAQ;CACxC,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,OAAO,UAAU,GAAG;EACjE,MAAM,WAAW,UAAU,UAAU;EACrC,IAAI,eAAe,SAAS,IAAI,GAAG,IAAI,WAAW,SAAS,SAAS;EACpE,IAAI,WAAW,aACb,eAAe,aAAa,SAAS,WAAW,WAAW;EAE7D,MAAM,OAAO;CACf;CACA,OAAO;AACT;AAEA,SAAS,UAAU,QAAoD;CACrE,IAAI,CAAC,QAAQ,OAAO,EAAE,IAAI;CAE1B,IAAI,QACF,YAAY,MAAM,KAClB,WAAW,MAAM,KACjB,YAAY,MAAM,KAClB,WAAW,MAAM;CAEnB,IAAI,WAAW,MAAM,GAAG,QAAQ,MAAM,SAAS;CAC/C,IAAI,OAAO,aAAa,QAAQ,MAAM,SAAS,OAAO,WAAW;CACjE,OAAO;AACT;AAEA,SAAS,WAAW,QAAwC;CAC1D,MAAM,QAAQ,gBAAgB,MAAM;CACpC,IAAI,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI;CACnC,IAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK;CAGpE,QAFa,MAAM,OAAO,OAAO,aAAa,WAAW,KAAA,IAEzD;EACE,KAAK,UACH,OAAO,EAAE,OAAO;EAClB,KAAK,UACH,OAAO,EAAE,OAAO;EAClB,KAAK,WACH,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI;EACxB,KAAK,WACH,OAAO,EAAE,QAAQ;EACnB,KAAK,SACH,OAAO,EAAE,MACP,MAAM,QAAQ,OAAO,KAAK,IAAI,EAAE,IAAI,IAAI,UAAU,OAAO,KAAK,CAChE;EACF,KAAK,UACH,OAAO,YAAY,MAAM;EAC3B,KAAK,QACH,OAAO,EAAE,KAAK;EAChB,SACE,OAAO,EAAE,IAAI;CACjB;AACF;AAEA,SAAS,YAAY,QAAoD;CACvE,IAAI,EAAE,WAAW,SAAS,OAAO,KAAA;CACjC,OAAO,cAAc,OAAO,KAAK,IAAI,EAAE,QAAQ,OAAO,KAAK,IAAI,EAAE,IAAI;AACvE;AAEA,SAAS,WAAW,QAAoD;CACtE,IAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,KAAA;CACxC,IAAI,CAAC,OAAO,KAAK,MAAM,aAAa,GAAG,OAAO,EAAE,IAAI;CACpD,OAAO,eAAe,OAAO,IAAI;AACnC;AAEA,SAAS,YAAY,QAAoD;CACvE,MAAM,eAAe,OAAO,SAAS,OAAO;CAC5C,IAAI,CAAC,gBAAgB,aAAa,SAAS,GAAG,OAAO,KAAA;CAErD,MAAM,UAAU,aAAa,KAAI,SAAQ,UAAU,IAAI,CAAC;CAKxD,OAAO,EAAE,MAAM,OAAO;AACxB;AAEA,SAAS,eAAe,QAAqC;CAC3D,IAAI,OAAO,WAAW,GAAG,OAAO,EAAE,IAAI;CACtC,IAAI,OAAO,WAAW,GAAG,OAAO,EAAE,QAAQ,OAAO,EAAE;CAEnD,MAAM,WAAW,OAAO,KAAI,UAAS,EAAE,QAAQ,KAAK,CAAC;CAKrD,OAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,SAAS,gBAAgB,QAAoC;CAC3D,OAAO,MAAM,QAAQ,OAAO,IAAI,IAC5B,OAAO,KAAK,QAAO,SAAQ,SAAS,MAAM,IACzC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,OAAO;AACnC;AAEA,SAAS,WAAW,QAAmC;CACrD,OACE,OAAO,aAAa,QACnB,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,MAAM;AAE9D;AAEA,SAAS,mBAAmB,OAA2C;CACrE,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAEA,SAAS,cAAc,OAAsC;CAC3D,OACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,aAChB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAEvD;;;ACrJA,MAAM,mBAAqD;CACzD,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,WAAW;CACX,UAAU;CACV,cAAc;CACd,WAAW;CACX,OAAO;CACP,YAAY;CACZ,SAAS;CACT,YAAY;CACZ,UAAU;CACV,UAAU;CACV,YAAY;CACZ,SAAS;CACT,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,cAAc;CACd,kBAAkB;CAClB,OAAO;CACP,YAAY;AACd;AAEA,MAAM,oBAAoB,OAAO,KAAK,gBAAgB;AAEtD,SAAS,aAAa,UAA0B;CAC9C,OAAO,iBAAiB,aAAa;AACvC;AAEA,SAAgB,mBACd,eACsB;CACtB,IAAI,iBAAiB,QAAQ,cAAc,SAAS,QAAQ,OAAO,KAAA;CACnE,OAAO,cAAc,UAAU,KAAI,SAAQ,aAAa,IAAI,CAAC;AAC/D;AAEA,SAAgB,2BACd,eACU;CACV,IAAI,iBAAiB,MAAM,OAAO,CAAC;CAOnC,QALE,cAAc,SAAS,UACnB,kBAAkB,QAChB,SAAQ,CAAC,cAAc,UAAU,SAAS,IAAI,CAChD,IACA,cAAc,UAAA,CACK,KAAI,SAAQ,aAAa,IAAI,CAAC;AACzD;;;ACjDA,SAAgB,sBACd,aACQ;CACR,OAAO,KAAK,UAAU,YAAY,SAAS;AAC7C;AAEA,SAAgB,wBACd,aAC6B;CAC7B,OAAO;EACL,qBAAqB;EACrB,WAAW,YAAY,UAAU,KAAK,UAAU,mBAAmB;GACjE,IAAI,YAAY,gBAAgB;GAChC,UAAU,SAAS;GACnB,QAAQ,SAAS;GACjB,SAAS,SAAS,QAAQ,KAAK,QAAQ,iBAAiB;IACtD,IAAI,UAAU,cAAc;IAC5B,OAAO,OAAO;IACd,aAAa,OAAO;IACpB,GAAI,OAAO,YAAY,KAAA,IAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;GACpE,EAAE;GACF,eAAe,SAAS;GACxB,eAAe;EACjB,EAAE;CACJ;AACF;AAEA,SAAgB,2BAA2B,OAQD;CACxC,MAAM,SAAS,MAAM;CACrB,IAAI,OAAO,WAAW,cAAc,OAAO,WAAW,aACpD,OAAO;EACL,UAAU;EACV,SAAS,YAAY,OAAO,OAAO;CACrC;CAGF,MAAM,iBAAiB,wBAAwB,MAAM,WAAW;CAChE,MAAM,UAAU,OAAO,YACrB,eAAe,UAAU,SAAS,UAAU,kBAAkB;EAC5D,MAAM,SAAS,OAAO,QAAQ,SAAS;EACvC,IAAI,UAAU,MAAM,OAAO,CAAC;EAC5B,MAAM,iBAAiB,MAAM,YAAY,UAAU;EACnD,OAAO,CACL,CACE,eAAe,UACf,mBAAmB;GACjB;GACA,WAAW,OAAO;GAClB,UAAU,OAAO;EACnB,CAAC,CACH,CACF;CACF,CAAC,CACH;CAEA,OAAO;EACL,UAAU;EACV,cAAc;GAAE,GAAG,MAAM;GAAa;EAAQ;CAChD;AACF;AAEA,SAAS,mBAAmB,OAIjB;CACT,IAAI,MAAM,aAAa,KAAA,GAAW,OAAO,MAAM;CAC/C,MAAM,SAAS,MAAM,UAAU,SAAQ,aAAY;EACjD,MAAM,QAAQ,kBAAkB;GAAE,IAAI;GAAU,QAAQ;EAAU,CAAC;EACnE,MAAM,SACJ,SAAS,OAAO,KAAA,IAAY,MAAM,eAAe,QAAQ;EAC3D,OAAO,UAAU,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK;CAC5C,CAAC;CACD,OAAO,MAAM,eAAe,cACxB,OAAO,KAAK,IAAI,IACf,OAAO,MAAM;AACpB;AAEA,SAAS,kBAAkB,OAGJ;CACrB,IAAI,CAAC,MAAM,GAAG,WAAW,MAAM,MAAM,GAAG,OAAO,KAAA;CAC/C,MAAM,gBAAgB,OAAO,MAAM,GAAG,MAAM,MAAM,OAAO,MAAM,CAAC;CAChE,OAAO,OAAO,UAAU,aAAa,KAAK,gBAAgB,IACtD,gBAAgB,IAChB,KAAA;AACN;;;ACxBA,MAAM,mBAAoE;CACxE,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,WAAW;CACX,iBAAiB;AACnB;AAEA,MAAM,oBAEF;CACF,MAAM;CACN,MAAM;CACN,MAAM;CACN,WAAW;CACX,UAAU;CACV,SAAS;CACT,UAAU;CACV,YAAY;CACZ,kBAAkB;CAClB,iBAAiB;CACjB,OAAO;CACP,MAAM;CACN,cAAc;CACd,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,eAAe;CACf,cAAc;CACd,cAAc;CACd,OAAO;CACP,iBAAiB;CACjB,YAAY;CACZ,MAAM;CACN,SAAS;AACX;AAEA,SAAS,aAAa,YAAoD;CACxE,OAAO,iBAAiB,eAAe;AACzC;AAEA,MAAM,OAAO,UAAU,KAAK,MAAM,CAAC,CAAC;AACpC,MAAM,UAAU,KAAK;AACrB,MAAM,iBAAiB,KAAK;AAC5B,IAAI,CAAC,SACH,UAAU,6BAA6B;AAEzC,IAAI,CAAC,gBACH,UAAU,sCAAsC;AAIlD,MAAM,YAAY;AAElB,MAAM,YAAY;;;;;;;AAQlB,IAAI;AAEJ,MAAM,UAAwB;CAC5B,YAAY;CACZ;CACA,SAAS;CAIT,cACE,uBAAuB,OAAO,CAAC,IAAI,EAAE,iBAAiB,oBAAoB;AAC9E,CAAC;AAID,SAAS,wBAAwB,OAQL;CAC1B,MAAM,iBAAiB,MAAM,MAAM,kBAAkB;CACrD,MAAM,sBAAsB,IAAI,IAAI,MAAM,mBAAmB;CAC7D,MAAM,qBAAqB,yBAAyB;EAClD;EACA;CACF,CAAC;CAED,MAAM,cAAc;EAClB,gBACE,mBAAmB,cACf,sBACA,mBAAmB,gBACjB,gBACA;EACR,iCAAiC,mBAAmB;EACpD,GAAI,qBAAqB,EAAE,UAAU,mBAAmB,IAAI,CAAC;CAC/D;CAEA,IAAI,mBAAmB,aACrB,OAAO;EACL,GAAG;EAOH,0BAA0B;CAC5B;CAGF,OAAO;EACL,GAAG;EACH,YAAY,OACV,UACA,WACA,YACG;GACH,IAAI,SAAS,WAAW,sBAAsB,GAC5C,OAAO;IAAE,UAAU;IAAS,cAAc;GAAU;GAEtD,IACE,CAAC,oBAAoB,IAAI,QAAQ,KACjC,CAAC,2BAA2B;IAC1B,YAAY;IACZ;GACF,CAAC,GAED,OAAO;IAAE,UAAU;IAAS,cAAc;GAAU;GAGtD,MAAM,aAAa,QAAQ;GAC3B,MAAM,4BAA4B,IAAI,UAAU;GAChD,MAAM,oBAAoB,IAAI,YAAY,QAAQ;GAClD,MAAM,KAAK;IACT,MAAM;IACN,YAAY;IACZ,UAAU,aAAa,QAAQ;IAC/B,YAAY;IACZ,OAAO,KAAK,UAAU,aAAa,CAAC,CAAC;IACrC,kBAAkB;IAClB,GAAI,kBAAkB,QAAQ,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;GACzD,CAAC;GACD,MAAM,KAAK;IACT,MAAM;IACN;IACA,YAAY;GACd,CAAC;GACD,MAAM,mBAAmB,UAAU;GAEnC,MAAM,WAAW,MAAM,MAAM,KAAK,oBAAoB,UAAU;GAChE,OAAO,SAAS,WACZ;IAAE,UAAU;IAAS,cAAc;IAAW,WAAW;GAAW,IACpE;IACE,UAAU;IACV,SAAS,SAAS,UAAU;IAC5B,WAAW;GACb;EACN;CACF;AACF;AAEA,SAAS,6BAA6B,OAIrB;CACf,OAAO,OAAO,WAAW,cAAuC;EAC9D,IACE,UAAU,oBAAoB,gBAC9B,UAAU,cAAc,mBAExB,OAAO,CAAC;EAGV,MAAM,cAAc,UAAU;EAG9B,MAAM,iBAAiB,wBAAwB,WAAW;EAC1D,MAAM,aAAa,aAAa,UAAU;EAC1C,MAAM,oBAAoB,IAAI,YAAY,UAAU,SAAS;EAC7D,MAAM,KAAK;GACT,MAAM;GACN;GACA,UAAU;GACV,YAAY,UAAU;GACtB,OAAO,KAAK,UAAU,cAAc;GACpC,kBAAkB;GAClB,kBAAkB,EAChB,eAAe,EACb,eAAe,YACjB,EACF;EACF,CAAC;EAED,MAAM,cAAc,sBAAsB,WAAW;EAerD,MAAM,eAAe,2BAA2B;GAC9C;GACA,SAAQ,MAhBW,MAAM,KAAK,kBAAkB;IAChD;IACA,UAAS,cAAa;KACpB,MAAM,gBAAgB,UAAU,YAAY,kBAC1C,cACD,EAAE;KAGH,OACE,iBAAiB,QACjB,sBAAsB,aAAa,MAAM;IAE7C;GACF,CAAC,EAGS,CAAO;EAGjB,CAAC;EAED,OAAO,EACL,oBAAoB;GAClB,eAAe;GACf,GAAI,aAAa,aAAa,UAC1B;IACE,oBAAoB;IACpB,cAAc,EACZ,GAAG,aAAa,aAClB;GACF,IACA;IACE,oBAAoB;IACpB,0BAA0B,aAAa;GACzC;EACN,EACF;CACF;AACF;AAEA,SAAS,yBAAyB,OAGM;CACtC,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,CAAC,YAAY,SAAS,OAAO,QAAQ,iBAAiB,GAC/D,IACE,MAAM,oBAAoB,IAAI,UAAU,MACvC,MAAM,mBAAmB,gBACtB,SAAS,UAAU,SAAS,SAC5B,MAAM,mBAAmB,gBACvB,SAAS,SACT,QAEN,SAAS,IAAI,GAAG,WAAW,IAAI;CAInC,IAAI,SAAS,SAAS,GAAG,OAAO,KAAA;CAEhC,OAAO;EACL,aAAa,EAAE,KAAK,CAAC,GAAG,QAAQ,EAAE;EAClC,SAAS,EAAE,0BAA0B,MAAM;CAC7C;AACF;AAEA,SAAS,2BAA2B,OAGxB;CACV,IAAI,MAAM,mBAAmB,aAAa,OAAO;CACjD,MAAM,OAAO,kBAAkB,MAAM,eAAe;CACpD,IAAI,MAAM,mBAAmB,eAAe,OAAO,SAAS;CAC5D,OAAO,SAAS,UAAU,SAAS;AACrC;AAEA,eAAe,QAAQ,OAAqB,MAAiC;CAC3E,MAAM,QAAa,QAAO,KAAK,KAAK,GAAkB;CAItD,MAAM,WAAW,IAAI,gBAAgB;CASrC,IAAI;CACJ,IAAI;CACJ,MAAM,oBAA0B;EAC9B,IAAI,eACF,cAAc;OAEd,SAAS,MAAM;CAEnB;CACA,IAAI,KAAK,YAAY,SACnB,SAAS,MAAM;MAEf,KAAK,YAAY,iBAAiB,SAAS,aAAa,EAAE,MAAM,KAAK,CAAC;CAGxE,MAAM,mBAAmB,6BAA6B;CAEtD,MAAM,aAAsC,EAAE,GAAG,MAAM,WAAW;CAClE,IAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;EACzC,MAAM,SAAS,IAAI,UAAU,UAAU;GACrC,MAAM;GACN,SAAS;EACX,CAAC;EACD,KAAK,MAAM,QAAQ,MAAM,OACvB,OAAO,aACL,KAAK,MACL;GACE,aAAa,KAAK,eAAe;GACjC,aAAa,sBAAsB,KAAK,WAAW;EACrD,GACA,OACE,GAAG,gBAIA;GACH,MAAM,CAAC,OAAO,SAAS;GACvB,MAAM,qBAAqB,MAAM,QAAQ;GACzC,MAAM,aACJ,OAAO,uBAAuB,WAC1B,qBACA,WAAW;GACjB,iBAAiB,gBAAgB,IAAI,YAAY;IAC/C,UAAU,KAAK;IACf;GACF,CAAC;GACD,KAAK;IACH,MAAM;IACN;IACA,UAAU,KAAK;IACf,OAAO,KAAK,UAAU,KAAK;IAC3B,kBAAkB;GACpB,CAAC;GACD,MAAM,EAAE,QAAQ,YAAY,MAAM,KAAK,kBAAkB,UAAU;GACnE,KAAK;IACH,MAAM;IACN;IACA,UAAU,KAAK;IACf,QAAQ,UAAU;IAClB,SAAS,CAAC,CAAC;GACb,CAAC;GACD,OAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM,KAAK,UAAU,UAAU,IAAI;IAAE,CAAC;IAChE;GACF;EACF,CACF;EAEF,WAAW,mBAAmB;GAC5B,MAAM;GACN,MAAM;GACN,UAAU;EACZ;CACF;CAKA,MAAM,aAAa,uBAAsB,UAAS;EAChD,MAAM,cAAc,iBAAiB;EACrC,KAAK,KAAK;EAIV,IAAI,CAAC,aACH,eAAe;GACb,OAAO;GACP;GACA,OAAO,KAAA;EACT,CAAC;CAEL,CAAC;CAKD,MAAM,aAAa,iBAAiB;EAClC,oBAAoB,MAAM;EAC1B,cAAc,KAAK;EACnB,aAAa,SAAS;CACxB,CAAC;CACD,MAAM,eAAe,qBAAqB,MAAM,MAAM;CACtD,MAAM,cAAc,mBAAmB,MAAM,oBAAoB;CACjE,MAAM,sBAAsB,2BAC1B,MAAM,oBACR;CACA,MAAM,oBAAoB,wBAAwB;EAChD;EACA;EACA;EACA;EACA,qBAAoB,eAAc;GAChC,mBAAmB;IAAE,OAAO;IAAkB;IAAM;GAAW,CAAC;EAClE;EACA,qBAAqB,iBAAiB;EACtC,6BAA6B,iBAAiB;CAChD,CAAC;CACD,MAAM,yBAAyB,6BAA6B;EAC1D;EACA;EACA,qBAAqB,iBAAiB;CACxC,CAAC;CAED,MAAM,IAAI,UAAU,MAAM;EACxB,QAAQ,WAAW;EACnB,SAAS;GACP,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;GAC5C,GAAI,MAAM,aAAa,KAAA,IAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;GACnE,GAAI,MAAM,2BAA2B,KAAA,IACjC,EAAE,wBAAwB,MAAM,uBAAuB,IACvD,CAAC;GACL,GAAI,MAAM,wBAAwB,KAAA,IAC9B,EAAE,qBAAqB,MAAM,oBAAoB,IACjD,CAAC;GACL,GAAI,MAAM,QAAQ,KAAA,IAAY,EAAE,KAAK;IAAE,GAAGA;IAAS,GAAG,MAAM;GAAI,EAAE,IAAI,CAAC;GACvE,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;GAC/C,GAAI,gBAAgB,KAAA,IAAY,EAAE,OAAO,YAAY,IAAI,CAAC;GAC1D,GAAI,oBAAoB,SAAS,IAC7B,EAAE,iBAAiB,oBAAoB,IACvC,CAAC;GACL,cAAc,6BAA6B,MAAM,YAAY;GAC7D,UAAU,MAAM;GAChB,GAAI,MAAM,WAAW,KAAA,IAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;GAC7D,GAAI,MAAM,gBAAgB,SAAS,UACnC,MAAM,eAAe,UAAU,OAC3B,EACE,cAAc;IACZ,MAAM;IACN,QAAQ,MAAM,eAAe;GAC/B,EACF,IACA,CAAC;GACL,wBAAwB;GAIxB,OAAO;IACL,YAAY,CACV;KACE,SAAS;KACT,OAAO,CAAC,sBAAsB;IAChC,CACF;IACA,aAAa,CACX,EACE,OAAO,CACL,OAAO,UAAyC;KAC9C,IAAI,OAAO,OAAO,oBAAoB,UACpC,WAAW,UAAU,MAAM,eAAe;KAE5C,OAAO,CAAC;IACV,CACF,EACF,CACF;GACF;GAcA,GAAK,MAAM,mBAAmB,sBAC1B,EAAE,QAAQ,MAAM,mBAAmB,oBAAoB,IACvD,MAAM,aAAa,QAAQ,CAAC,KAAK,YAC/B,EAAE,UAAU,KAAK,IACjB,CAAC;GACP,GAAG;GACH;GACA,KAAK;GACL,aAAa,SAAS;EACxB;CACF,CAAC;CAED,sBAAsB;EAMpB,iBAAiB,iBAAiB,SAAS,MAAM,GAAG,GAAI;EACxD,eAAe,QAAQ;EACvB,QAAa,QAAQ,CAAC,CACnB,WAAW,EAAE,UAAU,CAAC,CAAC,CACzB,YAAY,SAAS,MAAM,CAAC;CACjC;CACA,IAAI;CACJ,IAAI;CACJ,IAAI,uBAAuB;CAC3B,IAAI,wBAAwB;CAE5B,MAAM,qBAAqB,YAAsC;EAC/D,MAAM,aAAa,SAAS,KAAK;EACjC,IAAI,CAAC,cAAc,wBAAwB,uBAAuB;EAClE,iBAAiB,wBAAwB;EACzC,uBAAuB;EAMvB,IAAI,CAAC,KAAK,YAAY,SACpB,KAAK,UAAU;GACb,OAAO;GACP,SAAS;EACX,CAAC;EAEH,WAAW,MAAM;EACjB,SAAS,MAAM;CACjB;CAEA,MAAM,kBAAkB,sBAAsB;EAC5C,OAAO;EACP;EACA,aAAa,KAAK;EAClB;EACA,uBAAsB,aAAY,WAAW,WAAW,QAAQ;EAChE;CACF,CAAC;CAED,IAAI;EACF,WAAW,MAAM,OAAO,GAAmC;GACzD,IAAI,SAAS,OAAO,SAAS;GAE7B,MAAM,OAAO,IAAI;GAEjB,IAAI,SAAS,qBACX,WAAW,gBAAgB,GAAG;GAMhC,MAAM,YAAa,IAAiC;GACpD,IAAI,OAAO,cAAc,YAAY,UAAU,SAAS,GACtD,sBAAsB;GAGxB,gBAAgB,GAAG;GAEnB,IAAI,SAAS,UAAU;IACrB,IAAI,IAAI,YAAY,WAAW;KAI7B,IAAI,IAAI,UAAU;MAChB,kBACE,IAAI,QAAQ,KAAK,KACf,iBAAiB,0BAChB,OAAO,IAAI,qBAAqB,WAC7B,2CAA2C,IAAI,iBAAiB,KAChE,uCACR;MACA;KACF;KAEA,IAAI,CADiB,IAAI,QAAQ,OAAO,KACrB,iBAAiB,uBAAuB;MACzD,kBAAkB,iBAAiB,qBAAqB;MACxD;KACF;KAEA,MAAM,eAAe,SADP,IAAI,SAAS,IAAI,SAAS,KACL;KACnC,IAAI,cAAc,YAAY,SAAS,WAAW,YAAY;KAC9D,IAAI,OAAO,IAAI,mBAAmB,UAChC,eAAe,IAAI;KAErB,IACE,MAAM,gBAAgB,SAAS,UAC/B,IAAI,sBAAsB,KAAA,GAC1B;MACA,MAAM,KAAK,WAAW;MACtB,KAAK;OAAE,MAAM;OAAc;MAAG,CAAC;MAC/B,KAAK;OACH,MAAM;OACN;OACA,OAAO,KAAK,UAAU,IAAI,iBAAiB;MAC7C,CAAC;MACD,KAAK;OAAE,MAAM;OAAY;MAAG,CAAC;MAC7B,iBAAiB,WAAW;KAC9B;KACA,IAAI,iBAAiB,UACnB,eAAe;MACb,OAAO;MACP;MACA,OAAO,iBAAiB,oBAAoB;KAC9C,CAAC;KAEH,IAAI,CAAC,WAAW,mBAAmB,GAAG,GAAG;KACzC,WAAW,cAAc;KACzB,IAAI,CAAC,WAAW,sBAAsB,GAAG;MACvC,WAAW,MAAM;MACjB;KACF;IACF,OACE,mBACG,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,KAAA,MACnD,iBAAiB,yBACjB,IAAI,UACJ,eACJ;IAEF;GACF;GAEA,IAAI,WAAW,qBAAqB,CAAC,WAAW,sBAAsB,GAAG;IACvE,WAAW,MAAM;IACjB;GACF;EACF;CACF,SAAS,KAAK;EAKZ,IACE,CAAC,KAAK,YAAY,WAClB,EAAE,SAAS,OAAO,WAAW,uBAE7B,KAAK,UAAU;GAAE,OAAO;GAAK,SAAS;EAA0B,CAAC;EAEnE;CACF,UAAU;EAKR,gBAAgB,KAAA;EAChB,IAAI,kBAAkB,MAAM,aAAa,cAAc;EACvD,KAAK,YAAY,oBAAoB,SAAS,WAAW;EACzD,WAAW,MAAM;EAMjB,IAAI;GACF,MAAO,EAAyD,SAC9D,KAAA,CACF;EACF,QAAQ,CAER;CACF;CAEA,IAAI,sBAAsB;CAC1B,wBAAwB;CAExB,KAAK;EACH,MAAM;EACN,cAAc;GAAE,SAAS;GAAQ,KAAK;EAAO;EAC7C,YAAY,aAAa,iBAAiB,aAAa,aAAa;EACpE,GAAI,iBAAiB,KAAA,KAAa,wBAAwB,KAAA,IACtD,EACE,iBAAiB,EACf,eAAe;GACb,GAAI,iBAAiB,KAAA,IAAY,EAAE,SAAS,aAAa,IAAI,CAAC;GAI9D,GAAI,wBAAwB,KAAA,IACxB,EAAE,WAAW,oBAAoB,IACjC,CAAC;EACP,EACF,EACF,IACA,CAAC;CACP,CAAC;AACH;AAEA,SAAS,iBAAiB,EACxB,oBACA,cACA,eAaA;CACA,IAAI,SAAS;CACb,IAAI,iBAAiB;CACrB,MAAM,oCAAoB,IAAI,IAA4C;CAC1E,MAAM,mBAAmB,WAAW;CACpC,MAAM,iCAAiB,IAAI,IAAY,CAAC,gBAAgB,CAAC;CACzD,IAAI,sBAAsB;CAC1B,MAAM,YAAY,QAAqC;EACrD,MAAM,SAAS,IAAI,MACjB,OAAM,OAAO,OAAO,YAAY,eAAe,IAAI,EAAE,CACvD;EACA,IAAI,QAAQ,sBAAsB;EAClC,OAAO;CACT;CACA,MAAM,SAAS,UAA0B;EACvC,IAAI,QAAQ;EACZ,SAAS;EACT,aAAa,MAAM,KAAK;CAC1B;CACA,IAAI,YAAY,SACd,MAAM,YAAY,MAAM;MAExB,YAAY,iBAAiB,eAAe,MAAM,YAAY,MAAM,GAAG,EACrE,MAAM,KACR,CAAC;CAGH,MAAM,iBAAiB,aAIP;EACd,MAAM;EACN,SAAS;GACP,MAAM;GACN,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM,QAAQ;GAAK,CAAC;EAChD;EACA,oBAAoB;EACpB,MAAM,QAAQ;EACd,GAAI,QAAQ,YAAY,OAAO,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;CACnE;CAEA,MAAM,kBAAkB,aAAa,OAAO,cAAc,CAAC;CAE3D,OAAO;EACL;EACA,kBAAiB,YAAW;GAC1B,MAAM,YAAY;GAIlB,IAAI,UAAU,gBAAgB,QAAQ,UAAU,SAAS,MAAM;GAC/D,SAAS,CAAC,UAAU,YAAY,CAAC;GACjC,IACE,UAAU,iBAAiB,qBAC1B,UAAU,UAAU,eAAe,UAAU,UAAU,cAExD,iBAAiB;GAEnB,MAAM,YAAY,kBAAkB,IAAI,UAAU,YAAY;GAC9D,IAAI,aAAa,MAAM;GACvB,IAAI,UAAU,UAAU,YAAY,UAAU,UAAU,WAAW;IACjE,UAAU,OAAO;IACjB;GACF;GACA,IAAI,UAAU,UAAU,eAAe,UAAU,UAAU,aACzD,UAAU,uBACR,IAAI,MAAM,eAAe,UAAU,MAAM,mBAAmB,CAC9D;GAEF,kBAAkB,OAAO,UAAU,YAAY;EACjD;EACA,6BACE,kBAAkB,OAAO,KAAK,aAAa,eAAe;EAC5D,qBAAoB,WAAU;GAC5B,MAAM,EAAE,mBAAmB,oBAAoB,WAAW;GAS1D,OAJe,SAAS,CACtB,mBACA,GAAI,MAAM,QAAQ,kBAAkB,IAAI,qBAAqB,CAAC,CAChE,CAEO,KAAM,CAAC,uBAAuB,QAAQ,SAAS;EAExD;EACA,qBAAqB;GACnB,iBAAiB;EACnB;EACA,IAAI,oBAAoB;GACtB,OAAO;EACT;EACA,OAAO,EACL,CAAC,OAAO,iBAAiB;GACvB,IAAI,cAAc;GAClB,OAAO,EACL,MAAM,OAAO;IACX,IAAI,UAAU,YAAY,SACxB,OAAO;KACL,OAAO,KAAA;KACP,MAAM;IACR;IAEF,IAAI,CAAC,aAAa;KAChB,cAAc;KACd,OAAO;MACL,OAAO,cAAc;OACnB,MAAM;OACN,WAAW;MACb,CAAC;MACD,MAAM;KACR;IACF;IACA,MAAM,cAAc,MAAM,gBAAgB,KAAK;IAC/C,IAAI,YAAY,MACd,OAAO;KACL,OAAO,KAAA;KACP,MAAM;IACR;IAEF,kBAAkB,IAChB,YAAY,MAAM,WAClB,YAAY,KACd;IACA,eAAe,IAAI,YAAY,MAAM,SAAS;IAC9C,OAAO;KACL,OAAO,cAAc;MACnB,MAAM,YAAY,MAAM;MACxB,WAAW,YAAY,MAAM;MAC7B,UAAU;KACZ,CAAC;KACD,MAAM;IACR;GACF,EACF;EACF,EACF;CACF;AACF;AAEA,SAAS,SACP,OACA,OACyB;CACzB,IAAI,SAAS,MAAM,OAAO;CAC1B,MAAM,SAAkC,EAAE,GAAG,MAAM;CACnD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,MAAM,WAAW,OAAO;EACxB,IAAI,OAAO,UAAU,YAAY,OAAO,aAAa,UACnD,OAAO,OAAO,WAAW;OACpB,IACL,SAAS,QACT,YAAY,QACZ,OAAO,UAAU,YACjB,OAAO,aAAa,YACpB,CAAC,MAAM,QAAQ,KAAK,KACpB,CAAC,MAAM,QAAQ,QAAQ,GAEvB,OAAO,OAAO,SACZ,UACA,KACF;OAEA,OAAO,OAAO;CAElB;CACA,OAAO;AACT;AAEA,SAAS,UAAU,MAGjB;CACA,MAAM,MAAqD,CAAC;CAC5D,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,IAAI,KAAK,OAAO,eAAe,IAAI,IAAI,KAAK,QAC1C,IAAI,UAAU,KAAK,EAAE;MAChB,IAAI,KAAK,OAAO,wBAAwB,IAAI,IAAI,KAAK,QAC1D,IAAI,iBAAiB,KAAK,EAAE;CAGhC,OAAO;AACT;AAEA,SAAS,UAAU,SAAwB;CACzC,OAAO,MAAM,KAAK,UAAU;EAAE,MAAM;EAAgB;CAAQ,CAAC,IAAI,IAAI;CACrE,QAAQ,KAAK,CAAC;AAChB"}
package/dist/index.js CHANGED
@@ -307,7 +307,7 @@ const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({
307
307
  z.discriminatedUnion("type", [startMessageSchema, ...harnessV1BridgeInboundCommandSchemas]);
308
308
  //#endregion
309
309
  //#region src/version.ts
310
- const VERSION = "1.0.149";
310
+ const VERSION = "1.0.150";
311
311
  //#endregion
312
312
  //#region src/claude-code-harness.ts
313
313
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-claude-code",
3
- "version": "1.0.149",
3
+ "version": "1.0.150",
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.145",
30
- "@ai-sdk/provider": "4.0.25",
31
- "@ai-sdk/provider-utils": "5.0.57",
29
+ "@ai-sdk/harness": "1.0.146",
30
+ "@ai-sdk/provider": "4.0.26",
31
+ "@ai-sdk/provider-utils": "5.0.58",
32
32
  "ws": "^8.21.0"
33
33
  },
34
34
  "peerDependencies": {
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from 'node:crypto';
2
+ import { isDeepStrictEqual } from 'node:util';
2
3
 
3
4
  type Emit = (message: Record<string, unknown>) => void;
4
5
 
@@ -82,12 +83,18 @@ export type ClaudeStreamEventState = {
82
83
  pendingResponseUsage: Record<string, unknown> | undefined;
83
84
  stepOpen: boolean;
84
85
  /*
85
- * Tool-use ids that originated from the MCP server hosting user-supplied
86
- * tools. The MCP handler emits its own `tool-call`/`tool-result` pair with
87
- * the user-facing tool name, so the duplicate `tool_result` block Claude
88
- * reports for the underlying native id must be suppressed.
86
+ * Host-tool calls reported by Claude. The MCP handler normally emits its own
87
+ * `tool-call`/`tool-result` pair, but MCP input validation can reject a call
88
+ * before that handler runs. Retaining the call lets the mapper report that
89
+ * rejected attempt when the corresponding SDK result arrives.
89
90
  */
90
- mcpToolUseIds: Set<string>;
91
+ mcpToolCalls: Map<string, { toolName: string; input: unknown }>;
92
+ /*
93
+ * Host-tool calls that reached the MCP handler. These records let the SDK
94
+ * result mapper suppress the duplicate native result. Input-based matching
95
+ * preserves deduplication when Claude omits or changes the tool-use metadata.
96
+ */
97
+ mcpHandlerCalls: Map<string, { toolName: string; input: unknown }>;
91
98
  externalMcpToolUseIds: Set<string>;
92
99
  structuredOutputToolUseIds: Set<string>;
93
100
  observedTerminalError: string | undefined;
@@ -109,7 +116,8 @@ export function createClaudeStreamEventState(): ClaudeStreamEventState {
109
116
  pendingStepUsage: undefined,
110
117
  pendingResponseUsage: undefined,
111
118
  stepOpen: false,
112
- mcpToolUseIds: new Set(),
119
+ mcpToolCalls: new Map(),
120
+ mcpHandlerCalls: new Map(),
113
121
  externalMcpToolUseIds: new Set(),
114
122
  structuredOutputToolUseIds: new Set(),
115
123
  observedTerminalError: undefined,
@@ -275,7 +283,10 @@ export function createEmitStreamEvent({
275
283
  }
276
284
  if (block.name.startsWith(HOST_TOOL_PREFIX)) {
277
285
  state.pendingStepToolUseIds.add(block.id);
278
- state.mcpToolUseIds.add(block.id);
286
+ state.mcpToolCalls.set(block.id, {
287
+ toolName: block.name.slice(HOST_TOOL_PREFIX.length),
288
+ input: block.input ?? {},
289
+ });
279
290
  opensStep = true;
280
291
  continue;
281
292
  }
@@ -328,9 +339,44 @@ export function createEmitStreamEvent({
328
339
  if (state.structuredOutputToolUseIds.delete(block.tool_use_id)) {
329
340
  continue;
330
341
  }
331
- if (state.mcpToolUseIds.has(block.tool_use_id)) {
332
- state.mcpToolUseIds.delete(block.tool_use_id);
342
+ const mcpToolCall = state.mcpToolCalls.get(block.tool_use_id);
343
+ if (mcpToolCall != null) {
344
+ const handlerReportedCall = takeMcpHandlerCall({
345
+ state,
346
+ toolCallId: block.tool_use_id,
347
+ toolCall: mcpToolCall,
348
+ });
349
+ state.mcpToolCalls.delete(block.tool_use_id);
333
350
  state.pendingStepToolUseIds.delete(block.tool_use_id);
351
+ if (handlerReportedCall) {
352
+ continue;
353
+ }
354
+
355
+ const isError = !!block.is_error;
356
+ const result =
357
+ toolUseResult !== undefined
358
+ ? toolUseResult
359
+ : resolveToolResult({
360
+ toolName: mcpToolCall.toolName,
361
+ dynamic: false,
362
+ isError,
363
+ rawContent: block.content,
364
+ });
365
+ emit({
366
+ type: 'tool-call',
367
+ toolCallId: block.tool_use_id,
368
+ toolName: mcpToolCall.toolName,
369
+ input: JSON.stringify(mcpToolCall.input),
370
+ // MCP rejected this call before asking the host to execute it.
371
+ providerExecuted: true,
372
+ });
373
+ emit({
374
+ type: 'tool-result',
375
+ toolCallId: block.tool_use_id,
376
+ toolName: mcpToolCall.toolName,
377
+ result,
378
+ isError,
379
+ });
334
380
  continue;
335
381
  }
336
382
  state.approvalRequestedToolUseIds.delete(block.tool_use_id);
@@ -365,6 +411,47 @@ export function createEmitStreamEvent({
365
411
  };
366
412
  }
367
413
 
414
+ function takeMcpHandlerCall({
415
+ state,
416
+ toolCallId,
417
+ toolCall,
418
+ }: {
419
+ state: ClaudeStreamEventState;
420
+ toolCallId: string;
421
+ toolCall: { toolName: string; input: unknown };
422
+ }): boolean {
423
+ if (state.mcpHandlerCalls.delete(toolCallId)) {
424
+ return true;
425
+ }
426
+
427
+ for (const [handlerCallId, handlerCall] of state.mcpHandlerCalls) {
428
+ if (
429
+ handlerCall.toolName === toolCall.toolName &&
430
+ isDeepStrictEqual(handlerCall.input, toolCall.input)
431
+ ) {
432
+ state.mcpHandlerCalls.delete(handlerCallId);
433
+ return true;
434
+ }
435
+ }
436
+
437
+ const matchingHandlerCallIds = Array.from(state.mcpHandlerCalls)
438
+ .filter(([, handlerCall]) => handlerCall.toolName === toolCall.toolName)
439
+ .map(([handlerCallId]) => handlerCallId);
440
+ const matchingToolCallCount = Array.from(state.mcpToolCalls.values()).filter(
441
+ pendingCall => pendingCall.toolName === toolCall.toolName,
442
+ ).length;
443
+
444
+ if (
445
+ matchingHandlerCallIds.length > 0 &&
446
+ matchingHandlerCallIds.length === matchingToolCallCount
447
+ ) {
448
+ state.mcpHandlerCalls.delete(matchingHandlerCallIds[0]);
449
+ return true;
450
+ }
451
+
452
+ return false;
453
+ }
454
+
368
455
  export function finishApprovalStep({
369
456
  state,
370
457
  emit,
@@ -415,6 +415,10 @@ async function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {
415
415
  typeof metadataToolCallId === 'string'
416
416
  ? metadataToolCallId
417
417
  : randomUUID();
418
+ streamEventState.mcpHandlerCalls.set(toolCallId, {
419
+ toolName: tool.name,
420
+ input,
421
+ });
418
422
  emit({
419
423
  type: 'tool-call',
420
424
  toolCallId,
@@ -447,7 +451,20 @@ async function runTurn(start: StartMessage, turn: BridgeTurn): Promise<void> {
447
451
  // Compaction observation: merge Claude's `compact_boundary` message and
448
452
  // `PostCompact` hook (which arrive in either order) into one `compaction`
449
453
  // event. See `createCompactionLatch`.
450
- const compaction = createCompactionLatch(event => emit(event));
454
+ const compaction = createCompactionLatch(event => {
455
+ const hasOpenStep = streamEventState.stepOpen;
456
+ emit(event);
457
+ // The harness translates compaction into synthetic step content. When
458
+ // Claude reports it outside a model step, close that synthetic step here;
459
+ // otherwise the existing model step will close it with its own usage.
460
+ if (!hasOpenStep) {
461
+ emitFinishStep({
462
+ state: streamEventState,
463
+ emit,
464
+ usage: undefined,
465
+ });
466
+ }
467
+ });
451
468
 
452
469
  // `stream-start` is emitted lazily on the first SDK message (below) so it can
453
470
  // carry the model the CLI resolved to, reported on the `system`/`init` message.