@tangle-network/agent-bench 0.4.0 → 0.4.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 (200) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/adapters.d.ts +4 -11
  3. package/dist/adapters.js +78 -41
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/benchmarks/_harness.d.ts +51 -66
  6. package/dist/benchmarks/_harness.js +329 -31
  7. package/dist/benchmarks/_harness.js.map +1 -1
  8. package/dist/benchmarks/aec-bench.d.ts +4 -25
  9. package/dist/benchmarks/aec-bench.js +242 -7
  10. package/dist/benchmarks/aec-bench.js.map +1 -1
  11. package/dist/benchmarks/agentbench.d.ts +5 -13
  12. package/dist/benchmarks/agentbench.js +114 -9
  13. package/dist/benchmarks/agentbench.js.map +1 -1
  14. package/dist/benchmarks/appworld.d.ts +9 -29
  15. package/dist/benchmarks/appworld.js +317 -12
  16. package/dist/benchmarks/appworld.js.map +1 -1
  17. package/dist/benchmarks/bfcl.d.ts +5 -15
  18. package/dist/benchmarks/bfcl.js +264 -9
  19. package/dist/benchmarks/bfcl.js.map +1 -1
  20. package/dist/benchmarks/cad-design.d.ts +16 -41
  21. package/dist/benchmarks/cad-design.js +512 -6
  22. package/dist/benchmarks/cad-design.js.map +1 -1
  23. package/dist/benchmarks/cadbench.d.ts +4 -17
  24. package/dist/benchmarks/cadbench.js +2 -8
  25. package/dist/benchmarks/cadgenbench.d.ts +4 -20
  26. package/dist/benchmarks/cadgenbench.js +2 -8
  27. package/dist/benchmarks/commit0.d.ts +5 -27
  28. package/dist/benchmarks/commit0.js +187 -9
  29. package/dist/benchmarks/commit0.js.map +1 -1
  30. package/dist/benchmarks/crag.d.ts +4 -12
  31. package/dist/benchmarks/crag.js +110 -8
  32. package/dist/benchmarks/crag.js.map +1 -1
  33. package/dist/benchmarks/dabstep.d.ts +5 -15
  34. package/dist/benchmarks/dabstep.js +177 -9
  35. package/dist/benchmarks/dabstep.js.map +1 -1
  36. package/dist/benchmarks/enterpriseops-gym.d.ts +5 -34
  37. package/dist/benchmarks/enterpriseops-gym.js +236 -9
  38. package/dist/benchmarks/enterpriseops-gym.js.map +1 -1
  39. package/dist/benchmarks/finresearchbench.d.ts +4 -13
  40. package/dist/benchmarks/finresearchbench.js +218 -7
  41. package/dist/benchmarks/finresearchbench.js.map +1 -1
  42. package/dist/benchmarks/finsearchcomp.d.ts +8 -39
  43. package/dist/benchmarks/finsearchcomp.js +267 -6
  44. package/dist/benchmarks/finsearchcomp.js.map +1 -1
  45. package/dist/benchmarks/frames.d.ts +15 -37
  46. package/dist/benchmarks/frames.js +408 -11
  47. package/dist/benchmarks/frames.js.map +1 -1
  48. package/dist/benchmarks/hotpotqa.d.ts +4 -24
  49. package/dist/benchmarks/hotpotqa.js +250 -14
  50. package/dist/benchmarks/hotpotqa.js.map +1 -1
  51. package/dist/benchmarks/humaneval.d.ts +19 -37
  52. package/dist/benchmarks/humaneval.js +279 -16
  53. package/dist/benchmarks/humaneval.js.map +1 -1
  54. package/dist/benchmarks/mind2web.d.ts +7 -34
  55. package/dist/benchmarks/mind2web.js +257 -8
  56. package/dist/benchmarks/mind2web.js.map +1 -1
  57. package/dist/benchmarks/nomiracl.d.ts +4 -13
  58. package/dist/benchmarks/nomiracl.js +146 -8
  59. package/dist/benchmarks/nomiracl.js.map +1 -1
  60. package/dist/benchmarks/open-rag-bench.d.ts +4 -12
  61. package/dist/benchmarks/open-rag-bench.js +110 -8
  62. package/dist/benchmarks/open-rag-bench.js.map +1 -1
  63. package/dist/benchmarks/programbench.d.ts +5 -29
  64. package/dist/benchmarks/programbench.js +161 -9
  65. package/dist/benchmarks/programbench.js.map +1 -1
  66. package/dist/benchmarks/rag-shared.d.ts +21 -20
  67. package/dist/benchmarks/rag-shared.js +245 -38
  68. package/dist/benchmarks/rag-shared.js.map +1 -1
  69. package/dist/benchmarks/ragbench.d.ts +4 -14
  70. package/dist/benchmarks/ragbench.js +127 -8
  71. package/dist/benchmarks/ragbench.js.map +1 -1
  72. package/dist/benchmarks/simpleqa.d.ts +17 -44
  73. package/dist/benchmarks/simpleqa.js +293 -10
  74. package/dist/benchmarks/simpleqa.js.map +1 -1
  75. package/dist/benchmarks/swe-bench.d.ts +23 -36
  76. package/dist/benchmarks/swe-bench.js +234 -13
  77. package/dist/benchmarks/swe-bench.js.map +1 -1
  78. package/dist/benchmarks/t2-ragbench.d.ts +4 -12
  79. package/dist/benchmarks/t2-ragbench.js +118 -8
  80. package/dist/benchmarks/t2-ragbench.js.map +1 -1
  81. package/dist/benchmarks/tau-bench-shared.d.ts +14 -22
  82. package/dist/benchmarks/tau-bench-shared.js +169 -9
  83. package/dist/benchmarks/tau-bench-shared.js.map +1 -1
  84. package/dist/benchmarks/tau2-bench.d.ts +5 -5
  85. package/dist/benchmarks/tau2-bench.js +28 -10
  86. package/dist/benchmarks/tau2-bench.js.map +1 -1
  87. package/dist/benchmarks/tau3-banking.d.ts +4 -13
  88. package/dist/benchmarks/tau3-banking.js +28 -8
  89. package/dist/benchmarks/tau3-banking.js.map +1 -1
  90. package/dist/benchmarks/terminal-bench.d.ts +4 -22
  91. package/dist/benchmarks/terminal-bench.js +140 -7
  92. package/dist/benchmarks/terminal-bench.js.map +1 -1
  93. package/dist/benchmarks/toollm.d.ts +5 -13
  94. package/dist/benchmarks/toollm.js +184 -9
  95. package/dist/benchmarks/toollm.js.map +1 -1
  96. package/dist/benchmarks/trata-hedge.d.ts +4 -30
  97. package/dist/benchmarks/trata-hedge.js +336 -6
  98. package/dist/benchmarks/trata-hedge.js.map +1 -1
  99. package/dist/benchmarks/types.d.ts +85 -94
  100. package/dist/benchmarks/types.js +1 -1
  101. package/dist/benchmarks/webarena-verified.d.ts +5 -13
  102. package/dist/benchmarks/webarena-verified.js +152 -9
  103. package/dist/benchmarks/webarena-verified.js.map +1 -1
  104. package/dist/cadbench-DpQWZHp4.js +285 -0
  105. package/dist/cadbench-DpQWZHp4.js.map +1 -0
  106. package/dist/cadgenbench-DRhczfsG.js +151 -0
  107. package/dist/cadgenbench-DRhczfsG.js.map +1 -0
  108. package/dist/index.d.ts +245 -293
  109. package/dist/index.js +1669 -1791
  110. package/dist/index.js.map +1 -1
  111. package/package.json +17 -14
  112. package/pier_agents/candidate_contract.py +238 -24
  113. package/pier_agents/tangle_candidate.py +75 -5
  114. package/scripts/verify-packed-consumer.mjs +84 -17
  115. package/scripts/verify-pier-agent.mts +6 -4
  116. package/src/benchmarks/_harness.test.mts +16 -1
  117. package/src/benchmarks/_harness.ts +9 -2
  118. package/src/benchmarks/terminal-bench.ts +2 -1
  119. package/src/corpus.test.mts +13 -0
  120. package/src/corpus.ts +4 -0
  121. package/src/profile-coordinates.ts +2 -2
  122. package/src/rollout-ledger/backfill-swe-arena.mts +5 -1
  123. package/src/rollout-ledger/settle-capture.mts +7 -1
  124. package/src/search-bench/profiles.ts +1 -1
  125. package/src/skill-sandbox-smoke.mts +2 -1
  126. package/src/swe-arena/gepa-seat.mts +1 -1
  127. package/src/swe-arena/ledger-orphans.test.mts +36 -34
  128. package/dist/benchmarks/cadbench.js.map +0 -1
  129. package/dist/benchmarks/cadgenbench.js.map +0 -1
  130. package/dist/benchmarks/types.js.map +0 -1
  131. package/dist/chunk-3U5TXJZS.js +0 -251
  132. package/dist/chunk-3U5TXJZS.js.map +0 -1
  133. package/dist/chunk-53UPUNBZ.js +0 -325
  134. package/dist/chunk-53UPUNBZ.js.map +0 -1
  135. package/dist/chunk-5H5XV76F.js +0 -240
  136. package/dist/chunk-5H5XV76F.js.map +0 -1
  137. package/dist/chunk-7GRVHU22.js +0 -208
  138. package/dist/chunk-7GRVHU22.js.map +0 -1
  139. package/dist/chunk-C7T7WEK2.js +0 -103
  140. package/dist/chunk-C7T7WEK2.js.map +0 -1
  141. package/dist/chunk-HWST3SED.js +0 -162
  142. package/dist/chunk-HWST3SED.js.map +0 -1
  143. package/dist/chunk-IA2FBTWC.js +0 -318
  144. package/dist/chunk-IA2FBTWC.js.map +0 -1
  145. package/dist/chunk-IFVINJ4B.js +0 -142
  146. package/dist/chunk-IFVINJ4B.js.map +0 -1
  147. package/dist/chunk-INNOYXCP.js +0 -387
  148. package/dist/chunk-INNOYXCP.js.map +0 -1
  149. package/dist/chunk-IZ5M6OAC.js +0 -169
  150. package/dist/chunk-IZ5M6OAC.js.map +0 -1
  151. package/dist/chunk-JTHWEDEW.js +0 -32
  152. package/dist/chunk-JTHWEDEW.js.map +0 -1
  153. package/dist/chunk-K3BQGZCT.js +0 -221
  154. package/dist/chunk-K3BQGZCT.js.map +0 -1
  155. package/dist/chunk-KP5KD6EN.js +0 -276
  156. package/dist/chunk-KP5KD6EN.js.map +0 -1
  157. package/dist/chunk-MQMRLGOG.js +0 -136
  158. package/dist/chunk-MQMRLGOG.js.map +0 -1
  159. package/dist/chunk-NQG5XDSB.js +0 -147
  160. package/dist/chunk-NQG5XDSB.js.map +0 -1
  161. package/dist/chunk-PA2ZKHJC.js +0 -230
  162. package/dist/chunk-PA2ZKHJC.js.map +0 -1
  163. package/dist/chunk-PB64GYIG.js +0 -118
  164. package/dist/chunk-PB64GYIG.js.map +0 -1
  165. package/dist/chunk-PUIRNYI7.js +0 -189
  166. package/dist/chunk-PUIRNYI7.js.map +0 -1
  167. package/dist/chunk-RCYQEFNX.js +0 -30
  168. package/dist/chunk-RCYQEFNX.js.map +0 -1
  169. package/dist/chunk-RH5F53JT.js +0 -182
  170. package/dist/chunk-RH5F53JT.js.map +0 -1
  171. package/dist/chunk-SEVJPLZC.js +0 -260
  172. package/dist/chunk-SEVJPLZC.js.map +0 -1
  173. package/dist/chunk-SFLA7OH3.js +0 -27
  174. package/dist/chunk-SFLA7OH3.js.map +0 -1
  175. package/dist/chunk-SHM6MRRF.js +0 -130
  176. package/dist/chunk-SHM6MRRF.js.map +0 -1
  177. package/dist/chunk-SHYIRB7I.js +0 -120
  178. package/dist/chunk-SHYIRB7I.js.map +0 -1
  179. package/dist/chunk-SVR2LKYI.js +0 -116
  180. package/dist/chunk-SVR2LKYI.js.map +0 -1
  181. package/dist/chunk-TBKU5XQI.js +0 -228
  182. package/dist/chunk-TBKU5XQI.js.map +0 -1
  183. package/dist/chunk-UPAMRDX4.js +0 -233
  184. package/dist/chunk-UPAMRDX4.js.map +0 -1
  185. package/dist/chunk-V7AEBY6U.js +0 -144
  186. package/dist/chunk-V7AEBY6U.js.map +0 -1
  187. package/dist/chunk-VQRS7VUC.js +0 -342
  188. package/dist/chunk-VQRS7VUC.js.map +0 -1
  189. package/dist/chunk-WSKWVEQB.js +0 -317
  190. package/dist/chunk-WSKWVEQB.js.map +0 -1
  191. package/dist/chunk-X3BTXCJ4.js +0 -262
  192. package/dist/chunk-X3BTXCJ4.js.map +0 -1
  193. package/dist/chunk-XKEFIFIC.js +0 -197
  194. package/dist/chunk-XKEFIFIC.js.map +0 -1
  195. package/dist/chunk-XYA4XSNU.js +0 -148
  196. package/dist/chunk-XYA4XSNU.js.map +0 -1
  197. package/dist/chunk-YSMEKBTD.js +0 -211
  198. package/dist/chunk-YSMEKBTD.js.map +0 -1
  199. package/dist/chunk-Z4TZ76N7.js +0 -170
  200. package/dist/chunk-Z4TZ76N7.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/run-benchmarks.ts","../src/resolve-client.ts","../src/search-tool.ts","../src/run-pool.ts","../src/pier-agent.ts","../src/pier-task-outcome.ts","../src/pier-trial-controller.ts","../src/pier-result-grader.ts"],"sourcesContent":["/**\n * `runBenchmarks` — the bench unifier.\n *\n * `gate.ts` runs ONE adapter as a diverse-vs-blind research gate through the recursive atom.\n * This is the other half it references: run a SUBSET of the registry's benchmarks over a MATRIX of\n * agent cells (harness × model × persona), each scored by the benchmark's OWN deterministic judge,\n * and return a ranked leaderboard. It is the \"which harness/model/persona combination wins on which\n * benchmark\" question, answered over an arbitrary subset in one call.\n *\n * It owns no new mechanism. Each cell is one `openSandboxRun` shot (the same per-run primitive the\n * SWE worker uses) driven by `resolveBenchClient` (off-box router completion OR in-box Sandbox; the\n * harness rides `sandboxOverrides.backend.type`). The deliverable is the adapter's OWN parser\n * (`adapter.output`), defaulting to the final answer text — so `runBenchmarks` needs no\n * per-benchmark branching. Concurrency is the shared `runPool`. The number comes from\n * `adapter.judge`, never a self-authored judge.\n *\n * Subset = the `benchmarks` and `cells` arrays plus `n`/`ids`/`split`. A benchmark whose\n * `preflight()` fails (missing Docker/venv/dataset) is recorded as unavailable and skipped — the\n * sweep never aborts because one bench's harness is absent.\n *\n * const report = await runBenchmarks({\n * benchmarks: ['humaneval', 'swe-bench'],\n * cells: [\n * { label: 'opencode/glm-4.6', model: 'glm-4.6', harness: 'opencode' },\n * { label: 'codex/gpt-5', model: 'gpt-5', harness: 'codex' },\n * ],\n * routerBaseUrl, routerKey, n: 20,\n * })\n */\n\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport type {\n AgentProfile,\n AgentRunSpec,\n Deliverable,\n OpenSandboxRunOptions,\n} from '@tangle-network/agent-runtime/loops'\nimport { openSandboxRun } from '@tangle-network/agent-runtime/loops'\nimport type { SandboxEvent } from '@tangle-network/sandbox'\nimport { resolveAdapter } from './adapters'\nimport type { BenchmarkAdapter, BenchScore, BenchTask } from './benchmarks/types'\nimport { runRefineLoop } from './refine-loop'\nimport { resolveBenchClient } from './resolve-client'\nimport { runPool } from './run-pool'\n\n/** One agent under test: a profile (prompt/tools/persona) plus the harness + model that run it. */\nexport interface BenchCell {\n /** Leaderboard row label, e.g. `opencode/glm-4.6` or `tax-agent@v1`. */\n readonly label: string\n /** Model id for this cell. */\n readonly model: string\n /** Coding harness for the in-box path (`opencode`/`codex`/`claude-code`/`kimi-code`). Defaults to\n * `profile.metadata.backendType`, then `opencode`. Ignored on the `router` transport. */\n readonly harness?: string\n /** Transport: `router` (off-box completion, default), `sandbox`, or a BackendType for in-box. */\n readonly backend?: string\n /** Web-search provider for the `router` transport (turns the leaf into a `router-tools` loop). */\n readonly searchProvider?: string\n /** The agent under test. Defaults to a minimal `{ name, metadata.backendType }` profile. */\n readonly profile?: AgentProfile\n}\n\n/** Runs one (adapter, task, cell) shot and returns the deliverable text. The default uses\n * `openSandboxRun`; tests inject a deterministic stub so the matrix runs offline. */\nexport type BenchShot = (input: {\n readonly adapter: BenchmarkAdapter\n readonly task: BenchTask\n readonly cell: BenchCell\n /** Prompt to hand to the worker. Defaults to `task.prompt`; looped runs pass revised prompts. */\n readonly prompt?: string\n /** 1-based attempt index for looped runs. */\n readonly attempt?: number\n readonly routerBaseUrl: string\n readonly routerKey: string\n readonly bridgeUrl?: string\n readonly bridgeBearer?: string\n readonly sandboxBaseUrl?: string\n readonly timeoutMs?: number\n readonly resolveClient?: typeof resolveBenchClient\n}) => Promise<{ artifact: string; ok: boolean; detail?: string }>\n\nexport interface RunBenchmarksOptions {\n /** Registry keys (`resolveAdapter`) — the benchmark subset to run. */\n readonly benchmarks: readonly string[]\n /** The agent cells to rank. */\n readonly cells: readonly BenchCell[]\n readonly routerBaseUrl: string\n readonly routerKey: string\n readonly bridgeUrl?: string\n readonly bridgeBearer?: string\n readonly sandboxBaseUrl?: string\n /** Tasks per benchmark (the n). */\n readonly n?: number\n readonly ids?: string[]\n readonly split?: string\n /** Replicates per (benchmark × cell × task). Default 1. */\n readonly reps?: number\n /** Bounded concurrency across all shots. Default 4. */\n readonly concurrency?: number\n /** Per-shot wall-clock (ms). */\n readonly timeoutMs?: number\n /** Test seam: resolve the runtime transport. Defaults to `resolveBenchClient`. */\n readonly resolveClient?: typeof resolveBenchClient\n /** Max attempts per (benchmark × cell × task). Default 1. Attempts after the first receive\n * non-answer checker feedback and the previous artifacts; the loop stops early on pass. */\n readonly loopAttempts?: number\n /** Self-verify each benchmark's judge against its gold artifact on the first task before spending\n * model tokens; a benchmark whose judge rejects its own gold is recorded unavailable. Default true. */\n readonly verifyJudge?: boolean\n /** Test seam: a deterministic shot runner. Defaults to the `openSandboxRun` leaf. */\n readonly runShot?: BenchShot\n /** Test seam: resolve a benchmark key to an adapter. Defaults to the registry `resolveAdapter`. */\n readonly resolveAdapter?: (key: string) => BenchmarkAdapter\n readonly onResult?: (r: BenchCellTaskResult) => void\n}\n\nexport interface BenchCellTaskResult {\n readonly benchmark: string\n readonly cell: string\n readonly taskId: string\n readonly rep: number\n readonly resolved: boolean\n readonly score: number\n /** false = the shot threw or produced no artifact (infra/empty), excluded from the resolve\n * denominator so a harness outage can't masquerade as a 0% capability result. */\n readonly ok: boolean\n readonly detail?: string\n readonly wallMs: number\n}\n\nexport interface BenchLeaderboardRow {\n readonly benchmark: string\n readonly cell: string\n readonly n: number\n readonly resolved: number\n readonly errored: number\n /** resolved / (n - errored). */\n readonly resolveRate: number\n /** Mean graded score over non-errored shots (partial credit where the judge supports it). */\n readonly meanScore: number\n}\n\nexport interface RunBenchmarksReport {\n /** One row per (benchmark × cell), sorted by benchmark then descending resolveRate. */\n readonly rows: readonly BenchLeaderboardRow[]\n readonly perTask: readonly BenchCellTaskResult[]\n readonly benchmarks: readonly string[]\n readonly cells: readonly string[]\n /** Benchmarks skipped because `preflight`/judge-self-check failed, with the reason. */\n readonly unavailable: ReadonlyArray<{ readonly benchmark: string; readonly reason: string }>\n}\n\n/** Last assistant text across the common event shapes (delta accumulation, then a terminal\n * `result`/`done`/`agent` snapshot). The structured-deliverable case is handled by the adapter's\n * own `output.parse`; this is the research/QA fallback. */\nfunction finalText(events: readonly SandboxEvent[]): string {\n let text = ''\n for (const ev of events) {\n const e = ev as { type?: string; data?: Record<string, unknown> }\n const data = e.data ?? {}\n if (e.type === 'message.part.updated') {\n const part = data.part as { type?: string; text?: string } | undefined\n const partType = (data.partType as string | undefined) ?? part?.type\n if (partType === 'text') {\n if (typeof data.delta === 'string') text += data.delta\n else if (typeof part?.text === 'string') text = part.text\n }\n } else if (typeof data.finalText === 'string') text = data.finalText\n else if (typeof data.response === 'string') text = data.response\n }\n return text.trim()\n}\n\n/** The default real-agent shot: one `openSandboxRun` over the cell's harness+model, deliverable\n * extracted by the adapter's parser (or final text), abortable on `timeoutMs`. */\nconst openSandboxShot: BenchShot = async ({ adapter, task, cell, prompt, routerBaseUrl, routerKey, bridgeUrl, bridgeBearer, sandboxBaseUrl, timeoutMs, resolveClient }) => {\n const client = (resolveClient ?? resolveBenchClient)({\n backend: cell.backend ?? 'router',\n routerBaseUrl,\n routerKey,\n model: cell.model,\n ...(bridgeUrl ? { bridgeUrl } : {}),\n ...(bridgeBearer ? { bridgeBearer } : {}),\n ...(sandboxBaseUrl ? { sandboxBaseUrl } : {}),\n ...(cell.searchProvider ? { searchProvider: cell.searchProvider } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n })\n const harness = cell.harness ?? (cell.profile?.metadata?.backendType as string | undefined) ?? 'opencode'\n const profile: AgentProfile = cell.profile ?? { name: cell.label, metadata: { backendType: harness } }\n // Unique per shot: the same (adapter, task) runs concurrently across cells and reps, so the box\n // name and runId must not collide.\n const uniq = Math.random().toString(36).slice(2, 8)\n const agentRun: AgentRunSpec<string> = {\n profile,\n name: cell.label,\n taskToPrompt: () => '',\n sandboxOverrides: {\n name: `bench-${adapter.name}-${task.id}-${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 60),\n environment: 'universal',\n backend: { type: harness as never, model: { provider: 'openai', model: cell.model, baseUrl: routerBaseUrl } },\n },\n }\n const deliverable: Deliverable<string> = {\n kind: 'events',\n fromEvents: (events) => (adapter.output ? adapter.output.parse(events) : finalText(events)),\n }\n const controller = new AbortController()\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined\n const runOptions: OpenSandboxRunOptions = {\n agentRun,\n signal: controller.signal,\n runId: `bench:${adapter.name}:${task.id}:${uniq}`,\n scenarioId: task.id,\n }\n const boxSetup = adapter.boxSetup\n if (boxSetup) {\n runOptions.beforeStart = async ({ box, sessionId }) => {\n const setup = boxSetup(task)\n const sres = await box.exec(setup.command, {\n timeoutMs: 300_000,\n sessionId,\n ...(setup.cwd ? { cwd: setup.cwd } : {}),\n })\n if (sres.exitCode !== 0)\n throw new Error(\n `boxSetup failed (exit ${sres.exitCode}): ${(sres.stderr ?? '').slice(0, 200)}`,\n )\n }\n }\n const run = await openSandboxRun(client, runOptions, deliverable)\n try {\n const turn = await run.start(prompt ?? task.prompt)\n // Event-stream deliverable (adapter.output ?? finalText) — the FALLBACK.\n let artifact = (turn.out ?? '').trim()\n let boxExtractError: string | undefined\n // Primary deliverable for benchmarks whose real artifact lives in the box FS\n // (SWE-bench: a git diff of the agent's edits). Run the adapter's extraction\n // command in the STILL-ALIVE box (valid until run.close() below) and prefer its\n // stdout; the event-stream parse remains the fallback when the box yields nothing.\n if (adapter.boxExtract) {\n try {\n const ex = adapter.boxExtract(task)\n // The agent runs under a DRIVER SESSION whose workspace is a remapped\n // virtual root; an exec WITHOUT that sessionId lands on the host FS and\n // cannot see the agent's edits. Thread run.sessionId so the extraction\n // runs in the SAME workspace the agent wrote to.\n const res = await run.box.exec(ex.command, {\n timeoutMs: 120_000,\n sessionId: run.sessionId,\n ...(ex.cwd ? { cwd: ex.cwd } : {}),\n })\n const boxArtifact = (res.stdout ?? '').trim()\n if (res.exitCode !== 0)\n boxExtractError = `exit ${res.exitCode}: ${(res.stderr ?? '').slice(0, 160)}`\n else if (boxArtifact.length > 0) artifact = boxArtifact\n if (process.env.BENCH_ARTIFACT_DIR) {\n try {\n mkdirSync(process.env.BENCH_ARTIFACT_DIR, { recursive: true })\n const safe = `${adapter.name}_${task.id}_${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_')\n const map = await run.box\n .exec(\n 'echo \"PWD:\"; pwd; echo \"LS:\"; ls -la; echo \"GITROOTS:\"; find / -maxdepth 5 -type d -name .git 2>/dev/null; echo \"SETTINGS:\"; find / -maxdepth 8 -name global_settings.py -path \"*conf*\" 2>/dev/null',\n { timeoutMs: 60_000, sessionId: run.sessionId },\n )\n .catch((e: unknown) => ({ exitCode: -1, stdout: '', stderr: String(e) }))\n writeFileSync(\n `${process.env.BENCH_ARTIFACT_DIR}/${safe}.exec.json`,\n JSON.stringify(\n { sessionId: run.sessionId, extract: res, map: { exitCode: map.exitCode, stdout: map.stdout, stderr: map.stderr } },\n null,\n 2,\n ),\n )\n } catch {\n // debug-only\n }\n }\n } catch (err) {\n boxExtractError = err instanceof Error ? err.message.slice(0, 160) : String(err)\n }\n }\n const detail =\n turn.readError !== undefined\n ? `read: ${turn.readError.slice(0, 160)}`\n : boxExtractError !== undefined\n ? `boxExtract: ${boxExtractError}`\n : undefined\n // Debug affordance: dump the judged artifact (the exact model_patch the judge\n // will score) so a scoring failure can be diagnosed off the real bytes without\n // re-running the agent. Off by default; set BENCH_ARTIFACT_DIR to enable.\n if (process.env.BENCH_ARTIFACT_DIR) {\n try {\n mkdirSync(process.env.BENCH_ARTIFACT_DIR, { recursive: true })\n const safe = `${adapter.name}_${task.id}_${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_')\n writeFileSync(`${process.env.BENCH_ARTIFACT_DIR}/${safe}.patch`, artifact)\n } catch {\n // debug-only; never fail the shot on a dump error\n }\n }\n return {\n artifact,\n ok: artifact.length > 0,\n ...(detail ? { detail } : {}),\n }\n } finally {\n if (timer) clearTimeout(timer)\n await run.close()\n }\n}\n\nfunction parseMaybeJson(value: string): unknown {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return value\n }\n}\n\nfunction redactJudgeLeak(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactJudgeLeak)\n if (!value || typeof value !== 'object') return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const normalizedKey = key.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n if (/(^|_)(gold|expected|reference|solution|answer)(_|$)/.test(normalizedKey)) continue\n out[key] = redactJudgeLeak(child)\n }\n return out\n}\n\nfunction safeFeedback(score: BenchScore): Record<string, unknown> {\n return {\n resolved: score.resolved,\n score: score.score,\n ...(score.detail ? { detail: redactJudgeLeak(parseMaybeJson(score.detail)) } : {}),\n }\n}\n\nfunction truncate(value: string, max = 4_000): string {\n return value.length <= max ? value : `${value.slice(0, max)}\\n...[truncated ${value.length - max} chars]`\n}\n\nfunction retryPrompt(task: BenchTask, history: ReadonlyArray<{ round: number; artifact: string }>, scores: ReadonlyMap<number, BenchScore>): string {\n const attempts = history\n .map((h) => {\n const score = scores.get(h.round)\n return [\n `Attempt ${h.round}:`,\n 'Artifact:',\n truncate(h.artifact),\n score ? `Checker feedback: ${JSON.stringify(safeFeedback(score))}` : undefined,\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n return [\n 'Retry the benchmark task. The previous artifact did not pass the checker.',\n 'Use only the original task statement and supplied context. Do not invent facts.',\n 'Return the corrected artifact in exactly the format requested by the original task.',\n '',\n 'Original task:',\n task.prompt,\n '',\n 'Previous attempts and safe checker feedback:',\n attempts,\n ].join('\\n')\n}\n\nasync function loopedShot(\n input: Parameters<BenchShot>[0],\n shot: BenchShot,\n attempts: number,\n): Promise<{ artifact: string; ok: boolean; detail?: string }> {\n const scores = new Map<number, BenchScore>()\n const result = await runRefineLoop<string>({\n rounds: attempts,\n prompt: (round, history) => (round === 1 ? input.task.prompt : retryPrompt(input.task, history, scores)),\n runShot: async (prompt, round) => {\n const out = await shot({ ...input, prompt, attempt: round })\n return { artifact: out.artifact, note: out.detail }\n },\n judge: async (artifact, round) => {\n const score = await input.adapter.judge(input.task, artifact)\n scores.set(round, score)\n return { valid: score.resolved, score: score.score }\n },\n })\n\n const best = result.rounds.reduce((winner, candidate) => {\n const a = scores.get(winner.round)\n const b = scores.get(candidate.round)\n if (!a) return candidate\n if (!b) return winner\n if (b.resolved && !a.resolved) return candidate\n if (b.resolved === a.resolved && b.score > a.score) return candidate\n return winner\n }, result.rounds[0]!)\n const bestScore = scores.get(best.round)\n return {\n artifact: best.artifact,\n ok: best.artifact.trim().length > 0,\n detail: JSON.stringify({\n mode: 'refine-loop',\n attempts: result.rounds.length,\n selectedAttempt: best.round,\n resolvedDuringLoop: result.resolved,\n selectedScore: bestScore?.score ?? null,\n rounds: result.rounds.map((round) => ({\n attempt: round.round,\n score: scores.get(round.round)?.score ?? null,\n resolved: scores.get(round.round)?.resolved ?? null,\n note: round.note ?? null,\n })),\n }),\n }\n}\n\nfunction combineDetails(runDetail: string | undefined, scoreDetail: string | undefined): string | undefined {\n if (runDetail && scoreDetail) {\n return JSON.stringify({ run: parseMaybeJson(runDetail), score: parseMaybeJson(scoreDetail) })\n }\n return runDetail ?? scoreDetail\n}\n\ninterface Job {\n readonly benchmark: string\n readonly adapter: BenchmarkAdapter\n readonly cell: BenchCell\n readonly task: BenchTask\n readonly rep: number\n}\n\n/** Resolve + preflight + (optionally) self-verify each benchmark once; load its tasks. A benchmark\n * whose harness is absent or whose judge rejects its own gold is recorded unavailable, not run. */\nasync function prepareBenchmarks(\n benchmarks: readonly string[],\n resolve: (key: string) => BenchmarkAdapter,\n opts: Pick<RunBenchmarksOptions, 'n' | 'ids' | 'split' | 'verifyJudge'>,\n): Promise<{ ready: Array<{ benchmark: string; adapter: BenchmarkAdapter; tasks: BenchTask[] }>; unavailable: Array<{ benchmark: string; reason: string }> }> {\n const ready: Array<{ benchmark: string; adapter: BenchmarkAdapter; tasks: BenchTask[] }> = []\n const unavailable: Array<{ benchmark: string; reason: string }> = []\n for (const benchmark of benchmarks) {\n const adapter = resolve(benchmark) // throws on an unknown key — fail loud on a typo\n try {\n await adapter.preflight()\n const tasks = await adapter.loadTasks({\n ...(opts.n !== undefined ? { limit: opts.n } : {}),\n ...(opts.ids ? { ids: opts.ids } : {}),\n ...(opts.split ? { split: opts.split } : {}),\n })\n if (tasks.length === 0) {\n unavailable.push({ benchmark, reason: 'loadTasks returned no tasks' })\n continue\n }\n if (opts.verifyJudge !== false) {\n const gold = await adapter.goldArtifact(tasks[0]!)\n if (gold !== undefined) {\n const verdict = await adapter.judge(tasks[0]!, gold)\n if (!verdict.resolved) {\n unavailable.push({ benchmark, reason: `judge rejected its own gold on ${tasks[0]!.id} — judge is miscalibrated` })\n continue\n }\n }\n }\n ready.push({ benchmark, adapter, tasks })\n } catch (err) {\n unavailable.push({ benchmark, reason: err instanceof Error ? err.message : String(err) })\n }\n }\n return { ready, unavailable }\n}\n\nexport async function runBenchmarks(opts: RunBenchmarksOptions): Promise<RunBenchmarksReport> {\n if (opts.benchmarks.length === 0) throw new Error('runBenchmarks: no benchmarks selected')\n if (opts.cells.length === 0) throw new Error('runBenchmarks: no cells to run')\n const reps = Math.max(1, opts.reps ?? 1)\n const loopAttempts = Math.max(1, opts.loopAttempts ?? 1)\n const shot = opts.runShot ?? openSandboxShot\n\n const { ready, unavailable } = await prepareBenchmarks(opts.benchmarks, opts.resolveAdapter ?? resolveAdapter, opts)\n\n const jobs: Job[] = []\n for (const { benchmark, adapter, tasks } of ready)\n for (const cell of opts.cells) for (const task of tasks) for (let rep = 0; rep < reps; rep += 1) jobs.push({ benchmark, adapter, cell, task, rep })\n\n const perTask: BenchCellTaskResult[] = []\n await runPool(jobs, Math.max(1, opts.concurrency ?? 4), async (job, index) => {\n const startedAt = Date.now()\n let result: BenchCellTaskResult\n try {\n const shotInput = {\n adapter: job.adapter,\n task: job.task,\n cell: job.cell,\n routerBaseUrl: opts.routerBaseUrl,\n routerKey: opts.routerKey,\n ...(opts.bridgeUrl ? { bridgeUrl: opts.bridgeUrl } : {}),\n ...(opts.bridgeBearer ? { bridgeBearer: opts.bridgeBearer } : {}),\n ...(opts.sandboxBaseUrl ? { sandboxBaseUrl: opts.sandboxBaseUrl } : {}),\n ...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.resolveClient ? { resolveClient: opts.resolveClient } : {}),\n }\n const out = loopAttempts > 1 ? await loopedShot(shotInput, shot, loopAttempts) : await shot(shotInput)\n const score: BenchScore = await job.adapter.judge(job.task, out.artifact)\n result = {\n benchmark: job.benchmark,\n cell: job.cell.label,\n taskId: job.task.id,\n rep: job.rep,\n resolved: out.ok && score.resolved,\n score: out.ok ? score.score : 0,\n ok: out.ok,\n ...(out.detail ?? score.detail ? { detail: combineDetails(out.detail, score.detail) } : {}),\n wallMs: Date.now() - startedAt,\n }\n } catch (err) {\n // A thrown shot/judge is infra error for THIS cell-task: ok=false excludes it from the\n // resolve denominator (never a silent 0% that hides a harness outage).\n result = {\n benchmark: job.benchmark,\n cell: job.cell.label,\n taskId: job.task.id,\n rep: job.rep,\n resolved: false,\n score: 0,\n ok: false,\n detail: err instanceof Error ? err.message.slice(0, 200) : String(err),\n wallMs: Date.now() - startedAt,\n }\n }\n void index\n perTask.push(result)\n opts.onResult?.(result)\n return result\n })\n\n const rows = aggregate(perTask)\n return {\n rows,\n perTask,\n benchmarks: ready.map((r) => r.benchmark),\n cells: opts.cells.map((c) => c.label),\n unavailable,\n }\n}\n\nfunction aggregate(perTask: readonly BenchCellTaskResult[]): BenchLeaderboardRow[] {\n const byKey = new Map<string, { benchmark: string; cell: string; n: number; resolved: number; errored: number; scoreSum: number }>()\n for (const r of perTask) {\n const key = `${r.benchmark}\\u0000${r.cell}`\n const e = byKey.get(key) ?? { benchmark: r.benchmark, cell: r.cell, n: 0, resolved: 0, errored: 0, scoreSum: 0 }\n e.n += 1\n if (!r.ok) e.errored += 1\n else {\n if (r.resolved) e.resolved += 1\n e.scoreSum += r.score\n }\n byKey.set(key, e)\n }\n const rows: BenchLeaderboardRow[] = [...byKey.values()].map((e) => {\n const denom = Math.max(1, e.n - e.errored)\n return {\n benchmark: e.benchmark,\n cell: e.cell,\n n: e.n,\n resolved: e.resolved,\n errored: e.errored,\n resolveRate: e.resolved / denom,\n meanScore: e.scoreSum / denom,\n }\n })\n rows.sort((a, b) => (a.benchmark === b.benchmark ? b.resolveRate - a.resolveRate : a.benchmark < b.benchmark ? -1 : 1))\n return rows\n}\n\n/** Render the leaderboard as a fixed-width table for a CLI/log. */\nexport function printBenchmarksReport(report: RunBenchmarksReport): string {\n const lines: string[] = []\n const w = Math.max(8, ...report.rows.map((r) => r.cell.length))\n const b = Math.max(9, ...report.rows.map((r) => r.benchmark.length))\n lines.push(`${'benchmark'.padEnd(b)} ${'cell'.padEnd(w)} resolve mean n err`)\n for (const r of report.rows)\n lines.push(\n `${r.benchmark.padEnd(b)} ${r.cell.padEnd(w)} ${(r.resolveRate * 100).toFixed(1).padStart(6)}% ${r.meanScore.toFixed(3).padStart(5)} ${String(r.n).padStart(3)} ${String(r.errored).padStart(3)}`,\n )\n for (const u of report.unavailable) lines.push(`(skipped ${u.benchmark}: ${u.reason})`)\n return lines.join('\\n')\n}\n","/**\n * The ONE harness → worker-client mapping for the bench layer. Every bench entrypoint\n * (rsi.ts, run.ts, …) derives the `SandboxClient` the kernel's `runLoop` drives from a single\n * selector instead of hand-rolling the branch:\n *\n * - `router` → OFF-BOX: a router chat-completion as the leaf executor, presented\n * as a SandboxClient (no sandbox dependency). For deployable-checker\n * domains whose worker is a completion, or where box egress is blocked.\n * - `router` + searchProvider → OFF-BOX `router-tools`: the same off-box loop with a live\n * `web_search` tool (the capability axis research benches need).\n * - `bridge` → OFF-BOX: a local cli-bridge fronting a harness CLI\n * (opencode/kimi-code/…) as the leaf executor. Same resumable\n * `bridgeExecutor` the supervisor uses; harness+model ride the\n * bridge `model` id (`${harness}/${model}`).\n * - anything else (`sandbox`/a BackendType) → IN-BOX: a real `Sandbox`. The in-box backend\n * TYPE (opencode/codex/…) is set separately on the `AgentRunSpec`;\n * this only decides off-box-vs-in-box transport for `runLoop`.\n *\n * Centralizing it here means a new entrypoint gets the full off-box/in-box matrix for free and\n * the mapping can't drift between callers.\n */\nimport {\n createExecutor,\n inlineSandboxClient,\n resolveSandboxClient,\n type SandboxClient,\n} from '@tangle-network/agent-runtime/loops'\nimport { Sandbox } from '@tangle-network/sandbox'\nimport { makeSearchExecutor, webSearchTool } from './search-tool'\n\nexport interface ResolveBenchClientOptions {\n /** The selector (the `BACKEND` env value): `router` = off-box; anything else = in-box Sandbox. */\n backend: string\n routerBaseUrl: string\n routerKey: string\n model: string\n /** When set on the `router` backend, the off-box worker becomes a `router-tools` agentic loop\n * with a live `web_search` tool backed by this provider (`you`/`exa`/…). */\n searchProvider?: string\n sandboxBaseUrl?: string\n /** In-box sandbox timeout (ms). Also the per-turn deadline for the `bridge` backend. */\n timeoutMs?: number\n /** `bridge` backend: cli-bridge base URL. Defaults to `http://127.0.0.1:3355`. */\n bridgeUrl?: string\n /** `bridge` backend: bearer the bridge requires. Falls back to `routerKey` when unset. */\n bridgeBearer?: string\n}\n\nexport function resolveBenchClient(opts: ResolveBenchClientOptions): SandboxClient {\n const { backend, routerBaseUrl, routerKey, model, searchProvider } = opts\n if (backend === 'router') {\n if (searchProvider) {\n return inlineSandboxClient(\n createExecutor({\n backend: 'router-tools',\n routerBaseUrl,\n routerKey,\n model,\n tools: [webSearchTool],\n executeToolCall: makeSearchExecutor({ routerBaseUrl, routerKey, provider: searchProvider }),\n }),\n )\n }\n return inlineSandboxClient(createExecutor({ backend: 'router', routerBaseUrl, routerKey, model }))\n }\n if (backend === 'bridge') {\n // bench's bearer fallback (`?? routerKey`) resolves first, then the shared\n // resolver core wires the bridge seam — no re-implemented createExecutor branch.\n const bridgeBearer = opts.bridgeBearer ?? routerKey\n if (!bridgeBearer) throw new Error(\"resolveBenchClient: backend 'bridge' needs bridgeBearer or routerKey\")\n return resolveSandboxClient({\n backend: 'bridge',\n bridge: { url: opts.bridgeUrl, bearer: bridgeBearer, model, timeoutMs: opts.timeoutMs },\n })\n }\n return new Sandbox({\n baseUrl: opts.sandboxBaseUrl ?? 'https://sandbox.tangle.tools',\n apiKey: routerKey,\n timeoutMs: opts.timeoutMs ?? 1_200_000,\n } as never)\n}\n","/**\n * A host-side web-search tool for the `router-tools` worker backend. This is the\n * capability axis the research benches were missing: finsearch's prompt demands\n * \"live web/market sources\", but the plain `router` chat backend has no tools, so\n * the worker can only recall/hallucinate. Wiring this tool into a `router-tools`\n * loop gives the off-box worker a real `web_search(query)` it can call, backed by\n * the Tangle router's search providers (you.com / exa). Off-box = unaffected by a\n * sandbox's egress allowlist.\n *\n * The tool result the model reads is a compact text block of the top hits\n * (title · date · snippet · url). Transport/HTTP failures fail loud (throw) so a\n * broken search backend infra-excludes the cell instead of silently degrading to\n * a recall-only answer; a valid-but-empty result returns an explicit \"no results\"\n * string the model can reason about.\n */\nimport type { ToolSpec } from '@tangle-network/agent-runtime/loops'\n\nexport const webSearchTool: ToolSpec = {\n type: 'function',\n function: {\n name: 'web_search',\n description:\n 'Search the live web for current facts, market data, filings, and news. Returns the top results as title, date, snippet, and URL. Call it as many times as needed, refining the query, before you answer.',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'The search query. Be specific — include entity, metric, period, and units.',\n },\n },\n required: ['query'],\n },\n },\n}\n\ninterface SearchHit {\n title?: string\n url?: string\n snippet?: string\n publishedAt?: string\n}\n\ninterface SearchResponse {\n data?: SearchHit[]\n}\n\nconst formatHits = (hits: SearchHit[], maxHits: number): string => {\n if (hits.length === 0) return 'No results found for that query. Try a different query.'\n return hits\n .slice(0, maxHits)\n .map((h, i) => {\n const date = h.publishedAt ? ` (${h.publishedAt.slice(0, 10)})` : ''\n return `[${i + 1}] ${h.title ?? '(untitled)'}${date}\\n${h.snippet ?? ''}\\n${h.url ?? ''}`\n })\n .join('\\n\\n')\n}\n\n/**\n * Build the `executeToolCall` handler for a `router-tools` worker. `provider` is a\n * router search provider (`you` | `exa`). `maxHits` bounds the text folded back\n * into the model's context per call.\n */\nexport const makeSearchExecutor = (cfg: {\n routerBaseUrl: string\n routerKey: string\n provider: string\n maxHits?: number\n}): ((name: string, args: Record<string, unknown>, task: unknown) => Promise<string>) => {\n const maxHits = cfg.maxHits ?? 6\n return async (name, args) => {\n if (name !== webSearchTool.function.name) {\n throw new Error(`search executor received unknown tool '${name}' (only '${webSearchTool.function.name}')`)\n }\n const query = typeof args.query === 'string' ? args.query.trim() : ''\n if (!query) return 'web_search requires a non-empty \"query\" string.'\n\n const res = await fetch(`${cfg.routerBaseUrl}/search`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${cfg.routerKey}` },\n body: JSON.stringify({ provider: cfg.provider, query }),\n })\n if (!res.ok) {\n // Fail loud: a search-backend fault must infra-exclude the cell, not silently\n // become a recall-only (no-tool) answer that pollutes the capability test.\n throw new Error(`web_search ${cfg.provider} HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`)\n }\n const body = (await res.json()) as SearchResponse\n const hits = body.data ?? []\n // Tool use is a behavior worth seeing in the bench log — a research worker that\n // never searches is the failure mode this tool exists to fix.\n console.error(` [web_search:${cfg.provider}] \"${query.slice(0, 80)}\" -> ${hits.length} hits`)\n return formatHits(hits, maxHits)\n }\n}\n","/**\n * Bounded-concurrency pool — the ONE pool every batch runner uses.\n *\n * Every batch-* command, the finsearch loop, and terminal-compare hand-rolled the\n * same shape: a shared `next` cursor, `Math.min(concurrency, items.length)` drain\n * workers, and `Promise.all` over them. That boilerplate lives here once.\n * Aggregation and console output stay at each call site — the pool owns scheduling,\n * nothing else. Item-agnostic on purpose: a pool shouldn't know about BenchTask\n * (terminal-compare pools over task-id strings), so it's generic in the item type.\n *\n * A worker that throws yields `{ ok:false, error }` for THAT item; the batch never\n * aborts because one item failed. Results are returned in item order (indexed by\n * the item's position), not completion order.\n */\n\nexport interface PoolOutcome<T, R> {\n index: number\n item: T\n ok: boolean\n value?: R\n error?: string\n}\n\nexport async function runPool<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>,\n opts?: { onResult?: (o: PoolOutcome<T, R>) => void },\n): Promise<PoolOutcome<T, R>[]> {\n const results: PoolOutcome<T, R>[] = new Array(items.length)\n let next = 0\n const drain = async (): Promise<void> => {\n while (next < items.length) {\n const index = next++\n const item = items[index] as T\n let outcome: PoolOutcome<T, R>\n try {\n outcome = { index, item, ok: true, value: await worker(item, index) }\n } catch (err) {\n outcome = { index, item, ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n results[index] = outcome\n opts?.onResult?.(outcome)\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, drain))\n return results\n}\n","/** Pier transport for a runtime-prepared immutable candidate execution. */\nimport assert from 'node:assert/strict'\nimport { createHash } from 'node:crypto'\nimport { chmod, lstat, mkdir, realpath, writeFile } from 'node:fs/promises'\nimport { dirname, isAbsolute, join, resolve } from 'node:path'\n\nimport type {\n AgentCandidateBenchmarkGraderPort,\n AgentCandidateExecutionClaimStore,\n AgentCandidateExecutorRequest,\n AgentCandidateExecutorStopRequest,\n AgentCandidateExecutorPort,\n AgentCandidateOutputArtifactPort,\n AgentCandidateProtectedRunCapture,\n AgentCandidateRunFinalization,\n PreparedAgentCandidateExecution,\n} from '@tangle-network/agent-runtime'\nimport { executePreparedAgentCandidate } from '@tangle-network/agent-runtime'\nimport { canonicalJson, type TraceStore } from '@tangle-network/agent-eval'\n\nimport { capturePierTaskOutcome } from './pier-task-outcome'\n\nconst adapterImportPath = 'pier_agents.tangle_candidate:TangleCandidateAgent'\nconst sha256Pattern = /^sha256:[a-f0-9]{64}$/\n\ninterface StagePreparedPierCandidateOptions {\n readonly prepared: PreparedAgentCandidateExecution\n /** Evaluator-owned directory persisted with the Pier trial. */\n readonly directory: string\n /** Exact Pier package version pinned by the experiment contract. */\n readonly pierVersion: string\n}\n\nexport interface StagedPierCandidateExecution {\n readonly executionId: string\n readonly directory: string\n readonly taskDirectory: string\n readonly candidateDirectory?: string\n readonly profileDirectory: string\n readonly planPath: string\n readonly receiptPath: string\n readonly agentArgs: readonly string[]\n /** Executor-only model and trace bindings; never present on the prepared object or disk. */\n readonly evaluatorEnv: Readonly<Record<string, string>>\n /** One prepared execution is exactly one Pier trial attempt. */\n readonly attemptArgs: readonly ['--n-attempts', '1', '--max-retries', '0']\n}\n\nexport interface PierCandidateTerminationAcknowledgement {\n /** The Pier process has exited and has been reaped. */\n readonly processExited: true\n /** Every task container created for this one trial has been removed. */\n readonly containersRemoved: true\n}\n\nexport interface PierCandidateTrialHandle {\n /** Non-secret durable identity shared with a fresh evaluator process. */\n readonly identity: PierCandidateTrialIdentity\n /** Resolves only after the Pier process exits and its task container is gone. */\n readonly result: Promise<PierCandidateTrialResult>\n /** Idempotently kill/reap Pier and remove its task container, then acknowledge their death. */\n readonly terminateAndWait: () => Promise<PierCandidateTerminationAcknowledgement>\n}\n\nexport type PierCandidateTrialIdentity = Readonly<AgentCandidateExecutorStopRequest>\n\n/**\n * Evaluator-owned lifecycle whose stop path works without the process-local\n * handle returned by `start`.\n */\nexport interface PierCandidateTrialController {\n start(\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ): PierCandidateTrialHandle\n terminateAndWait(\n identity: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTerminationAcknowledgement>\n /** Read immutable official bytes after termination; undefined proves no result was emitted. */\n captureResult(identity: PierCandidateTrialIdentity): Promise<PierCandidateTrialResult | undefined>\n}\n\n/** Evaluator-owned bytes captured from one completed official Pier trial. */\nexport interface PierCandidateTrialResult {\n /** Parsed value of the exact `result.json` bytes. */\n readonly value: unknown\n /** Exact official `result.json` bytes used as grader evidence. */\n readonly resultBytes: Uint8Array\n /** Exact `/logs/artifacts/model.patch` bytes emitted before official tests. */\n readonly taskPatch: Uint8Array\n}\n\nexport interface PierCandidateOfficialResult {\n readonly value: unknown\n readonly bytes: Uint8Array\n}\n\ntype RuntimeGraderInput = Parameters<AgentCandidateBenchmarkGraderPort['run']>[0]\ntype RuntimeGraderResult = Awaited<ReturnType<AgentCandidateBenchmarkGraderPort['run']>>\n\n/** Executes the exact admitted grader bytes against the official Pier result. */\nexport interface PierCandidateGraderPort {\n readonly name: string\n readonly version: string\n readonly artifact: AgentCandidateBenchmarkGraderPort['artifact']\n run(input: RuntimeGraderInput & {\n readonly officialResult: PierCandidateOfficialResult\n }): Promise<RuntimeGraderResult>\n}\n\nexport interface ExecutePreparedPierCandidateOptions extends StagePreparedPierCandidateOptions {\n readonly traceStore: TraceStore\n /** Durable one-shot store shared by every process capable of running this benchmark. */\n readonly claimStore: AgentCandidateExecutionClaimStore\n readonly outputArtifacts: AgentCandidateOutputArtifactPort\n readonly grader: PierCandidateGraderPort\n /**\n * Starts exactly one Pier trial synchronously and persists its non-secret\n * process/container identity before returning.\n */\n readonly controller: PierCandidateTrialController\n}\n\n/** Recovery-only runtime executor for an expired attempt owned by another process. */\nexport function createPierCandidateRecoveryExecutor(\n controller: PierCandidateTrialController,\n): AgentCandidateExecutorPort {\n return {\n execute: async () => {\n throw new Error('recovery-only Pier executor cannot start a candidate')\n },\n stop: async (request) => {\n assertTerminationAcknowledged(\n await controller.terminateAndWait({\n executionId: request.executionId,\n executionPlanDigest: request.executionPlanDigest,\n }),\n )\n return { stopped: true }\n },\n capture: async (request) => {\n const result = await controller.captureResult(request)\n if (!result) return {}\n return {\n evidence: Buffer.from(\n canonicalJson({\n schemaVersion: 1,\n kind: 'pier-candidate-recovery-capture',\n executionPlanDigest: request.executionPlanDigest,\n officialResult: Buffer.from(result.resultBytes).toString('base64'),\n taskPatch: Buffer.from(result.taskPatch).toString('base64'),\n }),\n ),\n }\n },\n }\n}\n\ninterface PierResultLike {\n exception_info?: unknown\n agent_result?: unknown\n}\n\nfunction sha256(bytes: Uint8Array): `sha256:${string}` {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (!value || value.includes('\\0')) throw new Error(`${label} must be non-empty without NUL`)\n return value\n}\n\nfunction absoluteHostPath(value: string, label: string): string {\n if (!isAbsolute(value)) throw new Error(`${label} must be an absolute host path`)\n return resolve(value)\n}\n\nfunction digest(value: string, label: string): string {\n if (!sha256Pattern.test(value)) throw new Error(`${label} is not a SHA-256 digest`)\n return value\n}\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction parseExactJson(bytes: Uint8Array, label: string): unknown {\n try {\n return JSON.parse(Buffer.from(bytes).toString('utf8'))\n } catch (error) {\n throw new Error(`${label} bytes are not UTF-8 JSON`, { cause: error })\n }\n}\n\nfunction safeRelativePath(value: string, label: string): string {\n const parts = value.split('/')\n if (\n !value ||\n value.includes('\\0') ||\n value.includes('\\\\') ||\n isAbsolute(value) ||\n parts.some((part) => !part || part === '.' || part === '..')\n ) {\n throw new Error(`${label} must be a canonical relative POSIX path`)\n }\n return value\n}\n\nasync function assertRealDirectory(path: string, label: string): Promise<void> {\n const stats = await lstat(path)\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(`${label} must be a real directory`)\n }\n if ((await realpath(path)) !== path) {\n throw new Error(`${label} has a symlinked path component`)\n }\n}\n\ninterface ExpectedExecutorFile {\n readonly path: string\n readonly mode: number\n readonly sha256: string\n readonly byteLength?: number\n}\n\nasync function materializeExecutorFiles(\n root: string,\n files: AgentCandidateExecutorRequest['inputs']['profile']['files'],\n expected: readonly ExpectedExecutorFile[],\n label: string,\n): Promise<void> {\n const expectedByPath = new Map(expected.map((file) => [file.path, file]))\n if (expectedByPath.size !== expected.length || files.length !== expected.length) {\n throw new Error(`${label} file set differs from signed evidence`)\n }\n\n await mkdir(root, { mode: 0o700 })\n await assertRealDirectory(root, label)\n for (const file of files) {\n const relative = safeRelativePath(file.path, `${label} file path`)\n const identity = expectedByPath.get(relative)\n if (!identity) throw new Error(`${label} contains unsigned file ${relative}`)\n if (\n file.mode !== identity.mode ||\n sha256(file.bytes) !== identity.sha256 ||\n (identity.byteLength !== undefined && file.bytes.byteLength !== identity.byteLength)\n ) {\n throw new Error(`${label} file ${relative} differs from signed evidence`)\n }\n\n const target = join(root, relative)\n const parent = dirname(target)\n if (parent !== root) await mkdir(parent, { recursive: true, mode: 0o700 })\n await writeFile(target, file.bytes, { flag: 'wx', mode: 0o600 })\n await chmod(target, file.mode)\n const stats = await lstat(target)\n if (\n !stats.isFile() ||\n stats.isSymbolicLink() ||\n stats.nlink !== 1 ||\n (stats.mode & 0o777) !== file.mode\n ) {\n throw new Error(`${label} file ${relative} is not a singly-linked regular file`)\n }\n }\n}\n\nfunction protectedEnvironment(\n prepared: PreparedAgentCandidateExecution,\n request: AgentCandidateExecutorRequest,\n): Readonly<Record<string, string>> {\n const protectedEntries: Array<readonly [string, string]> = []\n for (const [name, value] of Object.entries(request.launch.env)) {\n const publicValue = prepared.launch.env[name]\n if (publicValue === undefined) {\n protectedEntries.push([name, value])\n } else if (publicValue !== value) {\n throw new Error(`executor request changed signed public environment ${name}`)\n }\n }\n for (const name of Object.keys(prepared.launch.env)) {\n if (!(name in request.launch.env)) {\n throw new Error(`executor request omitted signed public environment ${name}`)\n }\n }\n return Object.freeze(Object.fromEntries(protectedEntries))\n}\n\n/**\n * Persist the runtime's exact canonical bytes and return only Pier transport\n * arguments. No benchmark-specific plan or candidate-authored telemetry exists.\n */\n/** @internal Package-private transport seam exercised by adapter tests. */\nexport async function stagePreparedPierCandidateExecution(\n options: StagePreparedPierCandidateOptions,\n request: AgentCandidateExecutorRequest,\n): Promise<StagedPierCandidateExecution> {\n const { prepared } = options\n nonEmpty(options.pierVersion, 'pierVersion')\n const directory = absoluteHostPath(options.directory, 'directory')\n await mkdir(directory, { mode: 0o700 })\n await assertRealDirectory(directory, 'directory')\n if (request.memory.mode !== 'disabled') {\n throw new Error('Pier transport does not yet implement protected isolated memory')\n }\n const taskDirectory = join(directory, 'task')\n const candidateDirectory = request.inputs.candidate ? join(directory, 'candidate') : undefined\n const profileDirectory = join(directory, 'profile')\n await materializeExecutorFiles(\n taskDirectory,\n request.inputs.task.files,\n request.inputs.task.snapshot.material.files,\n 'task executor input',\n )\n if (request.inputs.candidate && candidateDirectory) {\n await materializeExecutorFiles(\n candidateDirectory,\n request.inputs.candidate.files,\n request.inputs.candidate.snapshot.material.files,\n 'candidate executor input',\n )\n }\n await materializeExecutorFiles(\n profileDirectory,\n request.profileActivation.files.map((file) => ({\n path: file.path,\n mode: file.mode,\n bytes: Buffer.from(file.content, 'utf8'),\n })),\n request.profilePlan.value.material.files.map((file) => ({\n path: file.relPath,\n mode: file.mode,\n sha256: file.contentSha256,\n })),\n 'profile executor input',\n )\n\n const planDigest = digest(request.executionPlan.value.digest, 'execution plan digest')\n if (sha256(request.executionPlan.bytes) !== planDigest) {\n throw new Error('prepared execution-plan bytes do not match their runtime digest')\n }\n assert.deepEqual(\n parseExactJson(request.executionPlan.bytes, 'execution plan'),\n request.executionPlan.value.material,\n 'prepared execution-plan bytes differ from runtime material',\n )\n\n const receiptDigest = digest(\n request.materializationReceipt.digest,\n 'materialization receipt digest',\n )\n if (sha256(request.materializationReceipt.bytes) !== receiptDigest) {\n throw new Error('prepared materialization-receipt bytes do not match their runtime digest')\n }\n const { digest: _receiptDigest, ...receiptMaterial } = request.materializationReceipt.value\n assert.deepEqual(\n parseExactJson(request.materializationReceipt.bytes, 'materialization receipt'),\n receiptMaterial,\n 'prepared receipt bytes differ from runtime material',\n )\n\n const planPath = join(directory, 'execution-plan.json')\n const receiptPath = join(directory, 'materialization-receipt.json')\n await Promise.all([\n writeFile(planPath, request.executionPlan.bytes, { mode: 0o600, flag: 'wx' }),\n writeFile(receiptPath, request.materializationReceipt.bytes, { mode: 0o600, flag: 'wx' }),\n ])\n\n const agentArgs = [\n '--agent-import-path',\n adapterImportPath,\n '--model',\n nonEmpty(request.resolvedModel.requested, 'resolved requested model'),\n '--agent-kwarg',\n `plan_path=${planPath}`,\n '--agent-kwarg',\n `receipt_path=${receiptPath}`,\n '--agent-kwarg',\n `expected_receipt_digest=${receiptDigest}`,\n '--agent-kwarg',\n `trace_run_id=${nonEmpty(request.trace.runId, 'trace run id')}`,\n '--agent-kwarg',\n `task_dir=${taskDirectory}`,\n '--agent-kwarg',\n `profile_dir=${profileDirectory}`,\n '--agent-kwarg',\n `pier_version=${options.pierVersion}`,\n ]\n if (candidateDirectory !== undefined) {\n agentArgs.push('--agent-kwarg', `candidate_dir=${candidateDirectory}`)\n }\n\n return {\n executionId: request.executionId,\n directory,\n taskDirectory,\n ...(candidateDirectory ? { candidateDirectory } : {}),\n profileDirectory,\n planPath,\n receiptPath,\n agentArgs,\n evaluatorEnv: protectedEnvironment(prepared, request),\n attemptArgs: ['--n-attempts', '1', '--max-retries', '0'],\n }\n}\n\nfunction exceptionType(value: unknown): string | undefined {\n const info = value && typeof value === 'object' ? (value as Record<string, unknown>) : undefined\n for (const key of ['exception_type', 'type', 'name']) {\n if (typeof info?.[key] === 'string') return info[key]\n }\n return undefined\n}\n\n/** Read only identity and termination from Pier; usage always comes from agent-eval. */\n/** @internal Package-private result parser exercised by adapter tests. */\nexport function protectedCaptureFromPierResult(\n request: AgentCandidateExecutorRequest,\n value: unknown,\n): AgentCandidateProtectedRunCapture {\n const result = record(value, 'Pier trial result') as PierResultLike\n const agentResult = record(result.agent_result, 'Pier agent_result')\n const metadata = record(agentResult.metadata, 'Pier agent_result.metadata')\n const expected = {\n executionId: request.executionId,\n bundleDigest: request.executionPlan.value.material.runCell.bundleDigest,\n executionPlanDigest: request.executionPlan.value.digest,\n materializationReceiptDigest: request.materializationReceipt.digest,\n }\n for (const [name, identity] of Object.entries(expected)) {\n if (metadata[name] !== identity) {\n throw new Error(`Pier result ${name} does not match the prepared execution`)\n }\n }\n\n const reported = record(metadata.termination, 'Pier termination')\n const type = exceptionType(result.exception_info)\n if (type?.includes('AgentTimeout')) {\n return {\n executionId: request.executionId,\n termination: {\n kind: 'timeout',\n timeoutMs: request.hardLimits.timeoutMs,\n },\n }\n }\n if (type?.includes('Cancelled') || reported.kind === 'cancelled') {\n return { executionId: request.executionId, termination: { kind: 'cancelled' } }\n }\n if (reported.kind === 'exit' && Number.isInteger(reported.exitCode)) {\n return {\n executionId: request.executionId,\n termination: { kind: 'exit', exitCode: reported.exitCode as number },\n }\n }\n throw new Error(`Pier result has no recognized truthful termination${type ? ` (${type})` : ''}`)\n}\n\nfunction sealPierTrialResult(value: PierCandidateTrialResult): PierCandidateTrialResult {\n if (!(value.resultBytes instanceof Uint8Array) || !(value.taskPatch instanceof Uint8Array)) {\n throw new Error('Pier trial result must contain raw result and patch bytes')\n }\n const parsed = parseExactJson(value.resultBytes, 'Pier result.json')\n assert.deepEqual(parsed, value.value, 'Pier parsed result differs from result.json bytes')\n const resultBytes = Uint8Array.from(value.resultBytes)\n const taskPatch = Uint8Array.from(value.taskPatch)\n return Object.freeze({\n value: parsed,\n get resultBytes(): Uint8Array {\n return Uint8Array.from(resultBytes)\n },\n get taskPatch(): Uint8Array {\n return Uint8Array.from(taskPatch)\n },\n })\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n return new Error(`Pier candidate execution aborted${reason ? `: ${String(reason)}` : ''}`)\n}\n\nfunction assertTerminationAcknowledged(\n acknowledgement: PierCandidateTerminationAcknowledgement,\n): void {\n if (acknowledgement.processExited !== true || acknowledgement.containersRemoved !== true) {\n throw new Error('Pier termination did not acknowledge process and container death')\n }\n}\n\n/** @internal Package-private cancellation seam exercised by adapter tests. */\nexport async function awaitAbortableTrial<T>(\n trial: Omit<PierCandidateTrialHandle, 'result'> & { readonly result: Promise<T> },\n signal: AbortSignal,\n): Promise<T> {\n if (signal.aborted) {\n assertTerminationAcknowledged(await trial.terminateAndWait())\n throw abortReason(signal)\n }\n\n return await new Promise<T>((resolveResult, reject) => {\n let settled = false\n let aborting = false\n const settle = (callback: () => void): void => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n callback()\n }\n const onAbort = (): void => {\n aborting = true\n void trial.terminateAndWait().then(\n (acknowledgement) => {\n try {\n assertTerminationAcknowledged(acknowledgement)\n settle(() => reject(abortReason(signal)))\n } catch (error) {\n settle(() => reject(error))\n }\n },\n (error) => settle(() => reject(new Error('Pier termination failed', { cause: error }))),\n )\n }\n signal.addEventListener('abort', onAbort, { once: true })\n trial.result.then(\n (result) => {\n if (!aborting && !signal.aborted) settle(() => resolveResult(result))\n },\n (error) => {\n if (!aborting && !signal.aborted) settle(() => reject(error))\n },\n )\n })\n}\n\n/** Execute and finalize through the runtime's only gradable candidate path. */\nexport async function executePreparedPierCandidate(\n options: ExecutePreparedPierCandidateOptions,\n): Promise<AgentCandidateRunFinalization> {\n const trials = new Map<\n string,\n { readonly handle: PierCandidateTrialHandle; result?: PierCandidateTrialResult }\n >()\n const officialResults = new Map<string, PierCandidateTrialResult>()\n const trialIdentity = (executionId: string, executionPlanDigest: string): string =>\n JSON.stringify([executionId, executionPlanDigest])\n const executor: AgentCandidateExecutorPort = {\n execute: async (request, context) => {\n context.signal.throwIfAborted()\n const staged = await stagePreparedPierCandidateExecution(options, request)\n context.signal.throwIfAborted()\n const identity = trialIdentity(request.executionId, request.executionPlan.value.digest)\n if (trials.has(identity)) throw new Error('Pier trial identity is already active')\n const trial = options.controller.start(staged, {\n request,\n traceStore: context.traceStore,\n signal: context.signal,\n deadlineAtMs: context.deadlineAtMs,\n })\n if (\n trial.identity.executionId !== request.executionId ||\n trial.identity.executionPlanDigest !== request.executionPlan.value.digest\n ) {\n assertTerminationAcknowledged(await trial.terminateAndWait())\n throw new Error('Pier controller returned a different durable trial identity')\n }\n const active = { handle: trial } as {\n readonly handle: PierCandidateTrialHandle\n result?: PierCandidateTrialResult\n }\n trials.set(identity, active)\n const result = sealPierTrialResult(await awaitAbortableTrial(trial, context.signal))\n active.result = result\n officialResults.set(request.executionId, result)\n return protectedCaptureFromPierResult(request, result.value)\n },\n stop: async (request) => {\n assertTerminationAcknowledged(\n await options.controller.terminateAndWait({\n executionId: request.executionId,\n executionPlanDigest: request.executionPlanDigest,\n }),\n )\n return { stopped: true }\n },\n capture: async (request) => {\n const identity = trialIdentity(request.executionId, request.executionPlanDigest)\n const active = trials.get(identity)\n let result = active?.result\n if (!result && active) {\n try {\n result = sealPierTrialResult(await active.handle.result)\n } catch {\n result = undefined\n }\n }\n if (!result) {\n const recovered = await options.controller.captureResult(request)\n result = recovered ? sealPierTrialResult(recovered) : undefined\n }\n if (!result) return {}\n officialResults.set(request.executionId, result)\n const task = options.prepared.benchmark.task\n const outcome = task.outcome\n if (outcome.kind !== 'workspace') {\n throw new Error('Pier candidate execution requires a workspace task outcome')\n }\n const repository = task.repository\n if (!repository) throw new Error('Pier workspace task is missing repository identity')\n const taskOutcome = await capturePierTaskOutcome({\n repositoryRoot: options.prepared.roots.staging.taskRoot,\n baseCommit: repository.baseCommit,\n baseTree: repository.baseTree,\n patch: result.taskPatch,\n })\n trials.delete(identity)\n return { taskOutcome }\n },\n }\n const grader: AgentCandidateBenchmarkGraderPort = {\n name: options.grader.name,\n version: options.grader.version,\n artifact: options.grader.artifact,\n run: async (input) => {\n const official = officialResults.get(input.executionId)\n if (!official) throw new Error('Pier official result is missing for executable grading')\n return await options.grader.run({\n ...input,\n officialResult: {\n value: parseExactJson(official.resultBytes, 'Pier result.json'),\n bytes: Uint8Array.from(official.resultBytes),\n },\n })\n },\n }\n try {\n return await executePreparedAgentCandidate(options.prepared, {\n executor,\n grader,\n outputArtifacts: options.outputArtifacts,\n traceStore: options.traceStore,\n claimStore: options.claimStore,\n })\n } finally {\n officialResults.clear()\n trials.clear()\n }\n}\n","/** Reconstruct a runtime task outcome from Pier's evaluator-captured binary patch. */\nimport { spawn } from 'node:child_process'\nimport { mkdir, mkdtemp, realpath, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nimport {\n type AgentCandidateExecutorTaskOutcomeCapture,\n captureAgentCandidateWorkspaceFiles,\n} from '@tangle-network/agent-runtime/candidate-execution'\n\ninterface GitResult {\n readonly stdout: Buffer\n readonly stderr: Buffer\n}\n\n/** Apply the official patch in an isolated Git object directory and capture its exact tree. */\nexport async function capturePierTaskOutcome(input: {\n readonly repositoryRoot: string\n readonly baseCommit: string\n readonly baseTree: string\n readonly patch: Uint8Array\n readonly signal?: AbortSignal\n}): Promise<Extract<AgentCandidateExecutorTaskOutcomeCapture, { kind: 'workspace' }>> {\n input.signal?.throwIfAborted()\n const repositoryRoot = resolve(input.repositoryRoot)\n const head = (await git(repositoryRoot, ['rev-parse', 'HEAD'], undefined, {}, input.signal)).stdout\n .toString('utf8')\n .trim()\n const headTree = (\n await git(repositoryRoot, ['rev-parse', 'HEAD^{tree}'], undefined, {}, input.signal)\n ).stdout\n .toString('utf8')\n .trim()\n if (head !== input.baseCommit || headTree !== input.baseTree) {\n throw new Error('Pier task outcome repository drifted from its signed base')\n }\n const gitDir = resolve(\n (\n await git(repositoryRoot, ['rev-parse', '--absolute-git-dir'], undefined, {}, input.signal)\n ).stdout\n .toString('utf8')\n .trim(),\n )\n if ((await realpath(gitDir)) !== gitDir || gitDir.includes(':')) {\n throw new Error('Pier task outcome Git directory is unsupported')\n }\n const replacements = (\n await git(\n repositoryRoot,\n ['for-each-ref', '--format=%(refname)', 'refs/replace'],\n undefined,\n {},\n input.signal,\n )\n ).stdout\n .toString('utf8')\n .trim()\n if (replacements) throw new Error('Pier task outcome repository contains Git replace refs')\n\n const temporary = await mkdtemp(join(tmpdir(), 'pier-task-outcome-'))\n try {\n const objectDirectory = join(temporary, 'objects')\n const indexFile = join(temporary, 'index')\n await mkdir(objectDirectory)\n const environment = {\n GIT_INDEX_FILE: indexFile,\n GIT_OBJECT_DIRECTORY: objectDirectory,\n GIT_ALTERNATE_OBJECT_DIRECTORIES: join(gitDir, 'objects'),\n }\n await git(repositoryRoot, ['read-tree', input.baseTree], undefined, environment, input.signal)\n const patch = Uint8Array.from(input.patch)\n if (patch.byteLength > 0) {\n await git(\n repositoryRoot,\n ['apply', '--cached', '--binary', '--whitespace=nowarn', '-'],\n patch,\n environment,\n input.signal,\n )\n }\n const resultTree = (\n await git(repositoryRoot, ['write-tree'], undefined, environment, input.signal)\n ).stdout\n .toString('utf8')\n .trim()\n const entries = parseTreeEntries(\n (\n await git(\n repositoryRoot,\n ['ls-tree', '-rz', '--full-tree', resultTree],\n undefined,\n environment,\n input.signal,\n )\n ).stdout,\n )\n if (entries.length === 0) throw new Error('Pier task outcome tree cannot be empty')\n const files = await Promise.all(\n entries.map(async (entry) => {\n if (entry.type !== 'blob' || (entry.mode !== '100644' && entry.mode !== '100755')) {\n throw new Error(`Pier task outcome contains a non-regular entry: ${entry.path}`)\n }\n return {\n path: safeGitPath(entry.path),\n mode: entry.mode === '100755' ? (0o755 as const) : (0o644 as const),\n bytes: (\n await git(\n repositoryRoot,\n ['cat-file', 'blob', entry.object],\n undefined,\n environment,\n input.signal,\n )\n ).stdout,\n }\n }),\n )\n // The executor outcome must still return exact bytes; the runtime verifies\n // and persists its final task references after this capture completes.\n const captured = await captureAgentCandidateWorkspaceFiles(files, {\n limits: { maxEmbeddedArtifactBytes: 512 * 1024 * 1024 },\n })\n return {\n kind: 'workspace',\n resultTree,\n afterState: captured.snapshot.material,\n archive: captured.archive,\n gitDiff: patch,\n }\n } finally {\n await rm(temporary, { recursive: true, force: true })\n }\n}\n\nfunction parseTreeEntries(bytes: Uint8Array): Array<{\n readonly mode: string\n readonly type: string\n readonly object: string\n readonly path: string\n}> {\n const raw = Buffer.from(bytes)\n const decoded = raw.toString('utf8')\n if (!Buffer.from(decoded, 'utf8').equals(raw)) {\n throw new Error('Pier task outcome contains a non-UTF-8 path')\n }\n return decoded\n .split('\\0')\n .filter(Boolean)\n .map((row) => {\n const tab = row.indexOf('\\t')\n const [mode, type, object] = row.slice(0, tab).split(' ')\n const path = row.slice(tab + 1)\n if (tab < 1 || !mode || !type || !object || !path) {\n throw new Error('Pier task outcome contains a malformed Git entry')\n }\n return { mode, type, object, path }\n })\n}\n\nfunction safeGitPath(path: string): string {\n const parts = path.split('/')\n if (\n !path ||\n path.startsWith('/') ||\n path.includes('\\\\') ||\n path.includes('\\0') ||\n parts.some((part) => !part || part === '.' || part === '..') ||\n parts[0]?.toLowerCase() === '.git'\n ) {\n throw new Error(`Pier task outcome contains an unsafe Git path: ${path}`)\n }\n return path\n}\n\nasync function git(\n repositoryRoot: string,\n args: readonly string[],\n input: Uint8Array | undefined,\n extraEnvironment: Readonly<Record<string, string>>,\n signal: AbortSignal | undefined,\n): Promise<GitResult> {\n signal?.throwIfAborted()\n const environment = Object.fromEntries(\n Object.entries(process.env).filter(([name]) => !name.startsWith('GIT_')),\n ) as Record<string, string>\n Object.assign(environment, {\n GIT_CONFIG_NOSYSTEM: '1',\n GIT_CONFIG_GLOBAL: '/dev/null',\n GIT_CONFIG_SYSTEM: '/dev/null',\n GIT_TERMINAL_PROMPT: '0',\n GIT_NO_REPLACE_OBJECTS: '1',\n LC_ALL: 'C',\n ...extraEnvironment,\n })\n return await new Promise((resolveResult, reject) => {\n const child = spawn(\n 'git',\n [\n '-c',\n 'core.hooksPath=/dev/null',\n '-c',\n 'protocol.file.allow=never',\n '-C',\n repositoryRoot,\n ...args,\n ],\n { env: environment, stdio: ['pipe', 'pipe', 'pipe'], signal },\n )\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let outputBytes = 0\n const collect = (target: Buffer[]) => (chunk: Buffer) => {\n outputBytes += chunk.byteLength\n if (outputBytes > 64 * 1024 * 1024) {\n child.kill('SIGKILL')\n reject(new Error(`git ${args[0] ?? '<command>'} exceeded the output limit`))\n return\n }\n target.push(Buffer.from(chunk))\n }\n child.stdout.on('data', collect(stdout))\n child.stderr.on('data', collect(stderr))\n child.once('error', reject)\n child.once('close', (code, childSignal) => {\n const out = Buffer.concat(stdout)\n const err = Buffer.concat(stderr)\n if (code !== 0) {\n reject(\n new Error(\n `git ${args[0] ?? '<command>'} failed (${childSignal ?? code}): ${err.toString('utf8').trim()}`,\n ),\n )\n return\n }\n resolveResult({ stdout: out, stderr: err })\n })\n child.stdin.end(input)\n })\n}\n","/** Restart-safe evaluator ownership for one Pier process and its Docker projects. */\nimport { execFileSync, spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport {\n accessSync,\n closeSync,\n constants,\n existsSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Writable } from 'node:stream'\n\nimport type { AgentCandidateExecutorRequest } from '@tangle-network/agent-runtime'\nimport type { TraceStore } from '@tangle-network/agent-eval'\n\nimport type {\n PierCandidateTerminationAcknowledgement,\n PierCandidateTrialController,\n PierCandidateTrialHandle,\n PierCandidateTrialIdentity,\n PierCandidateTrialResult,\n StagedPierCandidateExecution,\n} from './pier-agent'\n\nconst identityFile = 'identity.json'\nconst terminalFile = 'terminal.json'\nconst stopFile = 'stop-requested'\nconst sha256Pattern = /^sha256:[a-f0-9]{64}$/\nconst defaultDockerConnectionId = 'local-default'\n\ninterface ProcessIdentity {\n readonly pid: number\n readonly processGroupId: number\n readonly sessionId: number\n readonly startTicks: string\n}\n\ninterface PersistedTrialIdentity {\n readonly schemaVersion: 1\n readonly kind: 'pier-trial-identity'\n readonly state: 'allocating' | 'starting' | 'running'\n readonly executionId: string\n readonly executionPlanDigest: `sha256:${string}`\n readonly supervisor?: ProcessIdentity\n readonly pier?: ProcessIdentity\n readonly jobsDirectory: string\n readonly jobName: string\n readonly dockerCommand: string\n readonly dockerConnectionId: string\n}\n\ninterface PersistedTrialTerminal {\n readonly schemaVersion: 1\n readonly kind: 'pier-trial-terminal'\n readonly status: 'completed' | 'stopped' | 'failed'\n readonly processExited: boolean\n readonly containersRemoved: boolean\n readonly removedContainers?: number\n readonly exitCode?: number | null\n readonly signal?: NodeJS.Signals | null\n readonly error?: string\n readonly recoveredByPid?: number\n}\n\nexport interface PierCandidateProcessSpec {\n /** Returns launch data only. The controller, not this callback, starts the process. */\n readonly command: string\n readonly args: readonly string[]\n readonly cwd: string\n /** Exact Pier child environment. The controller adds its Docker connection variables. */\n readonly env: Readonly<Record<string, string | undefined>>\n readonly jobsDirectory: string\n /** Must be unique: the controller atomically reserves this Pier job directory. */\n readonly jobName: string\n readonly dockerCommand?: string\n /** Called only by the originating process after the supervisor reports clean exit. */\n readonly readResult: () => Promise<PierCandidateTrialResult>\n}\n\nexport interface PierDockerConnection {\n /** Stable, non-secret name that every recovery worker maps to the same Docker endpoint. */\n readonly id: string\n /** Exact variables needed by both Pier and Docker cleanup; values are never persisted. */\n readonly env: Readonly<Record<string, string | undefined>>\n}\n\nexport interface FilePierCandidateTrialControllerOptions {\n /** Shared evaluator-owned control root, available to crash-recovery workers. */\n readonly directory: string\n readonly launch?: (\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ) => PierCandidateProcessSpec\n /** Restart-safe reader for immutable official bytes under the persisted Pier job identity. */\n readonly readResult?: (input: {\n readonly jobsDirectory: string\n readonly jobName: string\n }) => Promise<PierCandidateTrialResult | undefined>\n /** Omit only for the default local Docker socket with no environment variables. */\n readonly dockerConnection?: PierDockerConnection\n readonly supervisorPath?: string\n readonly pollIntervalMs?: number\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (!value || value.includes('\\0')) throw new Error(`${label} must be non-empty without NUL`)\n return value\n}\n\nfunction stableDockerConnectionId(value: string): string {\n if (!/^[A-Za-z0-9._:-]{1,200}$/.test(value)) {\n throw new Error('Docker connection id must be a non-secret stable name')\n }\n return value\n}\n\nfunction absolutePath(value: string, label: string): string {\n if (!isAbsolute(value)) throw new Error(`${label} must be an absolute path`)\n return resolve(value)\n}\n\nfunction validateEnvironment(\n environment: Readonly<Record<string, string | undefined>>,\n label: string,\n): void {\n for (const [name, value] of Object.entries(environment)) {\n if (!name || name.includes('\\0') || value?.includes('\\0')) {\n throw new Error(`${label} contains an invalid name or value`)\n }\n }\n}\n\nfunction resolveExecutable(command: string, searchPath: string | undefined, label: string): string {\n nonEmpty(command, label)\n const candidates = command.includes('/')\n ? [absolutePath(command, label)]\n : (searchPath ?? '')\n .split(':')\n .filter(Boolean)\n .map((directory) => join(directory, command))\n for (const candidate of candidates) {\n try {\n accessSync(candidate, constants.X_OK)\n return realpathSync(candidate)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT' && (error as NodeJS.ErrnoException).code !== 'EACCES') {\n throw error\n }\n }\n }\n throw new Error(`${label} is not executable on the evaluator PATH`)\n}\n\nfunction syncDirectory(directory: string): void {\n const fd = openSync(directory, 'r')\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n}\n\nfunction writeJsonAtomic(directory: string, name: string, value: unknown): void {\n const target = join(directory, name)\n const temporary = join(directory, `.${name}.${process.pid}.${Date.now()}.tmp`)\n const fd = openSync(temporary, 'wx', 0o600)\n try {\n writeFileSync(fd, `${JSON.stringify(value)}\\n`, 'utf8')\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n renameSync(temporary, target)\n syncDirectory(directory)\n}\n\nfunction touchDurable(directory: string, name: string): void {\n try {\n const fd = openSync(join(directory, name), 'wx', 0o600)\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n syncDirectory(directory)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error\n }\n}\n\nfunction readJson(path: string, label: string): Record<string, unknown> {\n let value: unknown\n try {\n value = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n throw new Error(`${label} is not valid JSON`, { cause: error })\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction parseProcessIdentity(value: unknown, label: string): ProcessIdentity {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n const record = value as Record<string, unknown>\n if (\n !Number.isSafeInteger(record.pid) ||\n !Number.isSafeInteger(record.processGroupId) ||\n !Number.isSafeInteger(record.sessionId) ||\n typeof record.startTicks !== 'string' ||\n !/^\\d+$/.test(record.startTicks)\n ) {\n throw new Error(`${label} is malformed`)\n }\n return {\n pid: record.pid as number,\n processGroupId: record.processGroupId as number,\n sessionId: record.sessionId as number,\n startTicks: record.startTicks,\n }\n}\n\nfunction parsePersistedIdentity(path: string): PersistedTrialIdentity {\n const record = readJson(path, 'Pier trial identity')\n if (\n record.schemaVersion !== 1 ||\n record.kind !== 'pier-trial-identity' ||\n !['allocating', 'starting', 'running'].includes(record.state as string) ||\n typeof record.executionId !== 'string' ||\n typeof record.executionPlanDigest !== 'string' ||\n !sha256Pattern.test(record.executionPlanDigest) ||\n typeof record.jobsDirectory !== 'string' ||\n typeof record.jobName !== 'string' ||\n typeof record.dockerCommand !== 'string' ||\n typeof record.dockerConnectionId !== 'string'\n ) {\n throw new Error('Pier trial identity is malformed')\n }\n return {\n schemaVersion: 1,\n kind: 'pier-trial-identity',\n state: record.state as PersistedTrialIdentity['state'],\n executionId: record.executionId,\n executionPlanDigest: record.executionPlanDigest as `sha256:${string}`,\n ...(record.supervisor\n ? { supervisor: parseProcessIdentity(record.supervisor, 'Pier supervisor identity') }\n : {}),\n ...(record.pier ? { pier: parseProcessIdentity(record.pier, 'Pier process identity') } : {}),\n jobsDirectory: absolutePath(record.jobsDirectory, 'persisted jobs directory'),\n jobName: nonEmpty(record.jobName, 'persisted job name'),\n dockerCommand: nonEmpty(record.dockerCommand, 'persisted Docker command'),\n dockerConnectionId: stableDockerConnectionId(record.dockerConnectionId),\n }\n}\n\nfunction parseTerminal(path: string): PersistedTrialTerminal {\n const record = readJson(path, 'Pier trial terminal')\n const allowedKeys = new Set([\n 'schemaVersion',\n 'kind',\n 'status',\n 'processExited',\n 'containersRemoved',\n 'removedContainers',\n 'exitCode',\n 'signal',\n 'error',\n 'recoveredByPid',\n ])\n const hasMalformedOptionalField =\n (record.removedContainers !== undefined &&\n (!Number.isSafeInteger(record.removedContainers) || (record.removedContainers as number) < 0)) ||\n (record.exitCode !== undefined &&\n record.exitCode !== null &&\n !Number.isSafeInteger(record.exitCode)) ||\n (record.signal !== undefined &&\n record.signal !== null &&\n (typeof record.signal !== 'string' || !/^SIG[A-Z0-9]+$/.test(record.signal))) ||\n (record.error !== undefined && typeof record.error !== 'string') ||\n (record.recoveredByPid !== undefined &&\n (!Number.isSafeInteger(record.recoveredByPid) || (record.recoveredByPid as number) < 1))\n if (\n Object.keys(record).some((key) => !allowedKeys.has(key)) ||\n record.schemaVersion !== 1 ||\n record.kind !== 'pier-trial-terminal' ||\n !['completed', 'stopped', 'failed'].includes(record.status as string) ||\n typeof record.processExited !== 'boolean' ||\n typeof record.containersRemoved !== 'boolean' ||\n hasMalformedOptionalField\n ) {\n throw new Error('Pier trial terminal is malformed')\n }\n return {\n schemaVersion: 1,\n kind: 'pier-trial-terminal',\n status: record.status as PersistedTrialTerminal['status'],\n processExited: record.processExited,\n containersRemoved: record.containersRemoved,\n ...(record.removedContainers !== undefined\n ? { removedContainers: record.removedContainers as number }\n : {}),\n ...(record.exitCode !== undefined ? { exitCode: record.exitCode as number | null } : {}),\n ...(record.signal !== undefined ? { signal: record.signal as NodeJS.Signals | null } : {}),\n ...(record.error !== undefined ? { error: record.error as string } : {}),\n ...(record.recoveredByPid !== undefined\n ? { recoveredByPid: record.recoveredByPid as number }\n : {}),\n }\n}\n\nfunction processIdentity(pid: number): ProcessIdentity {\n const text = readFileSync(`/proc/${pid}/stat`, 'utf8')\n const closing = text.lastIndexOf(')')\n if (closing < 0) throw new Error(`cannot parse process identity for ${pid}`)\n const fields = text.slice(closing + 2).trim().split(/\\s+/)\n const processGroupId = Number(fields[2])\n const sessionId = Number(fields[3])\n const startTicks = fields[19]\n if (\n !Number.isSafeInteger(processGroupId) ||\n !Number.isSafeInteger(sessionId) ||\n !/^\\d+$/.test(startTicks ?? '')\n ) {\n throw new Error(`cannot parse process identity for ${pid}`)\n }\n return { pid, processGroupId, sessionId, startTicks }\n}\n\nfunction processMatches(identity: ProcessIdentity): boolean {\n try {\n const current = processIdentity(identity.pid)\n return (\n current.startTicks === identity.startTicks &&\n current.processGroupId === identity.processGroupId &&\n current.sessionId === identity.sessionId\n )\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false\n throw error\n }\n}\n\nfunction signalProcess(identity: ProcessIdentity, signal: NodeJS.Signals, group: boolean): void {\n if (!processMatches(identity)) return\n try {\n process.kill(group ? -identity.processGroupId : identity.pid, signal)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ESRCH') throw error\n }\n}\n\nfunction sessionMembers(sessionId: number): ProcessIdentity[] {\n const members: ProcessIdentity[] = []\n for (const entry of readdirSync('/proc', { withFileTypes: true })) {\n if (!entry.isDirectory() || !/^\\d+$/.test(entry.name)) continue\n try {\n const identity = processIdentity(Number(entry.name))\n if (identity.sessionId === sessionId) members.push(identity)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n }\n return members\n}\n\nasync function signalSessionUntilEmpty(\n identity: ProcessIdentity,\n signal: NodeJS.Signals,\n timeoutMs: number,\n intervalMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n while (true) {\n const members = sessionMembers(identity.sessionId)\n if (members.length === 0) return true\n for (const member of members) signalProcess(member, signal, false)\n if (Date.now() >= deadline) return false\n await sleep(intervalMs)\n }\n}\n\nfunction sanitizeProject(value: string): string {\n let project = value.toLowerCase()\n if (!/^[a-z0-9]/.test(project)) project = `0${project}`\n return project.replace(/[^a-z0-9_-]/g, '-')\n}\n\nfunction trialProjects(identity: PersistedTrialIdentity): string[] {\n const jobRoot = join(identity.jobsDirectory, identity.jobName)\n if (!existsSync(jobRoot)) return []\n return readdirSync(jobRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.isSymbolicLink())\n .map((entry) => sanitizeProject(entry.name))\n}\n\nfunction matchingContainers(\n identity: PersistedTrialIdentity,\n dockerEnvironment: Readonly<Record<string, string | undefined>>,\n): string[] {\n const projects = trialProjects(identity)\n if (projects.length === 0) return []\n const output = execFileSync(\n identity.dockerCommand,\n ['ps', '-a', '--format', '{{.ID}}\\t{{.Label \"com.docker.compose.project\"}}'],\n {\n encoding: 'utf8',\n env: dockerEnvironment,\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n },\n )\n return output\n .split('\\n')\n .filter(Boolean)\n .flatMap((line) => {\n const tab = line.indexOf('\\t')\n if (tab < 1) return []\n const id = line.slice(0, tab)\n const project = line.slice(tab + 1)\n return projects.some(\n (expected) =>\n project === expected || project.startsWith(`${expected}__verifier__`),\n )\n ? [id]\n : []\n })\n}\n\nfunction removeTrialContainers(\n identity: PersistedTrialIdentity,\n dockerEnvironment: Readonly<Record<string, string | undefined>>,\n): number {\n const containers = matchingContainers(identity, dockerEnvironment)\n if (containers.length > 0) {\n try {\n execFileSync(identity.dockerCommand, ['rm', '-f', ...containers], {\n encoding: 'utf8',\n env: dockerEnvironment,\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n })\n } catch (error) {\n if (matchingContainers(identity, dockerEnvironment).length > 0) throw error\n }\n }\n const remaining = matchingContainers(identity, dockerEnvironment)\n if (remaining.length > 0) {\n throw new Error(`Pier task containers survived removal: ${remaining.join(', ')}`)\n }\n return containers.length\n}\n\nfunction sleep(milliseconds: number): Promise<void> {\n return new Promise((resolveSleep) => setTimeout(resolveSleep, milliseconds))\n}\n\nasync function waitUntil(predicate: () => boolean, timeoutMs: number, intervalMs: number) {\n const deadline = Date.now() + timeoutMs\n while (!predicate()) {\n if (Date.now() >= deadline) return false\n await sleep(intervalMs)\n }\n return true\n}\n\nfunction trialKey(identity: PierCandidateTrialIdentity): string {\n if (!sha256Pattern.test(identity.executionPlanDigest)) {\n throw new Error('executionPlanDigest must be a SHA-256 digest')\n }\n return createHash('sha256')\n .update(JSON.stringify([nonEmpty(identity.executionId, 'executionId'), identity.executionPlanDigest]))\n .digest('hex')\n}\n\nfunction assertRealDirectory(path: string, label: string): void {\n const stats = lstatSync(path)\n if (!stats.isDirectory() || stats.isSymbolicLink() || realpathSync(path) !== path) {\n throw new Error(`${label} must be a real canonical directory`)\n }\n}\n\nexport class FilePierCandidateTrialController implements PierCandidateTrialController {\n private readonly directory: string\n private readonly launch?: NonNullable<FilePierCandidateTrialControllerOptions['launch']>\n private readonly readResult?: NonNullable<FilePierCandidateTrialControllerOptions['readResult']>\n private readonly dockerConnection: PierDockerConnection\n private readonly supervisorPath: string\n private readonly pollIntervalMs: number\n\n constructor(options: FilePierCandidateTrialControllerOptions) {\n this.directory = absolutePath(options.directory, 'Pier controller directory')\n this.launch = options.launch\n this.readResult = options.readResult\n const configuredDocker = options.dockerConnection\n if (configuredDocker?.id === defaultDockerConnectionId) {\n throw new Error(`${defaultDockerConnectionId} is reserved for the implicit local connection`)\n }\n const dockerConnection = configuredDocker ?? {\n id: defaultDockerConnectionId,\n env: {},\n }\n const connectionId = stableDockerConnectionId(dockerConnection.id)\n validateEnvironment(dockerConnection.env, 'Docker connection environment')\n this.dockerConnection = Object.freeze({\n id: connectionId,\n env: Object.freeze({ ...dockerConnection.env }),\n })\n this.supervisorPath = absolutePath(\n options.supervisorPath ??\n fileURLToPath(new URL('./pier-trial-supervisor.mjs', import.meta.url)),\n 'Pier supervisor path',\n )\n this.pollIntervalMs = options.pollIntervalMs ?? 25\n if (!Number.isSafeInteger(this.pollIntervalMs) || this.pollIntervalMs < 1) {\n throw new Error('pollIntervalMs must be a positive integer')\n }\n mkdirSync(this.directory, { recursive: true, mode: 0o700 })\n assertRealDirectory(this.directory, 'Pier controller directory')\n }\n\n start(\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ): PierCandidateTrialHandle {\n if (!this.launch) throw new Error('this Pier controller is recovery-only')\n const identity: PierCandidateTrialIdentity = {\n executionId: context.request.executionId,\n executionPlanDigest: context.request.executionPlan.value.digest,\n }\n if (staged.executionId !== identity.executionId) {\n throw new Error('staged Pier execution does not match the runtime request')\n }\n\n // The launch callback is a pure spec builder. Resolve every fallible input\n // before reserving durable identities or starting a process.\n const spec = this.launch(staged, context)\n this.validateSpec(spec)\n for (const [name, value] of Object.entries(this.dockerConnection.env)) {\n if (\n Object.prototype.hasOwnProperty.call(spec.env, name) &&\n spec.env[name] !== value\n ) {\n throw new Error(`Pier child environment conflicts with Docker connection variable ${name}`)\n }\n }\n const pierEnvironment = Object.freeze({\n ...spec.env,\n ...this.dockerConnection.env,\n })\n mkdirSync(spec.jobsDirectory, { recursive: true, mode: 0o700 })\n assertRealDirectory(spec.jobsDirectory, 'Pier jobs directory')\n const dockerCommand = resolveExecutable(\n spec.dockerCommand ?? 'docker',\n process.env.PATH,\n 'Docker command',\n )\n const pierCommand = resolveExecutable(spec.command, pierEnvironment.PATH, 'Pier command')\n\n const controlDirectory = this.controlDirectory(identity)\n try {\n mkdirSync(controlDirectory, { mode: 0o700 })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new Error('Pier trial identity already has durable control state')\n }\n throw error\n }\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n\n // Pier creates each trial directory before starting its environment. An\n // atomically reserved, one-execution job directory therefore makes every\n // Compose project discovered below exclusive to this execution.\n const jobRoot = join(spec.jobsDirectory, spec.jobName)\n let jobRootCreated = false\n try {\n mkdirSync(jobRoot, { mode: 0o700 })\n jobRootCreated = true\n assertRealDirectory(jobRoot, 'Pier job directory')\n } catch (error) {\n // No identity or process exists yet; leave the execution reusable.\n rmSync(controlDirectory, { recursive: true, force: true })\n if (jobRootCreated) rmSync(jobRoot, { recursive: true, force: true })\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new Error('Pier job name must be unique; its job directory already exists')\n }\n throw error\n }\n const allocating: PersistedTrialIdentity = {\n schemaVersion: 1,\n kind: 'pier-trial-identity',\n state: 'allocating',\n ...identity,\n jobsDirectory: absolutePath(spec.jobsDirectory, 'Pier jobs directory'),\n jobName: nonEmpty(spec.jobName, 'Pier job name'),\n dockerCommand: nonEmpty(dockerCommand, 'Docker command'),\n dockerConnectionId: this.dockerConnection.id,\n }\n try {\n writeJsonAtomic(controlDirectory, identityFile, allocating)\n } catch (error) {\n // The supervisor can only start after this durable write succeeds.\n rmSync(controlDirectory, { recursive: true, force: true })\n rmSync(jobRoot, { recursive: true, force: true })\n throw error\n }\n\n const supervisor = spawn(process.execPath, [this.supervisorPath, controlDirectory], {\n detached: true,\n // Launch data arrives over fd 3. The trusted supervisor receives only\n // explicitly declared process variables, never the evaluator environment.\n env: { ...this.dockerConnection.env },\n stdio: ['ignore', 'ignore', 'ignore', 'pipe'],\n })\n if (supervisor.pid === undefined) throw new Error('Pier supervisor started without a pid')\n const controlPipe = supervisor.stdio[3] as (Writable & { unref?: () => void }) | null\n let supervisorIdentity: ProcessIdentity | undefined\n try {\n supervisorIdentity = processIdentity(supervisor.pid)\n const persisted: PersistedTrialIdentity = {\n ...allocating,\n state: 'starting',\n supervisor: supervisorIdentity,\n }\n writeJsonAtomic(controlDirectory, identityFile, persisted)\n if (!controlPipe) throw new Error('Pier supervisor has no protected control pipe')\n controlPipe.on('error', () => undefined)\n controlPipe.end(\n JSON.stringify({\n command: pierCommand,\n args: spec.args,\n cwd: spec.cwd,\n env: pierEnvironment,\n jobsDirectory: spec.jobsDirectory,\n jobName: spec.jobName,\n dockerCommand,\n }),\n )\n } catch (error) {\n controlPipe?.destroy()\n if (supervisorIdentity) signalProcess(supervisorIdentity, 'SIGKILL', false)\n else {\n try {\n process.kill(supervisor.pid, 'SIGKILL')\n } catch (killError) {\n if ((killError as NodeJS.ErrnoException).code !== 'ESRCH') throw killError\n }\n }\n throw error\n }\n supervisor.unref()\n controlPipe.unref?.()\n\n const result = this.waitForResult(controlDirectory, spec, context.deadlineAtMs)\n return {\n identity,\n result,\n terminateAndWait: async () => await this.terminateAndWait(identity),\n }\n }\n\n async terminateAndWait(\n requested: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTerminationAcknowledgement> {\n const controlDirectory = this.controlDirectory(requested)\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n const persisted = parsePersistedIdentity(join(controlDirectory, identityFile))\n if (\n persisted.executionId !== requested.executionId ||\n persisted.executionPlanDigest !== requested.executionPlanDigest\n ) {\n throw new Error('persisted Pier trial identity differs from the stop request')\n }\n this.assertDockerConnection(persisted)\n\n touchDurable(controlDirectory, stopFile)\n if (!existsSync(join(controlDirectory, terminalFile))) {\n if (persisted.supervisor) signalProcess(persisted.supervisor, 'SIGTERM', false)\n }\n const terminalAppeared = await waitUntil(\n () => existsSync(join(controlDirectory, terminalFile)),\n persisted.supervisor ? 10_000 : 1,\n this.pollIntervalMs,\n )\n if (!terminalAppeared) await this.forceRecovery(controlDirectory)\n\n let terminal = parseTerminal(join(controlDirectory, terminalFile))\n const latest = parsePersistedIdentity(join(controlDirectory, identityFile))\n const liveProcesses = latest.pier ? sessionMembers(latest.pier.sessionId).length : 0\n this.assertDockerConnection(latest)\n const liveContainers = matchingContainers(latest, this.dockerConnection.env).length\n if (liveProcesses > 0 || liveContainers > 0) {\n await this.forceRecovery(controlDirectory)\n terminal = parseTerminal(join(controlDirectory, terminalFile))\n }\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error(\n `Pier recovery did not prove process/container death${terminal.error ? `: ${terminal.error}` : ''}`,\n )\n }\n return { processExited: true, containersRemoved: true }\n }\n\n async captureResult(\n requested: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTrialResult | undefined> {\n const controlDirectory = this.controlDirectory(requested)\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n const persisted = parsePersistedIdentity(join(controlDirectory, identityFile))\n if (\n persisted.executionId !== requested.executionId ||\n persisted.executionPlanDigest !== requested.executionPlanDigest\n ) {\n throw new Error('persisted Pier trial identity differs from the capture request')\n }\n this.assertDockerConnection(persisted)\n const terminal = parseTerminal(join(controlDirectory, terminalFile))\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error('Pier result capture requires proven process and container death')\n }\n if (!this.readResult) {\n throw new Error('Pier result capture has no restart-safe result reader')\n }\n return await this.readResult({\n jobsDirectory: persisted.jobsDirectory,\n jobName: persisted.jobName,\n })\n }\n\n private controlDirectory(identity: PierCandidateTrialIdentity): string {\n return join(this.directory, trialKey(identity))\n }\n\n private assertDockerConnection(identity: PersistedTrialIdentity): void {\n if (identity.dockerConnectionId !== this.dockerConnection.id) {\n throw new Error(\n `Pier trial requires Docker connection ${identity.dockerConnectionId}; configured ${this.dockerConnection.id}`,\n )\n }\n }\n\n private validateSpec(spec: PierCandidateProcessSpec): void {\n nonEmpty(spec.command, 'Pier command')\n if (!Array.isArray(spec.args) || spec.args.some((arg) => typeof arg !== 'string' || arg.includes('\\0'))) {\n throw new Error('Pier arguments must be strings without NUL')\n }\n absolutePath(spec.cwd, 'Pier cwd')\n absolutePath(spec.jobsDirectory, 'Pier jobs directory')\n if (!/^[A-Za-z0-9._-]{1,200}$/.test(spec.jobName)) {\n throw new Error('Pier job name must be filesystem-neutral')\n }\n validateEnvironment(spec.env, 'Pier child environment')\n }\n\n private async waitForResult(\n controlDirectory: string,\n spec: PierCandidateProcessSpec,\n deadlineAtMs: number,\n ): Promise<PierCandidateTrialResult> {\n const waitMs = Math.max(0, deadlineAtMs - Date.now())\n const appeared = await waitUntil(\n () => existsSync(join(controlDirectory, terminalFile)),\n waitMs,\n this.pollIntervalMs,\n )\n if (!appeared) throw new Error('Pier supervisor emitted no terminal acknowledgement')\n const terminal = parseTerminal(join(controlDirectory, terminalFile))\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error('Pier supervisor did not prove process and container death')\n }\n if (terminal.status !== 'completed') {\n throw new Error(terminal.error ? `Pier process failed: ${terminal.error}` : 'Pier process stopped')\n }\n return await spec.readResult()\n }\n\n private async forceRecovery(\n controlDirectory: string,\n ): Promise<void> {\n const latest = parsePersistedIdentity(join(controlDirectory, identityFile))\n this.assertDockerConnection(latest)\n const errors: string[] = []\n if (latest.pier) {\n try {\n await signalSessionUntilEmpty(latest.pier, 'SIGTERM', 2_000, this.pollIntervalMs)\n } catch (error) {\n errors.push(`could not signal Pier session: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (latest.supervisor) {\n try {\n signalProcess(latest.supervisor, 'SIGKILL', false)\n if (!(await waitUntil(() => !processMatches(latest.supervisor!), 5_000, this.pollIntervalMs))) {\n errors.push(`Pier supervisor ${latest.supervisor.pid} survived SIGKILL`)\n }\n } catch (error) {\n errors.push(`could not kill Pier supervisor: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (latest.pier) {\n try {\n if (\n !(await signalSessionUntilEmpty(\n latest.pier,\n 'SIGKILL',\n 5_000,\n this.pollIntervalMs,\n ))\n ) {\n errors.push(`Pier process session ${latest.pier.sessionId} survived SIGKILL`)\n }\n } catch (error) {\n errors.push(`could not kill Pier session: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n let removedContainers = 0\n try {\n removedContainers = removeTrialContainers(latest, this.dockerConnection.env)\n } catch (error) {\n errors.push(`could not remove Pier containers: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (errors.length > 0) {\n throw new Error(`Pier recovery incomplete: ${errors.join('; ')}`)\n }\n writeJsonAtomic(controlDirectory, terminalFile, {\n schemaVersion: 1,\n kind: 'pier-trial-terminal',\n status: 'stopped',\n processExited: true,\n containersRemoved: true,\n removedContainers,\n recoveredByPid: process.pid,\n })\n }\n}\n","/** Execute the exact admitted Pier result parser bytes in a fresh Node process. */\nimport { spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { chmod, mkdtemp, rm, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nimport type { BenchmarkEvaluation } from '@tangle-network/agent-eval'\n\nimport type { PierCandidateGraderPort } from './pier-agent'\n\nconst sha256 = (bytes: Uint8Array): `sha256:${string}` =>\n `sha256:${createHash('sha256').update(bytes).digest('hex')}`\n\nexport function createPierResultGrader(\n descriptor: Pick<PierCandidateGraderPort, 'name' | 'version' | 'artifact'>,\n): PierCandidateGraderPort {\n return {\n ...descriptor,\n run: async (input) => {\n input.signal.throwIfAborted()\n const implementation = Uint8Array.from(input.implementation.bytes)\n if (implementation.byteLength !== input.implementation.byteLength) {\n throw new Error('Pier grader implementation length changed before execution')\n }\n const evidence = Uint8Array.from(input.officialResult.bytes)\n const evaluation = await executeGrader(implementation, evidence, input.signal)\n input.signal.throwIfAborted()\n return {\n evaluation,\n evidence,\n binding: {\n implementationDigest: sha256(implementation),\n taskOutcomeDigest: input.outcome.evidence.digest,\n outputDigest: sha256(evidence),\n },\n }\n },\n }\n}\n\nasync function executeGrader(\n implementation: Uint8Array,\n resultBytes: Uint8Array,\n signal: AbortSignal,\n): Promise<BenchmarkEvaluation> {\n const directory = await mkdtemp(join(tmpdir(), 'pier-result-grader-'))\n const script = join(directory, 'grader.mjs')\n try {\n await writeFile(script, implementation, { flag: 'wx', mode: 0o600 })\n await chmod(script, 0o500)\n const stdout = await runNode(script, resultBytes, signal)\n const parsed = JSON.parse(stdout.toString('utf8')) as BenchmarkEvaluation\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Pier result grader returned a non-object evaluation')\n }\n return parsed\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n}\n\nasync function runNode(\n script: string,\n input: Uint8Array,\n signal: AbortSignal,\n): Promise<Buffer> {\n signal.throwIfAborted()\n return await new Promise((resolveResult, reject) => {\n const child = spawn(process.execPath, ['--no-warnings', script], {\n env: {\n PATH: process.env.PATH,\n HOME: process.env.HOME,\n LANG: 'C',\n LC_ALL: 'C',\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n signal,\n })\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let bytes = 0\n const collect = (target: Buffer[]) => (chunk: Buffer) => {\n bytes += chunk.byteLength\n if (bytes > 1024 * 1024) {\n child.kill('SIGKILL')\n reject(new Error('Pier result grader exceeded its output limit'))\n return\n }\n target.push(Buffer.from(chunk))\n }\n child.stdout.on('data', collect(stdout))\n child.stderr.on('data', collect(stderr))\n child.once('error', reject)\n child.once('close', (code, childSignal) => {\n if (code !== 0) {\n reject(\n new Error(\n `Pier result grader failed (${childSignal ?? code}): ${Buffer.concat(stderr).toString('utf8').trim()}`,\n ),\n )\n return\n }\n resolveResult(Buffer.concat(stdout))\n })\n child.stdin.end(input)\n })\n}\n"],"mappings":"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","names":["resolve","mkdir","realpath","join","resolve","resolve","realpath","mkdir","join","spawn","createHash","mkdirSync","writeFileSync","isAbsolute","join","resolve","sha256Pattern","nonEmpty","record","assertRealDirectory","spawn","createHash","chmod","mkdtemp","rm","writeFile","tmpdir","join","sha256"]}
1
+ {"version":3,"file":"index.js","names":["sha256Pattern","sha256","nonEmpty","assertRealDirectory"],"sources":["../src/refine-loop.ts","../src/search-tool.ts","../src/resolve-client.ts","../src/run-pool.ts","../src/run-benchmarks.ts","../src/pier-task-outcome.ts","../src/pier-agent.ts","../src/pier-trial-controller.ts","../src/pier-result-grader.ts"],"sourcesContent":["/**\n * runRefineLoop — the ONE shared k-shot loop (see docs/architecture.md §1, §12).\n *\n * It replaces the seven hand-rolled `for (round 1..k) { shot → judge → decide →\n * carry-forward }` copies across the workers (~700 LOC of duplicated skeleton).\n * The worker is an OPAQUE `runShot`; this loop owns iteration, carry-forward\n * steering, optional per-round judging + early stop, and round bookkeeping.\n *\n * Two carry-forward channels, both first-class (the extraction found both in the\n * wild and they must stay pluggable):\n * - EXECUTION CONTEXT (`Ctx`): created once by `setup`, threaded to every shot,\n * torn down by `teardown`. This is how filesystem/session state carries — a\n * cloned repo whose edits persist (SWE refine), a shared sandbox box whose\n * session persists (sandbox research), or a scratch dir.\n * - PROMPT (`prompt(round, history, ctx)`): how textual state carries — round 1\n * is the blind prompt; rounds 2+ fold prior rounds' artifacts + a directive.\n *\n * Judging is OPTIONAL: workers that run all k rounds and let the orchestrator\n * judge omit `judge`/`decide` (the loop runs to budget); a loop that should stop\n * on the first valid answer wires `judge` (default `decide` = stop-on-valid).\n *\n * This is the inference-timescale instance of the spine's atom: `runShot` is the\n * worker Agent's `act→Output`; `prompt` is the driver Agent's `act→steer`. It is\n * deliberately corpus-agnostic — callers map `RefineLoopResult` to a RunRecord.\n */\n\n/** Minimal per-round verdict — `valid` gates early-stop, `score` is informational. */\nexport interface RoundVerdict {\n valid: boolean\n score?: number\n}\n\nexport interface RoundRecord<Artifact> {\n /** 1-based round index. */\n round: number\n prompt: string\n artifact: Artifact\n /** Present only when a `judge` is wired. */\n verdict?: RoundVerdict\n /** Non-fatal note (e.g. a liveness backstop fired this round). */\n note?: string\n}\n\nexport interface RefineLoopSpec<Artifact, Ctx = void> {\n /** Max shots. Always ≥ 1. */\n rounds: number\n /** Build the per-task execution context once (clone repo / create box / mkdtemp). */\n setup?: () => Promise<Ctx>\n /** Round `r`'s prompt. `r === 1` is the blind prompt; `r > 1` carries `history`. */\n prompt: (round: number, history: ReadonlyArray<RoundRecord<Artifact>>, ctx: Ctx) => string\n /** Run ONE shot — the opaque worker (local spawn / sandbox stream / router chat). */\n runShot: (\n prompt: string,\n round: number,\n ctx: Ctx,\n ) => Promise<{ artifact: Artifact; note?: string }>\n /** Optional per-round judge. Omit to run all `rounds` (orchestrator judges later). */\n judge?: (artifact: Artifact, round: number) => Promise<RoundVerdict>\n /** Stop after this round? Default: stop once a round's verdict is valid (else run to budget). */\n decide?: (history: ReadonlyArray<RoundRecord<Artifact>>) => boolean\n /** Always runs (even on throw) when `setup` ran. */\n teardown?: (ctx: Ctx) => Promise<void>\n}\n\nexport interface RefineLoopResult<Artifact> {\n /** Every executed round in order. */\n rounds: RoundRecord<Artifact>[]\n /** Round 1 — the blind artifact. */\n blind: RoundRecord<Artifact>\n /** The last executed round. */\n final: RoundRecord<Artifact>\n /** True iff any round was judged valid (only meaningful when `judge` is wired). */\n resolved: boolean\n}\n\nconst defaultDecide = <Artifact>(history: ReadonlyArray<RoundRecord<Artifact>>): boolean =>\n history[history.length - 1]?.verdict?.valid === true\n\nexport async function runRefineLoop<Artifact, Ctx = void>(\n spec: RefineLoopSpec<Artifact, Ctx>,\n): Promise<RefineLoopResult<Artifact>> {\n const rounds = Math.max(1, spec.rounds)\n const decide = spec.decide ?? defaultDecide\n let ctxSet = false\n let ctx = undefined as Ctx\n try {\n if (spec.setup) {\n ctx = await spec.setup()\n ctxSet = true\n }\n const history: RoundRecord<Artifact>[] = []\n for (let r = 1; r <= rounds; r += 1) {\n const prompt = spec.prompt(r, history, ctx)\n const { artifact, note } = await spec.runShot(prompt, r, ctx)\n const verdict = spec.judge ? await spec.judge(artifact, r) : undefined\n history.push({ round: r, prompt, artifact, verdict, note })\n if (decide(history)) break\n }\n // The loop runs ≥ 1 round, so history is non-empty.\n const blind = history[0] as RoundRecord<Artifact>\n const final = history[history.length - 1] as RoundRecord<Artifact>\n return { rounds: history, blind, final, resolved: history.some((h) => h.verdict?.valid === true) }\n } finally {\n if (ctxSet && spec.teardown) await spec.teardown(ctx)\n }\n}\n","/**\n * A host-side web-search tool for the `router-tools` worker backend. This is the\n * capability axis the research benches were missing: finsearch's prompt demands\n * \"live web/market sources\", but the plain `router` chat backend has no tools, so\n * the worker can only recall/hallucinate. Wiring this tool into a `router-tools`\n * loop gives the off-box worker a real `web_search(query)` it can call, backed by\n * the Tangle router's search providers (you.com / exa). Off-box = unaffected by a\n * sandbox's egress allowlist.\n *\n * The tool result the model reads is a compact text block of the top hits\n * (title · date · snippet · url). Transport/HTTP failures fail loud (throw) so a\n * broken search backend infra-excludes the cell instead of silently degrading to\n * a recall-only answer; a valid-but-empty result returns an explicit \"no results\"\n * string the model can reason about.\n */\nimport type { ToolSpec } from '@tangle-network/agent-runtime/loops'\n\nexport const webSearchTool: ToolSpec = {\n type: 'function',\n function: {\n name: 'web_search',\n description:\n 'Search the live web for current facts, market data, filings, and news. Returns the top results as title, date, snippet, and URL. Call it as many times as needed, refining the query, before you answer.',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'The search query. Be specific — include entity, metric, period, and units.',\n },\n },\n required: ['query'],\n },\n },\n}\n\ninterface SearchHit {\n title?: string\n url?: string\n snippet?: string\n publishedAt?: string\n}\n\ninterface SearchResponse {\n data?: SearchHit[]\n}\n\nconst formatHits = (hits: SearchHit[], maxHits: number): string => {\n if (hits.length === 0) return 'No results found for that query. Try a different query.'\n return hits\n .slice(0, maxHits)\n .map((h, i) => {\n const date = h.publishedAt ? ` (${h.publishedAt.slice(0, 10)})` : ''\n return `[${i + 1}] ${h.title ?? '(untitled)'}${date}\\n${h.snippet ?? ''}\\n${h.url ?? ''}`\n })\n .join('\\n\\n')\n}\n\n/**\n * Build the `executeToolCall` handler for a `router-tools` worker. `provider` is a\n * router search provider (`you` | `exa`). `maxHits` bounds the text folded back\n * into the model's context per call.\n */\nexport const makeSearchExecutor = (cfg: {\n routerBaseUrl: string\n routerKey: string\n provider: string\n maxHits?: number\n}): ((name: string, args: Record<string, unknown>, task: unknown) => Promise<string>) => {\n const maxHits = cfg.maxHits ?? 6\n return async (name, args) => {\n if (name !== webSearchTool.function.name) {\n throw new Error(`search executor received unknown tool '${name}' (only '${webSearchTool.function.name}')`)\n }\n const query = typeof args.query === 'string' ? args.query.trim() : ''\n if (!query) return 'web_search requires a non-empty \"query\" string.'\n\n const res = await fetch(`${cfg.routerBaseUrl}/search`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${cfg.routerKey}` },\n body: JSON.stringify({ provider: cfg.provider, query }),\n })\n if (!res.ok) {\n // Fail loud: a search-backend fault must infra-exclude the cell, not silently\n // become a recall-only (no-tool) answer that pollutes the capability test.\n throw new Error(`web_search ${cfg.provider} HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`)\n }\n const body = (await res.json()) as SearchResponse\n const hits = body.data ?? []\n // Tool use is a behavior worth seeing in the bench log — a research worker that\n // never searches is the failure mode this tool exists to fix.\n console.error(` [web_search:${cfg.provider}] \"${query.slice(0, 80)}\" -> ${hits.length} hits`)\n return formatHits(hits, maxHits)\n }\n}\n","/**\n * The ONE harness → worker-client mapping for the bench layer. Every bench entrypoint\n * (rsi.ts, run.ts, …) derives the `SandboxClient` the kernel's `runLoop` drives from a single\n * selector instead of hand-rolling the branch:\n *\n * - `router` → OFF-BOX: a router chat-completion as the leaf executor, presented\n * as a SandboxClient (no sandbox dependency). For deployable-checker\n * domains whose worker is a completion, or where box egress is blocked.\n * - `router` + searchProvider → OFF-BOX `router-tools`: the same off-box loop with a live\n * `web_search` tool (the capability axis research benches need).\n * - `bridge` → OFF-BOX: a local cli-bridge fronting a harness CLI\n * (opencode/kimi-code/…) as the leaf executor. Same resumable\n * `bridgeExecutor` the supervisor uses; harness+model ride the\n * bridge `model` id (`${harness}/${model}`).\n * - anything else (`sandbox`/a BackendType) → IN-BOX: a real `Sandbox`. The in-box backend\n * TYPE (opencode/codex/…) is set separately on the `AgentRunSpec`;\n * this only decides off-box-vs-in-box transport for `runLoop`.\n *\n * Centralizing it here means a new entrypoint gets the full off-box/in-box matrix for free and\n * the mapping can't drift between callers.\n */\nimport {\n createExecutor,\n inlineSandboxClient,\n resolveSandboxClient,\n type SandboxClient,\n} from '@tangle-network/agent-runtime/loops'\nimport { Sandbox } from '@tangle-network/sandbox'\nimport { makeSearchExecutor, webSearchTool } from './search-tool'\n\nexport interface ResolveBenchClientOptions {\n /** The selector (the `BACKEND` env value): `router` = off-box; anything else = in-box Sandbox. */\n backend: string\n routerBaseUrl: string\n routerKey: string\n model: string\n /** When set on the `router` backend, the off-box worker becomes a `router-tools` agentic loop\n * with a live `web_search` tool backed by this provider (`you`/`exa`/…). */\n searchProvider?: string\n sandboxBaseUrl?: string\n /** In-box sandbox timeout (ms). Also the per-turn deadline for the `bridge` backend. */\n timeoutMs?: number\n /** `bridge` backend: cli-bridge base URL. Defaults to `http://127.0.0.1:3355`. */\n bridgeUrl?: string\n /** `bridge` backend: bearer the bridge requires. Falls back to `routerKey` when unset. */\n bridgeBearer?: string\n}\n\nexport function resolveBenchClient(opts: ResolveBenchClientOptions): SandboxClient {\n const { backend, routerBaseUrl, routerKey, model, searchProvider } = opts\n if (backend === 'router') {\n if (searchProvider) {\n return inlineSandboxClient(\n createExecutor({\n backend: 'router-tools',\n routerBaseUrl,\n routerKey,\n model,\n tools: [webSearchTool],\n executeToolCall: makeSearchExecutor({ routerBaseUrl, routerKey, provider: searchProvider }),\n }),\n )\n }\n return inlineSandboxClient(createExecutor({ backend: 'router', routerBaseUrl, routerKey, model }))\n }\n if (backend === 'bridge') {\n // bench's bearer fallback (`?? routerKey`) resolves first, then the shared\n // resolver core wires the bridge seam — no re-implemented createExecutor branch.\n const bridgeBearer = opts.bridgeBearer ?? routerKey\n if (!bridgeBearer) throw new Error(\"resolveBenchClient: backend 'bridge' needs bridgeBearer or routerKey\")\n return resolveSandboxClient({\n backend: 'bridge',\n bridge: { url: opts.bridgeUrl, bearer: bridgeBearer, model, timeoutMs: opts.timeoutMs },\n })\n }\n return new Sandbox({\n baseUrl: opts.sandboxBaseUrl ?? 'https://sandbox.tangle.tools',\n apiKey: routerKey,\n timeoutMs: opts.timeoutMs ?? 1_200_000,\n } as never)\n}\n","/**\n * Bounded-concurrency pool — the ONE pool every batch runner uses.\n *\n * Every batch-* command, the finsearch loop, and terminal-compare hand-rolled the\n * same shape: a shared `next` cursor, `Math.min(concurrency, items.length)` drain\n * workers, and `Promise.all` over them. That boilerplate lives here once.\n * Aggregation and console output stay at each call site — the pool owns scheduling,\n * nothing else. Item-agnostic on purpose: a pool shouldn't know about BenchTask\n * (terminal-compare pools over task-id strings), so it's generic in the item type.\n *\n * A worker that throws yields `{ ok:false, error }` for THAT item; the batch never\n * aborts because one item failed. Results are returned in item order (indexed by\n * the item's position), not completion order.\n */\n\nexport interface PoolOutcome<T, R> {\n index: number\n item: T\n ok: boolean\n value?: R\n error?: string\n}\n\nexport async function runPool<T, R>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<R>,\n opts?: { onResult?: (o: PoolOutcome<T, R>) => void },\n): Promise<PoolOutcome<T, R>[]> {\n const results: PoolOutcome<T, R>[] = new Array(items.length)\n let next = 0\n const drain = async (): Promise<void> => {\n while (next < items.length) {\n const index = next++\n const item = items[index] as T\n let outcome: PoolOutcome<T, R>\n try {\n outcome = { index, item, ok: true, value: await worker(item, index) }\n } catch (err) {\n outcome = { index, item, ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n results[index] = outcome\n opts?.onResult?.(outcome)\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, drain))\n return results\n}\n","/**\n * `runBenchmarks` — the bench unifier.\n *\n * `gate.ts` runs ONE adapter as a diverse-vs-blind research gate through the recursive atom.\n * This is the other half it references: run a SUBSET of the registry's benchmarks over a MATRIX of\n * agent cells (harness × model × persona), each scored by the benchmark's OWN deterministic judge,\n * and return a ranked leaderboard. It is the \"which harness/model/persona combination wins on which\n * benchmark\" question, answered over an arbitrary subset in one call.\n *\n * It owns no new mechanism. Each cell is one `openSandboxRun` shot (the same per-run primitive the\n * SWE worker uses) driven by `resolveBenchClient` (off-box router completion OR in-box Sandbox; the\n * harness rides `sandboxOverrides.backend.type`). The deliverable is the adapter's OWN parser\n * (`adapter.output`), defaulting to the final answer text — so `runBenchmarks` needs no\n * per-benchmark branching. Concurrency is the shared `runPool`. The number comes from\n * `adapter.judge`, never a self-authored judge.\n *\n * Subset = the `benchmarks` and `cells` arrays plus `n`/`ids`/`split`. A benchmark whose\n * `preflight()` fails (missing Docker/venv/dataset) is recorded as unavailable and skipped — the\n * sweep never aborts because one bench's harness is absent.\n *\n * const report = await runBenchmarks({\n * benchmarks: ['humaneval', 'swe-bench'],\n * cells: [\n * { label: 'opencode/glm-4.6', model: 'glm-4.6', harness: 'opencode' },\n * { label: 'codex/gpt-5', model: 'gpt-5', harness: 'codex' },\n * ],\n * routerBaseUrl, routerKey, n: 20,\n * })\n */\n\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport type {\n AgentProfile,\n AgentRunSpec,\n Deliverable,\n OpenSandboxRunOptions,\n} from '@tangle-network/agent-runtime/loops'\nimport { openSandboxRun } from '@tangle-network/agent-runtime/loops'\nimport type { SandboxEvent } from '@tangle-network/sandbox'\nimport { resolveAdapter } from './adapters'\nimport type { BenchmarkAdapter, BenchScore, BenchTask } from './benchmarks/types'\nimport { runRefineLoop } from './refine-loop'\nimport { resolveBenchClient } from './resolve-client'\nimport { runPool } from './run-pool'\n\n/** One agent under test: a profile (prompt/tools/persona) plus the harness + model that run it. */\nexport interface BenchCell {\n /** Leaderboard row label, e.g. `opencode/glm-4.6` or `tax-agent@v1`. */\n readonly label: string\n /** Model id for this cell. */\n readonly model: string\n /** Coding harness for the in-box path (`opencode`/`codex`/`claude-code`/`kimi-code`). Defaults to\n * `profile.metadata.backendType`, then `opencode`. Ignored on the `router` transport. */\n readonly harness?: string\n /** Transport: `router` (off-box completion, default), `sandbox`, or a BackendType for in-box. */\n readonly backend?: string\n /** Web-search provider for the `router` transport (turns the leaf into a `router-tools` loop). */\n readonly searchProvider?: string\n /** The agent under test. Defaults to a minimal `{ name, metadata.backendType }` profile. */\n readonly profile?: AgentProfile\n}\n\n/** Runs one (adapter, task, cell) shot and returns the deliverable text. The default uses\n * `openSandboxRun`; tests inject a deterministic stub so the matrix runs offline. */\nexport type BenchShot = (input: {\n readonly adapter: BenchmarkAdapter\n readonly task: BenchTask\n readonly cell: BenchCell\n /** Prompt to hand to the worker. Defaults to `task.prompt`; looped runs pass revised prompts. */\n readonly prompt?: string\n /** 1-based attempt index for looped runs. */\n readonly attempt?: number\n readonly routerBaseUrl: string\n readonly routerKey: string\n readonly bridgeUrl?: string\n readonly bridgeBearer?: string\n readonly sandboxBaseUrl?: string\n readonly timeoutMs?: number\n readonly resolveClient?: typeof resolveBenchClient\n}) => Promise<{ artifact: string; ok: boolean; detail?: string }>\n\nexport interface RunBenchmarksOptions {\n /** Registry keys (`resolveAdapter`) — the benchmark subset to run. */\n readonly benchmarks: readonly string[]\n /** The agent cells to rank. */\n readonly cells: readonly BenchCell[]\n readonly routerBaseUrl: string\n readonly routerKey: string\n readonly bridgeUrl?: string\n readonly bridgeBearer?: string\n readonly sandboxBaseUrl?: string\n /** Tasks per benchmark (the n). */\n readonly n?: number\n readonly ids?: string[]\n readonly split?: string\n /** Replicates per (benchmark × cell × task). Default 1. */\n readonly reps?: number\n /** Bounded concurrency across all shots. Default 4. */\n readonly concurrency?: number\n /** Per-shot wall-clock (ms). */\n readonly timeoutMs?: number\n /** Test seam: resolve the runtime transport. Defaults to `resolveBenchClient`. */\n readonly resolveClient?: typeof resolveBenchClient\n /** Max attempts per (benchmark × cell × task). Default 1. Attempts after the first receive\n * non-answer checker feedback and the previous artifacts; the loop stops early on pass. */\n readonly loopAttempts?: number\n /** Self-verify each benchmark's judge against its gold artifact on the first task before spending\n * model tokens; a benchmark whose judge rejects its own gold is recorded unavailable. Default true. */\n readonly verifyJudge?: boolean\n /** Test seam: a deterministic shot runner. Defaults to the `openSandboxRun` leaf. */\n readonly runShot?: BenchShot\n /** Test seam: resolve a benchmark key to an adapter. Defaults to the registry `resolveAdapter`. */\n readonly resolveAdapter?: (key: string) => BenchmarkAdapter\n readonly onResult?: (r: BenchCellTaskResult) => void\n}\n\nexport interface BenchCellTaskResult {\n readonly benchmark: string\n readonly cell: string\n readonly taskId: string\n readonly rep: number\n readonly resolved: boolean\n readonly score: number\n /** false = the shot threw or produced no artifact (infra/empty), excluded from the resolve\n * denominator so a harness outage can't masquerade as a 0% capability result. */\n readonly ok: boolean\n readonly detail?: string\n readonly wallMs: number\n}\n\nexport interface BenchLeaderboardRow {\n readonly benchmark: string\n readonly cell: string\n readonly n: number\n readonly resolved: number\n readonly errored: number\n /** resolved / (n - errored). */\n readonly resolveRate: number\n /** Mean graded score over non-errored shots (partial credit where the judge supports it). */\n readonly meanScore: number\n}\n\nexport interface RunBenchmarksReport {\n /** One row per (benchmark × cell), sorted by benchmark then descending resolveRate. */\n readonly rows: readonly BenchLeaderboardRow[]\n readonly perTask: readonly BenchCellTaskResult[]\n readonly benchmarks: readonly string[]\n readonly cells: readonly string[]\n /** Benchmarks skipped because `preflight`/judge-self-check failed, with the reason. */\n readonly unavailable: ReadonlyArray<{ readonly benchmark: string; readonly reason: string }>\n}\n\n/** Last assistant text across the common event shapes (delta accumulation, then a terminal\n * `result`/`done`/`agent` snapshot). The structured-deliverable case is handled by the adapter's\n * own `output.parse`; this is the research/QA fallback. */\nfunction finalText(events: readonly SandboxEvent[]): string {\n let text = ''\n for (const ev of events) {\n const e = ev as { type?: string; data?: Record<string, unknown> }\n const data = e.data ?? {}\n if (e.type === 'message.part.updated') {\n const part = data.part as { type?: string; text?: string } | undefined\n const partType = (data.partType as string | undefined) ?? part?.type\n if (partType === 'text') {\n if (typeof data.delta === 'string') text += data.delta\n else if (typeof part?.text === 'string') text = part.text\n }\n } else if (typeof data.finalText === 'string') text = data.finalText\n else if (typeof data.response === 'string') text = data.response\n }\n return text.trim()\n}\n\n/** The default real-agent shot: one `openSandboxRun` over the cell's harness+model, deliverable\n * extracted by the adapter's parser (or final text), abortable on `timeoutMs`. */\nconst openSandboxShot: BenchShot = async ({ adapter, task, cell, prompt, routerBaseUrl, routerKey, bridgeUrl, bridgeBearer, sandboxBaseUrl, timeoutMs, resolveClient }) => {\n const client = (resolveClient ?? resolveBenchClient)({\n backend: cell.backend ?? 'router',\n routerBaseUrl,\n routerKey,\n model: cell.model,\n ...(bridgeUrl ? { bridgeUrl } : {}),\n ...(bridgeBearer ? { bridgeBearer } : {}),\n ...(sandboxBaseUrl ? { sandboxBaseUrl } : {}),\n ...(cell.searchProvider ? { searchProvider: cell.searchProvider } : {}),\n ...(timeoutMs ? { timeoutMs } : {}),\n })\n const harness = cell.harness ?? (cell.profile?.metadata?.backendType as string | undefined) ?? 'opencode'\n const profile: AgentProfile = cell.profile ?? { name: cell.label, metadata: { backendType: harness } }\n // Unique per shot: the same (adapter, task) runs concurrently across cells and reps, so the box\n // name and runId must not collide.\n const uniq = Math.random().toString(36).slice(2, 8)\n const agentRun: AgentRunSpec<string> = {\n profile,\n name: cell.label,\n taskToPrompt: () => '',\n sandboxOverrides: {\n name: `bench-${adapter.name}-${task.id}-${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 60),\n environment: 'universal',\n backend: { type: harness as never, model: { provider: 'openai', model: cell.model, baseUrl: routerBaseUrl } },\n },\n }\n const deliverable: Deliverable<string> = {\n kind: 'events',\n fromEvents: (events) => (adapter.output ? adapter.output.parse(events) : finalText(events)),\n }\n const controller = new AbortController()\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined\n const runOptions: OpenSandboxRunOptions = {\n agentRun,\n signal: controller.signal,\n runId: `bench:${adapter.name}:${task.id}:${uniq}`,\n scenarioId: task.id,\n }\n const boxSetup = adapter.boxSetup\n if (boxSetup) {\n runOptions.beforeStart = async ({ box, sessionId }) => {\n const setup = boxSetup(task)\n const sres = await box.exec(setup.command, {\n timeoutMs: 300_000,\n sessionId,\n ...(setup.cwd ? { cwd: setup.cwd } : {}),\n })\n if (sres.exitCode !== 0)\n throw new Error(\n `boxSetup failed (exit ${sres.exitCode}): ${(sres.stderr ?? '').slice(0, 200)}`,\n )\n }\n }\n const run = await openSandboxRun(client, runOptions, deliverable)\n try {\n const turn = await run.start(prompt ?? task.prompt)\n // Event-stream deliverable (adapter.output ?? finalText) — the FALLBACK.\n let artifact = (turn.out ?? '').trim()\n let boxExtractError: string | undefined\n // Primary deliverable for benchmarks whose real artifact lives in the box FS\n // (SWE-bench: a git diff of the agent's edits). Run the adapter's extraction\n // command in the STILL-ALIVE box (valid until run.close() below) and prefer its\n // stdout; the event-stream parse remains the fallback when the box yields nothing.\n if (adapter.boxExtract) {\n try {\n const ex = adapter.boxExtract(task)\n // The agent runs under a DRIVER SESSION whose workspace is a remapped\n // virtual root; an exec WITHOUT that sessionId lands on the host FS and\n // cannot see the agent's edits. Thread run.sessionId so the extraction\n // runs in the SAME workspace the agent wrote to.\n const res = await run.box.exec(ex.command, {\n timeoutMs: 120_000,\n sessionId: run.sessionId,\n ...(ex.cwd ? { cwd: ex.cwd } : {}),\n })\n const boxArtifact = (res.stdout ?? '').trim()\n if (res.exitCode !== 0)\n boxExtractError = `exit ${res.exitCode}: ${(res.stderr ?? '').slice(0, 160)}`\n else if (boxArtifact.length > 0) artifact = boxArtifact\n if (process.env.BENCH_ARTIFACT_DIR) {\n try {\n mkdirSync(process.env.BENCH_ARTIFACT_DIR, { recursive: true })\n const safe = `${adapter.name}_${task.id}_${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_')\n const map = await run.box\n .exec(\n 'echo \"PWD:\"; pwd; echo \"LS:\"; ls -la; echo \"GITROOTS:\"; find / -maxdepth 5 -type d -name .git 2>/dev/null; echo \"SETTINGS:\"; find / -maxdepth 8 -name global_settings.py -path \"*conf*\" 2>/dev/null',\n { timeoutMs: 60_000, sessionId: run.sessionId },\n )\n .catch((e: unknown) => ({ exitCode: -1, stdout: '', stderr: String(e) }))\n writeFileSync(\n `${process.env.BENCH_ARTIFACT_DIR}/${safe}.exec.json`,\n JSON.stringify(\n { sessionId: run.sessionId, extract: res, map: { exitCode: map.exitCode, stdout: map.stdout, stderr: map.stderr } },\n null,\n 2,\n ),\n )\n } catch {\n // debug-only\n }\n }\n } catch (err) {\n boxExtractError = err instanceof Error ? err.message.slice(0, 160) : String(err)\n }\n }\n const detail =\n turn.readError !== undefined\n ? `read: ${turn.readError.slice(0, 160)}`\n : boxExtractError !== undefined\n ? `boxExtract: ${boxExtractError}`\n : undefined\n // Debug affordance: dump the judged artifact (the exact model_patch the judge\n // will score) so a scoring failure can be diagnosed off the real bytes without\n // re-running the agent. Off by default; set BENCH_ARTIFACT_DIR to enable.\n if (process.env.BENCH_ARTIFACT_DIR) {\n try {\n mkdirSync(process.env.BENCH_ARTIFACT_DIR, { recursive: true })\n const safe = `${adapter.name}_${task.id}_${uniq}`.replace(/[^a-zA-Z0-9_.-]/g, '_')\n writeFileSync(`${process.env.BENCH_ARTIFACT_DIR}/${safe}.patch`, artifact)\n } catch {\n // debug-only; never fail the shot on a dump error\n }\n }\n return {\n artifact,\n ok: artifact.length > 0,\n ...(detail ? { detail } : {}),\n }\n } finally {\n if (timer) clearTimeout(timer)\n await run.close()\n }\n}\n\nfunction parseMaybeJson(value: string): unknown {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return value\n }\n}\n\nfunction redactJudgeLeak(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactJudgeLeak)\n if (!value || typeof value !== 'object') return value\n const out: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const normalizedKey = key.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n if (/(^|_)(gold|expected|reference|solution|answer)(_|$)/.test(normalizedKey)) continue\n out[key] = redactJudgeLeak(child)\n }\n return out\n}\n\nfunction safeFeedback(score: BenchScore): Record<string, unknown> {\n return {\n resolved: score.resolved,\n score: score.score,\n ...(score.detail ? { detail: redactJudgeLeak(parseMaybeJson(score.detail)) } : {}),\n }\n}\n\nfunction truncate(value: string, max = 4_000): string {\n return value.length <= max ? value : `${value.slice(0, max)}\\n...[truncated ${value.length - max} chars]`\n}\n\nfunction retryPrompt(task: BenchTask, history: ReadonlyArray<{ round: number; artifact: string }>, scores: ReadonlyMap<number, BenchScore>): string {\n const attempts = history\n .map((h) => {\n const score = scores.get(h.round)\n return [\n `Attempt ${h.round}:`,\n 'Artifact:',\n truncate(h.artifact),\n score ? `Checker feedback: ${JSON.stringify(safeFeedback(score))}` : undefined,\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n return [\n 'Retry the benchmark task. The previous artifact did not pass the checker.',\n 'Use only the original task statement and supplied context. Do not invent facts.',\n 'Return the corrected artifact in exactly the format requested by the original task.',\n '',\n 'Original task:',\n task.prompt,\n '',\n 'Previous attempts and safe checker feedback:',\n attempts,\n ].join('\\n')\n}\n\nasync function loopedShot(\n input: Parameters<BenchShot>[0],\n shot: BenchShot,\n attempts: number,\n): Promise<{ artifact: string; ok: boolean; detail?: string }> {\n const scores = new Map<number, BenchScore>()\n const result = await runRefineLoop<string>({\n rounds: attempts,\n prompt: (round, history) => (round === 1 ? input.task.prompt : retryPrompt(input.task, history, scores)),\n runShot: async (prompt, round) => {\n const out = await shot({ ...input, prompt, attempt: round })\n return { artifact: out.artifact, note: out.detail }\n },\n judge: async (artifact, round) => {\n const score = await input.adapter.judge(input.task, artifact)\n scores.set(round, score)\n return { valid: score.resolved, score: score.score }\n },\n })\n\n const best = result.rounds.reduce((winner, candidate) => {\n const a = scores.get(winner.round)\n const b = scores.get(candidate.round)\n if (!a) return candidate\n if (!b) return winner\n if (b.resolved && !a.resolved) return candidate\n if (b.resolved === a.resolved && b.score > a.score) return candidate\n return winner\n }, result.rounds[0]!)\n const bestScore = scores.get(best.round)\n return {\n artifact: best.artifact,\n ok: best.artifact.trim().length > 0,\n detail: JSON.stringify({\n mode: 'refine-loop',\n attempts: result.rounds.length,\n selectedAttempt: best.round,\n resolvedDuringLoop: result.resolved,\n selectedScore: bestScore?.score ?? null,\n rounds: result.rounds.map((round) => ({\n attempt: round.round,\n score: scores.get(round.round)?.score ?? null,\n resolved: scores.get(round.round)?.resolved ?? null,\n note: round.note ?? null,\n })),\n }),\n }\n}\n\nfunction combineDetails(runDetail: string | undefined, scoreDetail: string | undefined): string | undefined {\n if (runDetail && scoreDetail) {\n return JSON.stringify({ run: parseMaybeJson(runDetail), score: parseMaybeJson(scoreDetail) })\n }\n return runDetail ?? scoreDetail\n}\n\ninterface Job {\n readonly benchmark: string\n readonly adapter: BenchmarkAdapter\n readonly cell: BenchCell\n readonly task: BenchTask\n readonly rep: number\n}\n\n/** Resolve + preflight + (optionally) self-verify each benchmark once; load its tasks. A benchmark\n * whose harness is absent or whose judge rejects its own gold is recorded unavailable, not run. */\nasync function prepareBenchmarks(\n benchmarks: readonly string[],\n resolve: (key: string) => BenchmarkAdapter,\n opts: Pick<RunBenchmarksOptions, 'n' | 'ids' | 'split' | 'verifyJudge'>,\n): Promise<{ ready: Array<{ benchmark: string; adapter: BenchmarkAdapter; tasks: BenchTask[] }>; unavailable: Array<{ benchmark: string; reason: string }> }> {\n const ready: Array<{ benchmark: string; adapter: BenchmarkAdapter; tasks: BenchTask[] }> = []\n const unavailable: Array<{ benchmark: string; reason: string }> = []\n for (const benchmark of benchmarks) {\n const adapter = resolve(benchmark) // throws on an unknown key — fail loud on a typo\n try {\n await adapter.preflight()\n const tasks = await adapter.loadTasks({\n ...(opts.n !== undefined ? { limit: opts.n } : {}),\n ...(opts.ids ? { ids: opts.ids } : {}),\n ...(opts.split ? { split: opts.split } : {}),\n })\n if (tasks.length === 0) {\n unavailable.push({ benchmark, reason: 'loadTasks returned no tasks' })\n continue\n }\n if (opts.verifyJudge !== false) {\n const gold = await adapter.goldArtifact(tasks[0]!)\n if (gold !== undefined) {\n const verdict = await adapter.judge(tasks[0]!, gold)\n if (!verdict.resolved) {\n unavailable.push({ benchmark, reason: `judge rejected its own gold on ${tasks[0]!.id} — judge is miscalibrated` })\n continue\n }\n }\n }\n ready.push({ benchmark, adapter, tasks })\n } catch (err) {\n unavailable.push({ benchmark, reason: err instanceof Error ? err.message : String(err) })\n }\n }\n return { ready, unavailable }\n}\n\nexport async function runBenchmarks(opts: RunBenchmarksOptions): Promise<RunBenchmarksReport> {\n if (opts.benchmarks.length === 0) throw new Error('runBenchmarks: no benchmarks selected')\n if (opts.cells.length === 0) throw new Error('runBenchmarks: no cells to run')\n const reps = Math.max(1, opts.reps ?? 1)\n const loopAttempts = Math.max(1, opts.loopAttempts ?? 1)\n const shot = opts.runShot ?? openSandboxShot\n\n const { ready, unavailable } = await prepareBenchmarks(opts.benchmarks, opts.resolveAdapter ?? resolveAdapter, opts)\n\n const jobs: Job[] = []\n for (const { benchmark, adapter, tasks } of ready)\n for (const cell of opts.cells) for (const task of tasks) for (let rep = 0; rep < reps; rep += 1) jobs.push({ benchmark, adapter, cell, task, rep })\n\n const perTask: BenchCellTaskResult[] = []\n await runPool(jobs, Math.max(1, opts.concurrency ?? 4), async (job, index) => {\n const startedAt = Date.now()\n let result: BenchCellTaskResult\n try {\n const shotInput = {\n adapter: job.adapter,\n task: job.task,\n cell: job.cell,\n routerBaseUrl: opts.routerBaseUrl,\n routerKey: opts.routerKey,\n ...(opts.bridgeUrl ? { bridgeUrl: opts.bridgeUrl } : {}),\n ...(opts.bridgeBearer ? { bridgeBearer: opts.bridgeBearer } : {}),\n ...(opts.sandboxBaseUrl ? { sandboxBaseUrl: opts.sandboxBaseUrl } : {}),\n ...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.resolveClient ? { resolveClient: opts.resolveClient } : {}),\n }\n const out = loopAttempts > 1 ? await loopedShot(shotInput, shot, loopAttempts) : await shot(shotInput)\n const score: BenchScore = await job.adapter.judge(job.task, out.artifact)\n result = {\n benchmark: job.benchmark,\n cell: job.cell.label,\n taskId: job.task.id,\n rep: job.rep,\n resolved: out.ok && score.resolved,\n score: out.ok ? score.score : 0,\n ok: out.ok,\n ...(out.detail ?? score.detail ? { detail: combineDetails(out.detail, score.detail) } : {}),\n wallMs: Date.now() - startedAt,\n }\n } catch (err) {\n // A thrown shot/judge is infra error for THIS cell-task: ok=false excludes it from the\n // resolve denominator (never a silent 0% that hides a harness outage).\n result = {\n benchmark: job.benchmark,\n cell: job.cell.label,\n taskId: job.task.id,\n rep: job.rep,\n resolved: false,\n score: 0,\n ok: false,\n detail: err instanceof Error ? err.message.slice(0, 200) : String(err),\n wallMs: Date.now() - startedAt,\n }\n }\n void index\n perTask.push(result)\n opts.onResult?.(result)\n return result\n })\n\n const rows = aggregate(perTask)\n return {\n rows,\n perTask,\n benchmarks: ready.map((r) => r.benchmark),\n cells: opts.cells.map((c) => c.label),\n unavailable,\n }\n}\n\nfunction aggregate(perTask: readonly BenchCellTaskResult[]): BenchLeaderboardRow[] {\n const byKey = new Map<string, { benchmark: string; cell: string; n: number; resolved: number; errored: number; scoreSum: number }>()\n for (const r of perTask) {\n const key = `${r.benchmark}\\u0000${r.cell}`\n const e = byKey.get(key) ?? { benchmark: r.benchmark, cell: r.cell, n: 0, resolved: 0, errored: 0, scoreSum: 0 }\n e.n += 1\n if (!r.ok) e.errored += 1\n else {\n if (r.resolved) e.resolved += 1\n e.scoreSum += r.score\n }\n byKey.set(key, e)\n }\n const rows: BenchLeaderboardRow[] = [...byKey.values()].map((e) => {\n const denom = Math.max(1, e.n - e.errored)\n return {\n benchmark: e.benchmark,\n cell: e.cell,\n n: e.n,\n resolved: e.resolved,\n errored: e.errored,\n resolveRate: e.resolved / denom,\n meanScore: e.scoreSum / denom,\n }\n })\n rows.sort((a, b) => (a.benchmark === b.benchmark ? b.resolveRate - a.resolveRate : a.benchmark < b.benchmark ? -1 : 1))\n return rows\n}\n\n/** Render the leaderboard as a fixed-width table for a CLI/log. */\nexport function printBenchmarksReport(report: RunBenchmarksReport): string {\n const lines: string[] = []\n const w = Math.max(8, ...report.rows.map((r) => r.cell.length))\n const b = Math.max(9, ...report.rows.map((r) => r.benchmark.length))\n lines.push(`${'benchmark'.padEnd(b)} ${'cell'.padEnd(w)} resolve mean n err`)\n for (const r of report.rows)\n lines.push(\n `${r.benchmark.padEnd(b)} ${r.cell.padEnd(w)} ${(r.resolveRate * 100).toFixed(1).padStart(6)}% ${r.meanScore.toFixed(3).padStart(5)} ${String(r.n).padStart(3)} ${String(r.errored).padStart(3)}`,\n )\n for (const u of report.unavailable) lines.push(`(skipped ${u.benchmark}: ${u.reason})`)\n return lines.join('\\n')\n}\n","/** Reconstruct a runtime task outcome from Pier's evaluator-captured binary patch. */\nimport { spawn } from 'node:child_process'\nimport { mkdir, mkdtemp, realpath, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nimport {\n type AgentCandidateExecutorTaskOutcomeCapture,\n captureAgentCandidateWorkspaceFiles,\n} from '@tangle-network/agent-runtime/candidate-execution'\n\ninterface GitResult {\n readonly stdout: Buffer\n readonly stderr: Buffer\n}\n\n/** Apply the official patch in an isolated Git object directory and capture its exact tree. */\nexport async function capturePierTaskOutcome(input: {\n readonly repositoryRoot: string\n readonly baseCommit: string\n readonly baseTree: string\n readonly patch: Uint8Array\n readonly signal?: AbortSignal\n}): Promise<Extract<AgentCandidateExecutorTaskOutcomeCapture, { kind: 'workspace' }>> {\n input.signal?.throwIfAborted()\n const repositoryRoot = resolve(input.repositoryRoot)\n const head = (await git(repositoryRoot, ['rev-parse', 'HEAD'], undefined, {}, input.signal)).stdout\n .toString('utf8')\n .trim()\n const headTree = (\n await git(repositoryRoot, ['rev-parse', 'HEAD^{tree}'], undefined, {}, input.signal)\n ).stdout\n .toString('utf8')\n .trim()\n if (head !== input.baseCommit || headTree !== input.baseTree) {\n throw new Error('Pier task outcome repository drifted from its signed base')\n }\n const gitDir = resolve(\n (\n await git(repositoryRoot, ['rev-parse', '--absolute-git-dir'], undefined, {}, input.signal)\n ).stdout\n .toString('utf8')\n .trim(),\n )\n if ((await realpath(gitDir)) !== gitDir || gitDir.includes(':')) {\n throw new Error('Pier task outcome Git directory is unsupported')\n }\n const replacements = (\n await git(\n repositoryRoot,\n ['for-each-ref', '--format=%(refname)', 'refs/replace'],\n undefined,\n {},\n input.signal,\n )\n ).stdout\n .toString('utf8')\n .trim()\n if (replacements) throw new Error('Pier task outcome repository contains Git replace refs')\n\n const temporary = await mkdtemp(join(tmpdir(), 'pier-task-outcome-'))\n try {\n const objectDirectory = join(temporary, 'objects')\n const indexFile = join(temporary, 'index')\n await mkdir(objectDirectory)\n const environment = {\n GIT_INDEX_FILE: indexFile,\n GIT_OBJECT_DIRECTORY: objectDirectory,\n GIT_ALTERNATE_OBJECT_DIRECTORIES: join(gitDir, 'objects'),\n }\n await git(repositoryRoot, ['read-tree', input.baseTree], undefined, environment, input.signal)\n const patch = Uint8Array.from(input.patch)\n if (patch.byteLength > 0) {\n await git(\n repositoryRoot,\n ['apply', '--cached', '--binary', '--whitespace=nowarn', '-'],\n patch,\n environment,\n input.signal,\n )\n }\n const resultTree = (\n await git(repositoryRoot, ['write-tree'], undefined, environment, input.signal)\n ).stdout\n .toString('utf8')\n .trim()\n const entries = parseTreeEntries(\n (\n await git(\n repositoryRoot,\n ['ls-tree', '-rz', '--full-tree', resultTree],\n undefined,\n environment,\n input.signal,\n )\n ).stdout,\n )\n if (entries.length === 0) throw new Error('Pier task outcome tree cannot be empty')\n const files = await Promise.all(\n entries.map(async (entry) => {\n if (entry.type !== 'blob' || (entry.mode !== '100644' && entry.mode !== '100755')) {\n throw new Error(`Pier task outcome contains a non-regular entry: ${entry.path}`)\n }\n return {\n path: safeGitPath(entry.path),\n mode: entry.mode === '100755' ? (0o755 as const) : (0o644 as const),\n bytes: (\n await git(\n repositoryRoot,\n ['cat-file', 'blob', entry.object],\n undefined,\n environment,\n input.signal,\n )\n ).stdout,\n }\n }),\n )\n // The executor outcome must still return exact bytes; the runtime verifies\n // and persists its final task references after this capture completes.\n const captured = await captureAgentCandidateWorkspaceFiles(files, {\n limits: { maxEmbeddedArtifactBytes: 512 * 1024 * 1024 },\n })\n return {\n kind: 'workspace',\n resultTree,\n afterState: captured.snapshot.material,\n archive: captured.archive,\n gitDiff: patch,\n }\n } finally {\n await rm(temporary, { recursive: true, force: true })\n }\n}\n\nfunction parseTreeEntries(bytes: Uint8Array): Array<{\n readonly mode: string\n readonly type: string\n readonly object: string\n readonly path: string\n}> {\n const raw = Buffer.from(bytes)\n const decoded = raw.toString('utf8')\n if (!Buffer.from(decoded, 'utf8').equals(raw)) {\n throw new Error('Pier task outcome contains a non-UTF-8 path')\n }\n return decoded\n .split('\\0')\n .filter(Boolean)\n .map((row) => {\n const tab = row.indexOf('\\t')\n const [mode, type, object] = row.slice(0, tab).split(' ')\n const path = row.slice(tab + 1)\n if (tab < 1 || !mode || !type || !object || !path) {\n throw new Error('Pier task outcome contains a malformed Git entry')\n }\n return { mode, type, object, path }\n })\n}\n\nfunction safeGitPath(path: string): string {\n const parts = path.split('/')\n if (\n !path ||\n path.startsWith('/') ||\n path.includes('\\\\') ||\n path.includes('\\0') ||\n parts.some((part) => !part || part === '.' || part === '..') ||\n parts[0]?.toLowerCase() === '.git'\n ) {\n throw new Error(`Pier task outcome contains an unsafe Git path: ${path}`)\n }\n return path\n}\n\nasync function git(\n repositoryRoot: string,\n args: readonly string[],\n input: Uint8Array | undefined,\n extraEnvironment: Readonly<Record<string, string>>,\n signal: AbortSignal | undefined,\n): Promise<GitResult> {\n signal?.throwIfAborted()\n const environment = Object.fromEntries(\n Object.entries(process.env).filter(([name]) => !name.startsWith('GIT_')),\n ) as Record<string, string>\n Object.assign(environment, {\n GIT_CONFIG_NOSYSTEM: '1',\n GIT_CONFIG_GLOBAL: '/dev/null',\n GIT_CONFIG_SYSTEM: '/dev/null',\n GIT_TERMINAL_PROMPT: '0',\n GIT_NO_REPLACE_OBJECTS: '1',\n LC_ALL: 'C',\n ...extraEnvironment,\n })\n return await new Promise((resolveResult, reject) => {\n const child = spawn(\n 'git',\n [\n '-c',\n 'core.hooksPath=/dev/null',\n '-c',\n 'protocol.file.allow=never',\n '-C',\n repositoryRoot,\n ...args,\n ],\n { env: environment, stdio: ['pipe', 'pipe', 'pipe'], signal },\n )\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let outputBytes = 0\n const collect = (target: Buffer[]) => (chunk: Buffer) => {\n outputBytes += chunk.byteLength\n if (outputBytes > 64 * 1024 * 1024) {\n child.kill('SIGKILL')\n reject(new Error(`git ${args[0] ?? '<command>'} exceeded the output limit`))\n return\n }\n target.push(Buffer.from(chunk))\n }\n child.stdout.on('data', collect(stdout))\n child.stderr.on('data', collect(stderr))\n child.once('error', reject)\n child.once('close', (code, childSignal) => {\n const out = Buffer.concat(stdout)\n const err = Buffer.concat(stderr)\n if (code !== 0) {\n reject(\n new Error(\n `git ${args[0] ?? '<command>'} failed (${childSignal ?? code}): ${err.toString('utf8').trim()}`,\n ),\n )\n return\n }\n resolveResult({ stdout: out, stderr: err })\n })\n child.stdin.end(input)\n })\n}\n","/** Pier transport for a runtime-prepared immutable candidate execution. */\nimport assert from 'node:assert/strict'\nimport { createHash } from 'node:crypto'\nimport { chmod, lstat, mkdir, realpath, writeFile } from 'node:fs/promises'\nimport { dirname, isAbsolute, join, resolve } from 'node:path'\n\nimport type {\n AgentCandidateBenchmarkGraderPort,\n AgentCandidateExecutionClaimStore,\n AgentCandidateExecutorRequest,\n AgentCandidateExecutorStopRequest,\n AgentCandidateExecutorPort,\n AgentCandidateOutputArtifactPort,\n AgentCandidateProtectedRunCapture,\n AgentCandidateRunFinalization,\n PreparedAgentCandidateExecution,\n} from '@tangle-network/agent-runtime'\nimport { executePreparedAgentCandidate } from '@tangle-network/agent-runtime'\nimport { canonicalJson, type TraceStore } from '@tangle-network/agent-eval'\n\nimport { capturePierTaskOutcome } from './pier-task-outcome'\n\nconst adapterImportPath = 'pier_agents.tangle_candidate:TangleCandidateAgent'\nconst sha256Pattern = /^sha256:[a-f0-9]{64}$/\n\ninterface StagePreparedPierCandidateOptions {\n readonly prepared: PreparedAgentCandidateExecution\n /** Evaluator-owned directory persisted with the Pier trial. */\n readonly directory: string\n /** Exact Pier package version pinned by the experiment contract. */\n readonly pierVersion: string\n}\n\nexport interface StagedPierCandidateExecution {\n readonly executionId: string\n readonly directory: string\n readonly taskDirectory: string\n readonly candidateDirectory?: string\n readonly profileDirectory: string\n readonly planPath: string\n readonly receiptPath: string\n readonly agentArgs: readonly string[]\n /** Executor-only model and trace bindings; never present on the prepared object or disk. */\n readonly evaluatorEnv: Readonly<Record<string, string>>\n /** One prepared execution is exactly one Pier trial attempt. */\n readonly attemptArgs: readonly ['--n-attempts', '1', '--max-retries', '0']\n}\n\nexport interface PierCandidateTerminationAcknowledgement {\n /** The Pier process has exited and has been reaped. */\n readonly processExited: true\n /** Every task container created for this one trial has been removed. */\n readonly containersRemoved: true\n}\n\nexport interface PierCandidateTrialHandle {\n /** Non-secret durable identity shared with a fresh evaluator process. */\n readonly identity: PierCandidateTrialIdentity\n /** Resolves only after the Pier process exits and its task container is gone. */\n readonly result: Promise<PierCandidateTrialResult>\n /** Idempotently kill/reap Pier and remove its task container, then acknowledge their death. */\n readonly terminateAndWait: () => Promise<PierCandidateTerminationAcknowledgement>\n}\n\nexport type PierCandidateTrialIdentity = Readonly<AgentCandidateExecutorStopRequest>\n\n/**\n * Evaluator-owned lifecycle whose stop path works without the process-local\n * handle returned by `start`.\n */\nexport interface PierCandidateTrialController {\n start(\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ): PierCandidateTrialHandle\n terminateAndWait(\n identity: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTerminationAcknowledgement>\n /** Read immutable official bytes after termination; undefined proves no result was emitted. */\n captureResult(identity: PierCandidateTrialIdentity): Promise<PierCandidateTrialResult | undefined>\n}\n\n/** Evaluator-owned bytes captured from one completed official Pier trial. */\nexport interface PierCandidateTrialResult {\n /** Parsed value of the exact `result.json` bytes. */\n readonly value: unknown\n /** Exact official `result.json` bytes used as grader evidence. */\n readonly resultBytes: Uint8Array\n /** Exact `/logs/artifacts/model.patch` bytes emitted before official tests. */\n readonly taskPatch: Uint8Array\n}\n\nexport interface PierCandidateOfficialResult {\n readonly value: unknown\n readonly bytes: Uint8Array\n}\n\ntype RuntimeGraderInput = Parameters<AgentCandidateBenchmarkGraderPort['run']>[0]\ntype RuntimeGraderResult = Awaited<ReturnType<AgentCandidateBenchmarkGraderPort['run']>>\n\n/** Executes the exact admitted grader bytes against the official Pier result. */\nexport interface PierCandidateGraderPort {\n readonly name: string\n readonly version: string\n readonly artifact: AgentCandidateBenchmarkGraderPort['artifact']\n run(input: RuntimeGraderInput & {\n readonly officialResult: PierCandidateOfficialResult\n }): Promise<RuntimeGraderResult>\n}\n\nexport interface ExecutePreparedPierCandidateOptions extends StagePreparedPierCandidateOptions {\n readonly traceStore: TraceStore\n /** Durable one-shot store shared by every process capable of running this benchmark. */\n readonly claimStore: AgentCandidateExecutionClaimStore\n readonly outputArtifacts: AgentCandidateOutputArtifactPort\n readonly grader: PierCandidateGraderPort\n /**\n * Starts exactly one Pier trial synchronously and persists its non-secret\n * process/container identity before returning.\n */\n readonly controller: PierCandidateTrialController\n}\n\n/** Recovery-only runtime executor for an expired attempt owned by another process. */\nexport function createPierCandidateRecoveryExecutor(\n controller: PierCandidateTrialController,\n): AgentCandidateExecutorPort {\n return {\n execute: async () => {\n throw new Error('recovery-only Pier executor cannot start a candidate')\n },\n stop: async (request) => {\n assertTerminationAcknowledged(\n await controller.terminateAndWait({\n executionId: request.executionId,\n executionPlanDigest: request.executionPlanDigest,\n }),\n )\n return { stopped: true }\n },\n capture: async (request) => {\n const result = await controller.captureResult(request)\n if (!result) return {}\n return {\n evidence: Buffer.from(\n canonicalJson({\n schemaVersion: 1,\n kind: 'pier-candidate-recovery-capture',\n executionPlanDigest: request.executionPlanDigest,\n officialResult: Buffer.from(result.resultBytes).toString('base64'),\n taskPatch: Buffer.from(result.taskPatch).toString('base64'),\n }),\n ),\n }\n },\n }\n}\n\ninterface PierResultLike {\n exception_info?: unknown\n agent_result?: unknown\n}\n\nfunction sha256(bytes: Uint8Array): `sha256:${string}` {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (!value || value.includes('\\0')) throw new Error(`${label} must be non-empty without NUL`)\n return value\n}\n\nfunction absoluteHostPath(value: string, label: string): string {\n if (!isAbsolute(value)) throw new Error(`${label} must be an absolute host path`)\n return resolve(value)\n}\n\nfunction digest(value: string, label: string): string {\n if (!sha256Pattern.test(value)) throw new Error(`${label} is not a SHA-256 digest`)\n return value\n}\n\nfunction record(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction parseExactJson(bytes: Uint8Array, label: string): unknown {\n try {\n return JSON.parse(Buffer.from(bytes).toString('utf8'))\n } catch (error) {\n throw new Error(`${label} bytes are not UTF-8 JSON`, { cause: error })\n }\n}\n\nfunction safeRelativePath(value: string, label: string): string {\n const parts = value.split('/')\n if (\n !value ||\n value.includes('\\0') ||\n value.includes('\\\\') ||\n isAbsolute(value) ||\n parts.some((part) => !part || part === '.' || part === '..')\n ) {\n throw new Error(`${label} must be a canonical relative POSIX path`)\n }\n return value\n}\n\nasync function assertRealDirectory(path: string, label: string): Promise<void> {\n const stats = await lstat(path)\n if (!stats.isDirectory() || stats.isSymbolicLink()) {\n throw new Error(`${label} must be a real directory`)\n }\n if ((await realpath(path)) !== path) {\n throw new Error(`${label} has a symlinked path component`)\n }\n}\n\ninterface ExpectedExecutorFile {\n readonly path: string\n readonly mode: number\n readonly sha256: string\n readonly byteLength?: number\n}\n\nasync function materializeExecutorFiles(\n root: string,\n files: AgentCandidateExecutorRequest['inputs']['profile']['files'],\n expected: readonly ExpectedExecutorFile[],\n label: string,\n): Promise<void> {\n const expectedByPath = new Map(expected.map((file) => [file.path, file]))\n if (expectedByPath.size !== expected.length || files.length !== expected.length) {\n throw new Error(`${label} file set differs from signed evidence`)\n }\n\n await mkdir(root, { mode: 0o700 })\n await assertRealDirectory(root, label)\n for (const file of files) {\n const relative = safeRelativePath(file.path, `${label} file path`)\n const identity = expectedByPath.get(relative)\n if (!identity) throw new Error(`${label} contains unsigned file ${relative}`)\n if (\n file.mode !== identity.mode ||\n sha256(file.bytes) !== identity.sha256 ||\n (identity.byteLength !== undefined && file.bytes.byteLength !== identity.byteLength)\n ) {\n throw new Error(`${label} file ${relative} differs from signed evidence`)\n }\n\n const target = join(root, relative)\n const parent = dirname(target)\n if (parent !== root) await mkdir(parent, { recursive: true, mode: 0o700 })\n await writeFile(target, file.bytes, { flag: 'wx', mode: 0o600 })\n await chmod(target, file.mode)\n const stats = await lstat(target)\n if (\n !stats.isFile() ||\n stats.isSymbolicLink() ||\n stats.nlink !== 1 ||\n (stats.mode & 0o777) !== file.mode\n ) {\n throw new Error(`${label} file ${relative} is not a singly-linked regular file`)\n }\n }\n}\n\nfunction protectedEnvironment(\n prepared: PreparedAgentCandidateExecution,\n request: AgentCandidateExecutorRequest,\n): Readonly<Record<string, string>> {\n const protectedEntries: Array<readonly [string, string]> = []\n for (const [name, value] of Object.entries(request.launch.env)) {\n const publicValue = prepared.launch.env[name]\n if (publicValue === undefined) {\n protectedEntries.push([name, value])\n } else if (publicValue !== value) {\n throw new Error(`executor request changed signed public environment ${name}`)\n }\n }\n for (const name of Object.keys(prepared.launch.env)) {\n if (!(name in request.launch.env)) {\n throw new Error(`executor request omitted signed public environment ${name}`)\n }\n }\n return Object.freeze(Object.fromEntries(protectedEntries))\n}\n\n/**\n * Persist the runtime's exact canonical bytes and return only Pier transport\n * arguments. No benchmark-specific plan or candidate-authored telemetry exists.\n */\n/** @internal Package-private transport seam exercised by adapter tests. */\nexport async function stagePreparedPierCandidateExecution(\n options: StagePreparedPierCandidateOptions,\n request: AgentCandidateExecutorRequest,\n): Promise<StagedPierCandidateExecution> {\n const { prepared } = options\n nonEmpty(options.pierVersion, 'pierVersion')\n const directory = absoluteHostPath(options.directory, 'directory')\n await mkdir(directory, { mode: 0o700 })\n await assertRealDirectory(directory, 'directory')\n if (request.memory.mode !== 'disabled') {\n throw new Error('Pier transport does not yet implement protected isolated memory')\n }\n const taskDirectory = join(directory, 'task')\n const candidateDirectory = request.inputs.candidate ? join(directory, 'candidate') : undefined\n const profileDirectory = join(directory, 'profile')\n await materializeExecutorFiles(\n taskDirectory,\n request.inputs.task.files,\n request.inputs.task.snapshot.material.files,\n 'task executor input',\n )\n if (request.inputs.candidate && candidateDirectory) {\n await materializeExecutorFiles(\n candidateDirectory,\n request.inputs.candidate.files,\n request.inputs.candidate.snapshot.material.files,\n 'candidate executor input',\n )\n }\n await materializeExecutorFiles(\n profileDirectory,\n request.profileActivation.files.map((file) => ({\n path: file.path,\n mode: file.mode,\n bytes: Buffer.from(file.content, 'utf8'),\n })),\n request.profilePlan.value.material.files.map((file) => ({\n path: file.relPath,\n mode: file.mode,\n sha256: file.contentSha256,\n })),\n 'profile executor input',\n )\n\n const planDigest = digest(request.executionPlan.value.digest, 'execution plan digest')\n if (sha256(request.executionPlan.bytes) !== planDigest) {\n throw new Error('prepared execution-plan bytes do not match their runtime digest')\n }\n assert.deepEqual(\n parseExactJson(request.executionPlan.bytes, 'execution plan'),\n request.executionPlan.value.material,\n 'prepared execution-plan bytes differ from runtime material',\n )\n\n const receiptDigest = digest(\n request.materializationReceipt.digest,\n 'materialization receipt digest',\n )\n if (sha256(request.materializationReceipt.bytes) !== receiptDigest) {\n throw new Error('prepared materialization-receipt bytes do not match their runtime digest')\n }\n const { digest: _receiptDigest, ...receiptMaterial } = request.materializationReceipt.value\n assert.deepEqual(\n parseExactJson(request.materializationReceipt.bytes, 'materialization receipt'),\n receiptMaterial,\n 'prepared receipt bytes differ from runtime material',\n )\n\n const planPath = join(directory, 'execution-plan.json')\n const receiptPath = join(directory, 'materialization-receipt.json')\n await Promise.all([\n writeFile(planPath, request.executionPlan.bytes, { mode: 0o600, flag: 'wx' }),\n writeFile(receiptPath, request.materializationReceipt.bytes, { mode: 0o600, flag: 'wx' }),\n ])\n\n const agentArgs = [\n '--agent-import-path',\n adapterImportPath,\n '--model',\n nonEmpty(request.resolvedModel.requested, 'resolved requested model'),\n '--agent-kwarg',\n `plan_path=${planPath}`,\n '--agent-kwarg',\n `receipt_path=${receiptPath}`,\n '--agent-kwarg',\n `expected_receipt_digest=${receiptDigest}`,\n '--agent-kwarg',\n `trace_run_id=${nonEmpty(request.trace.runId, 'trace run id')}`,\n '--agent-kwarg',\n `task_dir=${taskDirectory}`,\n '--agent-kwarg',\n `profile_dir=${profileDirectory}`,\n '--agent-kwarg',\n `pier_version=${options.pierVersion}`,\n ]\n if (candidateDirectory !== undefined) {\n agentArgs.push('--agent-kwarg', `candidate_dir=${candidateDirectory}`)\n }\n\n return {\n executionId: request.executionId,\n directory,\n taskDirectory,\n ...(candidateDirectory ? { candidateDirectory } : {}),\n profileDirectory,\n planPath,\n receiptPath,\n agentArgs,\n evaluatorEnv: protectedEnvironment(prepared, request),\n attemptArgs: ['--n-attempts', '1', '--max-retries', '0'],\n }\n}\n\nfunction exceptionType(value: unknown): string | undefined {\n const info = value && typeof value === 'object' ? (value as Record<string, unknown>) : undefined\n for (const key of ['exception_type', 'type', 'name']) {\n if (typeof info?.[key] === 'string') return info[key]\n }\n return undefined\n}\n\n/** Read only identity and termination from Pier; usage always comes from agent-eval. */\n/** @internal Package-private result parser exercised by adapter tests. */\nexport function protectedCaptureFromPierResult(\n request: AgentCandidateExecutorRequest,\n value: unknown,\n): AgentCandidateProtectedRunCapture {\n const result = record(value, 'Pier trial result') as PierResultLike\n const agentResult = record(result.agent_result, 'Pier agent_result')\n const metadata = record(agentResult.metadata, 'Pier agent_result.metadata')\n const expected = {\n executionId: request.executionId,\n bundleDigest: request.executionPlan.value.material.runCell.bundleDigest,\n executionPlanDigest: request.executionPlan.value.digest,\n materializationReceiptDigest: request.materializationReceipt.digest,\n }\n for (const [name, identity] of Object.entries(expected)) {\n if (metadata[name] !== identity) {\n throw new Error(`Pier result ${name} does not match the prepared execution`)\n }\n }\n\n const reported = record(metadata.termination, 'Pier termination')\n const type = exceptionType(result.exception_info)\n if (type?.includes('AgentTimeout')) {\n return {\n executionId: request.executionId,\n termination: {\n kind: 'timeout',\n timeoutMs: request.hardLimits.timeoutMs,\n },\n }\n }\n if (type?.includes('Cancelled') || reported.kind === 'cancelled') {\n return { executionId: request.executionId, termination: { kind: 'cancelled' } }\n }\n if (reported.kind === 'exit' && Number.isInteger(reported.exitCode)) {\n return {\n executionId: request.executionId,\n termination: { kind: 'exit', exitCode: reported.exitCode as number },\n }\n }\n throw new Error(`Pier result has no recognized truthful termination${type ? ` (${type})` : ''}`)\n}\n\nfunction sealPierTrialResult(value: PierCandidateTrialResult): PierCandidateTrialResult {\n if (!(value.resultBytes instanceof Uint8Array) || !(value.taskPatch instanceof Uint8Array)) {\n throw new Error('Pier trial result must contain raw result and patch bytes')\n }\n const parsed = parseExactJson(value.resultBytes, 'Pier result.json')\n assert.deepEqual(parsed, value.value, 'Pier parsed result differs from result.json bytes')\n const resultBytes = Uint8Array.from(value.resultBytes)\n const taskPatch = Uint8Array.from(value.taskPatch)\n return Object.freeze({\n value: parsed,\n get resultBytes(): Uint8Array {\n return Uint8Array.from(resultBytes)\n },\n get taskPatch(): Uint8Array {\n return Uint8Array.from(taskPatch)\n },\n })\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n return new Error(`Pier candidate execution aborted${reason ? `: ${String(reason)}` : ''}`)\n}\n\nfunction assertTerminationAcknowledged(\n acknowledgement: PierCandidateTerminationAcknowledgement,\n): void {\n if (acknowledgement.processExited !== true || acknowledgement.containersRemoved !== true) {\n throw new Error('Pier termination did not acknowledge process and container death')\n }\n}\n\n/** @internal Package-private cancellation seam exercised by adapter tests. */\nexport async function awaitAbortableTrial<T>(\n trial: Omit<PierCandidateTrialHandle, 'result'> & { readonly result: Promise<T> },\n signal: AbortSignal,\n): Promise<T> {\n if (signal.aborted) {\n assertTerminationAcknowledged(await trial.terminateAndWait())\n throw abortReason(signal)\n }\n\n return await new Promise<T>((resolveResult, reject) => {\n let settled = false\n let aborting = false\n const settle = (callback: () => void): void => {\n if (settled) return\n settled = true\n signal.removeEventListener('abort', onAbort)\n callback()\n }\n const onAbort = (): void => {\n aborting = true\n void trial.terminateAndWait().then(\n (acknowledgement) => {\n try {\n assertTerminationAcknowledged(acknowledgement)\n settle(() => reject(abortReason(signal)))\n } catch (error) {\n settle(() => reject(error))\n }\n },\n (error) => settle(() => reject(new Error('Pier termination failed', { cause: error }))),\n )\n }\n signal.addEventListener('abort', onAbort, { once: true })\n trial.result.then(\n (result) => {\n if (!aborting && !signal.aborted) settle(() => resolveResult(result))\n },\n (error) => {\n if (!aborting && !signal.aborted) settle(() => reject(error))\n },\n )\n })\n}\n\n/** Execute and finalize through the runtime's only gradable candidate path. */\nexport async function executePreparedPierCandidate(\n options: ExecutePreparedPierCandidateOptions,\n): Promise<AgentCandidateRunFinalization> {\n const trials = new Map<\n string,\n { readonly handle: PierCandidateTrialHandle; result?: PierCandidateTrialResult }\n >()\n const officialResults = new Map<string, PierCandidateTrialResult>()\n const trialIdentity = (executionId: string, executionPlanDigest: string): string =>\n JSON.stringify([executionId, executionPlanDigest])\n const executor: AgentCandidateExecutorPort = {\n execute: async (request, context) => {\n context.signal.throwIfAborted()\n const staged = await stagePreparedPierCandidateExecution(options, request)\n context.signal.throwIfAborted()\n const identity = trialIdentity(request.executionId, request.executionPlan.value.digest)\n if (trials.has(identity)) throw new Error('Pier trial identity is already active')\n const trial = options.controller.start(staged, {\n request,\n traceStore: context.traceStore,\n signal: context.signal,\n deadlineAtMs: context.deadlineAtMs,\n })\n if (\n trial.identity.executionId !== request.executionId ||\n trial.identity.executionPlanDigest !== request.executionPlan.value.digest\n ) {\n assertTerminationAcknowledged(await trial.terminateAndWait())\n throw new Error('Pier controller returned a different durable trial identity')\n }\n const active = { handle: trial } as {\n readonly handle: PierCandidateTrialHandle\n result?: PierCandidateTrialResult\n }\n trials.set(identity, active)\n const result = sealPierTrialResult(await awaitAbortableTrial(trial, context.signal))\n active.result = result\n officialResults.set(request.executionId, result)\n return protectedCaptureFromPierResult(request, result.value)\n },\n stop: async (request) => {\n assertTerminationAcknowledged(\n await options.controller.terminateAndWait({\n executionId: request.executionId,\n executionPlanDigest: request.executionPlanDigest,\n }),\n )\n return { stopped: true }\n },\n capture: async (request) => {\n const identity = trialIdentity(request.executionId, request.executionPlanDigest)\n const active = trials.get(identity)\n let result = active?.result\n if (!result && active) {\n try {\n result = sealPierTrialResult(await active.handle.result)\n } catch {\n result = undefined\n }\n }\n if (!result) {\n const recovered = await options.controller.captureResult(request)\n result = recovered ? sealPierTrialResult(recovered) : undefined\n }\n if (!result) return {}\n officialResults.set(request.executionId, result)\n const task = options.prepared.benchmark.task\n const outcome = task.outcome\n if (outcome.kind !== 'workspace') {\n throw new Error('Pier candidate execution requires a workspace task outcome')\n }\n const repository = task.repository\n if (!repository) throw new Error('Pier workspace task is missing repository identity')\n const taskOutcome = await capturePierTaskOutcome({\n repositoryRoot: options.prepared.roots.staging.taskRoot,\n baseCommit: repository.baseCommit,\n baseTree: repository.baseTree,\n patch: result.taskPatch,\n })\n trials.delete(identity)\n return { taskOutcome }\n },\n }\n const grader: AgentCandidateBenchmarkGraderPort = {\n name: options.grader.name,\n version: options.grader.version,\n artifact: options.grader.artifact,\n run: async (input) => {\n const official = officialResults.get(input.executionId)\n if (!official) throw new Error('Pier official result is missing for executable grading')\n return await options.grader.run({\n ...input,\n officialResult: {\n value: parseExactJson(official.resultBytes, 'Pier result.json'),\n bytes: Uint8Array.from(official.resultBytes),\n },\n })\n },\n }\n try {\n return await executePreparedAgentCandidate(options.prepared, {\n executor,\n grader,\n outputArtifacts: options.outputArtifacts,\n traceStore: options.traceStore,\n claimStore: options.claimStore,\n })\n } finally {\n officialResults.clear()\n trials.clear()\n }\n}\n","/** Restart-safe evaluator ownership for one Pier process and its Docker projects. */\nimport { execFileSync, spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport {\n accessSync,\n closeSync,\n constants,\n existsSync,\n fsyncSync,\n lstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { Writable } from 'node:stream'\n\nimport type { AgentCandidateExecutorRequest } from '@tangle-network/agent-runtime'\nimport type { TraceStore } from '@tangle-network/agent-eval'\n\nimport type {\n PierCandidateTerminationAcknowledgement,\n PierCandidateTrialController,\n PierCandidateTrialHandle,\n PierCandidateTrialIdentity,\n PierCandidateTrialResult,\n StagedPierCandidateExecution,\n} from './pier-agent'\n\nconst identityFile = 'identity.json'\nconst terminalFile = 'terminal.json'\nconst stopFile = 'stop-requested'\nconst sha256Pattern = /^sha256:[a-f0-9]{64}$/\nconst defaultDockerConnectionId = 'local-default'\n\ninterface ProcessIdentity {\n readonly pid: number\n readonly processGroupId: number\n readonly sessionId: number\n readonly startTicks: string\n}\n\ninterface PersistedTrialIdentity {\n readonly schemaVersion: 1\n readonly kind: 'pier-trial-identity'\n readonly state: 'allocating' | 'starting' | 'running'\n readonly executionId: string\n readonly executionPlanDigest: `sha256:${string}`\n readonly supervisor?: ProcessIdentity\n readonly pier?: ProcessIdentity\n readonly jobsDirectory: string\n readonly jobName: string\n readonly dockerCommand: string\n readonly dockerConnectionId: string\n}\n\ninterface PersistedTrialTerminal {\n readonly schemaVersion: 1\n readonly kind: 'pier-trial-terminal'\n readonly status: 'completed' | 'stopped' | 'failed'\n readonly processExited: boolean\n readonly containersRemoved: boolean\n readonly removedContainers?: number\n readonly exitCode?: number | null\n readonly signal?: NodeJS.Signals | null\n readonly error?: string\n readonly recoveredByPid?: number\n}\n\nexport interface PierCandidateProcessSpec {\n /** Returns launch data only. The controller, not this callback, starts the process. */\n readonly command: string\n readonly args: readonly string[]\n readonly cwd: string\n /** Exact Pier child environment. The controller adds its Docker connection variables. */\n readonly env: Readonly<Record<string, string | undefined>>\n readonly jobsDirectory: string\n /** Must be unique: the controller atomically reserves this Pier job directory. */\n readonly jobName: string\n readonly dockerCommand?: string\n /** Called only by the originating process after the supervisor reports clean exit. */\n readonly readResult: () => Promise<PierCandidateTrialResult>\n}\n\nexport interface PierDockerConnection {\n /** Stable, non-secret name that every recovery worker maps to the same Docker endpoint. */\n readonly id: string\n /** Exact variables needed by both Pier and Docker cleanup; values are never persisted. */\n readonly env: Readonly<Record<string, string | undefined>>\n}\n\nexport interface FilePierCandidateTrialControllerOptions {\n /** Shared evaluator-owned control root, available to crash-recovery workers. */\n readonly directory: string\n readonly launch?: (\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ) => PierCandidateProcessSpec\n /** Restart-safe reader for immutable official bytes under the persisted Pier job identity. */\n readonly readResult?: (input: {\n readonly jobsDirectory: string\n readonly jobName: string\n }) => Promise<PierCandidateTrialResult | undefined>\n /** Omit only for the default local Docker socket with no environment variables. */\n readonly dockerConnection?: PierDockerConnection\n readonly supervisorPath?: string\n readonly pollIntervalMs?: number\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (!value || value.includes('\\0')) throw new Error(`${label} must be non-empty without NUL`)\n return value\n}\n\nfunction stableDockerConnectionId(value: string): string {\n if (!/^[A-Za-z0-9._:-]{1,200}$/.test(value)) {\n throw new Error('Docker connection id must be a non-secret stable name')\n }\n return value\n}\n\nfunction absolutePath(value: string, label: string): string {\n if (!isAbsolute(value)) throw new Error(`${label} must be an absolute path`)\n return resolve(value)\n}\n\nfunction validateEnvironment(\n environment: Readonly<Record<string, string | undefined>>,\n label: string,\n): void {\n for (const [name, value] of Object.entries(environment)) {\n if (!name || name.includes('\\0') || value?.includes('\\0')) {\n throw new Error(`${label} contains an invalid name or value`)\n }\n }\n}\n\nfunction resolveExecutable(command: string, searchPath: string | undefined, label: string): string {\n nonEmpty(command, label)\n const candidates = command.includes('/')\n ? [absolutePath(command, label)]\n : (searchPath ?? '')\n .split(':')\n .filter(Boolean)\n .map((directory) => join(directory, command))\n for (const candidate of candidates) {\n try {\n accessSync(candidate, constants.X_OK)\n return realpathSync(candidate)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT' && (error as NodeJS.ErrnoException).code !== 'EACCES') {\n throw error\n }\n }\n }\n throw new Error(`${label} is not executable on the evaluator PATH`)\n}\n\nfunction syncDirectory(directory: string): void {\n const fd = openSync(directory, 'r')\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n}\n\nfunction writeJsonAtomic(directory: string, name: string, value: unknown): void {\n const target = join(directory, name)\n const temporary = join(directory, `.${name}.${process.pid}.${Date.now()}.tmp`)\n const fd = openSync(temporary, 'wx', 0o600)\n try {\n writeFileSync(fd, `${JSON.stringify(value)}\\n`, 'utf8')\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n renameSync(temporary, target)\n syncDirectory(directory)\n}\n\nfunction touchDurable(directory: string, name: string): void {\n try {\n const fd = openSync(join(directory, name), 'wx', 0o600)\n try {\n fsyncSync(fd)\n } finally {\n closeSync(fd)\n }\n syncDirectory(directory)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') throw error\n }\n}\n\nfunction readJson(path: string, label: string): Record<string, unknown> {\n let value: unknown\n try {\n value = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n throw new Error(`${label} is not valid JSON`, { cause: error })\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction parseProcessIdentity(value: unknown, label: string): ProcessIdentity {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${label} must be an object`)\n }\n const record = value as Record<string, unknown>\n if (\n !Number.isSafeInteger(record.pid) ||\n !Number.isSafeInteger(record.processGroupId) ||\n !Number.isSafeInteger(record.sessionId) ||\n typeof record.startTicks !== 'string' ||\n !/^\\d+$/.test(record.startTicks)\n ) {\n throw new Error(`${label} is malformed`)\n }\n return {\n pid: record.pid as number,\n processGroupId: record.processGroupId as number,\n sessionId: record.sessionId as number,\n startTicks: record.startTicks,\n }\n}\n\nfunction parsePersistedIdentity(path: string): PersistedTrialIdentity {\n const record = readJson(path, 'Pier trial identity')\n if (\n record.schemaVersion !== 1 ||\n record.kind !== 'pier-trial-identity' ||\n !['allocating', 'starting', 'running'].includes(record.state as string) ||\n typeof record.executionId !== 'string' ||\n typeof record.executionPlanDigest !== 'string' ||\n !sha256Pattern.test(record.executionPlanDigest) ||\n typeof record.jobsDirectory !== 'string' ||\n typeof record.jobName !== 'string' ||\n typeof record.dockerCommand !== 'string' ||\n typeof record.dockerConnectionId !== 'string'\n ) {\n throw new Error('Pier trial identity is malformed')\n }\n return {\n schemaVersion: 1,\n kind: 'pier-trial-identity',\n state: record.state as PersistedTrialIdentity['state'],\n executionId: record.executionId,\n executionPlanDigest: record.executionPlanDigest as `sha256:${string}`,\n ...(record.supervisor\n ? { supervisor: parseProcessIdentity(record.supervisor, 'Pier supervisor identity') }\n : {}),\n ...(record.pier ? { pier: parseProcessIdentity(record.pier, 'Pier process identity') } : {}),\n jobsDirectory: absolutePath(record.jobsDirectory, 'persisted jobs directory'),\n jobName: nonEmpty(record.jobName, 'persisted job name'),\n dockerCommand: nonEmpty(record.dockerCommand, 'persisted Docker command'),\n dockerConnectionId: stableDockerConnectionId(record.dockerConnectionId),\n }\n}\n\nfunction parseTerminal(path: string): PersistedTrialTerminal {\n const record = readJson(path, 'Pier trial terminal')\n const allowedKeys = new Set([\n 'schemaVersion',\n 'kind',\n 'status',\n 'processExited',\n 'containersRemoved',\n 'removedContainers',\n 'exitCode',\n 'signal',\n 'error',\n 'recoveredByPid',\n ])\n const hasMalformedOptionalField =\n (record.removedContainers !== undefined &&\n (!Number.isSafeInteger(record.removedContainers) || (record.removedContainers as number) < 0)) ||\n (record.exitCode !== undefined &&\n record.exitCode !== null &&\n !Number.isSafeInteger(record.exitCode)) ||\n (record.signal !== undefined &&\n record.signal !== null &&\n (typeof record.signal !== 'string' || !/^SIG[A-Z0-9]+$/.test(record.signal))) ||\n (record.error !== undefined && typeof record.error !== 'string') ||\n (record.recoveredByPid !== undefined &&\n (!Number.isSafeInteger(record.recoveredByPid) || (record.recoveredByPid as number) < 1))\n if (\n Object.keys(record).some((key) => !allowedKeys.has(key)) ||\n record.schemaVersion !== 1 ||\n record.kind !== 'pier-trial-terminal' ||\n !['completed', 'stopped', 'failed'].includes(record.status as string) ||\n typeof record.processExited !== 'boolean' ||\n typeof record.containersRemoved !== 'boolean' ||\n hasMalformedOptionalField\n ) {\n throw new Error('Pier trial terminal is malformed')\n }\n return {\n schemaVersion: 1,\n kind: 'pier-trial-terminal',\n status: record.status as PersistedTrialTerminal['status'],\n processExited: record.processExited,\n containersRemoved: record.containersRemoved,\n ...(record.removedContainers !== undefined\n ? { removedContainers: record.removedContainers as number }\n : {}),\n ...(record.exitCode !== undefined ? { exitCode: record.exitCode as number | null } : {}),\n ...(record.signal !== undefined ? { signal: record.signal as NodeJS.Signals | null } : {}),\n ...(record.error !== undefined ? { error: record.error as string } : {}),\n ...(record.recoveredByPid !== undefined\n ? { recoveredByPid: record.recoveredByPid as number }\n : {}),\n }\n}\n\nfunction processIdentity(pid: number): ProcessIdentity {\n const text = readFileSync(`/proc/${pid}/stat`, 'utf8')\n const closing = text.lastIndexOf(')')\n if (closing < 0) throw new Error(`cannot parse process identity for ${pid}`)\n const fields = text.slice(closing + 2).trim().split(/\\s+/)\n const processGroupId = Number(fields[2])\n const sessionId = Number(fields[3])\n const startTicks = fields[19]\n if (\n !Number.isSafeInteger(processGroupId) ||\n !Number.isSafeInteger(sessionId) ||\n !/^\\d+$/.test(startTicks ?? '')\n ) {\n throw new Error(`cannot parse process identity for ${pid}`)\n }\n return { pid, processGroupId, sessionId, startTicks }\n}\n\nfunction processMatches(identity: ProcessIdentity): boolean {\n try {\n const current = processIdentity(identity.pid)\n return (\n current.startTicks === identity.startTicks &&\n current.processGroupId === identity.processGroupId &&\n current.sessionId === identity.sessionId\n )\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false\n throw error\n }\n}\n\nfunction signalProcess(identity: ProcessIdentity, signal: NodeJS.Signals, group: boolean): void {\n if (!processMatches(identity)) return\n try {\n process.kill(group ? -identity.processGroupId : identity.pid, signal)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ESRCH') throw error\n }\n}\n\nfunction sessionMembers(sessionId: number): ProcessIdentity[] {\n const members: ProcessIdentity[] = []\n for (const entry of readdirSync('/proc', { withFileTypes: true })) {\n if (!entry.isDirectory() || !/^\\d+$/.test(entry.name)) continue\n try {\n const identity = processIdentity(Number(entry.name))\n if (identity.sessionId === sessionId) members.push(identity)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n }\n return members\n}\n\nasync function signalSessionUntilEmpty(\n identity: ProcessIdentity,\n signal: NodeJS.Signals,\n timeoutMs: number,\n intervalMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n while (true) {\n const members = sessionMembers(identity.sessionId)\n if (members.length === 0) return true\n for (const member of members) signalProcess(member, signal, false)\n if (Date.now() >= deadline) return false\n await sleep(intervalMs)\n }\n}\n\nfunction sanitizeProject(value: string): string {\n let project = value.toLowerCase()\n if (!/^[a-z0-9]/.test(project)) project = `0${project}`\n return project.replace(/[^a-z0-9_-]/g, '-')\n}\n\nfunction trialProjects(identity: PersistedTrialIdentity): string[] {\n const jobRoot = join(identity.jobsDirectory, identity.jobName)\n if (!existsSync(jobRoot)) return []\n return readdirSync(jobRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && !entry.isSymbolicLink())\n .map((entry) => sanitizeProject(entry.name))\n}\n\nfunction matchingContainers(\n identity: PersistedTrialIdentity,\n dockerEnvironment: Readonly<Record<string, string | undefined>>,\n): string[] {\n const projects = trialProjects(identity)\n if (projects.length === 0) return []\n const output = execFileSync(\n identity.dockerCommand,\n ['ps', '-a', '--format', '{{.ID}}\\t{{.Label \"com.docker.compose.project\"}}'],\n {\n encoding: 'utf8',\n env: dockerEnvironment,\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n },\n )\n return output\n .split('\\n')\n .filter(Boolean)\n .flatMap((line) => {\n const tab = line.indexOf('\\t')\n if (tab < 1) return []\n const id = line.slice(0, tab)\n const project = line.slice(tab + 1)\n return projects.some(\n (expected) =>\n project === expected || project.startsWith(`${expected}__verifier__`),\n )\n ? [id]\n : []\n })\n}\n\nfunction removeTrialContainers(\n identity: PersistedTrialIdentity,\n dockerEnvironment: Readonly<Record<string, string | undefined>>,\n): number {\n const containers = matchingContainers(identity, dockerEnvironment)\n if (containers.length > 0) {\n try {\n execFileSync(identity.dockerCommand, ['rm', '-f', ...containers], {\n encoding: 'utf8',\n env: dockerEnvironment,\n timeout: 30_000,\n maxBuffer: 4 * 1024 * 1024,\n })\n } catch (error) {\n if (matchingContainers(identity, dockerEnvironment).length > 0) throw error\n }\n }\n const remaining = matchingContainers(identity, dockerEnvironment)\n if (remaining.length > 0) {\n throw new Error(`Pier task containers survived removal: ${remaining.join(', ')}`)\n }\n return containers.length\n}\n\nfunction sleep(milliseconds: number): Promise<void> {\n return new Promise((resolveSleep) => setTimeout(resolveSleep, milliseconds))\n}\n\nasync function waitUntil(predicate: () => boolean, timeoutMs: number, intervalMs: number) {\n const deadline = Date.now() + timeoutMs\n while (!predicate()) {\n if (Date.now() >= deadline) return false\n await sleep(intervalMs)\n }\n return true\n}\n\nfunction trialKey(identity: PierCandidateTrialIdentity): string {\n if (!sha256Pattern.test(identity.executionPlanDigest)) {\n throw new Error('executionPlanDigest must be a SHA-256 digest')\n }\n return createHash('sha256')\n .update(JSON.stringify([nonEmpty(identity.executionId, 'executionId'), identity.executionPlanDigest]))\n .digest('hex')\n}\n\nfunction assertRealDirectory(path: string, label: string): void {\n const stats = lstatSync(path)\n if (!stats.isDirectory() || stats.isSymbolicLink() || realpathSync(path) !== path) {\n throw new Error(`${label} must be a real canonical directory`)\n }\n}\n\nexport class FilePierCandidateTrialController implements PierCandidateTrialController {\n private readonly directory: string\n private readonly launch?: NonNullable<FilePierCandidateTrialControllerOptions['launch']>\n private readonly readResult?: NonNullable<FilePierCandidateTrialControllerOptions['readResult']>\n private readonly dockerConnection: PierDockerConnection\n private readonly supervisorPath: string\n private readonly pollIntervalMs: number\n\n constructor(options: FilePierCandidateTrialControllerOptions) {\n this.directory = absolutePath(options.directory, 'Pier controller directory')\n this.launch = options.launch\n this.readResult = options.readResult\n const configuredDocker = options.dockerConnection\n if (configuredDocker?.id === defaultDockerConnectionId) {\n throw new Error(`${defaultDockerConnectionId} is reserved for the implicit local connection`)\n }\n const dockerConnection = configuredDocker ?? {\n id: defaultDockerConnectionId,\n env: {},\n }\n const connectionId = stableDockerConnectionId(dockerConnection.id)\n validateEnvironment(dockerConnection.env, 'Docker connection environment')\n this.dockerConnection = Object.freeze({\n id: connectionId,\n env: Object.freeze({ ...dockerConnection.env }),\n })\n this.supervisorPath = absolutePath(\n options.supervisorPath ??\n fileURLToPath(new URL('./pier-trial-supervisor.mjs', import.meta.url)),\n 'Pier supervisor path',\n )\n this.pollIntervalMs = options.pollIntervalMs ?? 25\n if (!Number.isSafeInteger(this.pollIntervalMs) || this.pollIntervalMs < 1) {\n throw new Error('pollIntervalMs must be a positive integer')\n }\n mkdirSync(this.directory, { recursive: true, mode: 0o700 })\n assertRealDirectory(this.directory, 'Pier controller directory')\n }\n\n start(\n staged: StagedPierCandidateExecution,\n context: {\n readonly request: AgentCandidateExecutorRequest\n readonly traceStore: TraceStore\n readonly signal: AbortSignal\n readonly deadlineAtMs: number\n },\n ): PierCandidateTrialHandle {\n if (!this.launch) throw new Error('this Pier controller is recovery-only')\n const identity: PierCandidateTrialIdentity = {\n executionId: context.request.executionId,\n executionPlanDigest: context.request.executionPlan.value.digest,\n }\n if (staged.executionId !== identity.executionId) {\n throw new Error('staged Pier execution does not match the runtime request')\n }\n\n // The launch callback is a pure spec builder. Resolve every fallible input\n // before reserving durable identities or starting a process.\n const spec = this.launch(staged, context)\n this.validateSpec(spec)\n for (const [name, value] of Object.entries(this.dockerConnection.env)) {\n if (\n Object.prototype.hasOwnProperty.call(spec.env, name) &&\n spec.env[name] !== value\n ) {\n throw new Error(`Pier child environment conflicts with Docker connection variable ${name}`)\n }\n }\n const pierEnvironment = Object.freeze({\n ...spec.env,\n ...this.dockerConnection.env,\n })\n mkdirSync(spec.jobsDirectory, { recursive: true, mode: 0o700 })\n assertRealDirectory(spec.jobsDirectory, 'Pier jobs directory')\n const dockerCommand = resolveExecutable(\n spec.dockerCommand ?? 'docker',\n process.env.PATH,\n 'Docker command',\n )\n const pierCommand = resolveExecutable(spec.command, pierEnvironment.PATH, 'Pier command')\n\n const controlDirectory = this.controlDirectory(identity)\n try {\n mkdirSync(controlDirectory, { mode: 0o700 })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new Error('Pier trial identity already has durable control state')\n }\n throw error\n }\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n\n // Pier creates each trial directory before starting its environment. An\n // atomically reserved, one-execution job directory therefore makes every\n // Compose project discovered below exclusive to this execution.\n const jobRoot = join(spec.jobsDirectory, spec.jobName)\n let jobRootCreated = false\n try {\n mkdirSync(jobRoot, { mode: 0o700 })\n jobRootCreated = true\n assertRealDirectory(jobRoot, 'Pier job directory')\n } catch (error) {\n // No identity or process exists yet; leave the execution reusable.\n rmSync(controlDirectory, { recursive: true, force: true })\n if (jobRootCreated) rmSync(jobRoot, { recursive: true, force: true })\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new Error('Pier job name must be unique; its job directory already exists')\n }\n throw error\n }\n const allocating: PersistedTrialIdentity = {\n schemaVersion: 1,\n kind: 'pier-trial-identity',\n state: 'allocating',\n ...identity,\n jobsDirectory: absolutePath(spec.jobsDirectory, 'Pier jobs directory'),\n jobName: nonEmpty(spec.jobName, 'Pier job name'),\n dockerCommand: nonEmpty(dockerCommand, 'Docker command'),\n dockerConnectionId: this.dockerConnection.id,\n }\n try {\n writeJsonAtomic(controlDirectory, identityFile, allocating)\n } catch (error) {\n // The supervisor can only start after this durable write succeeds.\n rmSync(controlDirectory, { recursive: true, force: true })\n rmSync(jobRoot, { recursive: true, force: true })\n throw error\n }\n\n const supervisor = spawn(process.execPath, [this.supervisorPath, controlDirectory], {\n detached: true,\n // Launch data arrives over fd 3. The trusted supervisor receives only\n // explicitly declared process variables, never the evaluator environment.\n env: { ...this.dockerConnection.env },\n stdio: ['ignore', 'ignore', 'ignore', 'pipe'],\n })\n if (supervisor.pid === undefined) throw new Error('Pier supervisor started without a pid')\n const controlPipe = supervisor.stdio[3] as (Writable & { unref?: () => void }) | null\n let supervisorIdentity: ProcessIdentity | undefined\n try {\n supervisorIdentity = processIdentity(supervisor.pid)\n const persisted: PersistedTrialIdentity = {\n ...allocating,\n state: 'starting',\n supervisor: supervisorIdentity,\n }\n writeJsonAtomic(controlDirectory, identityFile, persisted)\n if (!controlPipe) throw new Error('Pier supervisor has no protected control pipe')\n controlPipe.on('error', () => undefined)\n controlPipe.end(\n JSON.stringify({\n command: pierCommand,\n args: spec.args,\n cwd: spec.cwd,\n env: pierEnvironment,\n jobsDirectory: spec.jobsDirectory,\n jobName: spec.jobName,\n dockerCommand,\n }),\n )\n } catch (error) {\n controlPipe?.destroy()\n if (supervisorIdentity) signalProcess(supervisorIdentity, 'SIGKILL', false)\n else {\n try {\n process.kill(supervisor.pid, 'SIGKILL')\n } catch (killError) {\n if ((killError as NodeJS.ErrnoException).code !== 'ESRCH') throw killError\n }\n }\n throw error\n }\n supervisor.unref()\n controlPipe.unref?.()\n\n const result = this.waitForResult(controlDirectory, spec, context.deadlineAtMs)\n return {\n identity,\n result,\n terminateAndWait: async () => await this.terminateAndWait(identity),\n }\n }\n\n async terminateAndWait(\n requested: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTerminationAcknowledgement> {\n const controlDirectory = this.controlDirectory(requested)\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n const persisted = parsePersistedIdentity(join(controlDirectory, identityFile))\n if (\n persisted.executionId !== requested.executionId ||\n persisted.executionPlanDigest !== requested.executionPlanDigest\n ) {\n throw new Error('persisted Pier trial identity differs from the stop request')\n }\n this.assertDockerConnection(persisted)\n\n touchDurable(controlDirectory, stopFile)\n if (!existsSync(join(controlDirectory, terminalFile))) {\n if (persisted.supervisor) signalProcess(persisted.supervisor, 'SIGTERM', false)\n }\n const terminalAppeared = await waitUntil(\n () => existsSync(join(controlDirectory, terminalFile)),\n persisted.supervisor ? 10_000 : 1,\n this.pollIntervalMs,\n )\n if (!terminalAppeared) await this.forceRecovery(controlDirectory)\n\n let terminal = parseTerminal(join(controlDirectory, terminalFile))\n const latest = parsePersistedIdentity(join(controlDirectory, identityFile))\n const liveProcesses = latest.pier ? sessionMembers(latest.pier.sessionId).length : 0\n this.assertDockerConnection(latest)\n const liveContainers = matchingContainers(latest, this.dockerConnection.env).length\n if (liveProcesses > 0 || liveContainers > 0) {\n await this.forceRecovery(controlDirectory)\n terminal = parseTerminal(join(controlDirectory, terminalFile))\n }\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error(\n `Pier recovery did not prove process/container death${terminal.error ? `: ${terminal.error}` : ''}`,\n )\n }\n return { processExited: true, containersRemoved: true }\n }\n\n async captureResult(\n requested: PierCandidateTrialIdentity,\n ): Promise<PierCandidateTrialResult | undefined> {\n const controlDirectory = this.controlDirectory(requested)\n assertRealDirectory(controlDirectory, 'Pier trial control directory')\n const persisted = parsePersistedIdentity(join(controlDirectory, identityFile))\n if (\n persisted.executionId !== requested.executionId ||\n persisted.executionPlanDigest !== requested.executionPlanDigest\n ) {\n throw new Error('persisted Pier trial identity differs from the capture request')\n }\n this.assertDockerConnection(persisted)\n const terminal = parseTerminal(join(controlDirectory, terminalFile))\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error('Pier result capture requires proven process and container death')\n }\n if (!this.readResult) {\n throw new Error('Pier result capture has no restart-safe result reader')\n }\n return await this.readResult({\n jobsDirectory: persisted.jobsDirectory,\n jobName: persisted.jobName,\n })\n }\n\n private controlDirectory(identity: PierCandidateTrialIdentity): string {\n return join(this.directory, trialKey(identity))\n }\n\n private assertDockerConnection(identity: PersistedTrialIdentity): void {\n if (identity.dockerConnectionId !== this.dockerConnection.id) {\n throw new Error(\n `Pier trial requires Docker connection ${identity.dockerConnectionId}; configured ${this.dockerConnection.id}`,\n )\n }\n }\n\n private validateSpec(spec: PierCandidateProcessSpec): void {\n nonEmpty(spec.command, 'Pier command')\n if (!Array.isArray(spec.args) || spec.args.some((arg) => typeof arg !== 'string' || arg.includes('\\0'))) {\n throw new Error('Pier arguments must be strings without NUL')\n }\n absolutePath(spec.cwd, 'Pier cwd')\n absolutePath(spec.jobsDirectory, 'Pier jobs directory')\n if (!/^[A-Za-z0-9._-]{1,200}$/.test(spec.jobName)) {\n throw new Error('Pier job name must be filesystem-neutral')\n }\n validateEnvironment(spec.env, 'Pier child environment')\n }\n\n private async waitForResult(\n controlDirectory: string,\n spec: PierCandidateProcessSpec,\n deadlineAtMs: number,\n ): Promise<PierCandidateTrialResult> {\n const waitMs = Math.max(0, deadlineAtMs - Date.now())\n const appeared = await waitUntil(\n () => existsSync(join(controlDirectory, terminalFile)),\n waitMs,\n this.pollIntervalMs,\n )\n if (!appeared) throw new Error('Pier supervisor emitted no terminal acknowledgement')\n const terminal = parseTerminal(join(controlDirectory, terminalFile))\n if (!terminal.processExited || !terminal.containersRemoved) {\n throw new Error('Pier supervisor did not prove process and container death')\n }\n if (terminal.status !== 'completed') {\n throw new Error(terminal.error ? `Pier process failed: ${terminal.error}` : 'Pier process stopped')\n }\n return await spec.readResult()\n }\n\n private async forceRecovery(\n controlDirectory: string,\n ): Promise<void> {\n const latest = parsePersistedIdentity(join(controlDirectory, identityFile))\n this.assertDockerConnection(latest)\n const errors: string[] = []\n if (latest.pier) {\n try {\n await signalSessionUntilEmpty(latest.pier, 'SIGTERM', 2_000, this.pollIntervalMs)\n } catch (error) {\n errors.push(`could not signal Pier session: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (latest.supervisor) {\n try {\n signalProcess(latest.supervisor, 'SIGKILL', false)\n if (!(await waitUntil(() => !processMatches(latest.supervisor!), 5_000, this.pollIntervalMs))) {\n errors.push(`Pier supervisor ${latest.supervisor.pid} survived SIGKILL`)\n }\n } catch (error) {\n errors.push(`could not kill Pier supervisor: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (latest.pier) {\n try {\n if (\n !(await signalSessionUntilEmpty(\n latest.pier,\n 'SIGKILL',\n 5_000,\n this.pollIntervalMs,\n ))\n ) {\n errors.push(`Pier process session ${latest.pier.sessionId} survived SIGKILL`)\n }\n } catch (error) {\n errors.push(`could not kill Pier session: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n let removedContainers = 0\n try {\n removedContainers = removeTrialContainers(latest, this.dockerConnection.env)\n } catch (error) {\n errors.push(`could not remove Pier containers: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (errors.length > 0) {\n throw new Error(`Pier recovery incomplete: ${errors.join('; ')}`)\n }\n writeJsonAtomic(controlDirectory, terminalFile, {\n schemaVersion: 1,\n kind: 'pier-trial-terminal',\n status: 'stopped',\n processExited: true,\n containersRemoved: true,\n removedContainers,\n recoveredByPid: process.pid,\n })\n }\n}\n","/** Execute the exact admitted Pier result parser bytes in a fresh Node process. */\nimport { spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { chmod, mkdtemp, rm, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nimport type { BenchmarkEvaluation } from '@tangle-network/agent-eval'\n\nimport type { PierCandidateGraderPort } from './pier-agent'\n\nconst sha256 = (bytes: Uint8Array): `sha256:${string}` =>\n `sha256:${createHash('sha256').update(bytes).digest('hex')}`\n\nexport function createPierResultGrader(\n descriptor: Pick<PierCandidateGraderPort, 'name' | 'version' | 'artifact'>,\n): PierCandidateGraderPort {\n return {\n ...descriptor,\n run: async (input) => {\n input.signal.throwIfAborted()\n const implementation = Uint8Array.from(input.implementation.bytes)\n if (implementation.byteLength !== input.implementation.byteLength) {\n throw new Error('Pier grader implementation length changed before execution')\n }\n const evidence = Uint8Array.from(input.officialResult.bytes)\n const evaluation = await executeGrader(implementation, evidence, input.signal)\n input.signal.throwIfAborted()\n return {\n evaluation,\n evidence,\n binding: {\n implementationDigest: sha256(implementation),\n taskOutcomeDigest: input.outcome.evidence.digest,\n outputDigest: sha256(evidence),\n },\n }\n },\n }\n}\n\nasync function executeGrader(\n implementation: Uint8Array,\n resultBytes: Uint8Array,\n signal: AbortSignal,\n): Promise<BenchmarkEvaluation> {\n const directory = await mkdtemp(join(tmpdir(), 'pier-result-grader-'))\n const script = join(directory, 'grader.mjs')\n try {\n await writeFile(script, implementation, { flag: 'wx', mode: 0o600 })\n await chmod(script, 0o500)\n const stdout = await runNode(script, resultBytes, signal)\n const parsed = JSON.parse(stdout.toString('utf8')) as BenchmarkEvaluation\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Pier result grader returned a non-object evaluation')\n }\n return parsed\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n}\n\nasync function runNode(\n script: string,\n input: Uint8Array,\n signal: AbortSignal,\n): Promise<Buffer> {\n signal.throwIfAborted()\n return await new Promise((resolveResult, reject) => {\n const child = spawn(process.execPath, ['--no-warnings', script], {\n env: {\n PATH: process.env.PATH,\n HOME: process.env.HOME,\n LANG: 'C',\n LC_ALL: 'C',\n },\n stdio: ['pipe', 'pipe', 'pipe'],\n signal,\n })\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let bytes = 0\n const collect = (target: Buffer[]) => (chunk: Buffer) => {\n bytes += chunk.byteLength\n if (bytes > 1024 * 1024) {\n child.kill('SIGKILL')\n reject(new Error('Pier result grader exceeded its output limit'))\n return\n }\n target.push(Buffer.from(chunk))\n }\n child.stdout.on('data', collect(stdout))\n child.stderr.on('data', collect(stderr))\n child.once('error', reject)\n child.once('close', (code, childSignal) => {\n if (code !== 0) {\n reject(\n new Error(\n `Pier result grader failed (${childSignal ?? code}): ${Buffer.concat(stderr).toString('utf8').trim()}`,\n ),\n )\n return\n }\n resolveResult(Buffer.concat(stdout))\n })\n child.stdin.end(input)\n })\n}\n"],"mappings":"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"}