reeval 0.6.3 → 0.7.0

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 (174) hide show
  1. package/README.md +265 -0
  2. package/THIRD_PARTY_NOTICES.md +5 -5
  3. package/assets/package.json +1 -1
  4. package/assets/pnpm-lock.yaml +30 -307
  5. package/dist/{agent-DKuFnZPM.js → agent-Dhd5FJCZ.js} +4 -4
  6. package/dist/{agent-DKuFnZPM.js.map → agent-Dhd5FJCZ.js.map} +1 -1
  7. package/dist/{agent-oirN_8IS.js → agent-gjBiZis8.js} +4 -4
  8. package/dist/{agent-oirN_8IS.js.map → agent-gjBiZis8.js.map} +1 -1
  9. package/dist/assemble-D8sZ4Jiv.js +2 -0
  10. package/dist/{assemble-DYCDgbTq.js → assemble-Dd_mZYnu.js} +109 -7
  11. package/dist/assemble-Dd_mZYnu.js.map +1 -0
  12. package/dist/bridge/index.mjs +66 -7
  13. package/dist/bridge/package.json +3 -3
  14. package/dist/bridge/pnpm-lock.yaml +84 -89
  15. package/dist/{cli-BIhzl_v_.js → cli-r9CDqoFL.js} +139 -186
  16. package/dist/cli-r9CDqoFL.js.map +1 -0
  17. package/dist/{cli-spec-DUeyuSIQ.js → cli-spec-DOyxAMc2.js} +22 -9
  18. package/dist/cli-spec-DOyxAMc2.js.map +1 -0
  19. package/dist/cli.js +2 -2
  20. package/dist/{matchers-Bp-OH1vj.js → client-LsfDiD-X.js} +152 -76
  21. package/dist/client-LsfDiD-X.js.map +1 -0
  22. package/dist/{command-KoOJ0ntD.js → command-Cej2t3y-.js} +9 -9
  23. package/dist/{command-KoOJ0ntD.js.map → command-Cej2t3y-.js.map} +1 -1
  24. package/dist/command-Cxfgghqo.js +2 -0
  25. package/dist/{command-DuJBqcwu.js → command-D6r2pwO5.js} +10 -10
  26. package/dist/{command-DuJBqcwu.js.map → command-D6r2pwO5.js.map} +1 -1
  27. package/dist/{command-B8tcwUJk.js → command-DMR69l5G.js} +12 -12
  28. package/dist/{command-B8tcwUJk.js.map → command-DMR69l5G.js.map} +1 -1
  29. package/dist/{command-fJpZK205.js → command-l4ZFCeMh.js} +6 -6
  30. package/dist/{command-fJpZK205.js.map → command-l4ZFCeMh.js.map} +1 -1
  31. package/dist/{commands-CHdTfPB6.js → commands-BA_NCh2h.js} +6 -6
  32. package/dist/{commands-CHdTfPB6.js.map → commands-BA_NCh2h.js.map} +1 -1
  33. package/dist/{commands-DE604ldB.js → commands-DgOUkcSO.js} +1 -1
  34. package/dist/{config-7-gXOgQf.js → config-DuQDCx0B.js} +3 -3
  35. package/dist/{config-7-gXOgQf.js.map → config-DuQDCx0B.js.map} +1 -1
  36. package/dist/{db-DvkzBhM6.js → db-CjX7JF4o.js} +12 -24
  37. package/dist/{db-DvkzBhM6.js.map → db-CjX7JF4o.js.map} +1 -1
  38. package/dist/db-o_osRkqr.js +3 -0
  39. package/dist/{dist-DsZNsoD3.js → dist-CTzThfu_.js} +3 -3
  40. package/dist/{dist-DsZNsoD3.js.map → dist-CTzThfu_.js.map} +1 -1
  41. package/dist/{docker-BBOMThRi.js → docker-DaUaG4XZ.js} +4 -4
  42. package/dist/{docker-BBOMThRi.js.map → docker-DaUaG4XZ.js.map} +1 -1
  43. package/dist/{docker-CiNVc7di.js → docker-Dnya8eo9.js} +1 -1
  44. package/dist/{docker-CzFiN2AZ.js → docker-ZaYeKE2w.js} +2 -2
  45. package/dist/{docker-CzFiN2AZ.js.map → docker-ZaYeKE2w.js.map} +1 -1
  46. package/dist/{doctor-C06kYs2r.js → doctor-Bk6aJeec.js} +10 -10
  47. package/dist/{doctor-C06kYs2r.js.map → doctor-Bk6aJeec.js.map} +1 -1
  48. package/dist/{egress-De64jpeQ.js → egress-BKbyriEa.js} +10 -10
  49. package/dist/{egress-De64jpeQ.js.map → egress-BKbyriEa.js.map} +1 -1
  50. package/dist/{files-BqIF7iu4.js → files-BSMSnQMa.js} +2 -2
  51. package/dist/{files-BqIF7iu4.js.map → files-BSMSnQMa.js.map} +1 -1
  52. package/dist/files-DmZGPsWK.js +2 -0
  53. package/dist/{files-Cq99wif-.js → files-TNrZJQ3Y.js} +15 -4
  54. package/dist/{files-Cq99wif-.js.map → files-TNrZJQ3Y.js.map} +1 -1
  55. package/dist/files-Tb8wY0Ze.js +2 -0
  56. package/dist/{git-Dnl-kXgD.js → git-DNGtrOg9.js} +2 -2
  57. package/dist/{git-Dnl-kXgD.js.map → git-DNGtrOg9.js.map} +1 -1
  58. package/dist/{harness-3QUEWx8G.js → harness-CDRaaGvR.js} +2 -2
  59. package/dist/{harness-3QUEWx8G.js.map → harness-CDRaaGvR.js.map} +1 -1
  60. package/dist/harness.d.ts +1 -1
  61. package/dist/harness.js +1 -1
  62. package/dist/{header-IE-uIvX0.js → header-BZF8Xss1.js} +2 -2
  63. package/dist/{header-IE-uIvX0.js.map → header-BZF8Xss1.js.map} +1 -1
  64. package/dist/{images-B8Mp_VXZ.js → images-BpwFDT1E.js} +6 -6
  65. package/dist/{images-B8Mp_VXZ.js.map → images-BpwFDT1E.js.map} +1 -1
  66. package/dist/index.d.ts +12 -7
  67. package/dist/index.js +24 -17
  68. package/dist/index.js.map +1 -1
  69. package/dist/init-1THeGfut.js +2 -0
  70. package/dist/{init-B8mw86E6.js → init-CBWt1rZT.js} +4 -4
  71. package/dist/{init-B8mw86E6.js.map → init-CBWt1rZT.js.map} +1 -1
  72. package/dist/{invocations-DHC946b-.js → invocations-DArYWyXN.js} +2 -2
  73. package/dist/{invocations-DHC946b-.js.map → invocations-DArYWyXN.js.map} +1 -1
  74. package/dist/judge.d.ts +1 -1
  75. package/dist/model-D_pF3Vcl.js +2 -0
  76. package/dist/{model-CtrJdFi6.js → model-DyQbu7KF.js} +113 -3
  77. package/dist/model-DyQbu7KF.js.map +1 -0
  78. package/dist/{opencode-providers-DjlA5fuC.js → opencode-providers-ByD85Q0l.js} +21 -7
  79. package/dist/{opencode-providers-DjlA5fuC.js.map → opencode-providers-ByD85Q0l.js.map} +1 -1
  80. package/dist/{options-CWYB613o.js → options-Ge_x32XE.js} +3 -3
  81. package/dist/{options-CWYB613o.js.map → options-Ge_x32XE.js.map} +1 -1
  82. package/dist/{plan-CsPE24pp.js → plan-BqBadHYj.js} +14 -7
  83. package/dist/plan-BqBadHYj.js.map +1 -0
  84. package/dist/{preflight-DKZjb7ZH.js → preflight-CFtZNTLt.js} +1 -1
  85. package/dist/{preflight-r0DgibQV.js → preflight-CyaAZE9r.js} +3 -3
  86. package/dist/{preflight-r0DgibQV.js.map → preflight-CyaAZE9r.js.map} +1 -1
  87. package/dist/{prepare-DOkvAa9D.js → prepare-Dl7-t3fO.js} +2 -2
  88. package/dist/{prepare-CTLg3nuk.js → prepare-Zr1xOMUX.js} +4 -4
  89. package/dist/{prepare-CTLg3nuk.js.map → prepare-Zr1xOMUX.js.map} +1 -1
  90. package/dist/{provenance--cVNo80L.js → provenance-Byl2T6LJ.js} +2 -2
  91. package/dist/{provenance--cVNo80L.js.map → provenance-Byl2T6LJ.js.map} +1 -1
  92. package/dist/{providers-DNLQzVnc.js → providers-Cflw7Ks-.js} +3 -3
  93. package/dist/{providers-DNLQzVnc.js.map → providers-Cflw7Ks-.js.map} +1 -1
  94. package/dist/{providers-B2cSfewm.js → providers-SBMExI53.js} +1 -1
  95. package/dist/query-CvutWHaL.js +2 -0
  96. package/dist/{query-DTtIZaua.js → query-DUSLlic0.js} +2 -2
  97. package/dist/{query-DTtIZaua.js.map → query-DUSLlic0.js.map} +1 -1
  98. package/dist/results-owJR-NFm.js +52 -0
  99. package/dist/results-owJR-NFm.js.map +1 -0
  100. package/dist/resume-BL4Yw7Ld.js +406 -0
  101. package/dist/resume-BL4Yw7Ld.js.map +1 -0
  102. package/dist/sandbox.d.ts +1 -1
  103. package/dist/server-CNPsB0cT.js +2 -0
  104. package/dist/{server-BFlKK2j6.js → server-yFVUxAm0.js} +6 -6
  105. package/dist/{server-BFlKK2j6.js.map → server-yFVUxAm0.js.map} +1 -1
  106. package/dist/source-Cmc5SKFn.js +2 -0
  107. package/dist/{source-B2ASbTdc.js → source-M3gS517R.js} +2 -2
  108. package/dist/{source-B2ASbTdc.js.map → source-M3gS517R.js.map} +1 -1
  109. package/dist/{src-Bo8GFUXg.js → src--L8B4WGa.js} +1 -1
  110. package/dist/{src-zOeHvrzR.js → src-79JhW-zG.js} +13 -13
  111. package/dist/{src-zOeHvrzR.js.map → src-79JhW-zG.js.map} +1 -1
  112. package/dist/{src-BoziVhKa.js → src-BLN459er.js} +1 -1
  113. package/dist/src-Bz66jDtE.js +3 -0
  114. package/dist/{src-CPkDaNxp.js → src-CfUwg9UY.js} +1 -1
  115. package/dist/{src-BHFNhTTQ.js → src-CokPbYCb.js} +45 -45
  116. package/dist/{src-BHFNhTTQ.js.map → src-CokPbYCb.js.map} +1 -1
  117. package/dist/{src-CDiGyoDt.js → src-DH0jhpoi.js} +1 -1
  118. package/dist/{src-CVoCJjEe.js → src-DTcalvuF.js} +2 -2
  119. package/dist/{src-CVoCJjEe.js.map → src-DTcalvuF.js.map} +1 -1
  120. package/dist/src-DV_3QDHA.js +4 -0
  121. package/dist/{src-CqsERnCZ.js → src-IOr1rhEg.js} +4 -4
  122. package/dist/{src-CqsERnCZ.js.map → src-IOr1rhEg.js.map} +1 -1
  123. package/dist/src-Ljh2vKXm.js +3 -0
  124. package/dist/{state-DBKcUJ2u.js → state-DEj_utaE.js} +10 -10
  125. package/dist/{state-DBKcUJ2u.js.map → state-DEj_utaE.js.map} +1 -1
  126. package/dist/state-DkqbCVVp.js +2 -0
  127. package/dist/studio-app/assets/{index-WQPq5K3E.js → index-Bbl0oTxu.js} +1 -1
  128. package/dist/studio-app/index.html +1 -1
  129. package/dist/{summary-CahgSiVt.js → summary--FBuB_sr.js} +3 -3
  130. package/dist/{summary-CahgSiVt.js.map → summary--FBuB_sr.js.map} +1 -1
  131. package/dist/{summary-BBABbon9.js → summary-D012KlUM.js} +5 -5
  132. package/dist/{summary-BBABbon9.js.map → summary-D012KlUM.js.map} +1 -1
  133. package/dist/tool-target-BU1JnSE9.js +34 -0
  134. package/dist/tool-target-BU1JnSE9.js.map +1 -0
  135. package/dist/{tools-53YHomyk.js → tools-CJHw-zCo.js} +3 -3
  136. package/dist/{tools-53YHomyk.js.map → tools-CJHw-zCo.js.map} +1 -1
  137. package/dist/{types-CoAfC-_k.d.ts → types-BsRSknLe.d.ts} +5 -4
  138. package/dist/view/index.d.ts +1 -1
  139. package/dist/view/index.js +2 -2
  140. package/dist/{views-Drl2OXuj.js → views-jhL9Jb8A.js} +4 -4
  141. package/dist/{views-Drl2OXuj.js.map → views-jhL9Jb8A.js.map} +1 -1
  142. package/dist/views-yPmmoo8f.js +3 -0
  143. package/dist/{worker-entry-mCctDzig.js → worker-entry-OwnsrUdr.js} +72 -2
  144. package/dist/worker-entry-OwnsrUdr.js.map +1 -0
  145. package/dist/{workspace-BT4jd04k.js → workspace-C4_J0pqb.js} +3 -3
  146. package/dist/{workspace-BT4jd04k.js.map → workspace-C4_J0pqb.js.map} +1 -1
  147. package/dist/{workspace-U6M1gKzo.js → workspace-wudSz_W-.js} +1 -1
  148. package/package.json +9 -8
  149. package/dist/assemble-DYCDgbTq.js.map +0 -1
  150. package/dist/assemble-DykFydSU.js +0 -2
  151. package/dist/cli-BIhzl_v_.js.map +0 -1
  152. package/dist/cli-spec-DUeyuSIQ.js.map +0 -1
  153. package/dist/command-CwuwuKJD.js +0 -2
  154. package/dist/db-BVE1kZ2w.js +0 -2
  155. package/dist/files-Cs8tbYQY.js +0 -2
  156. package/dist/files-wUtoO5aA.js +0 -2
  157. package/dist/init-DDEpamaf.js +0 -2
  158. package/dist/matchers-Bp-OH1vj.js.map +0 -1
  159. package/dist/model-C_B5JrhL.js +0 -2
  160. package/dist/model-CtrJdFi6.js.map +0 -1
  161. package/dist/plan-CsPE24pp.js.map +0 -1
  162. package/dist/query-BWc_5Lhe.js +0 -2
  163. package/dist/results-CrFs7_In.js +0 -37
  164. package/dist/results-CrFs7_In.js.map +0 -1
  165. package/dist/server-HRUHVcHc.js +0 -2
  166. package/dist/source-Co7h89WK.js +0 -2
  167. package/dist/src-BE19tji4.js +0 -3
  168. package/dist/src-CFxHPwQA.js +0 -3
  169. package/dist/src-D-go5-qz.js +0 -4
  170. package/dist/state-BaHjYXr1.js +0 -2
  171. package/dist/stats-BNAHlNMD.js +0 -114
  172. package/dist/stats-BNAHlNMD.js.map +0 -1
  173. package/dist/views-BhGinAz_.js +0 -3
  174. package/dist/worker-entry-mCctDzig.js.map +0 -1
