@runcofactor/cli 0.57.0 → 0.58.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 +40 -0
- package/dist/{account-S7VHLHYX.js → account-CWSADXJD.js} +5 -5
- package/dist/{alert-DZUI3JEU.js → alert-VEZZJPIH.js} +8 -8
- package/dist/{api-catalog-WP6AQYUG.js → api-catalog-OBE6ITCJ.js} +5 -5
- package/dist/{api-key-U57EC2YF.js → api-key-265DBPSR.js} +5 -5
- package/dist/{attachment-MICVVXUW.js → attachment-QE65VNDG.js} +5 -5
- package/dist/{auth-UDD77PG6.js → auth-DG6RD4UA.js} +3 -3
- package/dist/{benchmark-Q5BVGQ3I.js → benchmark-3R75GENH.js} +5 -5
- package/dist/billing-AGY6VUCA.js +64 -0
- package/dist/billing-AGY6VUCA.js.map +1 -0
- package/dist/{blackcat-TZNSDQAC.js → blackcat-EKZS3TBD.js} +3 -3
- package/dist/{chunk-AHS2HMEH.js → chunk-4KFJQPJF.js} +3 -3
- package/dist/{chunk-LP4X7TWI.js → chunk-56WV7CFM.js} +2 -2
- package/dist/{chunk-3EKIGWMN.js → chunk-A6VDLUMH.js} +3 -3
- package/dist/{chunk-XQZJWDM4.js → chunk-B7G4TOYC.js} +5 -5
- package/dist/{chunk-U3MXJTTD.js → chunk-BDPNJKUZ.js} +10 -10
- package/dist/{chunk-IIDQM4MY.js → chunk-BMFD4OPC.js} +2 -2
- package/dist/{chunk-EYHJ5FIA.js → chunk-C6SNLHVE.js} +10 -1
- package/dist/chunk-C6SNLHVE.js.map +1 -0
- package/dist/{chunk-T5MU76RA.js → chunk-C77XIO2W.js} +4 -4
- package/dist/{chunk-FBEQNW2P.js → chunk-DFN2NH37.js} +2 -2
- package/dist/{chunk-4SQKKD3R.js → chunk-EDX47DXT.js} +2 -2
- package/dist/{chunk-BSCEOIYX.js → chunk-FQ6P522C.js} +2 -2
- package/dist/{chunk-6IMNRYC3.js → chunk-GQSW6ZY3.js} +5 -5
- package/dist/{chunk-4GDEKB5S.js → chunk-GVNSCSIC.js} +4 -4
- package/dist/{chunk-W4P6BGJ7.js → chunk-IN3AF6LI.js} +4 -4
- package/dist/{chunk-CZOYFKTY.js → chunk-IVJU3LP6.js} +3 -3
- package/dist/{chunk-H2K3ABPO.js → chunk-K54XL64A.js} +6 -6
- package/dist/{chunk-T6ZNIMI4.js → chunk-LRIP5IQD.js} +3 -3
- package/dist/chunk-LRIP5IQD.js.map +1 -0
- package/dist/{chunk-T6KTBHWD.js → chunk-LZLSRN5Q.js} +6 -6
- package/dist/{chunk-YILSW5ZY.js → chunk-MCJOF3JX.js} +4 -4
- package/dist/{chunk-SBQLD7X6.js → chunk-PN5IK7CJ.js} +2 -2
- package/dist/{chunk-K3MG2ZMH.js → chunk-RIBSXEAM.js} +2 -2
- package/dist/{chunk-DTB5HUD2.js → chunk-SPTLZJOF.js} +5 -4
- package/dist/chunk-SPTLZJOF.js.map +1 -0
- package/dist/{chunk-K2USFSTX.js → chunk-T7NZHHC5.js} +3 -3
- package/dist/{chunk-5MFHNT56.js → chunk-TWPCN4DV.js} +2 -2
- package/dist/chunk-UPP4F2BE.js +519 -0
- package/dist/chunk-UPP4F2BE.js.map +1 -0
- package/dist/{chunk-KD7VGZX7.js → chunk-UZZ5OHXT.js} +7 -7
- package/dist/{chunk-N55RKCGR.js → chunk-V22CGGHO.js} +6 -1
- package/dist/chunk-V22CGGHO.js.map +1 -0
- package/dist/{chunk-YFXTMFYB.js → chunk-V6OC2WQL.js} +5 -5
- package/dist/{chunk-YV4RASGX.js → chunk-W43YGZOP.js} +18 -6
- package/dist/chunk-W43YGZOP.js.map +1 -0
- package/dist/{chunk-TG32WC4J.js → chunk-W6TPKE5S.js} +2 -2
- package/dist/{chunk-72Y65NWI.js → chunk-WY4R4IL5.js} +3 -3
- package/dist/{chunk-XGGHOHZS.js → chunk-XD3PSGFG.js} +3 -3
- package/dist/chunk-XD3PSGFG.js.map +1 -0
- package/dist/{chunk-ETXIGTS7.js → chunk-XKR275VJ.js} +3 -3
- package/dist/{credential-HM4THJOS.js → credential-DPUCDGYC.js} +5 -5
- package/dist/{credential-template-JBV3FZBY.js → credential-template-67RQWMH2.js} +5 -5
- package/dist/{dev-D2HS5XXN.js → dev-MU45HWAN.js} +456 -170
- package/dist/dev-MU45HWAN.js.map +1 -0
- package/dist/{digest-54VJ7KTF.js → digest-4PABSK2F.js} +8 -8
- package/dist/{docs-PPQSNRP6.js → docs-ZL5QOHCB.js} +5 -5
- package/dist/{doctor-CXFGSPWH.js → doctor-J5X2HSLJ.js} +3 -3
- package/dist/{environment-6MXRQV5L.js → environment-7Q6WDKMM.js} +7 -7
- package/dist/{eval-HCDXL4QT.js → eval-37P36M53.js} +51 -358
- package/dist/eval-37P36M53.js.map +1 -0
- package/dist/{exploration-U2WMYBZ3.js → exploration-7PHVC753.js} +5 -5
- package/dist/{exploratory-test-FD7VGUKE.js → exploratory-test-NE7ECFWS.js} +6 -6
- package/dist/{external-run-THSD26B7.js → external-run-KZGHVSHY.js} +134 -11
- package/dist/external-run-KZGHVSHY.js.map +1 -0
- package/dist/{feature-flag-D5IZ6OEG.js → feature-flag-YFWCPWIR.js} +5 -5
- package/dist/{feedback-6YCQMQQ3.js → feedback-HVR7LMFL.js} +6 -6
- package/dist/{flow-OVEA7273.js → flow-M6QBA4WR.js} +5 -5
- package/dist/{github-L2AFIEVN.js → github-HUBAWWFS.js} +6 -6
- package/dist/index.js +87 -80
- package/dist/index.js.map +1 -1
- package/dist/{init-ADOE2D6R.js → init-5A7VDZU4.js} +5 -5
- package/dist/{install-SB6NLXDQ.js → install-HM3USHVU.js} +5 -5
- package/dist/{issues-V2DSZXAN.js → issues-W6WIQ4RX.js} +8 -8
- package/dist/{knobs-MR4H55EB.js → knobs-NR52HEAL.js} +5 -5
- package/dist/{landing-KTYDL7QJ.js → landing-FHE7RWCR.js} +7 -7
- package/dist/{list-DFBHWU77.js → list-6J6BCU2L.js} +5 -5
- package/dist/{local-QXSTGDFN.js → local-DNRUTJBN.js} +7 -7
- package/dist/{login-KGIZAZCR.js → login-K7CNO4QS.js} +5 -5
- package/dist/{mcp-EDYHUOFI.js → mcp-G72SEYO5.js} +10 -10
- package/dist/mcp-eval-X4AGPFWW.js +450 -0
- package/dist/mcp-eval-X4AGPFWW.js.map +1 -0
- package/dist/{metrics-JUONV7EL.js → metrics-WXQPVDQY.js} +5 -5
- package/dist/{monitor-F7F7EJAL.js → monitor-URPOJOER.js} +5 -5
- package/dist/{perf-L2YL4Z2L.js → perf-WG6DAZBT.js} +11 -11
- package/dist/{product-UBLNRF5Y.js → product-TGOCFPCC.js} +5 -5
- package/dist/{product-map-7K5I5TVU.js → product-map-PKDPF2FB.js} +7 -7
- package/dist/{prompts-3JNN4M46.js → prompts-63KKMXLZ.js} +5 -5
- package/dist/{proofs-MJ7MGBCW.js → proofs-XRQ3BMM2.js} +9 -9
- package/dist/{property-TCDBREZL.js → property-O3PMHQLJ.js} +6 -6
- package/dist/{psql-YD54GQMP.js → psql-SUE2TORV.js} +5 -5
- package/dist/{record-OWBURAZ4.js → record-C245ESQA.js} +6 -6
- package/dist/{redis-3SIKQULP.js → redis-CAOX2ODS.js} +5 -5
- package/dist/{release-DMCBRVA5.js → release-ALUGJZTN.js} +5 -5
- package/dist/{runbook-ZRKWCLZE.js → runbook-63HBD7WH.js} +5 -5
- package/dist/{sandbox-HMZR6SKM.js → sandbox-IC5E53CC.js} +9 -9
- package/dist/{scenarios-2QHT5A4F.js → scenarios-JR2H7SZC.js} +5 -5
- package/dist/{schedule-4L7LOUDB.js → schedule-FHMCSKPL.js} +8 -8
- package/dist/{session-JHLYECKM.js → session-BKHVVZS3.js} +9 -9
- package/dist/{skill-ARJSVWCZ.js → skill-TZE27TIN.js} +3 -3
- package/dist/{slack-T7CR4SAU.js → slack-3BQ2T3ZS.js} +6 -6
- package/dist/{spec-RDNTNUE2.js → spec-PCAK2BX5.js} +5 -5
- package/dist/{src-DJETLMXP.js → src-BCJZMHSQ.js} +3 -3
- package/dist/{src-H7IBLPDW.js → src-BPKBSXKX.js} +4 -4
- package/dist/{src-DPJGVNYG.js → src-PNV4HGUY.js} +3 -3
- package/dist/{src-UKPMEXXT.js → src-ZJGBNWYB.js} +5 -5
- package/dist/{start-NR7W2LIP.js → start-BA5UEI3W.js} +5 -5
- package/dist/{status-UDNXR5GK.js → status-TUXK57H4.js} +5 -5
- package/dist/{tag-ADP2MZ3V.js → tag-IBDEJZM7.js} +6 -6
- package/dist/{task-KQOUTIJU.js → task-WXZQM4BW.js} +6 -6
- package/dist/{teams-D4QXSVDA.js → teams-656T2IHZ.js} +7 -7
- package/dist/{test-suite-DYMY4YAG.js → test-suite-ETXWE5HB.js} +12 -12
- package/dist/{tickets-BX3LFWUS.js → tickets-LWP3XIHG.js} +5 -5
- package/dist/{trace-MBRU6DLE.js → trace-RNEY6XCJ.js} +8 -8
- package/dist/{triage-IXAU73VL.js → triage-VZIIN7KB.js} +6 -6
- package/dist/{trigger-CHSWCUV3.js → trigger-KTTSNSRU.js} +10 -10
- package/dist/{update-check-LLETICM4.js → update-check-SLGKNOUC.js} +4 -4
- package/dist/{upgrade-35WVNUEG.js → upgrade-2KSYA4GE.js} +5 -5
- package/dist/{usage-YUYXUNF2.js → usage-SC4NWQ5A.js} +99 -14
- package/dist/usage-SC4NWQ5A.js.map +1 -0
- package/dist/{utilities-MOHIKBBF.js → utilities-O4VVADHM.js} +6 -6
- package/dist/{visual-RNYERKX4.js → visual-ZWQTVXTM.js} +5 -5
- package/dist/{workflow-NM5IC7ZQ.js → workflow-7HKA2WKO.js} +30 -30
- package/dist/{workflow-cache-JNN7BS2K.js → workflow-cache-FDN2N5HH.js} +18 -18
- package/dist/{workflow-cache-convergence-resolve-4SO2MP7T.js → workflow-cache-convergence-resolve-BGEUM7WV.js} +5 -5
- package/dist/{workflow-debug-E7BXSSOG.js → workflow-debug-KNE7SVXQ.js} +11 -11
- package/dist/{workflow-feedback-EWAK45AB.js → workflow-feedback-YY2FZTV4.js} +5 -5
- package/dist/{workflow-fork-NO5IFBD4.js → workflow-fork-FH5KBVWP.js} +5 -5
- package/dist/{workflow-promotion-NWIZNAR4.js → workflow-promotion-RRI53FB6.js} +5 -5
- package/dist/{workflow-proposals-XMAZJT3X.js → workflow-proposals-5XGCOTEU.js} +5 -5
- package/dist/{workflow-revisions-4EQMLZGY.js → workflow-revisions-M6WPGXAT.js} +5 -5
- package/dist/{workflow-status-AZMXQZLC.js → workflow-status-I5BSSWHY.js} +5 -5
- package/package.json +2 -2
- package/dist/chunk-DTB5HUD2.js.map +0 -1
- package/dist/chunk-EYHJ5FIA.js.map +0 -1
- package/dist/chunk-N55RKCGR.js.map +0 -1
- package/dist/chunk-T6ZNIMI4.js.map +0 -1
- package/dist/chunk-XGGHOHZS.js.map +0 -1
- package/dist/chunk-YV4RASGX.js.map +0 -1
- package/dist/dev-D2HS5XXN.js.map +0 -1
- package/dist/eval-HCDXL4QT.js.map +0 -1
- package/dist/external-run-THSD26B7.js.map +0 -1
- package/dist/mcp-eval-YT2RFIC5.js +0 -196
- package/dist/mcp-eval-YT2RFIC5.js.map +0 -1
- package/dist/usage-YUYXUNF2.js.map +0 -1
- /package/dist/{account-S7VHLHYX.js.map → account-CWSADXJD.js.map} +0 -0
- /package/dist/{alert-DZUI3JEU.js.map → alert-VEZZJPIH.js.map} +0 -0
- /package/dist/{api-catalog-WP6AQYUG.js.map → api-catalog-OBE6ITCJ.js.map} +0 -0
- /package/dist/{api-key-U57EC2YF.js.map → api-key-265DBPSR.js.map} +0 -0
- /package/dist/{attachment-MICVVXUW.js.map → attachment-QE65VNDG.js.map} +0 -0
- /package/dist/{auth-UDD77PG6.js.map → auth-DG6RD4UA.js.map} +0 -0
- /package/dist/{benchmark-Q5BVGQ3I.js.map → benchmark-3R75GENH.js.map} +0 -0
- /package/dist/{blackcat-TZNSDQAC.js.map → blackcat-EKZS3TBD.js.map} +0 -0
- /package/dist/{chunk-AHS2HMEH.js.map → chunk-4KFJQPJF.js.map} +0 -0
- /package/dist/{chunk-LP4X7TWI.js.map → chunk-56WV7CFM.js.map} +0 -0
- /package/dist/{chunk-3EKIGWMN.js.map → chunk-A6VDLUMH.js.map} +0 -0
- /package/dist/{chunk-XQZJWDM4.js.map → chunk-B7G4TOYC.js.map} +0 -0
- /package/dist/{chunk-U3MXJTTD.js.map → chunk-BDPNJKUZ.js.map} +0 -0
- /package/dist/{chunk-IIDQM4MY.js.map → chunk-BMFD4OPC.js.map} +0 -0
- /package/dist/{chunk-T5MU76RA.js.map → chunk-C77XIO2W.js.map} +0 -0
- /package/dist/{chunk-FBEQNW2P.js.map → chunk-DFN2NH37.js.map} +0 -0
- /package/dist/{chunk-4SQKKD3R.js.map → chunk-EDX47DXT.js.map} +0 -0
- /package/dist/{chunk-BSCEOIYX.js.map → chunk-FQ6P522C.js.map} +0 -0
- /package/dist/{chunk-6IMNRYC3.js.map → chunk-GQSW6ZY3.js.map} +0 -0
- /package/dist/{chunk-4GDEKB5S.js.map → chunk-GVNSCSIC.js.map} +0 -0
- /package/dist/{chunk-W4P6BGJ7.js.map → chunk-IN3AF6LI.js.map} +0 -0
- /package/dist/{chunk-CZOYFKTY.js.map → chunk-IVJU3LP6.js.map} +0 -0
- /package/dist/{chunk-H2K3ABPO.js.map → chunk-K54XL64A.js.map} +0 -0
- /package/dist/{chunk-T6KTBHWD.js.map → chunk-LZLSRN5Q.js.map} +0 -0
- /package/dist/{chunk-YILSW5ZY.js.map → chunk-MCJOF3JX.js.map} +0 -0
- /package/dist/{chunk-SBQLD7X6.js.map → chunk-PN5IK7CJ.js.map} +0 -0
- /package/dist/{chunk-K3MG2ZMH.js.map → chunk-RIBSXEAM.js.map} +0 -0
- /package/dist/{chunk-K2USFSTX.js.map → chunk-T7NZHHC5.js.map} +0 -0
- /package/dist/{chunk-5MFHNT56.js.map → chunk-TWPCN4DV.js.map} +0 -0
- /package/dist/{chunk-KD7VGZX7.js.map → chunk-UZZ5OHXT.js.map} +0 -0
- /package/dist/{chunk-YFXTMFYB.js.map → chunk-V6OC2WQL.js.map} +0 -0
- /package/dist/{chunk-TG32WC4J.js.map → chunk-W6TPKE5S.js.map} +0 -0
- /package/dist/{chunk-72Y65NWI.js.map → chunk-WY4R4IL5.js.map} +0 -0
- /package/dist/{chunk-ETXIGTS7.js.map → chunk-XKR275VJ.js.map} +0 -0
- /package/dist/{credential-HM4THJOS.js.map → credential-DPUCDGYC.js.map} +0 -0
- /package/dist/{credential-template-JBV3FZBY.js.map → credential-template-67RQWMH2.js.map} +0 -0
- /package/dist/{digest-54VJ7KTF.js.map → digest-4PABSK2F.js.map} +0 -0
- /package/dist/{docs-PPQSNRP6.js.map → docs-ZL5QOHCB.js.map} +0 -0
- /package/dist/{doctor-CXFGSPWH.js.map → doctor-J5X2HSLJ.js.map} +0 -0
- /package/dist/{environment-6MXRQV5L.js.map → environment-7Q6WDKMM.js.map} +0 -0
- /package/dist/{exploration-U2WMYBZ3.js.map → exploration-7PHVC753.js.map} +0 -0
- /package/dist/{exploratory-test-FD7VGUKE.js.map → exploratory-test-NE7ECFWS.js.map} +0 -0
- /package/dist/{feature-flag-D5IZ6OEG.js.map → feature-flag-YFWCPWIR.js.map} +0 -0
- /package/dist/{feedback-6YCQMQQ3.js.map → feedback-HVR7LMFL.js.map} +0 -0
- /package/dist/{flow-OVEA7273.js.map → flow-M6QBA4WR.js.map} +0 -0
- /package/dist/{github-L2AFIEVN.js.map → github-HUBAWWFS.js.map} +0 -0
- /package/dist/{init-ADOE2D6R.js.map → init-5A7VDZU4.js.map} +0 -0
- /package/dist/{install-SB6NLXDQ.js.map → install-HM3USHVU.js.map} +0 -0
- /package/dist/{issues-V2DSZXAN.js.map → issues-W6WIQ4RX.js.map} +0 -0
- /package/dist/{knobs-MR4H55EB.js.map → knobs-NR52HEAL.js.map} +0 -0
- /package/dist/{landing-KTYDL7QJ.js.map → landing-FHE7RWCR.js.map} +0 -0
- /package/dist/{list-DFBHWU77.js.map → list-6J6BCU2L.js.map} +0 -0
- /package/dist/{local-QXSTGDFN.js.map → local-DNRUTJBN.js.map} +0 -0
- /package/dist/{login-KGIZAZCR.js.map → login-K7CNO4QS.js.map} +0 -0
- /package/dist/{mcp-EDYHUOFI.js.map → mcp-G72SEYO5.js.map} +0 -0
- /package/dist/{metrics-JUONV7EL.js.map → metrics-WXQPVDQY.js.map} +0 -0
- /package/dist/{monitor-F7F7EJAL.js.map → monitor-URPOJOER.js.map} +0 -0
- /package/dist/{perf-L2YL4Z2L.js.map → perf-WG6DAZBT.js.map} +0 -0
- /package/dist/{product-UBLNRF5Y.js.map → product-TGOCFPCC.js.map} +0 -0
- /package/dist/{product-map-7K5I5TVU.js.map → product-map-PKDPF2FB.js.map} +0 -0
- /package/dist/{prompts-3JNN4M46.js.map → prompts-63KKMXLZ.js.map} +0 -0
- /package/dist/{proofs-MJ7MGBCW.js.map → proofs-XRQ3BMM2.js.map} +0 -0
- /package/dist/{property-TCDBREZL.js.map → property-O3PMHQLJ.js.map} +0 -0
- /package/dist/{psql-YD54GQMP.js.map → psql-SUE2TORV.js.map} +0 -0
- /package/dist/{record-OWBURAZ4.js.map → record-C245ESQA.js.map} +0 -0
- /package/dist/{redis-3SIKQULP.js.map → redis-CAOX2ODS.js.map} +0 -0
- /package/dist/{release-DMCBRVA5.js.map → release-ALUGJZTN.js.map} +0 -0
- /package/dist/{runbook-ZRKWCLZE.js.map → runbook-63HBD7WH.js.map} +0 -0
- /package/dist/{sandbox-HMZR6SKM.js.map → sandbox-IC5E53CC.js.map} +0 -0
- /package/dist/{scenarios-2QHT5A4F.js.map → scenarios-JR2H7SZC.js.map} +0 -0
- /package/dist/{schedule-4L7LOUDB.js.map → schedule-FHMCSKPL.js.map} +0 -0
- /package/dist/{session-JHLYECKM.js.map → session-BKHVVZS3.js.map} +0 -0
- /package/dist/{skill-ARJSVWCZ.js.map → skill-TZE27TIN.js.map} +0 -0
- /package/dist/{slack-T7CR4SAU.js.map → slack-3BQ2T3ZS.js.map} +0 -0
- /package/dist/{spec-RDNTNUE2.js.map → spec-PCAK2BX5.js.map} +0 -0
- /package/dist/{src-DJETLMXP.js.map → src-BCJZMHSQ.js.map} +0 -0
- /package/dist/{src-H7IBLPDW.js.map → src-BPKBSXKX.js.map} +0 -0
- /package/dist/{src-DPJGVNYG.js.map → src-PNV4HGUY.js.map} +0 -0
- /package/dist/{src-UKPMEXXT.js.map → src-ZJGBNWYB.js.map} +0 -0
- /package/dist/{start-NR7W2LIP.js.map → start-BA5UEI3W.js.map} +0 -0
- /package/dist/{status-UDNXR5GK.js.map → status-TUXK57H4.js.map} +0 -0
- /package/dist/{tag-ADP2MZ3V.js.map → tag-IBDEJZM7.js.map} +0 -0
- /package/dist/{task-KQOUTIJU.js.map → task-WXZQM4BW.js.map} +0 -0
- /package/dist/{teams-D4QXSVDA.js.map → teams-656T2IHZ.js.map} +0 -0
- /package/dist/{test-suite-DYMY4YAG.js.map → test-suite-ETXWE5HB.js.map} +0 -0
- /package/dist/{tickets-BX3LFWUS.js.map → tickets-LWP3XIHG.js.map} +0 -0
- /package/dist/{trace-MBRU6DLE.js.map → trace-RNEY6XCJ.js.map} +0 -0
- /package/dist/{triage-IXAU73VL.js.map → triage-VZIIN7KB.js.map} +0 -0
- /package/dist/{trigger-CHSWCUV3.js.map → trigger-KTTSNSRU.js.map} +0 -0
- /package/dist/{update-check-LLETICM4.js.map → update-check-SLGKNOUC.js.map} +0 -0
- /package/dist/{upgrade-35WVNUEG.js.map → upgrade-2KSYA4GE.js.map} +0 -0
- /package/dist/{utilities-MOHIKBBF.js.map → utilities-O4VVADHM.js.map} +0 -0
- /package/dist/{visual-RNYERKX4.js.map → visual-ZWQTVXTM.js.map} +0 -0
- /package/dist/{workflow-NM5IC7ZQ.js.map → workflow-7HKA2WKO.js.map} +0 -0
- /package/dist/{workflow-cache-JNN7BS2K.js.map → workflow-cache-FDN2N5HH.js.map} +0 -0
- /package/dist/{workflow-cache-convergence-resolve-4SO2MP7T.js.map → workflow-cache-convergence-resolve-BGEUM7WV.js.map} +0 -0
- /package/dist/{workflow-debug-E7BXSSOG.js.map → workflow-debug-KNE7SVXQ.js.map} +0 -0
- /package/dist/{workflow-feedback-EWAK45AB.js.map → workflow-feedback-YY2FZTV4.js.map} +0 -0
- /package/dist/{workflow-fork-NO5IFBD4.js.map → workflow-fork-FH5KBVWP.js.map} +0 -0
- /package/dist/{workflow-promotion-NWIZNAR4.js.map → workflow-promotion-RRI53FB6.js.map} +0 -0
- /package/dist/{workflow-proposals-XMAZJT3X.js.map → workflow-proposals-5XGCOTEU.js.map} +0 -0
- /package/dist/{workflow-revisions-4EQMLZGY.js.map → workflow-revisions-M6WPGXAT.js.map} +0 -0
- /package/dist/{workflow-status-AZMXQZLC.js.map → workflow-status-I5BSSWHY.js.map} +0 -0
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
|
|
2
|
+
import {
|
|
3
|
+
AGENT_EVAL_MAX_BUNDLE_BYTES,
|
|
4
|
+
AGENT_EVAL_MULTIPART_THRESHOLD,
|
|
5
|
+
AgentEvalTemplateSchema,
|
|
6
|
+
EvalConversationSchema,
|
|
7
|
+
loadBundle,
|
|
8
|
+
missingRequiredPaths,
|
|
9
|
+
uploadBundle,
|
|
10
|
+
uploadMultipart
|
|
11
|
+
} from "./chunk-UPP4F2BE.js";
|
|
2
12
|
import {
|
|
3
13
|
resolveApplicationId
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-V6OC2WQL.js";
|
|
15
|
+
import "./chunk-PN5IK7CJ.js";
|
|
6
16
|
import {
|
|
7
17
|
EVALS,
|
|
8
18
|
getEval,
|
|
@@ -10,367 +20,33 @@ import {
|
|
|
10
20
|
requestAll,
|
|
11
21
|
requestText,
|
|
12
22
|
requestTolerant
|
|
13
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-XD3PSGFG.js";
|
|
14
24
|
import {
|
|
15
25
|
printServedGuide
|
|
16
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-W43YGZOP.js";
|
|
17
27
|
import {
|
|
18
28
|
getArgValues,
|
|
19
29
|
getPositionalArg,
|
|
20
30
|
getPositionalArgs,
|
|
21
31
|
getScalarArgValue,
|
|
22
32
|
readStdin
|
|
23
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-WY4R4IL5.js";
|
|
24
34
|
import "./chunk-S3Q7MDCS.js";
|
|
25
35
|
import {
|
|
26
36
|
GLOBAL_VALUE_FLAGS,
|
|
27
37
|
hasFlag,
|
|
28
38
|
resolveConfig
|
|
29
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-BMFD4OPC.js";
|
|
30
40
|
import {
|
|
31
41
|
writeRawOutput
|
|
32
|
-
} from "./chunk-
|
|
33
|
-
import "./chunk-
|
|
42
|
+
} from "./chunk-LRIP5IQD.js";
|
|
43
|
+
import "./chunk-C6SNLHVE.js";
|
|
34
44
|
import "./chunk-TOWZAG3I.js";
|
|
35
45
|
|
|
36
46
|
// src/eval.ts
|
|
37
|
-
import { mkdir, readFile as
|
|
38
|
-
import { gunzipSync
|
|
39
|
-
import { join as join2 } from "path";
|
|
40
|
-
|
|
41
|
-
// ../types/src/agent-eval-template.ts
|
|
42
|
-
import { z } from "zod";
|
|
43
|
-
var AGENT_EVAL_MAX_BUNDLE_BYTES = 512 * 1024 ** 2;
|
|
44
|
-
var AGENT_EVAL_MAX_TOTAL_BUNDLE_BYTES = 2 * 1024 ** 3;
|
|
45
|
-
var ModelSchema = z.strictObject({
|
|
46
|
-
provider: z.enum(["anthropic", "azure"]),
|
|
47
|
-
model: z.string().min(1)
|
|
48
|
-
});
|
|
49
|
-
var EnvName = z.string().regex(/^[A-Z_][A-Z0-9_]*$/, "Must be an upper-case environment variable name").refine((name) => !name.startsWith("EVAL_"), "EVAL_ names are reserved for the attempt environment");
|
|
50
|
-
var ProviderEnvSchema = z.strictObject({
|
|
51
|
-
env: z.strictObject({
|
|
52
|
-
apiKey: EnvName,
|
|
53
|
-
// gets the attempt's scoped proxy token
|
|
54
|
-
baseUrl: EnvName,
|
|
55
|
-
// gets the proxy URL for the provider's wire
|
|
56
|
-
model: EnvName
|
|
57
|
-
// gets the model id
|
|
58
|
-
}).refine((env) => new Set(Object.values(env)).size === 3, "apiKey, baseUrl and model must be different names")
|
|
59
|
-
});
|
|
60
|
-
var ScriptGrader = z.strictObject({
|
|
61
|
-
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
62
|
-
kind: z.literal("script"),
|
|
63
|
-
command: z.string().min(1)
|
|
64
|
-
});
|
|
65
|
-
var JudgeGrader = z.strictObject({
|
|
66
|
-
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
67
|
-
kind: z.literal("ai-judge"),
|
|
68
|
-
rubric: z.string().min(20),
|
|
69
|
-
scale: z.enum(["binary", "1-5"]),
|
|
70
|
-
passAt: z.number().int().min(2).max(5).optional(),
|
|
71
|
-
// required when scale is '1-5'
|
|
72
|
-
judge: ModelSchema
|
|
73
|
-
});
|
|
74
|
-
var AgentEvalTemplateSchema = z.strictObject({
|
|
75
|
-
version: z.literal(1),
|
|
76
|
-
name: z.string().regex(/^[a-z0-9-]{2,40}$/).refine((n) => n !== "runs" && n !== "compare"),
|
|
77
|
-
// reserved route segments
|
|
78
|
-
description: z.string().min(1).max(500),
|
|
79
|
-
proves: z.strictObject({ capabilities: z.array(z.string().regex(/^CAP-/)).min(1) }),
|
|
80
|
-
// resolved within the application given at push
|
|
81
|
-
runbook: z.string().min(1),
|
|
82
|
-
// path relative to this file
|
|
83
|
-
mode: z.enum(["single-turn", "multi-turn"]).default("single-turn"),
|
|
84
|
-
traces: z.strictObject({ capture: z.enum(["full", "metadata"]).default("full") }).default(() => ({ capture: "full" })),
|
|
85
|
-
run: z.string().min(1),
|
|
86
|
-
// shell command, cwd = repo root of the commit; multi-turn: the agent process, JSONL on stdin/stdout
|
|
87
|
-
simulator: ModelSchema.optional(),
|
|
88
|
-
// required when mode is multi-turn: pins the simulated-user model
|
|
89
|
-
input: z.strictObject({
|
|
90
|
-
description: z.string().min(1),
|
|
91
|
-
require: z.array(z.string()).default([])
|
|
92
|
-
}),
|
|
93
|
-
agent: z.strictObject({
|
|
94
|
-
models: z.record(z.string().regex(/^[a-z0-9-]+$/), ModelSchema).refine((m) => Object.keys(m).length >= 1),
|
|
95
|
-
default: z.string(),
|
|
96
|
-
// must be a key of models
|
|
97
|
-
providers: z.strictObject({ anthropic: ProviderEnvSchema.optional(), azure: ProviderEnvSchema.optional() }).optional()
|
|
98
|
-
// absent, or an absent entry: the standard names; every entry's provider must be used by a model
|
|
99
|
-
}),
|
|
100
|
-
graders: z.array(z.discriminatedUnion("kind", [ScriptGrader, JudgeGrader])).min(1),
|
|
101
|
-
repeats: z.number().int().min(1).max(7).default(1),
|
|
102
|
-
// attempts per case; a stochastic agent raises it together with passAtLeast
|
|
103
|
-
passAtLeast: z.number().int().min(1).default(1),
|
|
104
|
-
// <= repeats
|
|
105
|
-
passBar: z.number().min(0.1).max(1),
|
|
106
|
-
// minimum case pass rate for the eval to pass
|
|
107
|
-
attemptSeconds: z.number().int().min(30).max(1700)
|
|
108
|
-
// grader commands get a fixed 120 s
|
|
109
|
-
}).superRefine((template, ctx) => {
|
|
110
|
-
if (!Object.hasOwn(template.agent.models, template.agent.default)) {
|
|
111
|
-
ctx.addIssue({
|
|
112
|
-
code: "custom",
|
|
113
|
-
path: ["agent", "default"],
|
|
114
|
-
message: "Default must name an agent model alias"
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
const used = new Set(Object.values(template.agent.models).map((m) => m.provider));
|
|
118
|
-
for (const [provider, entry] of Object.entries(template.agent.providers ?? {})) {
|
|
119
|
-
if (entry && !used.has(provider)) {
|
|
120
|
-
ctx.addIssue({
|
|
121
|
-
code: "custom",
|
|
122
|
-
path: ["agent", "providers", provider],
|
|
123
|
-
message: `No agent model uses provider ${provider}; remove this entry or add a model that uses it`
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (template.passAtLeast > template.repeats) {
|
|
128
|
-
ctx.addIssue({
|
|
129
|
-
code: "custom",
|
|
130
|
-
path: ["passAtLeast"],
|
|
131
|
-
message: "passAtLeast must not exceed repeats"
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
const ids = /* @__PURE__ */ new Set();
|
|
135
|
-
template.graders.forEach((grader, index) => {
|
|
136
|
-
if (ids.has(grader.id)) {
|
|
137
|
-
ctx.addIssue({
|
|
138
|
-
code: "custom",
|
|
139
|
-
path: ["graders", index, "id"],
|
|
140
|
-
message: "Grader ids must be unique"
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
ids.add(grader.id);
|
|
144
|
-
if (grader.kind === "ai-judge" && grader.scale === "1-5" && grader.passAt === void 0) {
|
|
145
|
-
ctx.addIssue({
|
|
146
|
-
code: "custom",
|
|
147
|
-
path: ["graders", index, "passAt"],
|
|
148
|
-
message: "A 1-5 judge requires passAt"
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
if (template.mode === "multi-turn" !== (template.simulator !== void 0)) {
|
|
153
|
-
ctx.addIssue({
|
|
154
|
-
code: "custom",
|
|
155
|
-
path: ["simulator"],
|
|
156
|
-
message: "A simulator is required exactly when mode is multi-turn"
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
var EvalConversationSchema = z.discriminatedUnion("kind", [
|
|
161
|
-
z.strictObject({ kind: z.literal("scripted"), turns: z.array(z.string().min(1)).min(1) }),
|
|
162
|
-
z.strictObject({
|
|
163
|
-
kind: z.literal("simulated"),
|
|
164
|
-
persona: z.string().min(1),
|
|
165
|
-
goal: z.string().min(1),
|
|
166
|
-
facts: z.array(z.string()),
|
|
167
|
-
stopWhen: z.string().min(1),
|
|
168
|
-
maxTurns: z.number().int().min(2).max(30)
|
|
169
|
-
})
|
|
170
|
-
]);
|
|
171
|
-
|
|
172
|
-
// src/eval-bundle.ts
|
|
173
|
-
import { createHash } from "crypto";
|
|
174
|
-
import { request as httpRequest } from "http";
|
|
175
|
-
import { request as httpsRequest } from "https";
|
|
176
|
-
import { lstat, readdir, readFile } from "fs/promises";
|
|
47
|
+
import { mkdir, readFile as readFile2, readdir, writeFile } from "fs/promises";
|
|
48
|
+
import { gunzipSync } from "zlib";
|
|
177
49
|
import { join } from "path";
|
|
178
|
-
import { gunzipSync, gzipSync } from "zlib";
|
|
179
|
-
var BLOCK = 512;
|
|
180
|
-
var MAX_RAW_BYTES = AGENT_EVAL_MAX_BUNDLE_BYTES;
|
|
181
|
-
var MAX_UNPACKED_BYTES = 4 * AGENT_EVAL_MAX_BUNDLE_BYTES;
|
|
182
|
-
var sha256Hex = (data) => createHash("sha256").update(data).digest("hex");
|
|
183
|
-
function octal(value, width) {
|
|
184
|
-
return `${value.toString(8).padStart(width - 1, "0")}\0`;
|
|
185
|
-
}
|
|
186
|
-
function splitName(path) {
|
|
187
|
-
if (Buffer.byteLength(path) <= 100) return { prefix: "", name: path };
|
|
188
|
-
for (let i = path.indexOf("/"); i !== -1; i = path.indexOf("/", i + 1)) {
|
|
189
|
-
const prefix = path.slice(0, i);
|
|
190
|
-
const name = path.slice(i + 1);
|
|
191
|
-
if (Buffer.byteLength(prefix) <= 155 && Buffer.byteLength(name) <= 100) return { prefix, name };
|
|
192
|
-
}
|
|
193
|
-
throw new Error(`Path is too long for a bundle (limit 255 bytes): ${path}`);
|
|
194
|
-
}
|
|
195
|
-
function header(path, size, type, mode) {
|
|
196
|
-
const { prefix, name } = splitName(path);
|
|
197
|
-
const block = Buffer.alloc(BLOCK);
|
|
198
|
-
block.write(name, 0, "utf8");
|
|
199
|
-
block.write(octal(mode, 8), 100, "ascii");
|
|
200
|
-
block.write(octal(0, 8), 108, "ascii");
|
|
201
|
-
block.write(octal(0, 8), 116, "ascii");
|
|
202
|
-
block.write(octal(size, 12), 124, "ascii");
|
|
203
|
-
block.write(octal(0, 12), 136, "ascii");
|
|
204
|
-
block.fill(32, 148, 156);
|
|
205
|
-
block.write(type, 156, "ascii");
|
|
206
|
-
block.write("ustar\0", 257, "ascii");
|
|
207
|
-
block.write("00", 263, "ascii");
|
|
208
|
-
block.write(prefix, 345, "utf8");
|
|
209
|
-
const checksum = block.reduce((sum, byte) => sum + byte, 0);
|
|
210
|
-
block.write(`${checksum.toString(8).padStart(6, "0")}\0 `, 148, "ascii");
|
|
211
|
-
return block;
|
|
212
|
-
}
|
|
213
|
-
async function walk(root, real = "", archive = "") {
|
|
214
|
-
const names = (await readdir(real ? join(root, real) : root)).map((name) => ({ real: name, archive: name.normalize("NFC") })).sort((a, b) => Buffer.compare(Buffer.from(a.archive), Buffer.from(b.archive)));
|
|
215
|
-
const entries = [];
|
|
216
|
-
for (const name of names) {
|
|
217
|
-
const realPath = real ? `${real}/${name.real}` : name.real;
|
|
218
|
-
const path = archive ? `${archive}/${name.archive}` : name.archive;
|
|
219
|
-
const absolute = join(root, realPath);
|
|
220
|
-
const stats = await lstat(absolute);
|
|
221
|
-
if (stats.isDirectory()) {
|
|
222
|
-
entries.push({ path, absolute, directory: true, mode: 493, size: 0 });
|
|
223
|
-
entries.push(...await walk(root, realPath, path));
|
|
224
|
-
} else if (stats.isFile()) {
|
|
225
|
-
entries.push({
|
|
226
|
-
path,
|
|
227
|
-
absolute,
|
|
228
|
-
directory: false,
|
|
229
|
-
mode: stats.mode & 73 ? 493 : 420,
|
|
230
|
-
size: stats.size
|
|
231
|
-
});
|
|
232
|
-
} else {
|
|
233
|
-
throw new Error(
|
|
234
|
-
`Cannot bundle ${path}: only regular files and directories are supported (no symlinks or devices).`
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return entries;
|
|
239
|
-
}
|
|
240
|
-
async function tarDirectory(root) {
|
|
241
|
-
const entries = await walk(root);
|
|
242
|
-
const total = entries.reduce((sum, entry) => sum + entry.size, 0);
|
|
243
|
-
if (total > MAX_RAW_BYTES) {
|
|
244
|
-
throw new Error(
|
|
245
|
-
`The input directory holds ${total} bytes; the CLI bundles at most ${MAX_RAW_BYTES}. Prune it.`
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
const parts = [];
|
|
249
|
-
for (const entry of entries) {
|
|
250
|
-
if (entry.directory) {
|
|
251
|
-
parts.push(header(`${entry.path}/`, 0, "5", entry.mode));
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
const content = await readFile(entry.absolute);
|
|
255
|
-
parts.push(header(entry.path, content.length, "0", entry.mode), content);
|
|
256
|
-
const padding = (BLOCK - content.length % BLOCK) % BLOCK;
|
|
257
|
-
if (padding) parts.push(Buffer.alloc(padding));
|
|
258
|
-
}
|
|
259
|
-
parts.push(Buffer.alloc(BLOCK * 2));
|
|
260
|
-
return Buffer.concat(parts);
|
|
261
|
-
}
|
|
262
|
-
function readString(block, start, length) {
|
|
263
|
-
const slice = block.subarray(start, start + length);
|
|
264
|
-
const end = slice.indexOf(0);
|
|
265
|
-
return slice.subarray(0, end === -1 ? length : end).toString("utf8");
|
|
266
|
-
}
|
|
267
|
-
function normalize(path) {
|
|
268
|
-
return path.replace(/^(\.\/)+/, "").replace(/\/+$/, "");
|
|
269
|
-
}
|
|
270
|
-
function listTarEntries(tar) {
|
|
271
|
-
const entries = [];
|
|
272
|
-
let longName = null;
|
|
273
|
-
let offset = 0;
|
|
274
|
-
while (offset + BLOCK <= tar.length) {
|
|
275
|
-
const block = tar.subarray(offset, offset + BLOCK);
|
|
276
|
-
if (block.every((byte) => byte === 0)) break;
|
|
277
|
-
const stored = Number.parseInt(readString(block, 148, 8).trim(), 8);
|
|
278
|
-
const actual = block.reduce((sum, byte, i) => sum + (i >= 148 && i < 156 ? 32 : byte), 0);
|
|
279
|
-
if (stored !== actual) throw new Error("not a valid tar archive (bad header checksum)");
|
|
280
|
-
const size = Number.parseInt(readString(block, 124, 12).trim() || "0", 8);
|
|
281
|
-
const type = String.fromCharCode(block[156] || 48);
|
|
282
|
-
const body = tar.subarray(offset + BLOCK, offset + BLOCK + size);
|
|
283
|
-
offset += BLOCK + Math.ceil(size / BLOCK) * BLOCK;
|
|
284
|
-
if (type === "L") {
|
|
285
|
-
longName = readString(body, 0, body.length);
|
|
286
|
-
continue;
|
|
287
|
-
}
|
|
288
|
-
if (type === "x") {
|
|
289
|
-
const record = body.toString("utf8").match(/\d+ path=([^\n]*)\n/);
|
|
290
|
-
if (record?.[1]) longName = record[1];
|
|
291
|
-
continue;
|
|
292
|
-
}
|
|
293
|
-
if (type === "g") continue;
|
|
294
|
-
const prefix = readString(block, 345, 155);
|
|
295
|
-
if (["1", "2", "3", "4", "6"].includes(type))
|
|
296
|
-
throw new Error(
|
|
297
|
-
`the archive holds a link or device entry (${readString(block, 0, 100)}); only files and directories are supported`
|
|
298
|
-
);
|
|
299
|
-
const name = longName ?? (prefix ? `${prefix}/${readString(block, 0, 100)}` : readString(block, 0, 100));
|
|
300
|
-
longName = null;
|
|
301
|
-
entries.push(normalize(name));
|
|
302
|
-
}
|
|
303
|
-
return entries;
|
|
304
|
-
}
|
|
305
|
-
async function loadBundle(input) {
|
|
306
|
-
let stats;
|
|
307
|
-
try {
|
|
308
|
-
stats = await lstat(input);
|
|
309
|
-
} catch {
|
|
310
|
-
throw new Error(`--input ${input} does not exist.`);
|
|
311
|
-
}
|
|
312
|
-
let tar;
|
|
313
|
-
if (stats.isDirectory()) {
|
|
314
|
-
tar = await tarDirectory(input);
|
|
315
|
-
} else if (stats.isFile() && /\.(tar\.gz|tgz)$/.test(input)) {
|
|
316
|
-
if (stats.size > AGENT_EVAL_MAX_BUNDLE_BYTES)
|
|
317
|
-
throw new Error(
|
|
318
|
-
`${input} is ${stats.size} bytes; a bundle is limited to ${AGENT_EVAL_MAX_BUNDLE_BYTES}. Prune it.`
|
|
319
|
-
);
|
|
320
|
-
const gzip = await readFile(input);
|
|
321
|
-
try {
|
|
322
|
-
tar = gunzipSync(gzip, { maxOutputLength: MAX_UNPACKED_BYTES });
|
|
323
|
-
} catch {
|
|
324
|
-
throw new Error(
|
|
325
|
-
`--input ${input} is not a valid gzip file, or unpacks to more than ${MAX_UNPACKED_BYTES} bytes.`
|
|
326
|
-
);
|
|
327
|
-
}
|
|
328
|
-
} else {
|
|
329
|
-
throw new Error("--input must be a directory or a .tar.gz file.");
|
|
330
|
-
}
|
|
331
|
-
const archive = gzipSync(tar, { level: 9 });
|
|
332
|
-
let entries;
|
|
333
|
-
try {
|
|
334
|
-
entries = listTarEntries(tar);
|
|
335
|
-
} catch (error) {
|
|
336
|
-
throw new Error(`--input ${input}: ${error instanceof Error ? error.message : String(error)}.`);
|
|
337
|
-
}
|
|
338
|
-
return {
|
|
339
|
-
sha256: sha256Hex(tar),
|
|
340
|
-
gzipSha256: sha256Hex(archive),
|
|
341
|
-
bytes: archive.length,
|
|
342
|
-
archive,
|
|
343
|
-
entries
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
function missingRequiredPaths(entries, required2) {
|
|
347
|
-
return required2.filter((path) => {
|
|
348
|
-
const wanted = normalize(path);
|
|
349
|
-
return !entries.some((entry) => entry === wanted || entry.startsWith(`${wanted}/`));
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
var uploadBundle = (url, headers, archive) => new Promise((resolve2, reject) => {
|
|
353
|
-
const target2 = new URL(url);
|
|
354
|
-
const request2 = target2.protocol === "https:" ? httpsRequest : httpRequest;
|
|
355
|
-
const req = request2(
|
|
356
|
-
target2,
|
|
357
|
-
{ method: "PUT", headers: { ...headers, "content-length": String(archive.byteLength) } },
|
|
358
|
-
(response) => {
|
|
359
|
-
response.on("error", reject);
|
|
360
|
-
const status = response.statusCode;
|
|
361
|
-
if (status !== void 0 && status >= 200 && status < 300) {
|
|
362
|
-
response.on("end", resolve2);
|
|
363
|
-
response.resume();
|
|
364
|
-
} else {
|
|
365
|
-
response.resume();
|
|
366
|
-
req.destroy();
|
|
367
|
-
reject(new Error(`Uploading the bundle failed (${String(status)}).`));
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
);
|
|
371
|
-
req.on("error", reject);
|
|
372
|
-
req.end(archive);
|
|
373
|
-
});
|
|
374
50
|
|
|
375
51
|
// src/eval-run.ts
|
|
376
52
|
import { setTimeout as sleep } from "timers/promises";
|
|
@@ -718,6 +394,9 @@ async function runEval(argv, name, apiUrl, token) {
|
|
|
718
394
|
const repeats = intFlag(argv, "--repeats");
|
|
719
395
|
const parallel = intFlag(argv, "--parallel");
|
|
720
396
|
const evaluation = await getEval(apiUrl, token, name);
|
|
397
|
+
if (evaluation.definition.kind === "mcp" && models.length) {
|
|
398
|
+
throw new Error("MCP eval agents are declared in the template; remove --model.");
|
|
399
|
+
}
|
|
721
400
|
const started = await request(
|
|
722
401
|
apiUrl,
|
|
723
402
|
token,
|
|
@@ -931,7 +610,7 @@ async function compareRuns(argv, ids, apiUrl, token) {
|
|
|
931
610
|
}
|
|
932
611
|
|
|
933
612
|
// src/eval-template.ts
|
|
934
|
-
import { readFile
|
|
613
|
+
import { readFile } from "fs/promises";
|
|
935
614
|
import { dirname, isAbsolute, relative, resolve, sep } from "path";
|
|
936
615
|
import { parse } from "yaml";
|
|
937
616
|
var RUNBOOK_TODO_MARKER = "<!-- cofactor:todo -->";
|
|
@@ -1132,7 +811,7 @@ function checkRunbook(runbook) {
|
|
|
1132
811
|
async function readPushPayload(file) {
|
|
1133
812
|
let source;
|
|
1134
813
|
try {
|
|
1135
|
-
source = await
|
|
814
|
+
source = await readFile(file, "utf8");
|
|
1136
815
|
} catch {
|
|
1137
816
|
throw new Error(`Cannot read ${file}.`);
|
|
1138
817
|
}
|
|
@@ -1155,7 +834,7 @@ async function readPushPayload(file) {
|
|
|
1155
834
|
);
|
|
1156
835
|
let runbook;
|
|
1157
836
|
try {
|
|
1158
|
-
runbook = await
|
|
837
|
+
runbook = await readFile(runbookPath, "utf8");
|
|
1159
838
|
} catch {
|
|
1160
839
|
throw new Error(
|
|
1161
840
|
`Cannot read the runbook ${runbookPath} (the template's runbook: ${parsed.data.runbook}).`
|
|
@@ -1295,7 +974,7 @@ function expectedArg(argv) {
|
|
|
1295
974
|
async function readJson(path, label) {
|
|
1296
975
|
let text;
|
|
1297
976
|
try {
|
|
1298
|
-
text = path === "-" ? await readStdin() : await
|
|
977
|
+
text = path === "-" ? await readStdin() : await readFile2(path, "utf8");
|
|
1299
978
|
} catch (error) {
|
|
1300
979
|
throw new Error(
|
|
1301
980
|
`Cannot read ${label}: ${error instanceof Error ? error.message : String(error)}`
|
|
@@ -1326,17 +1005,17 @@ async function init(argv) {
|
|
|
1326
1005
|
throw new Error("--capability must be a product-map code such as CAP-CMM-001.");
|
|
1327
1006
|
const files = [
|
|
1328
1007
|
{
|
|
1329
|
-
path:
|
|
1008
|
+
path: join(DEFAULT_TEMPLATE_DIR, `${name}.eval.yaml`),
|
|
1330
1009
|
text: initTemplate({
|
|
1331
1010
|
name,
|
|
1332
1011
|
application: getScalarArgValue(argv, "--application"),
|
|
1333
1012
|
capability
|
|
1334
1013
|
})
|
|
1335
1014
|
},
|
|
1336
|
-
{ path:
|
|
1015
|
+
{ path: join(DEFAULT_TEMPLATE_DIR, `${name}.runbook.md`), text: initRunbook(name) }
|
|
1337
1016
|
];
|
|
1338
|
-
const gitignore =
|
|
1339
|
-
const exists = async (path) =>
|
|
1017
|
+
const gitignore = join(DEFAULT_TEMPLATE_DIR, ".gitignore");
|
|
1018
|
+
const exists = async (path) => readFile2(path).then(
|
|
1340
1019
|
() => true,
|
|
1341
1020
|
() => false
|
|
1342
1021
|
);
|
|
@@ -1357,14 +1036,14 @@ Edit the run command and graders, write each runbook section and delete its <!--
|
|
|
1357
1036
|
);
|
|
1358
1037
|
}
|
|
1359
1038
|
async function defaultTemplateFile() {
|
|
1360
|
-
const found = (await
|
|
1039
|
+
const found = (await readdir(DEFAULT_TEMPLATE_DIR).catch(() => [])).filter(
|
|
1361
1040
|
(f) => f.endsWith(".eval.yaml")
|
|
1362
1041
|
);
|
|
1363
1042
|
if (found.length !== 1)
|
|
1364
1043
|
throw new Error(
|
|
1365
1044
|
found.length === 0 ? `No ${DEFAULT_TEMPLATE_DIR}/*.eval.yaml found; pass the template file.` : `Several templates in ${DEFAULT_TEMPLATE_DIR}/ (${found.join(", ")}); pass the one to push.`
|
|
1366
1045
|
);
|
|
1367
|
-
return
|
|
1046
|
+
return join(DEFAULT_TEMPLATE_DIR, found[0]);
|
|
1368
1047
|
}
|
|
1369
1048
|
async function push({ argv, apiUrl, token, json }) {
|
|
1370
1049
|
const file = getPositionalArg(argv, VALUE_FLAGS) ?? await defaultTemplateFile();
|
|
@@ -1398,6 +1077,17 @@ async function push({ argv, apiUrl, token, json }) {
|
|
|
1398
1077
|
}
|
|
1399
1078
|
function describeEval(detail) {
|
|
1400
1079
|
const d = detail.definition;
|
|
1080
|
+
if (d.kind === "mcp") {
|
|
1081
|
+
return [
|
|
1082
|
+
`${detail.name} ${detail.id}`,
|
|
1083
|
+
d.description,
|
|
1084
|
+
`Application: ${d.application.id} @ ${d.application.commit}`,
|
|
1085
|
+
`Client: ${d.client}`,
|
|
1086
|
+
`Agents: ${d.agents.join(", ")}`,
|
|
1087
|
+
`Cases: ${detail.cases.length}`,
|
|
1088
|
+
`Attempt budget: ${d.attemptSeconds}s`
|
|
1089
|
+
].join("\n");
|
|
1090
|
+
}
|
|
1401
1091
|
return [
|
|
1402
1092
|
`${detail.name} ${detail.id}`,
|
|
1403
1093
|
d.description,
|
|
@@ -1442,8 +1132,8 @@ async function downloadBundles(ctx, evaluation, dir) {
|
|
|
1442
1132
|
if (!response.ok)
|
|
1443
1133
|
throw new Error(`Downloading the bundle of case ${key} failed (${response.status}).`);
|
|
1444
1134
|
await writeFile(
|
|
1445
|
-
|
|
1446
|
-
|
|
1135
|
+
join(dir, `${key}.tar`),
|
|
1136
|
+
gunzipSync(Buffer.from(await response.arrayBuffer()), {
|
|
1447
1137
|
maxOutputLength: DOWNLOAD_MAX_TAR_BYTES
|
|
1448
1138
|
})
|
|
1449
1139
|
);
|
|
@@ -1546,6 +1236,9 @@ async function addCase(ctx) {
|
|
|
1546
1236
|
conversation = parsed.data;
|
|
1547
1237
|
}
|
|
1548
1238
|
const evaluation = await getEval(apiUrl, token, name);
|
|
1239
|
+
if (evaluation.definition.kind === "mcp") {
|
|
1240
|
+
throw new Error("Use cofactor mcp-eval add-case for MCP eval cases.");
|
|
1241
|
+
}
|
|
1549
1242
|
const multiTurn = evaluation.definition.mode === "multi-turn";
|
|
1550
1243
|
if (multiTurn && !conversation)
|
|
1551
1244
|
throw new Error(`${name} is multi-turn: pass --conversation <file.json>.`);
|
|
@@ -1558,7 +1251,7 @@ async function addCase(ctx) {
|
|
|
1558
1251
|
`The bundle is missing required input path(s): ${missing.join(", ")} (the template's input.require).`
|
|
1559
1252
|
);
|
|
1560
1253
|
const evalPath = `${EVALS}/${encodeURIComponent(evaluation.id)}`;
|
|
1561
|
-
const upload = await request(apiUrl, token, "POST", `${evalPath}/uploads`, {
|
|
1254
|
+
const upload = bundle.bytes > AGENT_EVAL_MULTIPART_THRESHOLD ? (await uploadMultipart(apiUrl, token, evalPath, bundle), { status: "multipart" }) : await request(apiUrl, token, "POST", `${evalPath}/uploads`, {
|
|
1562
1255
|
sha256: bundle.sha256,
|
|
1563
1256
|
gzipSha256: bundle.gzipSha256,
|
|
1564
1257
|
bytes: bundle.bytes
|
|
@@ -1648,4 +1341,4 @@ async function runEvalCommand(argv) {
|
|
|
1648
1341
|
export {
|
|
1649
1342
|
runEvalCommand
|
|
1650
1343
|
};
|
|
1651
|
-
//# sourceMappingURL=eval-
|
|
1344
|
+
//# sourceMappingURL=eval-37P36M53.js.map
|