promptfoo 0.120.26 → 0.121.1
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/drizzle/0023_wooden_mandrill.sql +2 -0
- package/dist/drizzle/meta/0023_snapshot.json +1496 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/src/{ListApp-D3DG0F8h.js → ListApp-Du7YVwj5.js} +2 -4
- package/dist/src/accounts-BgNJDBE6.js +206 -0
- package/dist/src/{accounts-BzEY8H3v.cjs → accounts-Bx-x3bmW.cjs} +99 -80
- package/dist/src/{accounts-DHHiXsy6.js → accounts-CMqkzrVf.js} +61 -36
- package/dist/src/{accounts-R3gfCR_g.js → accounts-xrUGFA6n.js} +60 -35
- package/dist/src/{agentic-utils-D6_gzOUF.js → agentic-utils-BKIN5PKu.js} +9 -10
- package/dist/src/{agents-CwM7re15.cjs → agents-B0f4HICh.cjs} +37 -40
- package/dist/src/{agents-Cnph5GLD.js → agents-C-dDThPK.js} +37 -37
- package/dist/src/{agents-C7BiinFI.cjs → agents-CErsqg5U.cjs} +19 -27
- package/dist/src/{agents-v4cW_ZgC.js → agents-CVIn-Utx.js} +19 -22
- package/dist/src/{agents-GiUianme.js → agents-CXknwsFX.js} +37 -40
- package/dist/src/{agents-DETIQHqF.js → agents-DeH4Gu94.js} +21 -28
- package/dist/src/{agents-DYIT-hQy.js → agents-Dy2YpZpa.js} +38 -41
- package/dist/src/{agents-Cao4i7AX.js → agents-aF4-T121.js} +19 -30
- package/dist/src/{aimlapi-DMF6v_vb.js → aimlapi-BAGZDo5G.js} +16 -18
- package/dist/src/{aimlapi-CMJpKK-B.js → aimlapi-BNfTBexL.js} +15 -17
- package/dist/src/{aimlapi-DtSf1ykJ.js → aimlapi-DHRKlBEA.js} +15 -4
- package/dist/src/{aimlapi-DoGLcQW_.cjs → aimlapi-tg0Gkcvr.cjs} +15 -16
- package/dist/src/app/assets/index-BFCZg7hQ.js +439 -0
- package/dist/src/app/assets/index-NCn4eVBv.css +1 -0
- package/dist/src/app/assets/{vendor-charts-CYyo8R8v.js → vendor-charts-CCl15Imd.js} +1 -1
- package/dist/src/app/assets/{vendor-markdown-DSmzq4Jh.js → vendor-markdown-0tekx3KX.js} +1 -1
- package/dist/src/app/index.html +4 -34
- package/dist/src/{audio-DUH4q0Xq.js → audio-BRODU0UK.js} +7 -9
- package/dist/src/{audio-BWjyvHn9.cjs → audio-BWeaWovU.cjs} +6 -7
- package/dist/src/{audio-U580w8jM.js → audio-CHQ4r-RV.js} +6 -5
- package/dist/src/{audio-BrJBFN2b.js → audio-tf_NBjlC.js} +6 -8
- package/dist/src/base-B0tcrnq_.js +193 -0
- package/dist/src/base-B4QJRyFS.js +194 -0
- package/dist/src/base-DBtwl2FR.cjs +222 -0
- package/dist/src/base-fEDN28WM.js +193 -0
- package/dist/src/{blobs-kt8v3UyH.js → blobs-BAU-dXan.js} +9 -12
- package/dist/src/{blobs-C9J2mVgo.js → blobs-Bpg5rH6i.js} +9 -12
- package/dist/src/{blobs-673H0jCl.cjs → blobs-DvS-O6be.cjs} +34 -37
- package/dist/src/blobs-qTYm-1PY.js +236 -0
- package/dist/src/{cache-BLLayYEN.js → cache-8XhNqPKW.js} +64 -67
- package/dist/src/cache-Bbn1Nyrd.cjs +5 -0
- package/dist/src/cache-BwsMSda7.js +6 -0
- package/dist/src/{cache-mIszOnuz.js → cache-CG0SlR1d.js} +64 -66
- package/dist/src/{cache-7xULbvt3.cjs → cache-COish3-W.cjs} +114 -117
- package/dist/src/cache-D3eqDYGU.js +739 -0
- package/dist/src/{chat-Fl6TZJRS.cjs → chat-2K608PeQ.cjs} +20 -21
- package/dist/src/chat-BKm79wib.js +764 -0
- package/dist/src/{chat-XPN9YHhr.js → chat-CM_kyI8B.js} +20 -9
- package/dist/src/{chat-DIywASPG.js → chat-CRWNNq73.js} +49 -49
- package/dist/src/{chat-C8Ei4f87.js → chat-CznLWr_D.js} +49 -49
- package/dist/src/{chat-CgyGj2hC.js → chat-DHMH-N64.js} +20 -22
- package/dist/src/{chat-C4zqjObh.cjs → chat-DaqekjFr.cjs} +69 -69
- package/dist/src/{chat-Cpz3O-Xl.js → chat-DxysjBvt.js} +21 -23
- package/dist/src/{chatkit-Dpxrq4eD.js → chatkit-65VXf5SR.js} +58 -58
- package/dist/src/{chatkit-DIrJX8xk.js → chatkit-Be-Q-a9F.js} +58 -60
- package/dist/src/{chatkit-DEls11hE.js → chatkit-BxFvW8KY.js} +58 -60
- package/dist/src/{chatkit-e25Ziu17.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-6-xTaLwM.js → claude-agent-sdk-BLTu0WBO.js} +45 -31
- package/dist/src/{claude-agent-sdk-BzxF6NIJ.cjs → claude-agent-sdk-CJH22shf.cjs} +44 -29
- package/dist/src/{claude-agent-sdk-CmkTnKGH.js → claude-agent-sdk-D6_k9FKA.js} +45 -33
- package/dist/src/{claude-agent-sdk-rXCBLK_o.js → claude-agent-sdk-Dy5lT-Tx.js} +46 -21
- package/dist/src/{cloud-BMbRVJFw.js → cloud-Bc9526yV.js} +32 -12
- package/dist/src/cloud-DmE0EwsY.js +4 -0
- package/dist/src/{cloudflare-ai-CUg4BTcj.js → cloudflare-ai-C9r2sRhw.js} +16 -18
- package/dist/src/{cloudflare-ai-Z9X219gp.js → cloudflare-ai-CWWJCRim.js} +16 -4
- package/dist/src/{cloudflare-ai-BAQ0u_dg.cjs → cloudflare-ai-ClWSdor4.cjs} +16 -17
- package/dist/src/{cloudflare-ai-CobxMTR4.js → cloudflare-ai-ICsOuD-z.js} +17 -19
- package/dist/src/{cloudflare-gateway-C0sgfr_z.cjs → cloudflare-gateway-C2_-KG5o.cjs} +21 -22
- package/dist/src/{cloudflare-gateway-_itGuXry.js → cloudflare-gateway-D6O7AlYb.js} +23 -23
- package/dist/src/{cloudflare-gateway-D2_yi-Fh.js → cloudflare-gateway-D6xFc5pa.js} +21 -25
- package/dist/src/{cloudflare-gateway-Djf3F3_H.js → cloudflare-gateway-pXGHxJ47.js} +26 -14
- package/dist/src/{codex-sdk-ibXwdglL.js → codex-sdk-C6UMlxwV.js} +49 -32
- package/dist/src/{codex-sdk-BASDNkIl.js → codex-sdk-DUwKWezN.js} +49 -30
- package/dist/src/{codex-sdk-dSnGdgIp.js → codex-sdk-GGAw0qbD.js} +49 -32
- package/dist/src/{codex-sdk-wTEpMM_X.cjs → codex-sdk-fAO0c3yA.cjs} +49 -32
- package/dist/src/{cometapi-B01btbfb.js → cometapi-BasUi7-_.js} +17 -19
- package/dist/src/{cometapi-DHUAH6nK.js → cometapi-Bbjp5V4x.js} +16 -4
- package/dist/src/{cometapi-ChAaRjg5.js → cometapi-DkXrKi5z.js} +21 -24
- package/dist/src/{cometapi-JbvOJSCO.cjs → cometapi-vY6aDZgo.cjs} +21 -22
- package/dist/src/{completion-D9_MDlnd.js → completion-6Mx_iXxK.js} +11 -13
- package/dist/src/{completion-BBJ6zmG3.js → completion-C5rtR_9P.js} +11 -13
- package/dist/src/{completion-DDyL3Cb2.cjs → completion-CDOouNzq.cjs} +21 -23
- package/dist/src/completion-C_P3ypkJ.js +120 -0
- package/dist/src/createHash-CTQmL3G2.js +15 -0
- package/dist/src/createHash-CfZSc0b4.cjs +27 -0
- package/dist/src/createHash-Da8fMwqB.js +16 -0
- package/dist/src/createHash-DmPQkvBh.js +15 -0
- package/dist/src/{docker-JAAubMw3.js → docker-5KcG-_86.js} +18 -20
- package/dist/src/{docker-Ckw-j7Rr.cjs → docker-BwsKwxFs.cjs} +18 -19
- package/dist/src/{docker-vnOg96gi.js → docker-CZnqU1XV.js} +18 -7
- package/dist/src/{docker-BuButc4D.js → docker-DzxyDPIj.js} +19 -21
- package/dist/src/entrypoint.js +2 -3
- package/dist/src/{errors-DnGCbnx8.js → errors-P6ll7XSJ.js} +2 -2
- package/dist/src/{esm-CYhseqj4.js → esm-C03C-mv3.js} +17 -20
- package/dist/src/{esm-rDtG_2rg.js → esm-CaIwzWR5.js} +18 -21
- package/dist/src/esm-Cd1AjG1D.js +379 -0
- package/dist/src/{esm-BQkx5roy.cjs → esm-CnNt7sI4.cjs} +47 -49
- package/dist/src/eval-17JizQIv.js +15 -0
- package/dist/src/{eval-CYrbG57o.js → eval-DmFyWU7i.js} +49 -55
- package/dist/src/{evalResult-COsVttMA.js → evalResult-CDQiuUuf.js} +16 -12
- package/dist/src/{evalResult-6JaUIStC.js → evalResult-CTG2AHOS.js} +10 -11
- package/dist/src/evalResult-Cqj8pldJ.js +12 -0
- package/dist/src/{evalResult-DlRfu_Rq.cjs → evalResult-Dap2CekP.cjs} +20 -21
- package/dist/src/evalResult-DvcJAWJU.cjs +10 -0
- package/dist/src/evalResult-Hftn-S_i.js +10 -0
- package/dist/src/evaluator-B2CFNt-P.js +36 -0
- package/dist/src/{evaluator-3EJCMTs0.js → evaluator-DPFRbFIL.js} +210 -232
- package/dist/src/{extractor-LSYjrhK0.js → extractor-CFG6bcWJ.js} +23 -38
- package/dist/src/{extractor-DbhlYEeo.cjs → extractor-DX36oYEv.cjs} +37 -64
- package/dist/src/{extractor-Hs7la_19.js → extractor-M67RUtg6.js} +23 -38
- package/dist/src/extractor-YMU_Gvt8.js +374 -0
- package/dist/src/fetch-4M3YRaqL.js +780 -0
- package/dist/src/{fetch-18MuNu9i.js → fetch-60Gzydls.js} +60 -46
- package/dist/src/{fetch-SRsE6Ctl.js → fetch-BMv0O527.js} +41 -35
- package/dist/src/{fetch-ZMn_oemb.cjs → fetch-BxUk8odA.cjs} +268 -279
- package/dist/src/fetch-KV5kNASw.js +5 -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-Doo0xq-z.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-CQlpZkrp.cjs → genaiTracer-DN4dQywX.cjs} +13 -14
- package/dist/src/graders-Bu0H9nXi.js +32 -0
- package/dist/src/{graders-BaMCwIKp.js → graders-CHO8EPM4.js} +385 -417
- package/dist/src/graders-Cfhkvx-e.js +34 -0
- package/dist/src/{graders-QsALpIdy.js → graders-CpdqD9PI.js} +385 -417
- package/dist/src/graders-DClJVpGP.cjs +32 -0
- package/dist/src/{graders-DzUUnUjC.cjs → graders-DOXycdlG.cjs} +721 -753
- package/dist/src/graders-DcnJsrMO.js +32 -0
- package/dist/src/graders-R9rYUM0d.js +13466 -0
- package/dist/src/{image-BiEVdpdP.js → image-BmEZqVmk.js} +57 -18
- package/dist/src/{image-mhAGP07h.js → image-CBBVXWuT.js} +57 -18
- package/dist/src/{image-D10zEe1f.cjs → image-CDLQOcqT.cjs} +6 -7
- package/dist/src/{image-COCWy5dX.js → image-DJEvKveK.js} +6 -5
- package/dist/src/{image-C3BjJUAU.cjs → image-DTedmQPg.cjs} +77 -32
- package/dist/src/{image-DB4sHxdJ.js → image-gvmivTEe.js} +7 -9
- package/dist/src/image-pAX56tPG.js +257 -0
- package/dist/src/{image-BXt_7u0v.js → image-tL5hIOFh.js} +6 -8
- package/dist/src/index.cjs +696 -693
- package/dist/src/index.d.cts +113 -10
- package/dist/src/index.d.ts +113 -6
- package/dist/src/index.js +657 -658
- package/dist/src/{interactiveCheck-DU-MAhp5.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-DotRBzUE.js → knowledgeBase-CLJybhnF.js} +19 -34
- package/dist/src/{knowledgeBase-XJQ0Qyez.js → knowledgeBase-CoU-UQBg.js} +17 -41
- package/dist/src/{knowledgeBase-CMvMlLZR.js → knowledgeBase-DjWPVqSb.js} +17 -43
- package/dist/src/{knowledgeBase-Bnb00xKs.cjs → knowledgeBase-wkxuRFhA.cjs} +17 -40
- package/dist/src/{litellm-CHrRmPAe.js → litellm-B9Hysuri.js} +16 -18
- package/dist/src/{litellm-CrLJrPIm.js → litellm-CTfa0hqi.js} +15 -17
- package/dist/src/{litellm-BrnZhMcL.cjs → litellm-NYpQ8RQu.cjs} +15 -16
- package/dist/src/{litellm-BECdjOTx.js → litellm-ePxtr9F1.js} +15 -4
- package/dist/src/{logger-w8Ozp0Td.js → logger-CT3IKMKA.js} +24 -41
- package/dist/src/{logger-BdZ-IqBc.cjs → logger-Cp1GPUjj.cjs} +166 -192
- package/dist/src/logger-DLcq4dWf.js +713 -0
- package/dist/src/{logger-BotXmWKW.js → logger-KkObSCzq.js} +27 -43
- package/dist/src/{luma-ray-C0RkI3lt.cjs → luma-ray-B0GGNRc1.cjs} +20 -21
- package/dist/src/{luma-ray-C-w6EsJm.js → luma-ray-BE2mOt6N.js} +20 -13
- package/dist/src/{luma-ray-BOeX-h0M.js → luma-ray-BW9IRGIc.js} +22 -21
- package/dist/src/{luma-ray-DgKLS0BF.js → luma-ray-Cm1KZBhs.js} +20 -23
- package/dist/src/main.js +1985 -2055
- package/dist/src/{messages-DXV3Qh8_.cjs → messages-1JrJs91T.cjs} +35 -34
- package/dist/src/{messages-D61tPFQo.js → messages-1x9atZmP.js} +25 -24
- package/dist/src/{messages-CDZYGNlS.js → messages-BLbWdsyt.js} +25 -24
- package/dist/src/messages-D8EA0oDc.js +240 -0
- package/dist/src/{meteor-P2rUE-Uz.js → meteor-44VjEACX.js} +3 -4
- package/dist/src/{meteor-SLNTgmXm.js → meteor-D-SotUw9.js} +3 -4
- package/dist/src/{meteor-odmwVbyG.cjs → meteor-DLZZ3osF.cjs} +3 -4
- package/dist/src/{meteor-Dj8cTkU_.js → meteor-DUiCJRC-.js} +3 -4
- package/dist/src/modelslab-C1OLRmVX.js +166 -0
- package/dist/src/modelslab-CqXBy3U8.js +168 -0
- package/dist/src/modelslab-DcOSFwKh.cjs +166 -0
- package/dist/src/modelslab-X5-4LroM.js +166 -0
- package/dist/src/{nova-reel-C2LFfVTf.js → nova-reel-BgS1ZWuK.js} +20 -13
- package/dist/src/{nova-reel-DtCjbD5O.js → nova-reel-D2ZkOSyr.js} +22 -21
- package/dist/src/{nova-reel-D9FXq3Mt.cjs → nova-reel-D9xfaMBs.cjs} +20 -21
- package/dist/src/{nova-reel-Bk5npr2q.js → nova-reel-DihqLeol.js} +20 -23
- package/dist/src/{nova-sonic-BoRSY_U6.cjs → nova-sonic-DVu3mMIy.cjs} +30 -31
- package/dist/src/{nova-sonic-D_qERM-K.js → nova-sonic-DezhVUYT.js} +30 -26
- package/dist/src/{nova-sonic-CgaWLDM1.js → nova-sonic-P-CdUMlV.js} +30 -31
- package/dist/src/{nova-sonic-BXRfQyF-.js → nova-sonic-Q3BOJeig.js} +31 -32
- package/dist/src/{openai-Bigwjgo1.cjs → openai-Cuif0GEt.cjs} +8 -9
- package/dist/src/{openai-Dz3surb_.js → openai-DElQ-fPX.js} +3 -4
- package/dist/src/{openai-CT5fwbve.js → openai-DhbB7eWK.js} +3 -4
- package/dist/src/openai-j-sE2O7r.js +44 -0
- package/dist/src/{openclaw-dHLcXUWZ.js → openclaw-BiSZPL7J.js} +20 -14
- package/dist/src/{openclaw-CpPrXwf6.js → openclaw-Bv1DINsX.js} +20 -27
- package/dist/src/{openclaw-B6XY2kUf.js → openclaw-D1D_ej1z.js} +21 -28
- package/dist/src/{openclaw-DDSfq5fp.cjs → openclaw-DAfWQn-o.cjs} +33 -39
- package/dist/src/opencode-sdk-C7m-wRfI.js +560 -0
- package/dist/src/opencode-sdk-CfaLN8PY.cjs +564 -0
- package/dist/src/opencode-sdk-D95s6SnR.js +562 -0
- package/dist/src/opencode-sdk-DxUPkLT7.js +560 -0
- package/dist/src/{otlpReceiver-DmRb0NBj.js → otlpReceiver--AIRW_S4.js} +53 -51
- package/dist/src/{otlpReceiver-Dg817agV.js → otlpReceiver-Bn5wGB1v.js} +53 -55
- package/dist/src/{otlpReceiver-B6Xo4KZM.cjs → otlpReceiver-Diec4cln.cjs} +53 -55
- package/dist/src/{otlpReceiver-BO0rbDzh.js → otlpReceiver-g3ByGaXs.js} +53 -55
- package/dist/src/{providerRegistry-Xf0qdqGQ.js → providerRegistry-B0RUOLI_.js} +7 -8
- package/dist/src/{providerRegistry-wCWd7sKQ.js → providerRegistry-CD8MEar9.js} +7 -8
- package/dist/src/{providerRegistry-lc7a7utN.cjs → providerRegistry-Civky8Ar.cjs} +12 -13
- package/dist/src/providerRegistry-DM8rZYol.js +45 -0
- package/dist/src/providers-B3HvufyI.js +33246 -0
- package/dist/src/{providers-BiNq_Iyc.js → providers-BKRJTjBz.js} +1743 -1795
- package/dist/src/providers-C1rOSHiR.js +32 -0
- package/dist/src/{providers-BlEhY5mi.js → providers-CFLy1_ji.js} +1750 -1802
- package/dist/src/{providers-BNKVY53V.cjs → providers-CFu-TZl-.cjs} +2111 -2163
- package/dist/src/providers-CxmDwEFf.cjs +31 -0
- package/dist/src/providers-Dodakqr0.js +30 -0
- package/dist/src/providers-GIQ2TcsA.js +30 -0
- package/dist/src/{pythonUtils-r1uBuA0n.js → pythonUtils-C3py6GC1.js} +18 -19
- package/dist/src/{pythonUtils-DZ6EbdY4.cjs → pythonUtils-CTU3Y3lw.cjs} +42 -43
- package/dist/src/{pythonUtils-vMlk9Qp5.js → pythonUtils-D5nxkQ0P.js} +18 -19
- package/dist/src/pythonUtils-D6fwaDSg.js +249 -0
- package/dist/src/quiverai-C2jVwbH1.js +213 -0
- package/dist/src/quiverai-CI6gYJVI.js +213 -0
- package/dist/src/quiverai-CLkWkyZc.cjs +213 -0
- package/dist/src/quiverai-MHSxbmmZ.js +215 -0
- package/dist/src/{render-CAZvKKkB.js → render-Drod8m7K.js} +4 -5
- package/dist/src/{responses-DLLjADw5.js → responses-BKqJmhhc.js} +34 -27
- package/dist/src/{responses-TsdODUpm.js → responses-CGw0DCzh.js} +34 -27
- package/dist/src/responses-jxdehPkC.js +660 -0
- package/dist/src/{responses-zOtKtnY_.cjs → responses-tD4Bd4dc.cjs} +49 -42
- package/dist/src/rubyUtils-BUHu6PhO.js +5 -0
- package/dist/src/{rubyUtils-Cs35SDYa.js → rubyUtils-BUVePouc.js} +27 -20
- package/dist/src/rubyUtils-BcuGX77l.js +222 -0
- package/dist/src/{rubyUtils-BtjlqyXt.js → rubyUtils-Boc4HZzX.js} +18 -19
- package/dist/src/rubyUtils-CP42kMvq.cjs +4 -0
- package/dist/src/{rubyUtils-DCVaJ3mc.cjs → rubyUtils-DhCAlxZr.cjs} +48 -50
- package/dist/src/{sagemaker-Du4LIR97.js → sagemaker-BK4Zb993.js} +75 -70
- package/dist/src/{sagemaker-CLdUAv5z.js → sagemaker-BfiWTmvn.js} +77 -77
- package/dist/src/{sagemaker-DwNnEVYt.cjs → sagemaker-CcQHM1jV.cjs} +75 -76
- package/dist/src/{sagemaker-BcgLu0U4.js → sagemaker-D2Q1c-sD.js} +75 -79
- package/dist/src/{scanner-Dyw21Wg_.js → scanner-J8CA3LsV.js} +149 -122
- package/dist/src/server/index.js +5620 -67302
- package/dist/src/{server-CgUQ25qW.cjs → server-B0PPuDw-.cjs} +57 -67
- package/dist/src/server-B1vi21hA.js +7 -0
- package/dist/src/{server-CbMTRQkg.js → server-BC7XJFgr.js} +19 -24
- package/dist/src/server-Cm9Kai_h.cjs +5 -0
- package/dist/src/{server-DWmZLfCy.js → server-DbFphssR.js} +26 -29
- package/dist/src/server-OAs3nBRT.js +229 -0
- package/dist/src/{signal-Bl32q42d.js → signal-BOTbd53Z.js} +9 -11
- package/dist/src/{slack-BtMkB6xP.cjs → slack-BmVAVGaK.cjs} +7 -8
- package/dist/src/{slack-OZYxoVON.js → slack-DCUPTzS2.js} +8 -8
- package/dist/src/{slack-DPqj42Ts.js → slack-DOdy_kyv.js} +7 -8
- package/dist/src/{slack-BfdBx2tO.js → slack-DXMKtA-f.js} +7 -9
- package/dist/src/store-BNmZ1KAz.cjs +5 -0
- package/dist/src/{store-BqwfFEyF.cjs → store-BSc-TF2w.cjs} +44 -45
- package/dist/src/store-BltJg2cd.js +6 -0
- package/dist/src/{store-D4gdn9ih.js → store-D1tv90v3.js} +34 -35
- package/dist/src/{store-2ocbYY9D.js → store-DQLEjuEO.js} +40 -36
- package/dist/src/store-Ub2vaGJ1.js +228 -0
- package/dist/src/{tables-D-NSwNIb.js → tables-5EvT_Bwn.js} +23 -23
- package/dist/src/{tables-B9E1kRp-.cjs → tables-C7K-XKWp.cjs} +93 -93
- package/dist/src/{tables-C7TT2XVn.js → tables-D36WTqKX.js} +25 -25
- package/dist/src/tables-xKANLRBD.js +288 -0
- package/dist/src/telemetry-5BCRNBbe.cjs +5 -0
- package/dist/src/{telemetry-DZ_7PaVq.js → telemetry-C15ziL8u.js} +17 -14
- package/dist/src/{telemetry-BXyVqyAg.js → telemetry-C2YDkUQH.js} +11 -13
- package/dist/src/{telemetry-D0_yFdtU.cjs → telemetry-CbrnxHp_.cjs} +21 -24
- package/dist/src/telemetry-D4W5hboe.js +7 -0
- package/dist/src/telemetry-DMb2Mpfm.js +171 -0
- package/dist/src/{text-Dm78AVGG.js → text-B_UCRPp2.js} +2 -2
- package/dist/src/{text-DF2hMKdg.cjs → text-CW1cyrwj.cjs} +12 -13
- package/dist/src/{text-DgMr_tiM.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-FNIz3YOe.cjs → transcription-CL78qbOU.cjs} +14 -15
- package/dist/src/{transcription-C-M81iDA.js → transcription-DAtxHhAM.js} +14 -7
- package/dist/src/{transcription-CYuY5sFO.js → transcription-LNZTNUUL.js} +14 -16
- package/dist/src/{transcription-Ch7S-LWw.js → transcription-QHh3AH6Z.js} +15 -17
- package/dist/src/{transform-CoP2bJ7P.js → transform-Cgi24fJ7.js} +94 -66
- package/dist/src/{transform-Kd6u-oNm.cjs → transform-CzK1Q0zl.cjs} +24 -26
- package/dist/src/{transform-D8dILpfZ.js → transform-DECvGmzp.js} +15 -13
- package/dist/src/{transform-DMaxQwDx.js → transform-DGLazrMm.js} +94 -66
- package/dist/src/transform-DGxXocjk.js +1506 -0
- package/dist/src/{transform-ivxEY4f7.cjs → transform-DOcQeLld.cjs} +234 -206
- package/dist/src/transform-DTGDnAzW.js +6 -0
- package/dist/src/{transform-CqTFr7KR.js → transform-DilY9wbS.js} +10 -12
- package/dist/src/transform-aa6tmVpZ.js +216 -0
- package/dist/src/transform-m3qNw4KP.cjs +5 -0
- package/dist/src/{transformersAvailability-DEU2naS1.js → transformersAvailability-CEVM2GNQ.js} +2 -2
- package/dist/src/{transformersAvailability-Bkep3ka7.cjs → transformersAvailability-CwayUSlh.cjs} +2 -3
- package/dist/src/{transformersAvailability-DwmezkVe.js → transformersAvailability-D6c6ROpT.js} +2 -2
- package/dist/src/{types-t52w-XsS.js → types-CH3Ge2sE.js} +103 -92
- package/dist/src/{types-DMVjYLpx.js → types-CLKiCBW3.js} +98 -91
- package/dist/src/types-CN_TZ2GJ.js +3260 -0
- package/dist/src/{types-BIfttHrT.cjs → types-LJ0r3wbR.cjs} +573 -566
- package/dist/src/util-5cB-L7U3.js +1430 -0
- package/dist/src/util-6-GqIvzS.js +599 -0
- package/dist/src/{util-vjscpUzy.js → util-B7T3SiBS.js} +5 -6
- package/dist/src/{util-Cl0zfT3V.js → util-Betm42rL.js} +44 -17
- package/dist/src/{util-CUEt0Vum.js → util-C-PPYSMq.js} +44 -17
- package/dist/src/{util-DkFTvieG.cjs → util-CchiqXh_.cjs} +35 -36
- package/dist/src/{util-mJ58qbbw.js → util-DaWTWKBK.js} +5 -6
- package/dist/src/{util-C08Kns6-.cjs → util-Db0a0AFH.cjs} +89 -62
- package/dist/src/{util-DiCePfDu.js → util-Dlz_Wvgm.js} +102 -53
- package/dist/src/{util-BSh4a_Q8.js → util-YT5HPZaS.js} +102 -53
- package/dist/src/{util-DUYOvxAy.cjs → util-Yz-1aEhW.cjs} +274 -219
- package/dist/src/util-ZZH-3QZz.js +293 -0
- package/dist/src/{utils-DFaZa6Rf.cjs → utils-Cz9qXqII.cjs} +32 -35
- package/dist/src/{utils-CVzb4YiI.js → utils-XiOAgly5.js} +4 -7
- package/dist/src/utils-dLokC-eR.js +94 -0
- package/dist/src/{utils-JaY9veb5.js → utils-f2-Moju7.js} +4 -7
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +59 -53
- package/dist/src/app/assets/index-BOgkICuY.css +0 -1
- package/dist/src/app/assets/index-CSgqn_Vd.js +0 -428
- package/dist/src/app/tsconfig.app.tsbuildinfo +0 -1
- package/dist/src/base-BaXmtXYp.js +0 -107
- package/dist/src/base-Dtp8b4_N.js +0 -106
- package/dist/src/base-f71xxWai.cjs +0 -111
- package/dist/src/cache-BUPcq0Ad.js +0 -6
- package/dist/src/cache-CVfRb-HD.cjs +0 -6
- package/dist/src/cache-O4EuX2JV.js +0 -8
- package/dist/src/chunk-DHDDz29n.js +0 -22
- package/dist/src/chunk-FhC4c-0y.js +0 -21
- package/dist/src/cloud-CZ4hytdm.js +0 -5
- package/dist/src/eval-CKHWqG9f.js +0 -16
- package/dist/src/evalResult-CxTP-LMm.cjs +0 -11
- package/dist/src/evalResult-CzLURDcP.js +0 -13
- package/dist/src/evalResult-DyttNQ_G.js +0 -11
- package/dist/src/evaluator-0PvfeBYh.js +0 -38
- package/dist/src/fetch-Bi0o-fdp.js +0 -4
- package/dist/src/fetch-CMptBDVg.cjs +0 -4
- package/dist/src/fetch-DAZkv3gV.js +0 -6
- package/dist/src/graders-BCytzXrb.js +0 -34
- package/dist/src/graders-CGZQShfJ.cjs +0 -33
- package/dist/src/graders-spkuVC-E.js +0 -36
- package/dist/src/opencode-sdk-CImWVqy9.js +0 -382
- package/dist/src/opencode-sdk-CuCztr4P.js +0 -380
- package/dist/src/opencode-sdk-DhcfRbBH.js +0 -376
- package/dist/src/opencode-sdk-mqF-Oj3f.cjs +0 -383
- package/dist/src/providers-BMZZmPBJ.cjs +0 -32
- package/dist/src/providers-CQQrNaJk.js +0 -32
- package/dist/src/providers-Ck8HyrC-.js +0 -34
- package/dist/src/quiverai-BNfIwKCO.cjs +0 -54
- package/dist/src/quiverai-BQigKdIH.js +0 -57
- package/dist/src/quiverai-Bfy2WnE2.js +0 -55
- package/dist/src/quiverai-CedIP0PJ.js +0 -43
- package/dist/src/rubyUtils-D7--T12C.js +0 -6
- package/dist/src/rubyUtils-DRRiMFV2.js +0 -5
- package/dist/src/rubyUtils-vb8OYFC-.cjs +0 -5
- package/dist/src/server-BUbS0Qfh.js +0 -6
- package/dist/src/server-XpGXFHkS.cjs +0 -6
- package/dist/src/server-gfOx5Zrk.js +0 -8
- package/dist/src/store-5u2yriTV.js +0 -7
- package/dist/src/store-D_lq_8oQ.js +0 -6
- package/dist/src/store-m5KT6Ly7.cjs +0 -6
- package/dist/src/telemetry-5RHFoCJh.js +0 -6
- package/dist/src/telemetry-Do8wMnA-.js +0 -8
- package/dist/src/telemetry-LojxPoFq.cjs +0 -6
- package/dist/src/transform-8eGmaH-7.js +0 -7
- package/dist/src/transform-BRVvWaG4.cjs +0 -6
- package/dist/src/transform-GybT0X0u.js +0 -8
- package/dist/src/transformersAvailability-DkAWaK5B.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-BMv0O527.js";
|
|
4
|
+
import "./cloud-Bc9526yV.js";
|
|
5
|
+
import "./types-CH3Ge2sE.js";
|
|
6
|
+
import { t as printBorder } from "./util-YT5HPZaS.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
|
-
import { execa } from "execa";
|
|
19
18
|
import ora from "ora";
|
|
20
19
|
import { io } from "socket.io-client";
|
|
21
|
-
import simpleGit
|
|
20
|
+
import simpleGit from "simple-git";
|
|
22
21
|
import binaryExtensions from "binary-extensions";
|
|
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-DmE0EwsY.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-DmE0EwsY.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,42 +1387,49 @@ 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
|
/**
|
|
1425
|
+
* Scan Request Building and Execution
|
|
1426
|
+
*
|
|
1427
|
+
* Handles building scan requests and executing them via the agent client.
|
|
1428
|
+
*/
|
|
1429
|
+
const CAPACITY_ERROR_MESSAGE = "Server at capacity";
|
|
1430
|
+
const MAX_RETRIES = 7;
|
|
1431
|
+
const BASE_DELAY_MS = 1e3;
|
|
1432
|
+
/**
|
|
1445
1433
|
* Build scan request from inputs
|
|
1446
1434
|
*
|
|
1447
1435
|
* @param files - Files to scan
|
|
@@ -1537,7 +1525,46 @@ async function executeScanRequest(client, request, options) {
|
|
|
1537
1525
|
client.start(request);
|
|
1538
1526
|
});
|
|
1539
1527
|
}
|
|
1540
|
-
|
|
1528
|
+
/**
|
|
1529
|
+
* Check if error is a server capacity error
|
|
1530
|
+
*/
|
|
1531
|
+
function isCapacityError(error) {
|
|
1532
|
+
if (error instanceof Error) return error.message.includes(CAPACITY_ERROR_MESSAGE);
|
|
1533
|
+
return false;
|
|
1534
|
+
}
|
|
1535
|
+
/**
|
|
1536
|
+
* Execute scan request with retry for capacity errors
|
|
1537
|
+
*
|
|
1538
|
+
* When the server is at capacity, it returns "Server at capacity. Please retry."
|
|
1539
|
+
* This wrapper retries with exponential backoff + jitter to spread load.
|
|
1540
|
+
*
|
|
1541
|
+
* Backoff schedule: ~1s, ~2s, ~4s, ~8s, ~16s, ~32s (total ~63s max)
|
|
1542
|
+
*
|
|
1543
|
+
* @param client - Connected agent client
|
|
1544
|
+
* @param request - Scan request to send
|
|
1545
|
+
* @param options - Execution options
|
|
1546
|
+
* @returns Promise resolving to scan response
|
|
1547
|
+
* @throws Error if scan fails after all retries
|
|
1548
|
+
*/
|
|
1549
|
+
async function executeScanRequestWithRetry(client, request, options) {
|
|
1550
|
+
const { showSpinner, spinner } = options;
|
|
1551
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) try {
|
|
1552
|
+
return await executeScanRequest(client, request, options);
|
|
1553
|
+
} catch (error) {
|
|
1554
|
+
if (!isCapacityError(error)) throw error;
|
|
1555
|
+
if (attempt === MAX_RETRIES - 1) throw error;
|
|
1556
|
+
const jitter = .7 + .6 * Math.random();
|
|
1557
|
+
const delay = BASE_DELAY_MS * Math.pow(2, attempt) * jitter;
|
|
1558
|
+
logger.debug(`Server busy, retrying in ${Math.round(delay / 1e3)}s (attempt ${attempt + 1}/${MAX_RETRIES})`);
|
|
1559
|
+
if (showSpinner && spinner) {
|
|
1560
|
+
const originalText = spinner.text;
|
|
1561
|
+
spinner.text = `Server busy, retrying in ${Math.round(delay / 1e3)}s...`;
|
|
1562
|
+
await sleepWithAbort(delay, options.abortController.signal);
|
|
1563
|
+
spinner.text = originalText;
|
|
1564
|
+
} else await sleepWithAbort(delay, options.abortController.signal);
|
|
1565
|
+
}
|
|
1566
|
+
throw new Error("Scan failed: exceeded maximum retries");
|
|
1567
|
+
}
|
|
1541
1568
|
//#endregion
|
|
1542
1569
|
//#region src/codeScan/scanner/index.ts
|
|
1543
1570
|
/**
|
|
@@ -1570,13 +1597,13 @@ async function executeScan(repoPath, options) {
|
|
|
1570
1597
|
const guidance = resolveGuidance(options, config);
|
|
1571
1598
|
const absoluteRepoPath = path.resolve(repoPath);
|
|
1572
1599
|
if (!options.json) {
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
if (config.diffsOnly)
|
|
1576
|
-
else
|
|
1577
|
-
|
|
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("");
|
|
1578
1605
|
}
|
|
1579
|
-
|
|
1606
|
+
logger.debug(`Repository: ${absoluteRepoPath}`);
|
|
1580
1607
|
const cleanupRefs = {
|
|
1581
1608
|
repoPath: absoluteRepoPath,
|
|
1582
1609
|
socket: null,
|
|
@@ -1586,7 +1613,7 @@ async function executeScan(repoPath, options) {
|
|
|
1586
1613
|
abortController: null
|
|
1587
1614
|
};
|
|
1588
1615
|
registerCleanupHandlers(cleanupRefs);
|
|
1589
|
-
const isWebUI = Boolean(
|
|
1616
|
+
const isWebUI = Boolean(state.webUI);
|
|
1590
1617
|
const spinner = createSpinner({
|
|
1591
1618
|
json: options.json || false,
|
|
1592
1619
|
isWebUI,
|
|
@@ -1603,7 +1630,7 @@ async function executeScan(repoPath, options) {
|
|
|
1603
1630
|
if (!parsed) throw new Error(`Invalid --github-pr format: "${options.githubPr}". Expected format: owner/repo#number (e.g., promptfoo/promptfoo#123)`);
|
|
1604
1631
|
parsedPR = parsed;
|
|
1605
1632
|
}
|
|
1606
|
-
if (!showSpinner)
|
|
1633
|
+
if (!showSpinner) logger.debug("Connecting to server...");
|
|
1607
1634
|
client = await createAgentClient({
|
|
1608
1635
|
agent: "code-scan",
|
|
1609
1636
|
host: resolveApiHost(options, config),
|
|
@@ -1618,7 +1645,7 @@ async function executeScan(repoPath, options) {
|
|
|
1618
1645
|
cleanupRefs.mcpProcess = mcpProcess;
|
|
1619
1646
|
cleanupRefs.mcpBridge = mcpBridge;
|
|
1620
1647
|
}
|
|
1621
|
-
|
|
1648
|
+
logger.debug("Processing git diff...");
|
|
1622
1649
|
const simpleGit = (await import("simple-git")).default;
|
|
1623
1650
|
const git = simpleGit(absoluteRepoPath);
|
|
1624
1651
|
if (!options.compare) await validateOnBranch(git);
|
|
@@ -1629,11 +1656,11 @@ async function executeScan(repoPath, options) {
|
|
|
1629
1656
|
baseBranch = branches.all.includes("main") || branches.all.includes("origin/main") ? "main" : branches.all.includes("master") || branches.all.includes("origin/master") ? "master" : "main";
|
|
1630
1657
|
}
|
|
1631
1658
|
const compareRef = options.compare || "HEAD";
|
|
1632
|
-
|
|
1659
|
+
logger.debug(`Comparing: ${baseBranch}...${compareRef}`);
|
|
1633
1660
|
const files = await processDiff(absoluteRepoPath, baseBranch, compareRef);
|
|
1634
1661
|
const includedFiles = files.filter((f) => !f.skipReason && f.patch);
|
|
1635
1662
|
const skippedFiles = files.filter((f) => f.skipReason);
|
|
1636
|
-
|
|
1663
|
+
logger.debug(`Files changed: ${files.length} (${includedFiles.length} included, ${skippedFiles.length} skipped)`);
|
|
1637
1664
|
if (includedFiles.length === 0) {
|
|
1638
1665
|
const msg = "No files to scan";
|
|
1639
1666
|
if (options.json) {
|
|
@@ -1642,18 +1669,18 @@ async function executeScan(repoPath, options) {
|
|
|
1642
1669
|
comments: [],
|
|
1643
1670
|
review: msg
|
|
1644
1671
|
};
|
|
1645
|
-
|
|
1672
|
+
logger.info(JSON.stringify(response, null, 2));
|
|
1646
1673
|
} else if (showSpinner && spinner) spinner.succeed(msg);
|
|
1647
|
-
else
|
|
1648
|
-
|
|
1674
|
+
else logger.info(msg);
|
|
1675
|
+
state.postActionCallback = async () => {
|
|
1649
1676
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1650
1677
|
process.exitCode = 0;
|
|
1651
1678
|
};
|
|
1652
1679
|
return;
|
|
1653
1680
|
}
|
|
1654
1681
|
const metadata = await extractMetadata(absoluteRepoPath, baseBranch, compareRef);
|
|
1655
|
-
|
|
1656
|
-
|
|
1682
|
+
logger.debug(`Compare ref: ${metadata.branch}`);
|
|
1683
|
+
logger.debug(`Commits: ${metadata.commitMessages.length}`);
|
|
1657
1684
|
let pullRequest = void 0;
|
|
1658
1685
|
if (parsedPR) {
|
|
1659
1686
|
const currentCommit = await git.revparse(["HEAD"]);
|
|
@@ -1663,11 +1690,11 @@ async function executeScan(repoPath, options) {
|
|
|
1663
1690
|
number: parsedPR.number,
|
|
1664
1691
|
sha: currentCommit.trim()
|
|
1665
1692
|
};
|
|
1666
|
-
|
|
1693
|
+
logger.debug(`GitHub PR context: ${parsedPR.owner}/${parsedPR.repo}#${parsedPR.number} (${pullRequest.sha.substring(0, 7)})`);
|
|
1667
1694
|
}
|
|
1668
|
-
if (!showSpinner)
|
|
1695
|
+
if (!showSpinner) logger.debug("Scanning code...");
|
|
1669
1696
|
const scanRequest = buildScanRequest(files, metadata, config, sessionId, pullRequest, guidance);
|
|
1670
|
-
const scanResponse = await
|
|
1697
|
+
const scanResponse = await executeScanRequestWithRetry(client, scanRequest, {
|
|
1671
1698
|
showSpinner,
|
|
1672
1699
|
spinner,
|
|
1673
1700
|
abortController
|
|
@@ -1682,8 +1709,8 @@ async function executeScan(repoPath, options) {
|
|
|
1682
1709
|
if (errorMessage.includes("Fork PR scanning not authorized")) {
|
|
1683
1710
|
const msg = "Fork PR scanning requires maintainer approval. See PR comment for options.";
|
|
1684
1711
|
if (showSpinner && spinner) spinner.succeed(msg);
|
|
1685
|
-
else
|
|
1686
|
-
|
|
1712
|
+
else logger.info(msg);
|
|
1713
|
+
state.postActionCallback = async () => {
|
|
1687
1714
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1688
1715
|
process.exitCode = 0;
|
|
1689
1716
|
};
|
|
@@ -1691,26 +1718,26 @@ async function executeScan(repoPath, options) {
|
|
|
1691
1718
|
}
|
|
1692
1719
|
const msg = `Scan failed: ${errorMessage}`;
|
|
1693
1720
|
if (showSpinner && spinner) spinner.fail(msg);
|
|
1694
|
-
else
|
|
1695
|
-
|
|
1721
|
+
else logger.error(msg);
|
|
1722
|
+
state.postActionCallback = async () => {
|
|
1696
1723
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
1697
1724
|
if (error instanceof Error && error.message === "cancelled by user") process.exitCode = 130;
|
|
1698
1725
|
else process.exitCode = 1;
|
|
1699
1726
|
};
|
|
1700
1727
|
} finally {
|
|
1701
1728
|
if (mcpBridge) await mcpBridge.disconnect().catch(() => {
|
|
1702
|
-
|
|
1729
|
+
logger.debug("MCP bridge cleanup completed");
|
|
1703
1730
|
});
|
|
1704
1731
|
if (mcpProcess) await stopFilesystemMcpServer(mcpProcess).catch(() => {
|
|
1705
|
-
|
|
1732
|
+
logger.debug("MCP server cleanup completed");
|
|
1706
1733
|
});
|
|
1707
1734
|
if (client) {
|
|
1708
1735
|
client.disconnect();
|
|
1709
|
-
|
|
1736
|
+
logger.debug("Agent client disconnected");
|
|
1710
1737
|
}
|
|
1711
1738
|
}
|
|
1712
1739
|
}
|
|
1713
|
-
|
|
1714
1740
|
//#endregion
|
|
1715
1741
|
export { executeScan };
|
|
1716
|
-
|
|
1742
|
+
|
|
1743
|
+
//# sourceMappingURL=scanner-J8CA3LsV.js.map
|