@@ -5,25 +5,24 @@ import { o as redactSecrets, s as registerSecret } from "./redact-DJ9JCShu.js";
5
5
  import { o as PACKAGE_VERSION } from "./root-CvdRlRZX.js";
6
6
  import { T as workspaceLabel, u as environmentSandbox } from "./environment-DiCljXMD.js";
7
7
  import { a as fromCwd, i as evalSlug, n as attemptKey, o as newRunId } from "./ids-Bp6ut7ZD.js";
8
- import { I as LABEL, X as imageInfo } from "./src-zOeHvrzR.js";
9
- import { d as sandboxId, s as harnessId } from "./options-CWYB613o.js";
10
- import { c as hostCapacity, d as missingCredentials, f as resolveConcurrency, i as configPathFor, l as loadConfig, p as selectProfile, r as configLabel, s as findConfig, u as malformedCredentials } from "./config-7-gXOgQf.js";
8
+ import { I as LABEL, X as imageInfo } from "./src-79JhW-zG.js";
9
+ import { d as sandboxId, s as harnessId } from "./options-Ge_x32XE.js";
10
+ import { c as hostCapacity, d as missingCredentials, f as resolveConcurrency, i as configPathFor, l as loadConfig, p as selectProfile, r as configLabel, s as findConfig, u as malformedCredentials } from "./config-DuQDCx0B.js";
11
11
  import { s as debugTime } from "./debug-D24NOQH1.js";
