reeval 0.9.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 (318) hide show
  1. package/README.md +42 -30
  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-6FefIhX7.js → agent-CURAwx_q.js} +6 -6
  8. package/dist/{agent-6FefIhX7.js.map → agent-CURAwx_q.js.map} +1 -1
  9. package/dist/{agent-WSmTaesf.js → agent-CaS_2Sce.js} +46 -15
  10. package/dist/agent-CaS_2Sce.js.map +1 -0
  11. package/dist/{analysis-DlGBDjTj.js → analysis-Bxub9LMT.js} +4 -4
  12. package/dist/{analysis-DlGBDjTj.js.map → analysis-Bxub9LMT.js.map} +1 -1
  13. package/dist/{assemble-BCZzTyR7.js → assemble-B9Alds-z.js} +69 -41
  14. package/dist/assemble-B9Alds-z.js.map +1 -0
  15. package/dist/assemble-J5MukZFY.js +1 -0
  16. package/dist/{client-Bbo9SPlK.js → assert-EUIoRdIt.js} +10 -113
  17. package/dist/assert-EUIoRdIt.js.map +1 -0
  18. package/dist/bridge/index.mjs +248 -55
  19. package/dist/{capture-Bp74Z6Fr.js → capture-CNb9SuU5.js} +145 -31
  20. package/dist/capture-CNb9SuU5.js.map +1 -0
  21. package/dist/capture-jquXZBKK.js +1 -0
  22. package/dist/{cli-CVrMh_qz.js → cli-D303Vj5N.js} +133 -115
  23. package/dist/cli-D303Vj5N.js.map +1 -0
  24. package/dist/{cli-spec-CKEYa8V2.js → cli-spec-BPZbQG2p.js} +36 -17
  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-CzIFp1JQ.js → command-BLfT7vnQ.js} +18 -17
  31. package/dist/command-BLfT7vnQ.js.map +1 -0
  32. package/dist/{command-C5xFPKHM.js → command-BT9a37ZR.js} +374 -72
  33. package/dist/command-BT9a37ZR.js.map +1 -0
  34. package/dist/{command-DUT5l13I.js → command-Bge8F7Ko.js} +316 -83
  35. package/dist/command-Bge8F7Ko.js.map +1 -0
  36. package/dist/command-BkFjijN2.js +1 -0
  37. package/dist/{command-BFP0hKEb.js → command-CMJtHKRa.js} +14 -14
  38. package/dist/{command-BFP0hKEb.js.map → command-CMJtHKRa.js.map} +1 -1
  39. package/dist/commands-1p-bIWhN.js +1 -0
  40. package/dist/{commands-CLmPBrTS.js → commands-BFx16WB8.js} +7 -7
  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-DbSMEVKs.js → context-C1mxXh80.js} +11 -3
  45. package/dist/context-C1mxXh80.js.map +1 -0
  46. package/dist/{db-CfQFwJtq.js → db-CdHizc4_.js} +455 -36
  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-CRQGQbIt.js → docker-7b_2SaH7.js} +22 -21
  53. package/dist/docker-7b_2SaH7.js.map +1 -0
  54. package/dist/{docker-DV2GNgle.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-DlKycx5H.js → doctor-BYNok4UO.js} +262 -83
  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-BhzNh7Yi.js → egress-C4PZTSSe.js} +146 -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/files-BAt0i00X.js +1 -0
  73. package/dist/{files-CSzVADHn.js → files-BXUdY8tr.js} +9 -8
  74. package/dist/{files-CSzVADHn.js.map → files-BXUdY8tr.js.map} +1 -1
  75. package/dist/files-BhyltlDB.js +1 -0
  76. package/dist/files-Bk1mC3AN.js +43 -0
  77. package/dist/files-Bk1mC3AN.js.map +1 -0
  78. package/dist/{files-DJUFg-4e.js → files-DQmHE7pb.js} +5 -5
  79. package/dist/{files-DJUFg-4e.js.map → files-DQmHE7pb.js.map} +1 -1
  80. package/dist/files-ZZPqfAo6.js +1 -0
  81. package/dist/harness-B8QC9u0O.js +323 -0
  82. package/dist/harness-B8QC9u0O.js.map +1 -0
  83. package/dist/harness.d.ts +16 -30
  84. package/dist/harness.js +1 -2
  85. package/dist/{header-CALhmafp.js → header-hK-Z_Po9.js} +2 -2
  86. package/dist/{header-CALhmafp.js.map → header-hK-Z_Po9.js.map} +1 -1
  87. package/dist/{images-BMgdpMAX.js → images-0On0cztu.js} +114 -45
  88. package/dist/images-0On0cztu.js.map +1 -0
  89. package/dist/index.d.ts +9 -37
  90. package/dist/index.js +6 -2138
  91. package/dist/{init-BIdLF0F9.js → init-B77Rpcqc.js} +26 -8
  92. package/dist/init-B77Rpcqc.js.map +1 -0
  93. package/dist/init-BrOWin3W.js +1 -0
  94. package/dist/{invocations-CLaL8AuW.js → invocations-DbGfBAA_.js} +4 -4
  95. package/dist/{invocations-CLaL8AuW.js.map → invocations-DbGfBAA_.js.map} +1 -1
  96. package/dist/{judge-CeYPN8P_.js → judge-DW_GDOmB.js} +11 -19
  97. package/dist/{judge-CeYPN8P_.js.map → judge-DW_GDOmB.js.map} +1 -1
  98. package/dist/judge.d.ts +2 -2
  99. package/dist/judge.js +1 -1
  100. package/dist/{live-S0qODb6o.js → live-jlfszAbb.js} +9 -20
  101. package/dist/live-jlfszAbb.js.map +1 -0
  102. package/dist/matchers-Ddmc2z7H.js +118 -0
  103. package/dist/matchers-Ddmc2z7H.js.map +1 -0
  104. package/dist/{model-DEQo3FkZ.js → model-DaVCY3rb.js} +2 -2
  105. package/dist/{model-DEQo3FkZ.js.map → model-DaVCY3rb.js.map} +1 -1
  106. package/dist/model-NM3ID0uR.js +1 -0
  107. package/dist/{model-B1BZoZ9b.js → model-h_cDtcRr.js} +18 -17
  108. package/dist/model-h_cDtcRr.js.map +1 -0
  109. package/dist/model-nwWJvaUR.js +1 -0
  110. package/dist/{model-BOnlAPzs.js → model-oqcDplJG.js} +111 -19
  111. package/dist/model-oqcDplJG.js.map +1 -0
  112. package/dist/{node-Co7EXge0.js → node-B3ydHo6t.js} +10 -47
  113. package/dist/node-B3ydHo6t.js.map +1 -0
  114. package/dist/object-CLf2-tNq.js +9 -0
  115. package/dist/object-CLf2-tNq.js.map +1 -0
  116. package/dist/{opencode-providers-ByD85Q0l.js → opencode-providers-J9colP0-.js} +96 -21
  117. package/dist/opencode-providers-J9colP0-.js.map +1 -0
  118. package/dist/options-Bh2W63dK.js +1119 -0
  119. package/dist/options-Bh2W63dK.js.map +1 -0
  120. package/dist/{pairs-DDsjgm5F.js → pairs-CnInRu-G.js} +76 -2
  121. package/dist/{pairs-DDsjgm5F.js.map → pairs-CnInRu-G.js.map} +1 -1
  122. package/dist/{patch-bDV8YFW0.js → patch-Zac5aIRM.js} +6 -6
  123. package/dist/{patch-bDV8YFW0.js.map → patch-Zac5aIRM.js.map} +1 -1
  124. package/dist/{plan-DUydFc_1.js → plan-C9Cy27Ay.js} +24 -9
  125. package/dist/plan-C9Cy27Ay.js.map +1 -0
  126. package/dist/preflight-CPWpQeBI.js +1 -0
  127. package/dist/{preflight-BkoSxf4C.js → preflight-D7iFPKeK.js} +8 -7
  128. package/dist/preflight-D7iFPKeK.js.map +1 -0
  129. package/dist/prepare-BGjePFQl.js +2 -0
  130. package/dist/{prepare-CUAWHebF.js → prepare-doGxaAGR.js} +38 -30
  131. package/dist/prepare-doGxaAGR.js.map +1 -0
  132. package/dist/{provenance-D7HK3vzt.js → provenance-DmE9uPVt.js} +3 -3
  133. package/dist/{provenance-D7HK3vzt.js.map → provenance-DmE9uPVt.js.map} +1 -1
  134. package/dist/provider-DehR4CMN.js +1 -0
  135. package/dist/providers-gDMko8fl.js +1 -0
  136. package/dist/providers-tAOD1NQN.js +165 -0
  137. package/dist/providers-tAOD1NQN.js.map +1 -0
  138. package/dist/{query-BjBMLa-C.js → query-Bes9Kh6Y.js} +3 -3
  139. package/dist/{query-BjBMLa-C.js.map → query-Bes9Kh6Y.js.map} +1 -1
  140. package/dist/query-C_G_svLU.js +1 -0
  141. package/dist/questions-DjAwMxZ3.js +524 -0
  142. package/dist/questions-DjAwMxZ3.js.map +1 -0
  143. package/dist/{record-BRP9vZrj.js → record-BKmMvZ6O.js} +9 -1
  144. package/dist/{record-BRP9vZrj.js.map → record-BKmMvZ6O.js.map} +1 -1
  145. package/dist/remote-HDRt16ew.js +378 -0
  146. package/dist/remote-HDRt16ew.js.map +1 -0
  147. package/dist/{results-Di7m8dQ3.js → results-DuauQI3Z.js} +4 -4
  148. package/dist/{results-Di7m8dQ3.js.map → results-DuauQI3Z.js.map} +1 -1
  149. package/dist/{resume-SUz1GskV.js → resume-BRfa8E_s.js} +10 -10
  150. package/dist/{resume-SUz1GskV.js.map → resume-BRfa8E_s.js.map} +1 -1
  151. package/dist/{root-CvdRlRZX.js → root-DICDHCtp.js} +4 -4
  152. package/dist/{root-CvdRlRZX.js.map → root-DICDHCtp.js.map} +1 -1
  153. package/dist/{runtime-DdsfnRz_.js → runtime-PX_oXiCS.js} +23 -71
  154. package/dist/runtime-PX_oXiCS.js.map +1 -0
  155. package/dist/sandbox-D3A8oUb7.js +70 -0
  156. package/dist/sandbox-D3A8oUb7.js.map +1 -0
  157. package/dist/sandbox.d.ts +19 -6
  158. package/dist/sandbox.js +1 -2
  159. package/dist/server-C7sg1ndo.js +1 -0
  160. package/dist/{server-BNnXtmS8.js → server-XDleKaF_.js} +11 -11
  161. package/dist/server-XDleKaF_.js.map +1 -0
  162. package/dist/shared-DYpIb1BI.js +166 -0
  163. package/dist/shared-DYpIb1BI.js.map +1 -0
  164. package/dist/{source-Dof0NQBm.js → source-C8xumIWj.js} +2 -2
  165. package/dist/{source-Dof0NQBm.js.map → source-C8xumIWj.js.map} +1 -1
  166. package/dist/source-fGd0SaKP.js +1 -0
  167. package/dist/{src-8rRXy4u9.js → src-B7treWa8.js} +1538 -180
  168. package/dist/src-B7treWa8.js.map +1 -0
  169. package/dist/{src-C1E9HDWO.js → src-C7_1SqDP.js} +3 -3
  170. package/dist/{src-C1E9HDWO.js.map → src-C7_1SqDP.js.map} +1 -1
  171. package/dist/{src-DDNXsD9H.js → src-CF17Ug08.js} +5 -4
  172. package/dist/src-CF17Ug08.js.map +1 -0
  173. package/dist/{src-C_4Umgh2.js → src-CFp86GtV.js} +52 -51
  174. package/dist/src-CFp86GtV.js.map +1 -0
  175. package/dist/src-C_lPtowT.js +2 -0
  176. package/dist/src-DIL0jST0.js +368 -0
  177. package/dist/src-DIL0jST0.js.map +1 -0
  178. package/dist/src-DNnG4e4R.js +2 -0
  179. package/dist/src-DTbrY1hi.js +2 -0
  180. package/dist/src-DdyJEh2v.js +2 -0
  181. package/dist/src-Dj9PAroc.js +2 -0
  182. package/dist/src-Du8H85Qq.js +2 -0
  183. package/dist/src-DvCg0NBs.js +324 -0
  184. package/dist/src-DvCg0NBs.js.map +1 -0
  185. package/dist/{src-COgE7991.js → src-DvK0EIZx.js} +5 -5
  186. package/dist/{src-COgE7991.js.map → src-DvK0EIZx.js.map} +1 -1
  187. package/dist/{src-DVy58-zZ.js → src-FGXhkEkH.js} +5 -5
  188. package/dist/{src-DVy58-zZ.js.map → src-FGXhkEkH.js.map} +1 -1
  189. package/dist/src-jzagbuqH.js +2 -0
  190. package/dist/src-ofUaYbuY.js +3 -0
  191. package/dist/src-pJZOrYR9.js +1 -0
  192. package/dist/{src-D95O-Smv.js → src-u8_ixn_F.js} +15 -11
  193. package/dist/src-u8_ixn_F.js.map +1 -0
  194. package/dist/{state-CiXyLqg0.js → state-C__9swoG.js} +35 -23
  195. package/dist/state-C__9swoG.js.map +1 -0
  196. package/dist/state-CeR6oz0k.js +66 -0
  197. package/dist/state-CeR6oz0k.js.map +1 -0
  198. package/dist/state-CgjQo29K.js +1 -0
  199. package/dist/studio-app/assets/index-CwQN3f_h.css +2 -0
  200. package/dist/studio-app/assets/{index-CROH2NB3.js → index-DrQc2Yxd.js} +11 -11
  201. package/dist/studio-app/index.html +2 -2
  202. package/dist/{summary-BTksrIxn.js → summary-BLAVLySU.js} +150 -19
  203. package/dist/summary-BLAVLySU.js.map +1 -0
  204. package/dist/{summary-2OAWF2N7.js → summary-DgyjUh_l.js} +7 -7
  205. package/dist/{summary-2OAWF2N7.js.map → summary-DgyjUh_l.js.map} +1 -1
  206. package/dist/testing.d.ts +3 -2
  207. package/dist/testing.js +3 -2
  208. package/dist/{tool-target-BU1JnSE9.js → tool-target-D2mcYlSQ.js} +14 -7
  209. package/dist/tool-target-D2mcYlSQ.js.map +1 -0
  210. package/dist/{tools-B10Uj7OI.js → tools-GCyNYSc1.js} +6 -6
  211. package/dist/tools-GCyNYSc1.js.map +1 -0
  212. package/dist/transcript-BNNANU8A.js +64 -0
  213. package/dist/transcript-BNNANU8A.js.map +1 -0
  214. package/dist/{types-D8RLfkFP.d.ts → types-g17bRAzt.d.ts} +389 -42
  215. package/dist/{usage-DDF_6tkV.js → usage-CleNKkly.js} +4 -2
  216. package/dist/{usage-DDF_6tkV.js.map → usage-CleNKkly.js.map} +1 -1
  217. package/dist/view/index.d.ts +42 -8
  218. package/dist/view/index.js +6 -6
  219. package/dist/views-BW6oCDUQ.js +2 -0
  220. package/dist/{views-Dqa5ojfZ.js → views-BmQF4UCI.js} +13 -8
  221. package/dist/views-BmQF4UCI.js.map +1 -0
  222. package/dist/{worker-entry-BAikHl9F.js → worker-entry-yOchGYYv.js} +16 -229
  223. package/dist/worker-entry-yOchGYYv.js.map +1 -0
  224. package/dist/{workspace-C-TrNIUc.js → workspace-CgyHEM0l.js} +6 -6
  225. package/dist/{workspace-C-TrNIUc.js.map → workspace-CgyHEM0l.js.map} +1 -1
  226. package/dist/workspace-D8sSgpiy.js +1 -0
  227. package/package.json +12 -12
  228. package/dist/agent-WSmTaesf.js.map +0 -1
  229. package/dist/assemble-BCZzTyR7.js.map +0 -1
  230. package/dist/assemble-C5qq5yT2.js +0 -2
  231. package/dist/capture-Bp74Z6Fr.js.map +0 -1
  232. package/dist/capture-DS-cPyuE.js +0 -2
  233. package/dist/cli-CVrMh_qz.js.map +0 -1
  234. package/dist/cli-spec-CKEYa8V2.js.map +0 -1
  235. package/dist/client-Bbo9SPlK.js.map +0 -1
  236. package/dist/command-BrmXUC-W.js +0 -2
  237. package/dist/command-C5xFPKHM.js.map +0 -1
  238. package/dist/command-CzIFp1JQ.js.map +0 -1
  239. package/dist/command-DUT5l13I.js.map +0 -1
  240. package/dist/commands-CLmPBrTS.js.map +0 -1
  241. package/dist/commands-fI3G2Wnh.js +0 -2
  242. package/dist/config-CGvBeewH.js +0 -457
  243. package/dist/config-CGvBeewH.js.map +0 -1
  244. package/dist/context-DbSMEVKs.js.map +0 -1
  245. package/dist/db-CSSFtGcN.js +0 -3
  246. package/dist/db-CfQFwJtq.js.map +0 -1
  247. package/dist/debug-SEmW4w8f.js +0 -2
  248. package/dist/dist-CTzThfu_.js.map +0 -1
  249. package/dist/docker-CRQGQbIt.js.map +0 -1
  250. package/dist/docker-DV2GNgle.js.map +0 -1
  251. package/dist/docker-Df_YOxxB.js +0 -2
  252. package/dist/doctor-DlKycx5H.js.map +0 -1
  253. package/dist/egress-BhzNh7Yi.js.map +0 -1
  254. package/dist/environment-1jE-HhO-.js +0 -657
  255. package/dist/environment-1jE-HhO-.js.map +0 -1
  256. package/dist/errors-C9w_ud7g.js.map +0 -1
  257. package/dist/errors-yDAEwmZo.js.map +0 -1
  258. package/dist/fake-instructions-CUI33I_F.js +0 -32
  259. package/dist/fake-instructions-CUI33I_F.js.map +0 -1
  260. package/dist/files-AiEKuEZe.js +0 -2
  261. package/dist/files-BM78_nnF.js +0 -2
  262. package/dist/files-BMCvfB4X.js +0 -2
  263. package/dist/harness-CeCp2GSW.js +0 -171
  264. package/dist/harness-CeCp2GSW.js.map +0 -1
  265. package/dist/images-BMgdpMAX.js.map +0 -1
  266. package/dist/index.js.map +0 -1
  267. package/dist/init-B6vegaP_.js +0 -2
  268. package/dist/init-BIdLF0F9.js.map +0 -1
  269. package/dist/jiti-BcJHCtrb.js +0 -46
  270. package/dist/jiti-BcJHCtrb.js.map +0 -1
  271. package/dist/live-S0qODb6o.js.map +0 -1
  272. package/dist/model-B1BZoZ9b.js.map +0 -1
  273. package/dist/model-BOnlAPzs.js.map +0 -1
  274. package/dist/model-DWeg5J7z.js +0 -2
  275. package/dist/model-FXko2kl7.js +0 -2
  276. package/dist/node-Co7EXge0.js.map +0 -1
  277. package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
  278. package/dist/options-CKqyPGxX.js +0 -739
  279. package/dist/options-CKqyPGxX.js.map +0 -1
  280. package/dist/plan-DUydFc_1.js.map +0 -1
  281. package/dist/preflight-BkoSxf4C.js.map +0 -1
  282. package/dist/preflight-D5LW7Oqi.js +0 -2
  283. package/dist/prepare-CUAWHebF.js.map +0 -1
  284. package/dist/prepare-oji2oO8W.js +0 -3
  285. package/dist/provider-BDbNOQhQ.js +0 -2
  286. package/dist/providers-B1DzMvmH.js +0 -107
  287. package/dist/providers-B1DzMvmH.js.map +0 -1
  288. package/dist/providers-CpEfNU1F.js +0 -2
  289. package/dist/query-oPO_XrTy.js +0 -2
  290. package/dist/questions-B8by4Bbt.js +0 -234
  291. package/dist/questions-B8by4Bbt.js.map +0 -1
  292. package/dist/runtime-DdsfnRz_.js.map +0 -1
  293. package/dist/sandbox-D5v-of6d.js +0 -139
  294. package/dist/sandbox-D5v-of6d.js.map +0 -1
  295. package/dist/server-BNnXtmS8.js.map +0 -1
  296. package/dist/server-BNwoKzlm.js +0 -2
  297. package/dist/source-Bk_0ZaEY.js +0 -2
  298. package/dist/src-8rRXy4u9.js.map +0 -1
  299. package/dist/src-BGWuWp6I.js +0 -3
  300. package/dist/src-BRt0O02i.js +0 -3
  301. package/dist/src-Bx2x1ekD.js +0 -3
  302. package/dist/src-C_4Umgh2.js.map +0 -1
  303. package/dist/src-D95O-Smv.js.map +0 -1
  304. package/dist/src-DDNXsD9H.js.map +0 -1
  305. package/dist/src-DLa-ESW0.js +0 -4
  306. package/dist/src-cN0aB-WR.js +0 -3
  307. package/dist/src-cdIVjC5b.js +0 -2
  308. package/dist/src-sIsDHWYq.js +0 -3
  309. package/dist/state-Bo5zg4da.js +0 -2
  310. package/dist/state-CiXyLqg0.js.map +0 -1
  311. package/dist/studio-app/assets/index-B9MCTfuu.css +0 -2
  312. package/dist/summary-BTksrIxn.js.map +0 -1
  313. package/dist/tool-target-BU1JnSE9.js.map +0 -1
  314. package/dist/tools-B10Uj7OI.js.map +0 -1
  315. package/dist/views-Cs2Oqayd.js +0 -3
  316. package/dist/views-Dqa5ojfZ.js.map +0 -1
  317. package/dist/worker-entry-BAikHl9F.js.map +0 -1
  318. package/dist/workspace-Do_SiWBs.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. */
