reeval 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -40
- package/THIRD_PARTY_NOTICES.md +218 -11
- package/assets/package.json +1 -1
- package/assets/pnpm-lock.yaml +30 -30
- package/dist/adapter-DWlpOtRn.js +279 -0
- package/dist/adapter-DWlpOtRn.js.map +1 -0
- package/dist/{agent-B72lZ6w5.js → agent-CURAwx_q.js} +6 -6
- package/dist/{agent-B72lZ6w5.js.map → agent-CURAwx_q.js.map} +1 -1
- package/dist/{agent-Cfj1wD4D.js → agent-CaS_2Sce.js} +92 -26
- package/dist/agent-CaS_2Sce.js.map +1 -0
- package/dist/{analysis-BTNnKh1w.js → analysis-Bxub9LMT.js} +4 -4
- package/dist/{analysis-BTNnKh1w.js.map → analysis-Bxub9LMT.js.map} +1 -1
- package/dist/{assemble-BbFVjHeS.js → assemble-B9Alds-z.js} +290 -30
- package/dist/assemble-B9Alds-z.js.map +1 -0
- package/dist/assemble-J5MukZFY.js +1 -0
- package/dist/{client-CwzU9CiW.js → assert-EUIoRdIt.js} +38 -112
- package/dist/assert-EUIoRdIt.js.map +1 -0
- package/dist/bridge/index.mjs +248 -55
- package/dist/{capture-BXhBfmsM.js → capture-CNb9SuU5.js} +204 -39
- package/dist/capture-CNb9SuU5.js.map +1 -0
- package/dist/capture-jquXZBKK.js +1 -0
- package/dist/{cli-BMjTKY-D.js → cli-D303Vj5N.js} +257 -146
- package/dist/cli-D303Vj5N.js.map +1 -0
- package/dist/{cli-spec-DSvKsOK4.js → cli-spec-BPZbQG2p.js} +38 -19
- package/dist/cli-spec-BPZbQG2p.js.map +1 -0
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/client-fcwgwOAD.js +106 -0
- package/dist/client-fcwgwOAD.js.map +1 -0
- package/dist/{command-JPGNzFsA.js → command-BLfT7vnQ.js} +19 -18
- package/dist/command-BLfT7vnQ.js.map +1 -0
- package/dist/{command-BK4kOgkH.js → command-BT9a37ZR.js} +381 -78
- package/dist/command-BT9a37ZR.js.map +1 -0
- package/dist/{command-BqJtFiPy.js → command-Bge8F7Ko.js} +384 -101
- package/dist/command-Bge8F7Ko.js.map +1 -0
- package/dist/command-BkFjijN2.js +1 -0
- package/dist/{command-BdstSEHu.js → command-CMJtHKRa.js} +14 -14
- package/dist/{command-BdstSEHu.js.map → command-CMJtHKRa.js.map} +1 -1
- package/dist/commands-1p-bIWhN.js +1 -0
- package/dist/{commands-B618jg3C.js → commands-BFx16WB8.js} +8 -8
- package/dist/commands-BFx16WB8.js.map +1 -0
- package/dist/config-DEgnUiU-.js +756 -0
- package/dist/config-DEgnUiU-.js.map +1 -0
- package/dist/{context-CvUv7DUb.js → context-C1mxXh80.js} +11 -7
- package/dist/context-C1mxXh80.js.map +1 -0
- package/dist/{db-DFbtGIYy.js → db-CdHizc4_.js} +582 -53
- package/dist/db-CdHizc4_.js.map +1 -0
- package/dist/db-Dm1cRJJP.js +2 -0
- package/dist/debug-D7bEv_UV.js +1 -0
- package/dist/{dist-CTzThfu_.js → dist-B8hJImYt.js} +17 -4
- package/dist/dist-B8hJImYt.js.map +1 -0
- package/dist/{docker-2qns7hJ2.js → docker-7b_2SaH7.js} +35 -22
- package/dist/docker-7b_2SaH7.js.map +1 -0
- package/dist/{docker-IFRW8K5f.js → docker-sZrNrr82.js} +3 -3
- package/dist/docker-sZrNrr82.js.map +1 -0
- package/dist/docker-yauK-9X8.js +1 -0
- package/dist/{doctor-B6oYTPoR.js → doctor-BYNok4UO.js} +263 -84
- package/dist/doctor-BYNok4UO.js.map +1 -0
- package/dist/{duration-JsJrIWXq.js → duration-CEOQww97.js} +2 -2
- package/dist/{duration-JsJrIWXq.js.map → duration-CEOQww97.js.map} +1 -1
- package/dist/{egress-IUKdeayc.js → egress-C4PZTSSe.js} +147 -14
- package/dist/egress-C4PZTSSe.js.map +1 -0
- package/dist/environment-DNjRk0nU.js +1133 -0
- package/dist/environment-DNjRk0nU.js.map +1 -0
- package/dist/{errors-yDAEwmZo.js → errors-B6BSMs03.js} +2 -2
- package/dist/errors-B6BSMs03.js.map +1 -0
- package/dist/{errors-C9w_ud7g.js → errors-r025B0Zb.js} +4 -4
- package/dist/errors-r025B0Zb.js.map +1 -0
- package/dist/evaluate-C1UVL21l.d.ts +92 -0
- package/dist/evaluate-D4zeRGBF.js +2351 -0
- package/dist/evaluate-D4zeRGBF.js.map +1 -0
- package/dist/family-D2b7WD10.js +67 -0
- package/dist/family-D2b7WD10.js.map +1 -0
- package/dist/files-BAt0i00X.js +1 -0
- package/dist/{files-CMSUXAEg.js → files-BXUdY8tr.js} +10 -9
- package/dist/{files-CMSUXAEg.js.map → files-BXUdY8tr.js.map} +1 -1
- package/dist/files-BhyltlDB.js +1 -0
- package/dist/files-Bk1mC3AN.js +43 -0
- package/dist/files-Bk1mC3AN.js.map +1 -0
- package/dist/{files-B6aVVGrk.js → files-DQmHE7pb.js} +5 -5
- package/dist/{files-B6aVVGrk.js.map → files-DQmHE7pb.js.map} +1 -1
- package/dist/files-ZZPqfAo6.js +1 -0
- package/dist/{git-EmdFJ4DY.js → git-DfG-YJ1u.js} +2 -2
- package/dist/{git-EmdFJ4DY.js.map → git-DfG-YJ1u.js.map} +1 -1
- package/dist/harness-B8QC9u0O.js +323 -0
- package/dist/harness-B8QC9u0O.js.map +1 -0
- package/dist/harness.d.ts +19 -31
- package/dist/harness.js +1 -2
- package/dist/{header-_F0EWob3.js → header-hK-Z_Po9.js} +10 -3
- package/dist/{header-_F0EWob3.js.map → header-hK-Z_Po9.js.map} +1 -1
- package/dist/{images-CscddrJU.js → images-0On0cztu.js} +114 -45
- package/dist/images-0On0cztu.js.map +1 -0
- package/dist/index.d.ts +10 -26
- package/dist/index.js +6 -2108
- package/dist/{init-NQfIvi-0.js → init-B77Rpcqc.js} +26 -8
- package/dist/init-B77Rpcqc.js.map +1 -0
- package/dist/init-BrOWin3W.js +1 -0
- package/dist/{invocations-nPvrlZPj.js → invocations-DbGfBAA_.js} +4 -4
- package/dist/{invocations-nPvrlZPj.js.map → invocations-DbGfBAA_.js.map} +1 -1
- package/dist/{judge-CeYPN8P_.js → judge-DW_GDOmB.js} +11 -19
- package/dist/{judge-CeYPN8P_.js.map → judge-DW_GDOmB.js.map} +1 -1
- package/dist/judge.d.ts +2 -2
- package/dist/judge.js +1 -1
- package/dist/{live-S0qODb6o.js → live-jlfszAbb.js} +9 -20
- package/dist/live-jlfszAbb.js.map +1 -0
- package/dist/matchers-Ddmc2z7H.js +118 -0
- package/dist/matchers-Ddmc2z7H.js.map +1 -0
- package/dist/{model-DEQo3FkZ.js → model-DaVCY3rb.js} +2 -2
- package/dist/{model-DEQo3FkZ.js.map → model-DaVCY3rb.js.map} +1 -1
- package/dist/model-NM3ID0uR.js +1 -0
- package/dist/{model-Cl507trk.js → model-h_cDtcRr.js} +19 -18
- package/dist/model-h_cDtcRr.js.map +1 -0
- package/dist/model-nwWJvaUR.js +1 -0
- package/dist/{model-BndnmcLm.js → model-oqcDplJG.js} +271 -34
- package/dist/model-oqcDplJG.js.map +1 -0
- package/dist/{node-Co7EXge0.js → node-B3ydHo6t.js} +10 -47
- package/dist/node-B3ydHo6t.js.map +1 -0
- package/dist/object-CLf2-tNq.js +9 -0
- package/dist/object-CLf2-tNq.js.map +1 -0
- package/dist/{opencode-providers-ByD85Q0l.js → opencode-providers-J9colP0-.js} +96 -21
- package/dist/opencode-providers-J9colP0-.js.map +1 -0
- package/dist/options-Bh2W63dK.js +1119 -0
- package/dist/options-Bh2W63dK.js.map +1 -0
- package/dist/{pairs-DDsjgm5F.js → pairs-CnInRu-G.js} +76 -2
- package/dist/{pairs-DDsjgm5F.js.map → pairs-CnInRu-G.js.map} +1 -1
- package/dist/{patch-CGCVipPu.js → patch-Zac5aIRM.js} +6 -6
- package/dist/{patch-CGCVipPu.js.map → patch-Zac5aIRM.js.map} +1 -1
- package/dist/{plan-PPc4-6xd.js → plan-C9Cy27Ay.js} +75 -32
- package/dist/plan-C9Cy27Ay.js.map +1 -0
- package/dist/preflight-CPWpQeBI.js +1 -0
- package/dist/{preflight-CddycK92.js → preflight-D7iFPKeK.js} +8 -7
- package/dist/preflight-D7iFPKeK.js.map +1 -0
- package/dist/prepare-BGjePFQl.js +2 -0
- package/dist/{prepare-CsP-057p.js → prepare-doGxaAGR.js} +38 -30
- package/dist/prepare-doGxaAGR.js.map +1 -0
- package/dist/process-CSVO_jsc.js +119 -0
- package/dist/process-CSVO_jsc.js.map +1 -0
- package/dist/{provenance-CsX6PHDR.js → provenance-DmE9uPVt.js} +4 -4
- package/dist/{provenance-CsX6PHDR.js.map → provenance-DmE9uPVt.js.map} +1 -1
- package/dist/provider-DehR4CMN.js +1 -0
- package/dist/providers-gDMko8fl.js +1 -0
- package/dist/providers-tAOD1NQN.js +165 -0
- package/dist/providers-tAOD1NQN.js.map +1 -0
- package/dist/{query-BUcwCYsI.js → query-Bes9Kh6Y.js} +3 -3
- package/dist/{query-BUcwCYsI.js.map → query-Bes9Kh6Y.js.map} +1 -1
- package/dist/query-C_G_svLU.js +1 -0
- package/dist/questions-DjAwMxZ3.js +524 -0
- package/dist/questions-DjAwMxZ3.js.map +1 -0
- package/dist/{record-BRP9vZrj.js → record-BKmMvZ6O.js} +9 -1
- package/dist/{record-BRP9vZrj.js.map → record-BKmMvZ6O.js.map} +1 -1
- package/dist/remote-HDRt16ew.js +378 -0
- package/dist/remote-HDRt16ew.js.map +1 -0
- package/dist/{results-BcSHWbgB.js → results-DuauQI3Z.js} +4 -4
- package/dist/{results-BcSHWbgB.js.map → results-DuauQI3Z.js.map} +1 -1
- package/dist/{resume-DZ9AmfPv.js → resume-BRfa8E_s.js} +10 -10
- package/dist/{resume-DZ9AmfPv.js.map → resume-BRfa8E_s.js.map} +1 -1
- package/dist/{root-CvdRlRZX.js → root-DICDHCtp.js} +4 -4
- package/dist/{root-CvdRlRZX.js.map → root-DICDHCtp.js.map} +1 -1
- package/dist/{runtime-Dfb2r-cS.js → runtime-PX_oXiCS.js} +105 -11
- package/dist/runtime-PX_oXiCS.js.map +1 -0
- package/dist/sandbox-D3A8oUb7.js +70 -0
- package/dist/sandbox-D3A8oUb7.js.map +1 -0
- package/dist/sandbox.d.ts +22 -8
- package/dist/sandbox.js +1 -2
- package/dist/server-C7sg1ndo.js +1 -0
- package/dist/{server-Da60oe4b.js → server-XDleKaF_.js} +11 -11
- package/dist/server-XDleKaF_.js.map +1 -0
- package/dist/shared-DYpIb1BI.js +166 -0
- package/dist/shared-DYpIb1BI.js.map +1 -0
- package/dist/{source-BVOnL3sn.js → source-C8xumIWj.js} +2 -2
- package/dist/{source-BVOnL3sn.js.map → source-C8xumIWj.js.map} +1 -1
- package/dist/source-fGd0SaKP.js +1 -0
- package/dist/{src-TdJuDYqB.js → src-B7treWa8.js} +1597 -292
- package/dist/src-B7treWa8.js.map +1 -0
- package/dist/{src-C1E9HDWO.js → src-C7_1SqDP.js} +3 -3
- package/dist/{src-C1E9HDWO.js.map → src-C7_1SqDP.js.map} +1 -1
- package/dist/{src-DDNXsD9H.js → src-CF17Ug08.js} +5 -4
- package/dist/src-CF17Ug08.js.map +1 -0
- package/dist/{src-D_cXqmnI.js → src-CFp86GtV.js} +60 -60
- package/dist/src-CFp86GtV.js.map +1 -0
- package/dist/src-C_lPtowT.js +2 -0
- package/dist/src-DIL0jST0.js +368 -0
- package/dist/src-DIL0jST0.js.map +1 -0
- package/dist/src-DNnG4e4R.js +2 -0
- package/dist/src-DTbrY1hi.js +2 -0
- package/dist/src-DdyJEh2v.js +2 -0
- package/dist/src-Dj9PAroc.js +2 -0
- package/dist/src-Du8H85Qq.js +2 -0
- package/dist/src-DvCg0NBs.js +324 -0
- package/dist/src-DvCg0NBs.js.map +1 -0
- package/dist/{src-CxTC5kNI.js → src-DvK0EIZx.js} +8 -10
- package/dist/{src-CxTC5kNI.js.map → src-DvK0EIZx.js.map} +1 -1
- package/dist/{src-DVy58-zZ.js → src-FGXhkEkH.js} +5 -5
- package/dist/{src-DVy58-zZ.js.map → src-FGXhkEkH.js.map} +1 -1
- package/dist/src-jzagbuqH.js +2 -0
- package/dist/src-ofUaYbuY.js +3 -0
- package/dist/src-pJZOrYR9.js +1 -0
- package/dist/{src-D95O-Smv.js → src-u8_ixn_F.js} +15 -11
- package/dist/src-u8_ixn_F.js.map +1 -0
- package/dist/{state-B72h_jEw.js → state-C__9swoG.js} +36 -24
- package/dist/state-C__9swoG.js.map +1 -0
- package/dist/state-CeR6oz0k.js +66 -0
- package/dist/state-CeR6oz0k.js.map +1 -0
- package/dist/state-CgjQo29K.js +1 -0
- package/dist/studio-app/assets/index-CwQN3f_h.css +2 -0
- package/dist/studio-app/assets/{index-Bgr-efZm.js → index-DrQc2Yxd.js} +12 -12
- package/dist/studio-app/index.html +2 -2
- package/dist/{summary-k3mhWWXv.js → summary-BLAVLySU.js} +202 -17
- package/dist/summary-BLAVLySU.js.map +1 -0
- package/dist/{summary-CJdxaRdM.js → summary-DgyjUh_l.js} +7 -7
- package/dist/{summary-CJdxaRdM.js.map → summary-DgyjUh_l.js.map} +1 -1
- package/dist/testing.d.ts +3 -2
- package/dist/testing.js +3 -2
- package/dist/{tool-target-BU1JnSE9.js → tool-target-D2mcYlSQ.js} +14 -7
- package/dist/tool-target-D2mcYlSQ.js.map +1 -0
- package/dist/{tools-D0gF2QoV.js → tools-GCyNYSc1.js} +7 -7
- package/dist/tools-GCyNYSc1.js.map +1 -0
- package/dist/transcript-BNNANU8A.js +64 -0
- package/dist/transcript-BNNANU8A.js.map +1 -0
- package/dist/types-C5vI3g1C.js.map +1 -1
- package/dist/{types-_LOFdPUf.d.ts → types-g17bRAzt.d.ts} +578 -49
- package/dist/{usage-DDF_6tkV.js → usage-CleNKkly.js} +4 -2
- package/dist/{usage-DDF_6tkV.js.map → usage-CleNKkly.js.map} +1 -1
- package/dist/view/index.d.ts +83 -17
- package/dist/view/index.js +7 -6
- package/dist/views-BW6oCDUQ.js +2 -0
- package/dist/{views-DZ1YDqey.js → views-BmQF4UCI.js} +13 -8
- package/dist/views-BmQF4UCI.js.map +1 -0
- package/dist/{worker-entry-DXeyWY-m.js → worker-entry-yOchGYYv.js} +16 -225
- package/dist/worker-entry-yOchGYYv.js.map +1 -0
- package/dist/{workspace-DpXdrslo.js → workspace-CgyHEM0l.js} +7 -7
- package/dist/{workspace-DpXdrslo.js.map → workspace-CgyHEM0l.js.map} +1 -1
- package/dist/workspace-D8sSgpiy.js +1 -0
- package/docker/Dockerfile +7 -5
- package/package.json +12 -12
- package/dist/agent-Cfj1wD4D.js.map +0 -1
- package/dist/assemble-BbFVjHeS.js.map +0 -1
- package/dist/assemble-CXiTVyHD.js +0 -2
- package/dist/capture-BXhBfmsM.js.map +0 -1
- package/dist/capture-N7r3yeak.js +0 -2
- package/dist/cli-BMjTKY-D.js.map +0 -1
- package/dist/cli-spec-DSvKsOK4.js.map +0 -1
- package/dist/client-CwzU9CiW.js.map +0 -1
- package/dist/command-BK4kOgkH.js.map +0 -1
- package/dist/command-BqJtFiPy.js.map +0 -1
- package/dist/command-CTVGuH8y.js +0 -2
- package/dist/command-JPGNzFsA.js.map +0 -1
- package/dist/commands-B618jg3C.js.map +0 -1
- package/dist/commands-Duo2ur3r.js +0 -2
- package/dist/config-B-E0xRkf.js +0 -447
- package/dist/config-B-E0xRkf.js.map +0 -1
- package/dist/context-CvUv7DUb.js.map +0 -1
- package/dist/db-CnoUy-FZ.js +0 -3
- package/dist/db-DFbtGIYy.js.map +0 -1
- package/dist/debug-SEmW4w8f.js +0 -2
- package/dist/dist-CTzThfu_.js.map +0 -1
- package/dist/docker-2qns7hJ2.js.map +0 -1
- package/dist/docker-D6t23fZl.js +0 -2
- package/dist/docker-IFRW8K5f.js.map +0 -1
- package/dist/doctor-B6oYTPoR.js.map +0 -1
- package/dist/egress-IUKdeayc.js.map +0 -1
- package/dist/environment-DiCljXMD.js +0 -657
- package/dist/environment-DiCljXMD.js.map +0 -1
- package/dist/errors-C9w_ud7g.js.map +0 -1
- package/dist/errors-yDAEwmZo.js.map +0 -1
- package/dist/fake-instructions-CUI33I_F.js +0 -32
- package/dist/fake-instructions-CUI33I_F.js.map +0 -1
- package/dist/files-BM78_nnF.js +0 -2
- package/dist/files-BpYgF2z0.js +0 -2
- package/dist/files-YCCVaTQC.js +0 -2
- package/dist/harness-iqWeJQMM.js +0 -154
- package/dist/harness-iqWeJQMM.js.map +0 -1
- package/dist/images-CscddrJU.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-DBHyi92L.js +0 -2
- package/dist/init-NQfIvi-0.js.map +0 -1
- package/dist/jiti-BcJHCtrb.js +0 -46
- package/dist/jiti-BcJHCtrb.js.map +0 -1
- package/dist/live-S0qODb6o.js.map +0 -1
- package/dist/model-BbLGRtOs.js +0 -2
- package/dist/model-BndnmcLm.js.map +0 -1
- package/dist/model-Cl507trk.js.map +0 -1
- package/dist/model-DMOraCcm.js +0 -2
- package/dist/node-Co7EXge0.js.map +0 -1
- package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
- package/dist/options-DPUlm4FI.js +0 -735
- package/dist/options-DPUlm4FI.js.map +0 -1
- package/dist/plan-PPc4-6xd.js.map +0 -1
- package/dist/preflight-CddycK92.js.map +0 -1
- package/dist/preflight-Zumy0adT.js +0 -2
- package/dist/prepare-CKdMoC7e.js +0 -3
- package/dist/prepare-CsP-057p.js.map +0 -1
- package/dist/provider-BDbNOQhQ.js +0 -2
- package/dist/providers-DkwiLKDS.js +0 -107
- package/dist/providers-DkwiLKDS.js.map +0 -1
- package/dist/providers-yXZZcPfx.js +0 -2
- package/dist/query-noGbekGF.js +0 -2
- package/dist/questions-BEPj98fZ.js +0 -234
- package/dist/questions-BEPj98fZ.js.map +0 -1
- package/dist/runtime-Dfb2r-cS.js.map +0 -1
- package/dist/sandbox--ZXuscAZ.js +0 -134
- package/dist/sandbox--ZXuscAZ.js.map +0 -1
- package/dist/server-Da60oe4b.js.map +0 -1
- package/dist/server-DiGR4JxK.js +0 -2
- package/dist/source-Dqu0jKwx.js +0 -2
- package/dist/src-BHNiP-5A.js +0 -4
- package/dist/src-BT4dB5CO.js +0 -2
- package/dist/src-BT5pwco0.js +0 -3
- package/dist/src-BrMbt1B2.js +0 -3
- package/dist/src-D13vpMh0.js +0 -3
- package/dist/src-D95O-Smv.js.map +0 -1
- package/dist/src-DDNXsD9H.js.map +0 -1
- package/dist/src-D_cXqmnI.js.map +0 -1
- package/dist/src-DdRlaiRc.js +0 -3
- package/dist/src-TdJuDYqB.js.map +0 -1
- package/dist/src-xczuQbE6.js +0 -3
- package/dist/state-B72h_jEw.js.map +0 -1
- package/dist/state-Bf_Vq_pV.js +0 -2
- package/dist/studio-app/assets/index-CUx6GoL5.css +0 -2
- package/dist/summary-k3mhWWXv.js.map +0 -1
- package/dist/tool-target-BU1JnSE9.js.map +0 -1
- package/dist/tools-D0gF2QoV.js.map +0 -1
- package/dist/views-DZ1YDqey.js.map +0 -1
- package/dist/views-Ds0GXWtX.js +0 -3
- package/dist/worker-entry-DXeyWY-m.js.map +0 -1
- package/dist/workspace-DzNL-3iO.js +0 -2
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
1
|
+
import { t as isObjectLike } from "./object-CLf2-tNq.js";
|
|
2
|
+
import { n as toolTarget, t as SKILL_LOAD_TOOLS } from "./tool-target-D2mcYlSQ.js";
|
|
3
|
+
import picomatch from "picomatch";
|
|
3
4
|
//#region src/assert.ts
|
|
4
5
|
/** A check the turn's harness can't answer either way, e.g. a web fetch it never reports. */
|
|
5
6
|
var HarnessCapabilityError = class extends Error {
|
|
6
7
|
name = "HarnessCapabilityError";
|
|
7
8
|
};
|
|
8
|
-
const isTurn = (value) =>
|
|
9
|
-
const isContext = (value) =>
|
|
9
|
+
const isTurn = (value) => isObjectLike(value) && Array.isArray(value.transcript) && Array.isArray(value.unreported);
|
|
10
|
+
const isContext = (value) => isObjectLike(value) && Array.isArray(value.turns);
|
|
10
11
|
/** A turn from `c.send()`, or `c` (every turn so far). */
|
|
11
12
|
function transcriptSubject(actual, matcher) {
|
|
12
13
|
if (isTurn(actual)) return actual;
|
|
@@ -19,7 +20,7 @@ function transcriptSubject(actual, matcher) {
|
|
|
19
20
|
const matches = (value, pattern) => pattern === void 0 || (typeof pattern === "string" ? value.includes(pattern) : pattern.test(value));
|
|
20
21
|
const listed = (values) => values.length ? JSON.stringify(values) : "none";
|
|
21
22
|
const targetOf = (pattern) => pattern === void 0 ? "" : ` matching ${pattern}`;
|
|
22
|
-
const record = (value) =>
|
|
23
|
+
const record = (value) => isObjectLike(value) ? value : {};
|
|
23
24
|
const toolsOf = (transcript) => transcript.flatMap((e) => e.type === "tool" ? [e] : []);
|
|
24
25
|
const editsOf = (transcript) => transcript.flatMap((e) => e.type === "file-edit" ? [e] : []);
|
|
25
26
|
const skillLoadName = (event) => {
|
|
@@ -44,10 +45,9 @@ function inputMatches(input, expected) {
|
|
|
44
45
|
const text = typeof input === "string" ? input : JSON.stringify(input ?? "");
|
|
45
46
|
if (typeof expected === "string") return text.includes(expected);
|
|
46
47
|
if (expected instanceof RegExp) return expected.test(text);
|
|
47
|
-
if (
|
|
48
|
-
const rec = input;
|
|
48
|
+
if (!isObjectLike(input)) return false;
|
|
49
49
|
return Object.entries(expected).every(([key, value]) => {
|
|
50
|
-
const actual =
|
|
50
|
+
const actual = input[key];
|
|
51
51
|
if (value instanceof RegExp) return value.test(String(actual ?? ""));
|
|
52
52
|
if (typeof value === "string") return actual === value || String(actual ?? "").includes(value);
|
|
53
53
|
return JSON.stringify(actual) === JSON.stringify(value);
|
|
@@ -142,6 +142,34 @@ function edited(actual, path) {
|
|
|
142
142
|
message: () => pass ? `expected no file edits${targetOf(path)}, got ${listed(seen)}` : `expected file edits${targetOf(path)}, got ${listed(seen)}`
|
|
143
143
|
};
|
|
144
144
|
}
|
|
145
|
+
const hasDiff = (value) => isObjectLike(value) && isObjectLike(value.diff) && Array.isArray(value.diff.files);
|
|
146
|
+
/** A turn's changed files, or `c`'s as of its latest turn: the diff is cumulative. */
|
|
147
|
+
function changedFiles(actual) {
|
|
148
|
+
if (hasDiff(actual)) return actual.diff.files;
|
|
149
|
+
if (isContext(actual)) return actual.turns.at(-1)?.diff.files ?? [];
|
|
150
|
+
throw new TypeError("toHaveChanged() expects a turn from c.send(), or c");
|
|
151
|
+
}
|
|
152
|
+
/** A glob also matches every file under the directory it names, so `test` is `test/**` too. */
|
|
153
|
+
const pathTest = (pattern) => {
|
|
154
|
+
if (pattern instanceof RegExp) return (path) => pattern.test(path);
|
|
155
|
+
const glob = pattern.replace(/^\.?\/+/, "").replace(/\/+$/, "");
|
|
156
|
+
const self = picomatch(glob, { dot: true });
|
|
157
|
+
const inside = picomatch(`${glob}/**`, { dot: true });
|
|
158
|
+
return (path) => self(path) || inside(path);
|
|
159
|
+
};
|
|
160
|
+
/** Files in the workspace diff, so every write counts: a tool's, a shell command's or a subprocess's. */
|
|
161
|
+
function changed(actual, paths) {
|
|
162
|
+
const files = changedFiles(actual);
|
|
163
|
+
const patterns = paths === void 0 ? [] : typeof paths === "string" || paths instanceof RegExp ? [paths] : [...paths];
|
|
164
|
+
const tests = patterns.map(pathTest);
|
|
165
|
+
const hits = files.filter((f) => tests.length === 0 || tests.some((t) => t(f.path)));
|
|
166
|
+
const label = (list) => list.length ? `[${list.map((f) => `${JSON.stringify(f.path)} (${f.status})`).join(", ")}]` : "none";
|
|
167
|
+
const target = patterns.length ? ` to ${patterns.map(String).join(", ")}` : "";
|
|
168
|
+
return {
|
|
169
|
+
pass: hits.length > 0,
|
|
170
|
+
message: () => hits.length > 0 ? `expected no changes${target}, got ${label(hits)}` : `expected changes${target}, got ${label(files)}`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
145
173
|
function searched(actual, query) {
|
|
146
174
|
return webEvent("toHaveSearched", actual, "web-search", (e) => "query" in e ? e.query : "", query);
|
|
147
175
|
}
|
|
@@ -149,108 +177,6 @@ function fetched(actual, url) {
|
|
|
149
177
|
return webEvent("toHaveFetched", actual, "web-fetch", (e) => "url" in e ? e.url : "", url);
|
|
150
178
|
}
|
|
151
179
|
//#endregion
|
|
152
|
-
|
|
153
|
-
var LocalTransport = class {
|
|
154
|
-
#pending = /* @__PURE__ */ new Map();
|
|
155
|
-
#scheduler = new Scheduler((r) => {
|
|
156
|
-
this.#pending.get(r.id)?.resolve();
|
|
157
|
-
this.#pending.delete(r.id);
|
|
158
|
-
});
|
|
159
|
-
request(id, limits, rank, pending) {
|
|
160
|
-
this.#pending.set(id, pending);
|
|
161
|
-
this.#scheduler.request({
|
|
162
|
-
id,
|
|
163
|
-
owner: "local",
|
|
164
|
-
limits,
|
|
165
|
-
...rank ? { rank } : {}
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
release(id) {
|
|
169
|
-
this.#pending.delete(id);
|
|
170
|
-
this.#scheduler.release(id);
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
/** Over the worker's IPC channel to reeval's own engine: requests out, grants back. */
|
|
174
|
-
var ChannelTransport = class {
|
|
175
|
-
#pending = /* @__PURE__ */ new Map();
|
|
176
|
-
#send;
|
|
177
|
-
constructor(send) {
|
|
178
|
-
this.#send = send;
|
|
179
|
-
}
|
|
180
|
-
grant(id) {
|
|
181
|
-
const pending = this.#pending.get(id);
|
|
182
|
-
this.#pending.delete(id);
|
|
183
|
-
pending?.resolve();
|
|
184
|
-
}
|
|
185
|
-
request(id, limits, rank, pending) {
|
|
186
|
-
this.#pending.set(id, pending);
|
|
187
|
-
this.#send({
|
|
188
|
-
t: "request",
|
|
189
|
-
id,
|
|
190
|
-
limits,
|
|
191
|
-
...rank ? { rank } : {}
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
release(id) {
|
|
195
|
-
this.#pending.delete(id);
|
|
196
|
-
this.#send({
|
|
197
|
-
t: "release",
|
|
198
|
-
id
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
let transport;
|
|
203
|
-
let ids = 0;
|
|
204
|
-
/** Points this process at the run's scheduler over `send`; returns what delivers its grants. */
|
|
205
|
-
function useSchedulerChannel(send) {
|
|
206
|
-
const channel = new ChannelTransport(send);
|
|
207
|
-
transport = channel;
|
|
208
|
-
return (id) => channel.grant(id);
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Waits until every resource in `limits` has room, then holds a lease on each until released.
|
|
212
|
-
* Rejects with the signal's reason if it aborts first.
|
|
213
|
-
*/
|
|
214
|
-
function acquire(limits, options = {}) {
|
|
215
|
-
const { rank, signal } = options;
|
|
216
|
-
if (signal?.aborted) return Promise.reject(signal.reason);
|
|
217
|
-
transport ??= new LocalTransport();
|
|
218
|
-
const via = transport;
|
|
219
|
-
const id = String(++ids);
|
|
220
|
-
let released = false;
|
|
221
|
-
const lease = { release() {
|
|
222
|
-
if (released) return;
|
|
223
|
-
released = true;
|
|
224
|
-
via.release(id);
|
|
225
|
-
} };
|
|
226
|
-
return new Promise((resolve, reject) => {
|
|
227
|
-
const onAbort = () => {
|
|
228
|
-
lease.release();
|
|
229
|
-
reject(signal?.reason);
|
|
230
|
-
};
|
|
231
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
232
|
-
via.request(id, limits, rank, {
|
|
233
|
-
resolve: () => {
|
|
234
|
-
signal?.removeEventListener("abort", onAbort);
|
|
235
|
-
resolve(lease);
|
|
236
|
-
},
|
|
237
|
-
reject: (error) => {
|
|
238
|
-
signal?.removeEventListener("abort", onAbort);
|
|
239
|
-
reject(error);
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
/** Runs `fn` while holding leases on `limits`. */
|
|
245
|
-
async function withLease(limits, fn, signal) {
|
|
246
|
-
const lease = await acquire(limits, signal ? { signal } : {});
|
|
247
|
-
try {
|
|
248
|
-
return await fn();
|
|
249
|
-
} finally {
|
|
250
|
-
lease.release();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
//#endregion
|
|
254
|
-
export { calledMcp as a, edited as c, searched as d, HarnessCapabilityError as i, fetched as l, useSchedulerChannel as n, calledSkill as o, withLease as r, calledTool as s, acquire as t, ran as u };
|
|
180
|
+
export { changed as a, ran as c, calledTool as i, searched as l, calledMcp as n, edited as o, calledSkill as r, fetched as s, HarnessCapabilityError as t };
|
|
255
181
|
|
|
256
|
-
//# sourceMappingURL=
|
|
182
|
+
//# sourceMappingURL=assert-EUIoRdIt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert-EUIoRdIt.js","names":[],"sources":["../src/assert.ts"],"mappings":";;;;;AAQA,IAAa,yBAAb,cAA4C,MAAM;CAChD,OAAgB;AAClB;AAQA,MAAM,UAAU,UACd,aAAa,KAAK,KAAK,MAAM,QAAQ,MAAM,UAAU,KAAK,MAAM,QAAQ,MAAM,UAAU;AAE1F,MAAM,aAAa,UACjB,aAAa,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK;;AAGlD,SAAgB,kBAAkB,QAAiB,SAA0B;CAC3E,IAAI,OAAO,MAAM,GAAG,OAAO;CAC3B,IAAI,UAAU,MAAM,GAClB,OAAO;EACL,YAAY,OAAO,MAAM,SAAS,MAAM,EAAE,UAAU;EACpD,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,MAAM,SAAS,MAAM,EAAE,UAAU,CAAC,CAAC;CACpE;CAEF,MAAM,IAAI,UAAU,GAAG,QAAQ,sCAAsC;AACvE;AAEA,MAAM,WAAW,OAAe,YAC9B,YAAY,KAAA,MACX,OAAO,YAAY,WAAW,MAAM,SAAS,OAAO,IAAI,QAAQ,KAAK,KAAK;AAE7E,MAAM,UAAU,WAAsB,OAAO,SAAS,KAAK,UAAU,MAAM,IAAI;AAE/E,MAAM,YAAY,YAChB,YAAY,KAAA,IAAY,KAAK,aAAa;AAE5C,MAAM,UAAU,UAA6C,aAAa,KAAK,IAAI,QAAQ,CAAC;AAE5F,MAAM,WAAW,eACf,WAAW,SAAS,MAAO,EAAE,SAAS,SAAS,CAAC,CAAC,IAAI,CAAC,CAAE;AAE1D,MAAM,WAAW,eACf,WAAW,SAAS,MAAO,EAAE,SAAS,cAAc,CAAC,CAAC,IAAI,CAAC,CAAE;AAE/D,MAAM,iBAAiB,UAAyC;CAC9D,IAAI,CAAC,iBAAiB,IAAI,MAAM,IAAI,GAAG,OAAO,KAAA;CAC9C,MAAM,QAAQ,OAAO,MAAM,KAAK;CAChC,IAAI,OAAO,MAAM,OAAO,UAAU,OAAO,MAAM;CAC/C,IAAI,OAAO,MAAM,SAAS,UAAU,OAAO,MAAM;AACnD;AAEA,MAAM,aAAa,UAAyC;CAC1D,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,QAAQ,OAAO,GAAG,MAAM,KAAK,GAAG;CACpC,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,IAAI;CACjD,IAAI,OAAO,SAAS,SAAS,GAAG,OAAO,GAAG,MAAM,KAAK,GAAG;AAC1D;AAEA,MAAM,eAAe,OAAkB,SAA0B;CAC/D,IAAI,cAAc,KAAK,MAAM,MAAM,OAAO;CAC1C,OAAO,WAAW,MAAM,OAAO,MAAM,IAAI,CAAC,CAAC,SAAS,UAAU,KAAK,EAAE;AACvE;AAEA,MAAM,eAAe,MAAc,SACjC,OAAO,SAAS,WAAW,SAAS,OAAO,KAAK,KAAK,IAAI;AAE3D,SAAgB,aAAa,OAAgB,UAAoC;CAC/E,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,SAAS,EAAE;CAC3E,IAAI,OAAO,aAAa,UAAU,OAAO,KAAK,SAAS,QAAQ;CAC/D,IAAI,oBAAoB,QAAQ,OAAO,SAAS,KAAK,IAAI;CACzD,IAAI,CAAC,aAAa,KAAK,GAAG,OAAO;CACjC,OAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,WAAW;EACtD,MAAM,SAAS,MAAM;EACrB,IAAI,iBAAiB,QAAQ,OAAO,MAAM,KAAK,OAAO,UAAU,EAAE,CAAC;EACnE,IAAI,OAAO,UAAU,UACnB,OAAO,WAAW,SAAS,OAAO,UAAU,EAAE,CAAC,CAAC,SAAS,KAAK;EAEhE,OAAO,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,KAAK;CACxD,CAAC;AACH;AAEA,MAAM,8BAAc,IAAI,IAAI,CAAC,QAAQ,OAAO,CAAC;AAE7C,MAAM,aAAa,UAA6B;CAC9C,MAAM,UAAU,OAAO,MAAM,KAAK,CAAC,CAAC;CACpC,OAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AAEA,MAAM,cAAc,WAClB,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,UAAU,EAAE;AAEnE,MAAM,gBAAgB,OAAkB,SAAmC;CACzE,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,IAAI;CACjD,OAAO,QAAQ,QAAQ,IAAI,KAAK,QAAQ,WAAW,MAAM,MAAM,GAAG,IAAI;AACxE;AAEA,SAAS,SACP,SACA,QACA,MACA,OACA,SACQ;CACR,MAAM,UAAU,kBAAkB,QAAQ,OAAO;CACjD,MAAM,OAAO,SAAS,eAAe,iBAAiB;CACtD,IAAI,QAAQ,WAAW,SAAS,IAAI,GAClC,MAAM,IAAI,uBACR,GAAG,QAAQ,uDAAuD,KAAK,KAAK,KAAK,+IACnF;CAEF,MAAM,OAAO,QAAQ,WAAW,QAAQ,MAAM,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK;CACxE,MAAM,OAAO,KAAK,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC;CACjD,OAAO;EACL;EACA,eACE,OACI,eAAe,OAAO,SAAS,OAAO,EAAE,QAAQ,OAAO,IAAI,MAC3D,YAAY,OAAO,SAAS,OAAO,EAAE,QAAQ,OAAO,IAAI;CAChE;AACF;AAEA,SAAgB,YAAY,QAAiB,MAAsB;CACjE,MAAM,EAAE,eAAe,kBAAkB,QAAQ,mBAAmB;CACpE,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,OAAO,MAAM,SAAS,MAAM;EAChC,MAAM,QAAQ,UAAU,CAAC;EACzB,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;CAC5B,CAAC;CACD,MAAM,OAAO,MAAM,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;CACnD,OAAO;EACL;EACA,eACE,OACI,yCAAyC,KAAK,QAAQ,OAAO,IAAI,MACjE,sCAAsC,KAAK,QAAQ,OAAO,IAAI;CACtE;AACF;AAEA,SAAgB,WAAW,QAAiB,MAAuB,OAAgC;CACjG,MAAM,EAAE,eAAe,kBAAkB,QAAQ,kBAAkB;CACnE,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,YAAY,UAAU,KAAA,IAAY,KAAK,eAAe,YAAY,KAAK;CAC7E,MAAM,OAAO,MAAM,KAAK,MACtB,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,EAAE,KAAK,GAAG,KAAK,UAAU,EAAE,KAAK,GACpE;CACA,MAAM,OAAO,MAAM,MAAM,MAAM,YAAY,EAAE,MAAM,IAAI,KAAK,aAAa,EAAE,OAAO,KAAK,CAAC;CACxF,OAAO;EACL;EACA,eACE,OACI,mCAAmC,OAAO,UAAU,QAAQ,OAAO,IAAI,MACvE,gCAAgC,OAAO,UAAU,QAAQ,OAAO,IAAI;CAC5E;AACF;AAEA,MAAM,WAAW;AAEjB,MAAM,YAAY,SAAiB;CACjC,MAAM,IAAI,SAAS,KAAK,IAAI;CAC5B,OAAO,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO;AACjC;;AAGA,SAAgB,UACd,QACA,QACA,MACA,OACQ;CACR,MAAM,UAAU,kBAAkB,QAAQ,iBAAiB;CAC3D,MAAM,SAAS,WAAW,SAAS,QAAQ,OAAO,IAAI,QAAQ,KAAK;CACnE,MAAM,WAAW,QAAQ,QAAQ,UAAU,CAAC,CAAC,QAAQ,MAAM,EAAE,KAAK,WAAW,OAAO,CAAC;CACrF,MAAM,YAAY,UAAU,KAAA,IAAY,KAAK,eAAe,YAAY,KAAK;CAC7E,MAAM,OAAO,SAAS,KAAK,MACzB,UAAU,KAAA,IAAY,SAAS,EAAE,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,UAAU,EAAE,KAAK,GACxF;CACA,OAAO;EACL,MAAM,OAAO;EACb,eACE,OAAO,OACH,kCAAkC,OAAO,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI,MAChF,+BAA+B,OAAO,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI;CACrF;AACF;AAEA,SAAS,YAAY,OAA+B;CAClD,IAAI,OAAO,UAAU,YAAY,iBAAiB,QAAQ,OAAO,OAAO,KAAK;CAC7E,OAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAgB,IAAI,QAAiB,SAAmC;CACtE,MAAM,EAAE,eAAe,kBAAkB,QAAQ,WAAW;CAC5D,MAAM,SAAS,QAAQ,UAAU,CAAC,CAAC,QAAQ,MAAM,YAAY,IAAI,EAAE,IAAI,CAAC;CACxE,MAAM,OAAO,OAAO,IAAI,SAAS;CACjC,MAAM,OAAO,OAAO,MAAM,MAAM,QAAQ,UAAU,CAAC,GAAG,OAAO,CAAC;CAC9D,OAAO;EACL;EACA,eACE,OACI,6BAA6B,SAAS,OAAO,EAAE,QAAQ,OAAO,IAAI,MAClE,0BAA0B,SAAS,OAAO,EAAE,QAAQ,OAAO,IAAI;CACvE;AACF;AAEA,SAAgB,OAAO,QAAiB,MAAgC;CACtE,MAAM,EAAE,eAAe,kBAAkB,QAAQ,cAAc;CAC/D,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,UAAU,MAAM,MAAM,MAAM,QAAQ,EAAE,MAAM,IAAI,CAAC;CACvD,MAAM,UAAU,SAAS,KAAA,KAAa,MAAM,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC;CAC7E,MAAM,OAAO,WAAW;CACxB,MAAM,OAAO,CACX,GAAG,MAAM,KAAK,MAAM,EAAE,IAAI,GAC1B,GAAG,MACA,QAAQ,MAAM,SAAS,KAAA,KAAa,aAAa,GAAG,IAAI,CAAC,CAAC,CAC1D,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,WAAW,EAAE,OAAO,EAAE,IAAI,GAAG,CAC1D;CACA,OAAO;EACL;EACA,eACE,OACI,yBAAyB,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI,MAC3D,sBAAsB,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI;CAChE;AACF;AAIA,MAAM,WAAW,UACf,aAAa,KAAK,KAAK,aAAa,MAAM,IAAI,KAAK,MAAM,QAAQ,MAAM,KAAK,KAAK;;AAGnF,SAAS,aAAa,QAA+B;CACnD,IAAI,QAAQ,MAAM,GAAG,OAAO,OAAO,KAAK;CACxC,IAAI,UAAU,MAAM,GAAG,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC;CAClE,MAAM,IAAI,UAAU,oDAAoD;AAC1E;;AAGA,MAAM,YAAY,YAA0D;CAC1E,IAAI,mBAAmB,QAAQ,QAAQ,SAAS,QAAQ,KAAK,IAAI;CACjE,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAC9D,MAAM,OAAO,UAAU,MAAM,EAAE,KAAK,KAAK,CAAC;CAC1C,MAAM,SAAS,UAAU,GAAG,KAAK,MAAM,EAAE,KAAK,KAAK,CAAC;CACpD,QAAQ,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI;AAC5C;;AAGA,SAAgB,QAAQ,QAAiB,OAA2B;CAClE,MAAM,QAAQ,aAAa,MAAM;CACjC,MAAM,WACJ,UAAU,KAAA,IACN,CAAC,IACD,OAAO,UAAU,YAAY,iBAAiB,SAC5C,CAAC,KAAK,IACN,CAAC,GAAG,KAAK;CACjB,MAAM,QAAQ,SAAS,IAAI,QAAQ;CACnC,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;CACnF,MAAM,SAAS,SACb,KAAK,SACD,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,KAC1E;CACN,MAAM,SAAS,SAAS,SAAS,OAAO,SAAS,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,MAAM;CAC5E,OAAO;EACL,MAAM,KAAK,SAAS;EACpB,eACE,KAAK,SAAS,IACV,sBAAsB,OAAO,QAAQ,MAAM,IAAI,MAC/C,mBAAmB,OAAO,QAAQ,MAAM,KAAK;CACrD;AACF;AAEA,SAAgB,SAAS,QAAiB,OAAiC;CACzE,OAAO,SACL,kBACA,QACA,eACC,MAAO,WAAW,IAAI,EAAE,QAAQ,IACjC,KACF;AACF;AAEA,SAAgB,QAAQ,QAAiB,KAA+B;CACtE,OAAO,SAAS,iBAAiB,QAAQ,cAAc,MAAO,SAAS,IAAI,EAAE,MAAM,IAAK,GAAG;AAC7F"}
|
package/dist/bridge/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Modified by Invertase with patches/@ai-sdk__harness-claude-code@1.0.
|
|
1
|
+
// Modified by Invertase with patches/@ai-sdk__harness-claude-code@1.0.158.patch; see THIRD_PARTY_NOTICES.md.
|
|
2
2
|
import { appendFile, mkdir, writeFile } from "node:fs/promises";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -9,6 +9,71 @@ import * as mcpServerModule from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
9
9
|
import { isDeepStrictEqual } from "node:util";
|
|
10
10
|
import { z } from "zod/v4";
|
|
11
11
|
//#region ../harness/dist/bridge/index.js
|
|
12
|
+
const name = "AI_HarnessBridgeCapabilityUnsupportedError";
|
|
13
|
+
/**
|
|
14
|
+
* Signals an unsupported capability discovered inside a sandbox bridge.
|
|
15
|
+
* `isInstance` also recognizes the serialized error shape received by the
|
|
16
|
+
* host, where it can be translated to `HarnessCapabilityUnsupportedError`.
|
|
17
|
+
*/
|
|
18
|
+
var HarnessBridgeCapabilityUnsupportedError = class extends Error {
|
|
19
|
+
constructor({ message, harnessId, cause }) {
|
|
20
|
+
super(message);
|
|
21
|
+
Object.defineProperty(this, "name", { value: name });
|
|
22
|
+
this.harnessId = harnessId;
|
|
23
|
+
this.cause = cause;
|
|
24
|
+
}
|
|
25
|
+
static isInstance(error) {
|
|
26
|
+
return error != null && typeof error === "object" && "name" in error && error.name === name && "message" in error && typeof error.message === "string";
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
function getNormalizedInlineImage(part) {
|
|
30
|
+
if (part.type === "file" && part.mediaType.startsWith("image/") && part.mediaType !== "image/*" && part.data.type === "data" && typeof part.data.data === "string") return {
|
|
31
|
+
data: part.data.data,
|
|
32
|
+
mediaType: part.mediaType
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function convertHarnessToolModelOutput({ output }) {
|
|
36
|
+
switch (output.type) {
|
|
37
|
+
case "text":
|
|
38
|
+
case "error-text": return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: output.value
|
|
42
|
+
}],
|
|
43
|
+
isError: output.type === "error-text"
|
|
44
|
+
};
|
|
45
|
+
case "json":
|
|
46
|
+
case "error-json": return {
|
|
47
|
+
content: [{
|
|
48
|
+
type: "text",
|
|
49
|
+
text: JSON.stringify(output.value)
|
|
50
|
+
}],
|
|
51
|
+
isError: output.type === "error-json"
|
|
52
|
+
};
|
|
53
|
+
case "execution-denied": return {
|
|
54
|
+
content: [{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: output.reason ?? "Tool execution denied."
|
|
57
|
+
}],
|
|
58
|
+
isError: true
|
|
59
|
+
};
|
|
60
|
+
case "content": return {
|
|
61
|
+
content: output.value.map((part) => {
|
|
62
|
+
if (part.type === "text") return {
|
|
63
|
+
type: "text",
|
|
64
|
+
text: part.text
|
|
65
|
+
};
|
|
66
|
+
const image = getNormalizedInlineImage(part);
|
|
67
|
+
if (image != null) return {
|
|
68
|
+
type: "image",
|
|
69
|
+
...image
|
|
70
|
+
};
|
|
71
|
+
throw new HarnessBridgeCapabilityUnsupportedError({ message: `Harnesses support only text and inline images in tool model output; unsupported content '${part.type}'.` });
|
|
72
|
+
}),
|
|
73
|
+
isError: false
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
12
77
|
const DEBUG_LEVEL_WEIGHT = {
|
|
13
78
|
error: 0,
|
|
14
79
|
warn: 1,
|
|
@@ -633,12 +698,17 @@ function createClaudeStreamEventState() {
|
|
|
633
698
|
pendingStepDeltaUsage: void 0,
|
|
634
699
|
pendingStepUsage: void 0,
|
|
635
700
|
pendingResponseUsage: void 0,
|
|
701
|
+
responseOpen: false,
|
|
636
702
|
stepOpen: false,
|
|
637
703
|
mcpToolCalls: /* @__PURE__ */ new Map(),
|
|
638
704
|
mcpHandlerCalls: /* @__PURE__ */ new Map(),
|
|
639
705
|
externalMcpToolUseIds: /* @__PURE__ */ new Set(),
|
|
640
706
|
structuredOutputToolUseIds: /* @__PURE__ */ new Set(),
|
|
641
|
-
observedTerminalError: void 0
|
|
707
|
+
observedTerminalError: void 0,
|
|
708
|
+
hostInputWaitingToolUseIds: /* @__PURE__ */ new Set(),
|
|
709
|
+
earlyFinishStepToolUseIds: /* @__PURE__ */ new Set(),
|
|
710
|
+
emittedToolCallIds: /* @__PURE__ */ new Set(),
|
|
711
|
+
modelResponseStreaming: false
|
|
642
712
|
};
|
|
643
713
|
}
|
|
644
714
|
const UNRECOVERABLE_API_RETRY_STATUSES = /* @__PURE__ */ new Set([
|
|
@@ -731,12 +801,34 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
731
801
|
continue;
|
|
732
802
|
}
|
|
733
803
|
if (block.name.startsWith(HOST_TOOL_PREFIX)) {
|
|
804
|
+
const hostToolName = block.name.slice(20);
|
|
734
805
|
state.pendingStepToolUseIds.add(block.id);
|
|
735
806
|
state.mcpToolCalls.set(block.id, {
|
|
736
|
-
toolName:
|
|
807
|
+
toolName: hostToolName,
|
|
737
808
|
input: block.input ?? {}
|
|
738
809
|
});
|
|
739
810
|
opensStep = true;
|
|
811
|
+
const handlerCallId = findMcpHandlerCallId({
|
|
812
|
+
state,
|
|
813
|
+
toolCallId: block.id,
|
|
814
|
+
toolCall: state.mcpToolCalls.get(block.id)
|
|
815
|
+
});
|
|
816
|
+
if (handlerCallId != null) {
|
|
817
|
+
state.mcpHandlerCalls.get(handlerCallId).toolUseId = block.id;
|
|
818
|
+
state.emittedToolCallIds.add(block.id);
|
|
819
|
+
continue;
|
|
820
|
+
}
|
|
821
|
+
state.hostInputWaitingToolUseIds.add(block.id);
|
|
822
|
+
if (!state.emittedToolCallIds.has(block.id)) {
|
|
823
|
+
state.emittedToolCallIds.add(block.id);
|
|
824
|
+
emit({
|
|
825
|
+
type: "tool-call",
|
|
826
|
+
toolCallId: block.id,
|
|
827
|
+
toolName: hostToolName,
|
|
828
|
+
input: JSON.stringify(block.input ?? {}),
|
|
829
|
+
providerExecuted: false
|
|
830
|
+
});
|
|
831
|
+
}
|
|
740
832
|
continue;
|
|
741
833
|
}
|
|
742
834
|
state.nativeToolCallNames.set(block.id, block.name);
|
|
@@ -747,9 +839,10 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
747
839
|
}
|
|
748
840
|
const dynamic = isExternalMcpTool(block.name);
|
|
749
841
|
if (dynamic) state.externalMcpToolUseIds.add(block.id);
|
|
750
|
-
if (state.approvalRequestedToolUseIds.has(block.id)) continue;
|
|
751
842
|
state.pendingStepToolUseIds.add(block.id);
|
|
752
843
|
opensStep = true;
|
|
844
|
+
if (state.emittedToolCallIds.has(block.id)) continue;
|
|
845
|
+
state.emittedToolCallIds.add(block.id);
|
|
753
846
|
emit({
|
|
754
847
|
type: "tool-call",
|
|
755
848
|
toolCallId: block.id,
|
|
@@ -766,6 +859,10 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
766
859
|
state.pendingStepAssistantUsage = usage;
|
|
767
860
|
updatePendingStepUsage(state);
|
|
768
861
|
}
|
|
862
|
+
if (state.hostInputWaitingToolUseIds.size > 0) closeStepIfReady({
|
|
863
|
+
state,
|
|
864
|
+
emit
|
|
865
|
+
});
|
|
769
866
|
}
|
|
770
867
|
return;
|
|
771
868
|
}
|
|
@@ -782,6 +879,7 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
782
879
|
});
|
|
783
880
|
state.mcpToolCalls.delete(block.tool_use_id);
|
|
784
881
|
state.pendingStepToolUseIds.delete(block.tool_use_id);
|
|
882
|
+
state.hostInputWaitingToolUseIds.delete(block.tool_use_id);
|
|
785
883
|
if (handlerReportedCall) continue;
|
|
786
884
|
const isError = !!block.is_error;
|
|
787
885
|
const result = toolUseResult !== void 0 ? toolUseResult : resolveToolResult({
|
|
@@ -790,13 +888,16 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
790
888
|
isError,
|
|
791
889
|
rawContent: block.content
|
|
792
890
|
});
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
891
|
+
if (!state.emittedToolCallIds.has(block.tool_use_id)) {
|
|
892
|
+
state.emittedToolCallIds.add(block.tool_use_id);
|
|
893
|
+
emit({
|
|
894
|
+
type: "tool-call",
|
|
895
|
+
toolCallId: block.tool_use_id,
|
|
896
|
+
toolName: mcpToolCall.toolName,
|
|
897
|
+
input: JSON.stringify(mcpToolCall.input),
|
|
898
|
+
providerExecuted: true
|
|
899
|
+
});
|
|
900
|
+
}
|
|
800
901
|
emit({
|
|
801
902
|
type: "tool-result",
|
|
802
903
|
toolCallId: block.tool_use_id,
|
|
@@ -836,27 +937,40 @@ function createEmitStreamEvent({ state, emit, emitWarning, emitTerminalError, on
|
|
|
836
937
|
};
|
|
837
938
|
}
|
|
838
939
|
function takeMcpHandlerCall({ state, toolCallId, toolCall }) {
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
}
|
|
940
|
+
const handlerCallId = findMcpHandlerCallId({
|
|
941
|
+
state,
|
|
942
|
+
toolCallId,
|
|
943
|
+
toolCall
|
|
944
|
+
});
|
|
945
|
+
if (handlerCallId != null) return state.mcpHandlerCalls.delete(handlerCallId);
|
|
844
946
|
const matchingHandlerCallIds = Array.from(state.mcpHandlerCalls).filter(([, handlerCall]) => handlerCall.toolName === toolCall.toolName).map(([handlerCallId]) => handlerCallId);
|
|
845
947
|
const matchingToolCallCount = Array.from(state.mcpToolCalls.values()).filter((pendingCall) => pendingCall.toolName === toolCall.toolName).length;
|
|
846
|
-
if (matchingHandlerCallIds.length > 0 && matchingHandlerCallIds.length === matchingToolCallCount)
|
|
847
|
-
state.mcpHandlerCalls.delete(matchingHandlerCallIds[0]);
|
|
848
|
-
return true;
|
|
849
|
-
}
|
|
948
|
+
if (matchingHandlerCallIds.length > 0 && matchingHandlerCallIds.length === matchingToolCallCount) return state.mcpHandlerCalls.delete(matchingHandlerCallIds[0]);
|
|
850
949
|
return false;
|
|
851
950
|
}
|
|
852
|
-
function
|
|
951
|
+
function findMcpHandlerCallId({ state, toolCallId, toolCall }) {
|
|
952
|
+
if (state.mcpHandlerCalls.has(toolCallId)) return toolCallId;
|
|
953
|
+
for (const [handlerCallId, handlerCall] of state.mcpHandlerCalls) {
|
|
954
|
+
if (handlerCall.toolUseId != null && handlerCall.toolUseId !== toolCallId || handlerCallId !== toolCallId && state.mcpToolCalls.has(handlerCallId)) continue;
|
|
955
|
+
if (handlerCall.toolName === toolCall.toolName && isDeepStrictEqual(handlerCall.input, toolCall.input)) return handlerCallId;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
function markWaitingOnHostInput({ state, emit, toolUseId }) {
|
|
853
959
|
state.stepOpen = true;
|
|
854
|
-
state.pendingStepToolUseIds.
|
|
960
|
+
state.pendingStepToolUseIds.add(toolUseId);
|
|
961
|
+
state.hostInputWaitingToolUseIds.add(toolUseId);
|
|
855
962
|
closeStepIfReady({
|
|
856
963
|
state,
|
|
857
964
|
emit
|
|
858
965
|
});
|
|
859
966
|
}
|
|
967
|
+
function clearWaitingOnHostInput({ state, toolUseId }) {
|
|
968
|
+
state.hostInputWaitingToolUseIds.delete(toolUseId);
|
|
969
|
+
}
|
|
970
|
+
function resolveMcpHandlerToolUseId({ state, metadataToolUseId, toolName, input }) {
|
|
971
|
+
if (metadataToolUseId != null) return metadataToolUseId;
|
|
972
|
+
for (const [toolUseId, toolCall] of state.mcpToolCalls) if (!state.mcpHandlerCalls.has(toolUseId) && toolCall.toolName === toolName && isDeepStrictEqual(toolCall.input, input)) return toolUseId;
|
|
973
|
+
}
|
|
860
974
|
function emitFinishStep({ state, emit, usage }) {
|
|
861
975
|
emit({
|
|
862
976
|
type: "finish-step",
|
|
@@ -871,14 +985,37 @@ function emitFinishStep({ state, emit, usage }) {
|
|
|
871
985
|
state.pendingStepDeltaUsage = void 0;
|
|
872
986
|
state.pendingStepUsage = void 0;
|
|
873
987
|
state.pendingStepToolUseIds = /* @__PURE__ */ new Set();
|
|
988
|
+
state.earlyFinishStepToolUseIds = /* @__PURE__ */ new Set();
|
|
874
989
|
state.stepOpen = false;
|
|
875
990
|
}
|
|
876
991
|
function closeStepIfReady({ state, emit }) {
|
|
877
|
-
if (!state.stepOpen || state.
|
|
878
|
-
|
|
992
|
+
if (!state.stepOpen || state.responseOpen || state.partialBlocks.size > 0) return;
|
|
993
|
+
if (state.pendingStepToolUseIds.size === 0) {
|
|
994
|
+
emitFinishStep({
|
|
995
|
+
state,
|
|
996
|
+
emit,
|
|
997
|
+
usage: state.pendingStepUsage
|
|
998
|
+
});
|
|
999
|
+
return;
|
|
1000
|
+
}
|
|
1001
|
+
emitEarlyFinishStepIfReady({
|
|
879
1002
|
state,
|
|
880
|
-
emit
|
|
881
|
-
|
|
1003
|
+
emit
|
|
1004
|
+
});
|
|
1005
|
+
}
|
|
1006
|
+
function emitEarlyFinishStepIfReady({ state, emit }) {
|
|
1007
|
+
if (!state.stepOpen || state.partialBlocks.size > 0 || state.modelResponseStreaming || state.pendingStepToolUseIds.size === 0) return;
|
|
1008
|
+
const uncovered = [...state.hostInputWaitingToolUseIds].filter((toolUseId) => state.pendingStepToolUseIds.has(toolUseId) && !state.earlyFinishStepToolUseIds.has(toolUseId));
|
|
1009
|
+
if (uncovered.length === 0) return;
|
|
1010
|
+
for (const toolUseId of uncovered) state.earlyFinishStepToolUseIds.add(toolUseId);
|
|
1011
|
+
emit({
|
|
1012
|
+
type: "finish-step",
|
|
1013
|
+
finishReason: {
|
|
1014
|
+
unified: "tool-calls",
|
|
1015
|
+
raw: "host-input"
|
|
1016
|
+
},
|
|
1017
|
+
usage: defaultUsage(),
|
|
1018
|
+
harnessMetadata: { "claude-code": { inferredStep: true } }
|
|
882
1019
|
});
|
|
883
1020
|
}
|
|
884
1021
|
function formatApiRetryWarning(msg) {
|
|
@@ -895,7 +1032,9 @@ function formatApiRetryWarning(msg) {
|
|
|
895
1032
|
function handleStreamEvent({ event, message, state, send, toCommonName }) {
|
|
896
1033
|
if (!event) return;
|
|
897
1034
|
if (event.type === "message_start") {
|
|
1035
|
+
state.modelResponseStreaming = true;
|
|
898
1036
|
state.pendingResponseUsage = toUsageRecord(event.message?.usage);
|
|
1037
|
+
state.responseOpen = true;
|
|
899
1038
|
return;
|
|
900
1039
|
}
|
|
901
1040
|
if (event.type === "message_delta") {
|
|
@@ -916,6 +1055,12 @@ function handleStreamEvent({ event, message, state, send, toCommonName }) {
|
|
|
916
1055
|
}
|
|
917
1056
|
});
|
|
918
1057
|
state.pendingResponseUsage = void 0;
|
|
1058
|
+
state.modelResponseStreaming = false;
|
|
1059
|
+
state.responseOpen = false;
|
|
1060
|
+
closeStepIfReady({
|
|
1061
|
+
state,
|
|
1062
|
+
emit: send
|
|
1063
|
+
});
|
|
919
1064
|
return;
|
|
920
1065
|
}
|
|
921
1066
|
if (typeof event.index !== "number") return;
|
|
@@ -1281,6 +1426,7 @@ const NATIVE_TOOL_KINDS = {
|
|
|
1281
1426
|
TaskGet: "readonly",
|
|
1282
1427
|
TaskList: "readonly",
|
|
1283
1428
|
TaskOutput: "readonly",
|
|
1429
|
+
ListAgents: "readonly",
|
|
1284
1430
|
ListMcpResources: "readonly",
|
|
1285
1431
|
ReadMcpResource: "readonly",
|
|
1286
1432
|
Write: "edit",
|
|
@@ -1355,22 +1501,26 @@ function createPermissionOptions(input) {
|
|
|
1355
1501
|
const approvalId = options.toolUseID;
|
|
1356
1502
|
input.approvalRequestedToolUseIds.add(approvalId);
|
|
1357
1503
|
input.nativeToolCallNames.set(approvalId, toolName);
|
|
1358
|
-
input.
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1504
|
+
if (!input.emittedToolCallIds.has(approvalId)) {
|
|
1505
|
+
input.emittedToolCallIds.add(approvalId);
|
|
1506
|
+
input.emit({
|
|
1507
|
+
type: "tool-call",
|
|
1508
|
+
toolCallId: approvalId,
|
|
1509
|
+
toolName: toCommonName(toolName),
|
|
1510
|
+
nativeName: toolName,
|
|
1511
|
+
input: JSON.stringify(toolInput ?? {}),
|
|
1512
|
+
providerExecuted: true,
|
|
1513
|
+
...isExternalMcpTool(toolName) ? { dynamic: true } : {}
|
|
1514
|
+
});
|
|
1515
|
+
}
|
|
1516
|
+
const decisionPromise = input.turn.requestToolApproval(approvalId);
|
|
1367
1517
|
input.emit({
|
|
1368
1518
|
type: "tool-approval-request",
|
|
1369
1519
|
approvalId,
|
|
1370
1520
|
toolCallId: approvalId
|
|
1371
1521
|
});
|
|
1372
|
-
input.
|
|
1373
|
-
const decision = await input.
|
|
1522
|
+
input.markWaitingOnHostInput(approvalId);
|
|
1523
|
+
const decision = await decisionPromise.finally(() => input.clearWaitingOnHostInput(approvalId));
|
|
1374
1524
|
return decision.approved ? {
|
|
1375
1525
|
behavior: "allow",
|
|
1376
1526
|
updatedInput: toolInput,
|
|
@@ -1400,6 +1550,7 @@ function createQuestionPreToolUseHook(input) {
|
|
|
1400
1550
|
providerMetadata: { "claude-code": { nativeRequest: nativeInput } }
|
|
1401
1551
|
});
|
|
1402
1552
|
const questionKey = claudeCodeQuestionKey(nativeInput);
|
|
1553
|
+
input.markWaitingOnHostInput(toolCallId);
|
|
1403
1554
|
const nativeResult = toClaudeCodeQuestionResult({
|
|
1404
1555
|
nativeInput,
|
|
1405
1556
|
output: (await input.turn.requestToolResult({
|
|
@@ -1408,7 +1559,7 @@ function createQuestionPreToolUseHook(input) {
|
|
|
1408
1559
|
const nativeRequest = candidate.toolResult?.providerOptions?.["claude-code"]?.nativeRequest;
|
|
1409
1560
|
return nativeRequest != null && claudeCodeQuestionKey(nativeRequest) === questionKey;
|
|
1410
1561
|
}
|
|
1411
|
-
})).output
|
|
1562
|
+
}).finally(() => input.clearWaitingOnHostInput(toolCallId))).output
|
|
1412
1563
|
});
|
|
1413
1564
|
return { hookSpecificOutput: {
|
|
1414
1565
|
hookEventName: "PreToolUse",
|
|
@@ -1461,19 +1612,38 @@ async function runTurn(start, turn) {
|
|
|
1461
1612
|
}, async (...handlerArgs) => {
|
|
1462
1613
|
const [input, extra] = handlerArgs;
|
|
1463
1614
|
const metadataToolCallId = extra._meta?.["claudecode/toolUseId"];
|
|
1464
|
-
const toolCallId =
|
|
1615
|
+
const toolCallId = resolveMcpHandlerToolUseId({
|
|
1616
|
+
state: streamEventState,
|
|
1617
|
+
metadataToolUseId: typeof metadataToolCallId === "string" ? metadataToolCallId : void 0,
|
|
1618
|
+
toolName: tool.name,
|
|
1619
|
+
input
|
|
1620
|
+
}) ?? randomUUID();
|
|
1465
1621
|
streamEventState.mcpHandlerCalls.set(toolCallId, {
|
|
1466
1622
|
toolName: tool.name,
|
|
1467
1623
|
input
|
|
1468
1624
|
});
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1625
|
+
if (!streamEventState.emittedToolCallIds.has(toolCallId)) {
|
|
1626
|
+
streamEventState.emittedToolCallIds.add(toolCallId);
|
|
1627
|
+
emit({
|
|
1628
|
+
type: "tool-call",
|
|
1629
|
+
toolCallId,
|
|
1630
|
+
toolName: tool.name,
|
|
1631
|
+
input: JSON.stringify(input),
|
|
1632
|
+
providerExecuted: false
|
|
1633
|
+
});
|
|
1634
|
+
markWaitingOnHostInput({
|
|
1635
|
+
state: streamEventState,
|
|
1636
|
+
emit,
|
|
1637
|
+
toolUseId: toolCallId
|
|
1638
|
+
});
|
|
1639
|
+
}
|
|
1640
|
+
const { output, isError, toolResult } = await turn.requestToolResult(toolCallId).finally(() => {
|
|
1641
|
+
clearWaitingOnHostInput({
|
|
1642
|
+
state: streamEventState,
|
|
1643
|
+
toolUseId: toolCallId
|
|
1644
|
+
});
|
|
1645
|
+
if (!streamEventState.mcpToolCalls.has(toolCallId)) streamEventState.pendingStepToolUseIds.delete(toolCallId);
|
|
1475
1646
|
});
|
|
1476
|
-
const { output, isError } = await turn.requestToolResult(toolCallId);
|
|
1477
1647
|
emit({
|
|
1478
1648
|
type: "tool-result",
|
|
1479
1649
|
toolCallId,
|
|
@@ -1481,6 +1651,17 @@ async function runTurn(start, turn) {
|
|
|
1481
1651
|
result: output ?? null,
|
|
1482
1652
|
isError: !!isError
|
|
1483
1653
|
});
|
|
1654
|
+
if (toolResult != null) {
|
|
1655
|
+
const converted = convertHarnessToolModelOutput({ output: toolResult.output });
|
|
1656
|
+
return {
|
|
1657
|
+
content: converted.content.map((part) => part.type === "text" ? part : {
|
|
1658
|
+
type: "image",
|
|
1659
|
+
data: part.data,
|
|
1660
|
+
mimeType: part.mediaType
|
|
1661
|
+
}),
|
|
1662
|
+
isError: isError === true || converted.isError
|
|
1663
|
+
};
|
|
1664
|
+
}
|
|
1484
1665
|
return {
|
|
1485
1666
|
content: [{
|
|
1486
1667
|
type: "text",
|
|
@@ -1517,20 +1698,32 @@ async function runTurn(start, turn) {
|
|
|
1517
1698
|
inactiveNativeTools,
|
|
1518
1699
|
turn,
|
|
1519
1700
|
emit,
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1701
|
+
markWaitingOnHostInput: (toolUseId) => markWaitingOnHostInput({
|
|
1702
|
+
state: streamEventState,
|
|
1703
|
+
emit,
|
|
1704
|
+
toolUseId
|
|
1705
|
+
}),
|
|
1706
|
+
clearWaitingOnHostInput: (toolUseId) => clearWaitingOnHostInput({
|
|
1707
|
+
state: streamEventState,
|
|
1708
|
+
toolUseId
|
|
1709
|
+
}),
|
|
1527
1710
|
nativeToolCallNames: streamEventState.nativeToolCallNames,
|
|
1528
|
-
approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds
|
|
1711
|
+
approvalRequestedToolUseIds: streamEventState.approvalRequestedToolUseIds,
|
|
1712
|
+
emittedToolCallIds: streamEventState.emittedToolCallIds
|
|
1529
1713
|
});
|
|
1530
1714
|
const questionPreToolUseHook = createQuestionPreToolUseHook({
|
|
1531
1715
|
turn,
|
|
1532
1716
|
emit,
|
|
1533
|
-
nativeToolCallNames: streamEventState.nativeToolCallNames
|
|
1717
|
+
nativeToolCallNames: streamEventState.nativeToolCallNames,
|
|
1718
|
+
markWaitingOnHostInput: (toolUseId) => markWaitingOnHostInput({
|
|
1719
|
+
state: streamEventState,
|
|
1720
|
+
emit,
|
|
1721
|
+
toolUseId
|
|
1722
|
+
}),
|
|
1723
|
+
clearWaitingOnHostInput: (toolUseId) => clearWaitingOnHostInput({
|
|
1724
|
+
state: streamEventState,
|
|
1725
|
+
toolUseId
|
|
1726
|
+
})
|
|
1534
1727
|
});
|
|
1535
1728
|
const q = claudeSdk.query({
|
|
1536
1729
|
prompt: queryInput.input,
|