12
12
  import { i as sandboxWarningLine, n as clip, r as formatDuration } from "./text-gEcKjAyp.js";
13
13
  import { t as PrepareError } from "./provider-CmAYTQQs.js";
14
- import { B as cellContrast, G as effortLabel, L as judgeRatesLabel, M as cellJudgeRates, N as cellUsage, P as collapsedJudgeLabel, _ as hasUngatedCells, b as isUngatedMiss, h as formatUsage, w as runOutcome } from "./model-CtrJdFi6.js";
15
- import { n as LIVE_FILE, o as liveCounts } from "./live-DZkCtmNP.js";
16
- import { a as liftLabel, i as gateLabel, n as answersLabel } from "./summary-CahgSiVt.js";
17
- import { n as FLAGS, o as helpText, r as GLOBAL, t as COMMANDS } from "./cli-spec-DUeyuSIQ.js";
18
- import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance--cVNo80L.js";
14
+ import { B as cellContrast, G as effortLabel, L as judgeRatesLabel, M as cellJudgeRates, N as cellUsage, P as collapsedJudgeLabel, _ as hasUngatedCells, b as isUngatedMiss, h as formatUsage, w as runOutcome } from "./model-DyQbu7KF.js";
15
+ import { a as liftLabel, i as gateLabel, n as answersLabel } from "./summary--FBuB_sr.js";
16
+ import { c as writeLiveProgress, i as prepareResume, o as resolveResume, r as loadPrevious, s as writeCurrent, t as completedKeysFor } from "./resume-BL4Yw7Ld.js";
17
+ import { n as FLAGS, o as helpText, r as GLOBAL, t as COMMANDS } from "./cli-spec-DOyxAMc2.js";
18
+ import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance-Byl2T6LJ.js";
19
19
  import { t as budgetMarker } from "./budget-DBUrH4jX.js";
