@tangle-network/agent-runtime 0.94.0 → 0.94.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/agent.js +4 -4
  2. package/dist/{agentic-generator-B8oeE2Yv.d.ts → agentic-generator-D9ZmAuiL.d.ts} +1 -1
  3. package/dist/candidate-execution/index.js +3 -3
  4. package/dist/{chunk-OO4EK3JB.js → chunk-D336OZHK.js} +6 -3
  5. package/dist/chunk-D336OZHK.js.map +1 -0
  6. package/dist/{chunk-4GBT4WQ6.js → chunk-HPCJBBLS.js} +2 -2
  7. package/dist/{chunk-RTVVH2KL.js → chunk-JEP2WM24.js} +2 -2
  8. package/dist/{chunk-55P6V5JT.js → chunk-K7OPNHU4.js} +2 -2
  9. package/dist/{chunk-7I2AOKCI.js → chunk-KHLE3C5G.js} +2 -2
  10. package/dist/{chunk-4E2GM63H.js → chunk-MZH4HORF.js} +2 -2
  11. package/dist/chunk-PJNGPWTA.js +634 -0
  12. package/dist/chunk-PJNGPWTA.js.map +1 -0
  13. package/dist/{chunk-MRYPFDHJ.js → chunk-RTSZNYXM.js} +3 -3
  14. package/dist/{chunk-H2D3DCEB.js → chunk-SJHFJOCY.js} +2 -2
  15. package/dist/{chunk-FHZHADIM.js → chunk-URMJTSXB.js} +52 -10
  16. package/dist/chunk-URMJTSXB.js.map +1 -0
  17. package/dist/{chunk-3D2RHC4K.js → chunk-WIPGQ4GT.js} +1 -1
  18. package/dist/{chunk-3D2RHC4K.js.map → chunk-WIPGQ4GT.js.map} +1 -1
  19. package/dist/{completion-gate-BDkEYB_-.d.ts → completion-gate-BAj3dXeW.d.ts} +14 -2
  20. package/dist/{coordination-EGoRbbsd.d.ts → coordination-B3ZuApR_.d.ts} +5 -3
  21. package/dist/environment-provider.d.ts +1 -1
  22. package/dist/{improve-ZzTEkpF_.d.ts → improve-r8SvIxYv.d.ts} +2 -2
  23. package/dist/index.d.ts +11 -11
  24. package/dist/index.js +11 -11
  25. package/dist/intelligence.d.ts +3 -3
  26. package/dist/intelligence.js +5 -5
  27. package/dist/knowledge.d.ts +5 -5
  28. package/dist/knowledge.js +4 -4
  29. package/dist/lifecycle.d.ts +3 -3
  30. package/dist/lifecycle.js +2 -2
  31. package/dist/{local-harness-dcD5WTTr.d.ts → local-harness-B7bNuNJw.d.ts} +49 -1
  32. package/dist/{loop-runner-bin-BRXC1RwC.d.ts → loop-runner-bin-D4bMIxmB.d.ts} +2 -2
  33. package/dist/loop-runner-bin.d.ts +5 -5
  34. package/dist/loop-runner-bin.js +5 -5
  35. package/dist/loops.d.ts +11 -11
  36. package/dist/loops.js +4 -4
  37. package/dist/mcp/bin.js +3 -3
  38. package/dist/mcp/index.d.ts +7 -7
  39. package/dist/mcp/index.js +7 -5
  40. package/dist/mcp/index.js.map +1 -1
  41. package/dist/{mcp-serve-verifier-Bg4C3p5S.d.ts → mcp-serve-verifier-BuXjaZDE.d.ts} +1 -1
  42. package/dist/{supervise-Gmf709kn.d.ts → supervise-DTNcLDl2.d.ts} +3 -3
  43. package/dist/{types-Cg_teUPO.d.ts → types-Bb-CqxJH.d.ts} +3 -0
  44. package/dist/{worktree-fanout-BrB4att3.d.ts → worktree-fanout-IMKqdV_E.d.ts} +13 -13
  45. package/package.json +1 -1
  46. package/dist/chunk-FHZHADIM.js.map +0 -1
  47. package/dist/chunk-OO4EK3JB.js.map +0 -1
  48. package/dist/chunk-PX6SXX3M.js +0 -146
  49. package/dist/chunk-PX6SXX3M.js.map +0 -1
  50. /package/dist/{chunk-4GBT4WQ6.js.map → chunk-HPCJBBLS.js.map} +0 -0
  51. /package/dist/{chunk-RTVVH2KL.js.map → chunk-JEP2WM24.js.map} +0 -0
  52. /package/dist/{chunk-55P6V5JT.js.map → chunk-K7OPNHU4.js.map} +0 -0
  53. /package/dist/{chunk-7I2AOKCI.js.map → chunk-KHLE3C5G.js.map} +0 -0
  54. /package/dist/{chunk-4E2GM63H.js.map → chunk-MZH4HORF.js.map} +0 -0
  55. /package/dist/{chunk-MRYPFDHJ.js.map → chunk-RTSZNYXM.js.map} +0 -0
  56. /package/dist/{chunk-H2D3DCEB.js.map → chunk-SJHFJOCY.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/local-harness.ts"],"sourcesContent":["/**\n *\n * Subprocess wrappers for the local coding-harness CLIs installed in the\n * sandbox image (claude-code, codex, opencode). Used by the in-process\n * delegation executor (`createInProcessExecutor`) so a delegated coding task\n * spawns a real harness on a real git worktree instead of provisioning a\n * sibling sandbox.\n *\n * All harness invocations:\n * - run with `cwd` set to the worktree\n * - inherit env from the parent (the MCP server inside the sandbox has\n * the harness's auth already)\n * - capture stdout/stderr\n * - support cancellation via AbortSignal\n * - enforce a wall-clock timeout\n *\n * @experimental\n */\n\nimport { type ChildProcess, spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { constants } from 'node:fs'\nimport { access, chmod, mkdtemp, rm, symlink, writeFile } from 'node:fs/promises'\nimport { homedir, tmpdir } from 'node:os'\nimport { basename, join } from 'node:path'\nimport type { AgentProfile } from '@tangle-network/agent-interface'\n\n/** Local coding harness available inside the sandbox. */\nexport type LocalHarness = 'claude' | 'codex' | 'opencode'\n\ntype ReasoningEffort = NonNullable<NonNullable<AgentProfile['model']>['reasoningEffort']>\n\nconst codexReasoningEffort: Record<ReasoningEffort, string> = {\n none: 'none',\n minimal: 'minimal',\n low: 'low',\n medium: 'medium',\n high: 'high',\n xhigh: 'xhigh',\n ultracode: 'xhigh',\n}\n\nfunction codexReasoningArgs(reasoningEffort: ReasoningEffort): string[] {\n const mapped = codexReasoningEffort[reasoningEffort]\n if (mapped === undefined) {\n throw new Error(\n `harnessInvocation: unsupported Codex reasoning effort ${String(reasoningEffort)}`,\n )\n }\n return ['-c', `model_reasoning_effort=\"${mapped}\"`]\n}\n\n/**\n * Default per-harness command + arg shape. `buildArgs` takes ONLY the task prompt and\n * emits the prompt-only invocation (no model, no system prompt) — the safe default shape\n * the in-process executor's `streamPrompt` drives. `modelArgs` maps a resolved model to\n * the harness's selector flag (every supported harness takes `-m <model>`). The §1.5\n * profile-aware mapper `harnessInvocation` composes these to thread the full\n * supervisor-authored profile (systemPrompt + model) into argv.\n */\nconst HARNESS_INVOCATIONS: Record<\n LocalHarness,\n {\n command: string\n buildArgs: (taskPrompt: string) => string[]\n /** Map a resolved model to the harness's model-selector flag. */\n modelArgs: (model: string) => string[]\n /** Map portable reasoning effort when the harness exposes a native control. */\n reasoningArgs?: (reasoningEffort: ReasoningEffort) => string[]\n }\n> = {\n claude: {\n command: 'claude',\n // `-p` IS headless/print mode; the old `--headless` flag was removed from the CLI.\n // Permission bypass is an explicit per-run opt-in below, never the public default.\n buildArgs: (taskPrompt) => ['-p', taskPrompt],\n modelArgs: (model) => ['-m', model],\n },\n codex: {\n command: 'codex',\n buildArgs: (taskPrompt) => ['exec', taskPrompt],\n modelArgs: (model) => ['-m', model],\n reasoningArgs: codexReasoningArgs,\n },\n opencode: {\n command: 'opencode',\n buildArgs: (taskPrompt) => ['run', taskPrompt],\n modelArgs: (model) => ['-m', model],\n },\n}\n\n/** Result of mapping an `AgentProfile` + task prompt onto a harness invocation. */\nexport interface HarnessInvocation {\n command: string\n args: string[]\n}\n\nexport interface HarnessInvocationOptions {\n /** Allow an unattended Claude process to edit its isolated candidate worktree.\n * Ignored by harnesses that do not use Claude's permission prompt. */\n dangerouslySkipPermissions?: boolean\n /** Run Codex with benchmark-safe process controls and JSONL usage output.\n * Valid only for the Codex harness. */\n codexReproducible?: boolean\n}\n\nconst CODEX_REPRODUCIBLE_ARGS = [\n '--ephemeral',\n '--ignore-rules',\n '--json',\n '-c',\n 'approval_policy=\"never\"',\n '-c',\n 'web_search=\"disabled\"',\n '-c',\n 'project_doc_max_bytes=0',\n '-c',\n 'skills.include_instructions=false',\n '-c',\n 'include_apps_instructions=false',\n '--disable',\n 'tool_suggest',\n '-c',\n 'features.multi_agent_v2.root_agent_usage_hint_text=\"\"',\n '-c',\n 'features.multi_agent_v2.subagent_usage_hint_text=\"\"',\n '-c',\n 'features.multi_agent_v2.multi_agent_mode_hint_text=\"\"',\n '--strict-config',\n] as const\n\nfunction buildHarnessArgs(\n harness: LocalHarness,\n taskPrompt: string,\n options: HarnessInvocationOptions = {},\n): string[] {\n const args = HARNESS_INVOCATIONS[harness].buildArgs(taskPrompt)\n if (harness === 'claude' && options.dangerouslySkipPermissions) {\n args.push('--dangerously-skip-permissions')\n }\n if (options.codexReproducible) {\n if (harness !== 'codex') {\n throw new Error('harnessInvocation: codexReproducible requires the Codex harness')\n }\n args.push(...CODEX_REPRODUCIBLE_ARGS)\n }\n return args\n}\n\n/**\n * Map a supervisor-authored `AgentProfile` + the per-task prompt onto a concrete harness\n * `command` + `args` (the §1.5 fix). UNLIKE the prompt-only `HARNESS_INVOCATIONS.buildArgs`\n * — which drops both the authored model and the system prompt — this threads the FULL\n * profile payload into argv:\n *\n * - `profile.prompt.systemPrompt` → the PROMPT channel: a portable, harness-agnostic\n * default that prepends the system prompt above the task prompt (`<system>\\n\\n<task>`),\n * so the authored standing instructions reach EVERY harness (none of the three CLIs\n * expose a portable replace-system-prompt flag for a one-shot non-interactive run).\n * - `profile.prompt.instructions[]` → appended prompt sections in authored order.\n * - `profile.model.default` → the harness's `-m <model>` selector.\n *\n * The task prompt alone is the floor; an empty/absent profile yields exactly the legacy\n * `buildArgs(taskPrompt)` shape so existing callers are byte-identical.\n */\nexport function harnessInvocation(\n harness: LocalHarness,\n profile: AgentProfile,\n taskPrompt: string,\n options: HarnessInvocationOptions = {},\n): HarnessInvocation {\n const invocation = HARNESS_INVOCATIONS[harness]\n if (!invocation) {\n throw new Error(`harnessInvocation: unknown harness ${String(harness)}`)\n }\n\n if (options.codexReproducible) {\n const model = profile.model?.default\n if (typeof model !== 'string' || model.trim().length === 0) {\n throw new Error('harnessInvocation: codexReproducible requires profile.model.default')\n }\n if (profile.model?.reasoningEffort === undefined) {\n throw new Error('harnessInvocation: codexReproducible requires profile.model.reasoningEffort')\n }\n }\n\n const systemPrompt = profile.prompt?.systemPrompt\n const instructions = profile.prompt?.instructions\n if (\n instructions !== undefined &&\n (!Array.isArray(instructions) ||\n instructions.some((instruction) => typeof instruction !== 'string'))\n ) {\n throw new Error('harnessInvocation: profile.prompt.instructions must be an array of strings')\n }\n const promptSections = [\n ...(typeof systemPrompt === 'string' && systemPrompt.trim().length > 0 ? [systemPrompt] : []),\n ...(instructions?.filter((instruction) => instruction.trim().length > 0) ?? []),\n taskPrompt,\n ]\n const composedPrompt = promptSections.join('\\n\\n')\n\n const args = buildHarnessArgs(harness, composedPrompt, options)\n\n const model = profile.model?.default\n if (typeof model === 'string' && model.length > 0) {\n args.push(...invocation.modelArgs(model))\n }\n\n const reasoningEffort = profile.model?.reasoningEffort\n if (reasoningEffort !== undefined && invocation.reasoningArgs) {\n args.push(...invocation.reasoningArgs(reasoningEffort))\n }\n\n return { command: invocation.command, args }\n}\n\n/** @experimental */\nexport interface RunLocalHarnessOptions {\n harness: LocalHarness\n /** Working directory for the subprocess (typically a worktree path). */\n cwd: string\n /** Prompt forwarded as the harness CLI's task argument. */\n taskPrompt: string\n /**\n * Pre-built command + args (e.g. from `harnessInvocation` so the full authored\n * `AgentProfile` — systemPrompt + model — reaches the harness). When set it OVERRIDES the\n * default prompt-only `buildArgs(taskPrompt)` path; `command` defaults to the harness's\n * default binary when only `args` is supplied. When absent the legacy prompt-only shape\n * is used unchanged.\n */\n invocation?: { command?: string; args: ReadonlyArray<string> }\n /** Allow autonomous Claude edits without an interactive permission prompt.\n * Use only when `cwd` is an isolated candidate worktree. */\n dangerouslySkipPermissions?: boolean\n /** Isolate Codex from ambient configuration/instructions and require JSONL token usage.\n * The invocation should come from `harnessInvocation(..., { codexReproducible: true })`. */\n codexReproducible?: boolean\n /** Wall-clock kill deadline (ms). Default 5 min. Subprocess SIGTERMed on expiry. */\n timeoutMs?: number\n /** Caller cancellation. SIGTERM is sent on abort. */\n signal?: AbortSignal\n /** Override env (defaults to inheriting from the parent). */\n env?: NodeJS.ProcessEnv\n /**\n * Test seam — inject a custom spawner so unit tests can mock the\n * subprocess without touching the OS. Defaults to node's `child_process.spawn`.\n */\n spawn?: (\n command: string,\n args: ReadonlyArray<string>,\n opts: {\n cwd: string\n env: NodeJS.ProcessEnv\n stdio: 'pipe'\n },\n ) => ChildProcess\n}\n\n/** Exact aggregate usage emitted by Codex's terminal `turn.completed` JSONL event. */\nexport interface CodexTokenUsage {\n inputTokens: number\n cachedInputTokens: number\n outputTokens: number\n reasoningOutputTokens: number\n}\n\n/** Isolation settings asserted before a reproducible Codex run is allowed to start. */\nexport interface CodexExecutionPolicy {\n sessionPersistence: 'ephemeral'\n userConfig: false\n rules: false\n projectInstructions: false\n skillInstructions: false\n appInstructions: false\n toolSuggestions: false\n multiAgentInstructions: false\n sandbox: 'workspace-write'\n permissionProfile: 'agent_runtime_reproducible'\n approvalPolicy: 'never'\n shellNetwork: false\n webSearch: false\n serviceTier: 'default'\n shellEnvironment: 'core-filtered'\n loginShell: false\n credentialsReadable: false\n parentRepoRead: false\n gitMetadata: false\n temporaryDirectory: 'workspace-private'\n containerSockets: false\n}\n\n/** Zero-model-call evidence for the exact Codex process about to run. */\nexport interface CodexExecutionEvidence {\n cliVersion: string\n effectivePromptSha256: string\n nonPromptArgsSha256: string\n controlledConfigSha256: string\n policy: CodexExecutionPolicy\n}\n\n/** @experimental */\nexport interface LocalHarnessResult {\n /** OS exit code. `null` when killed before exit. */\n exitCode: number | null\n /** Concatenated stdout. */\n stdout: string\n /** Concatenated stderr. */\n stderr: string\n /** Set when the process exited via signal (timeout / abort). */\n killedBySignal: NodeJS.Signals | null\n /** Wall-clock duration ms (spawn → exit). */\n durationMs: number\n /** Set when timeoutMs elapsed before exit. */\n timedOut: boolean\n /** Present for a reproducible Codex run; parsed from the real terminal JSONL event. */\n usage?: CodexTokenUsage\n /** Present for reproducible Codex runs; generated and checked before model execution. */\n evidence?: CodexExecutionEvidence\n}\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000\n\n/**\n * Spawn a local coding harness CLI as a subprocess + collect its output.\n *\n * NOT responsible for parsing the harness's output or extracting a diff —\n * the in-process executor's `streamPrompt` orchestrates `git diff` against\n * the worktree after this resolves. This function is intentionally narrow:\n * spawn, wait, capture, return.\n *\n * Fails loud — throws when:\n * - `cwd` doesn't exist (subprocess emits ENOENT; surfaced as Error)\n * - the harness binary is not on PATH (ENOENT)\n *\n * Does NOT throw when:\n * - the subprocess exits non-zero (`result.exitCode` carries the code)\n * - the subprocess is aborted / timed out (`result.killedBySignal` /\n * `result.timedOut` carries the reason)\n *\n * @experimental\n */\nexport async function runLocalHarness(\n options: RunLocalHarnessOptions,\n): Promise<LocalHarnessResult> {\n const { harness, cwd, taskPrompt } = options\n if (options.codexReproducible && harness !== 'codex') {\n throw new Error('runLocalHarness: codexReproducible requires the Codex harness')\n }\n if (options.codexReproducible && process.platform !== 'linux') {\n throw new Error('runLocalHarness: codexReproducible currently requires Linux')\n }\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const spawnImpl = options.spawn ?? spawn\n\n const invocation = HARNESS_INVOCATIONS[harness]\n if (!invocation) {\n throw new Error(`runLocalHarness: unknown harness ${String(harness)}`)\n }\n\n const startedAt = Date.now()\n const command = options.invocation?.command ?? invocation.command\n const args = options.invocation\n ? [...options.invocation.args]\n : buildHarnessArgs(harness, taskPrompt, options)\n if (options.codexReproducible) assertCodexReproducibleInvocation(command, args)\n\n const baseEnv = options.env ?? process.env\n const isolated = options.codexReproducible\n ? await isolateCodexHome(baseEnv, cwd)\n : {\n env: baseEnv,\n cleanup: async () => undefined,\n controlledConfigSha256: '',\n ambientAuth: '',\n isolatedAuth: '',\n writeProbe: '',\n }\n const env = isolated.env\n\n try {\n const evidence = options.codexReproducible\n ? await collectCodexExecutionEvidence({\n command,\n args,\n cwd,\n env,\n spawn: spawnImpl,\n controlledConfigSha256: isolated.controlledConfigSha256,\n ambientAuth: isolated.ambientAuth,\n isolatedAuth: isolated.isolatedAuth,\n writeProbe: isolated.writeProbe,\n ...(options.signal ? { signal: options.signal } : {}),\n })\n : undefined\n return await new Promise<LocalHarnessResult>((resolve, reject) => {\n let child: ChildProcess\n try {\n child = spawnImpl(command, args, { cwd, env, stdio: 'pipe' })\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n return\n }\n\n // The harness takes its task as an argv arg, not on stdin. Leaving stdin\n // OPEN makes a non-TTY `opencode run` (and likely the other harnesses)\n // BLOCK forever waiting on input — zero output, SIGTERM at the wall cap,\n // empty patch -> \"no candidate passed validation\". Close stdin so the\n // subprocess sees EOF and proceeds (the `cliExecutor` leaf does the same).\n child.stdin?.end()\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n let settled = false\n\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n if (!child.killed) child.kill('SIGTERM')\n }, timeoutMs)\n : null\n if (timer && typeof (timer as { unref?: () => void }).unref === 'function') {\n ;(timer as { unref: () => void }).unref()\n }\n\n const onAbort = () => {\n if (!child.killed) child.kill('SIGTERM')\n }\n if (options.signal) {\n if (options.signal.aborted) onAbort()\n else options.signal.addEventListener('abort', onAbort, { once: true })\n }\n\n child.stdout?.on('data', (chunk) => {\n stdout += String(chunk)\n })\n child.stderr?.on('data', (chunk) => {\n stderr += String(chunk)\n })\n\n const finalize = (result: LocalHarnessResult) => {\n if (settled) return\n settled = true\n if (timer) clearTimeout(timer)\n options.signal?.removeEventListener('abort', onAbort)\n resolve(result)\n }\n\n child.on('error', (err) => {\n if (settled) return\n settled = true\n if (timer) clearTimeout(timer)\n options.signal?.removeEventListener('abort', onAbort)\n reject(err)\n })\n\n child.on('close', (code, signal) => {\n try {\n const usage = options.codexReproducible ? parseCodexTokenUsage(stdout) : undefined\n finalize({\n exitCode: code,\n stdout,\n stderr: redactCodexHome(stderr, env.CODEX_HOME),\n killedBySignal: signal,\n durationMs: Date.now() - startedAt,\n timedOut,\n ...(usage ? { usage } : {}),\n ...(evidence ? { evidence } : {}),\n })\n } catch (err) {\n if (settled) return\n settled = true\n if (timer) clearTimeout(timer)\n options.signal?.removeEventListener('abort', onAbort)\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n } finally {\n await isolated.cleanup()\n }\n}\n\nconst CODEX_EXECUTION_POLICY: CodexExecutionPolicy = {\n sessionPersistence: 'ephemeral',\n userConfig: false,\n rules: false,\n projectInstructions: false,\n skillInstructions: false,\n appInstructions: false,\n toolSuggestions: false,\n multiAgentInstructions: false,\n sandbox: 'workspace-write',\n permissionProfile: 'agent_runtime_reproducible',\n approvalPolicy: 'never',\n shellNetwork: false,\n webSearch: false,\n serviceTier: 'default',\n shellEnvironment: 'core-filtered',\n loginShell: false,\n credentialsReadable: false,\n parentRepoRead: false,\n gitMetadata: false,\n temporaryDirectory: 'workspace-private',\n containerSockets: false,\n}\n\nconst FORBIDDEN_CODEX_PROMPT_MARKERS = [\n '<skills_instructions>',\n '# AGENTS.md instructions',\n '<apps_instructions>',\n '<recommended_plugins>',\n '<multi_agent_mode>',\n 'You are `/root`, the primary agent',\n] as const\n\nasync function collectCodexExecutionEvidence(opts: {\n command: string\n args: string[]\n cwd: string\n env: NodeJS.ProcessEnv\n spawn: NonNullable<RunLocalHarnessOptions['spawn']>\n controlledConfigSha256: string\n ambientAuth: string\n isolatedAuth: string\n writeProbe: string\n signal?: AbortSignal\n}): Promise<CodexExecutionEvidence> {\n assertCodexReproducibleInvocation(opts.command, opts.args)\n const prompt = opts.args[1]\n if (opts.args[0] !== 'exec' || typeof prompt !== 'string' || prompt.length === 0) {\n throw new Error('runLocalHarness: reproducible Codex invocation must be codex exec <prompt>')\n }\n const cliVersion = (await runCodexProbe(opts, ['--version'])).stdout.trim()\n if (!/^codex-cli \\d+\\.\\d+\\.\\d+(?:[-+].+)?$/.test(cliVersion)) {\n throw new Error(\n `runLocalHarness: unexpected Codex CLI version output ${JSON.stringify(cliVersion)}`,\n )\n }\n\n const hiddenEnvironmentChecks = [\n 'CODEX_HOME',\n 'CODEX_ACCESS_TOKEN',\n 'CODEX_API_KEY',\n 'OPENAI_API_KEY',\n ]\n .map((name) => `test -z \"\\${${name}:-}\"`)\n .join(' && ')\n const sandboxProof = [\n hiddenEnvironmentChecks,\n 'test -r .',\n 'touch \"$1\"',\n 'rm \"$1\"',\n '! test -r \"$2\"',\n '! test -r \"$3\"',\n '! test -r \"$4\"',\n 'touch \"$TMPDIR/.agent-runtime-tmp-proof\"',\n 'rm \"$TMPDIR/.agent-runtime-tmp-proof\"',\n ].join(' && ')\n await runCodexProbe(opts, [\n 'sandbox',\n '-P',\n CODEX_PERMISSION_PROFILE,\n '-C',\n opts.cwd,\n 'sh',\n '-c',\n sandboxProof,\n 'sh',\n opts.writeProbe,\n opts.ambientAuth,\n opts.isolatedAuth,\n join(homedir(), 'code'),\n ])\n await runCodexProbe(opts, [\n 'sandbox',\n '-P',\n CODEX_PERMISSION_PROFILE,\n '-C',\n opts.cwd,\n 'python3',\n '-c',\n 'import socket,sys\\nfor path in sys.argv[1:]:\\n s=socket.socket(socket.AF_UNIX)\\n try: s.connect(path)\\n except OSError: continue\\n raise SystemExit(1)',\n '/var/run/docker.sock',\n '/run/docker.sock',\n '/var/run/containerd/containerd.sock',\n '/run/containerd/containerd.sock',\n ])\n\n const debugArgs = codexPromptDebugArgs(opts.args, prompt)\n const renderedPrompt = (await runCodexProbe(opts, debugArgs)).stdout\n let parsedPrompt: unknown\n try {\n parsedPrompt = JSON.parse(renderedPrompt)\n } catch {\n throw new Error('runLocalHarness: codex debug prompt-input returned invalid JSON')\n }\n if (!Array.isArray(parsedPrompt) || !jsonTextContains(parsedPrompt, prompt)) {\n throw new Error('runLocalHarness: Codex prompt evidence did not contain the exact task prompt')\n }\n const promptContextWithoutTask = JSON.stringify(redactJsonText(parsedPrompt, prompt))\n for (const marker of FORBIDDEN_CODEX_PROMPT_MARKERS) {\n if (promptContextWithoutTask.includes(marker)) {\n throw new Error(`runLocalHarness: Codex prompt evidence contains forbidden marker ${marker}`)\n }\n }\n for (const marker of ['<permissions instructions>', '<environment_context>']) {\n if (!renderedPrompt.includes(marker)) {\n throw new Error(`runLocalHarness: Codex prompt evidence is missing required marker ${marker}`)\n }\n }\n\n const nonPromptArgs = [\n opts.command,\n ...opts.args.map((arg, index) => (index === 1 ? '<PROMPT>' : arg)),\n ]\n return {\n cliVersion,\n effectivePromptSha256: sha256(renderedPrompt),\n nonPromptArgsSha256: sha256(JSON.stringify(nonPromptArgs)),\n controlledConfigSha256: opts.controlledConfigSha256,\n policy: { ...CODEX_EXECUTION_POLICY },\n }\n}\n\nfunction assertCodexReproducibleInvocation(command: string, args: string[]): void {\n const executable = basename(command)\n if (executable !== 'codex' && executable !== 'codex.exe') {\n throw new Error('runLocalHarness: reproducible Codex invocation must use the Codex executable')\n }\n const prompt = args[1]\n const expectedPrefix = ['exec', prompt, ...CODEX_REPRODUCIBLE_ARGS]\n const hasExactPrefix = expectedPrefix.every((arg, index) => args[index] === arg)\n const tail = args.slice(expectedPrefix.length)\n const validModel =\n tail[0] === '-m' &&\n typeof tail[1] === 'string' &&\n tail[1].length > 0 &&\n !tail[1].startsWith('-')\n const validReasoning =\n tail[2] === '-c' &&\n typeof tail[3] === 'string' &&\n /^model_reasoning_effort=\"(?:none|minimal|low|medium|high|xhigh)\"$/.test(tail[3])\n if (!hasExactPrefix || tail.length !== 4 || !validModel || !validReasoning) {\n throw new Error(\n 'runLocalHarness: reproducible Codex invocation does not match the required isolated argv',\n )\n }\n}\n\nfunction codexPromptDebugArgs(execArgs: string[], prompt: string): string[] {\n const debugArgs = ['debug', 'prompt-input']\n for (let index = 2; index < execArgs.length; index += 1) {\n const arg = execArgs[index]\n const value = execArgs[index + 1]\n if (arg === '-c' && value !== undefined) {\n debugArgs.push('-c', value)\n index += 1\n } else if (arg === '--disable' && value !== undefined) {\n debugArgs.push('--disable', value)\n index += 1\n } else if (arg === '-m' && value !== undefined) {\n debugArgs.push('-c', `model=${JSON.stringify(value)}`)\n index += 1\n } else if (arg === '-s' && value !== undefined) {\n debugArgs.push('-c', `sandbox_mode=${JSON.stringify(value)}`)\n index += 1\n }\n }\n debugArgs.push(prompt)\n return debugArgs\n}\n\nfunction runCodexProbe(\n opts: {\n command: string\n cwd: string\n env: NodeJS.ProcessEnv\n spawn: NonNullable<RunLocalHarnessOptions['spawn']>\n signal?: AbortSignal\n },\n args: string[],\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n let child: ChildProcess\n try {\n child = opts.spawn(opts.command, args, { cwd: opts.cwd, env: opts.env, stdio: 'pipe' })\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n return\n }\n child.stdin?.end()\n let stdout = ''\n let stderr = ''\n let settled = false\n const timer = setTimeout(() => {\n if (!child.killed) child.kill('SIGTERM')\n }, 10_000)\n timer.unref?.()\n const onAbort = () => {\n if (!child.killed) child.kill('SIGTERM')\n }\n if (opts.signal) {\n if (opts.signal.aborted) onAbort()\n else opts.signal.addEventListener('abort', onAbort, { once: true })\n }\n child.stdout?.on('data', (chunk) => {\n stdout += String(chunk)\n })\n child.stderr?.on('data', (chunk) => {\n stderr += String(chunk)\n })\n child.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n opts.signal?.removeEventListener('abort', onAbort)\n reject(err)\n })\n child.on('close', (code, signal) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n opts.signal?.removeEventListener('abort', onAbort)\n if (code !== 0) {\n const safeStderr = redactCodexHome(stderr, opts.env.CODEX_HOME)\n reject(\n new Error(\n `runLocalHarness: Codex evidence probe failed (exit ${String(code)}, signal ${String(signal)}): ${safeStderr.trim()}`,\n ),\n )\n return\n }\n resolve({ stdout, stderr })\n })\n })\n}\n\nfunction redactCodexHome(value: string, codexHome: string | undefined): string {\n return codexHome ? value.replaceAll(codexHome, '<ISOLATED_CODEX_HOME>') : value\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction jsonTextContains(value: unknown, needle: string): boolean {\n if (typeof value === 'string') return value.includes(needle)\n if (Array.isArray(value)) return value.some((item) => jsonTextContains(item, needle))\n if (isRecord(value)) return Object.values(value).some((item) => jsonTextContains(item, needle))\n return false\n}\n\nfunction redactJsonText(value: unknown, text: string): unknown {\n if (typeof value === 'string') return value.replaceAll(text, '')\n if (Array.isArray(value)) return value.map((item) => redactJsonText(item, text))\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, redactJsonText(item, text)]),\n )\n }\n return value\n}\n\nconst CODEX_AUTH_ENV = ['CODEX_ACCESS_TOKEN', 'CODEX_API_KEY', 'OPENAI_API_KEY'] as const\n\nconst CODEX_PERMISSION_PROFILE = 'agent_runtime_reproducible'\n\nasync function isolateCodexHome(\n baseEnv: NodeJS.ProcessEnv,\n cwd: string,\n): Promise<{\n env: NodeJS.ProcessEnv\n cleanup: () => Promise<void>\n controlledConfigSha256: string\n ambientAuth: string\n isolatedAuth: string\n writeProbe: string\n}> {\n const isolatedHome = await mkdtemp(join(tmpdir(), 'agent-runtime-codex-'))\n await chmod(isolatedHome, 0o700)\n let workspaceTemp = ''\n const writeProbe = join(cwd, '.agent-runtime-sandbox-write-proof')\n const cleanup = async () => {\n await Promise.all([\n rm(writeProbe, { force: true }),\n ...(workspaceTemp ? [rm(workspaceTemp, { recursive: true, force: true })] : []),\n rm(isolatedHome, { recursive: true, force: true }),\n ])\n }\n try {\n workspaceTemp = await mkdtemp(join(cwd, '.agent-runtime-tmp-'))\n await chmod(workspaceTemp, 0o700)\n const ambientHome = baseEnv.CODEX_HOME?.trim() || join(homedir(), '.codex')\n const ambientAuth = join(ambientHome, 'auth.json')\n const isolatedAuth = join(isolatedHome, 'auth.json')\n let linkedAuth = false\n try {\n await access(ambientAuth, constants.R_OK)\n await symlink(ambientAuth, isolatedAuth)\n linkedAuth = true\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err\n }\n if (!linkedAuth && !CODEX_AUTH_ENV.some((name) => Boolean(baseEnv[name]))) {\n throw new Error(\n 'runLocalHarness: reproducible Codex mode requires readable auth.json or an API token environment variable',\n )\n }\n const controlledConfig = codexControlledConfig({\n ambientHome,\n ambientTmp: baseEnv.TMPDIR?.trim() || tmpdir(),\n workspaceTemp,\n })\n await writeFile(join(isolatedHome, 'config.toml'), controlledConfig, { mode: 0o600 })\n return {\n env: { ...baseEnv, CODEX_HOME: isolatedHome },\n cleanup,\n controlledConfigSha256: sha256(controlledConfig),\n ambientAuth,\n isolatedAuth,\n writeProbe,\n }\n } catch (err) {\n await cleanup()\n throw err\n }\n}\n\nfunction codexControlledConfig(opts: {\n ambientHome: string\n ambientTmp: string\n workspaceTemp: string\n}): string {\n const home = homedir()\n const deniedPaths = [\n opts.ambientHome,\n opts.ambientTmp,\n join(home, 'code'),\n join(home, 'company'),\n join(home, '.ssh'),\n join(home, '.aws'),\n join(home, '.config'),\n join(home, '.cache'),\n join(home, '.docker'),\n join(home, '.kube'),\n join(home, '.gnupg'),\n join(home, '.pki'),\n join(home, '.npmrc'),\n join(home, '.netrc'),\n join(home, '.git-credentials'),\n '/run/docker',\n '/run/containerd',\n opts.workspaceTemp,\n ]\n const filesystemRules = deniedPaths\n .map(\n (path) => `${JSON.stringify(path)} = ${path === opts.workspaceTemp ? '\"write\"' : '\"deny\"'}`,\n )\n .join('\\n')\n return `default_permissions = \"${CODEX_PERMISSION_PROFILE}\"\napproval_policy = \"never\"\nallow_login_shell = false\nservice_tier = \"default\"\n\n[shell_environment_policy]\ninherit = \"core\"\nignore_default_excludes = false\nexclude = [\"^CODEX_HOME$\", \"(?i).*TOKEN.*\", \"(?i).*KEY.*\", \"(?i).*SECRET.*\", \"(?i).*PASSWORD.*\", \"(?i).*CREDENTIAL.*\", \"(?i).*AUTH.*\", \"(?i).*COOKIE.*\"]\nset = { TMPDIR = ${JSON.stringify(opts.workspaceTemp)} }\n\n[permissions.${CODEX_PERMISSION_PROFILE}]\nextends = \":workspace\"\n\n[permissions.${CODEX_PERMISSION_PROFILE}.filesystem]\n${filesystemRules}\n\":slash_tmp\" = \"deny\"\n\n[permissions.${CODEX_PERMISSION_PROFILE}.filesystem.\":workspace_roots\"]\n\".\" = \"write\"\n\n[permissions.${CODEX_PERMISSION_PROFILE}.network]\nenabled = false\n\n[permissions.${CODEX_PERMISSION_PROFILE}.network.unix_sockets]\n\"/var/run/docker.sock\" = \"deny\"\n\"/run/docker.sock\" = \"deny\"\n\"/var/run/containerd/containerd.sock\" = \"deny\"\n\"/run/containerd/containerd.sock\" = \"deny\"\n`\n}\n\n/** Parse and validate the one terminal usage event emitted by `codex exec --json`. */\nexport function parseCodexTokenUsage(stdout: string): CodexTokenUsage {\n const completed: unknown[] = []\n for (const [index, line] of stdout.split(/\\r?\\n/).entries()) {\n if (line.trim().length === 0) continue\n let event: unknown\n try {\n event = JSON.parse(line)\n } catch {\n throw new Error(`runLocalHarness: Codex JSONL line ${index + 1} is not valid JSON`)\n }\n if (isRecord(event) && event.type === 'turn.completed') completed.push(event)\n }\n if (completed.length !== 1) {\n throw new Error(\n `runLocalHarness: expected exactly one Codex turn.completed usage event, received ${completed.length}`,\n )\n }\n const event = completed[0]\n if (!isRecord(event) || !isRecord(event.usage)) {\n throw new Error('runLocalHarness: Codex turn.completed event is missing usage')\n }\n const usage = event.usage\n const inputTokens = naturalNumber(usage.input_tokens, 'input_tokens')\n const cachedInputTokens = naturalNumber(usage.cached_input_tokens, 'cached_input_tokens')\n const outputTokens = naturalNumber(usage.output_tokens, 'output_tokens')\n const reasoningOutputTokens = naturalNumber(\n usage.reasoning_output_tokens,\n 'reasoning_output_tokens',\n )\n if (cachedInputTokens > inputTokens) {\n throw new Error('runLocalHarness: Codex cached_input_tokens exceeds input_tokens')\n }\n if (reasoningOutputTokens > outputTokens) {\n throw new Error('runLocalHarness: Codex reasoning_output_tokens exceeds output_tokens')\n }\n return { inputTokens, cachedInputTokens, outputTokens, reasoningOutputTokens }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction naturalNumber(value: unknown, field: string): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {\n throw new Error(`runLocalHarness: Codex usage.${field} must be a non-negative safe integer`)\n }\n return value\n}\n"],"mappings":"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","names":["model","event"]}
@@ -5,13 +5,13 @@ import {
5
5
  definePersona,
6
6
  runPersonified,
7
7
  worktreeFanout
8
- } from "./chunk-OO4EK3JB.js";
8
+ } from "./chunk-D336OZHK.js";
9
9
  import {
10
10
  runAnalystLoop
11
11
  } from "./chunk-ZQZX77MM.js";
12
12
  import {
13
13
  createExecutorRegistry
14
- } from "./chunk-FHZHADIM.js";
14
+ } from "./chunk-URMJTSXB.js";
15
15
  import {
16
16
  ConfigError
17
17
  } from "./chunk-YEJR7IXO.js";
@@ -196,4 +196,4 @@ export {
196
196
  runLoopRunnerCli,
197
197
  parseLoopRunnerArgv
198
198
  };
199
- //# sourceMappingURL=chunk-MRYPFDHJ.js.map
199
+ //# sourceMappingURL=chunk-RTSZNYXM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  agenticGenerator
3
- } from "./chunk-RTVVH2KL.js";
3
+ } from "./chunk-JEP2WM24.js";
4
4
  import {
5
5
  assertModelAllowed
6
6
  } from "./chunk-ISTDY47H.js";
