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