{"version":3,"file":"adapter.cjs","names":["#baseline"],"sources":["../../../../src/batteries/llm/claude_code_cli/adapter.ts"],"sourcesContent":["/**\n * Cross-environment executor adapter that wraps the Claude Code CLI as a `DispatchExecutorFn`\n * destination.\n *\n * @module @nhtio/adk/batteries/llm/claude_code_cli/adapter\n *\n * @remarks\n * The first battery in the \"CLI harness\" family: rather than a direct wire-format provider, this\n * adapter drives an external coding-agent CLI binary that is itself a complete agent loop. Since a\n * subprocess must be spawned anyway, ALL Claude-Code-specific complexity — spawning the real\n * `claude` binary, hosting an MCP bridge server, translating its stream-json — lives in a\n * dedicated wrapper process (`wrapper.ts`, shipped as a sibling dist asset); this adapter only\n * ever spawns and drives that wrapper over the small, harness-agnostic protocol in `./wire`.\n *\n * Every dispatch iteration is stateless and self-contained: the full accumulated history renders\n * into one `-p` prompt string (`buildClaudeCodeCliPrompt`), a fresh wrapper is spawned, and real\n * ADK tools are bridged into the CLI's own tool loop via MCP — but actual execution always happens\n * on the ADK side, through `tool.executor(ctx)(args)`, exactly like every other LLM battery.\n */\n\nimport { sha256 } from 'js-sha256'\nimport { validateOptions } from './validation'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { createNdjsonLineReader, encodeWrapperCommand } from './wire'\nimport { canonicalStringify } from '../../../lib/utils/canonical_json'\nimport { InMemorySpoolStore } from '@nhtio/adk/batteries/storage/in_memory'\nimport {\n  Tokenizable,\n  ToolCall,\n  Memory,\n  Message,\n  Media,\n  ArtifactTool,\n  SpooledArtifact,\n} from '@nhtio/adk/common'\nimport {\n  E_CLAUDE_CODE_CLI_WRAPPER_SPAWN_ERROR,\n  E_CLAUDE_CODE_CLI_WRAPPER_CRASHED,\n  E_CLAUDE_CODE_CLI_PROCESS_EXITED_NONZERO,\n  E_CLAUDE_CODE_CLI_STREAM_STALLED,\n  E_CLAUDE_CODE_CLI_STARTUP_TIMEOUT,\n  E_CLAUDE_CODE_CLI_MCP_BRIDGE_STARTUP_FAILED,\n  E_CLAUDE_CODE_CLI_TURN_FAILED,\n  E_INVALID_CLAUDE_CODE_CLI_OPTIONS,\n  E_CLAUDE_CODE_CLI_CONTEXT_OVERFLOW,\n} from './exceptions'\nimport {\n  defaultDescriptionToChatCompletionsJsonSchema,\n  defaultRenderUntrustedContent,\n  defaultRenderTrustedContent,\n  defaultRenderStandingInstructions,\n  defaultRenderMemories,\n  defaultRenderRetrievables,\n  defaultRenderRetrievableHandleBody,\n  defaultRenderRetrievableSafetyDirective,\n  defaultRenderFirstPartyRetrievables,\n  defaultRenderThirdPartyPublicRetrievables,\n  defaultRenderThirdPartyPrivateRetrievables,\n  defaultRenderThought,\n  defaultFilterThoughts,\n  defaultToolsToChatCompletionsTools,\n  defaultRenderChatCompletionsSystemPrompt,\n  defaultRenderClaudeCodeCliTimelineMessage,\n  defaultRenderClaudeCodeCliToolCallResult,\n  defaultBuildClaudeCodeCliPrompt,\n  renderArtifactHandleBody,\n  looksLikeSpooledArtifact,\n} from './helpers'\nimport type { Tool } from '@nhtio/adk/common'\nimport type { SpoolStore } from '@nhtio/adk/common'\nimport type { DispatchContext } from '@nhtio/adk/types'\nimport type { TokenEncoding, TokenEncodingId } from '@nhtio/adk/types'\nimport type { WrapperEvent, WrapperCommand, WrapperBridgedTool } from './wire'\nimport type { DispatchExecutorFn, DispatchExecutorHelpers } from '@nhtio/adk/dispatch_runner'\nimport type {\n  ClaudeCodeCliAdapterOptions,\n  ClaudeCodeCliHelpers,\n  ExecaLike,\n  ExecaResolver,\n  UnsupportedMediaPolicy,\n} from './types'\n\ntype OutboundContentBlock =\n  | { type: 'text'; text: string }\n  | { type: 'image'; data: string; mimeType: string }\n\n// ─── wrapper path resolution (Decision C) ──────────────────────────────────────\n\n/**\n * Resolve the built wrapper asset's on-disk path relative to this module's own compiled location.\n * `adapter.ts` carries its own `@module` tag (per the per-file tagging convention every other\n * multi-file battery uses), so it compiles to `dist/batteries/llm/claude_code_cli/adapter.mjs` —\n * three directories below the package root, where the wrapper (an explicit, un-tagged\n * `vite.config.mts` entry key) compiles to `dist/claude-code-cli-wrapper.mjs`.\n */\nexport const resolveDefaultWrapperPath = (): string => {\n  // `typeof require === 'function'` alone is not a safe CJS-vs-ESM discriminator: rolldown's ESM\n  // output wraps `require` in a shim/Proxy (falling back to itself when the real `require` is\n  // absent) that still reports `typeof === 'function'`, but whose `.resolve` is not itself a\n  // function — calling it throws instead of falling through to the URL-based ESM branch below.\n  if (typeof require === 'function' && typeof require.resolve === 'function') {\n    return require.resolve('../../../claude-code-cli-wrapper.cjs')\n  }\n  // `URL.pathname` is percent-encoded — a real install path containing a space, unicode, or any\n  // other URL-reserved character would produce a non-existent argv path (e.g. `%20` instead of a\n  // literal space) once handed to `execaFn`/`spawn` below. `decodeURIComponent` undoes that percent\n  // encoding to recover the native filesystem path — equivalent to `node:url`'s `fileURLToPath` for\n  // a POSIX path (verified directly), which this module avoids importing at module scope: this\n  // file is transitively pulled into the browser test project via `src/batteries`'s barrel (e.g.\n  // `tests/unit/batteries/index.cross.spec.ts`), and Vite externalizes `node:url` there, throwing\n  // on any access to `fileURLToPath` at import time. This battery is POSIX-only in v1 anyway\n  // (validated at options-construction time), so a POSIX-only decode is exactly the right amount\n  // of `node:url` behavior to reimplement without importing it.\n  return decodeURIComponent(\n    new URL('../../../claude-code-cli-wrapper.mjs', import.meta.url).pathname\n  )\n}\n\n// ─── execa resolution (mirrors execa_executor.ts's lazy-resolver pattern) ──────\n\nconst resolveExeca = async (supplied: ExecaResolver | undefined): Promise<ExecaLike> => {\n  let value: unknown =\n    supplied ?? (() => import('execa') as unknown as Promise<{ execa: ExecaLike }>)\n  if (typeof value === 'function' && !('exec' in (value as object))) {\n    try {\n      value = await (value as () => unknown)()\n    } catch (err) {\n      const detail = isError(err) ? err.message : String(err)\n      throw new E_CLAUDE_CODE_CLI_WRAPPER_SPAWN_ERROR([\n        `execa resolver failed: ${detail} — install the optional peer dependency \"execa\" or supply your own`,\n      ])\n    }\n  }\n  if (isObject(value) && 'execa' in value) {\n    value = (value as { execa: unknown }).execa\n  }\n  if (typeof value !== 'function') {\n    throw new E_CLAUDE_CODE_CLI_WRAPPER_SPAWN_ERROR([\n      'execa resolver did not resolve to a function',\n    ])\n  }\n  return value as ExecaLike\n}\n\n// ─── option merging ─────────────────────────────────────────────────────────\n\nconst mergeRecord = <T extends Record<string, unknown>>(\n  layers: ReadonlyArray<T | undefined>\n): T | undefined => {\n  let merged: T | undefined\n  for (const layer of layers) {\n    if (!layer) continue\n    merged = { ...(merged ?? ({} as T)), ...layer }\n  }\n  return merged\n}\n\nconst mergeOptions = (\n  baseline: ClaudeCodeCliAdapterOptions,\n  exec: Partial<ClaudeCodeCliAdapterOptions> | undefined,\n  stash: Partial<ClaudeCodeCliAdapterOptions> | undefined\n): Partial<ClaudeCodeCliAdapterOptions> => {\n  const layers = [baseline as Partial<ClaudeCodeCliAdapterOptions>, exec ?? {}, stash ?? {}]\n  const out: Record<string, unknown> = {}\n  for (const layer of layers) {\n    for (const [k, v] of Object.entries(layer)) {\n      if (v === undefined) continue\n      if (k === 'helpers') continue\n      out[k] = v\n    }\n  }\n  const helpers = mergeRecord(layers.map((l) => l.helpers as Record<string, unknown> | undefined))\n  if (helpers !== undefined) out.helpers = helpers\n  return out as Partial<ClaudeCodeCliAdapterOptions>\n}\n\nconst resolveHelpers = (\n  overrides: Partial<ClaudeCodeCliHelpers> | undefined\n): ClaudeCodeCliHelpers => {\n  const src = overrides ?? {}\n  return {\n    descriptionToChatCompletionsJsonSchema:\n      src.descriptionToChatCompletionsJsonSchema ?? defaultDescriptionToChatCompletionsJsonSchema,\n    renderUntrustedContent: src.renderUntrustedContent ?? defaultRenderUntrustedContent,\n    renderTrustedContent: src.renderTrustedContent ?? defaultRenderTrustedContent,\n    renderStandingInstructions: src.renderStandingInstructions ?? defaultRenderStandingInstructions,\n    renderMemories: src.renderMemories ?? defaultRenderMemories,\n    renderRetrievables: src.renderRetrievables ?? defaultRenderRetrievables,\n    renderRetrievableHandleBody:\n      src.renderRetrievableHandleBody ?? defaultRenderRetrievableHandleBody,\n    renderRetrievableSafetyDirective:\n      src.renderRetrievableSafetyDirective ?? defaultRenderRetrievableSafetyDirective,\n    renderFirstPartyRetrievables:\n      src.renderFirstPartyRetrievables ?? defaultRenderFirstPartyRetrievables,\n    renderThirdPartyPublicRetrievables:\n      src.renderThirdPartyPublicRetrievables ?? defaultRenderThirdPartyPublicRetrievables,\n    renderThirdPartyPrivateRetrievables:\n      src.renderThirdPartyPrivateRetrievables ?? defaultRenderThirdPartyPrivateRetrievables,\n    renderThought: src.renderThought ?? defaultRenderThought,\n    filterThoughts: src.filterThoughts ?? defaultFilterThoughts,\n    toolsToChatCompletionsTools:\n      src.toolsToChatCompletionsTools ?? defaultToolsToChatCompletionsTools,\n    renderChatCompletionsSystemPrompt:\n      src.renderChatCompletionsSystemPrompt ?? defaultRenderChatCompletionsSystemPrompt,\n    renderClaudeCodeCliTimelineMessage:\n      src.renderClaudeCodeCliTimelineMessage ?? defaultRenderClaudeCodeCliTimelineMessage,\n    renderClaudeCodeCliToolCallResult:\n      src.renderClaudeCodeCliToolCallResult ?? defaultRenderClaudeCodeCliToolCallResult,\n    buildClaudeCodeCliPrompt: src.buildClaudeCodeCliPrompt ?? defaultBuildClaudeCodeCliPrompt,\n  }\n}\n\nconst estimateTokensOf = async (\n  value: { estimateTokens: (encoding: TokenEncoding) => number | Promise<number> },\n  encoding: TokenEncodingId\n): Promise<number> => Promise.resolve(value.estimateTokens(encoding as TokenEncoding))\n\n// ─── time / checksum helpers ────────────────────────────────────────────────\n\nconst nowIso = (): string => new Date().toISOString()\n\n/**\n * Integrity checksum over `tool`/`args` — matches every other LLM battery's convention\n * (`sha256(canonicalStringify({tool, args}))`, see `ollama/adapter.ts`'s `computeChecksum`), NOT\n * the per-call `requestId`. Identical repeat calls must share this checksum: it feeds\n * `DispatchContext`'s own `#toolCallChecksums` loop-detection counter and cross-bus correlation,\n * neither of which can see a repeat if every call gets a unique value.\n */\nconst computeChecksum = (tool: string, args: unknown): string =>\n  sha256(canonicalStringify({ tool, args }))\n\n// ─── outbound tool-result rendering (decision 8) ───────────────────────────────\n\nconst renderMediaListAsOutbound = async (\n  mediaList: Media[],\n  unsupportedResultMediaPolicy: UnsupportedMediaPolicy\n): Promise<{ content: OutboundContentBlock[]; isError: boolean }> => {\n  const content: OutboundContentBlock[] = []\n  let anyUnsupported = false\n  for (const media of mediaList) {\n    if (media.kind === 'image') {\n      content.push({ type: 'image', data: await media.asBase64(), mimeType: media.mimeType })\n      continue\n    }\n    // Every non-image modality is unsupported on the outbound MCP wire (only text/image content\n    // blocks exist there) — routed through the SAME policy family the inbound direction uses\n    // (decision 8), rather than an unconditional hardcoded error.\n    if (unsupportedResultMediaPolicy === 'throw') {\n      anyUnsupported = true\n      content.push({\n        type: 'text',\n        text: `Unsupported result media modality: ${media.kind} (${media.mimeType})`,\n      })\n      continue\n    }\n    const byteLen = await media.byteLength().catch(() => undefined)\n    content.push({\n      type: 'text',\n      text: `[media: ${media.filename}, ${media.mimeType}, ${byteLen ?? 'unknown'} bytes]`,\n    })\n  }\n  return { content, isError: anyUnsupported }\n}\n\nconst renderOutboundResult = async (input: {\n  raw: string | Uint8Array | SpooledArtifact | Media | Media[]\n  callId: string\n  inline: boolean\n  spoolStore: SpoolStore\n  unsupportedResultMediaPolicy: UnsupportedMediaPolicy\n}): Promise<{ content: OutboundContentBlock[]; isError: boolean }> => {\n  const { raw, callId, inline } = input\n\n  if (Media.isMedia(raw)) {\n    return renderMediaListAsOutbound([raw], input.unsupportedResultMediaPolicy)\n  }\n  if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n    return renderMediaListAsOutbound(raw, input.unsupportedResultMediaPolicy)\n  }\n  if (looksLikeSpooledArtifact(raw)) {\n    const artifact = raw as SpooledArtifact\n    if (inline === false) {\n      let byteLength = 0\n      let lineCount = 0\n      try {\n        byteLength = await artifact.byteLength()\n      } catch {\n        byteLength = 0\n      }\n      try {\n        lineCount = await artifact.lineCount()\n      } catch {\n        lineCount = 0\n      }\n      const body = renderArtifactHandleBody({ callId, artifact, byteLength, lineCount })\n      return { content: [{ type: 'text', text: body }], isError: false }\n    }\n    const text = await artifact.asString()\n    return { content: [{ type: 'text', text }], isError: false }\n  }\n  if (typeof raw === 'string') {\n    return { content: [{ type: 'text', text: raw }], isError: false }\n  }\n  if (isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n    await input.spoolStore.write(callId, raw)\n    return {\n      content: [{ type: 'text', text: '[binary tool result — see history for details]' }],\n      isError: false,\n    }\n  }\n  return { content: [{ type: 'text', text: String(raw) }], isError: false }\n}\n\n// ─── the adapter ────────────────────────────────────────────────────────────\n\n/**\n * Opinionated CLI-harness LLM adapter that drives the Claude Code CLI as a `DispatchExecutorFn`\n * destination.\n *\n * @remarks\n * Construction validates options eagerly via {@link validateOptions} and throws\n * {@link @nhtio/adk/batteries/llm/claude_code_cli!E_INVALID_CLAUDE_CODE_CLI_OPTIONS} on failure\n * (including the POSIX-only platform guard and the `apiKey`/`authToken` XOR check). The returned\n * instance is reusable: call {@link ClaudeCodeCliAdapter.executor} once per `DispatchRunner`\n * configuration.\n */\nexport class ClaudeCodeCliAdapter {\n  /** Customary key for per-iteration overrides on `ctx.stash`. */\n  public static readonly STASH_KEY = 'claudeCodeCli' as const\n\n  readonly #baseline: ClaudeCodeCliAdapterOptions\n\n  /**\n   * @param options - Constructor-baseline options. Re-validated on every iteration after\n   *   per-dispatch and per-iteration overrides are layered in.\n   * @throws {@link @nhtio/adk/batteries/llm/claude_code_cli!E_INVALID_CLAUDE_CODE_CLI_OPTIONS} when\n   *   `options` does not satisfy `claudeCodeCliOptionsSchema`.\n   */\n  constructor(options: unknown) {\n    this.#baseline = validateOptions(options)\n  }\n\n  /**\n   * Returns a {@link @nhtio/adk!DispatchExecutorFn} bound to this adapter's baseline plus optional\n   * executor-scope overrides.\n   */\n  executor(overrides?: Partial<ClaudeCodeCliAdapterOptions>): DispatchExecutorFn {\n    const baseline = this.#baseline\n    const adapterClass = ClaudeCodeCliAdapter\n\n    return async (ctx: DispatchContext, helpers: DispatchExecutorHelpers): Promise<void> => {\n      const localWarn = (msg: string): void => {\n        helpers.log.warn({ kind: 'helper-warning', message: msg })\n      }\n\n      // ── Step 1: merge & validate ──────────────────────────────────────────\n      const stashRaw = ctx.stash.get(adapterClass.STASH_KEY, {}) as unknown\n      const stashOverrides =\n        stashRaw && typeof stashRaw === 'object'\n          ? (stashRaw as Partial<ClaudeCodeCliAdapterOptions>)\n          : {}\n      const merged = validateOptions(mergeOptions(baseline, overrides, stashOverrides))\n\n      if (merged.tokenEncoding !== null && merged.contextWindow === undefined) {\n        throw new E_INVALID_CLAUDE_CODE_CLI_OPTIONS([\n          'tokenEncoding is non-null but contextWindow is undefined',\n        ])\n      }\n\n      // ── Step 2: resolve helpers ───────────────────────────────────────────\n      const resolvedHelpers = resolveHelpers(merged.helpers)\n\n      // ── Step 3: resolve execa + wrapper path ──────────────────────────────\n      let execaFn: ExecaLike\n      try {\n        execaFn = await resolveExeca(merged.execa)\n      } catch (err) {\n        ctx.nack(isError(err) ? err : new Error(String(err)))\n        return\n      }\n      const wrapperPath = merged.wrapperPath ?? resolveDefaultWrapperPath()\n      const claudeBin = merged.claudeBin ?? 'claude'\n\n      // ── Step 5: pre-render inbound tool-call results (for history) ────────\n      // Key by primitive identity, not id: repeated vendor/request ids must not cross-wire results.\n      const renderedToolCallResults = new Map<ToolCall, string>()\n      for (const tc of ctx.turnToolCalls) {\n        const rendered = await resolvedHelpers.renderClaudeCodeCliToolCallResult({\n          toolCall: tc,\n          results: tc.results as\n            | Tokenizable\n            | SpooledArtifact\n            | SpooledArtifact[]\n            | Media\n            | Media[],\n          tool: ctx.tools.get(tc.tool) as Tool | undefined,\n          renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n          renderTrustedContent: resolvedHelpers.renderTrustedContent,\n          unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n          warn: localWarn,\n        })\n        renderedToolCallResults.set(tc, rendered)\n      }\n\n      // ── Step 6: build the -p prompt ────────────────────────────────────────\n      const { prompt, reasoningPayloads } = await resolvedHelpers.buildClaudeCodeCliPrompt({\n        systemPrompt: ctx.systemPrompt,\n        renderCtx: ctx,\n        standingInstructions: ctx.standingInstructions,\n        memories: ctx.turnMemories,\n        retrievables: ctx.turnRetrievables,\n        messages: ctx.turnMessages,\n        thoughts: ctx.turnThoughts,\n        toolCalls: ctx.turnToolCalls,\n        tools: ctx.tools,\n        renderedToolCallResults,\n        bucketOrder: merged.bucketOrder ?? [\n          'standingInstructions',\n          'memories',\n          'retrievables',\n          'timeline',\n        ],\n        selfIdentity: merged.selfIdentity ?? 'assistant',\n        thoughtSurfacing: merged.thoughtSurfacing ?? 'all-self',\n        replayCompatibility: merged.replayCompatibility ?? [],\n        unsupportedMediaPolicy: merged.unsupportedMediaPolicy ?? 'throw',\n        renderChatCompletionsSystemPrompt: resolvedHelpers.renderChatCompletionsSystemPrompt,\n        renderStandingInstructions: resolvedHelpers.renderStandingInstructions,\n        renderMemories: resolvedHelpers.renderMemories,\n        renderRetrievables: resolvedHelpers.renderRetrievables,\n        renderRetrievableSafetyDirective: resolvedHelpers.renderRetrievableSafetyDirective,\n        renderFirstPartyRetrievables: resolvedHelpers.renderFirstPartyRetrievables,\n        renderThirdPartyPublicRetrievables: resolvedHelpers.renderThirdPartyPublicRetrievables,\n        renderThirdPartyPrivateRetrievables: resolvedHelpers.renderThirdPartyPrivateRetrievables,\n        renderRetrievableHandleBody: resolvedHelpers.renderRetrievableHandleBody,\n        renderClaudeCodeCliTimelineMessage: resolvedHelpers.renderClaudeCodeCliTimelineMessage,\n        renderClaudeCodeCliToolCallResult: resolvedHelpers.renderClaudeCodeCliToolCallResult,\n        renderThought: resolvedHelpers.renderThought,\n        filterThoughts: resolvedHelpers.filterThoughts,\n        renderUntrustedContent: resolvedHelpers.renderUntrustedContent,\n        renderTrustedContent: resolvedHelpers.renderTrustedContent,\n        warn: localWarn,\n      })\n\n      // A `-p` prompt string has no side channel for an opaque, vendor-specific reasoning payload\n      // the way Ollama/OpenAI's JSON request bodies do (`_adk_reasoning_payloads`) — there is\n      // nowhere in this wire to forward one. Surface that loss as a diagnostic rather than\n      // silently dropping it, matching the honesty standard applied to every other documented v1\n      // limitation of this battery (text-only media, subagent text).\n      if (reasoningPayloads.length > 0) {\n        helpers.log.debug({\n          kind: 'reasoning-payload-dropped',\n          message: `${reasoningPayloads.length} opaque reasoning payload(s) matched replayCompatibility but have no destination on the Claude Code CLI wire (no side channel exists for a '-p' prompt) and were dropped.`,\n        })\n      }\n\n      // ── Step 7: build the bridged-tools set (excluding disallowedTools) ───\n      const disallowed = new Set(merged.disallowedTools ?? [])\n      const visibleTools = ctx.tools.visible().filter((t) => !disallowed.has(t.name))\n      const bridgedTools: WrapperBridgedTool[] = visibleTools.map((t) => {\n        const described = t.describe()\n        const inputSchema = resolvedHelpers.descriptionToChatCompletionsJsonSchema(\n          described.inputSchema as never\n        )\n        return {\n          name: described.name,\n          description: described.description,\n          inputSchema:\n            inputSchema && Object.keys(inputSchema).length > 0\n              ? (inputSchema as Record<string, unknown>)\n              : { type: 'object', properties: {} },\n        }\n      })\n\n      // ── Step 8: context window enforcement ────────────────────────────────\n      if (merged.tokenEncoding !== null && merged.contextWindow !== undefined) {\n        const encoding = merged.tokenEncoding as TokenEncodingId\n        // The rendered prompt is the actual `-p` wire value. Measure it directly rather than\n        // re-summing its source buckets: renderers add envelopes, provenance, and ordering.\n        const promptTokens = await estimateTokensOf(new Tokenizable(prompt), encoding)\n        const appendSystemPromptTokens = merged.appendSystemPrompt\n          ? await estimateTokensOf(new Tokenizable(merged.appendSystemPrompt), encoding)\n          : 0\n\n        // Keep source-bucket diagnostics for middleware deciding what to shed. They are not part\n        // of the authoritative total above, since their content is already represented by prompt.\n        const rawSystemPrompt = await estimateTokensOf(ctx.systemPrompt, encoding)\n        let rawStandingInstructions = 0\n        for (const value of ctx.standingInstructions)\n          rawStandingInstructions += await estimateTokensOf(value, encoding)\n        let rawMemories = 0\n        for (const value of ctx.turnMemories as Set<Memory>)\n          rawMemories += await estimateTokensOf(value.content, encoding)\n        let rawRetrievables = 0\n        for (const r of ctx.turnRetrievables) {\n          rawRetrievables +=\n            !r.inline && SpooledArtifact.isSpooledArtifact(r.content) && r.content.hasSizeHints()\n              ? r.content.estimateHandleTokens(\n                  r.id,\n                  encoding as TokenEncoding,\n                  resolvedHelpers.renderRetrievableHandleBody\n                )\n              : await estimateTokensOf(r.content, encoding)\n        }\n        let rawTimeline = 0\n        for (const msg of ctx.turnMessages)\n          if (msg.content !== undefined)\n            rawTimeline += await estimateTokensOf(msg.content, encoding)\n        for (const thought of ctx.turnThoughts)\n          rawTimeline += await estimateTokensOf(thought.content, encoding)\n        for (const rendered of renderedToolCallResults.values())\n          rawTimeline += await estimateTokensOf(new Tokenizable(rendered), encoding)\n        // Claude Code receives declarations through MCP, not a wire `tools` array. This stable\n        // serialization is an honest floor: JSON declarations plus the CLI-visible names.\n        const toolSerialization = `${JSON.stringify(bridgedTools)}|${bridgedTools\n          .map((t) => `mcp__adk_bridge__${t.name}`)\n          .join(',')}`\n        const tools = await estimateTokensOf(new Tokenizable(toolSerialization), encoding)\n        const perBucket = {\n          prompt: promptTokens,\n          appendSystemPrompt: appendSystemPromptTokens,\n          tools,\n          raw: {\n            systemPrompt: rawSystemPrompt,\n            standingInstructions: rawStandingInstructions,\n            memories: rawMemories,\n            retrievables: rawRetrievables,\n            timeline: rawTimeline,\n          },\n        }\n        const total = promptTokens + appendSystemPromptTokens + tools\n        helpers.log.debug({\n          kind: 'context-window-usage',\n          message: `Context window usage: ${total}/${merged.contextWindow} tokens`,\n          payload: { total, limit: merged.contextWindow, encoding, perBucket },\n        })\n        if (total > merged.contextWindow)\n          throw new E_CLAUDE_CODE_CLI_CONTEXT_OVERFLOW([\n            total,\n            merged.contextWindow,\n            encoding,\n            JSON.stringify(perBucket),\n          ])\n      }\n\n      // ── Step 9: spawn the wrapper ──────────────────────────────────────────\n      const spoolStore = merged.spoolStore ?? new InMemorySpoolStore()\n      let child: ReturnType<ExecaLike>\n      try {\n        child = execaFn(process.execPath, [wrapperPath], { cleanup: true })\n      } catch (err) {\n        ctx.nack(\n          new E_CLAUDE_CODE_CLI_WRAPPER_SPAWN_ERROR([isError(err) ? err.message : String(err)])\n        )\n        return\n      }\n\n      const startupTimeoutMs = merged.startupTimeoutMs ?? 45_000\n      const streamIdleTimeoutMs = merged.streamIdleTimeoutMs ?? 60_000\n      const disposeGraceMs = merged.disposeGraceMs ?? 2_000\n\n      let sawReady = false\n      let sawInit = false\n      // Set SYNCHRONOUSLY the instant a terminal `result`/`error` event is observed — before any\n      // `await` (e.g. `sealCurrentMessage()`) runs. The wrapper closing stdout immediately after\n      // writing its terminal line is a real, observed race: without this flag, `stdout`'s `'end'`\n      // handler can fire and call `settleOnce` (nacking the turn as an unexpected exit) while the\n      // `result` handler is still awaiting `sealCurrentMessage()`, even though `settleOnce` itself\n      // is idempotent-guarded — the guard only helps once one of the two paths has actually run.\n      let sawTerminalEvent = false\n      let startupTimer: ReturnType<typeof setTimeout> | undefined\n      let idleTimer: ReturnType<typeof setTimeout> | undefined\n      let settled = false\n      // Set once the outer `await new Promise<void>(...)` below is constructed. The startup/idle\n      // timers are armed BEFORE that promise exists, so their settleOnce() callbacks must resolve\n      // it through this indirection rather than a `finish` closure defined only inside it — without\n      // this, a startup or stream-idle timeout would settle ctx (nack) but never resolve the outer\n      // promise, hanging the executor forever.\n      let resolveIteration: (() => void) | undefined\n      let currentMessageId: string | undefined\n      let currentMessageBuffer = ''\n      let sealedMessage = false\n\n      const clearStartupTimer = (): void => {\n        if (startupTimer) clearTimeout(startupTimer)\n        startupTimer = undefined\n      }\n      const clearIdleTimer = (): void => {\n        if (idleTimer) clearTimeout(idleTimer)\n        idleTimer = undefined\n      }\n      const maybeClearStartupTimer = (): void => {\n        if (sawReady && sawInit) clearStartupTimer()\n      }\n\n      const writeCommand = (command: WrapperCommand): void => {\n        try {\n          child.stdin?.write(encodeWrapperCommand(command))\n        } catch {\n          /* the wrapper's stdin may already be gone */\n        }\n      }\n\n      const gracefulShutdown = async (): Promise<void> => {\n        writeCommand({ type: 'shutdown' })\n        await new Promise<void>((resolve) => {\n          const timer = setTimeout(resolve, disposeGraceMs)\n          void Promise.resolve(child).finally(() => {\n            clearTimeout(timer)\n            resolve()\n          })\n        })\n        try {\n          child.kill('SIGTERM')\n        } catch {\n          /* already exited */\n        }\n      }\n\n      const abortListener = (): void => {\n        void gracefulShutdown()\n      }\n      ctx.abortSignal.addEventListener('abort', abortListener, { once: true })\n      const detachAbortListener = (): void =>\n        ctx.abortSignal.removeEventListener('abort', abortListener)\n\n      const settleOnce = (fn: () => void): void => {\n        if (settled) return\n        settled = true\n        clearStartupTimer()\n        clearIdleTimer()\n        detachAbortListener()\n        fn()\n      }\n\n      startupTimer = setTimeout(() => {\n        settleOnce(() => {\n          resolveIteration?.()\n          void gracefulShutdown()\n          ctx.nack(new E_CLAUDE_CODE_CLI_STARTUP_TIMEOUT([startupTimeoutMs]))\n        })\n      }, startupTimeoutMs)\n\n      const armIdleTimer = (): void => {\n        if (!sawReady || !sawInit) return\n        clearIdleTimer()\n        idleTimer = setTimeout(() => {\n          settleOnce(() => {\n            resolveIteration?.()\n            void gracefulShutdown()\n            ctx.nack(new E_CLAUDE_CODE_CLI_STREAM_STALLED([streamIdleTimeoutMs]))\n          })\n        }, streamIdleTimeoutMs)\n      }\n\n      const sealCurrentMessage = async (): Promise<void> => {\n        if (sealedMessage || currentMessageId === undefined) return\n        sealedMessage = true\n        await ctx.storeMessage(\n          new Message({\n            id: currentMessageId,\n            role: 'assistant',\n            content: currentMessageBuffer,\n            identity: merged.selfIdentity ?? 'assistant',\n            createdAt: nowIso(),\n            updatedAt: nowIso(),\n          })\n        )\n      }\n\n      const handleToolCallRequest = async (\n        requestId: string,\n        toolName: string,\n        rawArgs: unknown\n      ): Promise<void> => {\n        const tool = ctx.tools.get(toolName)\n        if (!tool) {\n          writeCommand({\n            type: 'tool_call_response',\n            requestId,\n            results: {\n              content: [{ type: 'text', text: `Tool not found: ${toolName}` }],\n              isError: true,\n            },\n          })\n          return\n        }\n        // MCP's own JSON-RPC CallTool wire always sends `arguments` as an object; a non-object\n        // here would indicate a malformed request from the bridge, not a legitimate call — defend\n        // the same way the Ollama battery does for its own non-object case.\n        const args: string | Record<string, unknown> = isObject(rawArgs) ? rawArgs : {}\n        helpers.reportToolCall(requestId, { tool: tool.name, args })\n        const isArtifactTool = ArtifactTool.isArtifactTool(tool)\n        let results: Tokenizable | SpooledArtifact | SpooledArtifact[] | Media | Media[] =\n          new Tokenizable('')\n        let toolHadError = false\n        try {\n          const raw = await tool.executor(ctx)(args)\n          if (isArtifactTool) {\n            if (Tokenizable.isTokenizable(raw)) {\n              results = raw\n            } else if (typeof raw === 'string') {\n              results = new Tokenizable(raw)\n            } else {\n              throw new Error(\n                `ArtifactTool \"${tool.name}\" returned a non-string/non-Tokenizable value`\n              )\n            }\n          } else if (Media.isMedia(raw)) {\n            results = raw\n          } else if (Array.isArray(raw) && raw.length > 0 && raw.every((m) => Media.isMedia(m))) {\n            results = raw as Media[]\n          } else if (looksLikeSpooledArtifact(raw)) {\n            results = raw as SpooledArtifact\n          } else if (typeof raw === 'string' || isInstanceOf(raw, 'Uint8Array', Uint8Array)) {\n            const reader = await spoolStore.write(requestId, raw)\n            const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n            results = new ArtifactCtor(reader)\n          } else {\n            const reader = await spoolStore.write(requestId, String(raw))\n            const ArtifactCtor = (tool as Tool).artifactConstructor?.() ?? SpooledArtifact\n            results = new ArtifactCtor(reader)\n          }\n        } catch (err) {\n          toolHadError = true\n          results = new Tokenizable(isError(err) ? err.message : String(err))\n        }\n        helpers.reportToolCall(requestId, { results, isError: toolHadError, isComplete: true })\n        const completedAt = nowIso()\n        await ctx.storeToolCall(\n          new ToolCall({\n            id: requestId,\n            tool: tool.name,\n            args,\n            checksum: computeChecksum(tool.name, args),\n            isComplete: true,\n            isError: toolHadError,\n            results,\n            fromArtifactTool: isArtifactTool,\n            inline: isArtifactTool,\n            createdAt: completedAt,\n            updatedAt: completedAt,\n            completedAt,\n          })\n        )\n\n        let rendered: { content: OutboundContentBlock[]; isError: boolean }\n        try {\n          rendered = await renderOutboundResult({\n            raw: results as string | Uint8Array | SpooledArtifact | Media | Media[],\n            callId: requestId,\n            inline: isArtifactTool,\n            spoolStore,\n            unsupportedResultMediaPolicy:\n              merged.unsupportedResultMediaPolicy ?? merged.unsupportedMediaPolicy ?? 'throw',\n          })\n        } catch (err) {\n          rendered = {\n            content: [{ type: 'text', text: isError(err) ? err.message : String(err) }],\n            isError: true,\n          }\n        }\n        writeCommand({\n          type: 'tool_call_response',\n          requestId,\n          results: { content: rendered.content, isError: toolHadError || rendered.isError },\n        })\n      }\n\n      await new Promise<void>((resolve) => {\n        const finish = (): void => resolve()\n        resolveIteration = finish\n\n        const onEvent = async (event: WrapperEvent): Promise<void> => {\n          if (event.type === 'ready') {\n            sawReady = true\n            maybeClearStartupTimer()\n            const runCommand: WrapperCommand = {\n              type: 'run',\n              prompt,\n              appendSystemPrompt: merged.appendSystemPrompt,\n              model: merged.model,\n              cwd: merged.cwd,\n              addDir: merged.addDir,\n              allowedTools: bridgedTools.map((t) => t.name),\n              maxBudgetUsd: merged.maxBudgetUsd,\n              fallbackModel: merged.fallbackModel,\n              auth: {\n                apiKey: merged.apiKey,\n                authToken: merged.authToken,\n                baseUrl: merged.baseURL,\n              },\n              disableTelemetry: merged.disableTelemetry,\n              disableErrorReporting: merged.disableErrorReporting,\n              disableNonessentialTraffic: merged.disableNonessentialTraffic,\n              mcpToolIdleTimeoutMs: merged.mcpToolIdleTimeoutMs,\n              claudeBin,\n              forwardSubagentText: merged.forwardSubagentText,\n              unsupportedResultMediaPolicy: String(\n                merged.unsupportedResultMediaPolicy ?? merged.unsupportedMediaPolicy ?? 'throw'\n              ),\n              bridgedTools,\n              extraArgs: merged.extraArgs,\n            }\n            writeCommand(runCommand)\n            armIdleTimer()\n            return\n          }\n          if (event.type === 'init') {\n            sawInit = true\n            maybeClearStartupTimer()\n            helpers.log.info({\n              kind: 'claude-init',\n              message: 'Claude Code CLI initialized.',\n              payload: event as unknown as Record<string, unknown>,\n            })\n            if (event.mcpServerErrors && event.mcpServerErrors.length > 0) {\n              settleOnce(() => {\n                finish()\n                void gracefulShutdown()\n                ctx.nack(\n                  new E_CLAUDE_CODE_CLI_MCP_BRIDGE_STARTUP_FAILED([\n                    event.mcpServerErrors!.join(', '),\n                  ])\n                )\n              })\n            }\n            return\n          }\n          if (event.type === 'retry') {\n            helpers.log.warn({\n              kind: 'claude-retry',\n              message: `Claude API retry, attempt ${event.attempt}`,\n              payload: event as unknown as Record<string, unknown>,\n            })\n            return\n          }\n          if (event.type === 'message_delta') {\n            currentMessageId = event.id\n            currentMessageBuffer += event.delta\n            helpers.reportMessage(event.id, event.delta, { isComplete: event.isComplete })\n            if (event.isComplete) {\n              await sealCurrentMessage()\n            }\n            return\n          }\n          if (event.type === 'thought_delta') {\n            helpers.reportThought(event.id, event.delta, { isComplete: event.isComplete })\n            return\n          }\n          if (event.type === 'tool_call_request') {\n            await handleToolCallRequest(event.requestId, event.tool, event.args)\n            return\n          }\n          if (event.type === 'result') {\n            sawTerminalEvent = true\n            await sealCurrentMessage()\n            settleOnce(() => {\n              if (event.isError && event.subtype !== 'error_max_turns') {\n                ctx.nack(\n                  new E_CLAUDE_CODE_CLI_TURN_FAILED([\n                    event.stopReason ?? 'unknown',\n                    event.resultText ?? '',\n                  ])\n                )\n                return\n              }\n              if (event.isError && event.subtype === 'error_max_turns') {\n                helpers.log.debug({\n                  kind: 'claude-max-turns-reached',\n                  message:\n                    'Claude reached the fixed single-turn limit; treating it as normal completion.',\n                  payload: { subtype: event.subtype },\n                })\n              }\n              helpers.reportGenerationStats({\n                provider: 'claude_code_cli',\n                model: merged.model,\n                raw: event.raw as Record<string, unknown> | undefined,\n              })\n              if (merged.autoAck) ctx.ack()\n            })\n            // The wrapper, not the adapter, initiates its own shutdown on this path (Decision D\n            // step 5) — a terminal NDJSON line proves the wrapper WROTE it, not that the OS\n            // process has actually exited yet. Await the wrapper's real exit before resolving so\n            // the executor doesn't return while the wrapper (and its `claude` grandchild) are\n            // still tearing down.\n            await Promise.resolve(child).catch(() => undefined)\n            finish()\n            return\n          }\n          if (event.type === 'error') {\n            settleOnce(() => {\n              finish()\n              void gracefulShutdown()\n              ctx.nack(new E_CLAUDE_CODE_CLI_WRAPPER_CRASHED([event.message]))\n            })\n            return\n          }\n          if (event.type === 'log') {\n            helpers.log[event.level]({\n              kind: event.kind,\n              message: event.message,\n              payload: event.payload as Record<string, unknown> | undefined,\n            })\n            return\n          }\n          // 'shutdown_complete' — nothing further to do; the wrapper is exiting on its own.\n        }\n\n        const eventReader = createNdjsonLineReader<WrapperEvent>((raw) => {\n          let event: WrapperEvent\n          try {\n            event = JSON.parse(raw) as WrapperEvent\n          } catch {\n            helpers.log.trace({\n              kind: 'malformed-wrapper-event',\n              message: 'Failed to parse wrapper event line; skipping.',\n              payload: { linePreview: raw.slice(0, 256) },\n            })\n            return undefined\n          }\n          void onEvent(event)\n          return event\n        })\n\n        child.stdout?.on('data', (chunk: Uint8Array) => {\n          // Parse BEFORE arming: `armIdleTimer()` is gated on `sawReady && sawInit`, and the very\n          // chunk that carries the `init` event is what flips `sawInit` — parsing first lets that\n          // same chunk's processing arm the timer immediately, rather than requiring a chunk AFTER\n          // init to ever arrive (which, on a genuinely idle stream, never happens).\n          eventReader.push(chunk)\n          armIdleTimer()\n        })\n        child.stdout?.on('end', () => {\n          // A terminal `result`/`error` event was already observed and its own handler is (or will\n          // shortly be) in the middle of its own `settleOnce` — defer to it rather than racing it\n          // with a wrong \"stdout ended without a terminal event\" nack for what was actually a\n          // successful turn. `sawTerminalEvent` is set synchronously by that handler before any\n          // `await`, so it is already true here whenever this really is that race.\n          if (sawTerminalEvent) return\n          settleOnce(() => {\n            finish()\n            ctx.nack(\n              new E_CLAUDE_CODE_CLI_PROCESS_EXITED_NONZERO([\n                0,\n                'stdout ended without a terminal event',\n              ])\n            )\n          })\n        })\n\n        void Promise.resolve(child)\n          .then((result: unknown) => {\n            // Same race as the `stdout.on('end')` guard above: the `result` handler may still be\n            // awaiting `sealCurrentMessage()`/the child's own exit when the wrapper process itself\n            // settles — defer to the terminal-event path rather than nacking a successful turn.\n            if (sawTerminalEvent) return\n            const exitCode =\n              isObject(result) && 'exitCode' in result\n                ? ((result as { exitCode: number | null }).exitCode ?? -1)\n                : -1\n            settleOnce(() => {\n              finish()\n              ctx.nack(\n                new E_CLAUDE_CODE_CLI_PROCESS_EXITED_NONZERO([\n                  exitCode,\n                  'wrapper process exited with no terminal event observed',\n                ])\n              )\n            })\n          })\n          .catch(() => {\n            if (sawTerminalEvent) return\n            settleOnce(() => {\n              finish()\n              ctx.nack(new E_CLAUDE_CODE_CLI_WRAPPER_CRASHED(['wrapper process rejected']))\n            })\n          })\n      })\n    }\n  }\n\n  /**\n   * Returns `true` when `value` is a {@link ClaudeCodeCliAdapter} instance.\n   */\n  public static isClaudeCodeCliAdapter(value: unknown): value is ClaudeCodeCliAdapter {\n    return isInstanceOf(value, 'ClaudeCodeCliAdapter', ClaudeCodeCliAdapter)\n  }\n}\n"],"mappings":"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"}