agentic-qe 3.15.11 → 3.15.13
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/.claude/hooks/aqe-hook.cjs +38 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +267 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-KCQDVYY2.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-6RRQWMNE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-AOH6TV7W.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-2P54SF5N.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +2 -0
- package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-NSVFCAF5.js} +2 -2
- package/dist/cli/chunks/{arena-36DTATJV.js → arena-X6MOGQHA.js} +4 -4
- package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-27DJLQNM.js} +3 -3
- package/dist/cli/chunks/base-WCACU3FN.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BU5GXILS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-GTQNHHZS.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-5CLULOCU.js} +2 -2
- package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-R4DMU3LN.js} +2 -2
- package/dist/cli/chunks/browser-workflow-G6IASEAP.js +2 -0
- package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-2G7TVT6W.js} +2 -2
- package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-32ZMWEP3.js} +2 -2
- package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-3AN5TNGD.js} +3 -3
- package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-3LJ7LQMV.js} +1 -1
- package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-3QZEGE67.js} +1 -1
- package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-3RZV5DGO.js} +2 -2
- package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-3Y2ROSCL.js} +2 -2
- package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-3Y7TJFHU.js} +2 -2
- package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-3YNLWPBF.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-42J34YG4.js} +2 -2
- package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-4OVC4RIL.js} +1 -1
- package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-526QYFJU.js} +2 -2
- package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-5FKWCZNF.js} +2 -2
- package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-5K26BEYB.js} +2 -2
- package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-5MDERQH3.js} +1 -1
- package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-5VMAV6T6.js} +1 -1
- package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5ZGM3RMH.js} +1 -1
- package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-6KATY3KS.js} +2 -2
- package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-6Z7PRBSG.js} +2 -2
- package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-72ASBE35.js} +7 -7
- package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-756CGMEH.js} +1 -1
- package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-75RDHBAX.js} +3 -3
- package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-7CMTY45A.js} +2 -2
- package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-7JUC2MVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-7NA7JXNB.js} +2 -2
- package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-7PLIEBY7.js} +2 -2
- package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-7YTGHGK4.js} +2 -2
- package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-A64JFBWI.js} +2 -2
- package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-AL6FBH3E.js} +2 -2
- package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-AQSVJNEH.js} +2 -2
- package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-ARJW4I2O.js} +2 -2
- package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-ASQYASNV.js} +1 -1
- package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-BEGR4D6N.js} +2 -2
- package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-BK577VL7.js} +2 -2
- package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-BLSLEVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-BTVEYBW2.js} +2 -2
- package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-C6JTLKG7.js} +5 -5
- package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-C7JM7CD3.js} +2 -2
- package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-CCMKSHAT.js} +2 -2
- package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-CE7B5LU7.js} +1 -1
- package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-CM4LSLKR.js} +2 -2
- package/dist/cli/chunks/chunk-CRWPZT74.js +62 -0
- package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-CT6SAVXQ.js} +2 -2
- package/dist/cli/chunks/chunk-CV77DMDQ.js +2 -0
- package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-DFUASIKA.js} +2 -2
- package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-DLD7RUZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-DNDL7SOS.js} +2 -2
- package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-DVGRPK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-E56B6IDX.js} +2 -2
- package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-E7CLYGS7.js} +1 -1
- package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-EXGMJFAT.js} +1 -1
- package/dist/cli/chunks/chunk-F3YS57NF.js +21 -0
- package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-FZ76G4QJ.js} +1 -1
- package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-G2Q66Z23.js} +2 -2
- package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-G6WDYBLQ.js} +1 -1
- package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-G77ERMUD.js} +1 -1
- package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-GB6HBNH2.js} +2 -2
- package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-GHM6MQNK.js} +2 -2
- package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-GHY6Z6KO.js} +5 -5
- package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-GII6UM3F.js} +1 -1
- package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-GU5HNCWI.js} +1 -1
- package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-H4GG2NLO.js} +2 -2
- package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-H4H2YSFH.js} +1 -1
- package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-HD7YIFOI.js} +2 -2
- package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-HOAJUIBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-HQZGPJYG.js} +2 -2
- package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-HZ5NXFXH.js} +2 -2
- package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-I3C7JOXC.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-IC3TQEOA.js} +1 -1
- package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-IJUHSJ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-J2ZIFFM6.js} +2 -2
- package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-JGZ722G3.js} +2 -2
- package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-JQGMW45H.js} +1 -1
- package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-JRRXCODW.js} +2 -2
- package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-K3TLLJMX.js} +1 -1
- package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-K4CZA77U.js} +2 -2
- package/dist/cli/chunks/chunk-K65CGKLD.js +8 -0
- package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-KADFXPPN.js} +2 -2
- package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-KB56CPU4.js} +2 -2
- package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-KCW47QR5.js} +1 -1
- package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-KDNJ4F3P.js} +2 -2
- package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-KDVZND5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-KUAKV3IW.js} +1 -1
- package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-KV4T4MXK.js} +2 -2
- package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-KWYH3FI4.js} +1 -1
- package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-LFJALJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-LL7LDPXS.js} +1 -1
- package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-LUZNKJE6.js} +3 -3
- package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-LWR3FV3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-LZYQHVD4.js} +2 -2
- package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-M6AAGIG7.js} +1 -1
- package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-MAMQA43L.js} +1 -1
- package/dist/cli/chunks/chunk-MB46UBGY.js +3 -0
- package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-MFW5HSG4.js} +2 -2
- package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-MGZ5FJUW.js} +2 -2
- package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-MVVB7C2E.js} +410 -410
- package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-N4CYAKOX.js} +2 -2
- package/dist/cli/chunks/chunk-NT4DBXSX.js +2 -0
- package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-NU3W5WFT.js} +2 -2
- package/dist/cli/chunks/chunk-NURIILUB.js +2 -0
- package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-NW7IBHJA.js} +4 -4
- package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-NZ3GUMB2.js} +2 -2
- package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-NZD4DPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-O6FGXMHD.js} +1 -1
- package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-OCAEXYFA.js} +2 -2
- package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-OFACHK5O.js} +2 -2
- package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-P7A4NKTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-PB6J6HAA.js} +2 -2
- package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-PHP5UBT4.js} +2 -2
- package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-PIDQVU3L.js} +2 -2
- package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-PSFSPGUD.js} +2 -2
- package/dist/cli/chunks/chunk-PT4FMJPQ.js +3 -0
- package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-Q3UDLV5Z.js} +1 -1
- package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-QDEJ4CI2.js} +2 -2
- package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-QPNG5ZN2.js} +2 -2
- package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-R7SYRCRP.js} +1 -1
- package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-RF7HWBHN.js} +2 -2
- package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-RFNW2LGD.js} +2 -2
- package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-S5AZCIZS.js} +2 -2
- package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-SE4VNN4I.js} +3 -3
- package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-SG3NX7QE.js} +2 -2
- package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-SSU73QAX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-SVLQRAMF.js} +1 -1
- package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-SYV2V3PL.js} +4 -4
- package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-T3PGQFDI.js} +2 -2
- package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-TCBBNUBP.js} +17 -17
- package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-TOQWL2ZF.js} +2 -2
- package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-TSQC2KKZ.js} +4 -4
- package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-TWDW32W2.js} +2 -2
- package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-TWJTK4CC.js} +2 -2
- package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-U2FUXDDJ.js} +3 -3
- package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-UDQSYWVF.js} +1 -1
- package/dist/cli/chunks/chunk-UOC3O6RP.js +5 -0
- package/dist/cli/chunks/chunk-UT2VZ33P.js +2 -0
- package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-UTRV7T2N.js} +2 -2
- package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-UXZSUMEA.js} +2 -2
- package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-VRHRBAEM.js} +1 -1
- package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-VRVMIPTM.js} +2 -2
- package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-VTDFVFST.js} +2 -2
- package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-VTOBUZL6.js} +2 -2
- package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-VU5TBX2V.js} +2 -2
- package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-W26B7ERY.js} +1 -1
- package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-W2QWSQVE.js} +2 -2
- package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-W3INMZZ6.js} +1 -1
- package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-W3PPFHI5.js} +59 -59
- package/dist/cli/chunks/chunk-WKGTGOYS.js +13 -0
- package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-WNQS4WTS.js} +2 -2
- package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-WO274FRI.js} +2 -2
- package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-WOCGL4QP.js} +2 -2
- package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-WQL7WCIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-X2Z7F4EU.js} +2 -2
- package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-X7N2JF2X.js} +2 -2
- package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-XEAEYC6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-XNBOGCF3.js} +2 -2
- package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-XPRVF4YE.js} +2 -2
- package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-YBQH2VOP.js} +2 -2
- package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-YQFLQE53.js} +2 -2
- package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-YSZ5OE3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-YXRASAPI.js} +2 -2
- package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-YZEXYO4W.js} +1 -1
- package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-YZWBNBTW.js} +2 -2
- package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-ZAKQLAHT.js} +1 -1
- package/dist/cli/chunks/ci-ENOASTYB.js +81 -0
- package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-B26OXHQM.js} +2 -2
- package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-JTCLLNOQ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-23JMFNM5.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-ON6L462G.js} +2 -2
- package/dist/cli/chunks/client-TV3V2YZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-OWQ4D2FQ.js} +2 -2
- package/dist/cli/chunks/{code-LV2HAGJY.js → code-2ZRL7SEU.js} +19 -18
- package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-JXSQVM67.js} +2 -2
- package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-7LXZYBSQ.js} +2 -2
- package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-C2LR623C.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-TGQLHCYJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-RUGD24D2.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-ZLFVLEJP.js} +2 -2
- package/dist/cli/chunks/core-handlers-PZT4OLWR.js +2 -0
- package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-RT4QL745.js} +2 -2
- package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-NV3C4IMM.js} +11 -10
- package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +2 -0
- package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-LJKLNFF6.js} +2 -2
- package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-BMDXCQT5.js} +3 -3
- package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-FBH3IRYN.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-JGDED55I.js} +2 -2
- package/dist/cli/chunks/{detect-TYR7HT23.js → detect-SZIHIVCJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-FV3KWXQ6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-GI5JWQOV.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-BUWY36TL.js} +2 -2
- package/dist/cli/chunks/domain-transfer-GCY7W5DA.js +2 -0
- package/dist/cli/chunks/dream-TRFBGDSQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-GPRR3ZGD.js} +2 -2
- package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-XPB3IGAP.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-2E554UB3.js} +3 -3
- package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-ZSMWZPUC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-GIWVDVVC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-N7EOGE5P.js} +2 -2
- package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +2 -0
- package/dist/cli/chunks/fleet-HCHDOUCX.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-CZNCNXXZ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-6YUIF2YQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +2 -0
- package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-J3M3IK24.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-ULGTGDZW.js} +2 -2
- package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-C4BUGYUQ.js} +28 -28
- package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-WINGVMPG.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-GADMWKAU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +2 -0
- package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-K2T4QWAO.js} +2 -2
- package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-PCZTDZYI.js} +6 -6
- package/dist/cli/chunks/init-wizard-TZDJQK3U.js +2 -0
- package/dist/cli/chunks/kernel-Y6RRIOKW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-XENXNEIU.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-3PG2TJ67.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +2 -0
- package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-6KDH7FK4.js} +3 -3
- package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-RKVDEWU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +2 -0
- package/dist/cli/chunks/{load-YATHI72E.js → load-ITHC564X.js} +2 -2
- package/dist/cli/chunks/load-test-RUF7DZA5.js +2 -0
- package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-TCL5UW3N.js} +2 -2
- package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-BKDAY2N2.js} +5 -5
- package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +2 -0
- package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-WN4FXFOA.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-VHAT7ZPF.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-E3VM3EEY.js} +2 -2
- package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-BMQ6X762.js} +58 -20
- package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-GOOR2BV5.js} +2 -2
- package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-5NSFQQIX.js} +2 -2
- package/dist/cli/chunks/{platform-5WONJSUX.js → platform-SQM34J5G.js} +2 -2
- package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-UQJZRMZG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-WMDJOL4S.js} +2 -2
- package/dist/cli/chunks/project-root-IO5KRNGL.js +2 -0
- package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +2 -0
- package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-OBDCVY6X.js} +2 -2
- package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-XDC7I4XT.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +2 -0
- package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-L4GQ6WX4.js} +2 -2
- package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-MJG66LKN.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +2 -0
- package/dist/cli/chunks/real-embeddings-HW4G2LWL.js +2 -0
- package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-FC7JOJ2C.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-KWS4CEIC.js} +2 -2
- package/dist/cli/chunks/router-YUO3I7RU.js +2 -0
- package/dist/cli/chunks/routing-feedback-36SLQGJE.js +2 -0
- package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-QF4WVB2S.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-2MTCOUK6.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-BREJCXWN.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-KKC6HOJD.js} +2 -2
- package/dist/cli/chunks/safe-db-4RRIGRXD.js +2 -0
- package/dist/cli/chunks/schedule-25RTO4DQ.js +2 -0
- package/dist/cli/chunks/scheduler-BPIOJZ5P.js +2 -0
- package/dist/cli/chunks/{security-CUEA3UIM.js → security-OSAE7VAP.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-COUOS665.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-YXMPZKQE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-E6JBMOIL.js} +2 -2
- package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-AFTCIYIX.js} +2 -2
- package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-2FROCEI4.js} +2 -2
- package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-VAYTOWDC.js} +2 -2
- package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-YIQYOFGW.js} +2 -2
- package/dist/cli/chunks/task-handler-KVQHDEX3.js +62 -0
- package/dist/cli/chunks/task-handlers-MVVECQA6.js +9 -0
- package/dist/cli/chunks/{test-D2XDJNDX.js → test-5JSVTOMY.js} +4 -4
- package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +2 -0
- package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-HBOHVLI3.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-5VEPTPFA.js} +2 -2
- package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-TBJHDLY6.js} +2 -2
- package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-VAWYMHMZ.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +2 -0
- package/dist/cli/chunks/{types-5YEMGPSQ.js → types-R5SDZU2E.js} +2 -2
- package/dist/cli/chunks/unified-memory-TLGSSLMI.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +2 -0
- package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +2 -0
- package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-K5PIHXRB.js} +2 -2
- package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-RPTS7RYJ.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-B2ZL556X.js} +2 -2
- package/dist/cli/chunks/visual-security-6Q44XNLB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-K4DUJC32.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-OK2AJN35.js} +2 -2
- package/dist/cli/chunks/witness-chain-KDOMXDQX.js +2 -0
- package/dist/cli/chunks/witness-chain-N3OY2RMH.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-L6Y5RFXR.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-N4CW7FZX.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-TDNPS3WD.js} +2 -2
- package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-XRZA3YCY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +2 -0
- package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-5JIFWKN6.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet-run.d.ts +12 -0
- package/dist/cli/commands/fleet-run.js +175 -0
- package/dist/cli/commands/fleet.js +2 -117
- package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
- package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +26 -0
- package/dist/cli/utils/coverage-verdict.d.ts +11 -2
- package/dist/cli/utils/coverage-verdict.js +26 -6
- package/dist/cli/utils/fleet-operation.d.ts +10 -2
- package/dist/cli/utils/fleet-operation.js +20 -3
- package/dist/cli/utils/fleet-result.d.ts +20 -4
- package/dist/cli/utils/fleet-result.js +32 -21
- package/dist/cli/utils/fleet-shard.d.ts +36 -0
- package/dist/cli/utils/fleet-shard.js +110 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
- package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
- package/dist/coordination/handlers/coverage-collection.js +2 -1
- package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
- package/dist/coordination/handlers/coverage-evidence.js +159 -0
- package/dist/coordination/handlers/coverage-handlers.js +16 -3
- package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
- package/dist/coordination/handlers/coverage-scope.js +321 -0
- package/dist/coordination/handlers/coverage-target.d.ts +9 -0
- package/dist/coordination/handlers/coverage-target.js +15 -5
- package/dist/coordination/handlers/handler-types.d.ts +2 -2
- package/dist/coordination/handlers/handler-utils.d.ts +11 -0
- package/dist/coordination/handlers/handler-utils.js +22 -8
- package/dist/coordination/handlers/misc-handlers.js +5 -2
- package/dist/coordination/handlers/quality-handlers.js +2 -2
- package/dist/coordination/handlers/security-handlers.js +12 -2
- package/dist/coordination/protocols/security-audit.js +11 -1
- package/dist/coordination/task-executor.js +7 -2
- package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
- package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
- package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
- package/dist/domains/code-intelligence/coordinator.js +24 -27
- package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +51 -5
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +144 -78
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +10 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +29 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +11 -3
- package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
- package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
- package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
- package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
- package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
- package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
- package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
- package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
- package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
- package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
- package/dist/domains/quality-assessment/coordinator.js +10 -4
- package/dist/domains/quality-assessment/interfaces.d.ts +2 -0
- package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
- package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
- package/dist/domains/security-compliance/index.d.ts +1 -1
- package/dist/domains/security-compliance/interfaces.d.ts +46 -5
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
- package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
- package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
- package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
- package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
- package/dist/domains/security-compliance/services/scanners/index.js +1 -1
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
- package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
- package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
- package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
- package/dist/domains/security-compliance/services/security-auditor.js +106 -65
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +33 -27
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
- package/dist/domains/test-execution/services/test-executor.js +16 -4
- package/dist/domains/visual-accessibility/coordinator.js +34 -9
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
- package/dist/domains/visual-accessibility/plugin.js +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
- package/dist/init/phases/10-workers.js +42 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +23 -1
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +50 -15
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +7 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +8 -0
- package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
- package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
- package/dist/learning/embedder-endpoint-client.d.ts +8 -0
- package/dist/learning/embedder-endpoint-client.js +20 -0
- package/dist/learning/embedder-recovery.d.ts +63 -0
- package/dist/learning/embedder-recovery.js +94 -0
- package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
- package/dist/learning/qe-reasoning-bank.d.ts +21 -0
- package/dist/learning/qe-reasoning-bank.js +54 -8
- package/dist/learning/real-embeddings.d.ts +23 -0
- package/dist/learning/real-embeddings.js +69 -2
- package/dist/learning/real-qe-reasoning-bank.d.ts +24 -4
- package/dist/learning/real-qe-reasoning-bank.js +58 -20
- package/dist/logging/redaction.js +142 -12
- package/dist/mcp/bundle.js +509 -497
- package/dist/mcp/daemon-mode.d.ts +126 -0
- package/dist/mcp/daemon-mode.js +257 -0
- package/dist/mcp/entry.d.ts +4 -0
- package/dist/mcp/entry.js +50 -2
- package/dist/mcp/handlers/domain-handler-configs.d.ts +8 -0
- package/dist/mcp/handlers/domain-handler-configs.js +14 -2
- package/dist/mcp/handlers/handler-factory.js +3 -0
- package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
- package/dist/mcp/handlers/model-route-handlers.js +139 -0
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +94 -3
- package/dist/mcp/handlers/task-handlers.d.ts +3 -242
- package/dist/mcp/handlers/task-handlers.js +11 -788
- package/dist/mcp/handlers/task-inference.d.ts +26 -0
- package/dist/mcp/handlers/task-inference.js +156 -0
- package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
- package/dist/mcp/handlers/task-learning-handlers.js +230 -0
- package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
- package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
- package/dist/mcp/protocol-server.js +15 -2
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +9 -0
- package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
- package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
- package/dist/mcp/tools/coverage-analysis/index.js +8 -2
- package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
- package/dist/mcp/tools/visual-accessibility/index.js +29 -13
- package/dist/mcp/types.d.ts +14 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/events/domain-events.d.ts +2 -0
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/metrics/code-metrics.js +21 -3
- package/dist/shared/parsers/typescript-parser.d.ts +6 -0
- package/dist/shared/parsers/typescript-parser.js +13 -1
- package/dist/shared/types/index.js +3 -1
- package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
- package/package.json +3 -3
- package/dist/cli/chunks/adapter-V4GSGOOK.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +0 -2
- package/dist/cli/chunks/base-AK7BXBX2.js +0 -2
- package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +0 -2
- package/dist/cli/chunks/chunk-2DTX7YAZ.js +0 -6
- package/dist/cli/chunks/chunk-72ZBJD2E.js +0 -3
- package/dist/cli/chunks/chunk-EBPJY4DI.js +0 -3
- package/dist/cli/chunks/chunk-H43AFUKL.js +0 -2
- package/dist/cli/chunks/chunk-HJ3XNTTJ.js +0 -2
- package/dist/cli/chunks/chunk-IO5537OM.js +0 -2
- package/dist/cli/chunks/chunk-IW6WDGHM.js +0 -2
- package/dist/cli/chunks/chunk-K2HBNYAZ.js +0 -62
- package/dist/cli/chunks/chunk-LRL56ZYL.js +0 -21
- package/dist/cli/chunks/chunk-VLD7Z2ED.js +0 -13
- package/dist/cli/chunks/chunk-VO3DRK4P.js +0 -3
- package/dist/cli/chunks/ci-6GUFAZMJ.js +0 -81
- package/dist/cli/chunks/client-HL2COSFM.js +0 -2
- package/dist/cli/chunks/core-handlers-IX7ATLM6.js +0 -2
- package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +0 -2
- package/dist/cli/chunks/domain-transfer-DOBI67K6.js +0 -2
- package/dist/cli/chunks/dream-T6EP7B3F.js +0 -2
- package/dist/cli/chunks/file-discovery-JYMVTDMU.js +0 -2
- package/dist/cli/chunks/fleet-FVAUMKUT.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +0 -2
- package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +0 -2
- package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +0 -2
- package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +0 -2
- package/dist/cli/chunks/init-wizard-FUC7KDVX.js +0 -2
- package/dist/cli/chunks/kernel-ZCPMCVMW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +0 -2
- package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +0 -2
- package/dist/cli/chunks/load-test-ZHQ2MUGO.js +0 -2
- package/dist/cli/chunks/memory-backend-AAMQG6WH.js +0 -2
- package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +0 -2
- package/dist/cli/chunks/project-root-7QL4KP5C.js +0 -2
- package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +0 -2
- package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +0 -2
- package/dist/cli/chunks/real-embeddings-RQRVOKVM.js +0 -2
- package/dist/cli/chunks/router-LQB5SWAF.js +0 -2
- package/dist/cli/chunks/routing-feedback-OEEXA55N.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +0 -2
- package/dist/cli/chunks/safe-db-PE6G3L55.js +0 -2
- package/dist/cli/chunks/schedule-OLKQ6QYW.js +0 -2
- package/dist/cli/chunks/scheduler-LSGBDFAT.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +0 -2
- package/dist/cli/chunks/task-handler-TFKVUTNF.js +0 -60
- package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +0 -9
- package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +0 -2
- package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +0 -2
- package/dist/cli/chunks/unified-persistence-UCV7YETW.js +0 -2
- package/dist/cli/chunks/visual-security-ZLXRIQZV.js +0 -2
- package/dist/cli/chunks/witness-chain-CVIWYTD2.js +0 -2
- package/dist/cli/chunks/witness-chain-VBKORKOX.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +0 -2
|
@@ -3,24 +3,25 @@
|
|
|
3
3
|
* XSS and SQL injection testing utilities
|
|
4
4
|
*/
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { probe } from './dast-requests.js';
|
|
6
7
|
// ============================================================================
|
|
7
8
|
// Injection Testing
|
|
8
9
|
// ============================================================================
|
|
9
10
|
/**
|
|
10
11
|
* Test for XSS vulnerabilities
|
|
11
12
|
*/
|
|
12
|
-
export async function testXSS(targetUrl, parsedUrl, paramName, payloads, vulnerabilities) {
|
|
13
|
+
export async function testXSS(targetUrl, parsedUrl, paramName, payloads, vulnerabilities, failures) {
|
|
13
14
|
for (const xss of payloads) {
|
|
14
15
|
const testParams = new URLSearchParams(parsedUrl.search);
|
|
15
16
|
testParams.set(paramName, xss.payload);
|
|
16
17
|
const testUrl = `${parsedUrl.origin}${parsedUrl.pathname}?${testParams.toString()}`;
|
|
17
|
-
const response = await
|
|
18
|
+
const response = await probe(testUrl, {
|
|
18
19
|
method: 'GET',
|
|
19
20
|
headers: { 'User-Agent': 'AgenticQE-DAST-Scanner/3.0' },
|
|
20
21
|
signal: AbortSignal.timeout(5000),
|
|
21
|
-
});
|
|
22
|
-
if (response
|
|
23
|
-
const text =
|
|
22
|
+
}, failures);
|
|
23
|
+
if (response?.ok) {
|
|
24
|
+
const text = response.text;
|
|
24
25
|
const escapedPayload = xss.payload
|
|
25
26
|
.replace(/&/g, '&')
|
|
26
27
|
.replace(/</g, '<')
|
|
@@ -48,7 +49,7 @@ export async function testXSS(targetUrl, parsedUrl, paramName, payloads, vulnera
|
|
|
48
49
|
/**
|
|
49
50
|
* Test for SQL injection vulnerabilities
|
|
50
51
|
*/
|
|
51
|
-
export async function testSQLi(targetUrl, parsedUrl, paramName, payloads, vulnerabilities) {
|
|
52
|
+
export async function testSQLi(targetUrl, parsedUrl, paramName, payloads, vulnerabilities, failures) {
|
|
52
53
|
const sqlErrorPatterns = [
|
|
53
54
|
/SQL syntax.*MySQL/i,
|
|
54
55
|
/Warning.*mysql/i,
|
|
@@ -63,12 +64,15 @@ export async function testSQLi(targetUrl, parsedUrl, paramName, payloads, vulner
|
|
|
63
64
|
const testParams = new URLSearchParams(parsedUrl.search);
|
|
64
65
|
testParams.set(paramName, sqli.payload);
|
|
65
66
|
const testUrl = `${parsedUrl.origin}${parsedUrl.pathname}?${testParams.toString()}`;
|
|
66
|
-
|
|
67
|
+
// SQL errors often come back as HTTP 500: that body is analysed.
|
|
68
|
+
const response = await probe(testUrl, {
|
|
67
69
|
method: 'GET',
|
|
68
70
|
headers: { 'User-Agent': 'AgenticQE-DAST-Scanner/3.0' },
|
|
69
71
|
signal: AbortSignal.timeout(5000),
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
+
}, failures, { analyzeServerErrors: true });
|
|
73
|
+
if (!response)
|
|
74
|
+
continue;
|
|
75
|
+
const text = response.text;
|
|
72
76
|
for (const pattern of sqlErrorPatterns) {
|
|
73
77
|
if (pattern.test(text)) {
|
|
74
78
|
vulnerabilities.push({
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - DAST request outcomes (#1092, #1135)
|
|
3
|
+
* Classifies what a DAST request did not answer, so a failed or partial scan
|
|
4
|
+
* is reported as such and never as a scan that found nothing.
|
|
5
|
+
*/
|
|
6
|
+
import type { DASTRequestFailure } from './scanner-types.js';
|
|
7
|
+
/** Error carrying a DAST failure code. */
|
|
8
|
+
export type DASTError = Error & {
|
|
9
|
+
code: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function dastError(message: string, code: string, cause?: unknown): DASTError;
|
|
12
|
+
export declare function isDastError(error: unknown): error is DASTError;
|
|
13
|
+
/**
|
|
14
|
+
* The scan subject must be an http(s) URL. Anything else is a validation
|
|
15
|
+
* error, not a completed scan with a synthetic finding (#1135).
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseDastTarget(targetUrl: string): URL;
|
|
18
|
+
/**
|
|
19
|
+
* A response status that says nothing about the target's security: the request
|
|
20
|
+
* was refused, throttled or not served. Findings from such a page would be the
|
|
21
|
+
* headers of the error page (#1092, #1135).
|
|
22
|
+
*/
|
|
23
|
+
export declare function unansweredStatus(status: number): {
|
|
24
|
+
code: string;
|
|
25
|
+
label: string;
|
|
26
|
+
} | null;
|
|
27
|
+
/** Throws when the initial response cannot be scanned. */
|
|
28
|
+
export declare function assertScannableResponse(status: number): void;
|
|
29
|
+
/** Transport failure classification; TLS failures are told apart from a closed port (#1135). */
|
|
30
|
+
export declare function classifyRequestError(error: unknown): {
|
|
31
|
+
code: string;
|
|
32
|
+
reason: string;
|
|
33
|
+
};
|
|
34
|
+
/** Transport failures are execution errors, not absence of vulnerabilities. */
|
|
35
|
+
export declare function dastRequestFailure(error: unknown): DASTError;
|
|
36
|
+
export interface ProbeResponse {
|
|
37
|
+
readonly status: number;
|
|
38
|
+
readonly ok: boolean;
|
|
39
|
+
readonly headers: Headers;
|
|
40
|
+
readonly text: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ProbeOptions {
|
|
43
|
+
/** A 5xx body is analysed (SQL error pages), not counted as unanswered. */
|
|
44
|
+
readonly analyzeServerErrors?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A follow-up probe. When the target does not answer it (transport failure,
|
|
48
|
+
* timeout, 407/408/429, or 5xx unless `analyzeServerErrors`), the failure is
|
|
49
|
+
* recorded in `failures` and null is returned so the remaining probes still
|
|
50
|
+
* run and the scan is reported incomplete (#1135). Without `failures`, it throws.
|
|
51
|
+
*/
|
|
52
|
+
export declare function probe(url: string, init: RequestInit, failures?: DASTRequestFailure[], options?: ProbeOptions): Promise<ProbeResponse | null>;
|
|
53
|
+
export declare function summarizeFailures(failures: readonly DASTRequestFailure[]): string;
|
|
54
|
+
//# sourceMappingURL=dast-requests.d.ts.map
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - DAST request outcomes (#1092, #1135)
|
|
3
|
+
* Classifies what a DAST request did not answer, so a failed or partial scan
|
|
4
|
+
* is reported as such and never as a scan that found nothing.
|
|
5
|
+
*/
|
|
6
|
+
export function dastError(message, code, cause) {
|
|
7
|
+
return Object.assign(new Error(message, cause === undefined ? undefined : { cause }), { code });
|
|
8
|
+
}
|
|
9
|
+
export function isDastError(error) {
|
|
10
|
+
return error instanceof Error && 'code' in error && /^DAST_[A-Z_]+$/.test(String(error.code));
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The scan subject must be an http(s) URL. Anything else is a validation
|
|
14
|
+
* error, not a completed scan with a synthetic finding (#1135).
|
|
15
|
+
*/
|
|
16
|
+
export function parseDastTarget(targetUrl) {
|
|
17
|
+
let parsed;
|
|
18
|
+
try {
|
|
19
|
+
parsed = new URL(targetUrl);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw dastError('DAST target is not a valid URL; no dynamic analysis ran', 'DAST_INVALID_TARGET');
|
|
23
|
+
}
|
|
24
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
25
|
+
throw dastError(`DAST target must be an http(s) URL, not ${parsed.protocol}; no dynamic analysis ran`, 'DAST_INVALID_TARGET');
|
|
26
|
+
}
|
|
27
|
+
return parsed;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A response status that says nothing about the target's security: the request
|
|
31
|
+
* was refused, throttled or not served. Findings from such a page would be the
|
|
32
|
+
* headers of the error page (#1092, #1135).
|
|
33
|
+
*/
|
|
34
|
+
export function unansweredStatus(status) {
|
|
35
|
+
if (status === 401 || status === 403 || status === 407)
|
|
36
|
+
return { code: 'DAST_AUTHENTICATION_FAILED', label: 'authentication rejected' };
|
|
37
|
+
if (status === 408)
|
|
38
|
+
return { code: 'DAST_REQUEST_TIMEOUT', label: 'request timed out' };
|
|
39
|
+
if (status === 429)
|
|
40
|
+
return { code: 'DAST_RATE_LIMITED', label: 'rate limited' };
|
|
41
|
+
if (status >= 500)
|
|
42
|
+
return { code: 'DAST_TARGET_UNAVAILABLE', label: 'target unavailable' };
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/** Throws when the initial response cannot be scanned. */
|
|
46
|
+
export function assertScannableResponse(status) {
|
|
47
|
+
const unanswered = unansweredStatus(status);
|
|
48
|
+
if (unanswered) {
|
|
49
|
+
throw dastError(`DAST ${unanswered.label} (HTTP ${status}); dynamic analysis is incomplete`, unanswered.code);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const TLS_CODE = /^(ERR_TLS_|ERR_SSL_|ERR_CERT_|CERT_|UNABLE_TO_(GET|VERIFY)_|DEPTH_ZERO_SELF_SIGNED_CERT$|SELF_SIGNED_CERT_IN_CHAIN$|EPROTO$)/;
|
|
53
|
+
/** The errno-style code on an error or its causes (undici wraps it as `cause.code`). */
|
|
54
|
+
function causeCode(error) {
|
|
55
|
+
for (let current = error, depth = 0; current && depth < 5; depth++) {
|
|
56
|
+
const code = current.code;
|
|
57
|
+
if (typeof code === 'string' && /^[A-Z0-9_]{1,48}$/.test(code))
|
|
58
|
+
return code;
|
|
59
|
+
current = current.cause;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
function isTimeout(error) {
|
|
64
|
+
return error instanceof Error && (error.name === 'TimeoutError' || error.name === 'AbortError' || /timeout|abort/i.test(error.message));
|
|
65
|
+
}
|
|
66
|
+
/** Transport failure classification; TLS failures are told apart from a closed port (#1135). */
|
|
67
|
+
export function classifyRequestError(error) {
|
|
68
|
+
const cause = causeCode(error);
|
|
69
|
+
if (isTimeout(error))
|
|
70
|
+
return { code: 'DAST_REQUEST_TIMEOUT', reason: cause ?? 'timeout' };
|
|
71
|
+
if (cause && TLS_CODE.test(cause))
|
|
72
|
+
return { code: 'DAST_TLS_FAILED', reason: cause };
|
|
73
|
+
return { code: 'DAST_REQUEST_FAILED', reason: cause ?? 'transport error' };
|
|
74
|
+
}
|
|
75
|
+
/** Transport failures are execution errors, not absence of vulnerabilities. */
|
|
76
|
+
export function dastRequestFailure(error) {
|
|
77
|
+
if (isDastError(error))
|
|
78
|
+
return error;
|
|
79
|
+
const { code, reason } = classifyRequestError(error);
|
|
80
|
+
const what = code === 'DAST_REQUEST_TIMEOUT' ? 'request timeout'
|
|
81
|
+
: code === 'DAST_TLS_FAILED' ? 'TLS handshake failed' : 'request failed';
|
|
82
|
+
return dastError(`DAST target ${what} (${reason}); dynamic analysis is incomplete`, code, error);
|
|
83
|
+
}
|
|
84
|
+
/** Origin and path only: probe URLs can carry user credentials or query tokens. */
|
|
85
|
+
function requestLabel(url) {
|
|
86
|
+
try {
|
|
87
|
+
const parsed = new URL(url);
|
|
88
|
+
return `${parsed.origin}${parsed.pathname}`;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return '(invalid url)';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A follow-up probe. When the target does not answer it (transport failure,
|
|
96
|
+
* timeout, 407/408/429, or 5xx unless `analyzeServerErrors`), the failure is
|
|
97
|
+
* recorded in `failures` and null is returned so the remaining probes still
|
|
98
|
+
* run and the scan is reported incomplete (#1135). Without `failures`, it throws.
|
|
99
|
+
*/
|
|
100
|
+
export async function probe(url, init, failures, options = {}) {
|
|
101
|
+
try {
|
|
102
|
+
const response = await fetch(url, init);
|
|
103
|
+
const unanswered = response.status >= 500 && options.analyzeServerErrors ? null : unansweredStatus(response.status);
|
|
104
|
+
// 401/403 on a probed path is an answer: the path is protected.
|
|
105
|
+
if (unanswered && response.status !== 401 && response.status !== 403) {
|
|
106
|
+
await response.body?.cancel().catch(() => undefined);
|
|
107
|
+
throw dastError(`DAST probe ${unanswered.label} (HTTP ${response.status})`, unanswered.code);
|
|
108
|
+
}
|
|
109
|
+
return { status: response.status, ok: response.ok, headers: response.headers, text: await response.text() };
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
const failure = isDastError(error)
|
|
113
|
+
? { code: error.code, reason: error.message.replace(/^DAST probe /, '') }
|
|
114
|
+
: classifyRequestError(error);
|
|
115
|
+
if (!failures)
|
|
116
|
+
throw isDastError(error) ? error : dastRequestFailure(error);
|
|
117
|
+
failures.push({ url: requestLabel(url), ...failure });
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function summarizeFailures(failures) {
|
|
122
|
+
const codes = [...new Set(failures.map(failure => failure.code))].join(', ');
|
|
123
|
+
return `${failures.length} DAST request(s) were not answered (${codes}); findings cover only the answered requests`;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=dast-requests.js.map
|
|
@@ -42,6 +42,11 @@ export declare class DASTScanner {
|
|
|
42
42
|
* Get scan status
|
|
43
43
|
*/
|
|
44
44
|
getScanStatus(scanId: string): Promise<ScanStatus>;
|
|
45
|
+
/**
|
|
46
|
+
* #1135: probes the target did not answer leave the scan incomplete. The
|
|
47
|
+
* findings already collected are real and kept; the failed URLs are listed.
|
|
48
|
+
*/
|
|
49
|
+
private toResult;
|
|
45
50
|
/**
|
|
46
51
|
* Perform dynamic (DAST) scanning on a target URL
|
|
47
52
|
*/
|
|
@@ -50,7 +55,6 @@ export declare class DASTScanner {
|
|
|
50
55
|
* Perform authenticated dynamic scanning
|
|
51
56
|
*/
|
|
52
57
|
private performAuthenticatedScan;
|
|
53
|
-
private createInvalidUrlVuln;
|
|
54
58
|
private createInsecureProtocolVuln;
|
|
55
59
|
private createTokenInUrlVuln;
|
|
56
60
|
/**
|
|
@@ -7,19 +7,15 @@ import { ok, err } from '../../../../shared/types/index.js';
|
|
|
7
7
|
import { toError } from '../../../../shared/error-utils.js';
|
|
8
8
|
import { fetchWithResponseDeadline } from '../../../../shared/llm/providers/response-deadline.js';
|
|
9
9
|
import { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
10
|
+
import { assertScannableResponse, dastError, dastRequestFailure, isDastError, parseDastTarget, summarizeFailures, unansweredStatus, } from './dast-requests.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// DAST Scanner Service
|
|
12
13
|
// ============================================================================
|
|
13
|
-
/**
|
|
14
|
-
function
|
|
15
|
-
if (
|
|
14
|
+
/** A bug in the analysis code is not a request failure (#1135). */
|
|
15
|
+
function dastAnalysisFailure(error) {
|
|
16
|
+
if (isDastError(error))
|
|
16
17
|
return error;
|
|
17
|
-
|
|
18
|
-
return Object.assign(new Error(timeout
|
|
19
|
-
? 'DAST target request timeout; dynamic analysis is incomplete'
|
|
20
|
-
: 'DAST target request failed; dynamic analysis is incomplete'), {
|
|
21
|
-
code: timeout ? 'DAST_REQUEST_TIMEOUT' : 'DAST_REQUEST_FAILED',
|
|
22
|
-
});
|
|
18
|
+
return dastError(`DAST analysis failed (${toError(error).message}); dynamic analysis is incomplete`, 'DAST_ANALYSIS_FAILED', error);
|
|
23
19
|
}
|
|
24
20
|
/**
|
|
25
21
|
* DAST Scanner - Dynamic Application Security Testing
|
|
@@ -72,16 +68,10 @@ export class DASTScanner {
|
|
|
72
68
|
const result = await this.performDynamicScan(targetUrl, mergedOptions);
|
|
73
69
|
const scanDurationMs = Date.now() - startTime;
|
|
74
70
|
const summary = calculateSummary(result.vulnerabilities, 1, scanDurationMs);
|
|
75
|
-
|
|
76
|
-
await storeScanResults(this.memory, scanId, 'dast', result.vulnerabilities, summary);
|
|
71
|
+
const dastResult = this.toResult(scanId, targetUrl, result, summary);
|
|
72
|
+
await storeScanResults(this.memory, scanId, 'dast', result.vulnerabilities, summary, { status: dastResult.status, failedRequests: dastResult.failedRequests });
|
|
77
73
|
this.activeScans.set(scanId, 'completed');
|
|
78
|
-
return ok(
|
|
79
|
-
scanId,
|
|
80
|
-
targetUrl,
|
|
81
|
-
vulnerabilities: result.vulnerabilities,
|
|
82
|
-
summary,
|
|
83
|
-
crawledUrls: result.crawledUrls,
|
|
84
|
-
});
|
|
74
|
+
return ok(dastResult);
|
|
85
75
|
}
|
|
86
76
|
catch (error) {
|
|
87
77
|
this.activeScans.set(scanId, 'failed');
|
|
@@ -112,15 +102,10 @@ export class DASTScanner {
|
|
|
112
102
|
const scanDurationMs = Date.now() - startTime;
|
|
113
103
|
const summary = calculateSummary(result.vulnerabilities, 1, scanDurationMs);
|
|
114
104
|
// Store results (without credentials)
|
|
115
|
-
|
|
105
|
+
const dastResult = this.toResult(scanId, targetUrl, result, summary);
|
|
106
|
+
await storeScanResults(this.memory, scanId, 'dast-auth', result.vulnerabilities, summary, { status: dastResult.status, failedRequests: dastResult.failedRequests });
|
|
116
107
|
this.activeScans.set(scanId, 'completed');
|
|
117
|
-
return ok(
|
|
118
|
-
scanId,
|
|
119
|
-
targetUrl,
|
|
120
|
-
vulnerabilities: result.vulnerabilities,
|
|
121
|
-
summary,
|
|
122
|
-
crawledUrls: result.crawledUrls,
|
|
123
|
-
});
|
|
108
|
+
return ok(dastResult);
|
|
124
109
|
}
|
|
125
110
|
catch (error) {
|
|
126
111
|
this.activeScans.set(scanId, 'failed');
|
|
@@ -133,6 +118,23 @@ export class DASTScanner {
|
|
|
133
118
|
async getScanStatus(scanId) {
|
|
134
119
|
return this.activeScans.get(scanId) ?? 'pending';
|
|
135
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* #1135: probes the target did not answer leave the scan incomplete. The
|
|
123
|
+
* findings already collected are real and kept; the failed URLs are listed.
|
|
124
|
+
*/
|
|
125
|
+
toResult(scanId, targetUrl, outcome, summary) {
|
|
126
|
+
const { failedRequests } = outcome;
|
|
127
|
+
return {
|
|
128
|
+
scanId,
|
|
129
|
+
targetUrl,
|
|
130
|
+
vulnerabilities: outcome.vulnerabilities,
|
|
131
|
+
summary,
|
|
132
|
+
crawledUrls: outcome.crawledUrls,
|
|
133
|
+
status: failedRequests.length > 0 ? 'incomplete' : 'complete',
|
|
134
|
+
failedRequests,
|
|
135
|
+
...(failedRequests.length > 0 ? { error: summarizeFailures(failedRequests) } : {}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
136
138
|
// ==========================================================================
|
|
137
139
|
// Private Methods - Dynamic Scanning
|
|
138
140
|
// ==========================================================================
|
|
@@ -141,156 +143,124 @@ export class DASTScanner {
|
|
|
141
143
|
*/
|
|
142
144
|
async performDynamicScan(targetUrl, options) {
|
|
143
145
|
const vulnerabilities = [];
|
|
144
|
-
|
|
146
|
+
const failedRequests = [];
|
|
147
|
+
const parsedUrl = parseDastTarget(targetUrl);
|
|
148
|
+
const timeout = options.timeout ?? this.config.timeout;
|
|
149
|
+
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
150
|
+
const activeScanning = options.activeScanning ?? this.config.dastActiveScanning;
|
|
151
|
+
// Perform main page scan. #980: the deadline must cover the body too —
|
|
152
|
+
// the target is untrusted and may send headers and then stall the body,
|
|
153
|
+
// so it stays armed until `response.text()` below has finished.
|
|
154
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
155
|
+
let response;
|
|
156
|
+
let responseText = '';
|
|
145
157
|
try {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
158
|
+
response = await fetchWithResponseDeadline(targetUrl, {
|
|
159
|
+
method: 'GET',
|
|
160
|
+
headers: {
|
|
161
|
+
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
162
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
163
|
+
},
|
|
164
|
+
redirect: 'follow',
|
|
165
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
166
|
+
if (unansweredStatus(response.status)) {
|
|
167
|
+
await response.body?.cancel().catch(() => undefined);
|
|
168
|
+
assertScannableResponse(response.status);
|
|
150
169
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
170
|
+
if (activeScanning) {
|
|
171
|
+
// Read the page body first, inside the request deadline (#980), so the
|
|
172
|
+
// slower probes below cannot use up the deadline of a healthy target.
|
|
173
|
+
responseText = await response.text();
|
|
154
174
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
170
|
-
if (response.status === 401 || response.status === 403 || response.status >= 500) {
|
|
171
|
-
await response.body?.cancel().catch(() => undefined);
|
|
172
|
-
throw Object.assign(new Error(`DAST ${response.status < 500 ? 'authentication rejected' : 'target unavailable'} (HTTP ${response.status}); dynamic analysis is incomplete`), {
|
|
173
|
-
code: response.status < 500 ? 'DAST_AUTHENTICATION_FAILED' : 'DAST_TARGET_UNAVAILABLE',
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
crawledUrls++;
|
|
177
|
-
// Security header analysis
|
|
178
|
-
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
|
|
179
|
-
// Check for insecure protocol
|
|
180
|
-
if (parsedUrl.protocol === 'http:') {
|
|
181
|
-
vulnerabilities.push(this.createInsecureProtocolVuln(targetUrl));
|
|
182
|
-
}
|
|
183
|
-
// Check for cookie security
|
|
184
|
-
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities);
|
|
185
|
-
// Check for server version disclosure
|
|
186
|
-
analyzeServerHeaders(response.headers, targetUrl, vulnerabilities);
|
|
187
|
-
// Active scanning features
|
|
188
|
-
if (options.activeScanning ?? this.config.dastActiveScanning) {
|
|
189
|
-
// Read the page body first, inside the request deadline (#980), so the
|
|
190
|
-
// slower probes below cannot use up the deadline of a healthy target.
|
|
191
|
-
const responseText = await response.text();
|
|
192
|
-
crawledUrls = await scanSensitiveFiles(parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
193
|
-
await analyzeCORS(targetUrl, vulnerabilities);
|
|
194
|
-
// Enhanced DAST: Link crawling, injection testing, form analysis
|
|
195
|
-
crawledUrls = await extractAndCrawlLinks(responseText, parsedUrl, crawledUrls, maxDepth, vulnerabilities);
|
|
196
|
-
if (parsedUrl.search) {
|
|
197
|
-
await this.testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities);
|
|
198
|
-
}
|
|
199
|
-
analyzeFormsForSecurityIssues(responseText, targetUrl, vulnerabilities);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// Passive scan: headers only. Release the connection instead of
|
|
203
|
-
// leaving an unread body to the deadline timer.
|
|
204
|
-
await response.body?.cancel().catch(() => undefined);
|
|
205
|
-
}
|
|
175
|
+
else {
|
|
176
|
+
// Passive scan: headers only. Release the connection instead of
|
|
177
|
+
// leaving an unread body to the deadline timer.
|
|
178
|
+
await response.body?.cancel().catch(() => undefined);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (fetchError) {
|
|
182
|
+
throw dastRequestFailure(fetchError);
|
|
183
|
+
}
|
|
184
|
+
let crawledUrls = 1;
|
|
185
|
+
try {
|
|
186
|
+
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities);
|
|
187
|
+
if (parsedUrl.protocol === 'http:') {
|
|
188
|
+
vulnerabilities.push(this.createInsecureProtocolVuln(targetUrl));
|
|
206
189
|
}
|
|
207
|
-
|
|
208
|
-
|
|
190
|
+
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities);
|
|
191
|
+
analyzeServerHeaders(response.headers, targetUrl, vulnerabilities);
|
|
192
|
+
if (activeScanning) {
|
|
193
|
+
// #1135: a probe the target does not answer is recorded and the scan
|
|
194
|
+
// continues; the result is then incomplete, not discarded.
|
|
195
|
+
crawledUrls = await scanSensitiveFiles(parsedUrl, crawledUrls, maxDepth, vulnerabilities, failedRequests);
|
|
196
|
+
await analyzeCORS(targetUrl, vulnerabilities, failedRequests);
|
|
197
|
+
crawledUrls = await extractAndCrawlLinks(responseText, parsedUrl, crawledUrls, maxDepth, vulnerabilities, failedRequests);
|
|
198
|
+
if (parsedUrl.search) {
|
|
199
|
+
await this.testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities, failedRequests);
|
|
200
|
+
}
|
|
201
|
+
analyzeFormsForSecurityIssues(responseText, targetUrl, vulnerabilities);
|
|
209
202
|
}
|
|
210
203
|
}
|
|
211
204
|
catch (error) {
|
|
212
|
-
throw
|
|
205
|
+
throw dastAnalysisFailure(error);
|
|
213
206
|
}
|
|
214
|
-
return { vulnerabilities, crawledUrls };
|
|
207
|
+
return { vulnerabilities, crawledUrls, failedRequests };
|
|
215
208
|
}
|
|
216
209
|
/**
|
|
217
210
|
* Perform authenticated dynamic scanning
|
|
218
211
|
*/
|
|
219
212
|
async performAuthenticatedScan(targetUrl, credentials, options) {
|
|
220
213
|
const vulnerabilities = [];
|
|
221
|
-
|
|
214
|
+
const failedRequests = [];
|
|
215
|
+
const authHeaders = buildAuthHeaders(credentials);
|
|
216
|
+
const parsedUrl = parseDastTarget(targetUrl);
|
|
217
|
+
const timeout = options.timeout ?? this.config.timeout;
|
|
218
|
+
const maxDepth = options.maxDepth ?? this.config.dastMaxDepth;
|
|
219
|
+
// #980 review N8: same deadline treatment as the unauthenticated scan.
|
|
220
|
+
// This path reads headers only; the unread body is cancelled below so
|
|
221
|
+
// a target that stalls it cannot hold the connection open.
|
|
222
|
+
const deadlineMs = Math.min(timeout, 30000);
|
|
223
|
+
let response;
|
|
222
224
|
try {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
},
|
|
246
|
-
redirect: 'follow',
|
|
247
|
-
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
248
|
-
await response.body?.cancel().catch(() => undefined);
|
|
249
|
-
if (response.status === 401 || response.status === 403 || response.status >= 500) {
|
|
250
|
-
await response.body?.cancel().catch(() => undefined);
|
|
251
|
-
throw Object.assign(new Error(`DAST ${response.status < 500 ? 'authentication rejected' : 'target unavailable'} (HTTP ${response.status}); dynamic analysis is incomplete`), {
|
|
252
|
-
code: response.status < 500 ? 'DAST_AUTHENTICATION_FAILED' : 'DAST_TARGET_UNAVAILABLE',
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
crawledUrls++;
|
|
256
|
-
// Standard security header checks
|
|
257
|
-
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities, true);
|
|
258
|
-
// Check for session token in URL
|
|
259
|
-
if (parsedUrl.search.includes('token=') || parsedUrl.search.includes('session=') || parsedUrl.search.includes('auth=')) {
|
|
260
|
-
vulnerabilities.push(this.createTokenInUrlVuln(targetUrl, parsedUrl.search));
|
|
261
|
-
}
|
|
262
|
-
// Active scanning for authenticated endpoints
|
|
263
|
-
if (options.activeScanning ?? this.config.dastActiveScanning) {
|
|
264
|
-
crawledUrls = await testAuthorizationBypass(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities);
|
|
265
|
-
crawledUrls = await testIDOR(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities);
|
|
266
|
-
}
|
|
267
|
-
// Enhanced cookie security for authenticated sessions
|
|
268
|
-
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
|
|
225
|
+
response = await fetchWithResponseDeadline(targetUrl, {
|
|
226
|
+
method: 'GET',
|
|
227
|
+
headers: {
|
|
228
|
+
'User-Agent': 'AgenticQE-DAST-Scanner/3.0',
|
|
229
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
230
|
+
...authHeaders,
|
|
231
|
+
},
|
|
232
|
+
redirect: 'follow',
|
|
233
|
+
}, deadlineMs, () => new Error(`DAST request timeout after ${deadlineMs}ms: ${targetUrl}`));
|
|
234
|
+
await response.body?.cancel().catch(() => undefined);
|
|
235
|
+
assertScannableResponse(response.status);
|
|
236
|
+
}
|
|
237
|
+
catch (fetchError) {
|
|
238
|
+
throw dastRequestFailure(fetchError);
|
|
239
|
+
}
|
|
240
|
+
let crawledUrls = 1;
|
|
241
|
+
try {
|
|
242
|
+
// Standard security header checks
|
|
243
|
+
analyzeSecurityHeaders(response.headers, targetUrl, vulnerabilities, true);
|
|
244
|
+
// Check for session token in URL
|
|
245
|
+
if (parsedUrl.search.includes('token=') || parsedUrl.search.includes('session=') || parsedUrl.search.includes('auth=')) {
|
|
246
|
+
vulnerabilities.push(this.createTokenInUrlVuln(targetUrl, parsedUrl.search));
|
|
269
247
|
}
|
|
270
|
-
|
|
271
|
-
|
|
248
|
+
// Active scanning for authenticated endpoints
|
|
249
|
+
if (options.activeScanning ?? this.config.dastActiveScanning) {
|
|
250
|
+
crawledUrls = await testAuthorizationBypass(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities, failedRequests);
|
|
251
|
+
crawledUrls = await testIDOR(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities, failedRequests);
|
|
272
252
|
}
|
|
253
|
+
// Enhanced cookie security for authenticated sessions
|
|
254
|
+
analyzeCookieSecurity(response.headers, targetUrl, vulnerabilities, true);
|
|
273
255
|
}
|
|
274
256
|
catch (error) {
|
|
275
|
-
throw
|
|
257
|
+
throw dastAnalysisFailure(error);
|
|
276
258
|
}
|
|
277
|
-
return { vulnerabilities, crawledUrls };
|
|
259
|
+
return { vulnerabilities, crawledUrls, failedRequests };
|
|
278
260
|
}
|
|
279
261
|
// ==========================================================================
|
|
280
262
|
// Private Methods - Vulnerability Factories
|
|
281
263
|
// ==========================================================================
|
|
282
|
-
createInvalidUrlVuln(targetUrl) {
|
|
283
|
-
return {
|
|
284
|
-
id: uuidv4(),
|
|
285
|
-
title: 'Invalid Target URL',
|
|
286
|
-
description: 'The provided target URL is not valid',
|
|
287
|
-
severity: 'informational',
|
|
288
|
-
category: 'security-misconfiguration',
|
|
289
|
-
location: { file: targetUrl },
|
|
290
|
-
remediation: { description: 'Provide a valid URL', estimatedEffort: 'trivial', automatable: false },
|
|
291
|
-
references: [],
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
264
|
createInsecureProtocolVuln(targetUrl) {
|
|
295
265
|
return {
|
|
296
266
|
id: uuidv4(),
|
|
@@ -321,7 +291,7 @@ export class DASTScanner {
|
|
|
321
291
|
/**
|
|
322
292
|
* Test URL parameters for injection vulnerabilities
|
|
323
293
|
*/
|
|
324
|
-
async testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities) {
|
|
294
|
+
async testInjectionVulnerabilities(targetUrl, parsedUrl, vulnerabilities, failures) {
|
|
325
295
|
const params = new URLSearchParams(parsedUrl.search);
|
|
326
296
|
const paramNames = Array.from(params.keys());
|
|
327
297
|
const xssPayloads = [
|
|
@@ -335,8 +305,8 @@ export class DASTScanner {
|
|
|
335
305
|
{ payload: "1' AND '1'='1", name: 'SQL AND Injection' },
|
|
336
306
|
];
|
|
337
307
|
for (const paramName of paramNames.slice(0, 3)) {
|
|
338
|
-
await testXSS(targetUrl, parsedUrl, paramName, xssPayloads, vulnerabilities);
|
|
339
|
-
await testSQLi(targetUrl, parsedUrl, paramName, sqliPayloads, vulnerabilities);
|
|
308
|
+
await testXSS(targetUrl, parsedUrl, paramName, xssPayloads, vulnerabilities, failures);
|
|
309
|
+
await testSQLi(targetUrl, parsedUrl, paramName, sqliPayloads, vulnerabilities, failures);
|
|
340
310
|
}
|
|
341
311
|
}
|
|
342
312
|
}
|
|
@@ -10,5 +10,5 @@ export type { SecurityScannerConfig, SecurityScannerDependencies, ISecurityScann
|
|
|
10
10
|
export { DEFAULT_CONFIG } from './scanner-types.js';
|
|
11
11
|
export type { Vulnerability, VulnerabilitySeverity, VulnerabilityCategory, VulnerabilityLocation, RemediationAdvice, ScanSummary, SecurityCoverage, ScanStatus, SASTResult, DASTResult, DASTOptions, AuthCredentials, RuleSet, FalsePositiveCheck, } from './scanner-types.js';
|
|
12
12
|
export { ALL_SECURITY_PATTERNS, SQL_INJECTION_PATTERNS, XSS_PATTERNS, SECRET_PATTERNS, PATH_TRAVERSAL_PATTERNS, COMMAND_INJECTION_PATTERNS, MISCONFIGURATION_PATTERNS, DESERIALIZATION_PATTERNS, AUTH_PATTERNS, BUILT_IN_RULE_SETS, } from './security-patterns.js';
|
|
13
|
-
export { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders,
|
|
13
|
+
export { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -12,5 +12,5 @@ export { DEFAULT_CONFIG } from './scanner-types.js';
|
|
|
12
12
|
// Security patterns
|
|
13
13
|
export { ALL_SECURITY_PATTERNS, SQL_INJECTION_PATTERNS, XSS_PATTERNS, SECRET_PATTERNS, PATH_TRAVERSAL_PATTERNS, COMMAND_INJECTION_PATTERNS, MISCONFIGURATION_PATTERNS, DESERIALIZATION_PATTERNS, AUTH_PATTERNS, BUILT_IN_RULE_SETS, } from './security-patterns.js';
|
|
14
14
|
// DAST helper functions (for advanced/custom usage)
|
|
15
|
-
export { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders,
|
|
15
|
+
export { analyzeSecurityHeaders, analyzeCookieSecurity, analyzeServerHeaders, scanSensitiveFiles, analyzeCORS, extractAndCrawlLinks, testXSS, testSQLi, analyzeFormsForSecurityIssues, testAuthorizationBypass, testIDOR, validateCredentials, buildAuthHeaders, calculateSummary, storeScanResults, } from './dast-helpers.js';
|
|
16
16
|
//# sourceMappingURL=index.js.map
|