@tangle-network/agent-runtime 0.94.1 → 0.94.3

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 (54) hide show
  1. package/dist/agent.d.ts +1 -1
  2. package/dist/agent.js +3 -3
  3. package/dist/{agentic-generator-D9ZmAuiL.d.ts → agentic-generator-B7Cyl6cn.d.ts} +1 -1
  4. package/dist/analyst-loop.d.ts +1 -1
  5. package/dist/chunk-2GHZEULG.js +1095 -0
  6. package/dist/chunk-2GHZEULG.js.map +1 -0
  7. package/dist/{chunk-K7OPNHU4.js → chunk-6SIVHKNH.js} +2 -2
  8. package/dist/{chunk-D336OZHK.js → chunk-7PSFJTJZ.js} +2 -2
  9. package/dist/{chunk-HPCJBBLS.js → chunk-EJSELWQY.js} +2 -2
  10. package/dist/{chunk-URMJTSXB.js → chunk-FDJFHWLD.js} +14 -2
  11. package/dist/chunk-FDJFHWLD.js.map +1 -0
  12. package/dist/{chunk-SJHFJOCY.js → chunk-J3XISCCP.js} +2 -2
  13. package/dist/{chunk-RTSZNYXM.js → chunk-OXQHAHOM.js} +3 -3
  14. package/dist/{chunk-JEP2WM24.js → chunk-YHK6MLB7.js} +2 -2
  15. package/dist/{completion-gate-BAj3dXeW.d.ts → completion-gate-CDnL2Wws.d.ts} +10 -2
  16. package/dist/{coordination-B3ZuApR_.d.ts → coordination-DzXsfxre.d.ts} +7 -5
  17. package/dist/environment-provider.d.ts +2 -2
  18. package/dist/{improve-r8SvIxYv.d.ts → improve-mrYmy_1e.d.ts} +2 -2
  19. package/dist/index.d.ts +16 -16
  20. package/dist/index.js +8 -8
  21. package/dist/intelligence.d.ts +5 -5
  22. package/dist/intelligence.js +3 -3
  23. package/dist/knowledge.d.ts +7 -7
  24. package/dist/knowledge.js +3 -3
  25. package/dist/lifecycle.d.ts +3 -3
  26. package/dist/lifecycle.js +2 -2
  27. package/dist/{local-harness-B7bNuNJw.d.ts → local-harness-C2HDGiOY.d.ts} +16 -0
  28. package/dist/{loop-runner-bin-D4bMIxmB.d.ts → loop-runner-bin-z1nz1Wks.d.ts} +2 -2
  29. package/dist/loop-runner-bin.d.ts +6 -6
  30. package/dist/loop-runner-bin.js +4 -4
  31. package/dist/loops.d.ts +15 -15
  32. package/dist/loops.js +3 -3
  33. package/dist/mcp/bin.js +2 -2
  34. package/dist/mcp/index.d.ts +31 -11
  35. package/dist/mcp/index.js +6 -4
  36. package/dist/mcp/index.js.map +1 -1
  37. package/dist/{mcp-serve-verifier-BuXjaZDE.d.ts → mcp-serve-verifier-C65X30mY.d.ts} +1 -1
  38. package/dist/{openai-tools-D0ZSRCC6.d.ts → openai-tools-BMOu1t3A.d.ts} +1 -1
  39. package/dist/profiles.d.ts +1 -1
  40. package/dist/{sanitize-C2jicjNf.d.ts → sanitize-Dr3SliRC.d.ts} +1 -1
  41. package/dist/{supervise-DTNcLDl2.d.ts → supervise-BWFqM8bL.d.ts} +4 -4
  42. package/dist/{types-Bb-CqxJH.d.ts → types-DHLXdLVN.d.ts} +1 -1
  43. package/dist/{types-DWA64rbJ.d.ts → types-Kjr5W6OF.d.ts} +1 -1
  44. package/dist/{worktree-fanout-IMKqdV_E.d.ts → worktree-fanout-BaD6BDr2.d.ts} +7 -4
  45. package/package.json +1 -1
  46. package/dist/chunk-PJNGPWTA.js +0 -634
  47. package/dist/chunk-PJNGPWTA.js.map +0 -1
  48. package/dist/chunk-URMJTSXB.js.map +0 -1
  49. /package/dist/{chunk-K7OPNHU4.js.map → chunk-6SIVHKNH.js.map} +0 -0
  50. /package/dist/{chunk-D336OZHK.js.map → chunk-7PSFJTJZ.js.map} +0 -0
  51. /package/dist/{chunk-HPCJBBLS.js.map → chunk-EJSELWQY.js.map} +0 -0
  52. /package/dist/{chunk-SJHFJOCY.js.map → chunk-J3XISCCP.js.map} +0 -0
  53. /package/dist/{chunk-RTSZNYXM.js.map → chunk-OXQHAHOM.js.map} +0 -0
  54. /package/dist/{chunk-JEP2WM24.js.map → chunk-YHK6MLB7.js.map} +0 -0
@@ -1 +0,0 @@
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"]}