reeval 0.6.1 → 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 (192) 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 +35 -311
  5. package/dist/{agent-BrqDHAx6.js → agent-Dhd5FJCZ.js} +4 -4
  6. package/dist/{agent-BrqDHAx6.js.map → agent-Dhd5FJCZ.js.map} +1 -1
  7. package/dist/{agent-bHgHIPVD.js → agent-gjBiZis8.js} +4 -4
  8. package/dist/{agent-bHgHIPVD.js.map → agent-gjBiZis8.js.map} +1 -1
  9. package/dist/assemble-D8sZ4Jiv.js +2 -0
  10. package/dist/{assemble-BB_dcnfh.js → assemble-Dd_mZYnu.js} +109 -7
  11. package/dist/assemble-Dd_mZYnu.js.map +1 -0
  12. package/dist/bridge/index.mjs +84 -9
  13. package/dist/bridge/package.json +3 -3
  14. package/dist/bridge/pnpm-lock.yaml +84 -89
  15. package/dist/bridge/pnpm-workspace.yaml +1 -1
  16. package/dist/{capture-tcMRp6ks.js → capture-CisAmy-G.js} +3 -3
  17. package/dist/{capture-tcMRp6ks.js.map → capture-CisAmy-G.js.map} +1 -1
  18. package/dist/capture-DquyqAHC.js +2 -0
  19. package/dist/{cli-BM-qbqO_.js → cli-r9CDqoFL.js} +139 -172
  20. package/dist/cli-r9CDqoFL.js.map +1 -0
  21. package/dist/{cli-spec-DUeyuSIQ.js → cli-spec-DOyxAMc2.js} +22 -9
  22. package/dist/cli-spec-DOyxAMc2.js.map +1 -0
  23. package/dist/cli.js +2 -2
  24. package/dist/{matchers-Bp-OH1vj.js → client-LsfDiD-X.js} +152 -76
  25. package/dist/client-LsfDiD-X.js.map +1 -0
  26. package/dist/{command-BT9i1I5S.js → command-Cej2t3y-.js} +9 -9
  27. package/dist/{command-BT9i1I5S.js.map → command-Cej2t3y-.js.map} +1 -1
  28. package/dist/command-Cxfgghqo.js +2 -0
  29. package/dist/{command-DITkSzxp.js → command-D6r2pwO5.js} +10 -10
  30. package/dist/{command-DITkSzxp.js.map → command-D6r2pwO5.js.map} +1 -1
  31. package/dist/{command-BpoZJVeI.js → command-DMR69l5G.js} +12 -12
  32. package/dist/{command-BpoZJVeI.js.map → command-DMR69l5G.js.map} +1 -1
  33. package/dist/{command-DATlIXj1.js → command-l4ZFCeMh.js} +6 -6
  34. package/dist/{command-DATlIXj1.js.map → command-l4ZFCeMh.js.map} +1 -1
  35. package/dist/{commands-C0SFWd1T.js → commands-BA_NCh2h.js} +6 -6
  36. package/dist/{commands-C0SFWd1T.js.map → commands-BA_NCh2h.js.map} +1 -1
  37. package/dist/{commands-CDty3r_G.js → commands-DgOUkcSO.js} +1 -1
  38. package/dist/{config-Cy_vLUbw.js → config-DuQDCx0B.js} +3 -3
  39. package/dist/{config-Cy_vLUbw.js.map → config-DuQDCx0B.js.map} +1 -1
  40. package/dist/{context-loi9OCZv.js → context-CvUv7DUb.js} +3 -4
  41. package/dist/{context-loi9OCZv.js.map → context-CvUv7DUb.js.map} +1 -1
  42. package/dist/{db-iskAs8Ox.js → db-CjX7JF4o.js} +13 -25
  43. package/dist/{db-iskAs8Ox.js.map → db-CjX7JF4o.js.map} +1 -1
  44. package/dist/db-o_osRkqr.js +3 -0
  45. package/dist/{dist-Dmm3bnKA.js → dist-CTzThfu_.js} +3 -3
  46. package/dist/{dist-Dmm3bnKA.js.map → dist-CTzThfu_.js.map} +1 -1
  47. package/dist/{docker-B9wx9-KX.js → docker-DaUaG4XZ.js} +4 -4
  48. package/dist/{docker-B9wx9-KX.js.map → docker-DaUaG4XZ.js.map} +1 -1
  49. package/dist/{docker-Di4o89kZ.js → docker-Dnya8eo9.js} +1 -1
  50. package/dist/{docker-Ctnty6xd.js → docker-ZaYeKE2w.js} +2 -2
  51. package/dist/{docker-Ctnty6xd.js.map → docker-ZaYeKE2w.js.map} +1 -1
  52. package/dist/{doctor-BMUVi-gC.js → doctor-Bk6aJeec.js} +10 -10
  53. package/dist/{doctor-BMUVi-gC.js.map → doctor-Bk6aJeec.js.map} +1 -1
  54. package/dist/{egress-3bdvDu1s.js → egress-BKbyriEa.js} +13 -13
  55. package/dist/{egress-3bdvDu1s.js.map → egress-BKbyriEa.js.map} +1 -1
  56. package/dist/{files-CITwkC4O.js → files-BSMSnQMa.js} +2 -2
  57. package/dist/{files-CITwkC4O.js.map → files-BSMSnQMa.js.map} +1 -1
  58. package/dist/files-DmZGPsWK.js +2 -0
  59. package/dist/{files-DGhQZaXT.js → files-TNrZJQ3Y.js} +15 -4
  60. package/dist/{files-DGhQZaXT.js.map → files-TNrZJQ3Y.js.map} +1 -1
  61. package/dist/files-Tb8wY0Ze.js +2 -0
  62. package/dist/{git-BzyBakoB.js → git-DNGtrOg9.js} +2 -2
  63. package/dist/{git-BzyBakoB.js.map → git-DNGtrOg9.js.map} +1 -1
  64. package/dist/{harness-8-dnGNgT.js → harness-CDRaaGvR.js} +2 -2
  65. package/dist/{harness-8-dnGNgT.js.map → harness-CDRaaGvR.js.map} +1 -1
  66. package/dist/harness.d.ts +1 -1
  67. package/dist/harness.js +1 -1
  68. package/dist/{header-IE-uIvX0.js → header-BZF8Xss1.js} +2 -2
  69. package/dist/{header-IE-uIvX0.js.map → header-BZF8Xss1.js.map} +1 -1
  70. package/dist/{images-QBtOj-_q.js → images-BpwFDT1E.js} +6 -6
  71. package/dist/{images-QBtOj-_q.js.map → images-BpwFDT1E.js.map} +1 -1
  72. package/dist/index.d.ts +12 -7
  73. package/dist/index.js +31 -24
  74. package/dist/index.js.map +1 -1
  75. package/dist/init-1THeGfut.js +2 -0
  76. package/dist/{init-B47uIoHu.js → init-CBWt1rZT.js} +4 -4
  77. package/dist/{init-B47uIoHu.js.map → init-CBWt1rZT.js.map} +1 -1
  78. package/dist/{invocations-DHC946b-.js → invocations-DArYWyXN.js} +2 -2
  79. package/dist/{invocations-DHC946b-.js.map → invocations-DArYWyXN.js.map} +1 -1
  80. package/dist/judge.d.ts +1 -1
  81. package/dist/model-D_pF3Vcl.js +2 -0
  82. package/dist/{model-CtrJdFi6.js → model-DyQbu7KF.js} +113 -3
  83. package/dist/model-DyQbu7KF.js.map +1 -0
  84. package/dist/{opencode-providers-DJVocFOU.js → opencode-providers-ByD85Q0l.js} +33 -19
  85. package/dist/opencode-providers-ByD85Q0l.js.map +1 -0
  86. package/dist/{options-DVB78W8X.js → options-Ge_x32XE.js} +3 -3
  87. package/dist/{options-DVB78W8X.js.map → options-Ge_x32XE.js.map} +1 -1
  88. package/dist/{plan-Bsge1_cc.js → plan-BqBadHYj.js} +14 -7
  89. package/dist/plan-BqBadHYj.js.map +1 -0
  90. package/dist/{preflight-B5ue4TlX.js → preflight-CFtZNTLt.js} +1 -1
  91. package/dist/{preflight-BOstyJDX.js → preflight-CyaAZE9r.js} +3 -3
  92. package/dist/{preflight-BOstyJDX.js.map → preflight-CyaAZE9r.js.map} +1 -1
  93. package/dist/{prepare-ChIEi8hP.js → prepare-Dl7-t3fO.js} +2 -2
  94. package/dist/{prepare-jpXfdH-9.js → prepare-Zr1xOMUX.js} +4 -4
  95. package/dist/{prepare-jpXfdH-9.js.map → prepare-Zr1xOMUX.js.map} +1 -1
  96. package/dist/{provenance-BTJCjEPg.js → provenance-Byl2T6LJ.js} +2 -2
  97. package/dist/{provenance-BTJCjEPg.js.map → provenance-Byl2T6LJ.js.map} +1 -1
  98. package/dist/{providers-BJCxWIm4.js → providers-Cflw7Ks-.js} +3 -3
  99. package/dist/{providers-BJCxWIm4.js.map → providers-Cflw7Ks-.js.map} +1 -1
  100. package/dist/{providers-DxVIaae1.js → providers-SBMExI53.js} +1 -1
  101. package/dist/query-CvutWHaL.js +2 -0
  102. package/dist/{query-Cpe659ni.js → query-DUSLlic0.js} +2 -2
  103. package/dist/{query-Cpe659ni.js.map → query-DUSLlic0.js.map} +1 -1
  104. package/dist/results-owJR-NFm.js +52 -0
  105. package/dist/results-owJR-NFm.js.map +1 -0
  106. package/dist/resume-BL4Yw7Ld.js +406 -0
  107. package/dist/resume-BL4Yw7Ld.js.map +1 -0
  108. package/dist/sandbox.d.ts +1 -1
  109. package/dist/server-CNPsB0cT.js +2 -0
  110. package/dist/{server-CSSXF89R.js → server-yFVUxAm0.js} +6 -6
  111. package/dist/{server-CSSXF89R.js.map → server-yFVUxAm0.js.map} +1 -1
  112. package/dist/source-Cmc5SKFn.js +2 -0
  113. package/dist/{source-BcHShRWU.js → source-M3gS517R.js} +2 -2
  114. package/dist/{source-BcHShRWU.js.map → source-M3gS517R.js.map} +1 -1
  115. package/dist/src--L8B4WGa.js +3 -0
  116. package/dist/{src-BRdoxjJS.js → src-79JhW-zG.js} +15 -15
  117. package/dist/{src-BRdoxjJS.js.map → src-79JhW-zG.js.map} +1 -1
  118. package/dist/src-BLN459er.js +3 -0
  119. package/dist/src-Bz66jDtE.js +3 -0
  120. package/dist/src-CfUwg9UY.js +3 -0
  121. package/dist/{src-B3J1D0nL.js → src-CokPbYCb.js} +76 -60
  122. package/dist/src-CokPbYCb.js.map +1 -0
  123. package/dist/{src-a6y9cGkR.js → src-DH0jhpoi.js} +1 -1
  124. package/dist/{src-DyQJdvp2.js → src-DSE0FWaU.js} +5 -5
  125. package/dist/{src-DyQJdvp2.js.map → src-DSE0FWaU.js.map} +1 -1
  126. package/dist/{src-Czhg5ONv.js → src-DTcalvuF.js} +3 -3
  127. package/dist/{src-Czhg5ONv.js.map → src-DTcalvuF.js.map} +1 -1
  128. package/dist/src-DV_3QDHA.js +4 -0
  129. package/dist/{src-BjVw2K4H.js → src-DxFJrMUA.js} +4 -4
  130. package/dist/{src-BjVw2K4H.js.map → src-DxFJrMUA.js.map} +1 -1
  131. package/dist/{src-Dk96a9w7.js → src-IOr1rhEg.js} +6 -6
  132. package/dist/{src-Dk96a9w7.js.map → src-IOr1rhEg.js.map} +1 -1
  133. package/dist/src-Ljh2vKXm.js +3 -0
  134. package/dist/{src-CdwJuMBO.js → src-s-VffoYK.js} +2 -2
  135. package/dist/{src-CdwJuMBO.js.map → src-s-VffoYK.js.map} +1 -1
  136. package/dist/{state-evRYxV_q.js → state-DEj_utaE.js} +15 -15
  137. package/dist/{state-evRYxV_q.js.map → state-DEj_utaE.js.map} +1 -1
  138. package/dist/state-DkqbCVVp.js +2 -0
  139. package/dist/studio-app/assets/{index-WQPq5K3E.js → index-Bbl0oTxu.js} +1 -1
  140. package/dist/studio-app/index.html +1 -1
  141. package/dist/{summary-DTUCNA-v.js → summary--FBuB_sr.js} +3 -3
  142. package/dist/{summary-DTUCNA-v.js.map → summary--FBuB_sr.js.map} +1 -1
  143. package/dist/{summary-CIw18kb-.js → summary-D012KlUM.js} +5 -5
  144. package/dist/{summary-CIw18kb-.js.map → summary-D012KlUM.js.map} +1 -1
  145. package/dist/tool-target-BU1JnSE9.js +34 -0
  146. package/dist/tool-target-BU1JnSE9.js.map +1 -0
  147. package/dist/{tools-By2WuNxm.js → tools-CJHw-zCo.js} +3 -3
  148. package/dist/{tools-By2WuNxm.js.map → tools-CJHw-zCo.js.map} +1 -1
  149. package/dist/{types-C2Gl05_c.d.ts → types-BsRSknLe.d.ts} +6 -5
  150. package/dist/view/index.d.ts +1 -1
  151. package/dist/view/index.js +2 -2
  152. package/dist/{views-BJ0i1Iuw.js → views-jhL9Jb8A.js} +4 -4
  153. package/dist/{views-BJ0i1Iuw.js.map → views-jhL9Jb8A.js.map} +1 -1
  154. package/dist/views-yPmmoo8f.js +3 -0
  155. package/dist/{worker-entry-mCctDzig.js → worker-entry-OwnsrUdr.js} +72 -2
  156. package/dist/worker-entry-OwnsrUdr.js.map +1 -0
  157. package/dist/{workspace-Bl1SiRQa.js → workspace-C4_J0pqb.js} +3 -3
  158. package/dist/{workspace-Bl1SiRQa.js.map → workspace-C4_J0pqb.js.map} +1 -1
  159. package/dist/{workspace-CvAPfa8b.js → workspace-wudSz_W-.js} +1 -1
  160. package/package.json +11 -10
  161. package/dist/assemble-BB_dcnfh.js.map +0 -1
  162. package/dist/assemble-DcLLkwnB.js +0 -2
  163. package/dist/capture-EvOaSXj_.js +0 -2
  164. package/dist/cli-BM-qbqO_.js.map +0 -1
  165. package/dist/cli-spec-DUeyuSIQ.js.map +0 -1
  166. package/dist/command-Bn_kbh3B.js +0 -2
  167. package/dist/db-4nMvBFNX.js +0 -2
  168. package/dist/files-C_CsTMtM.js +0 -2
  169. package/dist/files-vgLA9tcj.js +0 -2
  170. package/dist/init-DIAJuCs2.js +0 -2
  171. package/dist/matchers-Bp-OH1vj.js.map +0 -1
  172. package/dist/model-C_B5JrhL.js +0 -2
  173. package/dist/model-CtrJdFi6.js.map +0 -1
  174. package/dist/opencode-providers-DJVocFOU.js.map +0 -1
  175. package/dist/plan-Bsge1_cc.js.map +0 -1
  176. package/dist/query-BtLxk32J.js +0 -2
  177. package/dist/results-CiJzkjNI.js +0 -37
  178. package/dist/results-CiJzkjNI.js.map +0 -1
  179. package/dist/server-CN3lGbK-.js +0 -2
  180. package/dist/source-CxLRUqU2.js +0 -2
  181. package/dist/src-B3J1D0nL.js.map +0 -1
  182. package/dist/src-Ba3zMSdv.js +0 -3
  183. package/dist/src-BpVFmHqj.js +0 -3
  184. package/dist/src-CJONyPRm.js +0 -3
  185. package/dist/src-CLO4dUg7.js +0 -3
  186. package/dist/src-DQCjANtm.js +0 -3
  187. package/dist/src-yCDQ7kpQ.js +0 -4
  188. package/dist/state-CeYoWFWx.js +0 -2
  189. package/dist/stats-BNAHlNMD.js +0 -114
  190. package/dist/stats-BNAHlNMD.js.map +0 -1
  191. package/dist/views-BEurSpHC.js +0 -3
  192. 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-BRdoxjJS.js";
