reeval 0.8.0 → 0.10.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 (326) hide show
  1. package/README.md +52 -40
  2. package/THIRD_PARTY_NOTICES.md +218 -11
  3. package/assets/package.json +1 -1
  4. package/assets/pnpm-lock.yaml +30 -30
  5. package/dist/adapter-DWlpOtRn.js +279 -0
  6. package/dist/adapter-DWlpOtRn.js.map +1 -0
  7. package/dist/{agent-B72lZ6w5.js → agent-CURAwx_q.js} +6 -6
  8. package/dist/{agent-B72lZ6w5.js.map → agent-CURAwx_q.js.map} +1 -1
  9. package/dist/{agent-Cfj1wD4D.js → agent-CaS_2Sce.js} +92 -26
  10. package/dist/agent-CaS_2Sce.js.map +1 -0
  11. package/dist/{analysis-BTNnKh1w.js → analysis-Bxub9LMT.js} +4 -4
  12. package/dist/{analysis-BTNnKh1w.js.map → analysis-Bxub9LMT.js.map} +1 -1
  13. package/dist/{assemble-BbFVjHeS.js → assemble-B9Alds-z.js} +290 -30
  14. package/dist/assemble-B9Alds-z.js.map +1 -0
  15. package/dist/assemble-J5MukZFY.js +1 -0
  16. package/dist/{client-CwzU9CiW.js → assert-EUIoRdIt.js} +38 -112
  17. package/dist/assert-EUIoRdIt.js.map +1 -0
  18. package/dist/bridge/index.mjs +248 -55
  19. package/dist/{capture-BXhBfmsM.js → capture-CNb9SuU5.js} +204 -39
  20. package/dist/capture-CNb9SuU5.js.map +1 -0
  21. package/dist/capture-jquXZBKK.js +1 -0
  22. package/dist/{cli-BMjTKY-D.js → cli-D303Vj5N.js} +257 -146
  23. package/dist/cli-D303Vj5N.js.map +1 -0
  24. package/dist/{cli-spec-DSvKsOK4.js → cli-spec-BPZbQG2p.js} +38 -19
  25. package/dist/cli-spec-BPZbQG2p.js.map +1 -0
  26. package/dist/cli.js +4 -2
  27. package/dist/cli.js.map +1 -1
  28. package/dist/client-fcwgwOAD.js +106 -0
  29. package/dist/client-fcwgwOAD.js.map +1 -0
  30. package/dist/{command-JPGNzFsA.js → command-BLfT7vnQ.js} +19 -18
  31. package/dist/command-BLfT7vnQ.js.map +1 -0
  32. package/dist/{command-BK4kOgkH.js → command-BT9a37ZR.js} +381 -78
  33. package/dist/command-BT9a37ZR.js.map +1 -0
  34. package/dist/{command-BqJtFiPy.js → command-Bge8F7Ko.js} +384 -101
  35. package/dist/command-Bge8F7Ko.js.map +1 -0
  36. package/dist/command-BkFjijN2.js +1 -0
  37. package/dist/{command-BdstSEHu.js → command-CMJtHKRa.js} +14 -14
  38. package/dist/{command-BdstSEHu.js.map → command-CMJtHKRa.js.map} +1 -1
  39. package/dist/commands-1p-bIWhN.js +1 -0
  40. package/dist/{commands-B618jg3C.js → commands-BFx16WB8.js} +8 -8
  41. package/dist/commands-BFx16WB8.js.map +1 -0
  42. package/dist/config-DEgnUiU-.js +756 -0
  43. package/dist/config-DEgnUiU-.js.map +1 -0
  44. package/dist/{context-CvUv7DUb.js → context-C1mxXh80.js} +11 -7
  45. package/dist/context-C1mxXh80.js.map +1 -0
  46. package/dist/{db-DFbtGIYy.js → db-CdHizc4_.js} +582 -53
  47. package/dist/db-CdHizc4_.js.map +1 -0
  48. package/dist/db-Dm1cRJJP.js +2 -0
  49. package/dist/debug-D7bEv_UV.js +1 -0
  50. package/dist/{dist-CTzThfu_.js → dist-B8hJImYt.js} +17 -4
  51. package/dist/dist-B8hJImYt.js.map +1 -0
  52. package/dist/{docker-2qns7hJ2.js → docker-7b_2SaH7.js} +35 -22
  53. package/dist/docker-7b_2SaH7.js.map +1 -0
  54. package/dist/{docker-IFRW8K5f.js → docker-sZrNrr82.js} +3 -3
  55. package/dist/docker-sZrNrr82.js.map +1 -0
  56. package/dist/docker-yauK-9X8.js +1 -0
  57. package/dist/{doctor-B6oYTPoR.js → doctor-BYNok4UO.js} +263 -84
  58. package/dist/doctor-BYNok4UO.js.map +1 -0
  59. package/dist/{duration-JsJrIWXq.js → duration-CEOQww97.js} +2 -2
  60. package/dist/{duration-JsJrIWXq.js.map → duration-CEOQww97.js.map} +1 -1
  61. package/dist/{egress-IUKdeayc.js → egress-C4PZTSSe.js} +147 -14
  62. package/dist/egress-C4PZTSSe.js.map +1 -0
  63. package/dist/environment-DNjRk0nU.js +1133 -0
  64. package/dist/environment-DNjRk0nU.js.map +1 -0
  65. package/dist/{errors-yDAEwmZo.js → errors-B6BSMs03.js} +2 -2
  66. package/dist/errors-B6BSMs03.js.map +1 -0
  67. package/dist/{errors-C9w_ud7g.js → errors-r025B0Zb.js} +4 -4
  68. package/dist/errors-r025B0Zb.js.map +1 -0
  69. package/dist/evaluate-C1UVL21l.d.ts +92 -0
  70. package/dist/evaluate-D4zeRGBF.js +2351 -0
  71. package/dist/evaluate-D4zeRGBF.js.map +1 -0
  72. package/dist/family-D2b7WD10.js +67 -0
  73. package/dist/family-D2b7WD10.js.map +1 -0
  74. package/dist/files-BAt0i00X.js +1 -0
  75. package/dist/{files-CMSUXAEg.js → files-BXUdY8tr.js} +10 -9
  76. package/dist/{files-CMSUXAEg.js.map → files-BXUdY8tr.js.map} +1 -1
  77. package/dist/files-BhyltlDB.js +1 -0
  78. package/dist/files-Bk1mC3AN.js +43 -0
  79. package/dist/files-Bk1mC3AN.js.map +1 -0
  80. package/dist/{files-B6aVVGrk.js → files-DQmHE7pb.js} +5 -5
  81. package/dist/{files-B6aVVGrk.js.map → files-DQmHE7pb.js.map} +1 -1
  82. package/dist/files-ZZPqfAo6.js +1 -0
  83. package/dist/{git-EmdFJ4DY.js → git-DfG-YJ1u.js} +2 -2
  84. package/dist/{git-EmdFJ4DY.js.map → git-DfG-YJ1u.js.map} +1 -1
  85. package/dist/harness-B8QC9u0O.js +323 -0
  86. package/dist/harness-B8QC9u0O.js.map +1 -0
  87. package/dist/harness.d.ts +19 -31
  88. package/dist/harness.js +1 -2
  89. package/dist/{header-_F0EWob3.js → header-hK-Z_Po9.js} +10 -3
  90. package/dist/{header-_F0EWob3.js.map → header-hK-Z_Po9.js.map} +1 -1
  91. package/dist/{images-CscddrJU.js → images-0On0cztu.js} +114 -45
  92. package/dist/images-0On0cztu.js.map +1 -0
  93. package/dist/index.d.ts +10 -26
  94. package/dist/index.js +6 -2108
  95. package/dist/{init-NQfIvi-0.js → init-B77Rpcqc.js} +26 -8
  96. package/dist/init-B77Rpcqc.js.map +1 -0
  97. package/dist/init-BrOWin3W.js +1 -0
  98. package/dist/{invocations-nPvrlZPj.js → invocations-DbGfBAA_.js} +4 -4
  99. package/dist/{invocations-nPvrlZPj.js.map → invocations-DbGfBAA_.js.map} +1 -1
  100. package/dist/{judge-CeYPN8P_.js → judge-DW_GDOmB.js} +11 -19
  101. package/dist/{judge-CeYPN8P_.js.map → judge-DW_GDOmB.js.map} +1 -1
  102. package/dist/judge.d.ts +2 -2
  103. package/dist/judge.js +1 -1
  104. package/dist/{live-S0qODb6o.js → live-jlfszAbb.js} +9 -20
  105. package/dist/live-jlfszAbb.js.map +1 -0
  106. package/dist/matchers-Ddmc2z7H.js +118 -0
  107. package/dist/matchers-Ddmc2z7H.js.map +1 -0
  108. package/dist/{model-DEQo3FkZ.js → model-DaVCY3rb.js} +2 -2
  109. package/dist/{model-DEQo3FkZ.js.map → model-DaVCY3rb.js.map} +1 -1
  110. package/dist/model-NM3ID0uR.js +1 -0
  111. package/dist/{model-Cl507trk.js → model-h_cDtcRr.js} +19 -18
  112. package/dist/model-h_cDtcRr.js.map +1 -0
  113. package/dist/model-nwWJvaUR.js +1 -0
  114. package/dist/{model-BndnmcLm.js → model-oqcDplJG.js} +271 -34
  115. package/dist/model-oqcDplJG.js.map +1 -0
  116. package/dist/{node-Co7EXge0.js → node-B3ydHo6t.js} +10 -47
  117. package/dist/node-B3ydHo6t.js.map +1 -0
  118. package/dist/object-CLf2-tNq.js +9 -0
  119. package/dist/object-CLf2-tNq.js.map +1 -0
  120. package/dist/{opencode-providers-ByD85Q0l.js → opencode-providers-J9colP0-.js} +96 -21
  121. package/dist/opencode-providers-J9colP0-.js.map +1 -0
  122. package/dist/options-Bh2W63dK.js +1119 -0
  123. package/dist/options-Bh2W63dK.js.map +1 -0
  124. package/dist/{pairs-DDsjgm5F.js → pairs-CnInRu-G.js} +76 -2
  125. package/dist/{pairs-DDsjgm5F.js.map → pairs-CnInRu-G.js.map} +1 -1
  126. package/dist/{patch-CGCVipPu.js → patch-Zac5aIRM.js} +6 -6
  127. package/dist/{patch-CGCVipPu.js.map → patch-Zac5aIRM.js.map} +1 -1
  128. package/dist/{plan-PPc4-6xd.js → plan-C9Cy27Ay.js} +75 -32
  129. package/dist/plan-C9Cy27Ay.js.map +1 -0
  130. package/dist/preflight-CPWpQeBI.js +1 -0
  131. package/dist/{preflight-CddycK92.js → preflight-D7iFPKeK.js} +8 -7
  132. package/dist/preflight-D7iFPKeK.js.map +1 -0
  133. package/dist/prepare-BGjePFQl.js +2 -0
  134. package/dist/{prepare-CsP-057p.js → prepare-doGxaAGR.js} +38 -30
  135. package/dist/prepare-doGxaAGR.js.map +1 -0
  136. package/dist/process-CSVO_jsc.js +119 -0
  137. package/dist/process-CSVO_jsc.js.map +1 -0
  138. package/dist/{provenance-CsX6PHDR.js → provenance-DmE9uPVt.js} +4 -4
  139. package/dist/{provenance-CsX6PHDR.js.map → provenance-DmE9uPVt.js.map} +1 -1
  140. package/dist/provider-DehR4CMN.js +1 -0
  141. package/dist/providers-gDMko8fl.js +1 -0
  142. package/dist/providers-tAOD1NQN.js +165 -0
  143. package/dist/providers-tAOD1NQN.js.map +1 -0
  144. package/dist/{query-BUcwCYsI.js → query-Bes9Kh6Y.js} +3 -3
  145. package/dist/{query-BUcwCYsI.js.map → query-Bes9Kh6Y.js.map} +1 -1
  146. package/dist/query-C_G_svLU.js +1 -0
  147. package/dist/questions-DjAwMxZ3.js +524 -0
  148. package/dist/questions-DjAwMxZ3.js.map +1 -0
  149. package/dist/{record-BRP9vZrj.js → record-BKmMvZ6O.js} +9 -1
  150. package/dist/{record-BRP9vZrj.js.map → record-BKmMvZ6O.js.map} +1 -1
  151. package/dist/remote-HDRt16ew.js +378 -0
  152. package/dist/remote-HDRt16ew.js.map +1 -0
  153. package/dist/{results-BcSHWbgB.js → results-DuauQI3Z.js} +4 -4
  154. package/dist/{results-BcSHWbgB.js.map → results-DuauQI3Z.js.map} +1 -1
  155. package/dist/{resume-DZ9AmfPv.js → resume-BRfa8E_s.js} +10 -10
  156. package/dist/{resume-DZ9AmfPv.js.map → resume-BRfa8E_s.js.map} +1 -1
  157. package/dist/{root-CvdRlRZX.js → root-DICDHCtp.js} +4 -4
  158. package/dist/{root-CvdRlRZX.js.map → root-DICDHCtp.js.map} +1 -1
  159. package/dist/{runtime-Dfb2r-cS.js → runtime-PX_oXiCS.js} +105 -11
  160. package/dist/runtime-PX_oXiCS.js.map +1 -0
  161. package/dist/sandbox-D3A8oUb7.js +70 -0
  162. package/dist/sandbox-D3A8oUb7.js.map +1 -0
  163. package/dist/sandbox.d.ts +22 -8
  164. package/dist/sandbox.js +1 -2
  165. package/dist/server-C7sg1ndo.js +1 -0
  166. package/dist/{server-Da60oe4b.js → server-XDleKaF_.js} +11 -11
  167. package/dist/server-XDleKaF_.js.map +1 -0
  168. package/dist/shared-DYpIb1BI.js +166 -0
  169. package/dist/shared-DYpIb1BI.js.map +1 -0
  170. package/dist/{source-BVOnL3sn.js → source-C8xumIWj.js} +2 -2
  171. package/dist/{source-BVOnL3sn.js.map → source-C8xumIWj.js.map} +1 -1
  172. package/dist/source-fGd0SaKP.js +1 -0
  173. package/dist/{src-TdJuDYqB.js → src-B7treWa8.js} +1597 -292
  174. package/dist/src-B7treWa8.js.map +1 -0
  175. package/dist/{src-C1E9HDWO.js → src-C7_1SqDP.js} +3 -3
  176. package/dist/{src-C1E9HDWO.js.map → src-C7_1SqDP.js.map} +1 -1
  177. package/dist/{src-DDNXsD9H.js → src-CF17Ug08.js} +5 -4
  178. package/dist/src-CF17Ug08.js.map +1 -0
  179. package/dist/{src-D_cXqmnI.js → src-CFp86GtV.js} +60 -60
  180. package/dist/src-CFp86GtV.js.map +1 -0
  181. package/dist/src-C_lPtowT.js +2 -0
  182. package/dist/src-DIL0jST0.js +368 -0
  183. package/dist/src-DIL0jST0.js.map +1 -0
  184. package/dist/src-DNnG4e4R.js +2 -0
  185. package/dist/src-DTbrY1hi.js +2 -0
  186. package/dist/src-DdyJEh2v.js +2 -0
  187. package/dist/src-Dj9PAroc.js +2 -0
  188. package/dist/src-Du8H85Qq.js +2 -0
  189. package/dist/src-DvCg0NBs.js +324 -0
  190. package/dist/src-DvCg0NBs.js.map +1 -0
  191. package/dist/{src-CxTC5kNI.js → src-DvK0EIZx.js} +8 -10
  192. package/dist/{src-CxTC5kNI.js.map → src-DvK0EIZx.js.map} +1 -1
  193. package/dist/{src-DVy58-zZ.js → src-FGXhkEkH.js} +5 -5
  194. package/dist/{src-DVy58-zZ.js.map → src-FGXhkEkH.js.map} +1 -1
  195. package/dist/src-jzagbuqH.js +2 -0
  196. package/dist/src-ofUaYbuY.js +3 -0
  197. package/dist/src-pJZOrYR9.js +1 -0
  198. package/dist/{src-D95O-Smv.js → src-u8_ixn_F.js} +15 -11
  199. package/dist/src-u8_ixn_F.js.map +1 -0
  200. package/dist/{state-B72h_jEw.js → state-C__9swoG.js} +36 -24
  201. package/dist/state-C__9swoG.js.map +1 -0
  202. package/dist/state-CeR6oz0k.js +66 -0
  203. package/dist/state-CeR6oz0k.js.map +1 -0
  204. package/dist/state-CgjQo29K.js +1 -0
  205. package/dist/studio-app/assets/index-CwQN3f_h.css +2 -0
  206. package/dist/studio-app/assets/{index-Bgr-efZm.js → index-DrQc2Yxd.js} +12 -12
  207. package/dist/studio-app/index.html +2 -2
  208. package/dist/{summary-k3mhWWXv.js → summary-BLAVLySU.js} +202 -17
  209. package/dist/summary-BLAVLySU.js.map +1 -0
  210. package/dist/{summary-CJdxaRdM.js → summary-DgyjUh_l.js} +7 -7
  211. package/dist/{summary-CJdxaRdM.js.map → summary-DgyjUh_l.js.map} +1 -1
  212. package/dist/testing.d.ts +3 -2
  213. package/dist/testing.js +3 -2
  214. package/dist/{tool-target-BU1JnSE9.js → tool-target-D2mcYlSQ.js} +14 -7
  215. package/dist/tool-target-D2mcYlSQ.js.map +1 -0
  216. package/dist/{tools-D0gF2QoV.js → tools-GCyNYSc1.js} +7 -7
  217. package/dist/tools-GCyNYSc1.js.map +1 -0
  218. package/dist/transcript-BNNANU8A.js +64 -0
  219. package/dist/transcript-BNNANU8A.js.map +1 -0
  220. package/dist/types-C5vI3g1C.js.map +1 -1
  221. package/dist/{types-_LOFdPUf.d.ts → types-g17bRAzt.d.ts} +578 -49
  222. package/dist/{usage-DDF_6tkV.js → usage-CleNKkly.js} +4 -2
  223. package/dist/{usage-DDF_6tkV.js.map → usage-CleNKkly.js.map} +1 -1
  224. package/dist/view/index.d.ts +83 -17
  225. package/dist/view/index.js +7 -6
  226. package/dist/views-BW6oCDUQ.js +2 -0
  227. package/dist/{views-DZ1YDqey.js → views-BmQF4UCI.js} +13 -8
  228. package/dist/views-BmQF4UCI.js.map +1 -0
  229. package/dist/{worker-entry-DXeyWY-m.js → worker-entry-yOchGYYv.js} +16 -225
  230. package/dist/worker-entry-yOchGYYv.js.map +1 -0
  231. package/dist/{workspace-DpXdrslo.js → workspace-CgyHEM0l.js} +7 -7
  232. package/dist/{workspace-DpXdrslo.js.map → workspace-CgyHEM0l.js.map} +1 -1
  233. package/dist/workspace-D8sSgpiy.js +1 -0
  234. package/docker/Dockerfile +7 -5
  235. package/package.json +12 -12
  236. package/dist/agent-Cfj1wD4D.js.map +0 -1
  237. package/dist/assemble-BbFVjHeS.js.map +0 -1
  238. package/dist/assemble-CXiTVyHD.js +0 -2
  239. package/dist/capture-BXhBfmsM.js.map +0 -1
  240. package/dist/capture-N7r3yeak.js +0 -2
  241. package/dist/cli-BMjTKY-D.js.map +0 -1
  242. package/dist/cli-spec-DSvKsOK4.js.map +0 -1
  243. package/dist/client-CwzU9CiW.js.map +0 -1
  244. package/dist/command-BK4kOgkH.js.map +0 -1
  245. package/dist/command-BqJtFiPy.js.map +0 -1
  246. package/dist/command-CTVGuH8y.js +0 -2
  247. package/dist/command-JPGNzFsA.js.map +0 -1
  248. package/dist/commands-B618jg3C.js.map +0 -1
  249. package/dist/commands-Duo2ur3r.js +0 -2
  250. package/dist/config-B-E0xRkf.js +0 -447
  251. package/dist/config-B-E0xRkf.js.map +0 -1
  252. package/dist/context-CvUv7DUb.js.map +0 -1
  253. package/dist/db-CnoUy-FZ.js +0 -3
  254. package/dist/db-DFbtGIYy.js.map +0 -1
  255. package/dist/debug-SEmW4w8f.js +0 -2
  256. package/dist/dist-CTzThfu_.js.map +0 -1
  257. package/dist/docker-2qns7hJ2.js.map +0 -1
  258. package/dist/docker-D6t23fZl.js +0 -2
  259. package/dist/docker-IFRW8K5f.js.map +0 -1
  260. package/dist/doctor-B6oYTPoR.js.map +0 -1
  261. package/dist/egress-IUKdeayc.js.map +0 -1
  262. package/dist/environment-DiCljXMD.js +0 -657
  263. package/dist/environment-DiCljXMD.js.map +0 -1
  264. package/dist/errors-C9w_ud7g.js.map +0 -1
  265. package/dist/errors-yDAEwmZo.js.map +0 -1
  266. package/dist/fake-instructions-CUI33I_F.js +0 -32
  267. package/dist/fake-instructions-CUI33I_F.js.map +0 -1
  268. package/dist/files-BM78_nnF.js +0 -2
  269. package/dist/files-BpYgF2z0.js +0 -2
  270. package/dist/files-YCCVaTQC.js +0 -2
  271. package/dist/harness-iqWeJQMM.js +0 -154
  272. package/dist/harness-iqWeJQMM.js.map +0 -1
  273. package/dist/images-CscddrJU.js.map +0 -1
  274. package/dist/index.js.map +0 -1
  275. package/dist/init-DBHyi92L.js +0 -2
  276. package/dist/init-NQfIvi-0.js.map +0 -1
  277. package/dist/jiti-BcJHCtrb.js +0 -46
  278. package/dist/jiti-BcJHCtrb.js.map +0 -1
  279. package/dist/live-S0qODb6o.js.map +0 -1
  280. package/dist/model-BbLGRtOs.js +0 -2
  281. package/dist/model-BndnmcLm.js.map +0 -1
  282. package/dist/model-Cl507trk.js.map +0 -1
  283. package/dist/model-DMOraCcm.js +0 -2
  284. package/dist/node-Co7EXge0.js.map +0 -1
  285. package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
  286. package/dist/options-DPUlm4FI.js +0 -735
  287. package/dist/options-DPUlm4FI.js.map +0 -1
  288. package/dist/plan-PPc4-6xd.js.map +0 -1
  289. package/dist/preflight-CddycK92.js.map +0 -1
  290. package/dist/preflight-Zumy0adT.js +0 -2
  291. package/dist/prepare-CKdMoC7e.js +0 -3
  292. package/dist/prepare-CsP-057p.js.map +0 -1
  293. package/dist/provider-BDbNOQhQ.js +0 -2
  294. package/dist/providers-DkwiLKDS.js +0 -107
  295. package/dist/providers-DkwiLKDS.js.map +0 -1
  296. package/dist/providers-yXZZcPfx.js +0 -2
  297. package/dist/query-noGbekGF.js +0 -2
  298. package/dist/questions-BEPj98fZ.js +0 -234
  299. package/dist/questions-BEPj98fZ.js.map +0 -1
  300. package/dist/runtime-Dfb2r-cS.js.map +0 -1
  301. package/dist/sandbox--ZXuscAZ.js +0 -134
  302. package/dist/sandbox--ZXuscAZ.js.map +0 -1
  303. package/dist/server-Da60oe4b.js.map +0 -1
  304. package/dist/server-DiGR4JxK.js +0 -2
  305. package/dist/source-Dqu0jKwx.js +0 -2
  306. package/dist/src-BHNiP-5A.js +0 -4
  307. package/dist/src-BT4dB5CO.js +0 -2
  308. package/dist/src-BT5pwco0.js +0 -3
  309. package/dist/src-BrMbt1B2.js +0 -3
  310. package/dist/src-D13vpMh0.js +0 -3
  311. package/dist/src-D95O-Smv.js.map +0 -1
  312. package/dist/src-DDNXsD9H.js.map +0 -1
  313. package/dist/src-D_cXqmnI.js.map +0 -1
  314. package/dist/src-DdRlaiRc.js +0 -3
  315. package/dist/src-TdJuDYqB.js.map +0 -1
  316. package/dist/src-xczuQbE6.js +0 -3
  317. package/dist/state-B72h_jEw.js.map +0 -1
  318. package/dist/state-Bf_Vq_pV.js +0 -2
  319. package/dist/studio-app/assets/index-CUx6GoL5.css +0 -2
  320. package/dist/summary-k3mhWWXv.js.map +0 -1
  321. package/dist/tool-target-BU1JnSE9.js.map +0 -1
  322. package/dist/tools-D0gF2QoV.js.map +0 -1
  323. package/dist/views-DZ1YDqey.js.map +0 -1
  324. package/dist/views-Ds0GXWtX.js +0 -3
  325. package/dist/worker-entry-DXeyWY-m.js.map +0 -1
  326. package/dist/workspace-DzNL-3iO.js +0 -2
