@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eval.ts","../src/eval-run.ts","../../types/src/agent-eval-render.ts","../src/eval-template.ts"],"sourcesContent":["import { uploadMultipart } from './eval-multipart.js';\nimport { AGENT_EVAL_MULTIPART_THRESHOLD } from '@chatsdet/types/agent-eval-template';\n/** `cofactor eval`: author agent evals, add cases, run them against a commit and compare models. */\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { gunzipSync } from 'node:zlib';\nimport { join } from 'node:path';\nimport {\n AGENT_EVAL_MAX_BUNDLE_BYTES,\n EvalConversationSchema,\n} from '@chatsdet/types/agent-eval-template';\nimport { printServedGuide } from './guide.js';\nimport { GLOBAL_VALUE_FLAGS, hasFlag, resolveConfig } from './auth.js';\nimport { writeRawOutput } from './brand.js';\nimport {\n getPositionalArg,\n getPositionalArgs,\n getScalarArgValue,\n readStdin,\n} from './cli-helpers.js';\nimport { resolveApplicationId } from './environment.js';\nimport {\n EVALS,\n getEval,\n request,\n requestAll,\n requestText,\n type EvalDetail,\n type UploadReply,\n} from './eval-api.js';\nimport { loadBundle, missingRequiredPaths, uploadBundle } from './eval-bundle.js';\nimport { compareRuns, getRun, listRuns, runEval } from './eval-run.js';\nimport {\n EVAL_GITIGNORE,\n TemplateError,\n formatIssues,\n initRunbook,\n initTemplate,\n readPushPayload,\n} from './eval-template.js';\n\nconst USAGE = {\n guide: 'guide',\n init: 'init <name> [--application <app>] [--capability CAP-…]',\n push: 'push [<file>] --application <app>',\n show: 'show <name>',\n runbook: 'runbook <name>',\n list: 'list',\n cases: 'cases <name> [--download <dir>]',\n case: 'case <name> <key> [--version N]',\n 'rm-case': 'rm-case <name> <key>',\n 'add-case':\n 'add-case <name> --key <k> --input <dir|file.tar.gz> --expected <file|-> --source \"<provenance>\" [--title <t>] [--conversation <file.json>] [--replace [--reason <why>]]',\n run: 'run <name> [--model <alias>]... [--environment <env>] [--at <sha>] [--case <key>]... [--repeats N] [--parallel N] [--no-wait]',\n get: 'get <run-id> [--case <key>] [--transcript] [--stdout] [--trace]',\n runs: 'runs <name> [--limit N]',\n compare: 'compare (<run-id>... | --batch <id>)',\n};\ntype Command = keyof typeof USAGE;\n\nconst VALUE_FLAGS = [\n ...GLOBAL_VALUE_FLAGS,\n '--application',\n '--capability',\n '--key',\n '--input',\n '--expected',\n '--source',\n '--title',\n '--conversation',\n '--reason',\n '--version',\n '--model',\n '--environment',\n '--at',\n '--case',\n '--repeats',\n '--parallel',\n '--limit',\n '--batch',\n '--download',\n];\n/** How many positional arguments a sub-command needs (push, list and compare take none). */\nconst POSITIONALS: Partial<Record<Command, number>> = {\n show: 1,\n runbook: 1,\n cases: 1,\n case: 2,\n 'rm-case': 2,\n 'add-case': 1,\n run: 1,\n get: 1,\n runs: 1,\n};\nconst WRITES: Command[] = ['push', 'add-case', 'rm-case', 'run'];\nconst DEFAULT_TEMPLATE_DIR = 'evals';\n\nfunction printHelp(command: string | undefined): void {\n const usage = Object.hasOwn(USAGE, command ?? '') ? USAGE[command as Command] : undefined;\n console.log(\n [\n `Usage: cofactor eval ${usage ?? '<sub-command>'} [--json]`,\n '',\n ...Object.values(USAGE).map((line) => ` cofactor eval ${line}`),\n '',\n 'guide: prints the agent-eval guide: the latest served copy, else the one bundled with this CLI (no login needed).',\n 'An eval runs an agent command against a set of cases at a commit, grades each attempt and reports',\n 'pass rate, cost and time per task. The template and runbook live in your repo under evals/.',\n '',\n 'init: writes evals/<name>.eval.yaml (a commented template with a script and an ai-judge grader),',\n ' evals/<name>.runbook.md and evals/.gitignore (*.tar.gz, _staging/). Refuses to overwrite.',\n 'push: validates the template locally, reads the runbook it names (relative to the YAML) and stores both;',\n ' re-pushing is idempotent. Defaults to evals/*.eval.yaml when exactly one exists. Needs --application.',\n ' Warns on a missing runbook heading; errors when \"## Finding real data\" or \"## Sanitizing\" is empty, or when',\n ' any section still has the \"<!-- cofactor:todo -->\" line that init writes (delete it once the section is written).',\n 'show/list/cases/runbook: read the stored eval, its cases (key, sha256, size, source) and runbook.',\n \" cases --download <dir> also writes each bundle as <dir>/<key>.tar (uncompressed, so its sha256 is the case's sha256).\",\n 'add-case: --input is a directory (tarred deterministically: sorted entries, fixed mtime, uid/gid 0) or a .tar.gz.',\n ' The sha256 shown is that of the uncompressed tar, so the same files give the same sha256 on any runtime',\n ' and dedup is by tar content; gzip is transport only.',\n \" The template's input.require paths are checked first.\",\n ' --expected is a JSON file, or - for stdin. --source says where the data came from and what corroborates the',\n ' label. --replace stores a new version of an existing key (new --expected and/or --input), recording who and when;',\n ' --reason says why. Past runs keep the version they graded and new runs use the latest; compare refuses runs',\n ' that graded different versions. Without --replace an existing key is an error.',\n ' Never include customer data in a case. --conversation <file.json> is required for a multi-turn eval.',\n \"case: one case's expected label, provenance and version history (newest first); --version N shows an older version.\",\n 'rm-case: deletes a case (all its versions) that no run has used.',\n 'run: starts one run per --model (alias from the template; none means its default) and waits, printing one',\n ' section per model and then the comparison grid. --case and a --repeats that differs from the template make a partial run',\n ' that never counts for coverage or proofs. Polls every 5 seconds for at most 8.5 hours; a timeout leaves the',\n ' runs readable with get; the batch and run ids are printed to stderr before waiting. --no-wait prints the',\n \" ids and exits 0. --json prints an array with one entry per run, in order: the run's result, or\",\n ' {id, status, verdict, error} for a run with no result.',\n \"get: a run's result. --case <key> narrows to one case; --case <key> --transcript adds a multi-turn attempt's\",\n \" conversation; --case <key> --stdout adds each attempt's stdout tail; --case <key> --trace adds its paged model/tool timeline and body links.\",\n ' runs: recent runs for an eval, newest first (--limit N).',\n 'compare: the grid for run ids or a --batch; --json prints the array of runs.',\n '',\n 'Common options:',\n ' --org <name|id> Logged-in organization; required explicitly for push, add-case, rm-case and run',\n ' --env <env> API environment (prod, dev, local)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n ' --json Raw JSON on every sub-command except init',\n ' --help, -h Show help without authentication',\n '',\n 'Requires the sandbox-v2 organization flag. API-key scopes:',\n ' run: sandbox:create + sandbox:exec, named explicitly (sandbox:* does not grant sandbox:exec).',\n ' push, add-case, rm-case: sandbox:edit. show, list, cases, case, runbook, get, runs, compare: sandbox:read.',\n '',\n 'Exit codes (run):',\n \" 0 every run's verdict is pass\",\n ' 3 at least one run\\'s verdict is fail (the agent missed the pass bar; perf also exits 3 for \"slower\")',\n ' 1 a failed or cancelled run, a polling timeout, or any error',\n 'Other sub-commands exit 0 on success, 1 on error.',\n ].join('\\n')\n );\n}\n\nfunction required(argv: string[], flag: string): string {\n const value = getScalarArgValue(argv, flag);\n if (!value) throw new Error(`${flag} is required.`);\n return value;\n}\n\n/** `--expected` alone may be `-` (stdin), which the generic value check reads as a missing value. */\nfunction expectedArg(argv: string[]): string {\n const i = argv.findIndex((arg) => arg === '--expected' || arg.startsWith('--expected='));\n const value =\n i < 0\n ? undefined\n : argv[i]!.startsWith('--expected=')\n ? argv[i]!.slice('--expected='.length)\n : argv[i + 1];\n if (!value || value.startsWith('--'))\n throw new Error('--expected is required: a JSON file, or - for stdin.');\n return value;\n}\n\nasync function readJson(path: string, label: string): Promise<unknown> {\n let text: string;\n try {\n text = path === '-' ? await readStdin() : await readFile(path, 'utf8');\n } catch (error) {\n throw new Error(\n `Cannot read ${label}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n throw new Error(\n `${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\ntype Context = {\n argv: string[];\n positionals: string[];\n apiUrl: string;\n token: string;\n json: boolean;\n};\n\n/** The first positional (an eval name or run id), or the sub-command's usage as the error. */\nfunction target(ctx: Context, command: Command): string {\n const value = ctx.positionals[0];\n if (!value) throw new Error(`Usage: cofactor eval ${USAGE[command]}`);\n return value;\n}\n\nasync function init(argv: string[]): Promise<void> {\n const name = getPositionalArg(argv, VALUE_FLAGS);\n if (!name) throw new Error(`Usage: cofactor eval ${USAGE.init}`);\n if (!/^[a-z0-9-]{2,40}$/.test(name) || name === 'runs' || name === 'compare')\n throw new Error(\n 'The eval name must be 2 to 40 lowercase letters, digits or dashes (and not \"runs\" or \"compare\").'\n );\n const capability = getScalarArgValue(argv, '--capability');\n if (capability !== undefined && !/^CAP-[A-Z0-9]+-\\d{3,}$/.test(capability))\n throw new Error('--capability must be a product-map code such as CAP-CMM-001.');\n const files = [\n {\n path: join(DEFAULT_TEMPLATE_DIR, `${name}.eval.yaml`),\n text: initTemplate({\n name,\n application: getScalarArgValue(argv, '--application'),\n capability,\n }),\n },\n { path: join(DEFAULT_TEMPLATE_DIR, `${name}.runbook.md`), text: initRunbook(name) },\n ];\n const gitignore = join(DEFAULT_TEMPLATE_DIR, '.gitignore');\n const exists = async (path: string) =>\n readFile(path).then(\n () => true,\n () => false\n );\n for (const file of files) {\n if (await exists(file.path))\n throw new Error(`${file.path} already exists; not overwriting it.`);\n }\n await mkdir(DEFAULT_TEMPLATE_DIR, { recursive: true });\n const written = files.map((file) => file.path);\n for (const file of files) await writeFile(file.path, file.text, { flag: 'wx' });\n if (!(await exists(gitignore))) {\n await writeFile(gitignore, EVAL_GITIGNORE, { flag: 'wx' });\n written.push(gitignore);\n }\n writeRawOutput(\n hasFlag(argv, '--json')\n ? JSON.stringify({ written }, null, 2)\n : `${written.map((path) => `Wrote ${path}`).join('\\n')}\\nEdit the run command and graders, write each runbook section and delete its <!-- cofactor:todo --> line, then: cofactor eval push ${files[0]!.path} --application <app> --org <org>`\n );\n}\n\nasync function defaultTemplateFile(): Promise<string> {\n const found = (await readdir(DEFAULT_TEMPLATE_DIR).catch(() => [])).filter((f) =>\n f.endsWith('.eval.yaml')\n );\n if (found.length !== 1)\n throw new Error(\n found.length === 0\n ? `No ${DEFAULT_TEMPLATE_DIR}/*.eval.yaml found; pass the template file.`\n : `Several templates in ${DEFAULT_TEMPLATE_DIR}/ (${found.join(', ')}); pass the one to push.`\n );\n return join(DEFAULT_TEMPLATE_DIR, found[0]!);\n}\n\nasync function push({ argv, apiUrl, token, json }: Context): Promise<void> {\n const file = getPositionalArg(argv, VALUE_FLAGS) ?? (await defaultTemplateFile());\n const payload = await readPushPayload(file);\n for (const warning of payload.warnings) console.error(`Warning: ${warning}`);\n const applicationId = await resolveApplicationId(argv, apiUrl, token);\n const pushed = await request<{ id: string; name: string }>(apiUrl, token, 'PUT', EVALS, {\n applicationId,\n definition: payload.definition,\n runbook: payload.runbook,\n });\n const detail = await getEval(apiUrl, token, pushed.name);\n for (const c of detail.cases) {\n if (!c.hasEvidenceMap) {\n const warning = `Case ${c.key} has no evidence-map: review the verified truth, mark each fact proven or absent, and record the certainty source.`;\n payload.warnings.push(warning);\n console.error(`Warning: ${warning}`);\n }\n }\n\n if (json) {\n writeRawOutput(JSON.stringify({ ...detail, warnings: payload.warnings }, null, 2));\n return;\n }\n writeRawOutput(\n [\n `Pushed ${detail.name} (${detail.id})`,\n `Cases: ${detail.cases.length}`,\n `Capabilities: ${detail.capabilities.map((c) => c.code).join(', ') || 'none'}`,\n ].join('\\n')\n );\n}\n\nfunction describeEval(detail: EvalDetail): string {\n const d = detail.definition;\n if (d.kind === 'mcp') {\n return [\n `${detail.name} ${detail.id}`,\n d.description,\n `Application: ${d.application.id} @ ${d.application.commit}`,\n `Client: ${d.client}`,\n `Agents: ${d.agents.join(', ')}`,\n `Cases: ${detail.cases.length}`,\n `Attempt budget: ${d.attemptSeconds}s`,\n ].join('\\n');\n }\n return [\n `${detail.name} ${detail.id}`,\n d.description,\n `Application: ${detail.applicationId}`,\n `Mode: ${d.mode}`,\n `Run: ${d.run.split('\\n')[0]}${d.run.includes('\\n') ? ' …' : ''}`,\n `Models: ${Object.entries(d.agent.models)\n .map(([alias, m]) => `${alias}${alias === d.agent.default ? '*' : ''} (${m.model})`)\n .join(', ')}`,\n `Graders: ${d.graders.map((g) => `${g.id} [${g.kind}]`).join(', ')}`,\n `Repeats: ${d.repeats}, pass at least ${d.passAtLeast}, bar ${Math.round(d.passBar * 100)}%, ${d.attemptSeconds}s per attempt`,\n `Capabilities: ${detail.capabilities.map((c) => `${c.code} ${c.title}`).join('; ') || 'none'}`,\n `Cases: ${detail.cases.length}`,\n ].join('\\n');\n}\n\nasync function listEvals({ apiUrl, token, json }: Context): Promise<void> {\n const evals = await requestAll<{\n id: string;\n name: string;\n applicationId: string;\n description: string;\n caseCount: number;\n latestVerdict: 'pass' | 'fail' | null;\n }>(apiUrl, token, EVALS);\n writeRawOutput(\n json\n ? JSON.stringify(evals, null, 2)\n : evals\n .map(\n (e) =>\n `${e.name} ${e.id} ${e.caseCount} cases ${e.latestVerdict ?? '-'} ${e.description}`\n )\n .join('\\n') || 'No evals found.'\n );\n}\n\nasync function showEval(ctx: Context): Promise<void> {\n const detail = await getEval(ctx.apiUrl, ctx.token, target(ctx, 'show'));\n writeRawOutput(ctx.json ? JSON.stringify(detail, null, 2) : describeEval(detail));\n}\n\n// A tar may unpack to more than the gzip limit; the same bound the bundle reader uses for archives.\nconst DOWNLOAD_MAX_TAR_BYTES = 4 * AGENT_EVAL_MAX_BUNDLE_BYTES;\n\n/** Fetch every case bundle through its signed URL and write it, gunzipped, as `<dir>/<key>.tar` (the tar whose sha256 is the case's content address). */\nasync function downloadBundles(ctx: Context, evaluation: EvalDetail, dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n for (const { key } of evaluation.cases) {\n // The key becomes a file name: never trust the server for that.\n if (!/^[a-z0-9][a-z0-9-]*$/.test(key))\n throw new Error(`Refusing to download case \"${key}\": its key is not a plain file name.`);\n const { url } = await request<{ url: string }>(\n ctx.apiUrl,\n ctx.token,\n 'GET',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/cases/${encodeURIComponent(key)}/bundle`\n );\n const target = new URL(url);\n if (target.protocol !== 'https:' && !['localhost', '127.0.0.1'].includes(target.hostname))\n throw new Error(`Refusing to download case ${key} over ${target.protocol}.`);\n const response = await fetch(target, { redirect: 'error' });\n if (!response.ok)\n throw new Error(`Downloading the bundle of case ${key} failed (${response.status}).`);\n await writeFile(\n join(dir, `${key}.tar`),\n gunzipSync(Buffer.from(await response.arrayBuffer()), {\n maxOutputLength: DOWNLOAD_MAX_TAR_BYTES,\n })\n );\n }\n console.error(\n `Downloaded ${evaluation.cases.length} case bundle${evaluation.cases.length === 1 ? '' : 's'} to ${dir}`\n );\n}\n\nasync function listCases(ctx: Context): Promise<void> {\n const evaluation = await getEval(ctx.apiUrl, ctx.token, target(ctx, 'cases'));\n const { cases } = evaluation;\n const download = getScalarArgValue(ctx.argv, '--download');\n if (download) await downloadBundles(ctx, evaluation, download);\n writeRawOutput(\n ctx.json\n ? JSON.stringify(cases, null, 2)\n : cases\n .map(\n (c) =>\n `${c.key} v${c.version} ${c.bundleSha256.slice(0, 12)} ${c.bundleBytes} bytes ${c.title} [${c.source}]`\n )\n .join('\\n') || 'No cases.'\n );\n}\n\nasync function showRunbook(ctx: Context): Promise<void> {\n const name = target(ctx, 'runbook');\n const text = await requestText(\n ctx.apiUrl,\n ctx.token,\n `${EVALS}/${encodeURIComponent(name)}/runbook`\n );\n writeRawOutput(ctx.json ? JSON.stringify({ name, runbook: text }, null, 2) : text.trimEnd());\n}\n\ntype CaseDetail = {\n key: string;\n version: number;\n latestVersion: number;\n title: string;\n expected: unknown;\n source: string;\n bundleSha256: string;\n bundleBytes: number;\n createdAt: string;\n createdBy: string | null;\n reason: string | null;\n versions: {\n version: number;\n bundleSha256: string;\n createdAt: string;\n createdBy: string | null;\n reason: string | null;\n }[];\n};\n\nasync function showCase(ctx: Context): Promise<void> {\n const key = ctx.positionals[1];\n if (!key) throw new Error(`Usage: cofactor eval ${USAGE.case}`);\n const version = getScalarArgValue(ctx.argv, '--version');\n if (version !== undefined && !/^[1-9]\\d*$/.test(version))\n throw new Error('--version must be a positive whole number.');\n const evaluation = await getEval(ctx.apiUrl, ctx.token, target(ctx, 'case'));\n const query = version === undefined ? '' : `?version=${version}`;\n const detail = await request<CaseDetail>(\n ctx.apiUrl,\n ctx.token,\n 'GET',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/cases/${encodeURIComponent(key)}${query}`\n );\n writeRawOutput(\n ctx.json\n ? JSON.stringify(detail, null, 2)\n : [\n `${detail.key} v${detail.version}${detail.version === detail.latestVersion ? ' (latest)' : ` (latest is v${detail.latestVersion})`} ${detail.title}`,\n `Source: ${detail.source}`,\n `sha256 ${detail.bundleSha256} (${detail.bundleBytes} bytes)`,\n `Expected: ${JSON.stringify(detail.expected, null, 2)}`,\n 'Versions:',\n ...detail.versions.map(\n (v) =>\n ` v${v.version} ${v.createdAt} ${v.createdBy ?? 'before versioning'} ${v.bundleSha256.slice(0, 12)}${v.reason ? ` ${v.reason}` : ''}`\n ),\n ].join('\\n')\n );\n}\n\nasync function removeCase(ctx: Context): Promise<void> {\n const name = target(ctx, 'rm-case');\n const key = ctx.positionals[1];\n if (!key) throw new Error(`Usage: cofactor eval ${USAGE['rm-case']}`);\n const evaluation = await getEval(ctx.apiUrl, ctx.token, name);\n await request(\n ctx.apiUrl,\n ctx.token,\n 'DELETE',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/cases/${encodeURIComponent(key)}`\n );\n writeRawOutput(\n ctx.json\n ? JSON.stringify({ eval: name, key, deleted: true })\n : `Removed case ${key} from ${name}`\n );\n}\n\nasync function addCase(ctx: Context): Promise<void> {\n const { argv, apiUrl, token, json } = ctx;\n const name = target(ctx, 'add-case');\n const key = required(argv, '--key');\n const input = required(argv, '--input');\n const expectedSource = expectedArg(argv);\n const source = required(argv, '--source');\n const conversationFile = getScalarArgValue(argv, '--conversation');\n const replace = hasFlag(argv, '--replace');\n const reason = getScalarArgValue(argv, '--reason');\n if (reason && !replace) throw new Error('--reason only goes with --replace.');\n if (!/^[a-z0-9][a-z0-9-]{0,99}$/.test(key))\n throw new Error(\n '--key must be lowercase letters, digits and dashes, starting with a letter or digit (at most 100 characters).'\n );\n\n const expected = await readJson(\n expectedSource,\n expectedSource === '-' ? 'the expected value on stdin' : `--expected ${expectedSource}`\n );\n let conversation: unknown;\n if (conversationFile) {\n const parsed = EvalConversationSchema.safeParse(\n await readJson(conversationFile, `--conversation ${conversationFile}`)\n );\n if (!parsed.success)\n throw new TemplateError(\n `${conversationFile} is not a valid conversation:`,\n formatIssues(parsed.error)\n );\n conversation = parsed.data;\n }\n\n const evaluation = await getEval(apiUrl, token, name);\n if (evaluation.definition.kind === 'mcp') {\n throw new Error('Use cofactor mcp-eval add-case for MCP eval cases.');\n }\n const multiTurn = evaluation.definition.mode === 'multi-turn';\n if (multiTurn && !conversation)\n throw new Error(`${name} is multi-turn: pass --conversation <file.json>.`);\n if (!multiTurn && conversation)\n throw new Error(`${name} is single-turn: --conversation is only for multi-turn evals.`);\n\n const bundle = await loadBundle(input);\n const missing = missingRequiredPaths(bundle.entries, evaluation.definition.input.require);\n if (missing.length)\n throw new Error(\n `The bundle is missing required input path(s): ${missing.join(', ')} (the template's input.require).`\n );\n\n const evalPath = `${EVALS}/${encodeURIComponent(evaluation.id)}`;\n const upload =\n bundle.bytes > AGENT_EVAL_MULTIPART_THRESHOLD\n ? (await uploadMultipart(apiUrl, token, evalPath, bundle), { status: 'multipart' as const })\n : await request<UploadReply>(apiUrl, token, 'POST', `${evalPath}/uploads`, {\n sha256: bundle.sha256,\n gzipSha256: bundle.gzipSha256,\n bytes: bundle.bytes,\n });\n const deduplicated = upload.status === 'exists';\n if (upload.status === 'upload') {\n await uploadBundle(upload.url, upload.headers, bundle.archive);\n }\n const stored = await request<{ key: string; version: number }>(\n apiUrl,\n token,\n 'POST',\n `${evalPath}/cases`,\n {\n key,\n title: getScalarArgValue(argv, '--title') ?? key,\n sha256: bundle.sha256,\n expected,\n source,\n ...(conversation ? { conversation } : {}),\n ...(replace ? { replace: true } : {}),\n ...(reason ? { reason } : {}),\n }\n );\n const result = {\n eval: name,\n key,\n version: stored.version,\n sha256: bundle.sha256,\n bytes: bundle.bytes,\n deduplicated,\n };\n writeRawOutput(\n json\n ? JSON.stringify(result, null, 2)\n : `${replace ? `Stored version ${stored.version} of case ${key} in ${name}` : `Added case ${key} to ${name}`}\\nsha256 ${bundle.sha256} (${bundle.bytes} bytes local gzip), ${deduplicated ? 'deduplicated: the bundle already existed' : 'uploaded'}`\n );\n}\n\n/** One handler per authenticated sub-command; a number is the process exit code. */\nconst HANDLERS: Record<\n Exclude<Command, 'init' | 'guide'>,\n (ctx: Context) => Promise<number | void>\n> = {\n push,\n show: showEval,\n runbook: showRunbook,\n list: listEvals,\n cases: listCases,\n case: showCase,\n 'rm-case': removeCase,\n 'add-case': addCase,\n run: (ctx) => runEval(ctx.argv, target(ctx, 'run'), ctx.apiUrl, ctx.token),\n get: (ctx) => getRun(ctx.argv, target(ctx, 'get'), ctx.apiUrl, ctx.token),\n runs: (ctx) => listRuns(ctx.argv, target(ctx, 'runs'), ctx.apiUrl, ctx.token),\n compare: (ctx) => compareRuns(ctx.argv, ctx.positionals, ctx.apiUrl, ctx.token),\n};\n\nexport async function runEvalCommand(argv: string[]): Promise<void> {\n const [command, ...rest] = argv;\n if (!command || command === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp(command === 'help' ? rest[0] : command);\n return;\n }\n if (command === 'guide') {\n await printServedGuide('eval', rest);\n return;\n }\n let code = 0;\n try {\n if (!Object.hasOwn(USAGE, command)) throw new Error(`Unknown eval command: ${command}`);\n const cmd = command as Exclude<Command, 'guide'>;\n // Require the identity selector before authentication or any mutating request.\n if (WRITES.includes(cmd)) required(rest, '--org');\n // --expected is checked by expectedArg: its value may be a bare \"-\".\n for (const flag of VALUE_FLAGS.filter((flag) => flag !== '--expected')) {\n if (rest.includes(flag) && getScalarArgValue(rest, flag) === undefined)\n throw new Error(`${flag} requires a value.`);\n }\n const positionals = getPositionalArgs(rest, VALUE_FLAGS);\n // Usage errors come before authentication.\n if (positionals.length < (POSITIONALS[cmd] ?? 0))\n throw new Error(`Usage: cofactor eval ${USAGE[cmd]}`);\n if (cmd === 'init') {\n await init(rest);\n } else {\n const { apiUrl, token } = await resolveConfig(rest);\n const ctx = { argv: rest, positionals, apiUrl, token, json: hasFlag(rest, '--json') };\n code = (await HANDLERS[cmd](ctx)) ?? 0;\n }\n } catch (error) {\n console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);\n code = 1;\n }\n if (code !== 0) process.exit(code);\n}\n","/** `cofactor eval run|get|runs|compare`: start runs, wait for them and print their results. */\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { renderAgentEvalCompare, renderAgentEvalRun } from '@chatsdet/types/agent-eval-render';\nimport type {\n AgentEvalCompareResult,\n AgentEvalRunResult,\n AgentEvalTranscriptEntry,\n} from '@chatsdet/types/agent-eval-result';\nimport type {\n AgentEvalExecutionArtifact,\n AgentEvalExecutionArtifactPage,\n AgentEvalTraceExecution,\n AgentEvalTracePage,\n AgentEvalTraceTimelineEntry,\n} from '@chatsdet/types/agent-eval-trace';\nimport { hasFlag } from './auth.js';\nimport { writeRawOutput } from './brand.js';\nimport { getArgValues, getScalarArgValue } from './cli-helpers.js';\nimport { EVALS, getEval, request, requestTolerant } from './eval-api.js';\n\ntype AttemptTrace = AgentEvalTracePage & { artifacts: AgentEvalExecutionArtifact[] };\ntype RunStatus = AgentEvalRunResult['status'];\ntype Verdict = 'pass' | 'fail' | null;\n/** `GET /org/agent-evals/runs/:id`: the run row, its stored result once finished, and its attempts. */\ntype RunDetail = {\n id: string;\n batchId: string;\n status: RunStatus;\n verdict: Verdict;\n error: string | null;\n modelAlias: string;\n result: AgentEvalRunResult | null;\n attempts: {\n id: string;\n attemptIndex: number;\n executionIndex: number;\n transcript: AgentEvalTranscriptEntry[] | null;\n stdoutTail: string | null;\n traceExecutions: AgentEvalTraceExecution[];\n case: { key: string };\n }[];\n};\n/** One item of `GET /org/agent-evals/:name/runs`. */\ntype RunSummary = {\n id: string;\n batchId: string;\n modelAlias: string;\n commitSha: string;\n status: RunStatus;\n verdict: Verdict;\n error: string | null;\n};\n\n/** Tests shorten the interval. */\nexport const pollSettings = { intervalMs: 5000 };\n// The run job has an eight-hour budget; wait a little past it before giving up.\nconst WAIT_MS = 8.5 * 60 * 60 * 1000;\nconst MAX_TRANSIENT_FAILURES = 5;\nconst FINISHED: RunStatus[] = ['completed', 'failed', 'cancelled'];\n\nfunction intFlag(argv: string[], flag: string): number | undefined {\n const value = getScalarArgValue(argv, flag);\n if (value === undefined) return undefined;\n if (!/^\\d+$/.test(value)) throw new Error(`${flag} must be a whole number.`);\n return Number(value);\n}\n\nconst runPath = (id: string, transcript = false) =>\n `${EVALS}/runs/${encodeURIComponent(id)}${transcript ? '?transcript=1' : ''}`;\n\nconst stitchTracePages = (pages: readonly AgentEvalTracePage[]) => {\n const timeline: AgentEvalTraceTimelineEntry[] = [];\n const positions = new Map<string, number>();\n for (const entry of pages.flatMap((page) => page.timeline)) {\n if (entry.type !== 'tool') {\n timeline.push(entry);\n continue;\n }\n const previousIndex = positions.get(entry.toolCallId);\n if (previousIndex === undefined) {\n positions.set(entry.toolCallId, timeline.length);\n timeline.push(entry);\n continue;\n }\n const previous = timeline[previousIndex];\n if (previous?.type !== 'tool') continue;\n const hasNewResult = Object.hasOwn(entry, 'result');\n const merged: AgentEvalTraceTimelineEntry = {\n ...previous,\n ...(entry.toolName ? { toolName: entry.toolName } : {}),\n ...(entry.arguments !== null ? { arguments: entry.arguments } : {}),\n ...(hasNewResult && !Object.hasOwn(previous, 'result') ? { result: entry.result } : {}),\n ...(entry.isError === undefined ? {} : { isError: entry.isError }),\n ...(entry.error === undefined ? {} : { error: entry.error }),\n state:\n (hasNewResult || Object.hasOwn(previous, 'result')) && (entry.toolName || previous.toolName)\n ? 'complete'\n : entry.state === 'partial' || previous.state === 'partial'\n ? 'partial'\n : 'unmatched',\n };\n timeline[previousIndex] = merged;\n }\n return timeline;\n};\n\nconst traceTimelineText = (\n timeline: readonly AgentEvalTraceTimelineEntry[],\n calls: AgentEvalTracePage['calls'] = []\n) =>\n timeline\n .map((entry) => {\n if (entry.type === 'model') {\n const lines = [\n `Model ${entry.model ?? '(unknown)'} · HTTP ${entry.httpStatus} · ${entry.state}`,\n ];\n if (entry.input) lines.push(` User: ${entry.input}`);\n if (entry.error) lines.push(` Error: ${entry.error}`);\n if (entry.output) lines.push(` Agent: ${entry.output}`);\n if (entry.omittedContent)\n lines.push(' Model turn content omitted from this page; use the body references below.');\n if (entry.requestRef) lines.push(` Request body: ${entry.requestRef}`);\n if (entry.responseRef) lines.push(` Response body: ${entry.responseRef}`);\n const call = calls.find((candidate) => candidate.id === entry.callId);\n if (call?.request?.error) lines.push(` Request capture error: ${call.request.error}`);\n if (call?.response?.error) lines.push(` Response capture error: ${call.response.error}`);\n return lines.join('\\n');\n }\n const failed = entry.isError === true || entry.error !== undefined;\n const lines = [\n `${failed ? '✗' : '↳'} Tool ${entry.toolName ?? '(unmatched result)'} · ${entry.state} · ${entry.toolCallId}`,\n ];\n if (entry.arguments !== null) lines.push(` Arguments: ${JSON.stringify(entry.arguments)}`);\n else if (entry.omittedContent) lines.push(' Arguments: omitted');\n if (Object.hasOwn(entry, 'result'))\n lines.push(\n entry.omittedContent && entry.result === null\n ? ' Result: omitted'\n : ` Result: ${JSON.stringify(entry.result)}`\n );\n if (entry.omittedContent)\n lines.push(' Tool content omitted from this page; use the body references below.');\n if (entry.error !== undefined)\n lines.push(\n ` Error: ${typeof entry.error === 'string' ? entry.error : JSON.stringify(entry.error)}`\n );\n if (entry.requestRef) lines.push(` Request body: ${entry.requestRef}`);\n if (entry.responseRef) lines.push(` Response body: ${entry.responseRef}`);\n const call = calls.find(\n (candidate) =>\n candidate.request?.url === entry.requestRef ||\n candidate.response?.url === entry.responseRef\n );\n if (call?.request?.error) lines.push(` Request capture error: ${call.request.error}`);\n if (call?.response?.error) lines.push(` Response capture error: ${call.response.error}`);\n return lines.join('\\n');\n })\n .join('\\n\\n');\n\nconst traceRetrievalPath = (runId: string, attemptId: string, executionIndex: number) =>\n `${EVALS}/runs/${encodeURIComponent(runId)}/attempts/${encodeURIComponent(attemptId)}/traces?executionIndex=${executionIndex}`;\n\nconst traceSectionText = (\n runId: string,\n attempt: RunDetail['attempts'][number],\n trace: AttemptTrace | null\n) => {\n const current =\n trace?.execution ??\n attempt.traceExecutions.find(\n (execution) => execution.executionIndex === attempt.executionIndex\n );\n const traceState = trace?.calls.some((call) => call.state === 'truncated')\n ? 'truncated'\n : trace?.calls.some(\n (call) => call.state === 'partial' || call.request?.error || call.response?.error\n )\n ? 'partial'\n : current?.traceState;\n const lines = [\n `Trace, attempt ${attempt.attemptIndex}, execution ${attempt.executionIndex} (${current?.capture ?? 'unknown'} capture · ${traceState ?? 'unavailable'}):`,\n ];\n if (current) lines.push(` OTLP requests received: ${current.otlpReceipts}`);\n if (current?.error) lines.push(` Execution error: ${current.error}`);\n if (trace) lines.push(traceTimelineText(trace.timeline, trace.calls) || '(no trace entries)');\n else lines.push('(no trace execution was recorded)');\n if (trace?.artifacts.length) {\n lines.push('', 'Execution evidence:');\n for (const artifact of trace.artifacts) {\n lines.push(\n `${artifact.state === 'failed' || artifact.state === 'partial' ? '✗' : '↳'} ${artifact.kind}: ${artifact.name} · ${artifact.state} · ${artifact.rawBytes}/${artifact.observedBytes} bytes${artifact.spanCount === null ? '' : ` · ${artifact.spanCount} spans`}`\n );\n if (artifact.error) lines.push(` Error: ${artifact.error}`);\n if (artifact.body) lines.push(` Body: ${artifact.body}`);\n }\n }\n const earlier = attempt.traceExecutions.filter(\n (execution) => execution.executionIndex !== attempt.executionIndex\n );\n for (const execution of earlier) {\n lines.push(\n `Earlier execution ${execution.executionIndex} (${execution.traceState} · ${execution.capture} capture); read it with GET ${traceRetrievalPath(runId, attempt.id, execution.executionIndex)}`\n );\n if (execution.error) lines.push(` Execution error: ${execution.error}`);\n }\n return lines.join('\\n');\n};\n\nconst traceAvailabilityText = (attempts: RunDetail['attempts']) =>\n attempts.flatMap((attempt) =>\n attempt.traceExecutions.map(\n (execution) =>\n `Trace available, case ${attempt.case.key}, attempt ${attempt.attemptIndex}, execution ${execution.executionIndex} (${execution.capture} capture · ${execution.traceState}, ${execution.callCount} metered calls). Use --case ${attempt.case.key} --trace to inspect.`\n )\n );\n\nconst readAttemptTrace = async (\n apiUrl: string,\n token: string,\n runId: string,\n attempt: RunDetail['attempts'][number]\n) => {\n const pages: AgentEvalTracePage[] = [];\n let cursor: string | null = null;\n const seenCursors = new Set<string>();\n for (;;) {\n const query = new URLSearchParams({\n executionIndex: String(attempt.executionIndex),\n limit: '50',\n });\n if (cursor) query.set('cursor', cursor);\n const page = await request<AgentEvalTracePage>(\n apiUrl,\n token,\n 'GET',\n `${EVALS}/runs/${encodeURIComponent(runId)}/attempts/${encodeURIComponent(attempt.id)}/traces?${query}`\n );\n pages.push(page);\n if (!page.hasMore) break;\n if (!page.nextCursor || seenCursors.has(page.nextCursor))\n throw new Error('Trace pagination did not advance; retry cofactor eval get --trace.');\n seenCursors.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n const first = pages[0];\n if (!first) return null;\n const artifacts: AgentEvalExecutionArtifact[] = [];\n {\n let artifactCursor: string | null = null;\n const seen = new Set<string>();\n for (;;) {\n const path: string = `${EVALS}/runs/${encodeURIComponent(runId)}/attempts/${encodeURIComponent(attempt.id)}/executions/${attempt.executionIndex}/artifacts${artifactCursor ? `?cursor=${encodeURIComponent(artifactCursor)}` : ''}`;\n const page: AgentEvalExecutionArtifactPage = await request<AgentEvalExecutionArtifactPage>(apiUrl, token, 'GET', path);\n artifacts.push(...page.artifacts);\n if (!page.nextCursor) break;\n if (seen.has(page.nextCursor))\n throw new Error('Execution artifact pagination did not advance.');\n seen.add(page.nextCursor);\n artifactCursor = page.nextCursor;\n }\n }\n return {\n artifacts,\n execution: first.execution,\n calls: pages.flatMap((page) => page.calls),\n timeline: stitchTracePages(pages),\n hasMore: false,\n nextCursor: null,\n } satisfies AttemptTrace;\n};\n\nconst describeRun = (run: RunDetail) =>\n `${run.id} ${run.modelAlias} ${run.status}${run.verdict ? ` ${run.verdict}` : ''}${run.error ? ` ${run.error}` : ''}`;\n\nconst stub = (run: RunDetail) => ({\n id: run.id,\n status: run.status,\n verdict: run.verdict,\n error: run.error,\n});\n\n/** 0 when every run passed, 1 for a failed or cancelled run, 3 when a run's verdict is fail. */\nfunction exitCodeFor(runs: { status: RunStatus; verdict: Verdict }[]): number {\n if (runs.some((run) => run.status !== 'completed')) return 1;\n return runs.some((run) => run.verdict !== 'pass') ? 3 : 0;\n}\n\n/**\n * Wait for every run of a batch. One light list request per tick covers the batch; each run's full\n * detail is fetched once when all are finished. Network errors and 5xx replies are tolerated up to\n * five in a row; auth and 4xx errors end the wait at once.\n */\nasync function waitForRuns(\n apiUrl: string,\n token: string,\n evalName: string,\n started: { batchId: string; runIds: string[] }\n): Promise<RunDetail[]> {\n const ids = `batch ${started.batchId}; runs ${started.runIds.join(', ')}`;\n let transient = 0;\n const get = async <T>(path: string): Promise<T | null> => {\n const reply = await requestTolerant<T>(apiUrl, token, path);\n if ('data' in reply) {\n transient = 0;\n return reply.data;\n }\n if (++transient >= MAX_TRANSIENT_FAILURES)\n throw new Error(\n `Giving up after ${transient} failed polls (${reply.transient}). Still readable: ${ids}.`\n );\n return null;\n };\n const deadline = Date.now() + WAIT_MS;\n for (;;) {\n if (Date.now() >= deadline)\n throw new Error(\n `Timed out waiting for the runs. Inspect them with cofactor eval get <run-id>: ${ids}.`\n );\n const page = await get<{ items: RunSummary[] }>(\n `${EVALS}/${encodeURIComponent(evalName)}/runs?limit=100`\n );\n if (page) {\n const statuses = new Map(page.items.map((item) => [item.id, item.status]));\n // A run beyond the first page is looked up directly.\n const known = await Promise.all(\n started.runIds.map(\n async (id) => statuses.get(id) ?? (await get<RunDetail>(runPath(id)))?.status\n )\n );\n if (known.every((status) => status !== undefined && FINISHED.includes(status))) break;\n }\n await sleep(pollSettings.intervalMs);\n }\n const details: RunDetail[] = [];\n for (const id of started.runIds) {\n let detail: RunDetail | null = null;\n while (!(detail = await get<RunDetail>(runPath(id)))) await sleep(pollSettings.intervalMs);\n details.push(detail);\n }\n return details;\n}\n\nexport async function runEval(\n argv: string[],\n name: string,\n apiUrl: string,\n token: string\n): Promise<number> {\n const json = hasFlag(argv, '--json');\n const models = getArgValues(argv, '--model');\n const cases = getArgValues(argv, '--case');\n const at = getScalarArgValue(argv, '--at');\n const environment = getScalarArgValue(argv, '--environment');\n const repeats = intFlag(argv, '--repeats');\n const parallel = intFlag(argv, '--parallel');\n const evaluation = await getEval(apiUrl, token, name);\n if (evaluation.definition.kind === 'mcp' && models.length) {\n throw new Error('MCP eval agents are declared in the template; remove --model.');\n }\n const started = await request<{ batchId: string; runIds: string[] }>(\n apiUrl,\n token,\n 'POST',\n `${EVALS}/${encodeURIComponent(evaluation.id)}/runs`,\n {\n ...(models.length ? { models } : {}),\n ...(environment ? { environment } : {}),\n ...(at ? { at } : {}),\n ...(cases.length ? { cases } : {}),\n ...(repeats !== undefined ? { repeats } : {}),\n ...(parallel !== undefined ? { parallel } : {}),\n }\n );\n if (hasFlag(argv, '--no-wait')) {\n writeRawOutput(\n json\n ? JSON.stringify(started, null, 2)\n : `Started batch ${started.batchId}\\n${started.runIds.join('\\n')}\\nRead results with: cofactor eval get <run-id> | cofactor eval compare --batch ${started.batchId}`\n );\n return 0;\n }\n // Printed before waiting so an interrupted or failed wait still leaves the ids to read results with.\n console.error(\n `Started batch ${started.batchId}; runs ${started.runIds.join(', ')}. If this is interrupted, read results with cofactor eval get <run-id> or cofactor eval compare --batch ${started.batchId}.`\n );\n const details = await waitForRuns(apiUrl, token, name, started);\n const results = details.flatMap((run) => (run.result ? [run.result] : []));\n if (json) {\n writeRawOutput(\n JSON.stringify(\n details.map((run) => run.result ?? stub(run)),\n null,\n 2\n )\n );\n } else {\n const compare =\n details.length > 1 && results.length === details.length\n ? await request<AgentEvalCompareResult>(\n apiUrl,\n token,\n 'GET',\n `${EVALS}/compare?batch=${encodeURIComponent(started.batchId)}`\n )\n : null;\n if (results.length)\n writeRawOutput(\n [...results.map(renderAgentEvalRun), ...(compare ? [renderAgentEvalCompare(compare)] : [])]\n .join('\\n')\n .trimEnd()\n );\n for (const run of details.filter((run) => !run.result || run.status !== 'completed'))\n console.error(describeRun(run));\n }\n return exitCodeFor(details);\n}\n\nexport async function getRun(\n argv: string[],\n target: string,\n apiUrl: string,\n token: string\n): Promise<void> {\n const json = hasFlag(argv, '--json');\n const caseKey = getScalarArgValue(argv, '--case');\n const transcript = hasFlag(argv, '--transcript');\n const stdout = hasFlag(argv, '--stdout');\n const trace = hasFlag(argv, '--trace');\n if (stdout && !caseKey)\n throw new Error(\n '--stdout needs --case <key>: each attempt carries up to 16 KiB of stdout, so the CLI prints one case at a time.'\n );\n if (transcript && !caseKey)\n throw new Error(\n '--transcript needs --case <key>: transcripts are large, so the CLI prints one case at a time.'\n );\n if (trace && !caseKey)\n throw new Error(\n '--trace needs --case <key>: traces can be large, so the CLI reads one case at a time.'\n );\n const run = await request<RunDetail>(apiUrl, token, 'GET', runPath(target, transcript));\n if (!run.result) {\n if (!trace) {\n const attempts = run.attempts.filter(\n (attempt) => caseKey === undefined || attempt.case.key === caseKey\n );\n writeRawOutput(\n json\n ? JSON.stringify(stub(run), null, 2)\n : [describeRun(run), ...traceAvailabilityText(attempts)].join('\\n')\n );\n return;\n }\n const attempts = run.attempts.filter(\n (attempt) => caseKey === undefined || attempt.case.key === caseKey\n );\n if (caseKey && attempts.length === 0)\n throw new Error(`Run ${target} has no case \"${caseKey}\".`);\n const traces = await Promise.all(\n attempts.map(async (attempt) => ({\n attemptIndex: attempt.attemptIndex,\n traceExecutions: attempt.traceExecutions,\n trace: attempt.traceExecutions.some(\n (execution) => execution.executionIndex === attempt.executionIndex\n )\n ? await readAttemptTrace(apiUrl, token, target, attempt)\n : null,\n attempt,\n }))\n );\n writeRawOutput(\n json\n ? JSON.stringify(\n {\n ...stub(run),\n cases: [\n {\n key: caseKey,\n attempts: traces.map(({ attemptIndex, traceExecutions, trace }) => ({\n attemptIndex,\n traceExecutions,\n trace,\n })),\n },\n ],\n },\n null,\n 2\n )\n : `${describeRun(run)}\\n\\n${traces.map((item) => traceSectionText(target, item.attempt, item.trace)).join('\\n\\n')}`\n );\n return;\n }\n const selectedAttempts = run.attempts.filter(\n (attempt) => caseKey === undefined || attempt.case.key === caseKey\n );\n if (trace) {\n for (const attempt of selectedAttempts) {\n if (\n !attempt.traceExecutions.some(\n (execution) => execution.executionIndex === attempt.executionIndex\n )\n )\n continue;\n // Read only the current execution for this attempt; prior generations remain retrievable via the API.\n (attempt as RunDetail['attempts'][number] & { trace?: AttemptTrace | null }).trace =\n await readAttemptTrace(apiUrl, token, target, attempt);\n }\n }\n const result: AgentEvalRunResult = {\n ...run.result,\n cases: run.result.cases\n .filter((c) => caseKey === undefined || c.key === caseKey)\n .map((c) => ({\n ...c,\n attempts: c.attempts.map((attempt) => ({\n ...attempt,\n transcript: transcript\n ? (run.attempts.find((a) => a.case.key === c.key && a.attemptIndex === attempt.index)\n ?.transcript ?? attempt.transcript)\n : attempt.transcript,\n ...(stdout\n ? {\n stdoutTail: run.attempts.find(\n (a) => a.case.key === c.key && a.attemptIndex === attempt.index\n )?.stdoutTail,\n }\n : {}),\n ...(run.attempts.find((a) => a.case.key === c.key && a.attemptIndex === attempt.index)\n ?.traceExecutions\n ? {\n traceExecutions: run.attempts.find(\n (a) => a.case.key === c.key && a.attemptIndex === attempt.index\n )!.traceExecutions,\n }\n : {}),\n ...(trace\n ? {\n trace:\n (\n run.attempts.find(\n (a) => a.case.key === c.key && a.attemptIndex === attempt.index\n ) as\n | (RunDetail['attempts'][number] & { trace?: AttemptTrace | null })\n | undefined\n )?.trace ?? null,\n }\n : {}),\n })),\n })),\n };\n if (caseKey && result.cases.length === 0)\n throw new Error(`Run ${target} has no case \"${caseKey}\".`);\n if (json) {\n writeRawOutput(JSON.stringify(result, null, 2));\n return;\n }\n const lines = [renderAgentEvalRun(result).trimEnd()];\n if (transcript) {\n for (const attempt of result.cases.flatMap((c) => c.attempts)) {\n lines.push('', `Transcript, attempt ${attempt.index}:`);\n lines.push(\n ...(attempt.transcript?.length\n ? attempt.transcript.map((entry) => `${entry.role}: ${entry.text}`)\n : ['(none: this eval is not multi-turn, or the attempt did not run)'])\n );\n }\n }\n if (trace) {\n for (const attempt of selectedAttempts) {\n const read = (attempt as RunDetail['attempts'][number] & { trace?: AttemptTrace | null })\n .trace;\n lines.push('', traceSectionText(target, attempt, read ?? null));\n }\n }\n if (!trace) {\n lines.push(...traceAvailabilityText(selectedAttempts).map((line) => `\\n${line}`));\n }\n writeRawOutput(lines.join('\\n'));\n}\n\nexport async function listRuns(\n argv: string[],\n name: string,\n apiUrl: string,\n token: string\n): Promise<void> {\n const limit = intFlag(argv, '--limit');\n const page = await request<{ items: RunSummary[]; nextCursor: string | null }>(\n apiUrl,\n token,\n 'GET',\n `${EVALS}/${encodeURIComponent(name)}/runs${limit !== undefined ? `?limit=${limit}` : ''}`\n );\n writeRawOutput(\n hasFlag(argv, '--json')\n ? JSON.stringify(page, null, 2)\n : page.items\n .map(\n (run) =>\n `${run.id} ${run.modelAlias} ${run.status} ${run.verdict ?? '-'} ${run.commitSha.slice(0, 7)} batch ${run.batchId}`\n )\n .join('\\n') || 'No runs found.'\n );\n}\n\nexport async function compareRuns(\n argv: string[],\n ids: string[],\n apiUrl: string,\n token: string\n): Promise<void> {\n const batch = getScalarArgValue(argv, '--batch');\n if (Boolean(batch) === ids.length > 0)\n throw new Error('Use either one or more run ids or --batch <id>.');\n const query = batch\n ? `batch=${encodeURIComponent(batch)}`\n : `runs=${ids.map(encodeURIComponent).join(',')}`;\n const comparison = await request<AgentEvalCompareResult>(\n apiUrl,\n token,\n 'GET',\n `${EVALS}/compare?${query}`\n );\n writeRawOutput(\n hasFlag(argv, '--json')\n ? JSON.stringify(comparison.runs, null, 2)\n : renderAgentEvalCompare(comparison).trimEnd()\n );\n}\n","/** Pure markdown rendering shared by CLI and tests. Tokens per task are averaged here from server-provided case means. */\nimport type {\n AgentEvalCaseResult,\n AgentEvalCompareResult,\n AgentEvalRunResult,\n AgentEvalTokens,\n} from './agent-eval-result.js';\n\nconst cell = (value: string) => value.replaceAll('|', '\\\\|').replace(/\\r?\\n/g, ' ');\nconst percent = (value: number) => `${Math.round(value * 100)}%`;\nconst money = (cents: number | null, incomplete = false) =>\n cents === null ? 'unpriced' : `$${(cents / 100).toFixed(2)}${incomplete ? '*' : ''}`;\nconst minutes = (ms: number) => (ms / 60_000).toFixed(1);\nconst tokenCount = (n: number) =>\n n >= 1000 ? `${(n / 1000).toFixed(n >= 100_000 ? 0 : 1)}k` : `${Math.round(n)}`;\nconst tokenPair = (tokens: AgentEvalTokens) =>\n `${tokenCount(tokens.input)} / ${tokenCount(tokens.output)}`;\n/** Mean tokens per task, averaged from the server's per-case means; shared by the CLI markdown and the run page. */\nexport const meanTaskTokens = (result: AgentEvalRunResult): AgentEvalTokens => {\n const cases = result.cases;\n const mean = (key: keyof AgentEvalTokens) =>\n cases.length ? cases.reduce((n, c) => n + c.tokensPerAttempt[key], 0) / cases.length : 0;\n return {\n input: mean('input'),\n output: mean('output'),\n cacheRead: mean('cacheRead'),\n cacheCreation: mean('cacheCreation'),\n };\n};\nconst verdict = (r: AgentEvalRunResult) => (r.verdict ?? r.status).toUpperCase();\n\nexport function renderAgentEvalRun(result: AgentEvalRunResult): string {\n const s = result.summary;\n const taskTokens = meanTaskTokens(result);\n const warning = result.warnings.length\n ? ` [WARNING: ${result.warnings.map(cell).join('; ')}]`\n : '';\n // userSim is non-null exactly for a multi-turn eval (D16); single-turn output stays unchanged.\n const multiTurn = s.userSim !== null;\n const turnsToSuccess = (c: AgentEvalCaseResult) => {\n const passing = c.attempts.flatMap((a) => (a.passed && a.turns !== null ? [a.turns] : []));\n return passing.length ? (passing.reduce((n, t) => n + t, 0) / passing.length).toFixed(1) : '-';\n };\n const lines = [\n `## Eval ${cell(result.eval)}: ${verdict(result)} (${s.casesPassed}/${s.cases} cases, bar ${percent(result.passBar)}) — ${cell(result.model.alias)} (${cell(result.model.id)}) @ ${result.commit.slice(0, 7)}, ${result.repeats} repeats${warning}`,\n '',\n `| Case | Result | Attempts | Score | ${multiTurn ? 'Turns | ' : ''}Cost/attempt | Time/attempt | Tokens in/out |`,\n `|---|---|---|---|${multiTurn ? '---|' : ''}---|---|---|`,\n ...result.cases.map(\n (c) =>\n `| ${cell(c.key)}${c.version === undefined ? '' : ` (v${c.version})`} | ${c.passed ? 'PASS' : 'FAIL'} | ${c.passedAttempts}/${c.attempts.length} | ${c.meanScore.toFixed(1)} | ${multiTurn ? `${turnsToSuccess(c)} | ` : ''}${money(\n c.costCentsPerAttempt,\n c.attempts.some((a) => !a.costComplete)\n )} | ${minutes(c.durationMsPerAttempt)} min | ${tokenPair(c.tokensPerAttempt)} |`\n ),\n '',\n `Per task: ${money(s.costCentsPerTask, s.incompleteCalls > 0)} | ${minutes(s.durationMsPerTask)} min | ${tokenCount(taskTokens.input)} in / ${tokenCount(taskTokens.output)} out. Total: ${money(s.costCents, s.incompleteCalls > 0)} for ${s.attempts} attempts, ${Math.round(result.cases.flatMap((c) => c.attempts).reduce((n, a) => n + a.durationMs, 0) / 60_000)} min of agent time.`,\n ];\n const judges = [\n ...new Set(\n result.cases\n .flatMap((c) => c.attempts.flatMap((a) => a.grades))\n .filter((g) => g.kind === 'ai-judge')\n .map((g) => g.judgeModel)\n ),\n ];\n lines.push(\n `Judge (${judges.length ? judges.map((m) => cell(m ?? 'unknown')).join(', ') : 'none'}, pinned): ${s.judge.calls} calls, ${money(s.judge.costCents)}, not included above.`\n );\n if (s.userSim) {\n const models = [\n ...new Set(\n result.cases.flatMap((c) =>\n c.attempts.flatMap((a) => a.calls.filter((call) => call.role === 'user-sim').map((call) => call.model))\n )\n ),\n ];\n lines.push(\n `User-sim (${models.length ? models.map(cell).join(', ') : 'none'}, pinned): ${s.userSim.calls} calls, ${money(s.userSim.costCents)}, not included above.`\n );\n }\n const failures = result.cases.flatMap((c) =>\n c.attempts.flatMap((a) => [\n ...a.grades\n .filter((g) => !g.pass)\n .map((g) => `${cell(c.key)} #${a.index}: ${cell(g.grader)}: ${cell(g.reason)}`),\n ...(a.error && !a.grades.some((g) => !g.pass && (g.reason === a.error || g.error === a.error))\n ? [`${cell(c.key)} #${a.index}: ${cell(a.error)}`]\n : []),\n ])\n );\n lines.push(`Failed grades: ${failures.length ? failures.join('; ') : 'none'}.`);\n if (result.error) lines.push(`Error: ${cell(result.error)}.`);\n if (s.incompleteCalls) lines.push('* Cost is a lower bound because agent calls were incomplete.');\n lines.push(\n `Warnings: ${result.warnings.length ? result.warnings.map(cell).join('; ') : 'none'}. Run: ${result.id}.`\n );\n return `${lines.join('\\n')}\\n`;\n}\n\nexport function renderAgentEvalCompare(result: AgentEvalCompareResult): string {\n const lines = [\n `## Eval compare: ${cell(result.eval)} @ ${result.commit.slice(0, 7)}${result.batchId ? ` (batch ${result.batchId})` : ''}`,\n '',\n '| Model | Verdict | Pass rate | Mean score | Cost/task | Time/task | Tokens/task in/out |',\n '|---|---|---|---|---|---|---|',\n ...result.runs.map(\n (r) =>\n `| ${cell(r.model.alias)} (${cell(r.model.id)}) | ${verdict(r)} | ${percent(r.summary.passRate)} | ${r.summary.meanScore.toFixed(1)} | ${money(r.summary.costCentsPerTask, r.summary.incompleteCalls > 0)} | ${minutes(r.summary.durationMsPerTask)} min | ${tokenPair(meanTaskTokens(r))} |`\n ),\n '',\n `| Case | ${result.runs.map((r) => cell(r.model.alias)).join(' | ')} |`,\n `|---|${result.runs.map(() => '---|').join('')}`,\n ...result.cases.map(\n (c) =>\n `| ${cell(c.key)} | ${c.models\n .map(\n ({ result: r }) =>\n `${r.passedAttempts}/${r.attempts.length} ${r.passed ? 'PASS' : 'FAIL'} ${money(\n r.costCentsPerAttempt,\n r.attempts.some((a) => !a.costComplete)\n )} ${minutes(r.durationMsPerAttempt)}m`\n )\n .join(' | ')} |`\n ),\n ];\n for (const r of result.runs)\n if (r.warnings.length)\n lines.push(`Warnings (${cell(r.model.alias)}): ${r.warnings.map(cell).join('; ')}.`);\n if (result.runs.some((r) => r.summary.incompleteCalls > 0))\n lines.push('* Cost is a lower bound because agent calls were incomplete.');\n return `${lines.join('\\n')}\\n`;\n}\n","/** Authoring side of `cofactor eval`: the `init` files and the local checks `push` runs. */\nimport { readFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { parse } from 'yaml';\nimport type { ZodError } from 'zod';\nimport {\n AgentEvalTemplateSchema,\n type AgentEvalTemplate,\n} from '@chatsdet/types/agent-eval-template';\n\n/** `eval init` writes this line first in every runbook section; `eval push` refuses a runbook that still has one. */\nexport const RUNBOOK_TODO_MARKER = '<!-- cofactor:todo -->';\n\n/** The fixed runbook headings, in order, each with the prompt `eval init` writes under it. */\nexport const RUNBOOK_SECTIONS: readonly { heading: string; prompt: string }[] = [\n {\n heading: 'What this eval proves',\n prompt: \"Describe the agent's job in one paragraph and the capabilities it backs.\",\n },\n {\n heading: 'Anatomy of a case',\n prompt:\n 'List the files in $EVAL_INPUT, what the expected value holds, and what a good case teaches.',\n },\n {\n heading: 'Finding real data',\n prompt:\n 'Say where in production the inputs live: exact cofactor commands, queries and ids, and how to pick varied cases.',\n },\n {\n heading: 'Labeling',\n prompt:\n \"Say how the expected value is decided and what must corroborate it; never the agent's own output alone.\",\n },\n {\n heading: 'Evidence map',\n prompt:\n 'Require expected[\"evidence-map\"] with a certainty note citing how truth was verified and one entry per label fact: proven (path and proof), or absent (missing evidence and expectedConclusion). Trace the tools the agent needs; freeze this run, earlier comparisons, failure-time history, tested source, config and logs. Missing evidence stays missing; label what a good agent should conclude given it. Never put this map, the label or later investigation into the agent input.',\n },\n {\n heading: 'Sanitizing',\n prompt:\n 'Say what to strip or replace before upload, the check to run, and the neutral names to use (Acme, example.com).',\n },\n {\n heading: 'Synthesizing scenarios',\n prompt:\n 'Say how to make a case when no real one exists (mutate a frozen input) and how to mark it synthetic in --source.',\n },\n {\n heading: 'Adding the case',\n prompt: 'Give the exact eval add-case command shape for this eval.',\n },\n { heading: 'Known traps', prompt: 'Record what has gone wrong before.' },\n];\n\n/** Headings whose section must not be empty: real data and sanitizing are what keep customer data out of cases. */\nconst REQUIRED_SECTIONS = ['Finding real data', 'Sanitizing'];\n\nexport const EVAL_GITIGNORE = '*.tar.gz\\n_staging/\\n';\n\nexport function initRunbook(name: string): string {\n return [\n `# ${name} runbook`,\n '',\n ...RUNBOOK_SECTIONS.flatMap(({ heading, prompt }) => [\n `## ${heading}`,\n '',\n RUNBOOK_TODO_MARKER,\n `<!-- ${prompt} -->`,\n '',\n ]),\n ].join('\\n');\n}\n\nexport function initTemplate(opts: {\n name: string;\n application?: string;\n capability?: string;\n}): string {\n const capability = opts.capability ?? 'CAP-REPLACE-ME';\n const application = opts.application ?? '<application>';\n return `# Agent eval: ${opts.name}\n# Push it with:\n# cofactor eval push evals/${opts.name}.eval.yaml --application ${application} --org <org>\n# Add cases with:\n# cofactor eval add-case ${opts.name} --key <key> --input <dir> --expected <file> --source \"<provenance>\" --org <org>\n# Run it with:\n# cofactor eval run ${opts.name} --org <org>\nversion: 1\nname: ${opts.name}\ndescription: Replace with one sentence on what this agent must get right.\n\n# Capabilities in the application's product map that this eval proves (CAP- codes).\nproves:\n capabilities:\n - ${capability}\n\n# Runbook for whoever adds cases; path relative to this file. Stored with the eval.\nrunbook: ${opts.name}.runbook.md\n\n# single-turn: \\`run\\` is executed once per attempt. multi-turn: \\`run\\` is the agent process,\n# speaking JSONL on stdin/stdout, and a \\`simulator\\` model is required (cases then need a conversation).\nmode: single-turn\n\n# Full traces are captured by default: model bodies, tools/results, stdout/stderr and extra files.\n# Write extra tool execution events under $EVAL_OUTPUT/traces/ (regular files; 1 MiB each).\n# OTel agents receive OTEL_EXPORTER_OTLP_* endpoint/protocol/scoped headers automatically.\n# Read the result with cofactor eval get <run-id> --case <key> --trace.\n# Script graders receive a bounded timeline and artifact references in $EVAL_TRACE.\n# Use metadata to retain metering, counts and capture status only (no bodies, logs or spans).\n# traces:\n# capture: metadata\n\n# Shell command run at the repository root of the evaluated commit. It reads its case from\n# $EVAL_INPUT and writes its answer to $EVAL_OUTPUT/answer.* (answer.json, answer.txt, ...).\n# Model calls go to the injected base URL (agent.providers below); never use a real key.\nrun: ./scripts/run-agent.sh\n\ninput:\n description: What the files in a case's input directory contain.\n # Paths every case bundle must contain (files or directories); checked before upload.\n require:\n - input.json\n\nagent:\n models:\n # alias: provider (anthropic | azure) and model id. Aliases are what --model takes.\n sonnet:\n provider: anthropic\n model: claude-sonnet-4-6\n default: sonnet\n # Each attempt sets the selected provider's key (a proxy token), base URL (the metering proxy) and\n # model id, under these standard names unless an entry below maps them:\n # anthropic: ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL\n # azure: OPENAI_API_KEY, AZURE_OPENAI_API_KEY, OPENAI_BASE_URL, AZURE_OPENAI_BASE_URL, OPENAI_MODEL\n # Only if the agent reads other names (upper case, never EVAL_*; an entry replaces all of that provider's\n # standard names), copy them from where its code builds the model client, e.g.\n # createAnthropic({ apiKey: process.env.AGENT_CLAUDE_KEY, baseURL: process.env.AGENT_CLAUDE_URL }):\n # providers:\n # anthropic:\n # env: { apiKey: AGENT_CLAUDE_KEY, baseUrl: AGENT_CLAUDE_URL, model: AGENT_CLAUDE_MODEL }\n\ngraders:\n # A script grader runs after the agent exits with EVAL_INPUT, EVAL_OUTPUT and EVAL_EXPECTED\n # (the case's expected value as a JSON file). Its last stdout line is\n # {\"pass\": true, \"score\": 1, \"reason\": \"why\"}. Anything else is a grader error.\n - id: answer-matches-expected\n kind: script\n command: ./scripts/grade-answer.sh\n\n # An ai-judge scores a rubric against the answer and the case's expected value.\n # The judge model is pinned. scale is binary or 1-5; a 1-5 scale requires passAt.\n - id: answer-quality\n kind: ai-judge\n rubric: The answer states the same root cause as the expected value and cites evidence from the input.\n scale: 1-5\n passAt: 4\n judge:\n provider: anthropic\n model: claude-opus-4-8\n\n# Each case runs \\`repeats\\` times (1 to 7) and passes when at least \\`passAtLeast\\` attempts pass.\n# One attempt, which must pass, is the default; for a stochastic agent raise repeats and passAtLeast together.\nrepeats: 1\npassAtLeast: 1\n\n# The eval passes when this share of cases pass.\npassBar: 0.5\n\n# Time limit per attempt, in seconds (30 to 1700).\nattemptSeconds: 600\n`;\n}\n\n/** Zod issues as one readable line each: `graders.1.passAt: A 1-5 judge requires passAt`. */\nexport function formatIssues(error: ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.map(String).join('.');\n return `${path || '(template)'}: ${issue.message}`;\n });\n}\n\nexport class TemplateError extends Error {\n constructor(heading: string, lines: string[]) {\n super(`${heading}\\n${lines.map((line) => ` ${line}`).join('\\n')}`);\n }\n}\n\nexport type PushPayload = {\n definition: AgentEvalTemplate;\n runbook: string;\n warnings: string[];\n};\n\nfunction sectionBodies(runbook: string): Map<string, string> {\n const sections = new Map<string, string>();\n let current: string | null = null;\n for (const line of runbook.split(/\\r?\\n/)) {\n const heading = line.match(/^##\\s+(.+?)\\s*$/);\n if (heading) {\n current = heading[1]!;\n sections.set(current, '');\n } else if (current !== null) {\n sections.set(current, `${sections.get(current)}${line}\\n`);\n }\n }\n return sections;\n}\n\n/** Missing headings are warnings; an empty required section or a section still holding the todo marker is an error. */\nexport function checkRunbook(runbook: string): { errors: string[]; warnings: string[] } {\n const sections = sectionBodies(runbook);\n const errors: string[] = [];\n const warnings: string[] = [];\n const todo = [...sections].filter(([, body]) =>\n body.split('\\n').some((line) => line.trim() === RUNBOOK_TODO_MARKER)\n );\n if (todo.length) {\n errors.push(\n `Runbook still has ${RUNBOOK_TODO_MARKER} in: ${todo.map(([heading]) => `\"## ${heading}\"`).join(', ')}. Write each section, then delete its marker line.`\n );\n }\n for (const { heading } of RUNBOOK_SECTIONS) {\n const body = sections.get(heading);\n const empty = body === undefined || body.replace(/<!--[\\s\\S]*?-->/g, '').trim() === '';\n if (body === undefined) warnings.push(`Runbook has no \"## ${heading}\" section.`);\n if (REQUIRED_SECTIONS.includes(heading) && empty) {\n errors.push(`Runbook section \"## ${heading}\" is empty; write it before pushing.`);\n }\n }\n return { errors, warnings };\n}\n\n/** Parse and validate a template file and read its runbook, relative to the YAML. */\nexport async function readPushPayload(file: string): Promise<PushPayload> {\n let source: string;\n try {\n source = await readFile(file, 'utf8');\n } catch {\n throw new Error(`Cannot read ${file}.`);\n }\n let raw: unknown;\n try {\n raw = parse(source);\n } catch (error) {\n throw new Error(\n `${file} is not valid YAML: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n const parsed = AgentEvalTemplateSchema.safeParse(raw);\n if (!parsed.success)\n throw new TemplateError(`${file} is not a valid eval template:`, formatIssues(parsed.error));\n const runbookPath = resolve(dirname(file), parsed.data.runbook);\n const inside = relative(dirname(resolve(file)), runbookPath);\n if (\n isAbsolute(parsed.data.runbook) ||\n inside === '..' ||\n inside.startsWith(`..${sep}`) ||\n isAbsolute(inside)\n )\n throw new Error(\n `The template's runbook (${parsed.data.runbook}) must be a path inside the template's directory.`\n );\n let runbook: string;\n try {\n runbook = await readFile(runbookPath, 'utf8');\n } catch {\n throw new Error(\n `Cannot read the runbook ${runbookPath} (the template's runbook: ${parsed.data.runbook}).`\n );\n }\n const { errors, warnings } = checkRunbook(runbook);\n if (errors.length) throw new TemplateError(`${runbookPath} cannot be pushed:`, errors);\n return { definition: parsed.data, runbook, warnings };\n}\n"],"mappings":"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","names":["readFile","lines","call","run","target","attempts","trace","readFile","target","flag"]}
|
|
@@ -5,19 +5,19 @@ import {
|
|
|
5
5
|
getArgValues,
|
|
6
6
|
getPositionalArg,
|
|
7
7
|
selectProperty
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WY4R4IL5.js";
|
|
9
9
|
import "./chunk-S3Q7MDCS.js";
|
|
10
10
|
import {
|
|
11
11
|
getArgValue,
|
|
12
12
|
hasFlag,
|
|
13
13
|
resolveConfig
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-BMFD4OPC.js";
|
|
15
15
|
import {
|
|
16
16
|
writeRawOutput
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-LRIP5IQD.js";
|
|
18
18
|
import {
|
|
19
19
|
isActiveExplorationCycleStatus
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-C6SNLHVE.js";
|
|
21
21
|
import "./chunk-TOWZAG3I.js";
|
|
22
22
|
|
|
23
23
|
// src/exploration.ts
|
|
@@ -182,4 +182,4 @@ async function runExploration(argv) {
|
|
|
182
182
|
export {
|
|
183
183
|
runExploration
|
|
184
184
|
};
|
|
185
|
-
//# sourceMappingURL=exploration-
|
|
185
|
+
//# sourceMappingURL=exploration-7PHVC753.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
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
2
|
import {
|
|
3
3
|
printServedGuide
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-W43YGZOP.js";
|
|
5
5
|
import {
|
|
6
6
|
apiRequest,
|
|
7
7
|
getApplicationArg,
|
|
@@ -9,22 +9,22 @@ import {
|
|
|
9
9
|
getScalarArgValue,
|
|
10
10
|
resolveCredentialId,
|
|
11
11
|
selectProperty
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WY4R4IL5.js";
|
|
13
13
|
import "./chunk-S3Q7MDCS.js";
|
|
14
14
|
import {
|
|
15
15
|
hasFlag,
|
|
16
16
|
resolveConfig,
|
|
17
17
|
resolveOrgAppUrl
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-BMFD4OPC.js";
|
|
19
19
|
import {
|
|
20
20
|
stripTerminalControls,
|
|
21
21
|
writeRawOutput
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-LRIP5IQD.js";
|
|
23
23
|
import {
|
|
24
24
|
ADHOC_TEST_INSTRUCTIONS_MAX_LENGTH,
|
|
25
25
|
EXPLORATORY_EFFORT_VALUES,
|
|
26
26
|
REVIEW_FLAVOR_VALUES
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-C6SNLHVE.js";
|
|
28
28
|
import "./chunk-TOWZAG3I.js";
|
|
29
29
|
|
|
30
30
|
// src/exploratory-test.ts
|
|
@@ -331,4 +331,4 @@ export {
|
|
|
331
331
|
handleRun,
|
|
332
332
|
runExploratoryTest
|
|
333
333
|
};
|
|
334
|
-
//# sourceMappingURL=exploratory-test-
|
|
334
|
+
//# sourceMappingURL=exploratory-test-NE7ECFWS.js.map
|
|
@@ -5,18 +5,21 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
printFinding,
|
|
7
7
|
printTriageSummary
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GVNSCSIC.js";
|
|
9
9
|
import {
|
|
10
10
|
formatElapsedDurationMs,
|
|
11
11
|
formatRecordedUtcTimestamp
|
|
12
12
|
} from "./chunk-2TIRL6ZK.js";
|
|
13
13
|
import {
|
|
14
14
|
printServedGuide
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-W43YGZOP.js";
|
|
16
16
|
import {
|
|
17
17
|
streamExternalRun
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import
|
|
18
|
+
} from "./chunk-B7G4TOYC.js";
|
|
19
|
+
import {
|
|
20
|
+
apiRequest,
|
|
21
|
+
readTextOrFile
|
|
22
|
+
} from "./chunk-WY4R4IL5.js";
|
|
20
23
|
import {
|
|
21
24
|
attachCliDiagnosticMetadata
|
|
22
25
|
} from "./chunk-W7CFLOEI.js";
|
|
@@ -26,16 +29,17 @@ import {
|
|
|
26
29
|
fetchOrExit,
|
|
27
30
|
getArgValue,
|
|
28
31
|
hasFlag,
|
|
29
|
-
resolveConfig
|
|
30
|
-
|
|
32
|
+
resolveConfig,
|
|
33
|
+
resolveOrgAppUrl
|
|
34
|
+
} from "./chunk-BMFD4OPC.js";
|
|
31
35
|
import {
|
|
32
36
|
stripTerminalControls,
|
|
33
37
|
writeRawOutput,
|
|
34
38
|
writeUntrustedText
|
|
35
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-LRIP5IQD.js";
|
|
36
40
|
import {
|
|
37
41
|
elapsedTestAttemptMs
|
|
38
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-C6SNLHVE.js";
|
|
39
43
|
import "./chunk-TOWZAG3I.js";
|
|
40
44
|
|
|
41
45
|
// src/external-run.ts
|
|
@@ -253,7 +257,7 @@ var EXPANDED_TRACE_FILES = [
|
|
|
253
257
|
"`browser/trace.zip` \u2014 the raw trace (open with `npx playwright show-trace`)"
|
|
254
258
|
];
|
|
255
259
|
async function expandLocalTrace(root, traceZipPath) {
|
|
256
|
-
const { expandTraceWorkspace, inProcessTraceReader } = await import("./src-
|
|
260
|
+
const { expandTraceWorkspace, inProcessTraceReader } = await import("./src-PNV4HGUY.js");
|
|
257
261
|
return expandTraceWorkspace({
|
|
258
262
|
workspaceRoot: root,
|
|
259
263
|
traceZipPath,
|
|
@@ -446,6 +450,109 @@ async function runTriageCommand(apiUrl, token, runId, argv) {
|
|
|
446
450
|
]);
|
|
447
451
|
}
|
|
448
452
|
|
|
453
|
+
// src/external-test-comments.ts
|
|
454
|
+
function parseTarget(args) {
|
|
455
|
+
const testId = getArgValue(args, "--test");
|
|
456
|
+
const runId = args[0]?.startsWith("--") ? void 0 : args[0];
|
|
457
|
+
const itemId = getArgValue(args, "--item");
|
|
458
|
+
if (testId && !runId && !hasFlag(args, "--item")) return { kind: "test", testId };
|
|
459
|
+
if (!hasFlag(args, "--test") && runId && itemId) return { kind: "item", runId, itemId };
|
|
460
|
+
throw new Error("Choose --test <test-id> or <run-id> --item <item-id>.");
|
|
461
|
+
}
|
|
462
|
+
function printComment(comment, appUrl) {
|
|
463
|
+
writeUntrustedText(`${comment.authorName ?? comment.authorId}, ${comment.createdAt}`);
|
|
464
|
+
if (comment.run && comment.runItemId) {
|
|
465
|
+
const { runId, createdAt } = comment.run;
|
|
466
|
+
const url = new URL(
|
|
467
|
+
`/runs/external/${encodeURIComponent(runId)}/item/${encodeURIComponent(comment.runItemId)}`,
|
|
468
|
+
appUrl
|
|
469
|
+
);
|
|
470
|
+
writeUntrustedText(` Run ${createdAt}: ${url.href}`);
|
|
471
|
+
}
|
|
472
|
+
for (const line of comment.body.split("\n")) writeUntrustedText(` ${line}`);
|
|
473
|
+
}
|
|
474
|
+
async function runExternalTestComments(command, args, apiUrl, token, appUrl) {
|
|
475
|
+
const target = parseTarget(args);
|
|
476
|
+
const about = getArgValue(args, "--about");
|
|
477
|
+
if (hasFlag(args, "--about")) {
|
|
478
|
+
if (command !== "comment") throw new Error("--about is only allowed when adding a comment.");
|
|
479
|
+
if (target.kind !== "item")
|
|
480
|
+
throw new Error("--about requires a run-item target: <run-id> --item <item-id>.");
|
|
481
|
+
if (about !== "test" && about !== "run") throw new Error("--about must be test or run.");
|
|
482
|
+
}
|
|
483
|
+
let body;
|
|
484
|
+
if (command === "comment") {
|
|
485
|
+
const rawBody = getArgValue(args, "--body");
|
|
486
|
+
if (rawBody === void 0) throw new Error("Missing --body <text|@file>.");
|
|
487
|
+
body = readTextOrFile(rawBody);
|
|
488
|
+
}
|
|
489
|
+
let testId;
|
|
490
|
+
if (target.kind === "test") testId = target.testId;
|
|
491
|
+
else {
|
|
492
|
+
const response = await fetchOrExit(
|
|
493
|
+
`${apiUrl}/external-tests/runs/${encodeURIComponent(target.runId)}/items/${encodeURIComponent(target.itemId)}`,
|
|
494
|
+
{ headers: { Authorization: `Bearer ${token}` }, token }
|
|
495
|
+
);
|
|
496
|
+
let result;
|
|
497
|
+
try {
|
|
498
|
+
result = await response.json();
|
|
499
|
+
} catch {
|
|
500
|
+
throw new Error(`Cofactor returned ${response.status} without a JSON response.`);
|
|
501
|
+
}
|
|
502
|
+
if (!response.ok || !result.ok || result.data === void 0) {
|
|
503
|
+
if (result.code === "API_KEY_INSUFFICIENT_SCOPE") {
|
|
504
|
+
throw new Error(
|
|
505
|
+
"Item lookup was denied: addressing comments by run result needs external-test-run:read. Use an API key with that scope, or address the thread with --test <test-id>."
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
throw new Error(errorText(result.error));
|
|
509
|
+
}
|
|
510
|
+
const detail = result.data;
|
|
511
|
+
if (!detail.externalTestId)
|
|
512
|
+
throw new Error("This result is not linked to a durable external test.");
|
|
513
|
+
testId = detail.externalTestId;
|
|
514
|
+
}
|
|
515
|
+
const path4 = `/external-tests/tests/${encodeURIComponent(testId)}/comments`;
|
|
516
|
+
if (command === "comments") {
|
|
517
|
+
const query = new URLSearchParams();
|
|
518
|
+
for (const [flag, name] of [
|
|
519
|
+
["--page", "page"],
|
|
520
|
+
["--page-size", "pageSize"]
|
|
521
|
+
]) {
|
|
522
|
+
const value = getArgValue(args, flag);
|
|
523
|
+
if (hasFlag(args, flag) && value === void 0) throw new Error(`Missing ${flag} <number>.`);
|
|
524
|
+
if (value !== void 0) query.set(name, value);
|
|
525
|
+
}
|
|
526
|
+
const response = await apiRequest(
|
|
527
|
+
apiUrl,
|
|
528
|
+
token,
|
|
529
|
+
"GET",
|
|
530
|
+
`${path4}${query.size ? `?${query}` : ""}`
|
|
531
|
+
);
|
|
532
|
+
if (!response.ok) throw new Error(response.error);
|
|
533
|
+
if (hasFlag(args, "--json")) writeRawOutput(JSON.stringify(response, null, 2));
|
|
534
|
+
else {
|
|
535
|
+
if (response.data.length === 0) console.log("No comments.");
|
|
536
|
+
for (const comment2 of response.data) printComment(comment2, appUrl);
|
|
537
|
+
const { page, totalPages, totalItems } = response.pagination;
|
|
538
|
+
if (totalPages > 1) console.log(`Page ${page}/${totalPages} (${totalItems} comments).`);
|
|
539
|
+
}
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
const comment = await requestData(apiUrl, token, path4, {
|
|
543
|
+
method: "POST",
|
|
544
|
+
body: JSON.stringify({
|
|
545
|
+
body,
|
|
546
|
+
...target.kind === "item" && about !== "test" ? { runItemId: target.itemId } : {}
|
|
547
|
+
})
|
|
548
|
+
});
|
|
549
|
+
if (hasFlag(args, "--json")) writeRawOutput(JSON.stringify(comment, null, 2));
|
|
550
|
+
else {
|
|
551
|
+
console.log(`Comment added (${comment.id}).`);
|
|
552
|
+
printComment(comment, appUrl);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
449
556
|
// src/external-run.ts
|
|
450
557
|
function printExternalRunHelp() {
|
|
451
558
|
console.log(
|
|
@@ -456,6 +563,9 @@ function printExternalRunHelp() {
|
|
|
456
563
|
"",
|
|
457
564
|
"Sub-commands:",
|
|
458
565
|
" get <run-id> [--area <a>] [--item <i>] [--json] Show the run or one test report",
|
|
566
|
+
" comments [<run-id> --item <id> | --test <test-id>] [--page <n>] [--page-size <n>] [--json] List the test thread",
|
|
567
|
+
" comment [<run-id> --item <id> | --test <test-id>] --body <text|@file> [--about test|run] [--json]",
|
|
568
|
+
" Run-item comments default to this result; --about test makes a general test note.",
|
|
459
569
|
" cancel <run-id> [--json] Cancel a run and stop its queued work",
|
|
460
570
|
" failures <run-id> [--area <a>] [--json] Show failed/flaky scenarios",
|
|
461
571
|
" skips <run-id> [--json] Explain retained skip provenance",
|
|
@@ -1143,6 +1253,8 @@ async function runExternalRunCommand(argv, diagnostics) {
|
|
|
1143
1253
|
if ([
|
|
1144
1254
|
"get",
|
|
1145
1255
|
"cancel",
|
|
1256
|
+
"comments",
|
|
1257
|
+
"comment",
|
|
1146
1258
|
"failures",
|
|
1147
1259
|
"skips",
|
|
1148
1260
|
"rerun",
|
|
@@ -1165,8 +1277,19 @@ async function runExternalRunCommand(argv, diagnostics) {
|
|
|
1165
1277
|
return;
|
|
1166
1278
|
}
|
|
1167
1279
|
diagnostics.cliExternalRunPhase = "resolve-config";
|
|
1168
|
-
const { apiUrl, token } = await resolveConfig(argv);
|
|
1280
|
+
const { apiUrl, token, appSubdomain } = await resolveConfig(argv);
|
|
1169
1281
|
diagnostics.cliExternalRunPhase = "validate-command";
|
|
1282
|
+
if (subCommand === "comments" || subCommand === "comment") {
|
|
1283
|
+
diagnostics.cliExternalRunPhase = subCommand;
|
|
1284
|
+
await runExternalTestComments(
|
|
1285
|
+
subCommand,
|
|
1286
|
+
rest,
|
|
1287
|
+
apiUrl,
|
|
1288
|
+
token,
|
|
1289
|
+
resolveOrgAppUrl(apiUrl, appSubdomain)
|
|
1290
|
+
);
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1170
1293
|
if (subCommand === "artifacts") {
|
|
1171
1294
|
await handleArtifactCommand(rest, apiUrl, token, diagnostics);
|
|
1172
1295
|
return;
|
|
@@ -1288,4 +1411,4 @@ export {
|
|
|
1288
1411
|
__externalRunInternals,
|
|
1289
1412
|
runExternalRun
|
|
1290
1413
|
};
|
|
1291
|
-
//# sourceMappingURL=external-run-
|
|
1414
|
+
//# sourceMappingURL=external-run-KZGHVSHY.js.map
|