9
- import { d as sandboxId, s as harnessId } from "./options-DVB78W8X.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-Cy_vLUbw.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-DTUCNA-v.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-BTJCjEPg.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-BOstyJDX.js";
21
- import { r as imageHarness } from "./prepare-jpXfdH-9.js";
22
- import { n as createProviders } from "./providers-BJCxWIm4.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,104 +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
- /**
137
- * Renames `from` over `to`. Windows refuses while a reader (`reeval studio`) has `to` open, for a
138
- * moment: try again briefly rather than drop the update.
139
- */
140
- function replace(from, to, rename = renameSync) {
141
- for (let attempt = 1;; attempt++) try {
142
- rename(from, to);
143
- return;
144
- } catch (error) {
145
- const code = error.code;
146
- if (attempt >= 20 || !(code === "EPERM" || code === "EACCES" || code === "EBUSY")) throw error;
147
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, attempt);
148
- }
149
- }
150
- /** Writes the file at once, then on every change and heartbeat. Write errors never fail the run. */
151
- function writeLiveProgress(options) {
152
- const now = options.now ?? (() => /* @__PURE__ */ new Date());
153
- const file = join(options.dir, LIVE_FILE);
154
- const tmp = `${file}.${process.pid}.tmp`;
155
- const attempts = new Map(options.planned.map((p) => [p.key, {
156
- key: p.key,
157
- evalId: p.id,
158
- name: p.attempt.name,
159
- file: p.file,
160
- cell: p.attempt.cell.key,
161
- n: p.attempt.n,
162
- status: p.attempt.plan.skip ? "skipped" : "queued",
163
- startedAt: null,
164
- durationMs: null
165
- }]));
166
- let phase = "running";
167
- let stopped = false;
168
- const read = () => {
169
- const list = [...attempts.values()];
170
- return {
171
- schemaVersion: 1,
172
- runId: options.runId,
173
- startedAt: options.startedAt.toISOString(),
174
- pid: process.pid,
175
- host: hostname(),
176
- heartbeatAt: now().toISOString(),
177
- phase,
178
- planned: list.length,
179
- counts: liveCounts(list),
180
- attempts: list
181
- };
182
- };
183
- const write = () => {
184
- if (stopped) return;
185
- try {
186
- writeFileSync(tmp, JSON.stringify(read()));
187
- replace(tmp, file);
188
- } catch {}
189
- };
190
- try {
191
- mkdirSync(options.dir, { recursive: true });
192
- } catch {}
193
- write();
194
- const heartbeat = setInterval(write, options.heartbeatMs ?? 2e3);
195
- heartbeat.unref();
196
- const stop = () => {
197
- stopped = true;
198
- clearInterval(heartbeat);
199
- };
200
- return {
201
- start(key, at) {
202
- const a = attempts.get(key);
203
- if (!a) return;
204
- a.status = "running";
205
- a.startedAt = new Date(at).toISOString();
206
- write();
207
- },
208
- end(result) {
209
- const a = attempts.get(result.key);
210
- if (!a) return;
211
- a.status = finished(result);
212
- a.durationMs = result.durationMs;
213
- write();
214
- },
215
- phase(next) {
216
- phase = next;
217
- write();
218
- },
219
- stop,
220
- remove() {
221
- stop();
222
- rmSync(file, { force: true });
223
- rmSync(tmp, { force: true });
224
- },
225
- read
226
- };
227
- }
228
132
  //#endregion