@@ -532,4 +532,4 @@ export {
532
532
  applyImprovementWinnerToProfile,
533
533
  improve
534
534
  };
535
- //# sourceMappingURL=chunk-H2D3DCEB.js.map
535
+ //# sourceMappingURL=chunk-SJHFJOCY.js.map
@@ -9,7 +9,7 @@ import {
9
9
  InMemoryResultBlobStore,
10
10
  InMemorySpawnJournal,
11
11
  contentAddress
12
- } from "./chunk-3D2RHC4K.js";
12
+ } from "./chunk-WIPGQ4GT.js";
13
13
  import {
14
14
  providerAsExecutor,
15
15
  resolveAgentEnvironmentProvider
@@ -33,7 +33,7 @@ import {
33
33
  import {
34
34
  harnessInvocation,
35
35
  runLocalHarness
36
- } from "./chunk-PX6SXX3M.js";
36
+ } from "./chunk-PJNGPWTA.js";
37
37
  import {
38
38
  AgentEvalError,
39
39
  ConfigError,
@@ -620,6 +620,7 @@ function clampSpend(spend, budget) {
620
620
  output: Math.floor(spend.tokens.output * ratio)
621
621
  } : spend.tokens,
622
622
  usd: budget.maxUsd === void 0 ? spend.usd : Math.min(spend.usd, budget.maxUsd),
623
+ ...spend.usdKnown === false ? { usdKnown: false } : {},
623
624
  ms: spend.ms
624
625
  };
625
626
  }