@@ -41,6 +41,10 @@ type EffortContrast = {
41
41
  agentMsP: number | null;
42
42
  /** The variant's and control's tool-call ranges don't overlap. */
43
43
  separated: boolean;
44
+ /** Their agent-time ranges don't overlap. */
45
+ timeSeparated: boolean;
46
+ /** Their token ranges don't overlap; null when the token test was omitted. */
47
+ tokensSeparated: boolean | null;
44
48
  /** On tool calls, the steadier measure; `timeVerdict` on agent time. */
45
49
  verdict: EffortVerdict;
46
50
  timeVerdict: EffortVerdict;
@@ -67,6 +71,21 @@ declare function effortVerdict(xs: number[], ys: number[]): {
67
71
  p: number | null;
68
72
  verdict: EffortVerdict;
69
73
  };
74
+ /**
75
+ * The fewest attempts a side for "no overlap" to say anything: at 3 against 3 one ordering in
76
+ * ten separates by chance; at 1 against 1 every pair of unequal values does.
77
+ */
78
+ declare const DIRECTIONAL_MIN = 3;
79
+ /**
80
+ * The fewest runs per cell whose effort test can reach `EFFORT_ALPHA` (4 against 4: p = 2/70).
81
+ */
82
+ declare const EFFORT_MIN_RUNS: number;
83
+ type EffortMetric = 'tools' | 'agentS' | 'tokens';
84
+ /**
85
+ * The metrics whose test is `insufficient` but whose ranges don't overlap at
86
+ * `DIRECTIONAL_MIN` a side or more: a direction, not an effect.
87
+ */
88
+ declare function directional(c: EffortContrast): EffortMetric[];
70
89
  declare function contrastEffort(variant: EffortSample[], control: EffortSample[]): EffortContrast | null;
71
90
  /** The counted attempts of one cell of an eval, as effort samples. */
72
91
  declare const cellSamples: (e: Pick<EvalEntry, 'attempts'>, cellKey: string) => EffortSample[];
@@ -83,6 +102,7 @@ declare const VERDICT_TEXT: Record<EffortVerdict, (what: string) => string>;
83
102
  * `tools 5 vs 43 (×0.11), agent 21s vs 46s (×0.47): too few attempts to test` for a variant
84
103
  * against its control; with enough attempts, `fewer tool calls (p = 0.029)`. Tokens fold in
85
104
  * when both sides have usage samples; they are omitted (not `insufficient`) when either does not.
105
+ * A metric too small to test whose ranges don't overlap says so: `(×0.37, no overlap)`.
86
106
  */
87
107
  declare function effortLabel(c: EffortContrast): string;
88
108
  /** One cell's effort on its own: `tools 43 · agent 46s`, plus tokens when any attempt reported them. */
@@ -273,14 +293,18 @@ type AttemptRecord = {
273
293
  usage: TokenUsage | null;
274
294
  };
275
295
  timings: PhaseTimings;
276
- /** Counts from the transcript, so a run's shape is visible without reading it. */
296
+ /** Counts from the transcript, so a run's shape is visible without reading it. `webSearches` includes refused searches. */
277
297
  activity: {
278
298
  tools: number;
279
299
  fileEdits: number;
280
- /** Null when a turn with none couldn't report them (`unreported`), not a count of 0 that isn't one. */
300
+ /** Every `web-search` event, including refused ones. Null when a turn with none couldn't report them (`unreported`). */
281
301
  webSearches: number | null;
282
302
  webFetches: number | null;
283
303
  reasoningMs: number;
304
+ /** Transcript tool events with `stalled: true` (long shell or edit). */
305
+ stalledTools: number;
306
+ /** Longest tool `durationMs` in the transcript; null when none reported a duration. */
307
+ maxToolMs: number | null;
284
308
  };
285
309
  judgements: JudgementRecord[];
286
310
  /** Harness session starts that didn't become ready within `startTimeout` and were started again (at most one). */
@@ -291,6 +315,8 @@ type AttemptRecord = {
291
315
  durationMs: number;
292
316
  log?: FileRef;
293
317
  }>;
318
+ /** Every `expect` and `expect.soft` matcher call that settled, in call order; unset with none. */
319
+ assertions?: AssertionRecord[];
294
320
  /** Files under a dependency directory (node_modules/, .venv/, …) collapse to one entry with `count`. */
295
321
  changedFiles: Array<FileChange & {
296
322
  count?: number;
@@ -325,7 +351,7 @@ type EvalEntry = {
325
351
  outcome: Outcome;
326
352
  /** A placeholder, `evaluate.todo` or `group.todo`: it never runs, and its outcome is `skipped`. */
327
353
  todo: boolean;
328
- /** pass / (pass + fail) over the gated cells' attempts; infra errors and skips excluded. */
354
+ /** pass@1, pass / (pass + fail), over the gated cells' attempts; infra errors and skips excluded. */
329
355
  passRate: number | null;
330
356
  cells: CellRecord[];
331
357
  attempts: AttemptRecord[];
@@ -333,11 +359,117 @@ type EvalEntry = {
333
359
  * The compare's questions, answered after its attempts by pairwise votes, one per question;
334
360
  * unset without any. They annotate: `outcome` and `passRate` never depend on them. Each vote
335
361
  * may include a short `reason` (capped). `reeval analyze` includes each answer in the digest
336
- * (rates by cut, votes, ties, a failed call, a sample of reasons).
362
+ * (rates by cut, votes, ties, a failed call, a sample of reasons). Each answer's `input` is
363
+ * `<eval-slug>/questions/<n>.json`: every call its model was sent, per pair and order, secrets
364
+ * masked and screenshots as refs; unset where the eval's files weren't kept.
337
365
  */
338
366
  answers?: CompareAnswer[];
367
+ /** Set on each case of a pooled `evaluate.each`; `RunRecord.families` has the suite. */
368
+ family?: {
369
+ id: string;
370
+ name: string;
371
+ case: number;
372
+ cases: number;
373
+ };
374
+ };
375
+ /** A 95% interval on a pooled rate or difference. */
376
+ type FamilyInterval = {
377
+ lo: number;
378
+ hi: number;
379
+ level: 0.95;
380
+ /**
381
+ * `wilson` / `newcombe-paired`: one counted attempt a case and side, so each case is one
382
+ * Bernoulli trial (or pair). `t-cases`: several, so a t interval over the cases' pass@1, with
383
+ * attempts within a case never counted as independent.
384
+ */
385
+ method: 'wilson' | 'newcombe-paired' | 't-cases';
386
+ };
387
+ /** One cell's pass@1 over a family's cases. */
388
+ type FamilyRate = {
389
+ /** The cell's key, the same in every case. */
390
+ cell: string;
391
+ /** Cases with at least one counted attempt in this cell. */
392
+ cases: number;
393
+ /** Passes and counted attempts over those cases. */
394
+ pass: number;
395
+ counted: number;
396
+ /** The mean of the cases' pass@1; at one attempt a case, `pass / counted`. */
397
+ rate: number;
398
+ interval: FamilyInterval;
399
+ };
400
+ /**
401
+ * `lift` / `drop`: the interval excludes 0. `noise`: it doesn't. `insufficient`: fewer than 6
402
+ * discordant pairs (one attempt a case) or 6 paired cases (several), where no test can decide.
403
+ */
404
+ type FamilyVerdict = 'lift' | 'drop' | 'noise' | 'insufficient';
405
+ /** One effort metric over a family's paired cases. */
406
+ type FamilyEffortMetric = {
407
+ /** Cases with a value on both sides. */
408
+ pairs: number;
409
+ /** The median over cases of the variant's per-case median, over the control's; null at 0. */
410
+ ratio: number | null;
411
+ /** Wilcoxon signed-rank over the per-case differences; null when every difference is 0. */
412
+ p: number | null;
413
+ /** `insufficient` below 6 non-zero differences, where the exact test can't reach 0.05. */
414
+ verdict: 'fewer' | 'more' | 'noise' | 'insufficient';
415
+ };
416
+ /** The variant's effort against the control's, paired by case. */
417
+ type FamilyEffort = {
418
+ tools: FamilyEffortMetric;
419
+ agentMs: FamilyEffortMetric;
420
+ /** Over the cases where every counted attempt reported usage; omitted when none did. */
421
+ tokens?: FamilyEffortMetric;
422
+ };
423
+ /** A variant cell against its control over a family's cases, paired by case. */
424
+ type FamilyLift = {
425
+ /** The variant cell's key. */
426
+ variant: string;
427
+ /** The control cell's key. */
428
+ vs: string;
429
+ /** Cases with counted attempts on both sides. */
430
+ pairs: number;
431
+ /** Mean pass@1 over the paired cases on each side. */
432
+ variantRate: number;
433
+ controlRate: number;
434
+ /** Set at one attempt a case and side: pairs where only one side passed. */
435
+ discordant?: {
436
+ variantOnly: number;
437
+ controlOnly: number;
438
+ };
439
+ /** Variant minus control, from -1 to 1. */
440
+ points: number;
441
+ interval: FamilyInterval;
442
+ /** McNemar's exact p (one attempt a case), else Wilcoxon signed-rank over the cases. */
443
+ p: number | null;
444
+ /** The interval spans 0. */
445
+ withinNoise: boolean;
446
+ verdict: FamilyVerdict;
447
+ /** The compare's `minLift`: on a family it gates this lower bound, not each case's. */
448
+ minLift?: number;
449
+ /** `fail` when `interval.lo` is below `minLift`. */
450
+ outcome: 'pass' | 'fail';
451
+ effort?: FamilyEffort;
339
452
  };
340
- /** A variant cell's pass rate against the control's, on the same harness and sandbox. */
453
+ /** A pooled `evaluate.each`: its cases as samples of one suite. Each case is also an eval. */
454
+ type FamilyRecord = {
455
+ /** `file › group › … › template`. */
456
+ id: string;
457
+ file: string;
458
+ group: string[];
459
+ /** The name template, e.g. `fixes $id`. */
460
+ name: string;
461
+ /** Cases in the list. */
462
+ cases: number;
463
+ /** Cases with an eval in this run; fewer when a filter or tag left some out. */
464
+ ran: number;
465
+ /** One per cell. */
466
+ rates: FamilyRate[];
467
+ /** One per variant cell, with `compare`. */
468
+ lifts: FamilyLift[];
469
+ /** `fail` when a lift is below its `minLift`. The cases still pass or fail on their own. */
470
+ outcome: 'pass' | 'fail';
471
+ };
472
+ /** A variant cell's pass@1 against the control's, on the same harness and sandbox. */
341
473
  type Lift = {
342
474
  /** The control cell's key. */
343
475
  vs: string;
@@ -350,7 +482,7 @@ type Lift = {
350
482
  pass: number;
351
483
  counted: number;
352
484
  };
353
- /** Variant pass rate minus control pass rate, from -1 to 1. */
485
+ /** Variant pass@1 minus control pass@1, from -1 to 1. */
354
486
  points: number;
355
487
  /** 95% interval on the difference, by Newcombe's hybrid score method from two Wilson intervals. */
356
488
  interval: {
@@ -373,7 +505,7 @@ type FingerprintParts = {
373
505
  environment: string | null;
374
506
  image: string | null;
375
507
  agentCli: string | null;
376
- /** Over the judge's model, threshold and version. */
508
+ /** Over the judge's model, threshold and version, and the config's `state` when it sets one. */
377
509
  judge: string;
378
510
  /** Over the attempt's context files. */
379
511
  context: string;
@@ -402,14 +534,39 @@ type CellRecord = Cell & {
402
534
  fail: number;
403
535
  infraError: number;
404
536
  skipped: number;
537
+ /** pass@1: pass / (pass + fail); infra errors and skips excluded. */
405
538
  passRate: number | null;
406
539
  /**
407
- * By `gate`. `'all'` matches `{ passRate: 1 }` (infra only when nothing counted); `'none'`
540
+ * By `gate`. `'all'` (pass^k: every counted attempt passes) matches `{ passRate: 1 }`;
541
+ * `{ passRate }` is a pass@1 threshold. Infra only when nothing counted; `'none'`
408
542
  * reports the worst outcome. A variant below its `minLift` fails too.
409
543
  */
410
544
  outcome: Outcome;
411
545
  lift?: Lift;
546
+ /**
547
+ * Each check (assertion label) seen in any attempt of the eval, over this cell's counted
548
+ * attempts; on a variant cell, the control's beside it. Unset when no attempt recorded any.
549
+ */
550
+ checks?: CellCheck[];
551
+ };
552
+ /** How often one check passed: a counted attempt that never reached it counts it `notRun`. */
553
+ type CheckTally = {
554
+ pass: number;
555
+ fail: number;
556
+ error: number;
557
+ notRun: number;
412
558
  };
559
+ /**
560
+ * One check over a cell's counted attempts. `verdict` (variant cells): `discriminates` when it
561
+ * passes on every counted attempt of one side and none of the other; `both-pass` or `both-fail`
562
+ * when it does the same on both sides, so it can't tell them apart; `mixed` otherwise.
563
+ */
564
+ type CellCheck = CheckTally & {
565
+ label: string;
566
+ control?: CheckTally;
567
+ verdict?: CheckVerdict;
568
+ };
569
+ type CheckVerdict = 'discriminates' | 'both-pass' | 'both-fail' | 'mixed';
413
570
  /** Counts attempts, except `evals`. */
414
571
  type RunSummary = {
415
572
  evals: number;
@@ -432,7 +589,7 @@ type Cost = {
432
589
  source: 'reported' | 'unreported';
433
590
  };
434
591
  type RunRecord = {
435
- kind: 'es-run';
592
+ kind: 'reeval-run';
436
593
  schemaVersion: typeof SCHEMA_VERSION;
437
594
  /** Also the file name: `<UTC start>_<short sha>_<author or ci>`. */
438
595
  runId: string;
@@ -508,10 +665,13 @@ type RunRecord = {
508
665
  };
509
666
  summary: RunSummary;
510
667
  evals: EvalEntry[];
668
+ /** Each pooled `evaluate.each` that ran; unset when none did. */
669
+ families?: FamilyRecord[];
511
670
  };
512
671
  /** What ran and graded the agents: the machine, images, harnesses and judge. */
513
672
  type Stack = {
514
- es: string;
673
+ /** The reeval version that wrote the run. */
674
+ reeval: string;
515
675
  /** `process.versions.node`: under Bun or Deno, the Node version they're compatible with. */
516
676
  node: string;
517
677
  /**
@@ -577,6 +737,8 @@ type Stack = {
577
737
  threshold: number;
578
738
  /** Changes when reeval, the AI SDK or the provider adapter (and so the judge prompt) change. */
579
739
  version: string;
740
+ /** What the judge sees by default, every key resolved; absent when the config and profile leave `state` at its defaults. */
741
+ state?: ResolvedJudgeStateOptions;
580
742
  };
581
743
  /** Union of every attempt's context files. */
582
744
  context: ContextFile[];
@@ -646,6 +808,8 @@ type HistoryEntry = {
646
808
  passRate: number | null;
647
809
  cells: HistoryCell[];
648
810
  }>;
811
+ /** The run's pooled families; unset when none ran. */
812
+ families?: Array<Pick<FamilyRecord, 'id' | 'name' | 'cases' | 'ran' | 'outcome'>>;
649
813
  };
650
814
  //#endregion
651
815
  //#region src/types.d.ts
@@ -666,7 +830,8 @@ type FileEditEvent = {
666
830
  };
667
831
  /**
668
832
  * Normalised agent events. Each tool call is one event, merged with its result; `durationMs`
669
- * is null when the harness never reported the end.
833
+ * is wall time until the result arrived (Cursor's own `completed_at_ms` can be earlier). Null
834
+ * when the harness never reported the end. Long shell or edit calls set `stalled: true`.
670
835
  */
671
836
  type TranscriptEvent = EventTime & ({
672
837
  type: 'text' | 'reasoning';
@@ -674,19 +839,27 @@ type TranscriptEvent = EventTime & ({
674
839
  durationMs: number | null;
675
840
  } | (FileEditEvent & {
676
841
  durationMs: number | null;
842
+ /** True when a shell-like tool or edit ran at least two minutes. */
843
+ stalled?: boolean;
677
844
  }) | {
678
845
  type: 'web-search';
679
846
  toolCallId: string;
680
847
  query: string;
681
848
  /** How many sources the harness says it used; Cursor sends no URLs or titles. */
682
849
  references: number | null;
850
+ /** Whether the search succeeded. Absent means it did. */
851
+ ok?: boolean;
683
852
  durationMs: number | null;
853
+ /** True when a shell-like tool or edit ran at least two minutes. */
854
+ stalled?: boolean;
684
855
  } | {
685
856
  type: 'web-fetch';
686
857
  toolCallId: string;
687
858
  url: string;
688
859
  ok: boolean;
689
860
  durationMs: number | null;
861
+ /** True when a shell-like tool or edit ran at least two minutes. */
862
+ stalled?: boolean;
690
863
  } | {
691
864
  type: 'tool';
692
865
  toolCallId: string;
@@ -695,6 +868,8 @@ type TranscriptEvent = EventTime & ({
695
868
  output: unknown;
696
869
  ok: boolean;
697
870
  durationMs: number | null;
871
+ /** True when a shell-like tool or edit ran at least two minutes. */
872
+ stalled?: boolean;
698
873
  } | {
699
874
  type: 'error';
700
875
  message: string;
@@ -713,7 +888,9 @@ type ExecResult = {
713
888
  };
714
889
  /** Live tab size for `c.capture()`. Default 1280×720 when the call and cascade omit `viewport`. */
715
890
  type CaptureWindow = {
891
+ /** In CSS pixels. */
716
892
  width: number;
893
+ /** In CSS pixels. */
717
894
  height: number;
718
895
  };
719
896
  /**
@@ -775,6 +952,7 @@ type CaptureUse = {
775
952
  * pass it as the first argument to `c.capture`.
776
953
  */
777
954
  type CaptureOptions = {
955
+ /** The window and saved PNG size, or `'full-page'`. Default 1280×720. */
778
956
  viewport?: Viewport;
779
957
  /** How long to poll before failing. Default `'60s'`. */
780
958
  timeout?: Duration;
@@ -880,6 +1058,7 @@ type Turn = TurnData & {
880
1058
  exec(command: string): Promise<ExecResult>;
881
1059
  readFile(path: string): Promise<string | null>;
882
1060
  };
1061
+ /** Any JSON value. */
883
1062
  type JSONValue = null | boolean | number | string | JSONValue[] | {
884
1063
  [key: string]: JSONValue;
885
1064
  };
@@ -916,10 +1095,11 @@ type JudgeArtifactRef = {
916
1095
  */
917
1096
  type FakeJudgeModel = {
918
1097
  kind: 'fake-judge';
1098
+ /** The score (0–1) every call gets, or a function of the state it would see. */
919
1099
  score: number | ((state: JudgeState) => number);
920
1100
  };
921
1101
  /**
922
- * `'provider/model'` (e.g. `'typesafe-ai/jev-1.13.0'`, `'google/gemini-3.8-flash'`), an AI SDK
1102
+ * `'provider/model'` (e.g. `'typesafe-ai/jev-1.14.0'`, `'google/gemini-3.8-flash'`), an AI SDK
923
1103
  * decision model object (per group, eval or call only), or a fake judge.
924
1104
  */
925
1105
  type JudgeModel = string | FakeJudgeModel | {
@@ -927,28 +1107,77 @@ type JudgeModel = string | FakeJudgeModel | {
927
1107
  };
928
1108
  /** Merged field by field down the cascade, so per-model settings can join as new fields. */
929
1109
  type JudgeOptions = {
1110
+ /** The model that grades. */
930
1111
  model?: JudgeModel;
931
1112
  /** Minimum score (0–1) for a `pass` verdict. */
932
1113
  threshold?: number;
1114
+ /** AI SDK provider options for the judge's calls, keyed by provider. */
933
1115
  providerOptions?: Record<string, Record<string, JSONValue>>;
934
1116
  /** The most judge calls to this model's provider at once, across the run. */
935
1117
  maxConcurrent?: number;
936
1118
  /**
937
- * Which changed files the judge's diff shows: gitignore-style patterns over workspace paths,
938
- * where the last matching pattern wins and a `!` pattern excludes. Default: every changed file.
1119
+ * The judge's state: what the judge is given beside the question, not the workspace's or the
1120
+ * attempt's state. Merged key by key down the cascade.
939
1121
  */
940
- include?: string[];
941
- /** Workspace files the judge sees whole, as they are now, whether or not the agent changed them. */
942
- files?: string[];
1122
+ state?: JudgeStateOptions;
1123
+ };
1124
+ /**
1125
+ * What the judge is given: each key is a key of the state in `judge-input.json`. An unset key
1126
+ * keeps its default, which is what the judge gets with no `state` option at all.
1127
+ */
1128
+ type JudgeStateOptions = {
1129
+ /** The graded turn's prompt. Default true. */
1130
+ task?: boolean;
1131
+ /** The graded turn's final message, or `on`'s value. Default true. */
1132
+ output?: boolean;
1133
+ /** `status path` lines for the changed files, under `diff`'s patterns. Default true. */
1134
+ files?: boolean;
1135
+ /**
1136
+ * The diff since the eval started. A list is gitignore-style patterns over workspace paths:
1137
+ * the last matching pattern wins and `!` excludes. Default true.
1138
+ */
1139
+ diff?: boolean | string[];
1140
+ /**
1141
+ * Workspace files shown whole, as they are now, changed or not: exact paths or gitignore-style
1142
+ * patterns (`'**'`, `'src/**'`; the last match wins, `!` excludes) over the files git sees in
1143
+ * the workspace. A missing exact path is `null`; a pattern that matches nothing adds nothing.
1144
+ * These files leave the diff. Default none.
1145
+ */
1146
+ contents?: string[];
1147
+ /**
1148
+ * The graded turn's transcript as text lines: `true` is messages and tool calls with tool
1149
+ * output clipped, `'tools'` tool calls only, `'full'` adds reasoning and whole tool output.
1150
+ * Default false.
1151
+ */
1152
+ transcript?: boolean | 'tools' | 'full';
1153
+ /**
1154
+ * `'all'`: every turn up to the graded one under `turns`, each with its task, output and (with
1155
+ * `transcript`) transcript. Default `'last'`.
1156
+ */
1157
+ turns?: 'last' | 'all';
1158
+ /** `c.exec` results so far; a list shows only those commands, as passed to `c.exec`. Default false. */
1159
+ checks?: boolean | string[];
1160
+ };
1161
+ /** `JudgeStateOptions` with every key set: what one judge call saw. */
1162
+ type ResolvedJudgeStateOptions = {
1163
+ task: boolean;
1164
+ output: boolean;
1165
+ files: boolean;
1166
+ diff: boolean | string[];
1167
+ contents: string[];
1168
+ transcript: boolean | 'tools' | 'full';
1169
+ turns: 'last' | 'all';
1170
+ checks: boolean | string[];
943
1171
  };
944
1172
  type JudgeCallOptions = JudgeOptions & {
945
1173
  /** What to grade instead of the latest turn: another turn, or a value used as the output. */
946
1174
  on?: Turn | JSONValue;
947
1175
  /**
948
- * Captures this call sends the judge as file parts. A `c.capture()` handle or its name.
949
- * Call-only: the bytes are on this attempt. The provider that cannot take files fails the call.
1176
+ * Captures this call sends the judge as file parts: `c.capture()` handles or their names, or
1177
+ * `true` for every capture so far. Call-only: the bytes are on this attempt. Jev takes PNG
1178
+ * captures; a provider that cannot take files fails the call.
950
1179
  */
951
- artifacts?: Array<Capture | string>;
1180
+ artifacts?: true | Array<Capture | string>;
952
1181
  };
953
1182
  type Verdict = {
954
1183
  verdict: 'pass' | 'fail';
@@ -971,12 +1200,16 @@ type JudgeFailure = Omit<Verdict, 'verdict' | 'score' | 'resolvedModel'> & {
971
1200
  score: null;
972
1201
  error: string;
973
1202
  };
1203
+ /**
1204
+ * What an eval's body gets. The sandbox and the agent session start on the first call that needs
1205
+ * them (`send`, `exec`, `readFile`, `writeFile`, `serve` or `capture`), once however many ask.
1206
+ */
974
1207
  type AttemptContext = {
975
- /** Sends the next turn of this eval's agent session, starting the sandbox on first use. */
1208
+ /** Sends the next turn of this eval's agent session. */
976
1209
  send(prompt: string): Promise<Turn>;
977
1210
  /**
978
1211
  * Asks the judge a yes/no question about the latest turn (or `options.on`).
979
- * `options.artifacts` is a list of `c.capture()` handles or names.
1212
+ * `options.artifacts` is a list of `c.capture()` handles or names, or `true` for all of them.
980
1213
  */
981
1214
  judge(question: string, options?: JudgeCallOptions): Promise<Verdict | JudgeFailure>;
982
1215
  exec(command: string): Promise<ExecResult>;
@@ -995,16 +1228,16 @@ type AttemptContext = {
995
1228
  * Screenshots a path on a tunneled sandbox port and writes `artifacts/<name>.png`.
996
1229
  * First argument is the container port or a `ServeHandle` from `c.serve`.
997
1230
  * `instructions` runs a vision journey on that same tab first.
998
- * Needs a sandbox, same as `c.exec`.
999
1231
  */
1000
1232
  capture(target: number | ServeHandle, options?: CaptureCall): Promise<Capture>;
1001
1233
  /** Workspace-relative, or `~/` for the home directory; `null` when there's no such file. */
1002
1234
  readFile(path: string): Promise<string | null>;
1003
1235
  /**
1004
- * Starts the sandbox and the agent session without a turn, for checks on what the environment
1005
- * set up. `c.send()` starts them too; calling both starts them once.
1236
+ * Writes a file into the sandbox (workspace-relative, or `~/`), creating its directories.
1237
+ * Later turns' `diff` leaves it out, as it does the environment's files, but shows any change
1238
+ * made to it afterwards.
1006
1239
  */
1007
- sandbox(): Promise<Pick<AttemptContext, 'exec' | 'readFile'>>;
1240
+ writeFile(path: string, contents: string | Uint8Array): Promise<void>;
1008
1241
  /** Every turn so far, oldest first. */
1009
1242
  readonly turns: readonly Turn[];
1010
1243
  /** Aborted on timeout or Ctrl-C. */
@@ -1017,12 +1250,14 @@ type AttemptContext = {
1017
1250
  };
1018
1251
  };
1019
1252
  type EvalFn = (c: AttemptContext) => Promise<void>;
1253
+ /** A canned agent for tests and dry runs, made by `fakeHarness()` in `reeval/harness`. */
1020
1254
  type FakeHarnessDescriptor = {
1021
1255
  kind: 'fake';
1022
1256
  /** Cell id; defaults to `fake`. */
1023
1257
  id?: string;
1024
1258
  /** Files the fake agent writes into the sandbox on every turn. */
1025
1259
  files?: Record<string, string>;
1260
+ /** The fake agent's final message on every turn; default `Done.`. */
1026
1261
  text?: string;
1027
1262
  /** Simulated turn length, honours the abort signal. */
1028
1263
  delayMs?: number;
@@ -1074,10 +1309,11 @@ type FakeHarnessDescriptor = {
1074
1309
  * Behave like this agent: its image, and where it reads rules and skills (`CLAUDE.md` and
1075
1310
  * `.claude/skills` for `claude-code`, `~/.gemini/config/skills` for `antigravity`,
1076
1311
  * `~/.config/opencode/skills` for `opencode`, Goose's private home for `goose`,
1077
- * `~/.pi/agent/skills` for `pi`, `~/.agents/skills` for `codex`). Defaults to the
1078
- * fake's own (`AGENTS.md`, `.agents/skills`) in Cursor's image.
1312
+ * `~/.pi/agent/skills` for `pi`, `~/.agents/skills` for `codex`, fx's private home for
1313
+ * `fx`, Grok's private home for `grok-build`). Defaults to the fake's own (`AGENTS.md`,
1314
+ * `.agents/skills`) in Cursor's image.
1079
1315
  */
1080
- layout?: 'cursor' | 'claude-code' | 'antigravity' | 'opencode' | 'goose' | 'pi' | 'codex';
1316
+ layout?: 'cursor' | 'claude-code' | 'antigravity' | 'opencode' | 'goose' | 'pi' | 'codex' | 'fx' | 'grok-build';
1081
1317
  };
1082
1318
  /**
1083
1319
  * One action of a scripted fake agent. `exec` is reported as a `shell` tool call whose output is
@@ -1125,16 +1361,18 @@ type CursorHarnessDescriptor = {
1125
1361
  */
1126
1362
  startTimeout?: Duration;
1127
1363
  };
1364
+ /** Reasoning effort the Claude Code Agent SDK `/effort` control takes. */
1365
+ type ClaudeCodeEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';
1128
1366
  /** Claude Code through `@ai-sdk/harness-claude-code`, made by `claudeCode()`. */
1129
1367
  type ClaudeCodeHarnessDescriptor = {
1130
1368
  kind: 'claude-code';
1131
1369
  /** A model id or alias the `claude` CLI accepts, e.g. `claude-sonnet-5` or `sonnet`. */
1132
1370
  model: string;
1133
1371
  /**
1134
- * Reasoning effort the Agent SDK `/effort` control takes, e.g. `low`, `medium`, `high`,
1372
+ * Reasoning effort the Agent SDK `/effort` control takes: `low`, `medium`, `high`,
1135
1373
  * `xhigh` (Extra in the UI) or `max`.
1136
1374
  */
1137
- effort?: string;
1375
+ effort?: ClaudeCodeEffort;
1138
1376
  /** Cell id; defaults to `claude-code:<model>`, or `claude-code:<model>[effort=<value>]` when `effort` is set. */
1139
1377
  id?: string;
1140
1378
  /** The most Claude Code attempts at once, across the run, e.g. for the account's rate limits. */
@@ -1261,28 +1499,82 @@ type CodexHarnessDescriptor = {
1261
1499
  */
1262
1500
  startTimeout?: Duration;
1263
1501
  };
1502
+ /**
1503
+ * fx through `@reeval/harness-fx` (`fx acp`), made by `fx()`. It runs on Vercel AI Gateway or
1504
+ * OpenAI's API by the model id, and reports each turn's tokens.
1505
+ */
1506
+ type FxHarnessDescriptor = {
1507
+ kind: 'fx';
1508
+ /**
1509
+ * A Vercel AI Gateway model id, `<provider>/<model>`, run on fx's `gateway` provider with
1510
+ * `AI_GATEWAY_API_KEY`, e.g. `anthropic/claude-sonnet-5`; or a bare OpenAI model id, run on
1511
+ * OpenAI's Chat Completions API with `OPENAI_API_KEY`, e.g. `gpt-4.1`.
1512
+ */
1513
+ model: string;
1514
+ /** Cell id; defaults to `fx:<model>`. */
1515
+ id?: string;
1516
+ /** The most fx attempts at once, across the run, e.g. for the key's rate limits. */
1517
+ maxConcurrent?: number;
1518
+ /**
1519
+ * How long the harness's session may take to become ready (its bootstrap and first session)
1520
+ * before the attempt is an infra error, after one retry; default 90s.
1521
+ */
1522
+ startTimeout?: Duration;
1523
+ };
1524
+ /**
1525
+ * xAI's Grok Build through `@reeval/harness-grok-build` (`grok agent stdio`), made by
1526
+ * `grokBuild()`. It runs xAI models on an xAI API key and reports each turn's tokens.
1527
+ */
1528
+ type GrokBuildHarnessDescriptor = {
1529
+ kind: 'grok-build';
1530
+ /** An xAI model id Grok Build runs on the xAI API, e.g. `grok-4.6`. */
1531
+ model: string;
1532
+ /**
1533
+ * Reasoning effort as Grok's `default_reasoning_effort`, e.g. `low`, `medium` or `high`, for a
1534
+ * model that takes one.
1535
+ */
1536
+ effort?: string;
1537
+ /** Cell id; defaults to `grok-build:<model>`, or `grok-build:<model>[effort=<value>]` when `effort` is set. */
1538
+ id?: string;
1539
+ /** The most Grok Build attempts at once, across the run, e.g. for the key's rate limits. */
1540
+ maxConcurrent?: number;
1541
+ /**
1542
+ * How long the harness's session may take to become ready (its bootstrap and first session)
1543
+ * before the attempt is an infra error, after one retry; default 90s.
1544
+ */
1545
+ startTimeout?: Duration;
1546
+ };
1264
1547
  /** A real coding agent, driven through its AI SDK harness adapter. */
1265
- type AgentHarnessDescriptor = CursorHarnessDescriptor | ClaudeCodeHarnessDescriptor | AntigravityHarnessDescriptor | OpenCodeHarnessDescriptor | GooseHarnessDescriptor | PiHarnessDescriptor | CodexHarnessDescriptor;
1548
+ type AgentHarnessDescriptor = CursorHarnessDescriptor | ClaudeCodeHarnessDescriptor | AntigravityHarnessDescriptor | OpenCodeHarnessDescriptor | GooseHarnessDescriptor | PiHarnessDescriptor | CodexHarnessDescriptor | FxHarnessDescriptor | GrokBuildHarnessDescriptor;
1549
+ /** The agent an attempt runs: a real harness, or the fake one. */
1266
1550
  type HarnessDescriptor = FakeHarnessDescriptor | AgentHarnessDescriptor;
1551
+ /** A temp directory on the host instead of a container, made by `fakeSandbox()`. */
1267
1552
  type FakeSandboxDescriptor = {
1268
1553
  kind: 'fake';
1554
+ /** Cell id; defaults to `fake`. */
1269
1555
  id?: string;
1270
1556
  /** Parent directory for the per-eval workspace (defaults to the OS temp dir). */
1271
1557
  dir?: string;
1272
1558
  /** The most attempts on this sandbox kind at once, across the run. */
1273
1559
  maxConcurrent?: number;
1274
1560
  };
1561
+ /** A local Docker container, made by `docker()`, or a Podman one, made by `podman()`. */
1275
1562
  type DockerSandboxDescriptor = {
1276
1563
  kind: 'docker';
1277
- /** Cell id; defaults to `docker`, or `docker:<image>` for other images, plus an install hash. */
1564
+ /** The container CLI the sandbox runs on: `podman` for `podman()`, Docker when unset. */
1565
+ engine?: 'docker' | 'podman';
1566
+ /**
1567
+ * Cell id; defaults to `docker` (`podman`), or `docker:<image>` for other images, plus an
1568
+ * install hash.
1569
+ */
1278
1570
  id?: string;
1279
1571
  /** An image that already has the harness baked in, used as is. */
1280
1572
  image?: string;
1281
1573
  /** A Debian or Ubuntu based toolchain image; reeval bakes Node and the harness on top, cached. */
1282
1574
  from?: string;
1283
1575
  /**
1284
- * An absolute path to a Dockerfile (`docker()` resolves it against the calling file), built from
1285
- * its directory with `REEVAL_BASE` set to reeval's sandbox image and cached by content hash.
1576
+ * A Dockerfile, absolute or relative to the directory of the file it's written in, built from its
1577
+ * directory with `REEVAL_BASE` set to reeval's sandbox image and cached by content hash.
1286
1578
  */
1287
1579
  dockerfile?: string;
1288
1580
  /** Baked onto the sandbox image in one build container: in order, no secrets, no workspace. */
@@ -1296,8 +1588,13 @@ type DockerSandboxDescriptor = {
1296
1588
  root?: boolean;
1297
1589
  /** Linux capabilities to add back, e.g. `['NET_RAW']`; every other one is dropped. */
1298
1590
  capabilities?: string[];
1299
- /** The container's memory, with no swap on top: `'4g'` (default), `'512m'`, or bytes. */
1591
+ /** The container's memory: `'4g'` (default), `'512m'`, or bytes. */
1300
1592
  memory?: string | number;
1593
+ /**
1594
+ * Swap on top of `memory`, in the same units. Default: as much as `memory`; `0` makes `memory`
1595
+ * the hard ceiling. A host without swap has none to give.
1596
+ */
1597
+ swap?: string | number;
1301
1598
  /** CPUs the container may use, fractions allowed. Default 2, capped at the Docker host's. */
1302
1599
  cpus?: number;
1303
1600
  /** Processes and threads at once. Default 1024. */
@@ -1335,13 +1632,17 @@ type SecretOptions = {
1335
1632
  /** `secret.template('Bearer ${TOKEN}')`: host variables substituted into a string, for MCP headers. */
1336
1633
  type SecretTemplate = {
1337
1634
  kind: 'secret-template';
1635
+ /** The string, with `${NAME}` for each host variable to substitute. */
1338
1636
  template: string;
1339
1637
  };
1638
+ /** A variable's value: a literal string, or a host secret. */
1340
1639
  type EnvValue = string | Secret;
1640
+ /** Environment variables by name. */
1341
1641
  type EnvVars = Record<string, EnvValue>;
1342
1642
  /** A file on the host, read when an attempt starts. Made by the `file` helper. */
1343
1643
  type HostFile = {
1344
1644
  kind: 'file';
1645
+ /** Its path on the host, absolute or relative to the directory of the file it's written in. */
1345
1646
  path: string;
1346
1647
  };
1347
1648
  /** Options for the `directory` helper. */
@@ -1359,62 +1660,92 @@ type DirectoryOptions = {
1359
1660
  /** `false` walks into `DEFAULT_DIRECTORY_IGNORES` too. `.git` is always skipped. */
1360
1661
  defaultIgnores?: boolean;
1361
1662
  };
1663
+ /** An MCP server the agent gets, made by the `mcp` helper: a command in the sandbox, or a URL. */
1362
1664
  type McpServer = {
1363
1665
  kind: 'mcp';
1364
1666
  transport: 'stdio';
1667
+ /** The command that starts the server in the sandbox. */
1365
1668
  command: string;
1366
1669
  args: string[];
1670
+ /** Variables the server process gets. */
1367
1671
  env: EnvVars;
1368
1672
  } | {
1369
1673
  kind: 'mcp';
1674
+ /** Streamable HTTP, or the older SSE transport. */
1370
1675
  transport: 'http' | 'sse';
1371
1676
  url: string;
1677
+ /** Request headers, with secrets brokered by the egress gateway. */
1372
1678
  headers: Record<string, string | Secret | SecretTemplate>;
1373
1679
  };
1374
1680
  /** `harness` (default): the agent's own skills, via its adapter. `workspace`: its repo skill dir. */
1375
1681
  type SkillPlacement = 'harness' | 'workspace';
1682
+ /** Skills to place for the agent, made by the `skill` helper. */
1376
1683
  type SkillSource = {
1377
1684
  kind: 'skill';
1378
1685
  placement: SkillPlacement;
1379
1686
  } & ({
1380
1687
  source: 'local';
1688
+ /** A host directory with a `SKILL.md`, or a directory of them. */
1381
1689
  path: string;
1690
+ /** The skill names to keep; default every one found. */
1382
1691
  only?: string[];
1692
+ /** Paths in each skill directory to leave out, gitignore-style. */
1383
1693
  exclude?: string[];
1384
1694
  } | {
1385
1695
  source: 'git';
1696
+ /** As written: a URL, `github:owner/repo`, or a GitHub `/tree/<ref>/<path>` URL. */
1386
1697
  repo: string;
1698
+ /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
1387
1699
  ref?: string;
1700
+ /** The directory in the repository to read skills from. */
1388
1701
  path?: string;
1702
+ /** The skill names to keep; default every one found. */
1389
1703
  only?: string[];
1704
+ /** Paths in each skill directory to leave out, gitignore-style. */
1390
1705
  exclude?: string[];
1391
1706
  } | {
1392
1707
  source: 'registry';
1708
+ /** A skills.sh id, `owner/repo@skill`. */
1393
1709
  id: string;
1710
+ /** A git ref of the skill's repository. */
1394
1711
  version?: string;
1395
1712
  } | {
1396
1713
  source: 'npm';
1714
+ /** A pinned npm package spec. */
1397
1715
  spec: string;
1716
+ /** The directory in the package to read skills from; default `skills`. */
1398
1717
  path: string;
1718
+ /** The skill names to keep; default every one found. */
1399
1719
  only?: string[];
1720
+ /** Paths in each skill directory to leave out, gitignore-style. */
1400
1721
  exclude?: string[];
1401
1722
  } | {
1402
1723
  source: 'inline';
1724
+ /** The skill's name, as in `SKILL.md`'s frontmatter. */
1403
1725
  name: string;
1726
+ /** The skill's description, as in `SKILL.md`'s frontmatter. */
1404
1727
  description: string;
1728
+ /** The body of `SKILL.md`. */
1405
1729
  content: string;
1730
+ /** Other files in the skill directory, by relative path. */
1406
1731
  files: Record<string, string>;
1407
1732
  });
1408
1733
  /** A `docker({ install })` command, baked into a cached image layer: no secrets, root, cwd `/`. */
1409
1734
  type InstallStep = string | {
1735
+ /** The shell command. */
1410
1736
  run: string;
1411
1737
  timeout?: Duration;
1412
1738
  };
1413
- /** Runs in every attempt before the agent starts, with secrets, outside the eval timeout. */
1414
- /** A shell command, or `{ run, timeout?, cwd? }`; `cwd` is relative to the workspace or absolute. */
1739
+ /**
1740
+ * Runs in every attempt before the agent starts, with secrets, outside the eval timeout: a shell
1741
+ * command, or `{ run, timeout?, cwd? }`.
1742
+ */
1415
1743
  type SetupStep = string | {
1744
+ /** The shell command. */
1416
1745
  run: string;
1746
+ /** Default 5m. */
1417
1747
  timeout?: Duration;
1748
+ /** Relative to the workspace, or absolute; default the workspace. */
1418
1749
  cwd?: string;
1419
1750
  };
1420
1751
  /**
@@ -1434,6 +1765,7 @@ type GitWorkspace = {
1434
1765
  kind: 'git';
1435
1766
  /** As written: a URL, `github:owner/repo`, or a local path. */
1436
1767
  repo: string;
1768
+ /** What reeval fetches: the clone URL, or an absolute path for a local repository. */
1437
1769
  url: string;
1438
1770
  /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
1439
1771
  ref?: string;
@@ -1459,6 +1791,7 @@ type EnvironmentSpec = {
1459
1791
  sandbox?: SandboxDescriptor;
1460
1792
  /** The code the workspace starts as, before `files`, `rules` and `setup`; a child's replaces its parent's. */
1461
1793
  workspace?: GitWorkspace;
1794
+ /** Variables and secrets for the sandbox, merged by name over the parent's. */
1462
1795
  env?: EnvVars;
1463
1796
  /** Replaces the inherited policy; an `extend` child's replaces its parent's. */
1464
1797
  egress?: EgressPolicy;
@@ -1466,13 +1799,18 @@ type EnvironmentSpec = {
1466
1799
  files?: Record<string, string | HostFile>;
1467
1800
  /** Project rules, written where the harness's agent reads them: `AGENTS.md`, or `CLAUDE.md` for Claude Code. */
1468
1801
  rules?: string | HostFile;
1802
+ /** Shell commands run in every attempt before the agent starts; a child's run after its parent's. */
1469
1803
  setup?: SetupStep[];
1804
+ /** Skills placed for the agent. */
1470
1805
  skills?: SkillSource[];
1806
+ /** MCP servers the agent gets, by name. */
1471
1807
  mcp?: Record<string, McpServer>;
1472
1808
  };
1473
1809
  /** One environment in an `extend` chain. */
1474
1810
  type EnvironmentLayer = {
1811
+ /** The name passed to `defineEnvironment` or `extend`. */
1475
1812
  name: string;
1813
+ /** The spec as that layer wrote it, before merging. */
1476
1814
  spec: EnvironmentSpec;
1477
1815
  };
1478
1816
  /**
@@ -1481,7 +1819,9 @@ type EnvironmentLayer = {
1481
1819
  */
1482
1820
  type Environment = {
1483
1821
  readonly kind: 'environment';
1822
+ /** The name it was defined or extended under, which names its cells. */
1484
1823
  readonly name: string;
1824
+ /** Its `extend` chain, root first. */
1485
1825
  readonly layers: readonly EnvironmentLayer[];
1486
1826
  /**
1487
1827
  * A child environment layered on this one; wherever it sets a key this one has, it wins.
@@ -1617,14 +1957,71 @@ type CompareOptions<E = Environment> = {
1617
1957
  };
1618
1958
  /**
1619
1959
  * A question for pairwise judgement: its text, or the text and the `'provider/model'` that
1620
- * answers it. Without a model, `analysis.model` answers, else the judge's when it's a language model.
1960
+ * answers it. Without a model, the cascaded `question.model` answers, else `analysis.model`, else the
1961
+ * judge's when it's a language model.
1621
1962
  * `across` is the factor it varies when pairing; without it (and without a one-factor
1622
- * `compare.across`) both pair kinds run.
1963
+ * `compare.across`) both pair kinds run. `state` and `artifacts` choose what each side shows.
1623
1964
  */
1624
1965
  type CompareQuestion = string | {
1625
1966
  question: string;
1967
+ /** `'provider/model'` that answers it, over the cascaded `question.model`. */
1626
1968
  model?: string;
1969
+ /** The factor it varies when pairing. */
1627
1970
  across?: PairFactor;
1971
+ /** What each side shows, over the cascaded `question.state`, key by key. */
1972
+ state?: QuestionStateOptions;
1973
+ /** Each side's own captures, by name; `true` sends all of them. Replaces `question.artifacts`. */
1974
+ artifacts?: true | string[];
1975
+ };
1976
+ /**
1977
+ * What each side of a compare question shows: the keys of `judge.state` but `contents` (the
1978
+ * attempts' workspaces are gone when questions are asked). An unset key keeps its default, which
1979
+ * is what a question shows with no `state` at all: the task and the diff.
1980
+ */
1981
+ type QuestionStateOptions = {
1982
+ /** The prompts the attempt was sent, once for both sides when they match. Default true. */
1983
+ task?: boolean;
1984
+ /** The final message: the agent's own account of its work. Default false. */
1985
+ output?: boolean;
1986
+ /** `status path` lines for the changed files, under `diff`'s patterns. Default false. */
1987
+ files?: boolean;
1988
+ /**
1989
+ * The diff since the eval started. A list is gitignore-style patterns over workspace paths:
1990
+ * the last matching pattern wins and `!` excludes. Default true.
1991
+ */
1992
+ diff?: boolean | string[];
1993
+ /**
1994
+ * The transcript as text lines: `true` is messages and tool calls with tool output clipped,
1995
+ * `'tools'` tool calls only, `'full'` adds reasoning and whole tool output. It names each
1996
+ * harness's tools, so a pair of two harnesses isn't blind. Default false.
1997
+ */
1998
+ transcript?: boolean | 'tools' | 'full';
1999
+ /**
2000
+ * `'all'`: every turn under `turns`, each with its task, output and (with `transcript`)
2001
+ * transcript; `'last'`: the last turn only. Default `'all'`.
2002
+ */
2003
+ turns?: 'last' | 'all';
2004
+ /** `c.exec` results; a list shows only those commands, as passed to `c.exec`. Default false. */
2005
+ checks?: boolean | string[];
2006
+ };
2007
+ /** `QuestionStateOptions` with every key set: what each side of one question showed. */
2008
+ type ResolvedQuestionStateOptions = {
2009
+ task: boolean;
2010
+ output: boolean;
2011
+ files: boolean;
2012
+ diff: boolean | string[];
2013
+ transcript: boolean | 'tools' | 'full';
2014
+ turns: 'last' | 'all';
2015
+ checks: boolean | string[];
2016
+ };
2017
+ /** Defaults for every compare question: `model` and `artifacts` replaced, `state` merged key by key. */
2018
+ type QuestionOptions = {
2019
+ /** `'provider/model'` that answers every question below it without its own `model`. */
2020
+ model?: string;
2021
+ /** What each side shows. */
2022
+ state?: QuestionStateOptions;
2023
+ /** Each side's own captures, by name; `true` sends all of them. Default none. */
2024
+ artifacts?: true | string[];
1628
2025
  };
1629
2026
  /** A matrix factor a compare question varies when pairing; the others are held. */
1630
2027
  type PairFactor = 'environment' | 'harness';
@@ -1649,6 +2046,11 @@ type PairVote = {
1649
2046
  swapped: boolean;
1650
2047
  /** The model's short reason for this pick; omitted when it gave none. Capped. */
1651
2048
  reason?: string;
2049
+ /** The captures each named side showed, by name; set when the question sends `artifacts`. */
2050
+ artifacts?: {
2051
+ a: string[];
2052
+ b: string[];
2053
+ };
1652
2054
  };
1653
2055
  /** A compare question's answer: every vote, and each side's wins over decided votes per cut. */
1654
2056
  type CompareAnswer = {
@@ -1657,6 +2059,10 @@ type CompareAnswer = {
1657
2059
  model: string;
1658
2060
  /** The model id the provider says served the calls, when it reports one. */
1659
2061
  resolvedModel?: string;
2062
+ /** What each side showed, every key resolved; unset on answers from before questions took `state`, which showed the defaults. */
2063
+ stateOptions?: ResolvedQuestionStateOptions;
2064
+ /** The captures it sent of each side, as asked: `true` for all, or their names. */
2065
+ artifacts?: true | string[];
1660
2066
  votes: PairVote[];
1661
2067
  /** Wins over decided pairs, per named side, per cut. */
1662
2068
  rates: Array<{
@@ -1667,11 +2073,15 @@ type CompareAnswer = {
1667
2073
  }>;
1668
2074
  /** Why some or all of its votes are missing: the model call failed. Outcomes never change. */
1669
2075
  error?: string;
2076
+ /** `questions/<n>.json` under the eval's directory: what the model was sent, per pair and order. */
2077
+ input?: FileRef;
1670
2078
  };
2079
+ /** An option a profile's `limit` can narrow, and `pin` can protect. */
1671
2080
  type PinnableKey = 'harness' | 'runs' | 'compare';
1672
2081
  /**
1673
2082
  * How a cell's attempts decide its outcome: `'all'` (the default) passes only when every attempt
1674
- * passes; `{ passRate }` passes when at least that share of its passes and fails are passes.
2083
+ * passes (pass^k); `{ passRate }` passes when its pass@1 (passes over passes and fails) is at
2084
+ * least that share.
1675
2085
  */
1676
2086
  type GatePolicy = 'all' | {
1677
2087
  passRate: number;
@@ -1682,7 +2092,7 @@ type CellGate = GatePolicy | 'none';
1682
2092
  type CompareSpec<E = Environment> = CompareOptions<E>;
1683
2093
  /** Options other than `environment` and `compare`, which are exclusive of each other. */
1684
2094
  type EvalOptionFields = {
1685
- /** The only list: each harness is its own cell. */
2095
+ /** Which agents run the eval; each harness is its own cell. */
1686
2096
  harness?: HarnessOption;
1687
2097
  /**
1688
2098
  * The default machine when the resolved environment omits `sandbox`. Cascades like `harness`.
@@ -1700,11 +2110,15 @@ type EvalOptionFields = {
1700
2110
  * environment, then groups and the eval.
1701
2111
  */
1702
2112
  egress?: EgressPolicy;
2113
+ /** Defaults for `c.judge()`, merged field by field down the cascade. */
1703
2114
  judge?: JudgeOptions;
1704
2115
  /** Screenshot defaults for `c.capture()`. Shallow-merged; `viewport` and `model` replace the value. */
1705
2116
  capture?: CaptureOptions;
2117
+ /** Defaults for every compare question: `model`, and `state` merged key by key, down the cascade. */
2118
+ question?: QuestionOptions;
1706
2119
  /** Per attempt. */
1707
2120
  timeout?: Duration;
2121
+ /** Labels for `--tag` and profiles to select by; a group's are added to its evals'. */
1708
2122
  tags?: string[];
1709
2123
  /** Keys a profile's `limit` may not narrow for this group or eval. */
1710
2124
  pin?: PinnableKey[];
@@ -1722,20 +2136,36 @@ type EnvironmentOrCompare<E> = {
1722
2136
  } | {
1723
2137
  /** Forbidden beside `compare.baseline`, which names the control. */
1724
2138
  environment?: never;
2139
+ /** Environments to run side by side; `baseline` is the control. */
1725
2140
  compare: CompareSpec<E> & {
1726
2141
  baseline: E;
1727
2142
  };
1728
2143
  } | {
1729
2144
  /** The control: the compare has no `baseline`. */
1730
2145
  environment?: E;
2146
+ /** Environments to run side by side against `environment`, the control. */
1731
2147
  compare: CompareSpec<E> & {
1732
2148
  baseline?: undefined;
1733
2149
  };
1734
2150
  };
1735
2151
  type EvalOptions = EvalOptionFields & EnvironmentOrCompare<Environment>;
1736
2152
  type GroupOptions = EvalOptions;
2153
+ /**
2154
+ * `EvalOptions` in their data forms, as JSON carries them: the harness as data, the judge's model
2155
+ * by name or a fake judge, and environments without `extend`. The same `environment` / compare
2156
+ * object split as `EvalOptions`.
2157
+ */
2158
+ type EvalOptionsData = Omit<EvalOptionFields, 'harness' | 'judge'> & {
2159
+ /** Which agents run the eval; each harness is its own cell. */
2160
+ harness?: HarnessData;
2161
+ /** Defaults for `c.judge()`, merged field by field down the cascade. */
2162
+ judge?: ConfigJudgeOptions;
2163
+ } & EnvironmentOrCompare<EnvironmentData>;
2164
+ /** An `Environment` as data, as JSON carries it: without `extend` / `extendEnvironment`. */
2165
+ type EnvironmentData = Omit<Environment, 'extendEnvironment' | 'extend'>;
1737
2166
  /** The config file is plain data sent to workers, so its judge model can't be an object. */
1738
2167
  type ConfigJudgeOptions = Omit<JudgeOptions, 'model'> & {
2168
+ /** `'provider/model'`, or a fake judge. */
1739
2169
  model?: string | FakeJudgeModel;
1740
2170
  };
1741
2171
  type HistoryConfig = {
@@ -1746,22 +2176,35 @@ type HistoryConfig = {
1746
2176
  };
1747
2177
  /** Run-level caps. `attempts` is checked against the plan; `duration` while running. */
1748
2178
  type Budget = {
2179
+ /** The most attempts the plan may have. */
1749
2180
  attempts?: number;
2181
+ /** How long the run may go on, from the first attempt's start. */
1750
2182
  duration?: Duration;
1751
2183
  };
1752
2184
  /** What evals get when they don't say otherwise: under groups and evals. */
1753
2185
  type ProfileDefaults = {
2186
+ /** The agents every eval runs on, unless a group or eval replaces them. */
1754
2187
  harness?: HarnessDescriptor | HarnessDescriptor[];
1755
2188
  /** The default machine when the resolved environment omits `sandbox`. */
1756
2189
  sandbox?: SandboxDescriptor;
2190
+ /** What every eval runs in when it names no environment. */
1757
2191
  environment?: Environment;
2192
+ /** Attempts per cell. */
1758
2193
  runs?: number;
2194
+ /** How each cell's attempts decide its outcome. */
1759
2195
  gate?: GatePolicy;
2196
+ /** Variables and secrets for the sandbox, merged by name over the config's. */
1760
2197
  env?: EnvVars;
2198
+ /** Where the sandbox may connect; replaces the config's policy. */
1761
2199
  egress?: EgressPolicy;
2200
+ /** Defaults for `c.judge()`, merged field by field over the config's. */
1762
2201
  judge?: ConfigJudgeOptions;
2202
+ /** Per attempt. */
1763
2203
  timeout?: Duration;
2204
+ /** Screenshot defaults for `c.capture()`, shallow-merged over the config's. */
1764
2205
  capture?: CaptureOptions;
2206
+ /** Defaults for every compare question, merged over the config's. */
2207
+ question?: QuestionOptions;
1765
2208
  };
1766
2209
  /** Over every eval, and it can only narrow; `pin` on a group or eval skips it. */
1767
2210
  type ProfileLimit = {
@@ -1776,10 +2219,15 @@ type ProfileLimit = {
1776
2219
  };
1777
2220
  /** How a run is sized: chosen with `--profile`, `REEVAL_PROFILE` or `defaultProfile`. */
1778
2221
  type Profile = {
2222
+ /** What evals get when they don't say otherwise: under groups and evals. */
1779
2223
  defaults?: ProfileDefaults;
2224
+ /** Caps over every eval, which only narrow; `pin` on a group or eval skips them. */
1780
2225
  limit?: ProfileLimit;
2226
+ /** Judge settings for this profile, the same as `defaults.judge`, which wins field by field. */
1781
2227
  judge?: ConfigJudgeOptions;
2228
+ /** Merged over the config's `budget`. */
1782
2229
  budget?: Budget;
2230
+ /** When this profile's runs are copied into the history folder. */
1783
2231
  record?: RecordMode;
1784
2232
  /** Tag filters for this profile, like `--tag` (`'!slow'` excludes). */
1785
2233
  tags?: string[];
@@ -1823,12 +2271,48 @@ type FakePick = FakeVote | {
1823
2271
  winner: FakeVote;
1824
2272
  reason?: string;
1825
2273
  };
1826
- /** What a compare question's model is shown: the prompt, and the two diffs in slot order. */
2274
+ /** What a compare question's model is shown: the prompt, and the two sides in slot order. */
1827
2275
  type BlindPair = {
1828
2276
  question: string;
1829
2277
  prompt: string;
1830
- a: string;
1831
- b: string;
2278
+ a: BlindSide;
2279
+ b: BlindSide;
2280
+ };
2281
+ /** A turn of one side, with the keys its question's `state` turned on. */
2282
+ type BlindTurn = {
2283
+ task?: string;
2284
+ output?: string;
2285
+ transcript?: string;
2286
+ };
2287
+ /**
2288
+ * One side of a blinded pair: only the keys its question's `state` turned on. With
2289
+ * `turns: 'all'`, `task`, `output` and `transcript` are under `turns`; a task both sides share is
2290
+ * the pair's prompt's, not either side's.
2291
+ */
2292
+ type BlindSide = BlindTurn & {
2293
+ turns?: BlindTurn[];
2294
+ files?: string[];
2295
+ /** The diff as the model sees it: dependency and binary noise dropped. */
2296
+ diff?: string;
2297
+ /** A command the other side ran and this one didn't is `{ command, notRun: true }`. */
2298
+ checks?: Array<{
2299
+ command: string;
2300
+ exitCode: number;
2301
+ stdout: string;
2302
+ stderr: string;
2303
+ } | {
2304
+ command: string;
2305
+ notRun: true;
2306
+ }>;
2307
+ /** Its captures, in the order sent, labelled by position; a name it lacks is `missing`. */
2308
+ artifacts?: Array<{
2309
+ label: string;
2310
+ mediaType: 'image/png';
2311
+ bytes: number;
2312
+ } | {
2313
+ label: string;
2314
+ missing: true;
2315
+ }>;
1832
2316
  };
1833
2317
  /** `reeval analyze`: a language model (not an evaluation model) and what matters in this project. */
1834
2318
  type AnalysisConfig = {
@@ -1846,33 +2330,46 @@ type AnalysisConfig = {
1846
2330
  /** The most tokens the model may answer with (default 8000). reeval has no prices, so tokens are the cap. */
1847
2331
  maxOutputTokens?: number;
1848
2332
  };
1849
- type EsConfig = {
2333
+ type ReevalConfig = {
2334
+ /** Globs of eval files, relative to the config's directory; default every `.eval.ts` under `evals`. */
1850
2335
  include?: string[];
2336
+ /** The agents every eval runs on, unless a group or eval replaces them; default Cursor. */
1851
2337
  harness?: HarnessDescriptor | HarnessDescriptor[];
1852
2338
  /**
1853
2339
  * The default machine when the resolved environment omits `sandbox`. Not an environment:
1854
2340
  * it does not invent skills, files or a name. Implicit `docker()` when nobody sets one.
1855
2341
  */
1856
2342
  sandbox?: SandboxDescriptor;
2343
+ /** What every eval runs in when it names no environment, and a baseline-less compare's control. */
1857
2344
  environment?: Environment;
2345
+ /** Attempts per cell; default 1. */
1858
2346
  runs?: number;
1859
2347
  /** How each cell's attempts decide its outcome; default `'all'`. */
1860
2348
  gate?: GatePolicy;
2349
+ /** Variables and secrets for the sandbox, merged by name down the cascade. */
1861
2350
  env?: EnvVars;
2351
+ /** Where the sandbox may connect; default `'allow-all'`. */
1862
2352
  egress?: EgressPolicy;
2353
+ /** Defaults for `c.judge()`, merged field by field down the cascade. */
1863
2354
  judge?: ConfigJudgeOptions;
2355
+ /** Per attempt; default `'15m'`. */
1864
2356
  timeout?: Duration;
1865
2357
  /**
1866
2358
  * Screenshot defaults for `c.capture()`. `REEVAL_CAPTURE_BROWSER=0` refuses the host
1867
2359
  * binary when `c.capture()` runs; it does not change this object.
1868
2360
  */
1869
2361
  capture?: CaptureOptions;
2362
+ /** Defaults for every compare question: the model that answers it and what each side shows. Merged down the cascade. */
2363
+ question?: QuestionOptions;
1870
2364
  /** How many attempts run at once. `--concurrency` and `REEVAL_CONCURRENCY` override it. */
1871
2365
  concurrency?: number;
1872
2366
  /** When runs are copied into the history folder: `reeval record` only, in CI, or on every run. */
1873
2367
  record?: RecordMode;
2368
+ /** The history folder, and which attempts keep their artifacts there. */
1874
2369
  history?: HistoryConfig;
2370
+ /** Caps on a run; a profile's `budget` is merged over it. */
1875
2371
  budget?: Budget;
2372
+ /** Named presets of `defaults`, `limit`, `judge`, `budget`, `record` and `tags`. */
1876
2373
  profiles?: Record<string, Profile>;
1877
2374
  /** The profile when neither `--profile` nor `REEVAL_PROFILE` names one: `ci` when `CI` is set. */
1878
2375
  defaultProfile?: {
@@ -1891,6 +2388,7 @@ type EsConfig = {
1891
2388
  keep?: number;
1892
2389
  traceBufferMb?: number;
1893
2390
  };
2391
+ /** `reeval analyze`, compare questions without a model, and `agent`'s notes during a run. */
1894
2392
  analysis?: AnalysisConfig;
1895
2393
  };
1896
2394
  /** What a `defineConfig` callback gets: the environment helpers plus the run's context. */
@@ -1921,11 +2419,23 @@ type PrepareFailureRecord = {
1921
2419
  log: string | null;
1922
2420
  setBy: string[];
1923
2421
  };
1924
- /** Why an attempt failed; `prepare` when its sandbox couldn't be prepared. */
2422
+ /**
2423
+ * The sandbox ran out of a resource during the attempt: `oom` is the kernel killing `kills`
2424
+ * processes at its memory limit. The attempt is then an infra error, whatever its checks said.
2425
+ */
2426
+ type ResourceFailureRecord = {
2427
+ cause: 'oom';
2428
+ kills: number;
2429
+ };
2430
+ /**
2431
+ * Why an attempt failed; `prepare` when its sandbox couldn't be prepared, `resource` when it ran
2432
+ * out of one.
2433
+ */
1925
2434
  type AttemptError = {
1926
2435
  kind: ErrorKind;
1927
2436
  message: string;
1928
2437
  prepare?: PrepareFailureRecord;
2438
+ resource?: ResourceFailureRecord;
1929
2439
  };
1930
2440
  /** Where an eval's time went, in ms. `agentMs` is the harness turns; `diffMs` reading changes. */
1931
2441
  type PhaseTimings = {
@@ -2060,6 +2570,25 @@ type StartRetry = {
2060
2570
  /** How long it waited before giving up on that start. */
2061
2571
  waitedMs: number;
2062
2572
  };
2573
+ /** One `expect` or `expect.soft` matcher call an attempt made. */
2574
+ type AssertionRecord = {
2575
+ /**
2576
+ * `expect`'s second argument, or `<matcher> <first argument>` (or the command `c.exec` ran, or
2577
+ * the judge's question), cut at 60 characters; ` #2`, ` #3` on repeats within the attempt.
2578
+ */
2579
+ label: string;
2580
+ /** The eval gave the label. */
2581
+ labelled: boolean;
2582
+ /** `toHaveFile`, `not.toBe`, `resolves.toBe`, `poll.toBe`. */
2583
+ matcher: string;
2584
+ /** `error`: the matcher couldn't answer (a subject it can't read, an event the harness doesn't report). */
2585
+ status: 'pass' | 'fail' | 'error';
2586
+ soft: boolean;
2587
+ /** Why it failed or couldn't answer, cut at 1 KB. */
2588
+ message?: string;
2589
+ /** Async matchers only (`toHaveFile`, `toSucceed`, `.resolves`, `expect.poll`). */
2590
+ durationMs?: number;
2591
+ };
2063
2592
  /** Which environment ran as the control, so the studio can show it. */
2064
2593
  type EvalCompareMeta = {
2065
2594
  baseline: string;
@@ -2087,5 +2616,5 @@ type SandboxWarning = {
2087
2616
  message: string;
2088
2617
  };
2089
2618
  //#endregion
2090
- export { HarnessDescriptor as $, TOKENS_UNREPORTED as $t, DockerSandboxDescriptor as A, TurnData as At, EvalFn as B, FileRef as Bt, CompareOptions as C, SecretTemplate as Ct, CursorHarnessDescriptor as D, TokenUsage as Dt, ConfigJudgeOptions as E, SkillSource as Et, Environment as F, WebEventType as Ft, FakeJudgeModel as G, RunRecord as Gt, ExecResult as H, HistoryEntry as Ht, EnvironmentHelpers as I, ArtifactRef as It, FakeScriptStep as J, EFFORT_ALPHA as Jt, FakeNoteInput as K, StackSummary as Kt, EnvironmentInput as L, AttemptRecord as Lt, EgressPolicy as M, Verdict as Mt, EgressRecord as N, Viewport as Nt, Diff as O, TranscriptEvent as Ot, EnvVars as P, Wait as Pt, HarnessData as Q, Spread as Qt, EnvironmentSpec as R, CellRecord as Rt, CompareCut as S, Secret as St, ConfigHelpers as T, SetupStep as Tt, FakeAnalysisModel as U, JudgementRecord as Ut, EvalOptions as V, HistoryCell as Vt, FakeHarnessDescriptor as W, Lift as Wt, GooseHarnessDescriptor as X, EffortSample as Xt, FakeVote as Y, EffortContrast as Yt, GroupOptions as Z, EffortVerdict as Zt, Cell as _, Profile as _t, BackgroundHandle as a, effortChangeLabel as an, JudgeCallOptions as at, CodexHarnessDescriptor as b, SandboxDescriptor as bt, Capture as c, effortSample as cn, JudgeOptions as ct, CaptureOptions as d, formatCount as dn, OpenCodeHarnessDescriptor as dt, VERDICT_TEXT as en, HarnessEdit as et, CaptureUse as f, formatRatio as fn, Outcome as ft, CaptureWindow as g, PinnableKey as gt, CaptureWait as h, PiHarnessDescriptor as ht, AttemptContext as i, contrastEffort as in, JudgeArtifactRef as it, Duration as j, TurnStatus as jt, DirectoryOptions as k, Turn as kt, CaptureCall as l, effortSummary as ln, JudgeState as lt, CaptureUseScript as m, tokenValues as mn, PairVote as mt, AnalysisConfig as n, cellEffort as nn, HistoryConfig as nt, BlindPair as o, effortLabel as on, JudgeFailure as ot, CaptureUseAction as p, formatSeconds as pn, PairFactor as pt, FakeSandboxDescriptor as q, CellEffort as qt, AntigravityHarnessDescriptor as r, cellSamples as rn, HostFile as rt, Budget as s, effortOf as sn, JudgeModel as st, AgentHarnessDescriptor as t, cellContrast as tn, HarnessOption as tt, CaptureInstruction as u, effortVerdict as un, McpServer as ut, CellRole as v, ProfileDefaults as vt, CompareQuestion as w, ServeHandle as wt, CompareAnswer as x, SandboxWarning as xt, ClaudeCodeHarnessDescriptor as y, ProfileLimit as yt, EsConfig as z, EvalEntry as zt };
2091
- //# sourceMappingURL=types-_LOFdPUf.d.ts.map
2619
+ export { GrokBuildHarnessDescriptor as $, RunRecord as $t, DirectoryOptions as A, SetupStep as At, EvalFn as B, WebEventType as Bt, CompareCut as C, formatCount as Cn, ProfileLimit as Ct, ConfigJudgeOptions as D, Secret as Dt, ConfigHelpers as E, tokenValues as En, SandboxWarning as Et, EnvVars as F, TurnData as Ft, FakeHarnessDescriptor as G, FamilyLift as Gt, EvalOptionsData as H, AttemptRecord as Ht, Environment as I, TurnStatus as It, FakeSandboxDescriptor as J, FileRef as Jt, FakeJudgeModel as K, FamilyRate as Kt, EnvironmentHelpers as L, Verdict as Lt, Duration as M, TokenUsage as Mt, EgressPolicy as N, TranscriptEvent as Nt, CursorHarnessDescriptor as O, SecretTemplate as Ot, EgressRecord as P, Turn as Pt, GooseHarnessDescriptor as Q, Lift as Qt, EnvironmentInput as R, Viewport as Rt, CompareAnswer as S, effortVerdict as Sn, ProfileDefaults as St, CompareQuestion as T, formatSeconds as Tn, SandboxDescriptor as Tt, ExecResult as U, CellRecord as Ut, EvalOptions as V, ArtifactRef as Vt, FakeAnalysisModel as W, EvalEntry as Wt, FakeVote as X, HistoryEntry as Xt, FakeScriptStep as Y, HistoryCell as Yt, FxHarnessDescriptor as Z, JudgementRecord as Zt, Cell as _, effortChangeLabel as _n, PairFactor as _t, BackgroundHandle as a, EffortContrast as an, HistoryConfig as at, ClaudeCodeHarnessDescriptor as b, effortSample as bn, PinnableKey as bt, Capture as c, EffortVerdict as cn, JudgeCallOptions as ct, CaptureOptions as d, VERDICT_TEXT as dn, JudgeOptions as dt, StackSummary as en, GroupOptions as et, CaptureUse as f, cellContrast as fn, JudgeState as ft, CaptureWindow as g, directional as gn, Outcome as gt, CaptureWait as h, contrastEffort as hn, OpenCodeHarnessDescriptor as ht, AttemptContext as i, EFFORT_MIN_RUNS as in, HarnessOption as it, DockerSandboxDescriptor as j, SkillSource as jt, Diff as k, ServeHandle as kt, CaptureCall as l, Spread as ln, JudgeFailure as lt, CaptureUseScript as m, cellSamples as mn, McpServer as mt, AnalysisConfig as n, DIRECTIONAL_MIN as nn, HarnessDescriptor as nt, BlindPair as o, EffortMetric as on, HostFile as ot, CaptureUseAction as p, cellEffort as pn, JudgeStateOptions as pt, FakeNoteInput as q, FamilyRecord as qt, AntigravityHarnessDescriptor as r, EFFORT_ALPHA as rn, HarnessEdit as rt, Budget as s, EffortSample as sn, JudgeArtifactRef as st, AgentHarnessDescriptor as t, CellEffort as tn, HarnessData as tt, CaptureInstruction as u, TOKENS_UNREPORTED as un, JudgeModel as ut, CellRole as v, effortLabel as vn, PairVote as vt, CompareOptions as w, formatRatio as wn, ReevalConfig as wt, CodexHarnessDescriptor as x, effortSummary as xn, Profile as xt, ClaudeCodeEffort as y, effortOf as yn, PiHarnessDescriptor as yt, EnvironmentSpec as z, Wait as zt };
2620
+ //# sourceMappingURL=types-g17bRAzt.d.ts.map