@@ -281,6 +301,10 @@ type AttemptRecord = {
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). */
@@ -335,7 +359,9 @@ type EvalEntry = {
335
359
  * The compare's questions, answered after its attempts by pairwise votes, one per question;
336
360
  * unset without any. They annotate: `outcome` and `passRate` never depend on them. Each vote
337
361
  * may include a short `reason` (capped). `reeval analyze` includes each answer in the digest
338
- * (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.
339
365
  */
340
366
  answers?: CompareAnswer[];
341
367
  /** Set on each case of a pooled `evaluate.each`; `RunRecord.families` has the suite. */
@@ -358,7 +384,7 @@ type FamilyInterval = {
358
384
  */
359
385
  method: 'wilson' | 'newcombe-paired' | 't-cases';
360
386
  };
361
- /** One cell's pass rate over a family's cases. */
387
+ /** One cell's pass@1 over a family's cases. */
362
388
  type FamilyRate = {
363
389
  /** The cell's key, the same in every case. */
364
390
  cell: string;
@@ -479,7 +505,7 @@ type FingerprintParts = {
479
505
  environment: string | null;
480
506
  image: string | null;
481
507
  agentCli: string | null;
482
- /** 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. */
483
509
  judge: string;
484
510
  /** Over the attempt's context files. */
485
511
  context: string;
@@ -563,7 +589,7 @@ type Cost = {
563
589
  source: 'reported' | 'unreported';
564
590
  };
565
591
  type RunRecord = {
566
- kind: 'es-run';
592
+ kind: 'reeval-run';
567
593
  schemaVersion: typeof SCHEMA_VERSION;
568
594
  /** Also the file name: `<UTC start>_<short sha>_<author or ci>`. */
569
595
  runId: string;
@@ -644,7 +670,8 @@ type RunRecord = {
644
670
  };
645
671
  /** What ran and graded the agents: the machine, images, harnesses and judge. */
646
672
  type Stack = {
647
- es: string;
673
+ /** The reeval version that wrote the run. */
674
+ reeval: string;
648
675
  /** `process.versions.node`: under Bun or Deno, the Node version they're compatible with. */
649
676
  node: string;
650
677
  /**
@@ -710,6 +737,8 @@ type Stack = {
710
737
  threshold: number;
711
738
  /** Changes when reeval, the AI SDK or the provider adapter (and so the judge prompt) change. */
712
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;
713
742
  };
714
743
  /** Union of every attempt's context files. */
715
744
  context: ContextFile[];
@@ -801,7 +830,8 @@ type FileEditEvent = {
801
830
  };
802
831
  /**
803
832
  * Normalised agent events. Each tool call is one event, merged with its result; `durationMs`
804
- * 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`.
805
835
  */
806
836
  type TranscriptEvent = EventTime & ({
807
837
  type: 'text' | 'reasoning';
@@ -809,6 +839,8 @@ type TranscriptEvent = EventTime & ({
809
839
  durationMs: number | null;
810
840
  } | (FileEditEvent & {
811
841
  durationMs: number | null;
842
+ /** True when a shell-like tool or edit ran at least two minutes. */
843
+ stalled?: boolean;
812
844
  }) | {
813
845
  type: 'web-search';
814
846
  toolCallId: string;
@@ -818,12 +850,16 @@ type TranscriptEvent = EventTime & ({
818
850
  /** Whether the search succeeded. Absent means it did. */
819
851
  ok?: boolean;
820
852
  durationMs: number | null;
853
+ /** True when a shell-like tool or edit ran at least two minutes. */
854
+ stalled?: boolean;
821
855
  } | {
822
856
  type: 'web-fetch';
823
857
  toolCallId: string;
824
858
  url: string;
825
859
  ok: boolean;
826
860
  durationMs: number | null;
861
+ /** True when a shell-like tool or edit ran at least two minutes. */
862
+ stalled?: boolean;
827
863
  } | {
828
864
  type: 'tool';
829
865
  toolCallId: string;
@@ -832,6 +868,8 @@ type TranscriptEvent = EventTime & ({
832
868
  output: unknown;
833
869
  ok: boolean;
834
870
  durationMs: number | null;
871
+ /** True when a shell-like tool or edit ran at least two minutes. */
872
+ stalled?: boolean;
835
873
  } | {
836
874
  type: 'error';
837
875
  message: string;
@@ -850,7 +888,9 @@ type ExecResult = {
850
888
  };
851
889
  /** Live tab size for `c.capture()`. Default 1280×720 when the call and cascade omit `viewport`. */
852
890
  type CaptureWindow = {
891
+ /** In CSS pixels. */
853
892
  width: number;
893
+ /** In CSS pixels. */
854
894
  height: number;
855
895
  };
856
896
  /**
@@ -912,6 +952,7 @@ type CaptureUse = {
912
952
  * pass it as the first argument to `c.capture`.
913
953
  */
914
954
  type CaptureOptions = {
955
+ /** The window and saved PNG size, or `'full-page'`. Default 1280×720. */
915
956
  viewport?: Viewport;
916
957
  /** How long to poll before failing. Default `'60s'`. */
917
958
  timeout?: Duration;
@@ -1017,6 +1058,7 @@ type Turn = TurnData & {
1017
1058
  exec(command: string): Promise<ExecResult>;
1018
1059
  readFile(path: string): Promise<string | null>;
1019
1060
  };
1061
+ /** Any JSON value. */
1020
1062
  type JSONValue = null | boolean | number | string | JSONValue[] | {
1021
1063
  [key: string]: JSONValue;
1022
1064
  };
@@ -1053,10 +1095,11 @@ type JudgeArtifactRef = {
1053
1095
  */
1054
1096
  type FakeJudgeModel = {
1055
1097
  kind: 'fake-judge';
1098
+ /** The score (0–1) every call gets, or a function of the state it would see. */
1056
1099
  score: number | ((state: JudgeState) => number);
1057
1100
  };
1058
1101
  /**
1059
- * `'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
1060
1103
  * decision model object (per group, eval or call only), or a fake judge.
1061
1104
  */
1062
1105
  type JudgeModel = string | FakeJudgeModel | {
@@ -1064,28 +1107,77 @@ type JudgeModel = string | FakeJudgeModel | {
1064
1107
  };
1065
1108
  /** Merged field by field down the cascade, so per-model settings can join as new fields. */
1066
1109
  type JudgeOptions = {
1110
+ /** The model that grades. */
1067
1111
  model?: JudgeModel;
1068
1112
  /** Minimum score (0–1) for a `pass` verdict. */
1069
1113
  threshold?: number;
1114
+ /** AI SDK provider options for the judge's calls, keyed by provider. */
1070
1115
  providerOptions?: Record<string, Record<string, JSONValue>>;
1071
1116
  /** The most judge calls to this model's provider at once, across the run. */
1072
1117
  maxConcurrent?: number;
1073
1118
  /**
1074
- * Which changed files the judge's diff shows: gitignore-style patterns over workspace paths,
1075
- * 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.
1076
1121
  */
1077
- include?: string[];
1078
- /** Workspace files the judge sees whole, as they are now, whether or not the agent changed them. */
1079
- 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[];
1080
1171
  };
1081
1172
  type JudgeCallOptions = JudgeOptions & {
1082
1173
  /** What to grade instead of the latest turn: another turn, or a value used as the output. */
1083
1174
  on?: Turn | JSONValue;
1084
1175
  /**
1085
- * Captures this call sends the judge as file parts. A `c.capture()` handle or its name.
1086
- * 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.
1087
1179
  */
1088
- artifacts?: Array<Capture | string>;
1180
+ artifacts?: true | Array<Capture | string>;
1089
1181
  };
1090
1182
  type Verdict = {
1091
1183
  verdict: 'pass' | 'fail';
@@ -1108,12 +1200,16 @@ type JudgeFailure = Omit<Verdict, 'verdict' | 'score' | 'resolvedModel'> & {
1108
1200
  score: null;
1109
1201
  error: string;
1110
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
+ */
1111
1207
  type AttemptContext = {
1112
- /** 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. */
1113
1209
  send(prompt: string): Promise<Turn>;
1114
1210
  /**
1115
1211
  * Asks the judge a yes/no question about the latest turn (or `options.on`).
1116
- * `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.
1117
1213
  */
1118
1214
  judge(question: string, options?: JudgeCallOptions): Promise<Verdict | JudgeFailure>;
1119
1215
  exec(command: string): Promise<ExecResult>;
@@ -1132,7 +1228,6 @@ type AttemptContext = {
1132
1228
  * Screenshots a path on a tunneled sandbox port and writes `artifacts/<name>.png`.
1133
1229
  * First argument is the container port or a `ServeHandle` from `c.serve`.
1134
1230
  * `instructions` runs a vision journey on that same tab first.
1135
- * Needs a sandbox, same as `c.exec`.
1136
1231
  */
1137
1232
  capture(target: number | ServeHandle, options?: CaptureCall): Promise<Capture>;
1138
1233
  /** Workspace-relative, or `~/` for the home directory; `null` when there's no such file. */
@@ -1140,14 +1235,9 @@ type AttemptContext = {
1140
1235
  /**
1141
1236
  * Writes a file into the sandbox (workspace-relative, or `~/`), creating its directories.
1142
1237
  * Later turns' `diff` leaves it out, as it does the environment's files, but shows any change
1143
- * made to it afterwards. Needs a sandbox, same as `c.exec`.
1238
+ * made to it afterwards.
1144
1239
  */
1145
1240
  writeFile(path: string, contents: string | Uint8Array): Promise<void>;
1146
- /**
1147
- * Starts the sandbox and the agent session without a turn, for checks on what the environment
1148
- * set up. `c.send()` starts them too; calling both starts them once.
1149
- */
1150
- sandbox(): Promise<Pick<AttemptContext, 'exec' | 'readFile'>>;
1151
1241
  /** Every turn so far, oldest first. */
1152
1242
  readonly turns: readonly Turn[];
1153
1243
  /** Aborted on timeout or Ctrl-C. */
@@ -1160,12 +1250,14 @@ type AttemptContext = {
1160
1250
  };
1161
1251
  };
1162
1252
  type EvalFn = (c: AttemptContext) => Promise<void>;
1253
+ /** A canned agent for tests and dry runs, made by `fakeHarness()` in `reeval/harness`. */
1163
1254
  type FakeHarnessDescriptor = {
1164
1255
  kind: 'fake';
1165
1256
  /** Cell id; defaults to `fake`. */
1166
1257
  id?: string;
1167
1258
  /** Files the fake agent writes into the sandbox on every turn. */
1168
1259
  files?: Record<string, string>;
1260
+ /** The fake agent's final message on every turn; default `Done.`. */
1169
1261
  text?: string;
1170
1262
  /** Simulated turn length, honours the abort signal. */
1171
1263
  delayMs?: number;
@@ -1217,10 +1309,11 @@ type FakeHarnessDescriptor = {
1217
1309
  * Behave like this agent: its image, and where it reads rules and skills (`CLAUDE.md` and
1218
1310
  * `.claude/skills` for `claude-code`, `~/.gemini/config/skills` for `antigravity`,
1219
1311
  * `~/.config/opencode/skills` for `opencode`, Goose's private home for `goose`,
1220
- * `~/.pi/agent/skills` for `pi`, `~/.agents/skills` for `codex`). Defaults to the
1221
- * 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.
1222
1315
  */
1223
- layout?: 'cursor' | 'claude-code' | 'antigravity' | 'opencode' | 'goose' | 'pi' | 'codex';
1316
+ layout?: 'cursor' | 'claude-code' | 'antigravity' | 'opencode' | 'goose' | 'pi' | 'codex' | 'fx' | 'grok-build';
1224
1317
  };
1225
1318
  /**
1226
1319
  * One action of a scripted fake agent. `exec` is reported as a `shell` tool call whose output is
@@ -1406,28 +1499,82 @@ type CodexHarnessDescriptor = {
1406
1499
  */
1407
1500
  startTimeout?: Duration;
1408
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
+ };
1409
1547
  /** A real coding agent, driven through its AI SDK harness adapter. */
1410
- 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. */
1411
1550
  type HarnessDescriptor = FakeHarnessDescriptor | AgentHarnessDescriptor;
1551
+ /** A temp directory on the host instead of a container, made by `fakeSandbox()`. */
1412
1552
  type FakeSandboxDescriptor = {
1413
1553
  kind: 'fake';
1554
+ /** Cell id; defaults to `fake`. */
1414
1555
  id?: string;
1415
1556
  /** Parent directory for the per-eval workspace (defaults to the OS temp dir). */
1416
1557
  dir?: string;
1417
1558
  /** The most attempts on this sandbox kind at once, across the run. */
1418
1559
  maxConcurrent?: number;
1419
1560
  };
1561
+ /** A local Docker container, made by `docker()`, or a Podman one, made by `podman()`. */
1420
1562
  type DockerSandboxDescriptor = {
1421
1563
  kind: 'docker';
1422
- /** 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
+ */
1423
1570
  id?: string;
1424
1571
  /** An image that already has the harness baked in, used as is. */
1425
1572
  image?: string;
1426
1573
  /** A Debian or Ubuntu based toolchain image; reeval bakes Node and the harness on top, cached. */
1427
1574
  from?: string;
1428
1575
  /**
1429
- * An absolute path to a Dockerfile (`docker()` resolves it against the calling file), built from
1430
- * 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.
1431
1578
  */
1432
1579
  dockerfile?: string;
1433
1580
  /** Baked onto the sandbox image in one build container: in order, no secrets, no workspace. */
@@ -1485,13 +1632,17 @@ type SecretOptions = {
1485
1632
  /** `secret.template('Bearer ${TOKEN}')`: host variables substituted into a string, for MCP headers. */
1486
1633
  type SecretTemplate = {
1487
1634
  kind: 'secret-template';
1635
+ /** The string, with `${NAME}` for each host variable to substitute. */
1488
1636
  template: string;
1489
1637
  };
1638
+ /** A variable's value: a literal string, or a host secret. */
1490
1639
  type EnvValue = string | Secret;
1640
+ /** Environment variables by name. */
1491
1641
  type EnvVars = Record<string, EnvValue>;
1492
1642
  /** A file on the host, read when an attempt starts. Made by the `file` helper. */
1493
1643
  type HostFile = {
1494
1644
  kind: 'file';
1645
+ /** Its path on the host, absolute or relative to the directory of the file it's written in. */
1495
1646
  path: string;
1496
1647
  };
1497
1648
  /** Options for the `directory` helper. */
@@ -1509,62 +1660,92 @@ type DirectoryOptions = {
1509
1660
  /** `false` walks into `DEFAULT_DIRECTORY_IGNORES` too. `.git` is always skipped. */
1510
1661
  defaultIgnores?: boolean;
1511
1662
  };
1663
+ /** An MCP server the agent gets, made by the `mcp` helper: a command in the sandbox, or a URL. */
1512
1664
  type McpServer = {
1513
1665
  kind: 'mcp';
1514
1666
  transport: 'stdio';
1667
+ /** The command that starts the server in the sandbox. */
1515
1668
  command: string;
1516
1669
  args: string[];
1670
+ /** Variables the server process gets. */
1517
1671
  env: EnvVars;
1518
1672
  } | {
1519
1673
  kind: 'mcp';
1674
+ /** Streamable HTTP, or the older SSE transport. */
1520
1675
  transport: 'http' | 'sse';
1521
1676
  url: string;
1677
+ /** Request headers, with secrets brokered by the egress gateway. */
1522
1678
  headers: Record<string, string | Secret | SecretTemplate>;
1523
1679
  };
1524
1680
  /** `harness` (default): the agent's own skills, via its adapter. `workspace`: its repo skill dir. */
1525
1681
  type SkillPlacement = 'harness' | 'workspace';
1682
+ /** Skills to place for the agent, made by the `skill` helper. */
1526
1683
  type SkillSource = {
1527
1684
  kind: 'skill';
1528
1685
  placement: SkillPlacement;
1529
1686
  } & ({
1530
1687
  source: 'local';
1688
+ /** A host directory with a `SKILL.md`, or a directory of them. */
1531
1689
  path: string;
1690
+ /** The skill names to keep; default every one found. */
1532
1691
  only?: string[];
1692
+ /** Paths in each skill directory to leave out, gitignore-style. */
1533
1693
  exclude?: string[];
1534
1694
  } | {
1535
1695
  source: 'git';
1696
+ /** As written: a URL, `github:owner/repo`, or a GitHub `/tree/<ref>/<path>` URL. */
1536
1697
  repo: string;
1698
+ /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
1537
1699
  ref?: string;
1700
+ /** The directory in the repository to read skills from. */
1538
1701
  path?: string;
1702
+ /** The skill names to keep; default every one found. */
1539
1703
  only?: string[];
1704
+ /** Paths in each skill directory to leave out, gitignore-style. */
1540
1705
  exclude?: string[];
1541
1706
  } | {
1542
1707
  source: 'registry';
1708
+ /** A skills.sh id, `owner/repo@skill`. */
1543
1709
  id: string;
1710
+ /** A git ref of the skill's repository. */
1544
1711
  version?: string;
1545
1712
  } | {
1546
1713
  source: 'npm';
1714
+ /** A pinned npm package spec. */
1547
1715
  spec: string;
1716
+ /** The directory in the package to read skills from; default `skills`. */
1548
1717
  path: string;
1718
+ /** The skill names to keep; default every one found. */
1549
1719
  only?: string[];
1720
+ /** Paths in each skill directory to leave out, gitignore-style. */
1550
1721
  exclude?: string[];
1551
1722
  } | {
1552
1723
  source: 'inline';
1724
+ /** The skill's name, as in `SKILL.md`'s frontmatter. */
1553
1725
  name: string;
1726
+ /** The skill's description, as in `SKILL.md`'s frontmatter. */
1554
1727
  description: string;
1728
+ /** The body of `SKILL.md`. */
1555
1729
  content: string;
1730
+ /** Other files in the skill directory, by relative path. */
1556
1731
  files: Record<string, string>;
1557
1732
  });
1558
1733
  /** A `docker({ install })` command, baked into a cached image layer: no secrets, root, cwd `/`. */
1559
1734
  type InstallStep = string | {
1735
+ /** The shell command. */
1560
1736
  run: string;
1561
1737
  timeout?: Duration;
1562
1738
  };
1563
- /** Runs in every attempt before the agent starts, with secrets, outside the eval timeout. */
1564
- /** 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
+ */
1565
1743
  type SetupStep = string | {
1744
+ /** The shell command. */
1566
1745
  run: string;
1746
+ /** Default 5m. */
1567
1747
  timeout?: Duration;
1748
+ /** Relative to the workspace, or absolute; default the workspace. */
1568
1749
  cwd?: string;
1569
1750
  };
1570
1751
  /**
@@ -1584,6 +1765,7 @@ type GitWorkspace = {
1584
1765
  kind: 'git';
1585
1766
  /** As written: a URL, `github:owner/repo`, or a local path. */
1586
1767
  repo: string;
1768
+ /** What reeval fetches: the clone URL, or an absolute path for a local repository. */
1587
1769
  url: string;
1588
1770
  /** A branch, tag or commit SHA; unset is the remote's `HEAD`. */
1589
1771
  ref?: string;
@@ -1609,6 +1791,7 @@ type EnvironmentSpec = {
1609
1791
  sandbox?: SandboxDescriptor;
1610
1792
  /** The code the workspace starts as, before `files`, `rules` and `setup`; a child's replaces its parent's. */
1611
1793
  workspace?: GitWorkspace;
1794
+ /** Variables and secrets for the sandbox, merged by name over the parent's. */
1612
1795
  env?: EnvVars;
1613
1796
  /** Replaces the inherited policy; an `extend` child's replaces its parent's. */
1614
1797
  egress?: EgressPolicy;
@@ -1616,13 +1799,18 @@ type EnvironmentSpec = {
1616
1799
  files?: Record<string, string | HostFile>;
1617
1800
  /** Project rules, written where the harness's agent reads them: `AGENTS.md`, or `CLAUDE.md` for Claude Code. */
1618
1801
  rules?: string | HostFile;
1802
+ /** Shell commands run in every attempt before the agent starts; a child's run after its parent's. */
1619
1803
  setup?: SetupStep[];
1804
+ /** Skills placed for the agent. */
1620
1805
  skills?: SkillSource[];
1806
+ /** MCP servers the agent gets, by name. */
1621
1807
  mcp?: Record<string, McpServer>;
1622
1808
  };
1623
1809
  /** One environment in an `extend` chain. */
1624
1810
  type EnvironmentLayer = {
1811
+ /** The name passed to `defineEnvironment` or `extend`. */
1625
1812
  name: string;
1813
+ /** The spec as that layer wrote it, before merging. */
1626
1814
  spec: EnvironmentSpec;
1627
1815
  };
1628
1816
  /**
@@ -1631,7 +1819,9 @@ type EnvironmentLayer = {
1631
1819
  */
1632
1820
  type Environment = {
1633
1821
  readonly kind: 'environment';
1822
+ /** The name it was defined or extended under, which names its cells. */
1634
1823
  readonly name: string;
1824
+ /** Its `extend` chain, root first. */
1635
1825
  readonly layers: readonly EnvironmentLayer[];
1636
1826
  /**
1637
1827
  * A child environment layered on this one; wherever it sets a key this one has, it wins.
@@ -1767,14 +1957,71 @@ type CompareOptions<E = Environment> = {
1767
1957
  };
1768
1958
  /**
1769
1959
  * A question for pairwise judgement: its text, or the text and the `'provider/model'` that
1770
- * 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.
1771
1962
  * `across` is the factor it varies when pairing; without it (and without a one-factor
1772
- * `compare.across`) both pair kinds run.
1963
+ * `compare.across`) both pair kinds run. `state` and `artifacts` choose what each side shows.
1773
1964
  */
1774
1965
  type CompareQuestion = string | {
1775
1966
  question: string;
1967
+ /** `'provider/model'` that answers it, over the cascaded `question.model`. */
1776
1968
  model?: string;
1969
+ /** The factor it varies when pairing. */
1777
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[];
1778
2025
  };
1779
2026
  /** A matrix factor a compare question varies when pairing; the others are held. */
1780
2027
  type PairFactor = 'environment' | 'harness';
@@ -1799,6 +2046,11 @@ type PairVote = {
1799
2046
  swapped: boolean;
1800
2047
  /** The model's short reason for this pick; omitted when it gave none. Capped. */
1801
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
+ };
1802
2054
  };
1803
2055
  /** A compare question's answer: every vote, and each side's wins over decided votes per cut. */
1804
2056
  type CompareAnswer = {
@@ -1807,6 +2059,10 @@ type CompareAnswer = {
1807
2059
  model: string;
1808
2060
  /** The model id the provider says served the calls, when it reports one. */
1809
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[];
1810
2066
  votes: PairVote[];
1811
2067
  /** Wins over decided pairs, per named side, per cut. */
1812
2068
  rates: Array<{
@@ -1817,7 +2073,10 @@ type CompareAnswer = {
1817
2073
  }>;
1818
2074
  /** Why some or all of its votes are missing: the model call failed. Outcomes never change. */
1819
2075
  error?: string;
2076
+ /** `questions/<n>.json` under the eval's directory: what the model was sent, per pair and order. */
2077
+ input?: FileRef;
1820
2078
  };
2079
+ /** An option a profile's `limit` can narrow, and `pin` can protect. */
1821
2080
  type PinnableKey = 'harness' | 'runs' | 'compare';
1822
2081
  /**
1823
2082
  * How a cell's attempts decide its outcome: `'all'` (the default) passes only when every attempt
@@ -1833,7 +2092,7 @@ type CellGate = GatePolicy | 'none';
1833
2092
  type CompareSpec<E = Environment> = CompareOptions<E>;
1834
2093
  /** Options other than `environment` and `compare`, which are exclusive of each other. */
1835
2094
  type EvalOptionFields = {
1836
- /** The only list: each harness is its own cell. */
2095
+ /** Which agents run the eval; each harness is its own cell. */
1837
2096
  harness?: HarnessOption;
1838
2097
  /**
1839
2098
  * The default machine when the resolved environment omits `sandbox`. Cascades like `harness`.
@@ -1851,11 +2110,15 @@ type EvalOptionFields = {
1851
2110
  * environment, then groups and the eval.
1852
2111
  */
1853
2112
  egress?: EgressPolicy;
2113
+ /** Defaults for `c.judge()`, merged field by field down the cascade. */
1854
2114
  judge?: JudgeOptions;
1855
2115
  /** Screenshot defaults for `c.capture()`. Shallow-merged; `viewport` and `model` replace the value. */
1856
2116
  capture?: CaptureOptions;
2117
+ /** Defaults for every compare question: `model`, and `state` merged key by key, down the cascade. */
2118
+ question?: QuestionOptions;
1857
2119
  /** Per attempt. */
1858
2120
  timeout?: Duration;
2121
+ /** Labels for `--tag` and profiles to select by; a group's are added to its evals'. */
1859
2122
  tags?: string[];
1860
2123
  /** Keys a profile's `limit` may not narrow for this group or eval. */
1861
2124
  pin?: PinnableKey[];
@@ -1873,20 +2136,36 @@ type EnvironmentOrCompare<E> = {
1873
2136
  } | {
1874
2137
  /** Forbidden beside `compare.baseline`, which names the control. */
1875
2138
  environment?: never;
2139
+ /** Environments to run side by side; `baseline` is the control. */
1876
2140
  compare: CompareSpec<E> & {
1877
2141
  baseline: E;
1878
2142
  };
1879
2143
  } | {
1880
2144
  /** The control: the compare has no `baseline`. */
1881
2145
  environment?: E;
2146
+ /** Environments to run side by side against `environment`, the control. */
1882
2147
  compare: CompareSpec<E> & {
1883
2148
  baseline?: undefined;
1884
2149
  };
1885
2150
  };
1886
2151
  type EvalOptions = EvalOptionFields & EnvironmentOrCompare<Environment>;
1887
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'>;
1888
2166
  /** The config file is plain data sent to workers, so its judge model can't be an object. */
1889
2167
  type ConfigJudgeOptions = Omit<JudgeOptions, 'model'> & {
2168
+ /** `'provider/model'`, or a fake judge. */
1890
2169
  model?: string | FakeJudgeModel;
1891
2170
  };
1892
2171
  type HistoryConfig = {
@@ -1897,22 +2176,35 @@ type HistoryConfig = {
1897
2176
  };
1898
2177
  /** Run-level caps. `attempts` is checked against the plan; `duration` while running. */
1899
2178
  type Budget = {
2179
+ /** The most attempts the plan may have. */
1900
2180
  attempts?: number;
2181
+ /** How long the run may go on, from the first attempt's start. */
1901
2182
  duration?: Duration;
1902
2183
  };
1903
2184
  /** What evals get when they don't say otherwise: under groups and evals. */
1904
2185
  type ProfileDefaults = {
2186
+ /** The agents every eval runs on, unless a group or eval replaces them. */
1905
2187
  harness?: HarnessDescriptor | HarnessDescriptor[];
1906
2188
  /** The default machine when the resolved environment omits `sandbox`. */
1907
2189
  sandbox?: SandboxDescriptor;
2190
+ /** What every eval runs in when it names no environment. */
1908
2191
  environment?: Environment;
2192
+ /** Attempts per cell. */
1909
2193
  runs?: number;
2194
+ /** How each cell's attempts decide its outcome. */
1910
2195
  gate?: GatePolicy;
2196
+ /** Variables and secrets for the sandbox, merged by name over the config's. */
1911
2197
  env?: EnvVars;
2198
+ /** Where the sandbox may connect; replaces the config's policy. */
1912
2199
  egress?: EgressPolicy;
2200
+ /** Defaults for `c.judge()`, merged field by field over the config's. */
1913
2201
  judge?: ConfigJudgeOptions;
2202
+ /** Per attempt. */
1914
2203
  timeout?: Duration;
2204
+ /** Screenshot defaults for `c.capture()`, shallow-merged over the config's. */
1915
2205
  capture?: CaptureOptions;
2206
+ /** Defaults for every compare question, merged over the config's. */
2207
+ question?: QuestionOptions;
1916
2208
  };
1917
2209
  /** Over every eval, and it can only narrow; `pin` on a group or eval skips it. */
1918
2210
  type ProfileLimit = {
@@ -1927,10 +2219,15 @@ type ProfileLimit = {
1927
2219
  };
1928
2220
  /** How a run is sized: chosen with `--profile`, `REEVAL_PROFILE` or `defaultProfile`. */
1929
2221
  type Profile = {
2222
+ /** What evals get when they don't say otherwise: under groups and evals. */
1930
2223
  defaults?: ProfileDefaults;
2224
+ /** Caps over every eval, which only narrow; `pin` on a group or eval skips them. */
1931
2225
  limit?: ProfileLimit;
2226
+ /** Judge settings for this profile, the same as `defaults.judge`, which wins field by field. */
1932
2227
  judge?: ConfigJudgeOptions;
2228
+ /** Merged over the config's `budget`. */
1933
2229
  budget?: Budget;
2230
+ /** When this profile's runs are copied into the history folder. */
1934
2231
  record?: RecordMode;
1935
2232
  /** Tag filters for this profile, like `--tag` (`'!slow'` excludes). */
1936
2233
  tags?: string[];
@@ -1974,12 +2271,48 @@ type FakePick = FakeVote | {
1974
2271
  winner: FakeVote;
1975
2272
  reason?: string;
1976
2273
  };
1977
- /** 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. */
1978
2275
  type BlindPair = {
1979
2276
  question: string;
1980
2277
  prompt: string;
1981
- a: string;
1982
- 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
+ }>;
1983
2316
  };
1984
2317
  /** `reeval analyze`: a language model (not an evaluation model) and what matters in this project. */
1985
2318
  type AnalysisConfig = {
@@ -1997,33 +2330,46 @@ type AnalysisConfig = {
1997
2330
  /** The most tokens the model may answer with (default 8000). reeval has no prices, so tokens are the cap. */
1998
2331
  maxOutputTokens?: number;
1999
2332
  };
2000
- type EsConfig = {
2333
+ type ReevalConfig = {
2334
+ /** Globs of eval files, relative to the config's directory; default every `.eval.ts` under `evals`. */
2001
2335
  include?: string[];
2336
+ /** The agents every eval runs on, unless a group or eval replaces them; default Cursor. */
2002
2337
  harness?: HarnessDescriptor | HarnessDescriptor[];
2003
2338
  /**
2004
2339
  * The default machine when the resolved environment omits `sandbox`. Not an environment:
2005
2340
  * it does not invent skills, files or a name. Implicit `docker()` when nobody sets one.
2006
2341
  */
2007
2342
  sandbox?: SandboxDescriptor;
2343
+ /** What every eval runs in when it names no environment, and a baseline-less compare's control. */
2008
2344
  environment?: Environment;
2345
+ /** Attempts per cell; default 1. */
2009
2346
  runs?: number;
2010
2347
  /** How each cell's attempts decide its outcome; default `'all'`. */
2011
2348
  gate?: GatePolicy;
2349
+ /** Variables and secrets for the sandbox, merged by name down the cascade. */
2012
2350
  env?: EnvVars;
2351
+ /** Where the sandbox may connect; default `'allow-all'`. */
2013
2352
  egress?: EgressPolicy;
2353
+ /** Defaults for `c.judge()`, merged field by field down the cascade. */
2014
2354
  judge?: ConfigJudgeOptions;
2355
+ /** Per attempt; default `'15m'`. */
2015
2356
  timeout?: Duration;
2016
2357
  /**
2017
2358
  * Screenshot defaults for `c.capture()`. `REEVAL_CAPTURE_BROWSER=0` refuses the host
2018
2359
  * binary when `c.capture()` runs; it does not change this object.
2019
2360
  */
2020
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;
2021
2364
  /** How many attempts run at once. `--concurrency` and `REEVAL_CONCURRENCY` override it. */
2022
2365
  concurrency?: number;
2023
2366
  /** When runs are copied into the history folder: `reeval record` only, in CI, or on every run. */
2024
2367
  record?: RecordMode;
2368
+ /** The history folder, and which attempts keep their artifacts there. */
2025
2369
  history?: HistoryConfig;
2370
+ /** Caps on a run; a profile's `budget` is merged over it. */
2026
2371
  budget?: Budget;
2372
+ /** Named presets of `defaults`, `limit`, `judge`, `budget`, `record` and `tags`. */
2027
2373
  profiles?: Record<string, Profile>;
2028
2374
  /** The profile when neither `--profile` nor `REEVAL_PROFILE` names one: `ci` when `CI` is set. */
2029
2375
  defaultProfile?: {
@@ -2042,6 +2388,7 @@ type EsConfig = {
2042
2388
  keep?: number;
2043
2389
  traceBufferMb?: number;
2044
2390
  };
2391
+ /** `reeval analyze`, compare questions without a model, and `agent`'s notes during a run. */
2045
2392
  analysis?: AnalysisConfig;
2046
2393
  };
2047
2394
  /** What a `defineConfig` callback gets: the environment helpers plus the run's context. */
@@ -2269,5 +2616,5 @@ type SandboxWarning = {
2269
2616
  message: string;
2270
2617
  };
2271
2618
  //#endregion
2272
- export { HarnessData as $, EffortContrast as $t, DirectoryOptions as A, Turn as At, EsConfig as B, EvalEntry as Bt, CompareCut as C, Secret as Ct, ConfigJudgeOptions as D, SkillSource as Dt, ConfigHelpers as E, SetupStep as Et, EnvVars as F, Wait as Ft, FakeHarnessDescriptor as G, HistoryCell as Gt, EvalOptions as H, FamilyRate as Ht, Environment as I, WebEventType as It, FakeSandboxDescriptor as J, Lift as Jt, FakeJudgeModel as K, HistoryEntry as Kt, EnvironmentHelpers as L, ArtifactRef as Lt, Duration as M, TurnStatus as Mt, EgressPolicy as N, Verdict as Nt, CursorHarnessDescriptor as O, TokenUsage as Ot, EgressRecord as P, Viewport as Pt, GroupOptions as Q, EFFORT_ALPHA as Qt, EnvironmentInput as R, AttemptRecord as Rt, CompareAnswer as S, SandboxWarning as St, CompareQuestion as T, ServeHandle as Tt, ExecResult as U, FamilyRecord as Ut, EvalFn as V, FamilyLift as Vt, FakeAnalysisModel as W, FileRef as Wt, FakeVote as X, StackSummary as Xt, FakeScriptStep as Y, RunRecord as Yt, GooseHarnessDescriptor as Z, CellEffort as Zt, Cell as _, formatSeconds as _n, PinnableKey as _t, BackgroundHandle as a, cellContrast as an, JudgeArtifactRef as at, ClaudeCodeHarnessDescriptor as b, ProfileLimit as bt, Capture as c, contrastEffort as cn, JudgeModel as ct, CaptureOptions as d, effortOf as dn, McpServer as dt, EffortSample as en, HarnessDescriptor as et, CaptureUse as f, effortSample as fn, OpenCodeHarnessDescriptor as ft, CaptureWindow as g, formatRatio as gn, PiHarnessDescriptor as gt, CaptureWait as h, formatCount as hn, PairVote as ht, AttemptContext as i, VERDICT_TEXT as in, HostFile as it, DockerSandboxDescriptor as j, TurnData as jt, Diff as k, TranscriptEvent as kt, CaptureCall as l, effortChangeLabel as ln, JudgeOptions as lt, CaptureUseScript as m, effortVerdict as mn, PairFactor as mt, AnalysisConfig as n, Spread as nn, HarnessOption as nt, BlindPair as o, cellEffort as on, JudgeCallOptions as ot, CaptureUseAction as p, effortSummary as pn, Outcome as pt, FakeNoteInput as q, JudgementRecord as qt, AntigravityHarnessDescriptor as r, TOKENS_UNREPORTED as rn, HistoryConfig as rt, Budget as s, cellSamples as sn, JudgeFailure as st, AgentHarnessDescriptor as t, EffortVerdict as tn, HarnessEdit as tt, CaptureInstruction as u, effortLabel as un, JudgeState as ut, CellRole as v, tokenValues as vn, Profile as vt, CompareOptions as w, SecretTemplate as wt, CodexHarnessDescriptor as x, SandboxDescriptor as xt, ClaudeCodeEffort as y, ProfileDefaults as yt, EnvironmentSpec as z, CellRecord as zt };
2273
- //# sourceMappingURL=types-D8RLfkFP.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