@@ -1980,13 +1981,15 @@ async function runWorktreeHarness(opts) {
1980
1981
  const { command, args } = harnessInvocation(opts.harness, opts.profile, opts.taskPrompt, {
1981
1982
  // This helper created the candidate worktree above; autonomous Claude
1982
1983
  // edits are permitted only inside that isolated checkout.
1983
- dangerouslySkipPermissions: opts.harness === "claude"
1984
+ dangerouslySkipPermissions: opts.harness === "claude",
1985
+ ...opts.codexReproducible ? { codexReproducible: true } : {}
1984
1986
  });
1985
1987
  const harnessResult = await runHarness({
1986
1988
  harness: opts.harness,
1987
1989
  cwd: worktree.path,
1988
1990
  taskPrompt: opts.taskPrompt,
1989
1991
  invocation: { command, args },
1992
+ ...opts.codexReproducible ? { codexReproducible: true } : {},
1990
1993
  ...opts.harnessTimeoutMs !== void 0 ? { timeoutMs: opts.harnessTimeoutMs } : {},
1991
1994
  ...opts.signal ? { signal: opts.signal } : {}
1992
1995
  });
@@ -2014,7 +2017,15 @@ async function runWorktreeHarness(opts) {
2014
2017
  killedBySignal: harnessResult.killedBySignal,
2015
2018
  durationMs: harnessResult.durationMs,
2016
2019
  stdout: harnessResult.stdout,
2017
- stderr: harnessResult.stderr
2020
+ stderr: harnessResult.stderr,
2021
+ ...harnessResult.usage ? { usage: harnessResult.usage } : {},
2022
+ ...harnessResult.evidence ? {
2023
+ cliVersion: harnessResult.evidence.cliVersion,
2024
+ effectivePromptSha256: harnessResult.evidence.effectivePromptSha256,
2025
+ nonPromptArgsSha256: harnessResult.evidence.nonPromptArgsSha256,
2026
+ controlledConfigSha256: harnessResult.evidence.controlledConfigSha256,
2027
+ executionPolicy: harnessResult.evidence.policy
2028
+ } : {}
2018
2029
  },
2019
2030
  ...checks ? { checks } : {}
2020
2031
  };
