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.
- package/README.md +42 -30
- 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-6FefIhX7.js → agent-CURAwx_q.js} +6 -6
- package/dist/{agent-6FefIhX7.js.map → agent-CURAwx_q.js.map} +1 -1
- package/dist/{agent-WSmTaesf.js → agent-CaS_2Sce.js} +46 -15
- package/dist/agent-CaS_2Sce.js.map +1 -0
- package/dist/{analysis-DlGBDjTj.js → analysis-Bxub9LMT.js} +4 -4
- package/dist/{analysis-DlGBDjTj.js.map → analysis-Bxub9LMT.js.map} +1 -1
- package/dist/{assemble-BCZzTyR7.js → assemble-B9Alds-z.js} +69 -41
- package/dist/assemble-B9Alds-z.js.map +1 -0
- package/dist/assemble-J5MukZFY.js +1 -0
- package/dist/{client-Bbo9SPlK.js → assert-EUIoRdIt.js} +10 -113
- package/dist/assert-EUIoRdIt.js.map +1 -0
- package/dist/bridge/index.mjs +248 -55
- package/dist/{capture-Bp74Z6Fr.js → capture-CNb9SuU5.js} +145 -31
- package/dist/capture-CNb9SuU5.js.map +1 -0
- package/dist/capture-jquXZBKK.js +1 -0
- package/dist/{cli-CVrMh_qz.js → cli-D303Vj5N.js} +133 -115
- package/dist/cli-D303Vj5N.js.map +1 -0
- package/dist/{cli-spec-CKEYa8V2.js → cli-spec-BPZbQG2p.js} +36 -17
- 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-CzIFp1JQ.js → command-BLfT7vnQ.js} +18 -17
- package/dist/command-BLfT7vnQ.js.map +1 -0
- package/dist/{command-C5xFPKHM.js → command-BT9a37ZR.js} +374 -72
- package/dist/command-BT9a37ZR.js.map +1 -0
- package/dist/{command-DUT5l13I.js → command-Bge8F7Ko.js} +316 -83
- package/dist/command-Bge8F7Ko.js.map +1 -0
- package/dist/command-BkFjijN2.js +1 -0
- package/dist/{command-BFP0hKEb.js → command-CMJtHKRa.js} +14 -14
- package/dist/{command-BFP0hKEb.js.map → command-CMJtHKRa.js.map} +1 -1
- package/dist/commands-1p-bIWhN.js +1 -0
- package/dist/{commands-CLmPBrTS.js → commands-BFx16WB8.js} +7 -7
- 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-DbSMEVKs.js → context-C1mxXh80.js} +11 -3
- package/dist/context-C1mxXh80.js.map +1 -0
- package/dist/{db-CfQFwJtq.js → db-CdHizc4_.js} +455 -36
- 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-CRQGQbIt.js → docker-7b_2SaH7.js} +22 -21
- package/dist/docker-7b_2SaH7.js.map +1 -0
- package/dist/{docker-DV2GNgle.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-DlKycx5H.js → doctor-BYNok4UO.js} +262 -83
- 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-BhzNh7Yi.js → egress-C4PZTSSe.js} +146 -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/files-BAt0i00X.js +1 -0
- package/dist/{files-CSzVADHn.js → files-BXUdY8tr.js} +9 -8
- package/dist/{files-CSzVADHn.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-DJUFg-4e.js → files-DQmHE7pb.js} +5 -5
- package/dist/{files-DJUFg-4e.js.map → files-DQmHE7pb.js.map} +1 -1
- package/dist/files-ZZPqfAo6.js +1 -0
- package/dist/harness-B8QC9u0O.js +323 -0
- package/dist/harness-B8QC9u0O.js.map +1 -0
- package/dist/harness.d.ts +16 -30
- package/dist/harness.js +1 -2
- package/dist/{header-CALhmafp.js → header-hK-Z_Po9.js} +2 -2
- package/dist/{header-CALhmafp.js.map → header-hK-Z_Po9.js.map} +1 -1
- package/dist/{images-BMgdpMAX.js → images-0On0cztu.js} +114 -45
- package/dist/images-0On0cztu.js.map +1 -0
- package/dist/index.d.ts +9 -37
- package/dist/index.js +6 -2138
- package/dist/{init-BIdLF0F9.js → init-B77Rpcqc.js} +26 -8
- package/dist/init-B77Rpcqc.js.map +1 -0
- package/dist/init-BrOWin3W.js +1 -0
- package/dist/{invocations-CLaL8AuW.js → invocations-DbGfBAA_.js} +4 -4
- package/dist/{invocations-CLaL8AuW.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-B1BZoZ9b.js → model-h_cDtcRr.js} +18 -17
- package/dist/model-h_cDtcRr.js.map +1 -0
- package/dist/model-nwWJvaUR.js +1 -0
- package/dist/{model-BOnlAPzs.js → model-oqcDplJG.js} +111 -19
- 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-bDV8YFW0.js → patch-Zac5aIRM.js} +6 -6
- package/dist/{patch-bDV8YFW0.js.map → patch-Zac5aIRM.js.map} +1 -1
- package/dist/{plan-DUydFc_1.js → plan-C9Cy27Ay.js} +24 -9
- package/dist/plan-C9Cy27Ay.js.map +1 -0
- package/dist/preflight-CPWpQeBI.js +1 -0
- package/dist/{preflight-BkoSxf4C.js → preflight-D7iFPKeK.js} +8 -7
- package/dist/preflight-D7iFPKeK.js.map +1 -0
- package/dist/prepare-BGjePFQl.js +2 -0
- package/dist/{prepare-CUAWHebF.js → prepare-doGxaAGR.js} +38 -30
- package/dist/prepare-doGxaAGR.js.map +1 -0
- package/dist/{provenance-D7HK3vzt.js → provenance-DmE9uPVt.js} +3 -3
- package/dist/{provenance-D7HK3vzt.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-BjBMLa-C.js → query-Bes9Kh6Y.js} +3 -3
- package/dist/{query-BjBMLa-C.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-Di7m8dQ3.js → results-DuauQI3Z.js} +4 -4
- package/dist/{results-Di7m8dQ3.js.map → results-DuauQI3Z.js.map} +1 -1
- package/dist/{resume-SUz1GskV.js → resume-BRfa8E_s.js} +10 -10
- package/dist/{resume-SUz1GskV.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-DdsfnRz_.js → runtime-PX_oXiCS.js} +23 -71
- 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 +19 -6
- package/dist/sandbox.js +1 -2
- package/dist/server-C7sg1ndo.js +1 -0
- package/dist/{server-BNnXtmS8.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-Dof0NQBm.js → source-C8xumIWj.js} +2 -2
- package/dist/{source-Dof0NQBm.js.map → source-C8xumIWj.js.map} +1 -1
- package/dist/source-fGd0SaKP.js +1 -0
- package/dist/{src-8rRXy4u9.js → src-B7treWa8.js} +1538 -180
- 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-C_4Umgh2.js → src-CFp86GtV.js} +52 -51
- 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-COgE7991.js → src-DvK0EIZx.js} +5 -5
- package/dist/{src-COgE7991.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-CiXyLqg0.js → state-C__9swoG.js} +35 -23
- 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-CROH2NB3.js → index-DrQc2Yxd.js} +11 -11
- package/dist/studio-app/index.html +2 -2
- package/dist/{summary-BTksrIxn.js → summary-BLAVLySU.js} +150 -19
- package/dist/summary-BLAVLySU.js.map +1 -0
- package/dist/{summary-2OAWF2N7.js → summary-DgyjUh_l.js} +7 -7
- package/dist/{summary-2OAWF2N7.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-B10Uj7OI.js → tools-GCyNYSc1.js} +6 -6
- 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-D8RLfkFP.d.ts → types-g17bRAzt.d.ts} +389 -42
- 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 +42 -8
- package/dist/view/index.js +6 -6
- package/dist/views-BW6oCDUQ.js +2 -0
- package/dist/{views-Dqa5ojfZ.js → views-BmQF4UCI.js} +13 -8
- package/dist/views-BmQF4UCI.js.map +1 -0
- package/dist/{worker-entry-BAikHl9F.js → worker-entry-yOchGYYv.js} +16 -229
- package/dist/worker-entry-yOchGYYv.js.map +1 -0
- package/dist/{workspace-C-TrNIUc.js → workspace-CgyHEM0l.js} +6 -6
- package/dist/{workspace-C-TrNIUc.js.map → workspace-CgyHEM0l.js.map} +1 -1
- package/dist/workspace-D8sSgpiy.js +1 -0
- package/package.json +12 -12
- package/dist/agent-WSmTaesf.js.map +0 -1
- package/dist/assemble-BCZzTyR7.js.map +0 -1
- package/dist/assemble-C5qq5yT2.js +0 -2
- package/dist/capture-Bp74Z6Fr.js.map +0 -1
- package/dist/capture-DS-cPyuE.js +0 -2
- package/dist/cli-CVrMh_qz.js.map +0 -1
- package/dist/cli-spec-CKEYa8V2.js.map +0 -1
- package/dist/client-Bbo9SPlK.js.map +0 -1
- package/dist/command-BrmXUC-W.js +0 -2
- package/dist/command-C5xFPKHM.js.map +0 -1
- package/dist/command-CzIFp1JQ.js.map +0 -1
- package/dist/command-DUT5l13I.js.map +0 -1
- package/dist/commands-CLmPBrTS.js.map +0 -1
- package/dist/commands-fI3G2Wnh.js +0 -2
- package/dist/config-CGvBeewH.js +0 -457
- package/dist/config-CGvBeewH.js.map +0 -1
- package/dist/context-DbSMEVKs.js.map +0 -1
- package/dist/db-CSSFtGcN.js +0 -3
- package/dist/db-CfQFwJtq.js.map +0 -1
- package/dist/debug-SEmW4w8f.js +0 -2
- package/dist/dist-CTzThfu_.js.map +0 -1
- package/dist/docker-CRQGQbIt.js.map +0 -1
- package/dist/docker-DV2GNgle.js.map +0 -1
- package/dist/docker-Df_YOxxB.js +0 -2
- package/dist/doctor-DlKycx5H.js.map +0 -1
- package/dist/egress-BhzNh7Yi.js.map +0 -1
- package/dist/environment-1jE-HhO-.js +0 -657
- package/dist/environment-1jE-HhO-.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-AiEKuEZe.js +0 -2
- package/dist/files-BM78_nnF.js +0 -2
- package/dist/files-BMCvfB4X.js +0 -2
- package/dist/harness-CeCp2GSW.js +0 -171
- package/dist/harness-CeCp2GSW.js.map +0 -1
- package/dist/images-BMgdpMAX.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-B6vegaP_.js +0 -2
- package/dist/init-BIdLF0F9.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-B1BZoZ9b.js.map +0 -1
- package/dist/model-BOnlAPzs.js.map +0 -1
- package/dist/model-DWeg5J7z.js +0 -2
- package/dist/model-FXko2kl7.js +0 -2
- package/dist/node-Co7EXge0.js.map +0 -1
- package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
- package/dist/options-CKqyPGxX.js +0 -739
- package/dist/options-CKqyPGxX.js.map +0 -1
- package/dist/plan-DUydFc_1.js.map +0 -1
- package/dist/preflight-BkoSxf4C.js.map +0 -1
- package/dist/preflight-D5LW7Oqi.js +0 -2
- package/dist/prepare-CUAWHebF.js.map +0 -1
- package/dist/prepare-oji2oO8W.js +0 -3
- package/dist/provider-BDbNOQhQ.js +0 -2
- package/dist/providers-B1DzMvmH.js +0 -107
- package/dist/providers-B1DzMvmH.js.map +0 -1
- package/dist/providers-CpEfNU1F.js +0 -2
- package/dist/query-oPO_XrTy.js +0 -2
- package/dist/questions-B8by4Bbt.js +0 -234
- package/dist/questions-B8by4Bbt.js.map +0 -1
- package/dist/runtime-DdsfnRz_.js.map +0 -1
- package/dist/sandbox-D5v-of6d.js +0 -139
- package/dist/sandbox-D5v-of6d.js.map +0 -1
- package/dist/server-BNnXtmS8.js.map +0 -1
- package/dist/server-BNwoKzlm.js +0 -2
- package/dist/source-Bk_0ZaEY.js +0 -2
- package/dist/src-8rRXy4u9.js.map +0 -1
- package/dist/src-BGWuWp6I.js +0 -3
- package/dist/src-BRt0O02i.js +0 -3
- package/dist/src-Bx2x1ekD.js +0 -3
- package/dist/src-C_4Umgh2.js.map +0 -1
- package/dist/src-D95O-Smv.js.map +0 -1
- package/dist/src-DDNXsD9H.js.map +0 -1
- package/dist/src-DLa-ESW0.js +0 -4
- package/dist/src-cN0aB-WR.js +0 -3
- package/dist/src-cdIVjC5b.js +0 -2
- package/dist/src-sIsDHWYq.js +0 -3
- package/dist/state-Bo5zg4da.js +0 -2
- package/dist/state-CiXyLqg0.js.map +0 -1
- package/dist/studio-app/assets/index-B9MCTfuu.css +0 -2
- package/dist/summary-BTksrIxn.js.map +0 -1
- package/dist/tool-target-BU1JnSE9.js.map +0 -1
- package/dist/tools-B10Uj7OI.js.map +0 -1
- package/dist/views-Cs2Oqayd.js +0 -3
- package/dist/views-Dqa5ojfZ.js.map +0 -1
- package/dist/worker-entry-BAikHl9F.js.map +0 -1
- 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
|
|
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: '
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
1075
|
-
*
|
|
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
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
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
|
|
1086
|
-
* 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.
|
|
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
|
|
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.
|
|
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
|
|
1221
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
1430
|
-
*
|
|
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
|
-
/**
|
|
1564
|
-
|
|
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, `
|
|
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
|
-
/**
|
|
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
|
|
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:
|
|
1982
|
-
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
|
+
}>;
|
|
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
|
|
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 {
|
|
2273
|
-
//# 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
|