promptfoo 0.120.27 → 0.121.2
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 +1 -1
- package/dist/src/{ListApp-8WOe2nT6.js → ListApp-Du7YVwj5.js} +2 -4
- package/dist/src/accounts-B0pgC1oV.js +206 -0
- package/dist/src/{accounts-DVINui-2.js → accounts-Bm2D8Db9.js} +39 -34
- package/dist/src/{accounts-CPDRAMND.js → accounts-CiBLOnA7.js} +38 -33
- package/dist/src/{accounts-Fl2J3_Fu.cjs → accounts-gtkH-5KX.cjs} +77 -78
- package/dist/src/{agentic-utils-D922n6mm.js → agentic-utils-DS1g3GLF.js} +9 -10
- package/dist/src/{agents-BcsN_BgB.js → agents-9qiOy0ho.js} +16 -12
- package/dist/src/{agents-BXLmVsxR.js → agents-CBr9A01V.js} +37 -37
- package/dist/src/{agents-pMfppv9Z.js → agents-CmvBq8LV.js} +16 -18
- package/dist/src/{agents-hqgSV-3o.js → agents-D__IdAlg.js} +39 -40
- package/dist/src/{agents-BO2n8Z0d.cjs → agents-DbRtpYxR.cjs} +37 -40
- package/dist/src/{agents-BdUTAwi-.js → agents-DgF2zDag.js} +37 -42
- package/dist/src/{agents-DgJf2-ez.cjs → agents-Di9DKPzn.cjs} +16 -17
- package/dist/src/{agents-DNvSH78i.js → agents-cLXA8a_8.js} +17 -19
- package/dist/src/{aimlapi-DtgPI0nE.js → aimlapi-B4rcnZgv.js} +15 -17
- package/dist/src/{aimlapi-BE_Tg9Fl.cjs → aimlapi-BvlNH0gr.cjs} +15 -16
- package/dist/src/{aimlapi-DOib86oE.js → aimlapi-CnkC2HqE.js} +16 -18
- package/dist/src/{aimlapi-DTPACCB1.js → aimlapi-DHJU_kcV.js} +15 -4
- package/dist/src/app/assets/index-4LKxG2CG.js +439 -0
- package/dist/src/app/assets/{index-NCn4eVBv.css → index-C3zcsZFQ.css} +1 -1
- package/dist/src/app/assets/vendor-charts-BnDWwBlI.js +36 -0
- package/dist/src/app/index.html +3 -3
- package/dist/src/app/tsconfig.app.tsbuildinfo +1 -1
- package/dist/src/{audio-BnRUGAm_.js → audio-Bkv46et0.js} +6 -5
- package/dist/src/{audio-Cwo68yZS.cjs → audio-CGMyULza.cjs} +6 -7
- package/dist/src/{audio-MSRki4JU.js → audio-ClI_AFre.js} +6 -8
- package/dist/src/{audio-BRYU0BFo.js → audio-Dz3z7s3J.js} +7 -9
- package/dist/src/{base-pGVmXNl4.cjs → base-CGrhspbK.cjs} +36 -38
- package/dist/src/{base-h961VXYk.js → base-CpjcHe4e.js} +11 -13
- package/dist/src/base-DLKtKMFh.js +193 -0
- package/dist/src/{base-XB2tDJrB.js → base-Dy1V8--Z.js} +11 -13
- package/dist/src/blobs-BDbfYdrJ.js +236 -0
- package/dist/src/{blobs-CR5C4Ihh.js → blobs-CBO20krR.js} +9 -12
- package/dist/src/{blobs-BM_e6hCa.js → blobs-CMHN0Qcz.js} +9 -12
- package/dist/src/{blobs-B-KQAFhX.cjs → blobs-D23XLin-.cjs} +34 -37
- package/dist/src/{cache-jsiwsAJv.js → cache-BVeDlD87.js} +132 -117
- package/dist/src/{cache-CIpsoBZR.js → cache-C4Nxf52C.js} +132 -118
- package/dist/src/cache-CeUpFm3M.cjs +5 -0
- package/dist/src/{cache-BTVYfbka.cjs → cache-Dh5WtQps.cjs} +182 -168
- package/dist/src/cache-i1P6crbO.js +756 -0
- package/dist/src/cache-n-RCJ-hL.js +6 -0
- package/dist/src/{chat-BcPjZXIp.js → chat-BiKyneZl.js} +45 -46
- package/dist/src/{chat-D31K7C4u.cjs → chat-C1Qst7jL.cjs} +20 -21
- package/dist/src/{chat-B84t99NW.js → chat-C2jrdPMx.js} +20 -9
- package/dist/src/{chat-BE44YOc6.cjs → chat-CgF-J-Jj.cjs} +65 -66
- package/dist/src/{chat-DwWifjxi.js → chat-CzkrVDfz.js} +20 -22
- package/dist/src/chat-DJIw17u0.js +766 -0
- package/dist/src/{chat-CcUCysjU.js → chat-DqxYYtWA.js} +45 -46
- package/dist/src/{chat-DZM2GUHO.js → chat-qmatte1u.js} +21 -23
- package/dist/src/{chatkit-D67HS_0b.js → chatkit-65VXf5SR.js} +58 -58
- package/dist/src/{chatkit-DAB_qfzI.js → chatkit-Be-Q-a9F.js} +58 -60
- package/dist/src/{chatkit-Biqb_wsD.js → chatkit-BxFvW8KY.js} +58 -60
- package/dist/src/{chatkit-PGG4ZYIn.cjs → chatkit-DKyPi1Gs.cjs} +58 -60
- package/dist/src/chunk-DEq-mXcV.js +15 -0
- package/dist/src/chunk-DRamLcfz.js +16 -0
- package/dist/src/{claude-agent-sdk-SVM6AdBu.js → claude-agent-sdk-Apiy0iaz.js} +31 -31
- package/dist/src/{claude-agent-sdk-C-IOTPfo.js → claude-agent-sdk-D2bJee9S.js} +31 -29
- package/dist/src/{claude-agent-sdk-C9SiaQub.cjs → claude-agent-sdk-D9Z5Pr9X.cjs} +31 -28
- package/dist/src/{claude-agent-sdk-CiluSyW1.js → claude-agent-sdk-DfCoW0E6.js} +33 -20
- package/dist/src/cloud-BBh91EUK.js +4 -0
- package/dist/src/{cloud-CZ-q9Ier.js → cloud-C0dlstV_.js} +7 -9
- package/dist/src/{cloudflare-ai-BahKHyhh.js → cloudflare-ai-8TDxHR0x.js} +16 -18
- package/dist/src/{cloudflare-ai-v_qZD6_q.js → cloudflare-ai-BxAGvfju.js} +17 -19
- package/dist/src/{cloudflare-ai-Dfahv5SY.cjs → cloudflare-ai-CknbZ5LJ.cjs} +16 -17
- package/dist/src/{cloudflare-ai-Dxyt50Nl.js → cloudflare-ai-g7PB6VHR.js} +16 -4
- package/dist/src/{cloudflare-gateway-Bi_FpOFy.js → cloudflare-gateway-B9HWA5wf.js} +23 -23
- package/dist/src/{cloudflare-gateway-BPWoZIzJ.cjs → cloudflare-gateway-BSnDmHYo.cjs} +21 -22
- package/dist/src/{cloudflare-gateway-C0guUNwk.js → cloudflare-gateway-CKDb4dJ8.js} +26 -14
- package/dist/src/{cloudflare-gateway-btS7h1OZ.js → cloudflare-gateway-CP9QEWYS.js} +21 -25
- package/dist/src/{codex-sdk-DSxAnbfT.js → codex-sdk-C6UMlxwV.js} +28 -29
- package/dist/src/{codex-sdk-IYVi9fuM.js → codex-sdk-DUwKWezN.js} +28 -27
- package/dist/src/{codex-sdk-DulY0ZRq.js → codex-sdk-GGAw0qbD.js} +28 -29
- package/dist/src/{codex-sdk-DFKMtAyf.cjs → codex-sdk-fAO0c3yA.cjs} +28 -29
- package/dist/src/{cometapi-DzrR3SR_.js → cometapi-BL9yvj_f.js} +16 -4
- package/dist/src/{cometapi-DIO64tf4.cjs → cometapi-C4xSqeID.cjs} +21 -22
- package/dist/src/{cometapi-C9EEpJzT.js → cometapi-CUQq3H_a.js} +21 -24
- package/dist/src/{cometapi-DkNBMk0G.js → cometapi-DFNiKmSz.js} +17 -19
- package/dist/src/{completion-CG29bfKX.js → completion-5MzrpJxT.js} +11 -13
- package/dist/src/{completion-CCRT4kX1.cjs → completion-CM6oK8PS.cjs} +21 -23
- package/dist/src/{completion-Bgf1VJoq.js → completion-DZ083F31.js} +11 -13
- package/dist/src/completion-qRoZAYRB.js +120 -0
- package/dist/src/{createHash-Dw_iLu31.js → createHash-CTQmL3G2.js} +2 -3
- package/dist/src/{createHash-CYQy4YeL.cjs → createHash-CfZSc0b4.cjs} +13 -14
- package/dist/src/{createHash-CJcfskIZ.js → createHash-Da8fMwqB.js} +2 -3
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/{docker-D-ayp2FW.js → docker-Bb5dcxr8.js} +18 -20
- package/dist/src/{docker-B81N0t4e.js → docker-BvfL2BrW.js} +19 -21
- package/dist/src/{docker-DNcLR4Ig.cjs → docker-DcF2pRrj.cjs} +18 -19
- package/dist/src/{docker-egERKxCF.js → docker-ExVyLp0S.js} +18 -7
- package/dist/src/entrypoint.js +2 -3
- package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
- package/dist/src/{esm-B9dPm_BF.js → esm-C03C-mv3.js} +17 -20
- package/dist/src/{esm-D2pZ87fL.js → esm-CaIwzWR5.js} +18 -21
- package/dist/src/esm-Cd1AjG1D.js +379 -0
- package/dist/src/{esm-Ct-Joyue.cjs → esm-CnNt7sI4.cjs} +47 -49
- package/dist/src/eval-B3r2CVXr.js +15 -0
- package/dist/src/{eval-C-Nr6wX_.js → eval-Dg2nG4v2.js} +47 -54
- package/dist/src/evalResult-5xwYnECe.js +12 -0
- package/dist/src/evalResult-71lY93Kj.cjs +10 -0
- package/dist/src/{evalResult-DXMWJ3sx.js → evalResult-BBRNtX4I.js} +10 -11
- package/dist/src/{evalResult-4BzI2tmj.js → evalResult-BDMqrapS.js} +16 -12
- package/dist/src/evalResult-Dx5P5cIv.js +10 -0
- package/dist/src/{evalResult-CX8wQecI.cjs → evalResult-fuaI8HkH.cjs} +20 -21
- package/dist/src/{evaluator-8aGyV12L.js → evaluator-BhoWwp5b.js} +211 -235
- package/dist/src/evaluator-Jx6bRZV6.js +36 -0
- package/dist/src/{extractor-V5x_m1i0.js → extractor-C0EVHewb.js} +22 -24
- package/dist/src/extractor-D25qpmGX.js +374 -0
- package/dist/src/{extractor-CD5yKL-G.js → extractor-DReVID0K.js} +22 -24
- package/dist/src/{extractor-C031XmTA.cjs → extractor-pYLLi3wS.cjs} +37 -39
- package/dist/src/{fetch-BmbD-v1L.cjs → fetch-BPkYtG8K.cjs} +244 -277
- package/dist/src/fetch-BxNb_Lp3.js +5 -0
- package/dist/src/{fetch-D3OHf-lV.js → fetch-Cwxnd8zz.js} +36 -44
- package/dist/src/{fetch-CXZI9RRr.js → fetch-Dxpd4_sr.js} +23 -35
- package/dist/src/fetch-HaqdX7U1.js +780 -0
- package/dist/src/{fileExtensions-ePDqouxn.js → fileExtensions-DnqA1y9x.js} +2 -2
- package/dist/src/{fileExtensions-BpuMmaFL.js → fileExtensions-Ds-foDzt.js} +2 -2
- package/dist/src/fileExtensions-LcDYkU4v.js +85 -0
- package/dist/src/{fileExtensions-DkJYkWUy.cjs → fileExtensions-bYh77CN8.cjs} +27 -28
- package/dist/src/{formatDuration-CdevI3An.js → formatDuration-DgBVMN65.js} +2 -2
- package/dist/src/{genaiTracer-Ce19n68P.js → genaiTracer-70Z8BIuV.js} +2 -3
- package/dist/src/{genaiTracer-CqNnnXrE.js → genaiTracer-C1rxGO8Q.js} +2 -3
- package/dist/src/genaiTracer-D3fD9dNV.js +256 -0
- package/dist/src/{genaiTracer-Dres3qrN.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
- package/dist/src/{graders--1y2u9HO.js → graders-BTeBGqjJ.js} +349 -397
- package/dist/src/graders-B_pgMLS2.js +34 -0
- package/dist/src/{graders-DTeBrzWp.js → graders-Bj_Odv7c.js} +349 -397
- package/dist/src/graders-DErokPDO.cjs +32 -0
- package/dist/src/graders-DP7KFFo-.js +13466 -0
- package/dist/src/graders-DR_uNe54.js +32 -0
- package/dist/src/{graders-DohM2dir.cjs → graders-DU49_J8Y.cjs} +684 -732
- package/dist/src/graders-w3176Wz-.js +32 -0
- package/dist/src/{image-B0U4Hqll.js → image-B02ogr_b.js} +7 -9
- package/dist/src/{image-DmE-niFE.js → image-B0h9VEMc.js} +6 -5
- package/dist/src/{image-CuKHuccK.cjs → image-BLmROtN3.cjs} +29 -30
- package/dist/src/{image-DNEIf_aI.js → image-Bb4vWQLM.js} +6 -8
- package/dist/src/{image-DpKl2F15.cjs → image-C1madmKh.cjs} +6 -7
- package/dist/src/{image-C3wHC9_h.js → image-CHfWvljl.js} +9 -10
- package/dist/src/{image-O1u4bCFg.js → image-DS-o-0ph.js} +9 -10
- package/dist/src/image-Dpxa1Jt6.js +257 -0
- package/dist/src/index.cjs +615 -695
- package/dist/src/index.d.cts +271 -7
- package/dist/src/index.d.ts +271 -3
- package/dist/src/index.js +580 -664
- package/dist/src/{interactiveCheck-Bxj1Swex.js → interactiveCheck-BgLZUIt3.js} +7 -8
- package/dist/src/{invariant-DT20jrBd.js → invariant-BtWWVVhl.js} +2 -2
- package/dist/src/{invariant-1pAf2CD1.js → invariant-Ddh24eXh.js} +2 -2
- package/dist/src/{invariant-CKcJAQ6M.cjs → invariant-kfQ8Bu82.cjs} +7 -8
- package/dist/src/invariant-vgHWClmd.js +25 -0
- package/dist/src/{knowledgeBase-CEzQobWX.js → knowledgeBase-B3OoKIej.js} +14 -9
- package/dist/src/{knowledgeBase-Be_zyW4L.js → knowledgeBase-CYTLHOt1.js} +16 -16
- package/dist/src/{knowledgeBase-BZ41IFwq.js → knowledgeBase-D33Ty2l6.js} +14 -18
- package/dist/src/{knowledgeBase-D-5BMXlr.cjs → knowledgeBase-DOO_BM9b.cjs} +14 -15
- package/dist/src/{litellm-DnbRJ2if.js → litellm-AaeZcZQF.js} +18 -19
- package/dist/src/{litellm-hUSNM_M2.cjs → litellm-I_hbp_dc.cjs} +17 -17
- package/dist/src/{litellm-CRDqPhNI.js → litellm-NbjknEh6.js} +17 -18
- package/dist/src/{litellm-9vR8zpfU.js → litellm-TrljxD9G.js} +17 -5
- package/dist/src/{logger-CG1uZPbQ.js → logger-CT3IKMKA.js} +10 -29
- package/dist/src/{logger-B7sBeGa0.cjs → logger-Cp1GPUjj.cjs} +152 -180
- package/dist/src/logger-DLcq4dWf.js +713 -0
- package/dist/src/{logger-LSBxlt7a.js → logger-KkObSCzq.js} +13 -31
- package/dist/src/{luma-ray-4blv9iZ2.js → luma-ray-BS2_tY8L.js} +22 -21
- package/dist/src/{luma-ray-drvgdpP9.js → luma-ray-DDsjcgZZ.js} +20 -13
- package/dist/src/{luma-ray-Hm3d6VJE.cjs → luma-ray-Due0n7di.cjs} +20 -21
- package/dist/src/{luma-ray-B2__8lYH.js → luma-ray-f6I2fft-.js} +20 -23
- package/dist/src/main.js +1170 -1321
- package/dist/src/{messages-Uee41Mj5.js → messages-BS17jdMx.js} +22 -24
- package/dist/src/{messages-XhiwCbi4.cjs → messages-Bs1kC7P4.cjs} +32 -34
- package/dist/src/{messages-CGPPidQr.js → messages-D0lx5qK7.js} +22 -24
- package/dist/src/messages-ZJk778GH.js +240 -0
- package/dist/src/{meteor-BYykdXrV.js → meteor-44VjEACX.js} +3 -4
- package/dist/src/{meteor-CsopaHrH.js → meteor-D-SotUw9.js} +3 -4
- package/dist/src/{meteor-e-E-2vVl.cjs → meteor-DLZZ3osF.cjs} +3 -4
- package/dist/src/{meteor-C8lGP6P4.js → meteor-DUiCJRC-.js} +3 -4
- package/dist/src/{modelslab-yKz-ZNB4.js → modelslab-Bmni6skY.js} +17 -10
- package/dist/src/{modelslab-E9gO-bYd.js → modelslab-Bx9IrZfS.js} +18 -20
- package/dist/src/{modelslab-lUVW0cmB.cjs → modelslab-CoUX6Jc_.cjs} +17 -18
- package/dist/src/{modelslab-ClBkr8_9.js → modelslab-DRb74SP4.js} +17 -19
- package/dist/src/{nova-reel-Dk8jNpId.js → nova-reel-BfPq-0Yk.js} +20 -13
- package/dist/src/{nova-reel-D8CuO6QH.cjs → nova-reel-C_QM18Xn.cjs} +20 -21
- package/dist/src/{nova-reel-u2eF2Cxm.js → nova-reel-D_W1tjMH.js} +22 -21
- package/dist/src/{nova-reel-P9bwvtYX.js → nova-reel-bgjxilYW.js} +20 -23
- package/dist/src/{nova-sonic-CK2rAiKi.js → nova-sonic-CFb5GYhg.js} +30 -26
- package/dist/src/{nova-sonic-BaqWlkds.js → nova-sonic-DIGQNR07.js} +30 -31
- package/dist/src/{nova-sonic-yZapPLv7.js → nova-sonic-De1HW5fD.js} +31 -32
- package/dist/src/{nova-sonic-Ds1C-dpm.cjs → nova-sonic-zfcljeRp.cjs} +30 -31
- package/dist/src/{openai-DUFopMrH.cjs → openai-Cuif0GEt.cjs} +8 -9
- package/dist/src/{openai-PblZ3jUE.js → openai-DElQ-fPX.js} +3 -4
- package/dist/src/{openai-CcN1B8Sb.js → openai-DhbB7eWK.js} +3 -4
- package/dist/src/openai-j-sE2O7r.js +44 -0
- package/dist/src/{openclaw-B6qqDr_u.cjs → openclaw-CSugPYAr.cjs} +188 -130
- package/dist/src/{openclaw-A-3_loM7.js → openclaw-DiSz3I5L.js} +180 -109
- package/dist/src/{openclaw-a3lylB-V.js → openclaw-DuvJKEW5.js} +178 -124
- package/dist/src/{openclaw-COn6QzDi.js → openclaw-tiVYRtr-.js} +178 -122
- package/dist/src/opencode-sdk-0j6rTWNb.js +562 -0
- package/dist/src/opencode-sdk-B3CWY9h_.js +560 -0
- package/dist/src/opencode-sdk-BL764Jdi.cjs +564 -0
- package/dist/src/opencode-sdk-C2y6UkP2.js +560 -0
- package/dist/src/{otlpReceiver-oyf5wLGC.js → otlpReceiver-C99PPb48.js} +53 -51
- package/dist/src/{otlpReceiver-lXsYVbpj.cjs → otlpReceiver-CGq6LspY.cjs} +53 -55
- package/dist/src/{otlpReceiver-94URx7UW.js → otlpReceiver-CdNBdbsk.js} +53 -55
- package/dist/src/{otlpReceiver-BmmTiMjA.js → otlpReceiver-D89fR-rC.js} +53 -55
- package/dist/src/{providerRegistry-Cq_JK_CJ.js → providerRegistry-B0RUOLI_.js} +7 -8
- package/dist/src/{providerRegistry-DSSHjMKf.js → providerRegistry-CD8MEar9.js} +7 -8
- package/dist/src/{providerRegistry-CvHEVJad.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
- package/dist/src/providerRegistry-DM8rZYol.js +45 -0
- package/dist/src/providers-B7V0njNs.js +32 -0
- package/dist/src/providers-BEwbhv0X.js +30 -0
- package/dist/src/{providers-Iil64vk9.js → providers-BlqUifFg.js} +1543 -1676
- package/dist/src/providers-CH3C7zf7.js +30 -0
- package/dist/src/{providers-DHbjzW2e.cjs → providers-CgKOSgTR.cjs} +1896 -2029
- package/dist/src/providers-D8lF1sqW.js +33246 -0
- package/dist/src/{providers-BnFpbY_s.js → providers-Dk_6ocUX.js} +1536 -1669
- package/dist/src/providers-zyB6k_38.cjs +31 -0
- package/dist/src/{pythonUtils-CcT5LH1M.js → pythonUtils-C3py6GC1.js} +18 -19
- package/dist/src/{pythonUtils-DBbuI3QJ.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
- package/dist/src/{pythonUtils-hZ8LeQLv.js → pythonUtils-D5nxkQ0P.js} +18 -19
- package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
- package/dist/src/{quiverai-BuI0tE39.js → quiverai-BbOUOn2L.js} +8 -7
- package/dist/src/{quiverai-DCGSZt4U.js → quiverai-CIaELU_m.js} +8 -10
- package/dist/src/{quiverai-DiMVJQDz.cjs → quiverai-PdShCPox.cjs} +8 -9
- package/dist/src/{quiverai-fQNkExW4.js → quiverai-uH-dcTIr.js} +9 -11
- package/dist/src/{render-Dj1smHEb.js → render-Drod8m7K.js} +4 -5
- package/dist/src/responses-CB2jwoAr.js +660 -0
- package/dist/src/{responses-ghR3IOfy.cjs → responses-D8SBTL64.cjs} +39 -42
- package/dist/src/{responses-DOAFFENS.js → responses-DIR9Ud3j.js} +24 -27
- package/dist/src/{responses-CxzoQoBe.js → responses-WNGNYe3K.js} +24 -27
- package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
- package/dist/src/{rubyUtils-CwbGmgYN.js → rubyUtils-BUVePouc.js} +27 -20
- package/dist/src/rubyUtils-BcuGX77l.js +222 -0
- package/dist/src/{rubyUtils-DudlFZed.js → rubyUtils-Boc4HZzX.js} +18 -19
- package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
- package/dist/src/{rubyUtils-C8MhKGHb.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
- package/dist/src/{sagemaker-gmskuyre.js → sagemaker-CNBxx5CJ.js} +75 -70
- package/dist/src/{sagemaker-CcxhlOAR.js → sagemaker-CemTFp2h.js} +75 -79
- package/dist/src/{sagemaker-77zbJ2Q2.cjs → sagemaker-Cl28mZU2.cjs} +75 -76
- package/dist/src/{sagemaker-DuM71dVU.js → sagemaker-YSyBXQQh.js} +77 -77
- package/dist/src/{scanner-DJYiSXQj.js → scanner-BsBlNXNn.js} +100 -121
- package/dist/src/server/index.js +5520 -67427
- package/dist/src/{server-B5v33lvE.cjs → server-C_7Ax-hA.cjs} +57 -67
- package/dist/src/{server-BJ4m4f1D.js → server-CqzrVGpF.js} +26 -29
- package/dist/src/server-CuxBbeSY.js +229 -0
- package/dist/src/server-DA4Cyrrq.js +7 -0
- package/dist/src/server-Dulb-4-K.cjs +5 -0
- package/dist/src/{server-RV_i_YX5.js → server-VWgWb00X.js} +19 -24
- package/dist/src/{signal-BW33JuId.js → signal-4U3mfRvL.js} +9 -11
- package/dist/src/{slack-DEURelTy.cjs → slack-BmVAVGaK.cjs} +7 -8
- package/dist/src/{slack-BQYeW9L3.js → slack-DCUPTzS2.js} +8 -8
- package/dist/src/{slack-BB6yuZzp.js → slack-DOdy_kyv.js} +7 -8
- package/dist/src/{slack-2pRrhhgJ.js → slack-DXMKtA-f.js} +7 -9
- package/dist/src/store-CXGFv4aR.js +228 -0
- package/dist/src/store-CXS-Q_91.js +6 -0
- package/dist/src/{store-D7CgQzAR.cjs → store-DLlFCC4h.cjs} +44 -45
- package/dist/src/{store-DJNsD1iC.js → store-DXilxTl-.js} +40 -36
- package/dist/src/{store-s3SftUwF.js → store-Dim__MDd.js} +34 -35
- package/dist/src/store-eYkaKMwq.cjs +5 -0
- package/dist/src/{tables-DfTsNN7X.js → tables-6YKwjN9-.js} +19 -21
- package/dist/src/tables-DLJPUdUE.js +288 -0
- package/dist/src/{tables-BKTmd6u7.cjs → tables-DPi7wKeM.cjs} +89 -91
- package/dist/src/{tables-DMegD0Xf.js → tables-gftXzE9I.js} +21 -23
- package/dist/src/telemetry-BpMfhthR.cjs +5 -0
- package/dist/src/{telemetry--WAdAfVi.js → telemetry-CMrFgtPB.js} +11 -13
- package/dist/src/telemetry-Cps3mIU-.js +171 -0
- package/dist/src/{telemetry-DQgVBCAb.cjs → telemetry-DaX14Chu.cjs} +21 -24
- package/dist/src/{telemetry-BedSm-bZ.js → telemetry-Dthj_BbD.js} +17 -14
- package/dist/src/telemetry-Dw38hanS.js +7 -0
- package/dist/src/{text-oiSbwSOI.js → text-B_UCRPp2.js} +2 -2
- package/dist/src/{text-oKzCBnK6.cjs → text-CW1cyrwj.cjs} +12 -13
- package/dist/src/{text-B_IrO4GZ.js → text-Db-Wt2u2.js} +2 -2
- package/dist/src/text-TIv0QYnd.js +22 -0
- package/dist/src/{tokenUsageUtils-FZd5O_4A.js → tokenUsageUtils-BDGe-iyI.js} +2 -2
- package/dist/src/{tokenUsageUtils-DmZSD2eU.js → tokenUsageUtils-DflFMjS0.js} +2 -2
- package/dist/src/tokenUsageUtils-NYT-WKS6.js +138 -0
- package/dist/src/{tokenUsageUtils-CXhxVj72.cjs → tokenUsageUtils-bVa1ga6f.cjs} +32 -33
- package/dist/src/{transcription-mYS9vd5v.js → transcription-BNYURcXg.js} +14 -7
- package/dist/src/{transcription-X2-B4vkX.js → transcription-B_OdaHp7.js} +14 -16
- package/dist/src/{transcription-BO1AHegO.cjs → transcription-NLVG9MT1.cjs} +14 -15
- package/dist/src/{transcription-lzBLiTFJ.js → transcription-s6A-bNrZ.js} +15 -17
- package/dist/src/{transform-B1Hi5lWS.cjs → transform-CzK1Q0zl.cjs} +24 -26
- package/dist/src/{transform-DeGlxb0D.js → transform-D5HsjduX.js} +39 -47
- package/dist/src/{transform-CYDILYDe.js → transform-DECvGmzp.js} +15 -13
- package/dist/src/transform-DTGDnAzW.js +6 -0
- package/dist/src/{transform-BEgStbHK.js → transform-DilY9wbS.js} +10 -12
- package/dist/src/{transform-D5PjiWiZ.cjs → transform-DuHvhZpj.cjs} +179 -187
- package/dist/src/transform-aa6tmVpZ.js +216 -0
- package/dist/src/transform-m3qNw4KP.cjs +5 -0
- package/dist/src/transform-uAytVuyX.js +1506 -0
- package/dist/src/{transform-Dfl89yi4.js → transform-vNucnNr0.js} +39 -47
- package/dist/src/{transformersAvailability-SZnTS3pJ.js → transformersAvailability-CEVM2GNQ.js} +2 -2
- package/dist/src/{transformersAvailability-D-glmEy7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
- package/dist/src/{transformersAvailability-CjeFXhuJ.js → transformersAvailability-D6c6ROpT.js} +2 -2
- package/dist/src/{types-DWNf48sT.cjs → types-C_7nyzr1.cjs} +538 -574
- package/dist/src/{types-CXQduE9o.js → types-Cbd8uOMq.js} +68 -100
- package/dist/src/types-CzW2QFyi.js +3288 -0
- package/dist/src/{types-C5hEkb-x.js → types-DmyIJ-sR.js} +63 -99
- package/dist/src/{util-CoQjmE3u.js → util-B3xGByQh.js} +4 -5
- package/dist/src/{util-aLhtl3fe.cjs → util-B9vlHIIh.cjs} +208 -223
- package/dist/src/{util-Du96oyYS.js → util-BHGHw5G1.js} +4 -5
- package/dist/src/{util-DQ984syk.js → util-BRYkYPTd.js} +36 -51
- package/dist/src/{util-D9eLdGfa.js → util-BV4XUC0n.js} +5 -6
- package/dist/src/util-Bv6uGDfH.js +293 -0
- package/dist/src/{util-1wWM599Z.cjs → util-BzMcevZc.cjs} +50 -51
- package/dist/src/{util-_h4pVqrz.js → util-C1CeHl-P.js} +36 -51
- package/dist/src/{util-Bm_-UMD_.js → util-CMy69ZgQ.js} +5 -6
- package/dist/src/{util-CyUdMzV0.cjs → util-DGNOS1db.cjs} +34 -35
- package/dist/src/util-Dnmk2mBQ.js +599 -0
- package/dist/src/util-ZzmqNPlg.js +1426 -0
- package/dist/src/{utils-BjLy-Q72.cjs → utils-Cz9qXqII.cjs} +29 -32
- package/dist/src/{utils-CFMn2yHW.js → utils-XiOAgly5.js} +4 -7
- package/dist/src/utils-dLokC-eR.js +94 -0
- package/dist/src/{utils-DvWMzuMx.js → utils-f2-Moju7.js} +4 -7
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +38 -38
- package/dist/src/app/assets/index-B2D0bCSI.js +0 -439
- package/dist/src/app/assets/vendor-charts-CCl15Imd.js +0 -36
- package/dist/src/cache-ChPcurj7.js +0 -6
- package/dist/src/cache-VVu_W-yg.js +0 -8
- package/dist/src/cache-YLNCFEM2.cjs +0 -6
- package/dist/src/chunk-DHDDz29n.js +0 -22
- package/dist/src/chunk-FhC4c-0y.js +0 -21
- package/dist/src/cloud-BndfXy4H.js +0 -5
- package/dist/src/eval-BhHvMY82.js +0 -17
- package/dist/src/evalResult-Dq2gFNQY.js +0 -12
- package/dist/src/evalResult-nmcP5VKH.cjs +0 -12
- package/dist/src/evalResult-trqZjVYh.js +0 -14
- package/dist/src/evaluator-CnfPstzT.js +0 -39
- package/dist/src/fetch-IDPDue6F.cjs +0 -4
- package/dist/src/fetch-hKJ-It8q.js +0 -6
- package/dist/src/fetch-ouKnrWK-.js +0 -4
- package/dist/src/graders-CQn7WUsd.cjs +0 -34
- package/dist/src/graders-DC6QAbpW.js +0 -35
- package/dist/src/graders-DUWz3Y7j.js +0 -37
- package/dist/src/opencode-sdk-4bL9n-Gk.js +0 -382
- package/dist/src/opencode-sdk-BfC2zWcR.js +0 -376
- package/dist/src/opencode-sdk-DMJyuwMg.js +0 -380
- package/dist/src/opencode-sdk-Da-9adza.cjs +0 -383
- package/dist/src/providers-CsXB2Ix-.js +0 -35
- package/dist/src/providers-DO8ltjLC.js +0 -33
- package/dist/src/providers-Dtq-xnXd.cjs +0 -33
- package/dist/src/rubyUtils-BUbcND2f.js +0 -6
- package/dist/src/rubyUtils-Cr55X_KE.js +0 -5
- package/dist/src/rubyUtils-DlIiqoYo.cjs +0 -5
- package/dist/src/server-C2eQH4Gu.js +0 -6
- package/dist/src/server-CXWycu7H.cjs +0 -6
- package/dist/src/server-Q6OGlxxT.js +0 -8
- package/dist/src/store-B3EDO9Q3.js +0 -7
- package/dist/src/store-Dl9F8aw5.js +0 -6
- package/dist/src/store-SnrGrlt9.cjs +0 -6
- package/dist/src/telemetry-BGhiPZtl.js +0 -8
- package/dist/src/telemetry-CFfiYan6.cjs +0 -6
- package/dist/src/telemetry-DHzEduxX.js +0 -6
- package/dist/src/transform-C1x1ZlMQ.cjs +0 -6
- package/dist/src/transform-DYHjFmQu.js +0 -8
- package/dist/src/transform-rmwJT5JQ.js +0 -7
- package/dist/src/transformersAvailability-eJooj0gX.js +0 -35
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { O as
|
|
3
|
-
import {
|
|
4
|
-
import "./cloud-
|
|
5
|
-
import "./types-
|
|
6
|
-
import { t as printBorder } from "./util-
|
|
7
|
-
import "./esm-
|
|
8
|
-
import "./pythonUtils-
|
|
9
|
-
import { t as formatDuration } from "./formatDuration-
|
|
2
|
+
import { O as state, n as getLogLevel, o as logger } from "./logger-KkObSCzq.js";
|
|
3
|
+
import { D as TERMINAL_MAX_WIDTH, u as sleepWithAbort } from "./fetch-Dxpd4_sr.js";
|
|
4
|
+
import "./cloud-C0dlstV_.js";
|
|
5
|
+
import "./types-Cbd8uOMq.js";
|
|
6
|
+
import { t as printBorder } from "./util-C1CeHl-P.js";
|
|
7
|
+
import "./esm-C03C-mv3.js";
|
|
8
|
+
import "./pythonUtils-C3py6GC1.js";
|
|
9
|
+
import { t as formatDuration } from "./formatDuration-DgBVMN65.js";
|
|
10
10
|
import { z } from "zod";
|
|
11
11
|
import chalk from "chalk";
|
|
12
12
|
import fs from "fs";
|
|
13
|
-
import path, { isAbsolute, resolve
|
|
13
|
+
import path, { isAbsolute, resolve } from "path";
|
|
14
14
|
import yaml from "js-yaml";
|
|
15
15
|
import crypto from "crypto";
|
|
16
16
|
import { spawn } from "child_process";
|
|
17
17
|
import async from "async";
|
|
18
18
|
import ora from "ora";
|
|
19
19
|
import { io } from "socket.io-client";
|
|
20
|
-
import simpleGit
|
|
20
|
+
import simpleGit from "simple-git";
|
|
21
21
|
import binaryExtensions from "binary-extensions";
|
|
22
22
|
import { execa } from "execa";
|
|
23
23
|
import { isText } from "istextorbinary";
|
|
24
24
|
import textExtensions from "text-extensions";
|
|
25
25
|
import { minimatch } from "minimatch";
|
|
26
|
-
|
|
27
26
|
//#region src/util/agent/agentAuth.ts
|
|
28
27
|
/**
|
|
29
28
|
* Shared auth credential resolution for agent clients.
|
|
@@ -33,9 +32,9 @@ import { minimatch } from "minimatch";
|
|
|
33
32
|
*/
|
|
34
33
|
let cloudConfig$1;
|
|
35
34
|
try {
|
|
36
|
-
cloudConfig$1 = (await import("./cloud-
|
|
35
|
+
cloudConfig$1 = (await import("./cloud-BBh91EUK.js")).cloudConfig;
|
|
37
36
|
} catch (error) {
|
|
38
|
-
if (error instanceof Error && "code" in error && error.code === "MODULE_NOT_FOUND") {} else
|
|
37
|
+
if (error instanceof Error && "code" in error && error.code === "MODULE_NOT_FOUND") {} else logger.debug(`Unexpected error loading cloud config: ${error}`);
|
|
39
38
|
}
|
|
40
39
|
/**
|
|
41
40
|
* Resolve base authentication credentials using waterfall approach:
|
|
@@ -48,24 +47,23 @@ try {
|
|
|
48
47
|
*/
|
|
49
48
|
function resolveBaseAuthCredentials(opts) {
|
|
50
49
|
if (opts?.apiKey) {
|
|
51
|
-
|
|
50
|
+
logger.debug("Using API key from CLI/config");
|
|
52
51
|
return { apiKey: opts.apiKey };
|
|
53
52
|
}
|
|
54
53
|
const envApiKey = process.env.PROMPTFOO_API_KEY;
|
|
55
54
|
if (envApiKey) {
|
|
56
|
-
|
|
55
|
+
logger.debug("Using API key from PROMPTFOO_API_KEY env var");
|
|
57
56
|
return { apiKey: envApiKey };
|
|
58
57
|
}
|
|
59
58
|
if (cloudConfig$1) {
|
|
60
59
|
const storedApiKey = cloudConfig$1.getApiKey();
|
|
61
60
|
if (storedApiKey) {
|
|
62
|
-
|
|
61
|
+
logger.debug("Using API key from promptfoo auth");
|
|
63
62
|
return { apiKey: storedApiKey };
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
return {};
|
|
67
66
|
}
|
|
68
|
-
|
|
69
67
|
//#endregion
|
|
70
68
|
//#region src/util/agent/agentClient.ts
|
|
71
69
|
/**
|
|
@@ -79,9 +77,9 @@ function resolveBaseAuthCredentials(opts) {
|
|
|
79
77
|
*/
|
|
80
78
|
let cloudConfig;
|
|
81
79
|
try {
|
|
82
|
-
cloudConfig = (await import("./cloud-
|
|
80
|
+
cloudConfig = (await import("./cloud-BBh91EUK.js")).cloudConfig;
|
|
83
81
|
} catch (error) {
|
|
84
|
-
if (error instanceof Error && "code" in error && error.code === "MODULE_NOT_FOUND") {} else
|
|
82
|
+
if (error instanceof Error && "code" in error && error.code === "MODULE_NOT_FOUND") {} else logger.debug(`Unexpected error loading cloud config: ${error}`);
|
|
85
83
|
}
|
|
86
84
|
/**
|
|
87
85
|
* Create an agent client that connects to the shared Socket.IO server.
|
|
@@ -118,7 +116,7 @@ async function createAgentClient(opts) {
|
|
|
118
116
|
}
|
|
119
117
|
});
|
|
120
118
|
socket.on("connect", () => {
|
|
121
|
-
|
|
119
|
+
logger.debug(`Agent client connected (agent: ${agent}, id: ${socket.id})`);
|
|
122
120
|
socket.emit("agent:join", { sessionId });
|
|
123
121
|
if (settled) return;
|
|
124
122
|
settled = true;
|
|
@@ -155,18 +153,18 @@ async function createAgentClient(opts) {
|
|
|
155
153
|
socket.on("connect_error", (error) => {
|
|
156
154
|
if (settled) return;
|
|
157
155
|
settled = true;
|
|
158
|
-
|
|
156
|
+
logger.debug(`Agent client connection error: ${error.message}`);
|
|
159
157
|
cleanup();
|
|
160
158
|
reject(/* @__PURE__ */ new Error(`Failed to connect to server: ${error.message}`));
|
|
161
159
|
});
|
|
162
160
|
socket.on("disconnect", (reason) => {
|
|
163
|
-
|
|
161
|
+
logger.debug(`Agent client disconnected: ${reason}`);
|
|
164
162
|
});
|
|
165
163
|
socket.on("error", (error) => {
|
|
166
|
-
|
|
164
|
+
logger.debug(`Agent client error: ${String(error)}`);
|
|
167
165
|
});
|
|
168
166
|
socket.io.on("reconnect_failed", () => {
|
|
169
|
-
|
|
167
|
+
logger.error(`Agent client reconnection failed after all attempts (agent: ${agent})`);
|
|
170
168
|
});
|
|
171
169
|
const timeoutId = setTimeout(() => {
|
|
172
170
|
if (!socket.connected && !settled) {
|
|
@@ -177,7 +175,6 @@ async function createAgentClient(opts) {
|
|
|
177
175
|
}, timeoutMs);
|
|
178
176
|
});
|
|
179
177
|
}
|
|
180
|
-
|
|
181
178
|
//#endregion
|
|
182
179
|
//#region src/types/codeScan.ts
|
|
183
180
|
const CodeScanSeverity = {
|
|
@@ -321,7 +318,7 @@ const PullRequestContextSchema = z.object({
|
|
|
321
318
|
number: z.number(),
|
|
322
319
|
sha: z.string()
|
|
323
320
|
});
|
|
324
|
-
|
|
321
|
+
z.object({
|
|
325
322
|
files: z.array(FileRecordSchema).min(1, "Files array cannot be empty"),
|
|
326
323
|
metadata: GitMetadataSchema,
|
|
327
324
|
config: ScanConfigSchema,
|
|
@@ -337,7 +334,7 @@ const CommentSchema = z.object({
|
|
|
337
334
|
severity: CodeScanSeveritySchema.optional(),
|
|
338
335
|
aiAgentPrompt: z.string().nullable().optional()
|
|
339
336
|
});
|
|
340
|
-
|
|
337
|
+
z.object({
|
|
341
338
|
inventory: z.string(),
|
|
342
339
|
tracing: z.string(),
|
|
343
340
|
analysis: z.string(),
|
|
@@ -345,7 +342,7 @@ const PhaseResultsSchema = z.object({
|
|
|
345
342
|
fixes: z.string(),
|
|
346
343
|
comments: z.string()
|
|
347
344
|
});
|
|
348
|
-
|
|
345
|
+
z.object({
|
|
349
346
|
success: z.boolean(),
|
|
350
347
|
review: z.string().optional(),
|
|
351
348
|
comments: z.array(CommentSchema),
|
|
@@ -407,7 +404,6 @@ var ConfigLoadError = class extends Error {
|
|
|
407
404
|
this.name = "ConfigLoadError";
|
|
408
405
|
}
|
|
409
406
|
};
|
|
410
|
-
|
|
411
407
|
//#endregion
|
|
412
408
|
//#region src/codeScan/config/schema.ts
|
|
413
409
|
/**
|
|
@@ -434,7 +430,6 @@ const DEFAULT_CONFIG = {
|
|
|
434
430
|
minimumSeverity: CodeScanSeverity.MEDIUM,
|
|
435
431
|
diffsOnly: false
|
|
436
432
|
};
|
|
437
|
-
|
|
438
433
|
//#endregion
|
|
439
434
|
//#region src/codeScan/config/loader.ts
|
|
440
435
|
/**
|
|
@@ -533,7 +528,6 @@ function resolveGuidance(options, config) {
|
|
|
533
528
|
function resolveApiHost(options, config) {
|
|
534
529
|
return options.apiHost || config.apiHost || "https://api.promptfoo.app";
|
|
535
530
|
}
|
|
536
|
-
|
|
537
531
|
//#endregion
|
|
538
532
|
//#region src/codeScan/git/diff.ts
|
|
539
533
|
/**
|
|
@@ -552,7 +546,6 @@ async function validateOnBranch(git) {
|
|
|
552
546
|
throw new GitError(`Failed to validate branch: ${error instanceof Error ? error.message : String(error)}`);
|
|
553
547
|
}
|
|
554
548
|
}
|
|
555
|
-
|
|
556
549
|
//#endregion
|
|
557
550
|
//#region src/codeScan/constants/filtering.ts
|
|
558
551
|
/**
|
|
@@ -594,12 +587,10 @@ const DENYLIST_PATTERNS = [
|
|
|
594
587
|
"**/*.mp4",
|
|
595
588
|
"**/*.mov"
|
|
596
589
|
];
|
|
597
|
-
const MAX_BLOB_SIZE_BYTES = 500 * 1024;
|
|
598
590
|
const MAX_PATCH_SIZE_BYTES = 200 * 1024;
|
|
599
591
|
function isInDenylist(filePath) {
|
|
600
592
|
return DENYLIST_PATTERNS.some((pattern) => minimatch(filePath, pattern));
|
|
601
593
|
}
|
|
602
|
-
|
|
603
594
|
//#endregion
|
|
604
595
|
//#region src/codeScan/util/diffHunkParser.ts
|
|
605
596
|
/**
|
|
@@ -639,7 +630,6 @@ function parseHunkHeader(line) {
|
|
|
639
630
|
newCount: match[4] ? parseInt(match[4], 10) : 1
|
|
640
631
|
};
|
|
641
632
|
}
|
|
642
|
-
|
|
643
633
|
//#endregion
|
|
644
634
|
//#region src/codeScan/git/diffAnnotator.ts
|
|
645
635
|
/**
|
|
@@ -707,7 +697,6 @@ function annotateDiffWithLineRanges(patch) {
|
|
|
707
697
|
lineRanges
|
|
708
698
|
};
|
|
709
699
|
}
|
|
710
|
-
|
|
711
700
|
//#endregion
|
|
712
701
|
//#region src/codeScan/git/diffProcessor.ts
|
|
713
702
|
/**
|
|
@@ -858,7 +847,7 @@ function attachBlobSizesAndFilter(files, sizeMap) {
|
|
|
858
847
|
if (file.skipReason) return file;
|
|
859
848
|
const beforeSize = file.shaA ? sizeMap.get(file.shaA) : void 0;
|
|
860
849
|
const afterSize = file.shaB ? sizeMap.get(file.shaB) : void 0;
|
|
861
|
-
if (beforeSize !== void 0 && beforeSize >
|
|
850
|
+
if (beforeSize !== void 0 && beforeSize > 512e3 || afterSize !== void 0 && afterSize > 512e3) return {
|
|
862
851
|
...file,
|
|
863
852
|
beforeSizeBytes: beforeSize,
|
|
864
853
|
afterSizeBytes: afterSize,
|
|
@@ -947,7 +936,7 @@ async function generatePatchForFile(repoPath, base, compare, filePath) {
|
|
|
947
936
|
cwd: repoPath,
|
|
948
937
|
maxBuffer: MAX_PATCH_SIZE_BYTES
|
|
949
938
|
})).stdout;
|
|
950
|
-
if (Buffer.byteLength(patch, "utf8") >
|
|
939
|
+
if (Buffer.byteLength(patch, "utf8") > 204800) return {
|
|
951
940
|
success: false,
|
|
952
941
|
skipReason: "patch too large"
|
|
953
942
|
};
|
|
@@ -960,13 +949,13 @@ async function generatePatchForFile(repoPath, base, compare, filePath) {
|
|
|
960
949
|
} catch (err) {
|
|
961
950
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
962
951
|
if (errorMessage.includes("maxBuffer") || errorMessage.includes("stdout maxBuffer")) {
|
|
963
|
-
|
|
952
|
+
logger.debug(`git diff --patch ${filePath} exceeded maxBuffer (${MAX_PATCH_SIZE_BYTES} bytes) - patch too large`);
|
|
964
953
|
return {
|
|
965
954
|
success: false,
|
|
966
955
|
skipReason: "patch too large"
|
|
967
956
|
};
|
|
968
957
|
}
|
|
969
|
-
|
|
958
|
+
logger.debug(`git diff --patch ${filePath} failed: ${errorMessage} - skipping file`);
|
|
970
959
|
return {
|
|
971
960
|
success: false,
|
|
972
961
|
skipReason: "diff error"
|
|
@@ -1007,7 +996,6 @@ async function processDiff(repoPath, base, compare = "HEAD") {
|
|
|
1007
996
|
throw new DiffProcessorError(`Failed to process diff: ${error instanceof Error ? error.message : String(error)}`);
|
|
1008
997
|
}
|
|
1009
998
|
}
|
|
1010
|
-
|
|
1011
999
|
//#endregion
|
|
1012
1000
|
//#region src/codeScan/git/metadata.ts
|
|
1013
1001
|
/**
|
|
@@ -1023,7 +1011,7 @@ async function processDiff(repoPath, base, compare = "HEAD") {
|
|
|
1023
1011
|
* @returns Git metadata object
|
|
1024
1012
|
*/
|
|
1025
1013
|
async function extractMetadata(repoPath, baseBranch, compareRef) {
|
|
1026
|
-
const git = simpleGit
|
|
1014
|
+
const git = simpleGit(repoPath);
|
|
1027
1015
|
try {
|
|
1028
1016
|
const baseRef = baseBranch;
|
|
1029
1017
|
const compareRefValue = compareRef;
|
|
@@ -1050,7 +1038,6 @@ async function extractMetadata(repoPath, baseBranch, compareRef) {
|
|
|
1050
1038
|
throw new GitMetadataError(`Failed to extract git metadata: ${error instanceof Error ? error.message : String(error)}`);
|
|
1051
1039
|
}
|
|
1052
1040
|
}
|
|
1053
|
-
|
|
1054
1041
|
//#endregion
|
|
1055
1042
|
//#region src/codeScan/mcp/filesystem.ts
|
|
1056
1043
|
/**
|
|
@@ -1065,9 +1052,9 @@ async function extractMetadata(repoPath, baseBranch, compareRef) {
|
|
|
1065
1052
|
*/
|
|
1066
1053
|
function startFilesystemMcpServer(rootDir) {
|
|
1067
1054
|
if (!isAbsolute(rootDir)) throw new FilesystemMcpError(`Root directory must be an absolute path, got: ${rootDir}`);
|
|
1068
|
-
const absoluteRootDir = resolve
|
|
1069
|
-
|
|
1070
|
-
|
|
1055
|
+
const absoluteRootDir = resolve(rootDir);
|
|
1056
|
+
logger.debug("Starting filesystem MCP server...");
|
|
1057
|
+
logger.debug(`Root directory: ${absoluteRootDir}`);
|
|
1071
1058
|
try {
|
|
1072
1059
|
const mcpProcess = spawn("npx", [
|
|
1073
1060
|
"-y",
|
|
@@ -1084,16 +1071,16 @@ function startFilesystemMcpServer(rootDir) {
|
|
|
1084
1071
|
mcpProcess.stderr?.on("data", (chunk) => {
|
|
1085
1072
|
const message = chunk.toString("utf8");
|
|
1086
1073
|
if (message.includes("Failed to request initial roots from client")) return;
|
|
1087
|
-
|
|
1074
|
+
logger.debug(`MCP server stderr: ${message.trim()}`);
|
|
1088
1075
|
});
|
|
1089
1076
|
mcpProcess.on("error", (error) => {
|
|
1090
|
-
|
|
1077
|
+
logger.error(`MCP server process error: ${error.message}`);
|
|
1091
1078
|
});
|
|
1092
1079
|
mcpProcess.on("exit", (code, signal) => {
|
|
1093
|
-
if (code !== null && code !== 0)
|
|
1094
|
-
else if (signal)
|
|
1080
|
+
if (code !== null && code !== 0) logger.debug(`MCP server exited with code ${code}`);
|
|
1081
|
+
else if (signal) logger.debug(`MCP server terminated by signal ${signal}`);
|
|
1095
1082
|
});
|
|
1096
|
-
|
|
1083
|
+
logger.debug(`MCP server started (pid: ${mcpProcess.pid})`);
|
|
1097
1084
|
return mcpProcess;
|
|
1098
1085
|
} catch (error) {
|
|
1099
1086
|
throw new FilesystemMcpError(`Failed to start filesystem MCP server: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -1105,25 +1092,24 @@ function startFilesystemMcpServer(rootDir) {
|
|
|
1105
1092
|
*/
|
|
1106
1093
|
async function stopFilesystemMcpServer(process) {
|
|
1107
1094
|
if (!process.pid) {
|
|
1108
|
-
|
|
1095
|
+
logger.debug("MCP server already stopped");
|
|
1109
1096
|
return;
|
|
1110
1097
|
}
|
|
1111
|
-
|
|
1098
|
+
logger.debug(`Stopping MCP server (pid: ${process.pid})...`);
|
|
1112
1099
|
return new Promise((resolve) => {
|
|
1113
1100
|
const timeout = setTimeout(() => {
|
|
1114
|
-
|
|
1101
|
+
logger.debug("MCP server did not exit gracefully, force killing...");
|
|
1115
1102
|
process.kill("SIGKILL");
|
|
1116
1103
|
resolve();
|
|
1117
1104
|
}, 5e3);
|
|
1118
1105
|
process.on("exit", () => {
|
|
1119
1106
|
clearTimeout(timeout);
|
|
1120
|
-
|
|
1107
|
+
logger.debug("MCP server stopped");
|
|
1121
1108
|
resolve();
|
|
1122
1109
|
});
|
|
1123
1110
|
process.kill("SIGTERM");
|
|
1124
1111
|
});
|
|
1125
1112
|
}
|
|
1126
|
-
|
|
1127
1113
|
//#endregion
|
|
1128
1114
|
//#region src/codeScan/mcp/transport.ts
|
|
1129
1115
|
/**
|
|
@@ -1143,7 +1129,7 @@ var SocketIoMcpBridge = class {
|
|
|
1143
1129
|
*/
|
|
1144
1130
|
async connect() {
|
|
1145
1131
|
if (!this.socket.connected) throw new SocketIoMcpBridgeError("Socket must be connected before starting bridge");
|
|
1146
|
-
|
|
1132
|
+
logger.debug(`Using existing socket connection (id: ${this.socket.id})`);
|
|
1147
1133
|
this.startBridging();
|
|
1148
1134
|
}
|
|
1149
1135
|
/**
|
|
@@ -1193,7 +1179,7 @@ var SocketIoMcpBridge = class {
|
|
|
1193
1179
|
message
|
|
1194
1180
|
});
|
|
1195
1181
|
} catch (_error) {
|
|
1196
|
-
|
|
1182
|
+
logger.debug(`Failed to parse MCP output: ${line}`);
|
|
1197
1183
|
}
|
|
1198
1184
|
}
|
|
1199
1185
|
});
|
|
@@ -1217,19 +1203,19 @@ var SocketIoMcpBridge = class {
|
|
|
1217
1203
|
const jsonLine = JSON.stringify(messageToSend) + "\n";
|
|
1218
1204
|
this.mcpProcess.stdin?.write(jsonLine);
|
|
1219
1205
|
} catch (error) {
|
|
1220
|
-
|
|
1206
|
+
logger.error(`Failed to write to MCP stdin: ${error instanceof Error ? error.message : String(error)}`);
|
|
1221
1207
|
}
|
|
1222
1208
|
});
|
|
1223
|
-
|
|
1209
|
+
logger.debug("MCP ↔ Socket.io bridge active");
|
|
1224
1210
|
}
|
|
1225
1211
|
/**
|
|
1226
1212
|
* Stop bridging (socket lifecycle managed externally)
|
|
1227
1213
|
*/
|
|
1228
1214
|
async disconnect() {
|
|
1229
|
-
|
|
1215
|
+
logger.debug("Stopping MCP bridge...");
|
|
1230
1216
|
this.wireIdMap.clear();
|
|
1231
1217
|
this.wireIdSeq = 0;
|
|
1232
|
-
|
|
1218
|
+
logger.debug("MCP bridge stopped");
|
|
1233
1219
|
}
|
|
1234
1220
|
/**
|
|
1235
1221
|
* Get socket ID (if connected)
|
|
@@ -1244,7 +1230,6 @@ var SocketIoMcpBridge = class {
|
|
|
1244
1230
|
return this.socket?.connected === true;
|
|
1245
1231
|
}
|
|
1246
1232
|
};
|
|
1247
|
-
|
|
1248
1233
|
//#endregion
|
|
1249
1234
|
//#region src/codeScan/mcp/index.ts
|
|
1250
1235
|
/**
|
|
@@ -1259,8 +1244,8 @@ var SocketIoMcpBridge = class {
|
|
|
1259
1244
|
* @returns MCP bridge setup result
|
|
1260
1245
|
*/
|
|
1261
1246
|
async function setupMcpBridge(socket, absoluteRepoPath, sessionId) {
|
|
1262
|
-
|
|
1263
|
-
|
|
1247
|
+
logger.debug("Setting up repo MCP access...");
|
|
1248
|
+
logger.debug(`Using session ID: ${sessionId}`);
|
|
1264
1249
|
const mcpProcess = startFilesystemMcpServer(absoluteRepoPath);
|
|
1265
1250
|
const mcpBridge = new SocketIoMcpBridge(mcpProcess, socket, sessionId);
|
|
1266
1251
|
await mcpBridge.connect();
|
|
@@ -1274,7 +1259,6 @@ async function setupMcpBridge(socket, absoluteRepoPath, sessionId) {
|
|
|
1274
1259
|
sessionId
|
|
1275
1260
|
};
|
|
1276
1261
|
}
|
|
1277
|
-
|
|
1278
1262
|
//#endregion
|
|
1279
1263
|
//#region src/codeScan/util/auth.ts
|
|
1280
1264
|
/**
|
|
@@ -1300,16 +1284,15 @@ function resolveAuthCredentials(apiKey, forkPR) {
|
|
|
1300
1284
|
if (baseAuth.apiKey) return baseAuth;
|
|
1301
1285
|
const oidcToken = process.env.GITHUB_OIDC_TOKEN;
|
|
1302
1286
|
if (oidcToken) {
|
|
1303
|
-
|
|
1287
|
+
logger.debug("Using GitHub OIDC token");
|
|
1304
1288
|
return { oidcToken };
|
|
1305
1289
|
}
|
|
1306
1290
|
if (forkPR) {
|
|
1307
|
-
|
|
1291
|
+
logger.debug("Using fork PR context for authentication");
|
|
1308
1292
|
return { forkPR };
|
|
1309
1293
|
}
|
|
1310
1294
|
return {};
|
|
1311
1295
|
}
|
|
1312
|
-
|
|
1313
1296
|
//#endregion
|
|
1314
1297
|
//#region src/codeScan/util/github.ts
|
|
1315
1298
|
/**
|
|
@@ -1328,7 +1311,6 @@ function parseGitHubPr(prString) {
|
|
|
1328
1311
|
number: parseInt(prNumber, 10)
|
|
1329
1312
|
};
|
|
1330
1313
|
}
|
|
1331
|
-
|
|
1332
1314
|
//#endregion
|
|
1333
1315
|
//#region src/codeScan/scanner/cleanup.ts
|
|
1334
1316
|
/**
|
|
@@ -1341,14 +1323,13 @@ function parseGitHubPr(prString) {
|
|
|
1341
1323
|
*/
|
|
1342
1324
|
function registerCleanupHandlers(refs) {
|
|
1343
1325
|
const cleanup = (signal) => {
|
|
1344
|
-
|
|
1326
|
+
logger.debug(`Received ${signal}, cleaning up...`);
|
|
1345
1327
|
if (refs.abortController) refs.abortController.abort();
|
|
1346
1328
|
};
|
|
1347
1329
|
process.once("SIGINT", () => cleanup("SIGINT"));
|
|
1348
1330
|
process.once("SIGTERM", () => cleanup("SIGTERM"));
|
|
1349
1331
|
process.once("SIGQUIT", () => cleanup("SIGQUIT"));
|
|
1350
1332
|
}
|
|
1351
|
-
|
|
1352
1333
|
//#endregion
|
|
1353
1334
|
//#region src/codeScan/scanner/output.ts
|
|
1354
1335
|
/**
|
|
@@ -1381,8 +1362,8 @@ function displayScanResults(response, duration, options) {
|
|
|
1381
1362
|
const { comments, review } = response;
|
|
1382
1363
|
const severityCounts = countBySeverity(comments || []);
|
|
1383
1364
|
printBorder();
|
|
1384
|
-
|
|
1385
|
-
if (severityCounts.total > 0)
|
|
1365
|
+
logger.info(`${chalk.green("✓")} Scan complete (${formatDuration(duration / 1e3)})`);
|
|
1366
|
+
if (severityCounts.total > 0) logger.info(chalk.yellow(`⚠ Found ${severityCounts.total} issue${severityCounts.total === 1 ? "" : "s"}`));
|
|
1386
1367
|
printBorder();
|
|
1387
1368
|
let reviewText = review;
|
|
1388
1369
|
if (!reviewText && comments && comments.length > 0) {
|
|
@@ -1390,9 +1371,9 @@ function displayScanResults(response, duration, options) {
|
|
|
1390
1371
|
if (noneComment) reviewText = noneComment.finding;
|
|
1391
1372
|
}
|
|
1392
1373
|
if (reviewText) {
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1374
|
+
logger.info("");
|
|
1375
|
+
logger.info(reviewText);
|
|
1376
|
+
logger.info("");
|
|
1396
1377
|
printBorder();
|
|
1397
1378
|
}
|
|
1398
1379
|
if (severityCounts.total > 0) {
|
|
@@ -1406,39 +1387,38 @@ function displayScanResults(response, duration, options) {
|
|
|
1406
1387
|
const rankA = a.severity ? getSeverityRank(a.severity) : 0;
|
|
1407
1388
|
return (b.severity ? getSeverityRank(b.severity) : 0) - rankA;
|
|
1408
1389
|
});
|
|
1409
|
-
|
|
1390
|
+
logger.info("");
|
|
1410
1391
|
for (let i = 0; i < sortedComments.length; i++) {
|
|
1411
1392
|
const comment = sortedComments[i];
|
|
1412
1393
|
const severity = formatSeverity(comment.severity);
|
|
1413
1394
|
const location = comment.line ? `${comment.file}:${comment.line}` : comment.file || "";
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1395
|
+
logger.info(`${severity} ${chalk.gray(location)}`);
|
|
1396
|
+
logger.info("");
|
|
1397
|
+
logger.info(comment.finding);
|
|
1417
1398
|
if (comment.fix) {
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1399
|
+
logger.info("");
|
|
1400
|
+
logger.info(chalk.bold("Suggested Fix:"));
|
|
1401
|
+
logger.info(comment.fix);
|
|
1421
1402
|
}
|
|
1422
1403
|
if (comment.aiAgentPrompt) {
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1404
|
+
logger.info("");
|
|
1405
|
+
logger.info(chalk.bold("AI Agent Prompt:"));
|
|
1406
|
+
logger.info(comment.aiAgentPrompt);
|
|
1426
1407
|
}
|
|
1427
1408
|
if (i < sortedComments.length - 1) {
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1409
|
+
logger.info("");
|
|
1410
|
+
logger.info(chalk.gray("─".repeat(TERMINAL_MAX_WIDTH)));
|
|
1411
|
+
logger.info("");
|
|
1431
1412
|
}
|
|
1432
1413
|
}
|
|
1433
1414
|
printBorder();
|
|
1434
1415
|
if (options.githubPr) {
|
|
1435
|
-
|
|
1416
|
+
logger.info(`» Comments posted to PR: ${chalk.cyan(options.githubPr)}`);
|
|
1436
1417
|
printBorder();
|
|
1437
1418
|
}
|
|
1438
1419
|
}
|
|
1439
1420
|
}
|
|
1440
1421
|
}
|
|
1441
|
-
|
|
1442
1422
|
//#endregion
|
|
1443
1423
|
//#region src/codeScan/scanner/request.ts
|
|
1444
1424
|
/**
|
|
@@ -1575,7 +1555,7 @@ async function executeScanRequestWithRetry(client, request, options) {
|
|
|
1575
1555
|
if (attempt === MAX_RETRIES - 1) throw error;
|
|
1576
1556
|
const jitter = .7 + .6 * Math.random();
|
|
1577
1557
|
const delay = BASE_DELAY_MS * Math.pow(2, attempt) * jitter;
|
|
1578
|
-
|
|
1558
|
+
logger.debug(`Server busy, retrying in ${Math.round(delay / 1e3)}s (attempt ${attempt + 1}/${MAX_RETRIES})`);
|
|
1579
1559
|
if (showSpinner && spinner) {
|
|
1580
1560
|
const originalText = spinner.text;
|
|
1581
1561
|
spinner.text = `Server busy, retrying in ${Math.round(delay / 1e3)}s...`;
|
|
@@ -1585,7 +1565,6 @@ async function executeScanRequestWithRetry(client, request, options) {
|
|
|
1585
1565
|
}
|
|
1586
1566
|
throw new Error("Scan failed: exceeded maximum retries");
|
|
1587
1567
|
}
|
|
1588
|
-
|
|
1589
1568
|
//#endregion
|
|
1590
1569
|
//#region src/codeScan/scanner/index.ts
|
|
1591
1570
|
/**
|
|
@@ -1618,13 +1597,13 @@ async function executeScan(repoPath, options) {
|
|
|
1618
1597
|
const guidance = resolveGuidance(options, config);
|
|
1619
1598
|
const absoluteRepoPath = path.resolve(repoPath);
|
|
1620
1599
|
if (!options.json) {
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
if (config.diffsOnly)
|
|
1624
|
-
else
|
|
1625
|
-
|
|
1600
|
+
logger.info("Beginning scan for LLM-related vulnerabilities in your code.");
|
|
1601
|
+
logger.info(` Minimum severity: ${config.minimumSeverity}`);
|
|
1602
|
+
if (config.diffsOnly) logger.info(` Mode: diffs only`);
|
|
1603
|
+
else logger.info(` Mode: diffs + tracing into repo`);
|
|
1604
|
+
logger.info("");
|
|
1626
1605
|
}
|
|
1627
|
-
|
|
1606
|
+
logger.debug(`Repository: ${absoluteRepoPath}`);
|
|
1628
1607
|
const cleanupRefs = {
|
|
1629
1608
|
repoPath: absoluteRepoPath,
|
|
1630
1609
|
socket: null,
|
|
@@ -1634,7 +1613,7 @@ async function executeScan(repoPath, options) {
|
|
|
1634
1613
|
abortController: null
|
|
1635
1614
|
};
|
|
1636
1615
|
registerCleanupHandlers(cleanupRefs);
|
|
1637
|
-
const isWebUI = Boolean(
|
|
1616
|
+
const isWebUI = Boolean(state.webUI);
|
|
1638
1617
|
const spinner = createSpinner({
|
|
1639
1618
|
json: options.json || false,
|
|
1640
1619
|
isWebUI,
|
|
@@ -1651,7 +1630,7 @@ async function executeScan(repoPath, options) {
|
|
|
1651
1630
|
if (!parsed) throw new Error(`Invalid --github-pr format: "${options.githubPr}". Expected format: owner/repo#number (e.g., promptfoo/promptfoo#123)`);
|
|
1652
1631
|
parsedPR = parsed;
|
|
1653
1632
|
}
|
|
1654
|
-
if (!showSpinner)
|
|
1633
|
+
if (!showSpinner) logger.debug("Connecting to server...");
|
|
1655
1634
|
client = await createAgentClient({
|
|
1656
1635
|
agent: "code-scan",
|
|
1657
1636
|
host: resolveApiHost(options, config),
|
|
@@ -1666,7 +1645,7 @@ async function executeScan(repoPath, options) {
|
|
|
1666
1645
|
cleanupRefs.mcpProcess = mcpProcess;
|
|
1667
1646
|
cleanupRefs.mcpBridge = mcpBridge;
|
|
1668
1647
|
}
|
|
1669
|
-
|
|
1648
|
+
logger.debug("Processing git diff...");
|
|
1670
1649
|
const simpleGit = (await import("simple-git")).default;
|
|
1671
1650
|
const git = simpleGit(absoluteRepoPath);
|
|
1672
1651
|
if (!options.compare) await validateOnBranch(git);
|
|
@@ -1677,11 +1656,11 @@ async function executeScan(repoPath, options) {
|
|
|
1677
1656
|
baseBranch = branches.all.includes("main") || branches.all.includes("origin/main") ? "main" : branches.all.includes("master") || branches.all.includes("origin/master") ? "master" : "main";
|
|
1678
1657
|
}
|
|
1679
1658
|
const compareRef = options.compare || "HEAD";
|
|
1680
|
-
|
|
1659
|
+
logger.debug(`Comparing: ${baseBranch}...${compareRef}`);
|
|
1681
1660
|
const files = await processDiff(absoluteRepoPath, baseBranch, compareRef);
|
|
1682
1661
|
const includedFiles = files.filter((f) => !f.skipReason && f.patch);
|
|
1683
1662
|
const skippedFiles = files.filter((f) => f.skipReason);
|
|
1684
|
-
|
|
1663
|
+
logger.debug(`Files changed: ${files.length} (${includedFiles.length} included, ${skippedFiles.length} skipped)`);
|
|
1685
1664
|
if (includedFiles.length === 0) {
|
|
1686
1665
|
const msg = "No files to scan";
|
|
1687
1666
|
if (options.json) {
|
|
@@ -1690,18 +1669,18 @@ async function executeScan(repoPath, options) {
|
|
|
1690
1669
|
comments: [],
|
|
1691
1670
|
review: msg
|
|
1692
1671
|
};
|
|
1693
|
-
|
|
1672
|
+
logger.info(JSON.stringify(response, null, 2));
|
|
1694
1673
|
} else if (showSpinner && spinner) spinner.succeed(msg);
|
|
1695
|
-
else
|
|
1696
|
-
|
|
1674
|
+
else logger.info(msg);
|
|
1675
|
+
state.postActionCallback = async () => {
|
|
1697
1676
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1698
1677
|
process.exitCode = 0;
|
|
1699
1678
|
};
|
|
1700
1679
|
return;
|
|
1701
1680
|
}
|
|
1702
1681
|
const metadata = await extractMetadata(absoluteRepoPath, baseBranch, compareRef);
|
|
1703
|
-
|
|
1704
|
-
|
|
1682
|
+
logger.debug(`Compare ref: ${metadata.branch}`);
|
|
1683
|
+
logger.debug(`Commits: ${metadata.commitMessages.length}`);
|
|
1705
1684
|
let pullRequest = void 0;
|
|
1706
1685
|
if (parsedPR) {
|
|
1707
1686
|
const currentCommit = await git.revparse(["HEAD"]);
|
|
@@ -1711,9 +1690,9 @@ async function executeScan(repoPath, options) {
|
|
|
1711
1690
|
number: parsedPR.number,
|
|
1712
1691
|
sha: currentCommit.trim()
|
|
1713
1692
|
};
|
|
1714
|
-
|
|
1693
|
+
logger.debug(`GitHub PR context: ${parsedPR.owner}/${parsedPR.repo}#${parsedPR.number} (${pullRequest.sha.substring(0, 7)})`);
|
|
1715
1694
|
}
|
|
1716
|
-
if (!showSpinner)
|
|
1695
|
+
if (!showSpinner) logger.debug("Scanning code...");
|
|
1717
1696
|
const scanRequest = buildScanRequest(files, metadata, config, sessionId, pullRequest, guidance);
|
|
1718
1697
|
const scanResponse = await executeScanRequestWithRetry(client, scanRequest, {
|
|
1719
1698
|
showSpinner,
|
|
@@ -1730,8 +1709,8 @@ async function executeScan(repoPath, options) {
|
|
|
1730
1709
|
if (errorMessage.includes("Fork PR scanning not authorized")) {
|
|
1731
1710
|
const msg = "Fork PR scanning requires maintainer approval. See PR comment for options.";
|
|
1732
1711
|
if (showSpinner && spinner) spinner.succeed(msg);
|
|
1733
|
-
else
|
|
1734
|
-
|
|
1712
|
+
else logger.info(msg);
|
|
1713
|
+
state.postActionCallback = async () => {
|
|
1735
1714
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1736
1715
|
process.exitCode = 0;
|
|
1737
1716
|
};
|
|
@@ -1739,26 +1718,26 @@ async function executeScan(repoPath, options) {
|
|
|
1739
1718
|
}
|
|
1740
1719
|
const msg = `Scan failed: ${errorMessage}`;
|
|
1741
1720
|
if (showSpinner && spinner) spinner.fail(msg);
|
|
1742
|
-
else
|
|
1743
|
-
|
|
1721
|
+
else logger.error(msg);
|
|
1722
|
+
state.postActionCallback = async () => {
|
|
1744
1723
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1745
1724
|
if (error instanceof Error && error.message === "cancelled by user") process.exitCode = 130;
|
|
1746
1725
|
else process.exitCode = 1;
|
|
1747
1726
|
};
|
|
1748
1727
|
} finally {
|
|
1749
1728
|
if (mcpBridge) await mcpBridge.disconnect().catch(() => {
|
|
1750
|
-
|
|
1729
|
+
logger.debug("MCP bridge cleanup completed");
|
|
1751
1730
|
});
|
|
1752
1731
|
if (mcpProcess) await stopFilesystemMcpServer(mcpProcess).catch(() => {
|
|
1753
|
-
|
|
1732
|
+
logger.debug("MCP server cleanup completed");
|
|
1754
1733
|
});
|
|
1755
1734
|
if (client) {
|
|
1756
1735
|
client.disconnect();
|
|
1757
|
-
|
|
1736
|
+
logger.debug("Agent client disconnected");
|
|
1758
1737
|
}
|
|
1759
1738
|
}
|
|
1760
1739
|
}
|
|
1761
|
-
|
|
1762
1740
|
//#endregion
|
|
1763
1741
|
export { executeScan };
|
|
1764
|
-
|
|
1742
|
+
|
|
1743
|
+
//# sourceMappingURL=scanner-BsBlNXNn.js.map
|