20
- import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-r0DgibQV.js";
21
- import { r as imageHarness } from "./prepare-CTLg3nuk.js";
22
- import { n as createProviders } from "./providers-DNLQzVnc.js";
23
- import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-DHC946b-.js";
20
+ import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-CyaAZE9r.js";
21
+ import { r as imageHarness } from "./prepare-Zr1xOMUX.js";
22
+ import { n as createProviders } from "./providers-Cflw7Ks-.js";
23
+ import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-DArYWyXN.js";
24
24
  import { n as stripAnsi, t as colors } from "./colors-QV9dFVhN.js";
25
- import { existsSync, mkdirSync, readdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
26
- import { hostname } from "node:os";
25
+ import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
27
26
  import { dirname, join } from "node:path";
28
27
  import { appendFile, readFile, rm } from "node:fs/promises";
29
28
  import { inspect } from "node:util";
@@ -32,7 +31,7 @@ import { Command, Option } from "commander";
32
31
  //#region src/cli-parse.ts
33
32
  const OPTIONS = Object.fromEntries(Object.entries(FLAGS).map(([name, spec]) => {
34
33
  const short = "short" in spec ? `-${spec.short}, ` : "";
35
- const value = spec.type === "string" ? " <value>" : "";
34
+ const value = spec.type === "string" ? "optional" in spec && spec.optional ? " [value]" : " <value>" : "";
36
35
  return [name, () => {
37
36
  const option = new Option(`${short}--${name}${value}`);
38
37
  if ("multiple" in spec && spec.multiple) option.argParser((v, prev = []) => [...prev, spec.type === "string" ? v : true]);
@@ -108,7 +107,10 @@ function valuesOf(command, flags) {
108
107
  const value = option && opts[option.attributeName()];
109
108
  if (option?.negate) {
110
109
  if (value === false) values[flag] = true;
111
- } else if (value !== void 0) values[flag] = value;
110
+ } else if (value !== void 0) {
111
+ const spec = FLAGS[flag];
112
+ values[flag] = spec.type === "string" && "optional" in spec && spec.optional && value === true ? "" : value;
113
+ }
112
114
  }
113
115
  return values;
114
116
  }
@@ -127,118 +129,6 @@ function usageError(error, command) {
127
129
  }
128
130
  return new UsageError(first.charAt(0).toUpperCase() + first.slice(1));
129
131
  }
130
- function finished(result) {
131
- const outcome = result.meta?.outcome;
132
- if (result.state === "skipped") return outcome === "fail" || outcome === "infra_error" ? outcome : "skipped";
133
- if (outcome === "infra_error") return "infra_error";
134
- return result.state === "passed" ? "pass" : "fail";
135
- }
136
- /** Sharing-violation codes Windows uses while a reader has `to` open. */
137
- const BUSY = /* @__PURE__ */ new Set([
138
- "EPERM",
139
- "EACCES",
140
- "EBUSY"
141
- ]);
142
- /** How long a busy rename is retried. A studio poll holds the file for a few milliseconds. */
143
- const BUSY_MS = 1e3;
144
- function pause(ms) {
145
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
146
- }
147
- /**
148
- * Renames `from` over `to`. Windows refuses while a reader (`reeval studio`) has `to` open, for a
149
- * moment: try again for up to a second rather than drop the update.
150
- */
151
- function replace(from, to, rename = renameSync, hooks = {}) {
152
- const now = hooks.now ?? Date.now;
153
- const wait = hooks.wait ?? pause;
154
- const deadline = now() + (hooks.busyMs ?? BUSY_MS);
155
- for (let attempt = 1;; attempt++) try {
156
- rename(from, to);
157
- return;
158
- } catch (error) {
159
- const code = error.code;
160
- if (!code || !BUSY.has(code) || now() >= deadline) throw error;
161
- wait(Math.min(attempt, 32));
162
- }
163
- }
164
- /** Writes the file at once, then on every change and heartbeat. Write errors never fail the run. */
165
- function writeLiveProgress(options) {
166
- const now = options.now ?? (() => /* @__PURE__ */ new Date());
167
- const file = join(options.dir, LIVE_FILE);
168
- const tmp = `${file}.${process.pid}.tmp`;
169
- const attempts = new Map(options.planned.map((p) => [p.key, {
170
- key: p.key,
171
- evalId: p.id,
172
- name: p.attempt.name,
173
- file: p.file,
174
- cell: p.attempt.cell.key,
175
- n: p.attempt.n,
176
- status: p.attempt.plan.skip ? "skipped" : "queued",
177
- startedAt: null,
178
- durationMs: null
179
- }]));
180
- let phase = "running";
181
- let stopped = false;
182
- const read = () => {
183
- const list = [...attempts.values()];
184
- return {
185
- schemaVersion: 1,
186
- runId: options.runId,
187
- startedAt: options.startedAt.toISOString(),
188
- pid: process.pid,
189
- host: hostname(),
190
- heartbeatAt: now().toISOString(),
191
- phase,
192
- planned: list.length,
193
- counts: liveCounts(list),
194
- attempts: list
195
- };
196
- };
197
- const write = () => {
198
- if (stopped) return;
199
- try {
200
- writeFileSync(tmp, JSON.stringify(read()));
201
- replace(tmp, file);
202
- } catch {}
203
- };
204
- try {
205
- mkdirSync(options.dir, { recursive: true });
206
- } catch {}
207
- write();
208
- const heartbeat = setInterval(write, options.heartbeatMs ?? 2e3);
209
- heartbeat.unref();
210
- const stop = () => {
211
- stopped = true;
212
- clearInterval(heartbeat);
213
- };
214
- return {
215
- start(key, at) {
216
- const a = attempts.get(key);
217
- if (!a) return;
218
- a.status = "running";
219
- a.startedAt = new Date(at).toISOString();
220
- write();
221
- },
222
- end(result) {
223
- const a = attempts.get(result.key);
224
- if (!a) return;
225
- a.status = finished(result);
226
- a.durationMs = result.durationMs;
227
- write();
228
- },
229
- phase(next) {
230
- phase = next;
231
- write();
232
- },
233
- stop,
234
- remove() {
235
- stop();
236
- rmSync(file, { force: true });
237
- rmSync(tmp, { force: true });
238
- },
239
- read
240
- };
241
- }
242
132
  //#endregion
243
133
  //#region src/preflight.ts
244
134
  /** How the terminal names a sandbox to prepare: its cell id, `+ install`, and a harness other than Cursor. */
@@ -793,7 +683,7 @@ var AgentRenderer = class {
793
683
  for (const w of e.sandboxWarnings ?? []) this.#write(sandboxWarningLine(w));
794
684
  return;
795
685
  case "run-start":
796
- this.#write(`reeval run: ${e.files} eval file${e.files === 1 ? "" : "s"}`);
686
+ this.#write(`reeval run: ${e.runId} · ${e.files} eval file${e.files === 1 ? "" : "s"}`);
797
687
  return;
798
688
  case "collected":
799
689
  this.#tags.addFile(e.evals);
@@ -946,7 +836,7 @@ var PlainRenderer = class {
946
836
  const files = `${e.files} eval file${e.files === 1 ? "" : "s"}`;
947
837
  const order = `${this.#o.output.logOrder} logs`;
948
838
  const setup = `harness ${e.harness} · sandbox ${e.sandbox} · concurrency ${e.concurrency}`;
949
- this.#write(c.dim(`reeval ${e.version} · ${files} · ${setup} · ${order}`));
839
+ this.#write(c.dim(`reeval ${e.version} · run ${e.runId} · ${files} · ${setup} · ${order}`));
950
840
  return;
951
841
  }
952
842
  case "plan":
@@ -1226,7 +1116,7 @@ async function run(argv) {
1226
1116
  return values.help ? EXIT.ok : EXIT.usage;
1227
1117
  }
1228
1118
  if (command === "init") {
1229
- const { initCommand } = await import("./init-DDEpamaf.js");
1119
+ const { initCommand } = await import("./init-1THeGfut.js");
1230
1120
  return initCommand(values, filters, {
1231
1121
  out: (s) => console.log(s),
1232
1122
  input: process.stdin,
@@ -1235,7 +1125,7 @@ async function run(argv) {
1235
1125
  });
1236
1126
  }
1237
1127
  if (command === "doctor") {
1238
- const { doctorCommand } = await import("./doctor-C06kYs2r.js");
1128
+ const { doctorCommand } = await import("./doctor-Bk6aJeec.js");
1239
1129
  return doctorCommand(values, {
1240
1130
  out: (s) => console.log(s),
1241
1131
  color: !!process.stdout.isTTY && !process.env.NO_COLOR,
@@ -1243,7 +1133,7 @@ async function run(argv) {
1243
1133
  });
1244
1134
  }
1245
1135
  if (command === "report") {
1246
- const { reportCommand } = await import("./command-KoOJ0ntD.js");
1136
+ const { reportCommand } = await import("./command-Cej2t3y-.js");
1247
1137
  return reportCommand(values, filters, {
1248
1138
  out: (s) => console.log(s),
1249
1139
  err: (s) => console.error(dim(s)),
@@ -1258,7 +1148,7 @@ async function run(argv) {
1258
1148
  }
1259
1149
  if (command === "studio") {
1260
1150
  const config = await loadConfig(configPath, "studio");
1261
- const { studioCommand } = await import("./command-fJpZK205.js");
1151
+ const { studioCommand } = await import("./command-l4ZFCeMh.js");
1262
1152
  return studioCommand({
1263
1153
  config,
1264
1154
  flags: values,
@@ -1269,7 +1159,7 @@ async function run(argv) {
1269
1159
  if (command === "mcp") {
1270
1160
  if (!values.http) console.log = console.info = console.debug = console.error;
1271
1161
  const config = await loadConfig(configPath, "mcp");
1272
- const { mcpCommand } = await import("./command-B8tcwUJk.js");
1162
+ const { mcpCommand } = await import("./command-DMR69l5G.js");
1273
1163
  return mcpCommand({
1274
1164
  config,
1275
1165
  flags: values,
@@ -1278,7 +1168,7 @@ async function run(argv) {
1278
1168
  }
1279
1169
  if (command in HISTORY_COMMANDS) {
1280
1170
  const config = await loadConfig(configPath, command);
1281
- const commands = await import("./commands-DE604ldB.js");
1171
+ const commands = await import("./commands-DgOUkcSO.js");
1282
1172
  const ctx = {
1283
1173
  config,
1284
1174
  flags: values,
@@ -1291,7 +1181,7 @@ async function run(argv) {
1291
1181
  case "compare": return commands.compareCommand(ctx, filters);
1292
1182
  case "checkout": return commands.checkoutCommand(ctx, filters);
1293
1183
  case "query": {
1294
- const { queryCommand } = await import("./query-BWc_5Lhe.js");
1184
+ const { queryCommand } = await import("./query-CvutWHaL.js");
1295
1185
  return queryCommand({
1296
1186
  ...ctx,
1297
1187
  err: (s) => console.error(dim(s))
@@ -1299,7 +1189,7 @@ async function run(argv) {
1299
1189
  }
1300
1190
  case "analyze": {
1301
1191
  loadEnvFiles(configPath);
1302
- const { analyzeCommand } = await import("./command-CwuwuKJD.js");
1192
+ const { analyzeCommand } = await import("./command-Cxfgghqo.js");
1303
1193
  return analyzeCommand({
1304
1194
  ...ctx,
1305
1195
  err: (s) => console.error(dim(s))
@@ -1338,8 +1228,8 @@ async function cleanCommand(flags, configPath) {
1338
1228
  const where = fromCwd(debugRoot(config.root)) || ".";
1339
1229
  console.log(runs.length ? `Removed debug data for ${runs.length} run${runs.length === 1 ? "" : "s"} (${formatBytes(bytes)}) from ${where}` : `No debug data to remove in ${where}`);
1340
1230
  if (flags.images) {
1341
- const { pruneImages } = await import("./src-CDiGyoDt.js");
1342
- const { requireDocker } = await import("./providers-B2cSfewm.js");
1231
+ const { pruneImages } = await import("./src-DH0jhpoi.js");
1232
+ const { requireDocker } = await import("./providers-SBMExI53.js");
1343
1233
  await requireDocker();
1344
1234
  const removed = await pruneImages();
1345
1235
  console.log(removed ? `Removed ${removed} image${removed === 1 ? "" : "s"} reeval built that nothing uses` : "No leftover images to remove");
@@ -1357,7 +1247,7 @@ function verbosityOf(flags) {
1357
1247
  * does. Without a config, just reeval's image.
1358
1248
  */
1359
1249
  async function imageBuildCommand(flags, configPath, filters) {
1360
- const { buildImages, imagePlanLines, imageTargets } = await import("./images-B8Mp_VXZ.js");
1250
+ const { buildImages, imagePlanLines, imageTargets } = await import("./images-BpwFDT1E.js");
1361
1251
  const { docker } = await import("./sandbox.js");
1362
1252
  let root = process.cwd();
1363
1253
  const { fakeHarness } = await import("./harness.js");
@@ -1444,6 +1334,10 @@ async function runCommand(flags, configPath, filters) {
1444
1334
  const setup = await prepareRun(flags, configPath);
1445
1335
  const ctx = await startRun(setup);
1446
1336
  invocation.runId = ctx.runId;
1337
+ const githubOut = process.env.GITHUB_OUTPUT;
1338
+ if (githubOut) await appendFile(githubOut, `run-id=${ctx.runId}\n`).catch(() => {});
1339
+ const stepStart = process.env.GITHUB_STEP_SUMMARY;
1340
+ if (stepStart) await appendFile(stepStart, `run ${ctx.runId}\n`).catch(() => {});
1447
1341
  const { engineVersions } = await import("./node-Co7EXge0.js");
1448
1342
  const renderer = createRenderer({
1449
1343
  out: setup.json ? { write: () => true } : process.stdout,
@@ -1457,7 +1351,7 @@ async function runCommand(flags, configPath, filters) {
1457
1351
  executed = await executeRun(ctx, setup, filters, renderer);
1458
1352
  } catch (error) {
1459
1353
  renderer.close();
1460
- await rm(ctx.stagingDir, {
1354
+ if (setup.resume === void 0) await rm(ctx.stagingDir, {
1461
1355
  recursive: true,
1462
1356
  force: true
1463
1357
  });
@@ -1466,14 +1360,14 @@ async function runCommand(flags, configPath, filters) {
1466
1360
  const { engineRun, plan, sandboxVersions, budgetReached, live, notes, questions } = executed;
1467
1361
  invocation.unhandledErrors = engineRun.unhandledErrors;
1468
1362
  if ((interrupted || engineRun.cancelled) && plan?.sandboxes.some((s) => s.kind === "docker")) {
1469
- const { removeRunContainers } = await import("./docker-CiNVc7di.js");
1363
+ const { removeRunContainers } = await import("./docker-Dnya8eo9.js");
1470
1364
  await removeRunContainers(ctx.runId);
1471
1365
  }
1472
1366
  if (notes) {
1473
1367
  const cancelled = interrupted || engineRun.cancelled;
1474
1368
  const written = await notes.finish(cancelled);
1475
1369
  if (!cancelled && written.length) {
1476
- const { notesLine } = await import("./agent-DKuFnZPM.js");
1370
+ const { notesLine } = await import("./agent-Dhd5FJCZ.js");
1477
1371
  const text = notesLine(ctx.config.root, ctx.runId, written);
1478
1372
  renderer.onEvent({
1479
1373
  type: "notice",
@@ -1490,8 +1384,8 @@ async function runCommand(flags, configPath, filters) {
1490
1384
  }
1491
1385
  const stopped = interrupted || engineRun.cancelled;
1492
1386
  const answers = questions && !stopped ? await questions.settle() : void 0;
1493
- const { lockfiles } = await import("./state-BaHjYXr1.js");
1494
- const { writeScratchRun } = await import("./results-CrFs7_In.js");
1387
+ const { lockfiles } = await import("./state-DkqbCVVp.js");
1388
+ const { writeScratchRun } = await import("./results-owJR-NFm.js");
1495
1389
  const run = await writeScratchRun({
1496
1390
  ctx,
1497
1391
  author: ctx.author,
@@ -1509,12 +1403,14 @@ async function runCommand(flags, configPath, filters) {
1509
1403
  worktreePatch: ctx.worktreePatch,
1510
1404
  lockfiles: await lockfiles(ctx.config.root),
1511
1405
  git: ctx.git,
1406
+ previous: ctx.previous,
1407
+ previousArtifacts: ctx.previousArtifacts,
1512
1408
  runner: runnerInfo(),
1513
1409
  ...answers?.size ? { answers } : {}
1514
1410
  }, () => live?.stop());
1515
1411
  const { record } = run;
1516
1412
  if (notes && !stopped) {
1517
- const { summarizeRun } = await import("./agent-DKuFnZPM.js");
1413
+ const { summarizeRun } = await import("./agent-Dhd5FJCZ.js");
1518
1414
  const { resolveAnalysisModel } = await import("./model-BeoRxCcJ.js");
1519
1415
  const model = resolveAnalysisModel(ctx.config, "agent");
1520
1416
  const { level, text } = await summarizeRun(ctx.config, record.runId, model);
@@ -1542,7 +1438,7 @@ async function runCommand(flags, configPath, filters) {
1542
1438
  const { config } = ctx;
1543
1439
  const mode = setup.record;
1544
1440
  if ((flags.record || mode === "always" || mode === "ci" && inCI()) && record.status !== "interrupted") {
1545
- const { record: recordCmd } = await import("./commands-DE604ldB.js");
1441
+ const { record: recordCmd } = await import("./commands-DgOUkcSO.js");
1546
1442
  const allow = record.status === "budget" ? { "allow-incomplete": true } : {};
1547
1443
  console.log(await recordCmd(config, record.runId, {
1548
1444
  ...flags,
@@ -1580,7 +1476,7 @@ async function prepareRun(flags, configPath) {
1580
1476
  const sandboxes = [environmentSandbox(config.environment, config.sandbox), ...profile?.defaults.environment ? [environmentSandbox(profile.defaults.environment, config.sandbox)] : []];
1581
1477
  const concurrency = await resolveConcurrency(config, flags.concurrency, async () => {
1582
1478
  if (!sandboxes.some((s) => s.kind === "docker")) return hostCapacity();
1583
- const { dockerCapacity } = await import("./src-CDiGyoDt.js");
1479
+ const { dockerCapacity } = await import("./src-DH0jhpoi.js");
1584
1480
  return await dockerCapacity() ?? hostCapacity();
1585
1481
  });
1586
1482
  return {
@@ -1598,19 +1494,52 @@ async function prepareRun(flags, configPath) {
1598
1494
  verbosity: verbosityOf(flags),
1599
1495
  configFile: configPath && configLabel(configPath),
1600
1496
  /** Named in the plan line when the project root isn't the current directory. */
1601
- configElsewhere: !!configPath && dirname(configPath) !== process.cwd()
1497
+ configElsewhere: !!configPath && dirname(configPath) !== process.cwd(),
1498
+ /** `undefined` is a new run; `''` is newest resumable; a string is a run id or prefix. */
1499
+ resume: flags.resume
1602
1500
  };
1603
1501
  }
1604
1502
  /** The run's id and the state it starts from: commit, uncommitted changes, author. */
1605
- async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile }) {
1503
+ async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile, resume, dryRun }) {
1606
1504
  const startedAt = /* @__PURE__ */ new Date();
1607
1505
  const git = await gitInfo(config.root, [config.history.dir]);
1608
- const { worktreePatch } = await import("./state-BaHjYXr1.js");
1506
+ const { worktreePatch } = await import("./state-DkqbCVVp.js");
1609
1507
  const patch = git?.dirty ? await worktreePatch(config.root, [config.history.dir]) : null;
1610
1508
  const who = await author(config.root);
1611
- const { stagingDir, sweepStaging } = await import("./results-CrFs7_In.js");
1612
- const { scratchDir } = await import("./files-Cs8tbYQY.js");
1509
+ const { stagingDir, sweepStaging } = await import("./results-owJR-NFm.js");
1510
+ const { scratchDir } = await import("./files-DmZGPsWK.js");
1613
1511
  const scratch = scratchDir(config.root);
1512
+ if (resume !== void 0) {
1513
+ const target = await resolveResume(config.root, resume || void 0);
1514
+ if (!dryRun) await prepareResume(target, config.root);
1515
+ await sweepStaging(config.root, target.runId);
1516
+ const aside = dryRun ? {
1517
+ record: target.previous,
1518
+ artifacts: target.previousArtifacts
1519
+ } : await loadPrevious(stagingDir(config.root, target.runId));
1520
+ if (!dryRun) try {
1521
+ const { removeRunContainers } = await import("./docker-Dnya8eo9.js");
1522
+ await removeRunContainers(target.runId);
1523
+ } catch {}
1524
+ return {
1525
+ runId: target.runId,
1526
+ stagingDir: stagingDir(config.root, target.runId),
1527
+ config,
1528
+ runs,
1529
+ tags,
1530
+ concurrency,
1531
+ profile,
1532
+ verbosity,
1533
+ configFile,
1534
+ startedAt: target.startedAt,
1535
+ git,
1536
+ worktreePatch: patch,
1537
+ author: who,
1538
+ scratch,
1539
+ previous: aside.record ?? target.previous,
1540
+ previousArtifacts: aside.artifacts ?? target.previousArtifacts
1541
+ };
1542
+ }
1614
1543
  const stamps = new Set([scratch, config.history.dir].flatMap((dir) => existsSync(dir) ? readdirSync(dir).map((name) => name.slice(0, 16)) : []));
1615
1544
  let runId = newRunId(startedAt, git?.sha ?? null, who);
1616
1545
  for (let n = 1; stamps.has(runId.slice(0, 16)); n++) runId = newRunId(new Date(startedAt.getTime() + n * 1e3), git?.sha ?? null, who);
@@ -1629,7 +1558,9 @@ async function startRun({ config, profile, runs, tags, concurrency, verbosity, c
1629
1558
  git,
1630
1559
  worktreePatch: patch,
1631
1560
  author: who,
1632
- scratch
1561
+ scratch,
1562
+ previous: null,
1563
+ previousArtifacts: null
1633
1564
  };
1634
1565
  }
1635
1566
  function noMatch(config, filters, tags) {
@@ -1646,8 +1577,20 @@ function unmatchedFilter(config, parts) {
1646
1577
  */
1647
1578
  async function executeRun(ctx, setup, filters, renderer) {
1648
1579
  const { runId, stagingDir, config, runs, tags, concurrency, profile, verbosity, configFile } = ctx;
1580
+ const run = JSON.parse(JSON.stringify({
1581
+ runId,
1582
+ stagingDir,
1583
+ config,
1584
+ runs,
1585
+ tags,
1586
+ concurrency,
1587
+ profile,
1588
+ verbosity,
1589
+ configFile,
1590
+ completed: []
1591
+ }));
1649
1592
  const { runEngine } = await import("./node-Co7EXge0.js");
1650
- const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-CsPE24pp.js");
1593
+ const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-BqBadHYj.js");
1651
1594
  let plan;
1652
1595
  let sandboxVersions = { images: [] };
1653
1596
  let preflightStop;
@@ -1660,11 +1603,23 @@ async function executeRun(ctx, setup, filters, renderer) {
1660
1603
  const onPlan = async ({ planned, excluded, matched, unmatched }) => {
1661
1604
  if (unmatched.length) throw unmatchedFilter(config, unmatched);
1662
1605
  if (matched === 0) throw noMatch(config, filters, tags);
1663
- toRun = planned;
1664
- for (const p of planned) for (const name of p.attempt.secretVars) registerSecret(process.env[name]);
1665
- const models = planned.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-BeoRxCcJ.js") : void 0;
1606
+ const completed = completedKeysFor(planned, stagingDir, ctx.previous);
1607
+ const skipped = planned.map((p) => completed.has(p.key) ? {
1608
+ ...p,
1609
+ attempt: {
1610
+ ...p.attempt,
1611
+ skip: "already completed in this run",
1612
+ plan: {
1613
+ ...p.attempt.plan,
1614
+ skip: "already completed in this run"
1615
+ }
1616
+ }
1617
+ } : p);
1618
+ toRun = skipped;
1619
+ for (const p of skipped) for (const name of p.attempt.secretVars) registerSecret(process.env[name]);
1620
+ const models = skipped.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-BeoRxCcJ.js") : void 0;
1666
1621
  plan = await buildPlan({
1667
- planned,
1622
+ planned: skipped,
1668
1623
  profile,
1669
1624
  budget: setup.budget,
1670
1625
  concurrency,
@@ -1672,8 +1627,14 @@ async function executeRun(ctx, setup, filters, renderer) {
1672
1627
  historyDir: config.history.dir,
1673
1628
  questionModel: models?.questionModelLabel(config) ?? null
1674
1629
  });
1675
- const { imageStages, imageTargets } = await import("./images-B8Mp_VXZ.js");
1676
- const targets = imageTargets(planned.filter((p) => !p.attempt.plan.skip).map((p) => ({
1630
+ plan.runId = runId;
1631
+ if (completed.size) plan.resume = {
1632
+ runId,
1633
+ completed: completed.size
1634
+ };
1635
+ run.completed = [...completed];
1636
+ const { imageStages, imageTargets } = await import("./images-BpwFDT1E.js");
1637
+ const targets = imageTargets(skipped.filter((p) => !p.attempt.plan.skip).map((p) => ({
1677
1638
  id: p.id,
1678
1639
  harness: p.attempt.harness,
1679
1640
  sandbox: p.attempt.sandbox
@@ -1685,16 +1646,16 @@ async function executeRun(ctx, setup, filters, renderer) {
1685
1646
  evals: t.evals,
1686
1647
  stages: await imageStages(t, config.root)
1687
1648
  })));
1688
- const doc = planDocument(plan, planned, excluded, images);
1649
+ const doc = planDocument(plan, skipped, excluded, images);
1689
1650
  process.stdout.write(`${JSON.stringify(doc, null, 2)}\n`);
1690
1651
  return false;
1691
1652
  }
1692
- const lines = [planLine(plan, setup.configElsewhere ? configFile : void 0)];
1653
+ const lines = [planLine(plan, setup.configElsewhere ? configFile : void 0, runId)];
1693
1654
  if (setup.dryRun) {
1694
1655
  const todos = excluded.filter((e) => e.mode === "todo").map((e) => e.id);
1695
1656
  lines.push(...planTable(plan, todos));
1696
- const { imageStatusLines } = await import("./images-B8Mp_VXZ.js");
1697
- const { dockerAvailable } = await import("./src-CDiGyoDt.js");
1657
+ const { imageStatusLines } = await import("./images-BpwFDT1E.js");
1658
+ const { dockerAvailable } = await import("./src-DH0jhpoi.js");
1698
1659
  if (targets.length && await dockerAvailable()) lines.push(...await imageStatusLines(targets, config.root));
1699
1660
  else if (targets.length) lines.push("images not checked: Docker is not running");
1700
1661
  }
@@ -1737,13 +1698,13 @@ async function executeRun(ctx, setup, filters, renderer) {
1737
1698
  });
1738
1699
  if (malformed.length) throw new UsageError(`Credentials with whitespace or a line break in them: ${malformed.join(", ")}. A key copied from a wrapped terminal line picks these up; set it again as one line.`);
1739
1700
  if (analysis) {
1740
- const { startNotes } = await import("./agent-DKuFnZPM.js");
1701
+ const { startNotes } = await import("./agent-Dhd5FJCZ.js");
1741
1702
  notes = startNotes({
1742
1703
  config,
1743
1704
  model: analysis.resolveAnalysisModel(config, "agent"),
1744
1705
  runId,
1745
1706
  stagingDir,
1746
- planned,
1707
+ planned: skipped,
1747
1708
  warn: (text) => renderer.onEvent({
1748
1709
  type: "notice",
1749
1710
  at: Date.now(),
@@ -1770,8 +1731,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1770
1731
  }
1771
1732
  });
1772
1733
  }
1773
- const { prepareWorkspaces, workspaceKey } = await import("./workspace-U6M1gKzo.js");
1774
- const live = planned.filter((p) => !p.attempt.plan.skip);
1734
+ const { prepareWorkspaces, workspaceKey } = await import("./workspace-wudSz_W-.js");
1735
+ const live = skipped.filter((p) => !p.attempt.plan.skip);
1775
1736
  const outcomes = await prepareWorkspaces(live.flatMap(({ attempt: a }) => a.workspace ? [{
1776
1737
  workspace: a.workspace,
1777
1738
  environment: a.cell.environment
@@ -1816,7 +1777,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1816
1777
  });
1817
1778
  }
1818
1779
  try {
1819
- sandboxVersions = await preflight(planned.filter((p) => !p.attempt.plan.skip).map((p) => ({
1780
+ sandboxVersions = await preflight(skipped.filter((p) => !p.attempt.plan.skip).map((p) => ({
1820
1781
  harness: p.attempt.harness,
1821
1782
  sandbox: p.attempt.sandbox,
1822
1783
  setBy: p.attempt.setBy
@@ -1855,20 +1816,11 @@ async function executeRun(ctx, setup, filters, renderer) {
1855
1816
  let engineRun;
1856
1817
  try {
1857
1818
  engineRun = await runEngine({
1858
- run: JSON.parse(JSON.stringify({
1859
- runId,
1860
- stagingDir,
1861
- config,
1862
- runs,
1863
- tags,
1864
- concurrency,
1865
- profile,
1866
- verbosity,
1867
- configFile
1868
- })),
1819
+ run,
1869
1820
  filters,
1870
1821
  onPlan,
1871
1822
  onRunStart: (files) => {
1823
+ writeCurrent(setup.config.root, runId);
1872
1824
  live = writeLiveProgress({
1873
1825
  dir: stagingDir,
1874
1826
  runId,
@@ -1882,7 +1834,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1882
1834
  files,
1883
1835
  harness: (plan?.harnesses ?? config.harness.map(harnessId)).join(", "),
1884
1836
  sandbox: sandboxId(config.sandbox),
1885
- concurrency
1837
+ concurrency,
1838
+ runId
1886
1839
  });
1887
1840
  },
1888
1841
  onEvent: (e) => {
@@ -1926,9 +1879,9 @@ async function executeRun(ctx, setup, filters, renderer) {
1926
1879
  throw error;
1927
1880
  } finally {
1928
1881
  clearTimeout(budgetTimer);
1929
- const { removePrepared } = await import("./preflight-DKZjb7ZH.js");
1882
+ const { removePrepared } = await import("./preflight-CFtZNTLt.js");
1930
1883
  removePrepared(config.root, runId);
1931
- const { removePreparedWorkspaces } = await import("./workspace-U6M1gKzo.js");
1884
+ const { removePreparedWorkspaces } = await import("./workspace-wudSz_W-.js");
1932
1885
  removePreparedWorkspaces(config.root, runId);
1933
1886
  }
1934
1887
  if (preflightStop) throw preflightStop;
@@ -2011,4 +1964,4 @@ run(process.argv.slice(2)).finally(() => {
2011
1964
  //#endregion
2012
1965
  export {};
2013
1966
 
2014
- //# sourceMappingURL=cli-BIhzl_v_.js.map
1967
+ //# sourceMappingURL=cli-r9CDqoFL.js.map