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.
- package/README.md +52 -40
- package/THIRD_PARTY_NOTICES.md +218 -11
- package/assets/package.json +1 -1
- package/assets/pnpm-lock.yaml +30 -30
- package/dist/adapter-DWlpOtRn.js +279 -0
- package/dist/adapter-DWlpOtRn.js.map +1 -0
- package/dist/{agent-B72lZ6w5.js → agent-CURAwx_q.js} +6 -6
- package/dist/{agent-B72lZ6w5.js.map → agent-CURAwx_q.js.map} +1 -1
- package/dist/{agent-Cfj1wD4D.js → agent-CaS_2Sce.js} +92 -26
- package/dist/agent-CaS_2Sce.js.map +1 -0
- package/dist/{analysis-BTNnKh1w.js → analysis-Bxub9LMT.js} +4 -4
- package/dist/{analysis-BTNnKh1w.js.map → analysis-Bxub9LMT.js.map} +1 -1
- package/dist/{assemble-BbFVjHeS.js → assemble-B9Alds-z.js} +290 -30
- package/dist/assemble-B9Alds-z.js.map +1 -0
- package/dist/assemble-J5MukZFY.js +1 -0
- package/dist/{client-CwzU9CiW.js → assert-EUIoRdIt.js} +38 -112
- package/dist/assert-EUIoRdIt.js.map +1 -0
- package/dist/bridge/index.mjs +248 -55
- package/dist/{capture-BXhBfmsM.js → capture-CNb9SuU5.js} +204 -39
- package/dist/capture-CNb9SuU5.js.map +1 -0
- package/dist/capture-jquXZBKK.js +1 -0
- package/dist/{cli-BMjTKY-D.js → cli-D303Vj5N.js} +257 -146
- package/dist/cli-D303Vj5N.js.map +1 -0
- package/dist/{cli-spec-DSvKsOK4.js → cli-spec-BPZbQG2p.js} +38 -19
- package/dist/cli-spec-BPZbQG2p.js.map +1 -0
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/client-fcwgwOAD.js +106 -0
- package/dist/client-fcwgwOAD.js.map +1 -0
- package/dist/{command-JPGNzFsA.js → command-BLfT7vnQ.js} +19 -18
- package/dist/command-BLfT7vnQ.js.map +1 -0
- package/dist/{command-BK4kOgkH.js → command-BT9a37ZR.js} +381 -78
- package/dist/command-BT9a37ZR.js.map +1 -0
- package/dist/{command-BqJtFiPy.js → command-Bge8F7Ko.js} +384 -101
- package/dist/command-Bge8F7Ko.js.map +1 -0
- package/dist/command-BkFjijN2.js +1 -0
- package/dist/{command-BdstSEHu.js → command-CMJtHKRa.js} +14 -14
- package/dist/{command-BdstSEHu.js.map → command-CMJtHKRa.js.map} +1 -1
- package/dist/commands-1p-bIWhN.js +1 -0
- package/dist/{commands-B618jg3C.js → commands-BFx16WB8.js} +8 -8
- package/dist/commands-BFx16WB8.js.map +1 -0
- package/dist/config-DEgnUiU-.js +756 -0
- package/dist/config-DEgnUiU-.js.map +1 -0
- package/dist/{context-CvUv7DUb.js → context-C1mxXh80.js} +11 -7
- package/dist/context-C1mxXh80.js.map +1 -0
- package/dist/{db-DFbtGIYy.js → db-CdHizc4_.js} +582 -53
- package/dist/db-CdHizc4_.js.map +1 -0
- package/dist/db-Dm1cRJJP.js +2 -0
- package/dist/debug-D7bEv_UV.js +1 -0
- package/dist/{dist-CTzThfu_.js → dist-B8hJImYt.js} +17 -4
- package/dist/dist-B8hJImYt.js.map +1 -0
- package/dist/{docker-2qns7hJ2.js → docker-7b_2SaH7.js} +35 -22
- package/dist/docker-7b_2SaH7.js.map +1 -0
- package/dist/{docker-IFRW8K5f.js → docker-sZrNrr82.js} +3 -3
- package/dist/docker-sZrNrr82.js.map +1 -0
- package/dist/docker-yauK-9X8.js +1 -0
- package/dist/{doctor-B6oYTPoR.js → doctor-BYNok4UO.js} +263 -84
- package/dist/doctor-BYNok4UO.js.map +1 -0
- package/dist/{duration-JsJrIWXq.js → duration-CEOQww97.js} +2 -2
- package/dist/{duration-JsJrIWXq.js.map → duration-CEOQww97.js.map} +1 -1
- package/dist/{egress-IUKdeayc.js → egress-C4PZTSSe.js} +147 -14
- package/dist/egress-C4PZTSSe.js.map +1 -0
- package/dist/environment-DNjRk0nU.js +1133 -0
- package/dist/environment-DNjRk0nU.js.map +1 -0
- package/dist/{errors-yDAEwmZo.js → errors-B6BSMs03.js} +2 -2
- package/dist/errors-B6BSMs03.js.map +1 -0
- package/dist/{errors-C9w_ud7g.js → errors-r025B0Zb.js} +4 -4
- package/dist/errors-r025B0Zb.js.map +1 -0
- package/dist/evaluate-C1UVL21l.d.ts +92 -0
- package/dist/evaluate-D4zeRGBF.js +2351 -0
- package/dist/evaluate-D4zeRGBF.js.map +1 -0
- package/dist/family-D2b7WD10.js +67 -0
- package/dist/family-D2b7WD10.js.map +1 -0
- package/dist/files-BAt0i00X.js +1 -0
- package/dist/{files-CMSUXAEg.js → files-BXUdY8tr.js} +10 -9
- package/dist/{files-CMSUXAEg.js.map → files-BXUdY8tr.js.map} +1 -1
- package/dist/files-BhyltlDB.js +1 -0
- package/dist/files-Bk1mC3AN.js +43 -0
- package/dist/files-Bk1mC3AN.js.map +1 -0
- package/dist/{files-B6aVVGrk.js → files-DQmHE7pb.js} +5 -5
- package/dist/{files-B6aVVGrk.js.map → files-DQmHE7pb.js.map} +1 -1
- package/dist/files-ZZPqfAo6.js +1 -0
- package/dist/{git-EmdFJ4DY.js → git-DfG-YJ1u.js} +2 -2
- package/dist/{git-EmdFJ4DY.js.map → git-DfG-YJ1u.js.map} +1 -1
- package/dist/harness-B8QC9u0O.js +323 -0
- package/dist/harness-B8QC9u0O.js.map +1 -0
- package/dist/harness.d.ts +19 -31
- package/dist/harness.js +1 -2
- package/dist/{header-_F0EWob3.js → header-hK-Z_Po9.js} +10 -3
- package/dist/{header-_F0EWob3.js.map → header-hK-Z_Po9.js.map} +1 -1
- package/dist/{images-CscddrJU.js → images-0On0cztu.js} +114 -45
- package/dist/images-0On0cztu.js.map +1 -0
- package/dist/index.d.ts +10 -26
- package/dist/index.js +6 -2108
- package/dist/{init-NQfIvi-0.js → init-B77Rpcqc.js} +26 -8
- package/dist/init-B77Rpcqc.js.map +1 -0
- package/dist/init-BrOWin3W.js +1 -0
- package/dist/{invocations-nPvrlZPj.js → invocations-DbGfBAA_.js} +4 -4
- package/dist/{invocations-nPvrlZPj.js.map → invocations-DbGfBAA_.js.map} +1 -1
- package/dist/{judge-CeYPN8P_.js → judge-DW_GDOmB.js} +11 -19
- package/dist/{judge-CeYPN8P_.js.map → judge-DW_GDOmB.js.map} +1 -1
- package/dist/judge.d.ts +2 -2
- package/dist/judge.js +1 -1
- package/dist/{live-S0qODb6o.js → live-jlfszAbb.js} +9 -20
- package/dist/live-jlfszAbb.js.map +1 -0
- package/dist/matchers-Ddmc2z7H.js +118 -0
- package/dist/matchers-Ddmc2z7H.js.map +1 -0
- package/dist/{model-DEQo3FkZ.js → model-DaVCY3rb.js} +2 -2
- package/dist/{model-DEQo3FkZ.js.map → model-DaVCY3rb.js.map} +1 -1
- package/dist/model-NM3ID0uR.js +1 -0
- package/dist/{model-Cl507trk.js → model-h_cDtcRr.js} +19 -18
- package/dist/model-h_cDtcRr.js.map +1 -0
- package/dist/model-nwWJvaUR.js +1 -0
- package/dist/{model-BndnmcLm.js → model-oqcDplJG.js} +271 -34
- package/dist/model-oqcDplJG.js.map +1 -0
- package/dist/{node-Co7EXge0.js → node-B3ydHo6t.js} +10 -47
- package/dist/node-B3ydHo6t.js.map +1 -0
- package/dist/object-CLf2-tNq.js +9 -0
- package/dist/object-CLf2-tNq.js.map +1 -0
- package/dist/{opencode-providers-ByD85Q0l.js → opencode-providers-J9colP0-.js} +96 -21
- package/dist/opencode-providers-J9colP0-.js.map +1 -0
- package/dist/options-Bh2W63dK.js +1119 -0
- package/dist/options-Bh2W63dK.js.map +1 -0
- package/dist/{pairs-DDsjgm5F.js → pairs-CnInRu-G.js} +76 -2
- package/dist/{pairs-DDsjgm5F.js.map → pairs-CnInRu-G.js.map} +1 -1
- package/dist/{patch-CGCVipPu.js → patch-Zac5aIRM.js} +6 -6
- package/dist/{patch-CGCVipPu.js.map → patch-Zac5aIRM.js.map} +1 -1
- package/dist/{plan-PPc4-6xd.js → plan-C9Cy27Ay.js} +75 -32
- package/dist/plan-C9Cy27Ay.js.map +1 -0
- package/dist/preflight-CPWpQeBI.js +1 -0
- package/dist/{preflight-CddycK92.js → preflight-D7iFPKeK.js} +8 -7
- package/dist/preflight-D7iFPKeK.js.map +1 -0
- package/dist/prepare-BGjePFQl.js +2 -0
- package/dist/{prepare-CsP-057p.js → prepare-doGxaAGR.js} +38 -30
- package/dist/prepare-doGxaAGR.js.map +1 -0
- package/dist/process-CSVO_jsc.js +119 -0
- package/dist/process-CSVO_jsc.js.map +1 -0
- package/dist/{provenance-CsX6PHDR.js → provenance-DmE9uPVt.js} +4 -4
- package/dist/{provenance-CsX6PHDR.js.map → provenance-DmE9uPVt.js.map} +1 -1
- package/dist/provider-DehR4CMN.js +1 -0
- package/dist/providers-gDMko8fl.js +1 -0
- package/dist/providers-tAOD1NQN.js +165 -0
- package/dist/providers-tAOD1NQN.js.map +1 -0
- package/dist/{query-BUcwCYsI.js → query-Bes9Kh6Y.js} +3 -3
- package/dist/{query-BUcwCYsI.js.map → query-Bes9Kh6Y.js.map} +1 -1
- package/dist/query-C_G_svLU.js +1 -0
- package/dist/questions-DjAwMxZ3.js +524 -0
- package/dist/questions-DjAwMxZ3.js.map +1 -0
- package/dist/{record-BRP9vZrj.js → record-BKmMvZ6O.js} +9 -1
- package/dist/{record-BRP9vZrj.js.map → record-BKmMvZ6O.js.map} +1 -1
- package/dist/remote-HDRt16ew.js +378 -0
- package/dist/remote-HDRt16ew.js.map +1 -0
- package/dist/{results-BcSHWbgB.js → results-DuauQI3Z.js} +4 -4
- package/dist/{results-BcSHWbgB.js.map → results-DuauQI3Z.js.map} +1 -1
- package/dist/{resume-DZ9AmfPv.js → resume-BRfa8E_s.js} +10 -10
- package/dist/{resume-DZ9AmfPv.js.map → resume-BRfa8E_s.js.map} +1 -1
- package/dist/{root-CvdRlRZX.js → root-DICDHCtp.js} +4 -4
- package/dist/{root-CvdRlRZX.js.map → root-DICDHCtp.js.map} +1 -1
- package/dist/{runtime-Dfb2r-cS.js → runtime-PX_oXiCS.js} +105 -11
- package/dist/runtime-PX_oXiCS.js.map +1 -0
- package/dist/sandbox-D3A8oUb7.js +70 -0
- package/dist/sandbox-D3A8oUb7.js.map +1 -0
- package/dist/sandbox.d.ts +22 -8
- package/dist/sandbox.js +1 -2
- package/dist/server-C7sg1ndo.js +1 -0
- package/dist/{server-Da60oe4b.js → server-XDleKaF_.js} +11 -11
- package/dist/server-XDleKaF_.js.map +1 -0
- package/dist/shared-DYpIb1BI.js +166 -0
- package/dist/shared-DYpIb1BI.js.map +1 -0
- package/dist/{source-BVOnL3sn.js → source-C8xumIWj.js} +2 -2
- package/dist/{source-BVOnL3sn.js.map → source-C8xumIWj.js.map} +1 -1
- package/dist/source-fGd0SaKP.js +1 -0
- package/dist/{src-TdJuDYqB.js → src-B7treWa8.js} +1597 -292
- package/dist/src-B7treWa8.js.map +1 -0
- package/dist/{src-C1E9HDWO.js → src-C7_1SqDP.js} +3 -3
- package/dist/{src-C1E9HDWO.js.map → src-C7_1SqDP.js.map} +1 -1
- package/dist/{src-DDNXsD9H.js → src-CF17Ug08.js} +5 -4
- package/dist/src-CF17Ug08.js.map +1 -0
- package/dist/{src-D_cXqmnI.js → src-CFp86GtV.js} +60 -60
- package/dist/src-CFp86GtV.js.map +1 -0
- package/dist/src-C_lPtowT.js +2 -0
- package/dist/src-DIL0jST0.js +368 -0
- package/dist/src-DIL0jST0.js.map +1 -0
- package/dist/src-DNnG4e4R.js +2 -0
- package/dist/src-DTbrY1hi.js +2 -0
- package/dist/src-DdyJEh2v.js +2 -0
- package/dist/src-Dj9PAroc.js +2 -0
- package/dist/src-Du8H85Qq.js +2 -0
- package/dist/src-DvCg0NBs.js +324 -0
- package/dist/src-DvCg0NBs.js.map +1 -0
- package/dist/{src-CxTC5kNI.js → src-DvK0EIZx.js} +8 -10
- package/dist/{src-CxTC5kNI.js.map → src-DvK0EIZx.js.map} +1 -1
- package/dist/{src-DVy58-zZ.js → src-FGXhkEkH.js} +5 -5
- package/dist/{src-DVy58-zZ.js.map → src-FGXhkEkH.js.map} +1 -1
- package/dist/src-jzagbuqH.js +2 -0
- package/dist/src-ofUaYbuY.js +3 -0
- package/dist/src-pJZOrYR9.js +1 -0
- package/dist/{src-D95O-Smv.js → src-u8_ixn_F.js} +15 -11
- package/dist/src-u8_ixn_F.js.map +1 -0
- package/dist/{state-B72h_jEw.js → state-C__9swoG.js} +36 -24
- package/dist/state-C__9swoG.js.map +1 -0
- package/dist/state-CeR6oz0k.js +66 -0
- package/dist/state-CeR6oz0k.js.map +1 -0
- package/dist/state-CgjQo29K.js +1 -0
- package/dist/studio-app/assets/index-CwQN3f_h.css +2 -0
- package/dist/studio-app/assets/{index-Bgr-efZm.js → index-DrQc2Yxd.js} +12 -12
- package/dist/studio-app/index.html +2 -2
- package/dist/{summary-k3mhWWXv.js → summary-BLAVLySU.js} +202 -17
- package/dist/summary-BLAVLySU.js.map +1 -0
- package/dist/{summary-CJdxaRdM.js → summary-DgyjUh_l.js} +7 -7
- package/dist/{summary-CJdxaRdM.js.map → summary-DgyjUh_l.js.map} +1 -1
- package/dist/testing.d.ts +3 -2
- package/dist/testing.js +3 -2
- package/dist/{tool-target-BU1JnSE9.js → tool-target-D2mcYlSQ.js} +14 -7
- package/dist/tool-target-D2mcYlSQ.js.map +1 -0
- package/dist/{tools-D0gF2QoV.js → tools-GCyNYSc1.js} +7 -7
- package/dist/tools-GCyNYSc1.js.map +1 -0
- package/dist/transcript-BNNANU8A.js +64 -0
- package/dist/transcript-BNNANU8A.js.map +1 -0
- package/dist/types-C5vI3g1C.js.map +1 -1
- package/dist/{types-_LOFdPUf.d.ts → types-g17bRAzt.d.ts} +578 -49
- package/dist/{usage-DDF_6tkV.js → usage-CleNKkly.js} +4 -2
- package/dist/{usage-DDF_6tkV.js.map → usage-CleNKkly.js.map} +1 -1
- package/dist/view/index.d.ts +83 -17
- package/dist/view/index.js +7 -6
- package/dist/views-BW6oCDUQ.js +2 -0
- package/dist/{views-DZ1YDqey.js → views-BmQF4UCI.js} +13 -8
- package/dist/views-BmQF4UCI.js.map +1 -0
- package/dist/{worker-entry-DXeyWY-m.js → worker-entry-yOchGYYv.js} +16 -225
- package/dist/worker-entry-yOchGYYv.js.map +1 -0
- package/dist/{workspace-DpXdrslo.js → workspace-CgyHEM0l.js} +7 -7
- package/dist/{workspace-DpXdrslo.js.map → workspace-CgyHEM0l.js.map} +1 -1
- package/dist/workspace-D8sSgpiy.js +1 -0
- package/docker/Dockerfile +7 -5
- package/package.json +12 -12
- package/dist/agent-Cfj1wD4D.js.map +0 -1
- package/dist/assemble-BbFVjHeS.js.map +0 -1
- package/dist/assemble-CXiTVyHD.js +0 -2
- package/dist/capture-BXhBfmsM.js.map +0 -1
- package/dist/capture-N7r3yeak.js +0 -2
- package/dist/cli-BMjTKY-D.js.map +0 -1
- package/dist/cli-spec-DSvKsOK4.js.map +0 -1
- package/dist/client-CwzU9CiW.js.map +0 -1
- package/dist/command-BK4kOgkH.js.map +0 -1
- package/dist/command-BqJtFiPy.js.map +0 -1
- package/dist/command-CTVGuH8y.js +0 -2
- package/dist/command-JPGNzFsA.js.map +0 -1
- package/dist/commands-B618jg3C.js.map +0 -1
- package/dist/commands-Duo2ur3r.js +0 -2
- package/dist/config-B-E0xRkf.js +0 -447
- package/dist/config-B-E0xRkf.js.map +0 -1
- package/dist/context-CvUv7DUb.js.map +0 -1
- package/dist/db-CnoUy-FZ.js +0 -3
- package/dist/db-DFbtGIYy.js.map +0 -1
- package/dist/debug-SEmW4w8f.js +0 -2
- package/dist/dist-CTzThfu_.js.map +0 -1
- package/dist/docker-2qns7hJ2.js.map +0 -1
- package/dist/docker-D6t23fZl.js +0 -2
- package/dist/docker-IFRW8K5f.js.map +0 -1
- package/dist/doctor-B6oYTPoR.js.map +0 -1
- package/dist/egress-IUKdeayc.js.map +0 -1
- package/dist/environment-DiCljXMD.js +0 -657
- package/dist/environment-DiCljXMD.js.map +0 -1
- package/dist/errors-C9w_ud7g.js.map +0 -1
- package/dist/errors-yDAEwmZo.js.map +0 -1
- package/dist/fake-instructions-CUI33I_F.js +0 -32
- package/dist/fake-instructions-CUI33I_F.js.map +0 -1
- package/dist/files-BM78_nnF.js +0 -2
- package/dist/files-BpYgF2z0.js +0 -2
- package/dist/files-YCCVaTQC.js +0 -2
- package/dist/harness-iqWeJQMM.js +0 -154
- package/dist/harness-iqWeJQMM.js.map +0 -1
- package/dist/images-CscddrJU.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-DBHyi92L.js +0 -2
- package/dist/init-NQfIvi-0.js.map +0 -1
- package/dist/jiti-BcJHCtrb.js +0 -46
- package/dist/jiti-BcJHCtrb.js.map +0 -1
- package/dist/live-S0qODb6o.js.map +0 -1
- package/dist/model-BbLGRtOs.js +0 -2
- package/dist/model-BndnmcLm.js.map +0 -1
- package/dist/model-Cl507trk.js.map +0 -1
- package/dist/model-DMOraCcm.js +0 -2
- package/dist/node-Co7EXge0.js.map +0 -1
- package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
- package/dist/options-DPUlm4FI.js +0 -735
- package/dist/options-DPUlm4FI.js.map +0 -1
- package/dist/plan-PPc4-6xd.js.map +0 -1
- package/dist/preflight-CddycK92.js.map +0 -1
- package/dist/preflight-Zumy0adT.js +0 -2
- package/dist/prepare-CKdMoC7e.js +0 -3
- package/dist/prepare-CsP-057p.js.map +0 -1
- package/dist/provider-BDbNOQhQ.js +0 -2
- package/dist/providers-DkwiLKDS.js +0 -107
- package/dist/providers-DkwiLKDS.js.map +0 -1
- package/dist/providers-yXZZcPfx.js +0 -2
- package/dist/query-noGbekGF.js +0 -2
- package/dist/questions-BEPj98fZ.js +0 -234
- package/dist/questions-BEPj98fZ.js.map +0 -1
- package/dist/runtime-Dfb2r-cS.js.map +0 -1
- package/dist/sandbox--ZXuscAZ.js +0 -134
- package/dist/sandbox--ZXuscAZ.js.map +0 -1
- package/dist/server-Da60oe4b.js.map +0 -1
- package/dist/server-DiGR4JxK.js +0 -2
- package/dist/source-Dqu0jKwx.js +0 -2
- package/dist/src-BHNiP-5A.js +0 -4
- package/dist/src-BT4dB5CO.js +0 -2
- package/dist/src-BT5pwco0.js +0 -3
- package/dist/src-BrMbt1B2.js +0 -3
- package/dist/src-D13vpMh0.js +0 -3
- package/dist/src-D95O-Smv.js.map +0 -1
- package/dist/src-DDNXsD9H.js.map +0 -1
- package/dist/src-D_cXqmnI.js.map +0 -1
- package/dist/src-DdRlaiRc.js +0 -3
- package/dist/src-TdJuDYqB.js.map +0 -1
- package/dist/src-xczuQbE6.js +0 -3
- package/dist/state-B72h_jEw.js.map +0 -1
- package/dist/state-Bf_Vq_pV.js +0 -2
- package/dist/studio-app/assets/index-CUx6GoL5.css +0 -2
- package/dist/summary-k3mhWWXv.js.map +0 -1
- package/dist/tool-target-BU1JnSE9.js.map +0 -1
- package/dist/tools-D0gF2QoV.js.map +0 -1
- package/dist/views-DZ1YDqey.js.map +0 -1
- package/dist/views-Ds0GXWtX.js +0 -3
- package/dist/worker-entry-DXeyWY-m.js.map +0 -1
- 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`)
|
|
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
|
|
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
|
|
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 }
|
|
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: '
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
938
|
-
*
|
|
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
|
-
|
|
941
|
-
|
|
942
|
-
|
|
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
|
|
949
|
-
* Call-only: the bytes are on this attempt.
|
|
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
|
|
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
|
-
*
|
|
1005
|
-
*
|
|
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
|
-
|
|
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
|
|
1078
|
-
*
|
|
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
|
|
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?:
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
1285
|
-
*
|
|
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
|
|
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
|
-
/**
|
|
1414
|
-
|
|
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, `
|
|
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
|
|
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
|
-
/**
|
|
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
|
|
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:
|
|
1831
|
-
b:
|
|
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
|
|
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
|
-
/**
|
|
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 {
|
|
2091
|
-
//# sourceMappingURL=types-
|
|
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
|