229
133
  //#region src/preflight.ts
230
134
  /** How the terminal names a sandbox to prepare: its cell id, `+ install`, and a harness other than Cursor. */
@@ -779,7 +683,7 @@ var AgentRenderer = class {
779
683
  for (const w of e.sandboxWarnings ?? []) this.#write(sandboxWarningLine(w));
780
684
  return;
781
685
  case "run-start":
782
- 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"}`);
783
687
  return;
784
688
  case "collected":
785
689
  this.#tags.addFile(e.evals);
@@ -932,7 +836,7 @@ var PlainRenderer = class {
932
836
  const files = `${e.files} eval file${e.files === 1 ? "" : "s"}`;
933
837
  const order = `${this.#o.output.logOrder} logs`;
934
838
  const setup = `harness ${e.harness} · sandbox ${e.sandbox} · concurrency ${e.concurrency}`;
935
- this.#write(c.dim(`reeval ${e.version} · ${files} · ${setup} · ${order}`));
839
+ this.#write(c.dim(`reeval ${e.version} · run ${e.runId} · ${files} · ${setup} · ${order}`));
936
840
  return;
937
841
  }
938
842
  case "plan":
@@ -1212,7 +1116,7 @@ async function run(argv) {
1212
1116
  return values.help ? EXIT.ok : EXIT.usage;
1213
1117
  }
1214
1118
  if (command === "init") {
1215
- const { initCommand } = await import("./init-DIAJuCs2.js");
1119
+ const { initCommand } = await import("./init-1THeGfut.js");
1216
1120
  return initCommand(values, filters, {
1217
1121
  out: (s) => console.log(s),
1218
1122
  input: process.stdin,
@@ -1221,7 +1125,7 @@ async function run(argv) {
1221
1125
  });
1222
1126
  }
1223
1127
  if (command === "doctor") {
1224
- const { doctorCommand } = await import("./doctor-BMUVi-gC.js");
1128
+ const { doctorCommand } = await import("./doctor-Bk6aJeec.js");
1225
1129
  return doctorCommand(values, {
1226
1130
  out: (s) => console.log(s),
1227
1131
  color: !!process.stdout.isTTY && !process.env.NO_COLOR,
@@ -1229,7 +1133,7 @@ async function run(argv) {
1229
1133
  });
1230
1134
  }
1231
1135
  if (command === "report") {
1232
- const { reportCommand } = await import("./command-BT9i1I5S.js");
1136
+ const { reportCommand } = await import("./command-Cej2t3y-.js");
1233
1137
  return reportCommand(values, filters, {
1234
1138
  out: (s) => console.log(s),
1235
1139
  err: (s) => console.error(dim(s)),
@@ -1244,7 +1148,7 @@ async function run(argv) {
1244
1148
  }
1245
1149
  if (command === "studio") {
1246
1150
  const config = await loadConfig(configPath, "studio");
1247
- const { studioCommand } = await import("./command-DATlIXj1.js");
1151
+ const { studioCommand } = await import("./command-l4ZFCeMh.js");
1248
1152
  return studioCommand({
1249
1153
  config,
1250
1154
  flags: values,
@@ -1255,7 +1159,7 @@ async function run(argv) {
1255
1159
  if (command === "mcp") {
1256
1160
  if (!values.http) console.log = console.info = console.debug = console.error;
1257
1161
  const config = await loadConfig(configPath, "mcp");
1258
- const { mcpCommand } = await import("./command-BpoZJVeI.js");
1162
+ const { mcpCommand } = await import("./command-DMR69l5G.js");
1259
1163
  return mcpCommand({
1260
1164
  config,
1261
1165
  flags: values,
@@ -1264,7 +1168,7 @@ async function run(argv) {
1264
1168
  }
1265
1169
  if (command in HISTORY_COMMANDS) {
1266
1170
  const config = await loadConfig(configPath, command);
1267
- const commands = await import("./commands-CDty3r_G.js");
1171
+ const commands = await import("./commands-DgOUkcSO.js");
1268
1172
  const ctx = {
1269
1173
  config,
1270
1174
  flags: values,
@@ -1277,7 +1181,7 @@ async function run(argv) {
1277
1181
  case "compare": return commands.compareCommand(ctx, filters);
1278
1182
  case "checkout": return commands.checkoutCommand(ctx, filters);
1279
1183
  case "query": {
1280
- const { queryCommand } = await import("./query-BtLxk32J.js");
1184
+ const { queryCommand } = await import("./query-CvutWHaL.js");
1281
1185
  return queryCommand({
1282
1186
  ...ctx,
1283
1187
  err: (s) => console.error(dim(s))
@@ -1285,7 +1189,7 @@ async function run(argv) {
1285
1189
  }
1286
1190
  case "analyze": {
1287
1191
  loadEnvFiles(configPath);
1288
- const { analyzeCommand } = await import("./command-Bn_kbh3B.js");
1192
+ const { analyzeCommand } = await import("./command-Cxfgghqo.js");
1289
1193
  return analyzeCommand({
1290
1194
  ...ctx,
1291
1195
  err: (s) => console.error(dim(s))
@@ -1324,8 +1228,8 @@ async function cleanCommand(flags, configPath) {
1324
1228
  const where = fromCwd(debugRoot(config.root)) || ".";
1325
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}`);
1326
1230
  if (flags.images) {
1327
- const { pruneImages } = await import("./src-a6y9cGkR.js");
1328
- const { requireDocker } = await import("./providers-DxVIaae1.js");
1231
+ const { pruneImages } = await import("./src-DH0jhpoi.js");
1232
+ const { requireDocker } = await import("./providers-SBMExI53.js");
1329
1233
  await requireDocker();
1330
1234
  const removed = await pruneImages();
1331
1235
  console.log(removed ? `Removed ${removed} image${removed === 1 ? "" : "s"} reeval built that nothing uses` : "No leftover images to remove");
@@ -1343,7 +1247,7 @@ function verbosityOf(flags) {
1343
1247
  * does. Without a config, just reeval's image.
1344
1248
  */
1345
1249
  async function imageBuildCommand(flags, configPath, filters) {
1346
- const { buildImages, imagePlanLines, imageTargets } = await import("./images-QBtOj-_q.js");
1250
+ const { buildImages, imagePlanLines, imageTargets } = await import("./images-BpwFDT1E.js");
1347
1251
  const { docker } = await import("./sandbox.js");
1348
1252
  let root = process.cwd();
1349
1253
  const { fakeHarness } = await import("./harness.js");
@@ -1430,6 +1334,10 @@ async function runCommand(flags, configPath, filters) {
1430
1334
  const setup = await prepareRun(flags, configPath);
1431
1335
  const ctx = await startRun(setup);
1432
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(() => {});
1433
1341
  const { engineVersions } = await import("./node-Co7EXge0.js");
1434
1342
  const renderer = createRenderer({
1435
1343
  out: setup.json ? { write: () => true } : process.stdout,
@@ -1443,7 +1351,7 @@ async function runCommand(flags, configPath, filters) {
1443
1351
  executed = await executeRun(ctx, setup, filters, renderer);
1444
1352
  } catch (error) {
1445
1353
  renderer.close();
1446
- await rm(ctx.stagingDir, {
1354
+ if (setup.resume === void 0) await rm(ctx.stagingDir, {
1447
1355
  recursive: true,
1448
1356
  force: true
1449
1357
  });
@@ -1452,14 +1360,14 @@ async function runCommand(flags, configPath, filters) {
1452
1360
  const { engineRun, plan, sandboxVersions, budgetReached, live, notes, questions } = executed;
1453
1361
  invocation.unhandledErrors = engineRun.unhandledErrors;
1454
1362
  if ((interrupted || engineRun.cancelled) && plan?.sandboxes.some((s) => s.kind === "docker")) {
1455
- const { removeRunContainers } = await import("./docker-Di4o89kZ.js");
1363
+ const { removeRunContainers } = await import("./docker-Dnya8eo9.js");
1456
1364
  await removeRunContainers(ctx.runId);
1457
1365
  }
1458
1366
  if (notes) {
1459
1367
  const cancelled = interrupted || engineRun.cancelled;
1460
1368
  const written = await notes.finish(cancelled);
1461
1369
  if (!cancelled && written.length) {
1462
- const { notesLine } = await import("./agent-BrqDHAx6.js");
1370
+ const { notesLine } = await import("./agent-Dhd5FJCZ.js");
1463
1371
  const text = notesLine(ctx.config.root, ctx.runId, written);
1464
1372
  renderer.onEvent({
1465
1373
  type: "notice",
@@ -1476,8 +1384,8 @@ async function runCommand(flags, configPath, filters) {
1476
1384
  }
1477
1385
  const stopped = interrupted || engineRun.cancelled;
1478
1386
  const answers = questions && !stopped ? await questions.settle() : void 0;
1479
- const { lockfiles } = await import("./state-CeYoWFWx.js");
1480
- const { writeScratchRun } = await import("./results-CiJzkjNI.js");
1387
+ const { lockfiles } = await import("./state-DkqbCVVp.js");
1388
+ const { writeScratchRun } = await import("./results-owJR-NFm.js");
1481
1389
  const run = await writeScratchRun({
1482
1390
  ctx,
1483
1391
  author: ctx.author,
@@ -1495,12 +1403,14 @@ async function runCommand(flags, configPath, filters) {
1495
1403
  worktreePatch: ctx.worktreePatch,
1496
1404
  lockfiles: await lockfiles(ctx.config.root),
1497
1405
  git: ctx.git,
1406
+ previous: ctx.previous,
1407
+ previousArtifacts: ctx.previousArtifacts,
1498
1408
  runner: runnerInfo(),
1499
1409
  ...answers?.size ? { answers } : {}
1500
1410
  }, () => live?.stop());
1501
1411
  const { record } = run;
1502
1412
  if (notes && !stopped) {
1503
- const { summarizeRun } = await import("./agent-BrqDHAx6.js");
1413
+ const { summarizeRun } = await import("./agent-Dhd5FJCZ.js");
1504
1414
  const { resolveAnalysisModel } = await import("./model-BeoRxCcJ.js");
1505
1415
  const model = resolveAnalysisModel(ctx.config, "agent");
1506
1416
  const { level, text } = await summarizeRun(ctx.config, record.runId, model);
@@ -1528,7 +1438,7 @@ async function runCommand(flags, configPath, filters) {
1528
1438
  const { config } = ctx;
1529
1439
  const mode = setup.record;
1530
1440
  if ((flags.record || mode === "always" || mode === "ci" && inCI()) && record.status !== "interrupted") {
1531
- const { record: recordCmd } = await import("./commands-CDty3r_G.js");
1441
+ const { record: recordCmd } = await import("./commands-DgOUkcSO.js");
1532
1442
  const allow = record.status === "budget" ? { "allow-incomplete": true } : {};
1533
1443
  console.log(await recordCmd(config, record.runId, {
1534
1444
  ...flags,
@@ -1566,7 +1476,7 @@ async function prepareRun(flags, configPath) {
1566
1476
  const sandboxes = [environmentSandbox(config.environment, config.sandbox), ...profile?.defaults.environment ? [environmentSandbox(profile.defaults.environment, config.sandbox)] : []];
1567
1477
  const concurrency = await resolveConcurrency(config, flags.concurrency, async () => {
1568
1478
  if (!sandboxes.some((s) => s.kind === "docker")) return hostCapacity();
1569
- const { dockerCapacity } = await import("./src-a6y9cGkR.js");
1479
+ const { dockerCapacity } = await import("./src-DH0jhpoi.js");
1570
1480
  return await dockerCapacity() ?? hostCapacity();
1571
1481
  });
1572
1482
  return {
@@ -1584,19 +1494,52 @@ async function prepareRun(flags, configPath) {
1584
1494
  verbosity: verbosityOf(flags),
1585
1495
  configFile: configPath && configLabel(configPath),
1586
1496
  /** Named in the plan line when the project root isn't the current directory. */
1587
- 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
1588
1500
  };
1589
1501
  }
1590
1502
  /** The run's id and the state it starts from: commit, uncommitted changes, author. */
1591
- async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile }) {
1503
+ async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile, resume, dryRun }) {
1592
1504
  const startedAt = /* @__PURE__ */ new Date();
1593
1505
  const git = await gitInfo(config.root, [config.history.dir]);
1594
- const { worktreePatch } = await import("./state-CeYoWFWx.js");
1506
+ const { worktreePatch } = await import("./state-DkqbCVVp.js");
1595
1507
  const patch = git?.dirty ? await worktreePatch(config.root, [config.history.dir]) : null;
1596
1508
  const who = await author(config.root);
1597
- const { stagingDir, sweepStaging } = await import("./results-CiJzkjNI.js");
1598
- const { scratchDir } = await import("./files-C_CsTMtM.js");
1509
+ const { stagingDir, sweepStaging } = await import("./results-owJR-NFm.js");
1510
+ const { scratchDir } = await import("./files-DmZGPsWK.js");
1599
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
+ }
1600
1543
  const stamps = new Set([scratch, config.history.dir].flatMap((dir) => existsSync(dir) ? readdirSync(dir).map((name) => name.slice(0, 16)) : []));
1601
1544
  let runId = newRunId(startedAt, git?.sha ?? null, who);
1602
1545
  for (let n = 1; stamps.has(runId.slice(0, 16)); n++) runId = newRunId(new Date(startedAt.getTime() + n * 1e3), git?.sha ?? null, who);
@@ -1615,7 +1558,9 @@ async function startRun({ config, profile, runs, tags, concurrency, verbosity, c
1615
1558
  git,
1616
1559
  worktreePatch: patch,
1617
1560
  author: who,
1618
- scratch
1561
+ scratch,
1562
+ previous: null,
1563
+ previousArtifacts: null
1619
1564
  };
1620
1565
  }
1621
1566
  function noMatch(config, filters, tags) {
@@ -1632,8 +1577,20 @@ function unmatchedFilter(config, parts) {
1632
1577
  */
1633
1578
  async function executeRun(ctx, setup, filters, renderer) {
1634
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
+ }));
1635
1592
  const { runEngine } = await import("./node-Co7EXge0.js");
1636
- const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-Bsge1_cc.js");
1593
+ const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-BqBadHYj.js");
1637
1594
  let plan;
1638
1595
  let sandboxVersions = { images: [] };
1639
1596
  let preflightStop;
@@ -1646,11 +1603,23 @@ async function executeRun(ctx, setup, filters, renderer) {
1646
1603
  const onPlan = async ({ planned, excluded, matched, unmatched }) => {
1647
1604
  if (unmatched.length) throw unmatchedFilter(config, unmatched);
1648
1605
  if (matched === 0) throw noMatch(config, filters, tags);
1649
- toRun = planned;
1650
- for (const p of planned) for (const name of p.attempt.secretVars) registerSecret(process.env[name]);
1651
- 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;
1652
1621
  plan = await buildPlan({
1653
- planned,
1622
+ planned: skipped,
1654
1623
  profile,
1655
1624
  budget: setup.budget,
1656
1625
  concurrency,
@@ -1658,8 +1627,14 @@ async function executeRun(ctx, setup, filters, renderer) {
1658
1627
  historyDir: config.history.dir,
1659
1628
  questionModel: models?.questionModelLabel(config) ?? null
1660
1629
  });
1661
- const { imageStages, imageTargets } = await import("./images-QBtOj-_q.js");
1662
- 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) => ({
1663
1638
  id: p.id,
1664
1639
  harness: p.attempt.harness,
1665
1640
  sandbox: p.attempt.sandbox
@@ -1671,16 +1646,16 @@ async function executeRun(ctx, setup, filters, renderer) {
1671
1646
  evals: t.evals,
1672
1647
  stages: await imageStages(t, config.root)
1673
1648
  })));
1674
- const doc = planDocument(plan, planned, excluded, images);
1649
+ const doc = planDocument(plan, skipped, excluded, images);
1675
1650
  process.stdout.write(`${JSON.stringify(doc, null, 2)}\n`);
1676
1651
  return false;
1677
1652
  }
1678
- const lines = [planLine(plan, setup.configElsewhere ? configFile : void 0)];
1653
+ const lines = [planLine(plan, setup.configElsewhere ? configFile : void 0, runId)];
1679
1654
  if (setup.dryRun) {
1680
1655
  const todos = excluded.filter((e) => e.mode === "todo").map((e) => e.id);
1681
1656
  lines.push(...planTable(plan, todos));
1682
- const { imageStatusLines } = await import("./images-QBtOj-_q.js");
1683
- const { dockerAvailable } = await import("./src-a6y9cGkR.js");
1657
+ const { imageStatusLines } = await import("./images-BpwFDT1E.js");
1658
+ const { dockerAvailable } = await import("./src-DH0jhpoi.js");
1684
1659
  if (targets.length && await dockerAvailable()) lines.push(...await imageStatusLines(targets, config.root));
1685
1660
  else if (targets.length) lines.push("images not checked: Docker is not running");
1686
1661
  }
@@ -1723,13 +1698,13 @@ async function executeRun(ctx, setup, filters, renderer) {
1723
1698
  });
1724
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.`);
1725
1700
  if (analysis) {
1726
- const { startNotes } = await import("./agent-BrqDHAx6.js");
1701
+ const { startNotes } = await import("./agent-Dhd5FJCZ.js");
1727
1702
  notes = startNotes({
1728
1703
  config,
1729
1704
  model: analysis.resolveAnalysisModel(config, "agent"),
1730
1705
  runId,
1731
1706
  stagingDir,
1732
- planned,
1707
+ planned: skipped,
1733
1708
  warn: (text) => renderer.onEvent({
1734
1709
  type: "notice",
1735
1710
  at: Date.now(),
@@ -1756,8 +1731,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1756
1731
  }
1757
1732
  });
1758
1733
  }
1759
- const { prepareWorkspaces, workspaceKey } = await import("./workspace-CvAPfa8b.js");
1760
- 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);
1761
1736
  const outcomes = await prepareWorkspaces(live.flatMap(({ attempt: a }) => a.workspace ? [{
1762
1737
  workspace: a.workspace,
1763
1738
  environment: a.cell.environment
@@ -1802,7 +1777,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1802
1777
  });
1803
1778
  }
1804
1779
  try {
1805
- 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) => ({
1806
1781
  harness: p.attempt.harness,
1807
1782
  sandbox: p.attempt.sandbox,
1808
1783
  setBy: p.attempt.setBy
@@ -1841,20 +1816,11 @@ async function executeRun(ctx, setup, filters, renderer) {
1841
1816
  let engineRun;
1842
1817
  try {
1843
1818
  engineRun = await runEngine({
1844
- run: JSON.parse(JSON.stringify({
1845
- runId,
1846
- stagingDir,
1847
- config,
1848
- runs,
1849
- tags,
1850
- concurrency,
1851
- profile,
1852
- verbosity,
1853
- configFile
1854
- })),
1819
+ run,
1855
1820
  filters,
1856
1821
  onPlan,
1857
1822
  onRunStart: (files) => {
1823
+ writeCurrent(setup.config.root, runId);
1858
1824
  live = writeLiveProgress({
1859
1825
  dir: stagingDir,
1860
1826
  runId,
@@ -1868,7 +1834,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1868
1834
  files,
1869
1835
  harness: (plan?.harnesses ?? config.harness.map(harnessId)).join(", "),
1870
1836
  sandbox: sandboxId(config.sandbox),
1871
- concurrency
1837
+ concurrency,
1838
+ runId
1872
1839
  });
1873
1840
  },
1874
1841
  onEvent: (e) => {
@@ -1912,9 +1879,9 @@ async function executeRun(ctx, setup, filters, renderer) {
1912
1879
  throw error;
1913
1880
  } finally {
1914
1881
  clearTimeout(budgetTimer);
1915
- const { removePrepared } = await import("./preflight-B5ue4TlX.js");
1882
+ const { removePrepared } = await import("./preflight-CFtZNTLt.js");
1916
1883
  removePrepared(config.root, runId);
1917
- const { removePreparedWorkspaces } = await import("./workspace-CvAPfa8b.js");
1884
+ const { removePreparedWorkspaces } = await import("./workspace-wudSz_W-.js");
1918
1885
  removePreparedWorkspaces(config.root, runId);
1919
1886
  }
1920
1887
  if (preflightStop) throw preflightStop;
@@ -1997,4 +1964,4 @@ run(process.argv.slice(2)).finally(() => {
1997
1964
  //#endregion
1998
1965
  export {};
1999
1966
 
2000
- //# sourceMappingURL=cli-BM-qbqO_.js.map
1967
+ //# sourceMappingURL=cli-r9CDqoFL.js.map