@@ -2082,9 +2093,17 @@ function createWorktreeCliExecutor(options) {
2082
2093
  if (typeof options.taskPrompt !== "string" || options.taskPrompt.length === 0) {
2083
2094
  throw new ValidationError("createWorktreeCliExecutor: taskPrompt required");
2084
2095
  }
2096
+ if (options.codexReproducible && options.harness !== "codex") {
2097
+ throw new ValidationError(
2098
+ 'createWorktreeCliExecutor: codexReproducible requires harness "codex"'
2099
+ );
2100
+ }
2101
+ if (options.codexReproducible && options.budgetExempt === true) {
2102
+ throw new ValidationError("createWorktreeCliExecutor: codexReproducible cannot be budgetExempt");
2103
+ }
2085
2104
  const runId = options.runId ?? randomUUID();
2086
2105
  const controller = new AbortController();
2087
- const budgetExempt = options.budgetExempt ?? true;
2106
+ const budgetExempt = options.budgetExempt ?? !options.codexReproducible;
2088
2107
  let run;
2089
2108
  let artifact;
2090
2109
  return {
@@ -2103,6 +2122,7 @@ function createWorktreeCliExecutor(options) {
2103
2122
  ...options.testCmd !== void 0 ? { testCmd: options.testCmd } : {},
2104
2123
  ...options.typecheckCmd !== void 0 ? { typecheckCmd: options.typecheckCmd } : {},
2105
2124
  ...options.harnessTimeoutMs !== void 0 ? { harnessTimeoutMs: options.harnessTimeoutMs } : {},
2125
+ ...options.codexReproducible ? { codexReproducible: true } : {},
2106
2126
  ...options.checkTimeoutMs !== void 0 ? { checkTimeoutMs: options.checkTimeoutMs } : {},
2107
2127
  ...options.checkOutputCap !== void 0 ? { checkOutputCap: options.checkOutputCap } : {},
2108
2128
  ...linked ? { signal: linked } : {},
@@ -2110,13 +2130,20 @@ function createWorktreeCliExecutor(options) {
2110
2130
  ...options.runHarness ? { runHarness: options.runHarness } : {},
2111
2131
  ...options.runCommand ? { runCommand: options.runCommand } : {}
2112
2132
  });
2133
+ const usage = run.result.harness.usage;
2134
+ if (!budgetExempt && !usage) {
2135
+ const completed = run;
2136
+ run = void 0;
2137
+ await completed.cleanup();
2138
+ throw new ValidationError(
2139
+ "createWorktreeCliExecutor: metered harness run returned no token usage"
2140
+ );
2141
+ }
2113
2142
  const spent = {
2114
2143
  iterations: 1,
2115
- // The worktree-harness core surfaces no token/usd usage, so tokens/usd are a genuine zero
2116
- // (NOT a fabricated cost). When budgetExempt is true the pool ignores this spend entirely;
2117
- // when explicitly false the scope debits exactly this captured spend — the real iteration.
2118
- tokens: zeroTokenUsage(),
2144
+ tokens: usage ? { input: usage.inputTokens, output: usage.outputTokens } : { input: 0, output: 0 },
2119
2145
  usd: 0,
2146
+ ...usage ? { usdKnown: false } : {},
2120
2147
  ms: Date.now() - started
2121
2148
  };
2122
2149
  artifact = { outRef: contentAddress(run.result), out: run.result, spent };
@@ -3090,6 +3117,7 @@ var cliWorktreeExecutor = (spec, ctx) => {
3090
3117
  ...seam.runId ? { runId: seam.runId } : {},
3091
3118
  ...seam.baseRef ? { baseRef: seam.baseRef } : {},
3092
3119
  ...seam.harnessTimeoutMs !== void 0 ? { harnessTimeoutMs: seam.harnessTimeoutMs } : {},
3120
+ ...seam.codexReproducible ? { codexReproducible: true } : {},
3093
3121
  ...seam.testCmd !== void 0 ? { testCmd: seam.testCmd } : {},
3094
3122
  ...seam.typecheckCmd !== void 0 ? { typecheckCmd: seam.typecheckCmd } : {},
3095
3123
  ...seam.checkTimeoutMs !== void 0 ? { checkTimeoutMs: seam.checkTimeoutMs } : {},
@@ -3332,6 +3360,7 @@ function sumSpend(settled) {
3332
3360
  total.tokens.input += ev.spent.tokens.input;
3333
3361
  total.tokens.output += ev.spent.tokens.output;
3334
3362
  total.usd += ev.spent.usd;
3363
+ if (ev.spent.usdKnown === false) total.usdKnown = false;
3335
3364
  total.ms += ev.spent.ms;
3336
3365
  }
3337
3366
  return total;
@@ -3344,6 +3373,7 @@ function sumMetered(events) {
3344
3373
  total.tokens.input += ev.spend.tokens.input;
3345
3374
  total.tokens.output += ev.spend.tokens.output;
3346
3375
  total.usd += ev.spend.usd;
3376
+ if (ev.spend.usdKnown === false) total.usdKnown = false;
3347
3377
  total.ms += ev.spend.ms;
3348
3378
  }
3349
3379
  return total;
@@ -3488,6 +3518,11 @@ function createBudgetPool(root, now = Date.now) {
3488
3518
  }
3489
3519
  open.delete(ticket.id);
3490
3520
  const { tokens: rTokens, usd: rUsd, iterations: rIterations } = ticket.reserved;
3521
+ if (usdCapped && spent.usdKnown === false) {
3522
+ throw new Error(
3523
+ `budget pool: ticket ${ticket.id} reported unknown dollar cost under a dollar-capped budget`
3524
+ );
3525
+ }
3491
3526
  const spentTokens = totalTokens(spent.tokens);
3492
3527
  if (spentTokens > rTokens) {
3493
3528
  throw new Error(
@@ -3517,6 +3552,11 @@ function createBudgetPool(root, now = Date.now) {
3517
3552
  }
3518
3553
  }
3519
3554
  function observe(spend) {
3555
+ if (usdCapped && spend.usdKnown === false) {
3556
+ throw new Error(
3557
+ "budget pool: cannot observe unknown dollar cost under a dollar-capped budget"
3558
+ );
3559
+ }
3520
3560
  const tokens = totalTokens(spend.tokens);
3521
3561
  freeTokens -= tokens;
3522
3562
  committedTokens += tokens;
@@ -3741,6 +3781,7 @@ function accumulate(a, b) {
3741
3781
  a.tokens.input += b.tokens.input;
3742
3782
  a.tokens.output += b.tokens.output;
3743
3783
  a.usd += b.usd;
3784
+ if (b.usdKnown === false) a.usdKnown = false;
3744
3785
  a.ms += b.ms;
3745
3786
  }
3746
3787
  function addSpend(a, b) {
@@ -3748,6 +3789,7 @@ function addSpend(a, b) {
3748
3789
  iterations: a.iterations + b.iterations,
3749
3790
  tokens: { input: a.tokens.input + b.tokens.input, output: a.tokens.output + b.tokens.output },
3750
3791
  usd: a.usd + b.usd,
3792
+ ...a.usdKnown === false || b.usdKnown === false ? { usdKnown: false } : {},
3751
3793
  ms: a.ms + b.ms
3752
3794
  };
3753
3795
  }
@@ -6571,4 +6613,4 @@ export {
6571
6613
  workerFromBackend,
6572
6614
  supervise
6573
6615
  };
6574
- //# sourceMappingURL=chunk-FHZHADIM.js.map
6616
+ //# sourceMappingURL=chunk-URMJTSXB.js.map