@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.
- package/dist/agent.js +4 -4
- package/dist/{agentic-generator-B8oeE2Yv.d.ts → agentic-generator-D9ZmAuiL.d.ts} +1 -1
- package/dist/candidate-execution/index.js +3 -3
- package/dist/{chunk-OO4EK3JB.js → chunk-D336OZHK.js} +6 -3
- package/dist/chunk-D336OZHK.js.map +1 -0
- package/dist/{chunk-4GBT4WQ6.js → chunk-HPCJBBLS.js} +2 -2
- package/dist/{chunk-RTVVH2KL.js → chunk-JEP2WM24.js} +2 -2
- package/dist/{chunk-55P6V5JT.js → chunk-K7OPNHU4.js} +2 -2
- package/dist/{chunk-7I2AOKCI.js → chunk-KHLE3C5G.js} +2 -2
- package/dist/{chunk-4E2GM63H.js → chunk-MZH4HORF.js} +2 -2
- package/dist/chunk-PJNGPWTA.js +634 -0
- package/dist/chunk-PJNGPWTA.js.map +1 -0
- package/dist/{chunk-MRYPFDHJ.js → chunk-RTSZNYXM.js} +3 -3
- package/dist/{chunk-H2D3DCEB.js → chunk-SJHFJOCY.js} +2 -2
- package/dist/{chunk-FHZHADIM.js → chunk-URMJTSXB.js} +52 -10
- package/dist/chunk-URMJTSXB.js.map +1 -0
- package/dist/{chunk-3D2RHC4K.js → chunk-WIPGQ4GT.js} +1 -1
- package/dist/{chunk-3D2RHC4K.js.map → chunk-WIPGQ4GT.js.map} +1 -1
- package/dist/{completion-gate-BDkEYB_-.d.ts → completion-gate-BAj3dXeW.d.ts} +14 -2
- package/dist/{coordination-EGoRbbsd.d.ts → coordination-B3ZuApR_.d.ts} +5 -3
- package/dist/environment-provider.d.ts +1 -1
- package/dist/{improve-ZzTEkpF_.d.ts → improve-r8SvIxYv.d.ts} +2 -2
- package/dist/index.d.ts +11 -11
- package/dist/index.js +11 -11
- package/dist/intelligence.d.ts +3 -3
- package/dist/intelligence.js +5 -5
- package/dist/knowledge.d.ts +5 -5
- package/dist/knowledge.js +4 -4
- package/dist/lifecycle.d.ts +3 -3
- package/dist/lifecycle.js +2 -2
- package/dist/{local-harness-dcD5WTTr.d.ts → local-harness-B7bNuNJw.d.ts} +49 -1
- package/dist/{loop-runner-bin-BRXC1RwC.d.ts → loop-runner-bin-D4bMIxmB.d.ts} +2 -2
- package/dist/loop-runner-bin.d.ts +5 -5
- package/dist/loop-runner-bin.js +5 -5
- package/dist/loops.d.ts +11 -11
- package/dist/loops.js +4 -4
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.d.ts +7 -7
- package/dist/mcp/index.js +7 -5
- package/dist/mcp/index.js.map +1 -1
- package/dist/{mcp-serve-verifier-Bg4C3p5S.d.ts → mcp-serve-verifier-BuXjaZDE.d.ts} +1 -1
- package/dist/{supervise-Gmf709kn.d.ts → supervise-DTNcLDl2.d.ts} +3 -3
- package/dist/{types-Cg_teUPO.d.ts → types-Bb-CqxJH.d.ts} +3 -0
- package/dist/{worktree-fanout-BrB4att3.d.ts → worktree-fanout-IMKqdV_E.d.ts} +13 -13
- package/package.json +1 -1
- package/dist/chunk-FHZHADIM.js.map +0 -1
- package/dist/chunk-OO4EK3JB.js.map +0 -1
- package/dist/chunk-PX6SXX3M.js +0 -146
- package/dist/chunk-PX6SXX3M.js.map +0 -1
- /package/dist/{chunk-4GBT4WQ6.js.map → chunk-HPCJBBLS.js.map} +0 -0
- /package/dist/{chunk-RTVVH2KL.js.map → chunk-JEP2WM24.js.map} +0 -0
- /package/dist/{chunk-55P6V5JT.js.map → chunk-K7OPNHU4.js.map} +0 -0
- /package/dist/{chunk-7I2AOKCI.js.map → chunk-KHLE3C5G.js.map} +0 -0
- /package/dist/{chunk-4E2GM63H.js.map → chunk-MZH4HORF.js.map} +0 -0
- /package/dist/{chunk-MRYPFDHJ.js.map → chunk-RTSZNYXM.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
199
|
+
//# sourceMappingURL=chunk-RTSZNYXM.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
agenticGenerator
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
535
|
+
//# sourceMappingURL=chunk-SJHFJOCY.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
InMemoryResultBlobStore,
|
|
10
10
|
InMemorySpawnJournal,
|
|
11
11
|
contentAddress
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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 ??
|
|
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
|
-
|
|
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-
|
|
6616
|
+
//# sourceMappingURL=chunk-URMJTSXB.js.map
|