agentic-qe 3.15.10 → 3.15.12
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 +263 -0
- package/README.md +8 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/agent-cards/generator.js +6 -3
- package/dist/adapters/a2a/tasks/task-router.js +3 -1
- package/dist/adapters/trajectory-adapter.js +1 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +3 -1
- package/dist/agents/claim-verifier/verifiers/output-verifier.js +31 -2
- package/dist/agents/overlay-loader.js +26 -21
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-HL7MOCQN.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-H7ANGXW4.js → agent-booster-wasm-5VZCKTIJ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-SVXSHEET.js → agent-handler-K3C6CQCD.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-WKQH36XL.js → agent-memory-branch-NVFQ25WS.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +2 -0
- package/dist/cli/chunks/{arena-EKOOFVST.js → arena-QGWIJADQ.js} +2 -2
- package/dist/cli/chunks/{arena-OPS36NFZ.js → arena-TSZVDSXS.js} +4 -4
- package/dist/cli/chunks/{audit-AO5NDZRI.js → audit-KIEE2SHJ.js} +3 -3
- package/dist/cli/chunks/base-WIM7G3HC.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-TFLVEMMY.js → better-sqlite3-BNB32NW3.js} +2 -2
- package/dist/cli/chunks/{brain-handler-ADBBJPYW.js → brain-handler-MPC5SPYI.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-HGHUYYL5.js → branch-enumerator-LZ7UXKAY.js} +2 -2
- package/dist/cli/chunks/{browser-5LU6P4SZ.js → browser-VDHAW4RK.js} +2 -2
- package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +2 -0
- package/dist/cli/chunks/{chunk-5LPYV3TK.js → chunk-23PQF7NN.js} +1 -1
- package/dist/cli/chunks/{chunk-2ZMF4NCF.js → chunk-26672ISV.js} +2 -2
- package/dist/cli/chunks/{chunk-U53ZB4IX.js → chunk-2ASQRBK2.js} +2 -2
- package/dist/cli/chunks/{chunk-7PJIR4ST.js → chunk-2E2QO44T.js} +2 -2
- package/dist/cli/chunks/{chunk-2T7RRL6G.js → chunk-2IVE5AR3.js} +1 -1
- package/dist/cli/chunks/{chunk-B6LTH6YV.js → chunk-2JYUA27M.js} +1 -1
- package/dist/cli/chunks/{chunk-PFG6VQ5Z.js → chunk-2PPSS4JD.js} +2 -2
- package/dist/cli/chunks/{chunk-NZYLNXT6.js → chunk-32UTHIY5.js} +5 -5
- package/dist/cli/chunks/{chunk-5E6GHSTY.js → chunk-33I2ZP6E.js} +2 -2
- package/dist/cli/chunks/{chunk-XLZYRTNO.js → chunk-35MIUSXQ.js} +2 -2
- package/dist/cli/chunks/{chunk-7LFZ4CHM.js → chunk-35NW676P.js} +2 -2
- package/dist/cli/chunks/{chunk-4G63WT4F.js → chunk-3EWQN37E.js} +2 -2
- package/dist/cli/chunks/{chunk-GZLZCZ42.js → chunk-3IU4LDZR.js} +2 -2
- package/dist/cli/chunks/{chunk-CESIR27V.js → chunk-47RMGDG4.js} +2 -2
- package/dist/cli/chunks/chunk-4A76VPU4.js +3 -0
- package/dist/cli/chunks/{chunk-DT7SIJOA.js → chunk-4CB3QPZM.js} +2 -2
- package/dist/cli/chunks/{chunk-ERQKYIP7.js → chunk-4HWUECVD.js} +5 -5
- package/dist/cli/chunks/{chunk-MA7JIQ6U.js → chunk-4KUOYDY2.js} +5 -5
- package/dist/cli/chunks/{chunk-VWNFAW2M.js → chunk-4LWMAAWK.js} +2 -2
- package/dist/cli/chunks/{chunk-IKISCIGH.js → chunk-4PU5GTZW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZXPY654C.js → chunk-4SA7M34P.js} +1 -1
- package/dist/cli/chunks/{chunk-NGKNYIQZ.js → chunk-4Y6OEBJZ.js} +1 -1
- package/dist/cli/chunks/{chunk-KOBVYY6H.js → chunk-5A66EGEW.js} +2 -2
- package/dist/cli/chunks/{chunk-Z2O2YJAF.js → chunk-5ADXFUMO.js} +2 -2
- package/dist/cli/chunks/{chunk-YKMU4LBV.js → chunk-5S4UIDFK.js} +1 -1
- package/dist/cli/chunks/{chunk-Z7IYW5U7.js → chunk-5TAEW5OV.js} +1 -1
- package/dist/cli/chunks/chunk-5Z23ZMXZ.js +742 -0
- package/dist/cli/chunks/{chunk-6TB6YOCZ.js → chunk-65TH6RPD.js} +1 -1
- package/dist/cli/chunks/{chunk-3Y7SPD72.js → chunk-66PXR3NI.js} +2 -2
- package/dist/cli/chunks/{chunk-3P34JFQH.js → chunk-6E6HB4N4.js} +14 -14
- package/dist/cli/chunks/{chunk-6PX4OXQO.js → chunk-6QRI3JVE.js} +2 -2
- package/dist/cli/chunks/{chunk-WBM6N6IM.js → chunk-7DNR4KKR.js} +1 -1
- package/dist/cli/chunks/{chunk-6XCMKIZN.js → chunk-7JFDLL2F.js} +1 -1
- package/dist/cli/chunks/chunk-7OEFBWAG.js +5 -0
- package/dist/cli/chunks/{chunk-Y76IAYQD.js → chunk-7QEUHNKO.js} +1 -1
- package/dist/cli/chunks/{chunk-WQ4PYWSW.js → chunk-7TA5MUPW.js} +1 -1
- package/dist/cli/chunks/{chunk-2XGVTYVX.js → chunk-A2JCRXTK.js} +2 -2
- package/dist/cli/chunks/{chunk-ESUO3GTJ.js → chunk-A5Y7DAVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-ATHWDAXB.js → chunk-ADUAJIAU.js} +2 -2
- package/dist/cli/chunks/{chunk-IU2IV4NE.js → chunk-AJEXPFAB.js} +1 -1
- package/dist/cli/chunks/{chunk-YK7JN5N7.js → chunk-BC4T6SCV.js} +4 -4
- package/dist/cli/chunks/{chunk-KSIWGGJI.js → chunk-BMG2JLSQ.js} +2 -2
- package/dist/cli/chunks/chunk-BOSMELJX.js +180 -0
- package/dist/cli/chunks/{chunk-7OZVZIBE.js → chunk-BYRCB5JT.js} +2 -2
- package/dist/cli/chunks/{chunk-FAUCT5KR.js → chunk-C3YOVASQ.js} +6 -5
- package/dist/cli/chunks/{chunk-DMFTELBS.js → chunk-C74M4WUI.js} +2 -2
- package/dist/cli/chunks/{chunk-2SXBBUM6.js → chunk-CA5UNWQF.js} +2 -2
- package/dist/cli/chunks/{chunk-UCJMVXO4.js → chunk-CDA5Z74H.js} +2 -2
- package/dist/cli/chunks/{chunk-NVYIZCSR.js → chunk-CPIBIR3X.js} +2 -2
- package/dist/cli/chunks/{chunk-YK3BVZY6.js → chunk-CU36D7TN.js} +2 -2
- package/dist/cli/chunks/{chunk-H32EPIR2.js → chunk-DAUEK66C.js} +1 -1
- package/dist/cli/chunks/{chunk-6KIL6CMD.js → chunk-DRCBRUGN.js} +2 -2
- package/dist/cli/chunks/{chunk-EWFECZ2U.js → chunk-DZGPUGUG.js} +2 -2
- package/dist/cli/chunks/{chunk-YDAQK5UF.js → chunk-EF6OERRR.js} +1 -1
- package/dist/cli/chunks/{chunk-KG336OV3.js → chunk-EN7GRVEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-DBMNJSBV.js → chunk-ENGL7FIJ.js} +1 -1
- package/dist/cli/chunks/{chunk-FKL3R5JQ.js → chunk-FAGKBOX2.js} +2 -2
- package/dist/cli/chunks/{chunk-NAXGWDVM.js → chunk-FNUFTWEO.js} +3 -3
- package/dist/cli/chunks/{chunk-RWWOHCMG.js → chunk-FZJCBSN4.js} +2 -2
- package/dist/cli/chunks/{chunk-ABFFWZPC.js → chunk-G24SWTAX.js} +151 -149
- package/dist/cli/chunks/{chunk-ODJNUMV3.js → chunk-G3AABG4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-FBXTQNRH.js → chunk-GJKZ7UQO.js} +2 -2
- package/dist/cli/chunks/{chunk-DEF34AFL.js → chunk-GKFV6CUD.js} +2 -2
- package/dist/cli/chunks/{chunk-SY2IB442.js → chunk-HLGFHHWV.js} +2 -2
- package/dist/cli/chunks/{chunk-CZGOSJQ4.js → chunk-HM3LSFTY.js} +2 -2
- package/dist/cli/chunks/chunk-HSA5IGGW.js +2 -0
- package/dist/cli/chunks/{chunk-GJHWY3ZX.js → chunk-HZBXJFGN.js} +2 -2
- package/dist/cli/chunks/chunk-IA55PFLG.js +7 -0
- package/dist/cli/chunks/{chunk-MNN5J4GU.js → chunk-ICKUINKD.js} +2 -2
- package/dist/cli/chunks/{chunk-XEB3NLJR.js → chunk-IETBWYHW.js} +2 -2
- package/dist/cli/chunks/{chunk-A55QKKT2.js → chunk-IL7GQNNE.js} +2 -2
- package/dist/cli/chunks/{chunk-LRZY4KS2.js → chunk-INZARYUD.js} +2 -2
- package/dist/cli/chunks/{chunk-OBAREPDC.js → chunk-IPA7K556.js} +2 -2
- package/dist/cli/chunks/{chunk-CFBEBXLO.js → chunk-IVTQF55W.js} +3 -3
- package/dist/cli/chunks/{chunk-FFTPAWM6.js → chunk-J7Y7ZBIT.js} +8 -8
- package/dist/cli/chunks/{chunk-I33O4BRQ.js → chunk-JGIJPDGD.js} +2 -2
- package/dist/cli/chunks/chunk-JNXK47OL.js +2 -0
- package/dist/cli/chunks/{chunk-PCEW6Q2C.js → chunk-JOWUS2X5.js} +1 -1
- package/dist/cli/chunks/{chunk-KI73QCR5.js → chunk-JR6CUKAI.js} +2 -2
- package/dist/cli/chunks/chunk-JRYWLOBD.js +21 -0
- package/dist/cli/chunks/{chunk-SO45NA4D.js → chunk-JW5PDJ5O.js} +11 -11
- package/dist/cli/chunks/{chunk-APSRPR4W.js → chunk-K3A3NWT3.js} +2 -2
- package/dist/cli/chunks/{chunk-FESZBPUB.js → chunk-KA5SHLMW.js} +2 -2
- package/dist/cli/chunks/{chunk-OPFGRS5S.js → chunk-KGA7VAI4.js} +2 -2
- package/dist/cli/chunks/chunk-KJDI5CHX.js +2 -0
- package/dist/cli/chunks/{chunk-V2RSNVMW.js → chunk-L3PV7VXK.js} +1 -1
- package/dist/cli/chunks/{chunk-C522H7XR.js → chunk-L7NGKANW.js} +32 -32
- package/dist/cli/chunks/{chunk-DNRWGATA.js → chunk-LFBA735S.js} +7 -7
- package/dist/cli/chunks/{chunk-V2M2XCR5.js → chunk-MAJXZYGK.js} +1 -1
- package/dist/cli/chunks/{chunk-FZOWULMH.js → chunk-MCPEC6OO.js} +1 -1
- package/dist/cli/chunks/{chunk-LMS3Y7JD.js → chunk-MCPXNUDK.js} +2 -2
- package/dist/cli/chunks/{chunk-GWZZ7DAO.js → chunk-MMEALJ4D.js} +2 -2
- package/dist/cli/chunks/{chunk-G3CZCUPM.js → chunk-MYF5CNGV.js} +2 -2
- package/dist/cli/chunks/{chunk-NNFZUTDH.js → chunk-MYUMJ2ZI.js} +1 -1
- package/dist/cli/chunks/{chunk-WDQ7IEZY.js → chunk-N7O3PF6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-YAKGBHO4.js → chunk-NA3F6FEO.js} +2 -2
- package/dist/cli/chunks/chunk-NNBQZR73.js +6 -0
- package/dist/cli/chunks/{chunk-6C3II5OM.js → chunk-NV74SICL.js} +2 -2
- package/dist/cli/chunks/chunk-NVRYELCY.js +13 -0
- package/dist/cli/chunks/{chunk-UHTTW3IT.js → chunk-NX4BCSOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-EN2QSKFF.js → chunk-O3IM4WRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-S75EYIJG.js → chunk-O4QJMANM.js} +1 -1
- package/dist/cli/chunks/{chunk-NPPHWFA2.js → chunk-OHVYINGM.js} +18 -18
- package/dist/cli/chunks/{chunk-DE4YJQJF.js → chunk-P5E26N2X.js} +2 -2
- package/dist/cli/chunks/chunk-P7UFJ6DO.js +14 -0
- package/dist/cli/chunks/{chunk-XFVTGAAJ.js → chunk-PGSJBXTD.js} +2 -2
- package/dist/cli/chunks/{chunk-CZ2IF6MC.js → chunk-PT2NXS43.js} +1 -1
- package/dist/cli/chunks/{chunk-RK73HB2F.js → chunk-PTBOLBM4.js} +2 -2
- package/dist/cli/chunks/{chunk-EAU5KDFO.js → chunk-PX5OPXY6.js} +1 -1
- package/dist/cli/chunks/chunk-QCPVUNN3.js +2 -0
- package/dist/cli/chunks/{chunk-VKRTTFB6.js → chunk-QSGEBCDB.js} +2 -2
- package/dist/cli/chunks/{chunk-SKQUUE4F.js → chunk-QUJJYTJH.js} +2 -2
- package/dist/cli/chunks/chunk-QWG3SILX.js +59 -0
- package/dist/cli/chunks/{chunk-D6DA2KFD.js → chunk-RCOLPF3B.js} +2 -2
- package/dist/cli/chunks/{chunk-SU5H66SD.js → chunk-RYHG3I7J.js} +2 -2
- package/dist/cli/chunks/chunk-SBHM5X2S.js +4 -0
- package/dist/cli/chunks/{chunk-62OAY5KJ.js → chunk-SDRJJUPO.js} +1 -1
- package/dist/cli/chunks/{chunk-FB6TI3BH.js → chunk-SG2TX72G.js} +2 -2
- package/dist/cli/chunks/{chunk-H2PYU7MN.js → chunk-SITL5YZV.js} +4 -4
- package/dist/cli/chunks/{chunk-AI4VYSFS.js → chunk-SPC4RBLF.js} +2 -2
- package/dist/cli/chunks/{chunk-BQUAE3CP.js → chunk-SQVZ3TRU.js} +2 -2
- package/dist/cli/chunks/{chunk-TBLI254A.js → chunk-SUX5XB2Z.js} +2 -2
- package/dist/cli/chunks/{chunk-VFSYMOAL.js → chunk-T4EN5VVK.js} +2 -2
- package/dist/cli/chunks/{chunk-KNQ2ERFX.js → chunk-TGMXUZZC.js} +2 -2
- package/dist/cli/chunks/{chunk-7TB6FK4B.js → chunk-TLRHAMX5.js} +1 -1
- package/dist/cli/chunks/{chunk-V6JBOIMX.js → chunk-TOWOJGEI.js} +1 -1
- package/dist/cli/chunks/{chunk-JHIY4VCC.js → chunk-TSOQ2QLT.js} +3 -3
- package/dist/cli/chunks/{chunk-YYTGXD3R.js → chunk-TVA5GRIU.js} +2 -2
- package/dist/cli/chunks/{chunk-6MVVSSID.js → chunk-TXEUVUMO.js} +1 -1
- package/dist/cli/chunks/{chunk-7ZCDZHDB.js → chunk-U6IXYQO4.js} +2 -2
- package/dist/cli/chunks/{chunk-NW5JUCCG.js → chunk-U7ZHDGXG.js} +1 -1
- package/dist/cli/chunks/{chunk-UARKIZAS.js → chunk-UCSK2RMI.js} +2 -2
- package/dist/cli/chunks/{chunk-RPHY2DU6.js → chunk-UIKQPO4Y.js} +2 -2
- package/dist/cli/chunks/chunk-UJNGGFGX.js +2 -0
- package/dist/cli/chunks/{chunk-EDLFX4ZB.js → chunk-ULCW6IVQ.js} +2 -2
- package/dist/cli/chunks/{chunk-M2QV7PT7.js → chunk-UREDS662.js} +2 -2
- package/dist/cli/chunks/{chunk-MG27QY4D.js → chunk-URSTP3WI.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZI5FKSF.js → chunk-UUZZXHUF.js} +2 -2
- package/dist/cli/chunks/{chunk-IPJ7Q3AJ.js → chunk-UZED4YZ5.js} +1 -1
- package/dist/cli/chunks/{chunk-VFKF2XO7.js → chunk-VF7FTD64.js} +1 -1
- package/dist/cli/chunks/{chunk-YCGP5VFP.js → chunk-VUR5THML.js} +2 -2
- package/dist/cli/chunks/{chunk-WDVRE6GN.js → chunk-VXVTFKRA.js} +2 -2
- package/dist/cli/chunks/chunk-VZBC6DP7.js +2 -0
- package/dist/cli/chunks/{chunk-GHBNRMSJ.js → chunk-W4II6SIH.js} +2 -2
- package/dist/cli/chunks/{chunk-TNMBRDCA.js → chunk-W5HQIYQU.js} +3 -3
- package/dist/cli/chunks/{chunk-H74Q7TJN.js → chunk-W7H55PY4.js} +1 -1
- package/dist/cli/chunks/{chunk-OY2AHLSF.js → chunk-WDEXOLK2.js} +1 -1
- package/dist/cli/chunks/{chunk-VJQYDYAJ.js → chunk-WGTEZT7G.js} +2 -2
- package/dist/cli/chunks/{chunk-GRCIBCJ2.js → chunk-WLRU6ESI.js} +2 -2
- package/dist/cli/chunks/{chunk-ACWFKES2.js → chunk-WTAUF6O4.js} +2 -2
- package/dist/cli/chunks/chunk-XCNSGSKV.js +3 -0
- package/dist/cli/chunks/{chunk-6S3WJGUV.js → chunk-XZOYKB22.js} +2 -2
- package/dist/cli/chunks/chunk-YIDAXOUX.js +8 -0
- package/dist/cli/chunks/{chunk-LQEURY7C.js → chunk-YLKIXEPP.js} +1 -1
- package/dist/cli/chunks/chunk-YNVEDFPQ.js +2 -0
- package/dist/cli/chunks/{chunk-PGYMKGOE.js → chunk-YUA6ZKKY.js} +2 -2
- package/dist/cli/chunks/{chunk-GJMLK5UT.js → chunk-YVJEUX3I.js} +2 -2
- package/dist/cli/chunks/{chunk-AH3ZD3NJ.js → chunk-YWWMNTBF.js} +2 -2
- package/dist/cli/chunks/{chunk-37OWRCUN.js → chunk-ZGROHCOW.js} +2 -2
- package/dist/cli/chunks/{chunk-OEKP73MC.js → chunk-ZPVGX4DI.js} +2 -2
- package/dist/cli/chunks/{chunk-6GP6W46M.js → chunk-ZROAMFX2.js} +2 -2
- package/dist/cli/chunks/{chunk-OY3NJNP2.js → chunk-ZYOYR3UR.js} +1 -1
- package/dist/cli/chunks/ci-BZNWW3I3.js +81 -0
- package/dist/cli/chunks/{ci-config-7ODMNAUM.js → ci-config-LOHNXOKV.js} +2 -2
- package/dist/cli/chunks/{ci-output-FXZ7ZZW3.js → ci-output-LCOQBSJL.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-4VOUEPOX.js → circuit-breaker-7LRXTLFE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-7D4SGLM4.js → claude-flow-setup-HBU4VWC3.js} +2 -2
- package/dist/cli/chunks/client-4PNYDFYS.js +2 -0
- package/dist/cli/chunks/{cline-installer-WRRT7BGQ.js → cline-installer-CO6MLH6X.js} +2 -2
- package/dist/cli/chunks/{code-ZDJRIL3S.js → code-SIXBS6JM.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-4S4SHM56.js → code-index-extractor-GWJKZ2IQ.js} +2 -2
- package/dist/cli/chunks/{codex-installer-YTRHNDWR.js → codex-installer-6NINVWXJ.js} +2 -2
- package/dist/cli/chunks/{completions-6N64JUXJ.js → completions-7VIX3GML.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-I4A26VCJ.js → complexity-analyzer-FBQR6ZP2.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-IIDR66LB.js → continuedev-installer-VA7RIXW5.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-SVVFY3S2.js → copilot-installer-4QEBC4MU.js} +2 -2
- package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +2 -0
- package/dist/cli/chunks/{cost-tracker-VGFS6IBX.js → cost-tracker-GRYKHPWL.js} +2 -2
- package/dist/cli/chunks/coverage-USPMNKOU.js +50 -0
- package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +2 -0
- package/dist/cli/chunks/{cursor-installer-UPETT57E.js → cursor-installer-ZXIPSZVH.js} +2 -2
- package/dist/cli/chunks/{daemon-CQFNZLXU.js → daemon-D7F3RGI5.js} +3 -3
- package/dist/cli/chunks/{daemon-7BDJHEIJ.js → daemon-N2VRHPSJ.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-PJVABHON.js → dag-attention-scheduler-NL6BA7BY.js} +2 -2
- package/dist/cli/chunks/{detect-56SKAGWX.js → detect-XC2HCIIT.js} +2 -2
- package/dist/cli/chunks/{dist-node-UYTYUMLN.js → dist-node-A3Y26MEI.js} +2 -2
- package/dist/cli/chunks/{domain-handler-YOYLBYJE.js → domain-handler-WV6SFXRB.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-7TARX2XF.js → domain-plugins-KJIF6Z2B.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-AKVSBD6E.js → domain-transfer-L3F6AES2.js} +2 -2
- package/dist/cli/chunks/dream-QOB3JCOM.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-IS6HSR66.js → embed-and-insert-pattern-PA3Y4KGO.js} +2 -2
- package/dist/cli/chunks/{eval-GNB574IM.js → eval-YGEZNUVE.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-RCAOCKM7.js → experience-capture-middleware-D4T7NW6B.js} +3 -3
- package/dist/cli/chunks/{fast-paths-KTZ5SF54.js → fast-paths-6JYK7RYQ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KFHSR5YF.js → feature-flags-DKXMDVPE.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ITX5LQ57.js → feature-flags-RBH2GDSR.js} +2 -2
- package/dist/cli/chunks/file-discovery-BN76S2PR.js +2 -0
- package/dist/cli/chunks/fleet-43YMXACN.js +46 -0
- package/dist/cli/chunks/{gnn-wrapper-RLFW3GSX.js → gnn-wrapper-MV54UC4C.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-EM2URCYZ.js → heartbeat-handler-7DKMVQQH.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +2 -0
- package/dist/cli/chunks/hnsw-index-HE4AX22U.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-JMHEOIBH.js → hnsw-legacy-bridge-6IWREDQC.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-CBP73QHY.js → hnswlib-node-5BIESSCK.js} +2 -2
- package/dist/cli/chunks/{hooks-IP7XE34Z.js → hooks-3EETRM62.js} +30 -30
- package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-ONAYHU25.js → hypergraph-engine-RSWCB2D3.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VINJRAID.js → hypergraph-handler-552LXKL3.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +2 -0
- package/dist/cli/chunks/{init-guard-RYVV5R3Z.js → init-guard-OTDBJ5HD.js} +2 -2
- package/dist/cli/chunks/{init-handler-MPRGWMOE.js → init-handler-3FK3TKEA.js} +26 -25
- package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +2 -0
- package/dist/cli/chunks/kernel-2WZOQEZS.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-OPD7JBRL.js → kilocode-installer-KZ2O4LF3.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-M4OPUNK2.js → kiro-installer-MLCCXRF7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +2 -0
- package/dist/cli/chunks/{learning-4UWTQLMF.js → learning-QUCMBD77.js} +3 -3
- package/dist/cli/chunks/{llm-router-SQ56FF6Z.js → llm-router-PDEV3UP2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +2 -0
- package/dist/cli/chunks/{load-HPHKDGGL.js → load-XFVVLO7E.js} +2 -2
- package/dist/cli/chunks/load-test-BEWEE44J.js +2 -0
- package/dist/cli/chunks/{mcp-TELMAC7Z.js → mcp-74G3CL2S.js} +2 -2
- package/dist/cli/chunks/{memory-PFQ3KPVJ.js → memory-XIFM6JNX.js} +5 -5
- package/dist/cli/chunks/memory-backend-NYKBBKZR.js +2 -0
- package/dist/cli/chunks/memory-handlers-ZCKURV6S.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-3VDRX6TZ.js → multi-model-executor-7L4W3O2Q.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-PJ576R63.js → opencode-installer-BPG422LF.js} +2 -2
- package/dist/cli/chunks/{orchestrator-72QP4UU7.js → orchestrator-OEAFLAEV.js} +61 -23
- package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-754YQW7C.js → pattern-usage-recorder-LOPNCULT.js} +2 -2
- package/dist/cli/chunks/{pipeline-AVXY4MVB.js → pipeline-VWTYUZB7.js} +2 -2
- package/dist/cli/chunks/{platform-3E3DXLYB.js → platform-WFJJ3X2E.js} +2 -2
- package/dist/cli/chunks/{plugin-7FUQAKRE.js → plugin-744TPUSG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIB4F5NV.js → prime-radiant-advanced-wasm-BD5BLNDR.js} +2 -2
- package/dist/cli/chunks/project-root-C7ELXZRK.js +2 -0
- package/dist/cli/chunks/protocol-executor-SUVE33BM.js +2 -0
- package/dist/cli/chunks/{protocol-handler-BQRYMUTG.js → protocol-handler-JIBILI74.js} +2 -2
- package/dist/cli/chunks/{prove-H52QGC6B.js → prove-MNOL5FYW.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +2 -0
- package/dist/cli/chunks/{quality-QO4XPAUM.js → quality-JEGBDGGX.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FBKE5E6F.js → quality-gate-SYJ6ROMI.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +2 -0
- package/dist/cli/chunks/real-embeddings-ZWXS5ZFV.js +2 -0
- package/dist/cli/chunks/{ref-validation-LF76ZOBD.js → ref-validation-RRHUFW2N.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3BYEBTQ7.js → roocode-installer-XFO6JSVN.js} +2 -2
- package/dist/cli/chunks/router-4FTAVYLJ.js +2 -0
- package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +2 -0
- package/dist/cli/chunks/{routing-handler-DST7BVCU.js → routing-handler-L2K3JASE.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-XE32PGKC.js → ruvector-commands-A6CINHGM.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-VP32XC75.js → rvf-migration-coordinator-T4RY7L53.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-SH2AMVI7.js → rvf-store-integrity-IR33TGQS.js} +2 -2
- package/dist/cli/chunks/safe-db-QXDZ6QY3.js +2 -0
- package/dist/cli/chunks/schedule-CZKD6RIY.js +2 -0
- package/dist/cli/chunks/scheduler-BLA3Q4CH.js +2 -0
- package/dist/cli/chunks/{security-VSPNKCDS.js → security-Z5GDE2IH.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-HX6AHL3P.js → shared-rvf-adapter-SIZMEHPM.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-MX4FC2JE.js → shared-rvf-dual-writer-HLM65RDS.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +2 -0
- package/dist/cli/chunks/{standalone-memory-O4QUTK6L.js → standalone-memory-SKSZG7P5.js} +2 -2
- package/dist/cli/chunks/{status-handler-Z2BP6EOG.js → status-handler-766YOOMJ.js} +2 -2
- package/dist/cli/chunks/{structural-health-R36WNLQG.js → structural-health-M45FNOLT.js} +2 -2
- package/dist/cli/chunks/{sync-QF5Y3EMZ.js → sync-6CJ24B5T.js} +2 -2
- package/dist/cli/chunks/{sync-2ELWUFQU.js → sync-B2U366I3.js} +2 -2
- package/dist/cli/chunks/{task-handler-43PYE75J.js → task-handler-P6IFLCKP.js} +17 -15
- package/dist/cli/chunks/task-handlers-DPWMUKFC.js +9 -0
- package/dist/cli/chunks/{test-UWA377D4.js → test-TODH7KRF.js} +11 -11
- package/dist/cli/chunks/test-runner-process-46IPK3GH.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YQZPJRRN.js → test-scheduling-VMVMVRHT.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-F7C6UKTC.js → token-bootstrap-XQW7BMCK.js} +2 -2
- package/dist/cli/chunks/{token-usage-DO6WLMXP.js → token-usage-JCZEIRKO.js} +2 -2
- package/dist/cli/chunks/{transformers-H5RGFKVO.js → transformers-U2ML3OHE.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +2 -0
- package/dist/cli/chunks/{types-PJS2FGPF.js → types-GGEPCHP6.js} +2 -2
- package/dist/cli/chunks/unified-memory-FL26RTV3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +2 -0
- package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +2 -0
- package/dist/cli/chunks/{upgrade-4IC4F6AB.js → upgrade-T5GRM7HS.js} +2 -2
- package/dist/cli/chunks/{validate-DHUWW7PF.js → validate-XMUJPLP3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-OERQNOX5.js → validate-swarm-KJLF7JEH.js} +2 -2
- package/dist/cli/chunks/visual-security-IJVPO5FA.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-TV7DMKES.js → web-tree-sitter-LOHVZ7G5.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-QZPWSH37.js → windsurf-installer-33FBTXJU.js} +2 -2
- package/dist/cli/chunks/witness-chain-5FAFCQKP.js +2 -0
- package/dist/cli/chunks/witness-chain-V2M32W5D.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-RUXIOE7F.js → witness-chain-repair-VWBO4NXE.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-YXENHB42.js → witness-chain-verifier-BHJ3ZAEK.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-HL26AGFO.js → witness-key-manager-WNVPH2Z3.js} +2 -2
- package/dist/cli/chunks/{workflow-EOVVCN2E.js → workflow-6QR5MQTO.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +2 -0
- package/dist/cli/chunks/{wrappers-AGODHBOO.js → wrappers-EHOL62TS.js} +2 -2
- package/dist/cli/commands/ci.js +7 -0
- package/dist/cli/commands/coverage.js +7 -1
- package/dist/cli/commands/fleet.js +5 -2
- 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/commands/hooks-handlers/tool-loop-guardrail.js +11 -6
- package/dist/cli/commands/test.js +5 -2
- package/dist/cli/handlers/init-handler.d.ts +12 -0
- package/dist/cli/handlers/init-handler.js +27 -12
- package/dist/cli/handlers/task-handler.js +6 -0
- package/dist/cli/utils/ci-output.d.ts +2 -0
- package/dist/cli/utils/ci-output.js +2 -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 +5 -0
- package/dist/cli/utils/fleet-operation.js +7 -1
- package/dist/cli/utils/fleet-result.d.ts +5 -3
- package/dist/cli/utils/fleet-result.js +9 -3
- package/dist/cli/utils/progress.d.ts +16 -2
- package/dist/cli/utils/progress.js +31 -14
- package/dist/coordination/consensus/consensus-engine.js +3 -1
- package/dist/coordination/handlers/code-intelligence-handlers.js +3 -2
- package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
- package/dist/coordination/handlers/coverage-collection.js +5 -2
- 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-runner.d.ts +3 -8
- package/dist/coordination/handlers/coverage-runner.js +6 -22
- package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
- package/dist/coordination/handlers/coverage-scope.js +321 -0
- package/dist/coordination/handlers/coverage-stderr.d.ts +23 -0
- package/dist/coordination/handlers/coverage-stderr.js +39 -0
- package/dist/coordination/handlers/coverage-target.d.ts +9 -0
- package/dist/coordination/handlers/coverage-target.js +21 -8
- package/dist/coordination/handlers/handler-utils.d.ts +5 -0
- package/dist/coordination/handlers/handler-utils.js +11 -5
- package/dist/coordination/handlers/requirements-handlers.js +3 -2
- package/dist/coordination/handlers/security-handlers.js +34 -20
- package/dist/coordination/queen-coordinator.js +8 -3
- package/dist/coordination/task-executability.d.ts +12 -0
- package/dist/coordination/task-executability.js +27 -0
- package/dist/coordination/workflow-orchestrator.d.ts +6 -0
- package/dist/coordination/workflow-orchestrator.js +22 -8
- package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
- package/dist/domains/code-intelligence/services/product-factors-bridge.js +7 -4
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -0
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +10 -7
- package/dist/domains/coverage-analysis/services/coverage-parser.js +19 -10
- package/dist/domains/learning-optimization/interfaces.d.ts +2 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -1
- package/dist/domains/learning-optimization/services/metrics-optimizer.js +14 -4
- package/dist/domains/learning-optimization/services/production-intel.js +3 -1
- package/dist/domains/security-compliance/generic-finding-dedup.d.ts +40 -0
- package/dist/domains/security-compliance/generic-finding-dedup.js +63 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +14 -6
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -2
- package/dist/domains/security-compliance/services/security-auditor-sast.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor-secrets.js +2 -2
- package/dist/domains/security-compliance/services/security-auditor.js +3 -2
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +5 -14
- package/dist/domains/test-execution/interfaces.d.ts +11 -1
- package/dist/domains/test-execution/services/retry-outcome.d.ts +18 -0
- package/dist/domains/test-execution/services/retry-outcome.js +53 -0
- package/dist/domains/test-generation/coordinator.js +2 -2
- package/dist/domains/test-generation/services/pattern-matcher.js +4 -4
- package/dist/domains/test-generation/services/test-generator.js +2 -2
- package/dist/governance/evolution-pipeline-integration.js +3 -1
- package/dist/hooks/cross-phase-hooks.js +3 -1
- package/dist/init/init-wizard-steps.js +5 -1
- package/dist/init/phases/04-database.js +7 -0
- package/dist/init/phases/10-workers.js +42 -4
- package/dist/init/phases/12-verification.js +14 -4
- package/dist/init/settings-merge.js +7 -4
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +29 -0
- package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +70 -6
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +10 -3
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +13 -0
- package/dist/integrations/ruvector/filter-adapter.js +2 -1
- package/dist/learning/dream/insight-generator.js +5 -4
- 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/memory-auditor.js +3 -1
- package/dist/learning/qe-patterns.js +2 -1
- 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 +39 -0
- package/dist/learning/real-qe-reasoning-bank.js +108 -38
- package/dist/logging/redaction.js +142 -12
- package/dist/mcp/bundle.js +520 -503
- 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 +2 -0
- package/dist/mcp/handlers/domain-handler-configs.js +13 -2
- package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
- package/dist/mcp/handlers/orchestrate-routes.js +53 -0
- package/dist/mcp/handlers/task-handlers.d.ts +23 -1
- package/dist/mcp/handlers/task-handlers.js +90 -19
- package/dist/mcp/handlers/validation-pipeline-handler.js +9 -9
- package/dist/mcp/protocol-server.js +11 -8
- package/dist/mcp/qe-tool-bridge.js +3 -0
- package/dist/mcp/services/reasoning-bank-service.d.ts +9 -2
- package/dist/mcp/services/reasoning-bank-service.js +13 -0
- package/dist/mcp/tool-annotations.js +4 -1
- package/dist/mcp/tools/coherence/check.js +1 -0
- package/dist/mcp/tools/coherence/consensus.js +4 -2
- package/dist/mcp/tools/learning-optimization/optimize.js +1 -2
- package/dist/mcp/tools/mincut/index.js +3 -0
- package/dist/mcp/tools/quality-assessment/gate.js +7 -0
- package/dist/mcp/tools/qx-analysis/analyze.js +1 -0
- package/dist/mcp/tools/requirements-validation/quality-criteria.js +10 -3
- package/dist/mcp/tools/security-compliance/scan.js +4 -2
- package/dist/mcp/tools/test-execution/e2e-execute.js +2 -2
- package/dist/mcp/tools/test-execution/execute.js +3 -2
- package/dist/mcp/types.d.ts +14 -0
- package/dist/memory/crdt/crdt-store.js +5 -0
- package/dist/memory/crdt/lww-register.js +12 -2
- package/dist/optimization/early-exit-token-optimizer.js +3 -1
- package/dist/planning/goap-planner.js +5 -0
- package/dist/planning/plan-executor.js +5 -0
- package/dist/routing/advisor/redaction.js +22 -2
- package/dist/shared/io/confined-read.d.ts +74 -0
- package/dist/shared/io/confined-read.js +256 -0
- package/dist/shared/io/file-reader.d.ts +6 -6
- package/dist/shared/io/file-reader.js +16 -42
- package/dist/shared/llm/providers/claude-code.js +4 -1
- package/dist/shared/llm/providers/response-deadline.js +16 -2
- package/dist/shared/native-module-errors.d.ts +51 -0
- package/dist/shared/native-module-errors.js +129 -0
- package/dist/shared/safe-db.js +14 -4
- package/dist/shared/security/osv-client.js +4 -1
- package/dist/shared/types/index.js +3 -1
- package/dist/shared/types/test-frameworks.js +2 -2
- package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
- package/dist/sync/readers/json-reader.js +2 -1
- package/dist/validation/anchor-set.d.ts +6 -0
- package/dist/validation/anchor-set.js +9 -1
- package/dist/validation/quality-gate-runner.d.ts +7 -1
- package/dist/validation/quality-gate-runner.js +3 -3
- package/package.json +3 -3
- package/dist/cli/chunks/adapter-TR5SLAZC.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +0 -2
- package/dist/cli/chunks/base-GTB6POYE.js +0 -2
- package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +0 -2
- package/dist/cli/chunks/chunk-4SJYIX54.js +0 -3
- package/dist/cli/chunks/chunk-6P7424AO.js +0 -21
- package/dist/cli/chunks/chunk-6X5DHU6Q.js +0 -14
- package/dist/cli/chunks/chunk-CMBLM26R.js +0 -2
- package/dist/cli/chunks/chunk-DKAC3E3B.js +0 -3
- package/dist/cli/chunks/chunk-DURHK377.js +0 -742
- package/dist/cli/chunks/chunk-FPUDRSFJ.js +0 -180
- package/dist/cli/chunks/chunk-G5I6KGMW.js +0 -59
- package/dist/cli/chunks/chunk-HOZUDE4C.js +0 -2
- package/dist/cli/chunks/chunk-N6PIIK6G.js +0 -3
- package/dist/cli/chunks/chunk-NSHU347M.js +0 -2
- package/dist/cli/chunks/chunk-PPSAMXYN.js +0 -13
- package/dist/cli/chunks/chunk-TYFZXDGZ.js +0 -4
- package/dist/cli/chunks/chunk-U4OICXV2.js +0 -6
- package/dist/cli/chunks/chunk-WSF24I3D.js +0 -2
- package/dist/cli/chunks/chunk-XBVUVFJK.js +0 -4
- package/dist/cli/chunks/chunk-XUZDBQ5X.js +0 -6
- package/dist/cli/chunks/chunk-YBSBABOS.js +0 -2
- package/dist/cli/chunks/chunk-ZG5666GJ.js +0 -2
- package/dist/cli/chunks/ci-MSKMVH5X.js +0 -81
- package/dist/cli/chunks/client-POSVREVS.js +0 -2
- package/dist/cli/chunks/core-handlers-V243GY7X.js +0 -2
- package/dist/cli/chunks/coverage-B7MCGNTE.js +0 -49
- package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +0 -2
- package/dist/cli/chunks/dream-UA7MKOPQ.js +0 -2
- package/dist/cli/chunks/file-discovery-YCMNKZAK.js +0 -2
- package/dist/cli/chunks/fleet-2Y3ZE6CE.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +0 -2
- package/dist/cli/chunks/hnsw-index-DFUNARVD.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +0 -2
- package/dist/cli/chunks/init-wizard-NIMZ4J55.js +0 -2
- package/dist/cli/chunks/kernel-JQK7PRAI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +0 -2
- package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +0 -2
- package/dist/cli/chunks/load-test-UKNV5MWW.js +0 -2
- package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +0 -2
- package/dist/cli/chunks/memory-handlers-FCXN437E.js +0 -2
- package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +0 -2
- package/dist/cli/chunks/project-root-JCAUNL6O.js +0 -2
- package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +0 -2
- package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +0 -2
- package/dist/cli/chunks/real-embeddings-RWGOVOXO.js +0 -2
- package/dist/cli/chunks/router-3DIS5X4R.js +0 -2
- package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +0 -2
- package/dist/cli/chunks/safe-db-EVB4ZC7T.js +0 -2
- package/dist/cli/chunks/schedule-ORDDXXY4.js +0 -2
- package/dist/cli/chunks/scheduler-XFLJSFIU.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +0 -2
- package/dist/cli/chunks/task-handlers-KPWAEMKH.js +0 -9
- package/dist/cli/chunks/test-runner-process-3XZUYST2.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +0 -2
- package/dist/cli/chunks/unified-memory-EHD4VNFW.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +0 -2
- package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +0 -2
- package/dist/cli/chunks/visual-security-54MLFKWY.js +0 -2
- package/dist/cli/chunks/witness-chain-LC6Q2W27.js +0 -2
- package/dist/cli/chunks/witness-chain-QUIBAF3W.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +0 -2
|
@@ -134,6 +134,14 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
134
134
|
private findHighlights;
|
|
135
135
|
private findSemanticHighlights;
|
|
136
136
|
private fileToKey;
|
|
137
|
+
/**
|
|
138
|
+
* Content identity for the analysis and embedding caches.
|
|
139
|
+
*
|
|
140
|
+
* This keys cache entries, so it has to separate any two distinct inputs.
|
|
141
|
+
* A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
|
|
142
|
+
* "Aa" and "BB" collide, so two different functions would share one entry
|
|
143
|
+
* and the second caller would receive the first one's result.
|
|
144
|
+
*/
|
|
137
145
|
private hashCode;
|
|
138
146
|
private cacheEmbedding;
|
|
139
147
|
private cacheAnalysis;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Agentic QE v3 - Semantic Analyzer Service
|
|
3
3
|
* Semantic code analysis using vector embeddings and HNSW search
|
|
4
4
|
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
5
6
|
import { ok, err } from '../../../shared/types/index.js';
|
|
6
7
|
import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
|
|
7
8
|
import { toError } from '../../../shared/error-utils.js';
|
|
@@ -635,14 +636,16 @@ export class SemanticAnalyzerService {
|
|
|
635
636
|
fileToKey(file) {
|
|
636
637
|
return file.replace(/[/\\]/g, ':').replace(/\./g, '_');
|
|
637
638
|
}
|
|
639
|
+
/**
|
|
640
|
+
* Content identity for the analysis and embedding caches.
|
|
641
|
+
*
|
|
642
|
+
* This keys cache entries, so it has to separate any two distinct inputs.
|
|
643
|
+
* A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
|
|
644
|
+
* "Aa" and "BB" collide, so two different functions would share one entry
|
|
645
|
+
* and the second caller would receive the first one's result.
|
|
646
|
+
*/
|
|
638
647
|
hashCode(str) {
|
|
639
|
-
|
|
640
|
-
for (let i = 0; i < str.length; i++) {
|
|
641
|
-
const char = str.charCodeAt(i);
|
|
642
|
-
hash = (hash << 5) - hash + char;
|
|
643
|
-
hash = hash & hash;
|
|
644
|
-
}
|
|
645
|
-
return hash.toString(16);
|
|
648
|
+
return createHash('sha256').update(str, 'utf8').digest('hex');
|
|
646
649
|
}
|
|
647
650
|
cacheEmbedding(key, embedding) {
|
|
648
651
|
if (this.embeddingCache.size >= this.config.cacheSize) {
|
|
@@ -19,6 +19,15 @@
|
|
|
19
19
|
import * as fs from 'fs/promises';
|
|
20
20
|
import * as path from 'path';
|
|
21
21
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
22
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
23
|
+
/**
|
|
24
|
+
* #1161: coverage reports are found under caller-named directories, so read
|
|
25
|
+
* them from a validated descriptor: a report linked out of the project, or to
|
|
26
|
+
* a device such as /dev/zero, is refused instead of read.
|
|
27
|
+
*/
|
|
28
|
+
function readCoverageFile(file) {
|
|
29
|
+
return readConfinedText(file, { outsideRoot: 'allow' });
|
|
30
|
+
}
|
|
22
31
|
// ============================================================================
|
|
23
32
|
// LCOV Parser
|
|
24
33
|
// ============================================================================
|
|
@@ -28,7 +37,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
28
37
|
* LCOV format is the most common output from Istanbul, nyc, c8, etc.
|
|
29
38
|
*/
|
|
30
39
|
export async function parseLCOV(lcovPath, projectRoot) {
|
|
31
|
-
const content = await
|
|
40
|
+
const content = await readCoverageFile(lcovPath);
|
|
32
41
|
return parseLCOVContent(content, projectRoot || path.dirname(lcovPath));
|
|
33
42
|
}
|
|
34
43
|
/**
|
|
@@ -221,7 +230,7 @@ export function parseLCOVContent(content, projectRoot) {
|
|
|
221
230
|
* Parse JSON coverage data (Istanbul/Vitest format)
|
|
222
231
|
*/
|
|
223
232
|
export async function parseJSONCoverage(jsonPath, projectRoot) {
|
|
224
|
-
const content = await
|
|
233
|
+
const content = await readCoverageFile(jsonPath);
|
|
225
234
|
const data = safeJsonParse(content);
|
|
226
235
|
const root = projectRoot || path.dirname(jsonPath);
|
|
227
236
|
const files = new Map();
|
|
@@ -334,7 +343,7 @@ export async function parseJSONCoverage(jsonPath, projectRoot) {
|
|
|
334
343
|
* <report><package><class><method><counter type="LINE" missed="X" covered="Y"/></method></class></package></report>
|
|
335
344
|
*/
|
|
336
345
|
export async function parseJaCoCo(xmlPath, projectRoot) {
|
|
337
|
-
const content = await
|
|
346
|
+
const content = await readCoverageFile(xmlPath);
|
|
338
347
|
return parseJaCoCoContent(content, projectRoot || path.dirname(xmlPath));
|
|
339
348
|
}
|
|
340
349
|
export function parseJaCoCoContent(content, projectRoot) {
|
|
@@ -437,7 +446,7 @@ function parseJaCoCoCounters(xml) {
|
|
|
437
446
|
* <Root CoveredStatements="X" TotalStatements="Y"><Assembly><Namespace><Type><Member Statement="..."/></Type></Namespace></Assembly></Root>
|
|
438
447
|
*/
|
|
439
448
|
export async function parseDotcover(xmlPath, projectRoot) {
|
|
440
|
-
const content = await
|
|
449
|
+
const content = await readCoverageFile(xmlPath);
|
|
441
450
|
return parseDotcoverContent(content, projectRoot || path.dirname(xmlPath));
|
|
442
451
|
}
|
|
443
452
|
export function parseDotcoverContent(content, projectRoot) {
|
|
@@ -531,7 +540,7 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
531
540
|
* Also handles tarpaulin LCOV output by delegating to parseLCOVContent.
|
|
532
541
|
*/
|
|
533
542
|
export async function parseTarpaulin(filePath, projectRoot) {
|
|
534
|
-
const content = await
|
|
543
|
+
const content = await readCoverageFile(filePath);
|
|
535
544
|
const root = projectRoot || path.dirname(filePath);
|
|
536
545
|
// If it looks like LCOV, delegate
|
|
537
546
|
if (content.includes('SF:') && content.includes('end_of_record')) {
|
|
@@ -603,7 +612,7 @@ export function parseTarpaulinContent(content, projectRoot) {
|
|
|
603
612
|
* pkg/file.go:startLine.startCol,endLine.endCol numStatements count
|
|
604
613
|
*/
|
|
605
614
|
export async function parseGoCover(coverPath, projectRoot) {
|
|
606
|
-
const content = await
|
|
615
|
+
const content = await readCoverageFile(coverPath);
|
|
607
616
|
return parseGoCoverContent(content, projectRoot || path.dirname(coverPath));
|
|
608
617
|
}
|
|
609
618
|
export function parseGoCoverContent(content, projectRoot) {
|
|
@@ -681,7 +690,7 @@ export function parseGoCoverContent(content, projectRoot) {
|
|
|
681
690
|
* but sets the format and language appropriately.
|
|
682
691
|
*/
|
|
683
692
|
export async function parseKover(xmlPath, projectRoot) {
|
|
684
|
-
const content = await
|
|
693
|
+
const content = await readCoverageFile(xmlPath);
|
|
685
694
|
const report = parseJaCoCoContent(content, projectRoot || path.dirname(xmlPath));
|
|
686
695
|
report.format = 'kover';
|
|
687
696
|
report.language = 'kotlin';
|
|
@@ -698,7 +707,7 @@ export async function parseKover(xmlPath, projectRoot) {
|
|
|
698
707
|
* { "targets": [ { "files": [ { "path": "...", "lineCoverage": 0.85, "coveredLines": N, "executableLines": N, "functions": [...] } ] } ] }
|
|
699
708
|
*/
|
|
700
709
|
export async function parseXcresult(jsonPath, projectRoot) {
|
|
701
|
-
const content = await
|
|
710
|
+
const content = await readCoverageFile(jsonPath);
|
|
702
711
|
return parseXcresultContent(content, projectRoot || path.dirname(jsonPath));
|
|
703
712
|
}
|
|
704
713
|
export function parseXcresultContent(content, projectRoot) {
|
|
@@ -830,7 +839,7 @@ export async function parseCoverage(coveragePath, projectRoot, format, language)
|
|
|
830
839
|
return parseXcresult(coveragePath, projectRoot);
|
|
831
840
|
}
|
|
832
841
|
// Content-based detection
|
|
833
|
-
const content = await
|
|
842
|
+
const content = await readCoverageFile(coveragePath);
|
|
834
843
|
const trimmed = content.trim();
|
|
835
844
|
if (trimmed.startsWith('{')) {
|
|
836
845
|
// Check for tarpaulin JSON structure
|
|
@@ -869,7 +878,7 @@ export async function parseCoverage(coveragePath, projectRoot, format, language)
|
|
|
869
878
|
// Language-based fallback: try the first format associated with the language
|
|
870
879
|
if (language) {
|
|
871
880
|
const langLower = language.toLowerCase();
|
|
872
|
-
const hints = LANGUAGE_FORMAT_HINTS[langLower];
|
|
881
|
+
const hints = Object.hasOwn(LANGUAGE_FORMAT_HINTS, langLower) ? LANGUAGE_FORMAT_HINTS[langLower] : undefined; // #1157
|
|
873
882
|
if (hints && hints.length > 0) {
|
|
874
883
|
try {
|
|
875
884
|
return await parseCoverage(coveragePath, projectRoot, hints[0]);
|
|
@@ -36,6 +36,8 @@ export interface PatternContext {
|
|
|
36
36
|
readonly testType?: string;
|
|
37
37
|
readonly codeContext?: string;
|
|
38
38
|
readonly tags: string[];
|
|
39
|
+
/** Explicit strategy objective; absent means no requested direction. */
|
|
40
|
+
readonly objective?: Pick<OptimizationObjective, 'metric' | 'direction'>;
|
|
39
41
|
}
|
|
40
42
|
export interface PatternTemplate {
|
|
41
43
|
readonly type: 'code' | 'prompt' | 'workflow' | 'config';
|
|
@@ -290,7 +290,8 @@ Provide:
|
|
|
290
290
|
let output = pattern.template.content;
|
|
291
291
|
// Replace template variables
|
|
292
292
|
for (const variable of pattern.template.variables) {
|
|
293
|
-
|
|
293
|
+
// #1157: the variable name comes from a stored pattern; read own values only.
|
|
294
|
+
const value = (Object.hasOwn(variables, variable.name) ? variables[variable.name] : undefined) ?? variable.defaultValue;
|
|
294
295
|
if (variable.required && value === undefined) {
|
|
295
296
|
return err(new Error(`Required variable ${variable.name} not provided`));
|
|
296
297
|
}
|
|
@@ -186,11 +186,21 @@ export class MetricsOptimizerService {
|
|
|
186
186
|
async recommendStrategy(context) {
|
|
187
187
|
try {
|
|
188
188
|
// Search for strategies that worked well in similar contexts
|
|
189
|
-
const keys = await this.memory.search('learning:strategy:optimized:*', 100);
|
|
189
|
+
const keys = await this.memory.search('learning:strategy:optimized:*', 100, { namespace: 'learning-optimization' });
|
|
190
190
|
const candidates = [];
|
|
191
|
-
for (const
|
|
192
|
-
|
|
193
|
-
|
|
191
|
+
for (const found of keys) {
|
|
192
|
+
// SQLite returns bare keys; in-memory search includes the namespace.
|
|
193
|
+
// get() applies that namespace separately, as storeOptimizationResult does.
|
|
194
|
+
const prefix = 'learning-optimization:';
|
|
195
|
+
const key = found.startsWith(prefix) ? found.slice(prefix.length) : found;
|
|
196
|
+
const optimized = await this.memory.get(key, { namespace: 'learning-optimization' });
|
|
197
|
+
if (optimized
|
|
198
|
+
&& context.tags.includes(optimized.domain)
|
|
199
|
+
&& context.tags.includes(optimized.objective.metric)
|
|
200
|
+
&& (!context.objective || (context.tags.includes(context.objective.metric)
|
|
201
|
+
&& optimized.objective.metric === context.objective.metric
|
|
202
|
+
&& optimized.objective.direction === context.objective.direction))
|
|
203
|
+
&& optimized.confidence > 0.6) {
|
|
194
204
|
const contextScore = this.scoreContextMatch(optimized, context);
|
|
195
205
|
const performanceScore = optimized.improvement * optimized.confidence;
|
|
196
206
|
candidates.push({
|
|
@@ -7,6 +7,7 @@ import { ok, err } from '../../../shared/types/index.js';
|
|
|
7
7
|
import { TimeRange } from '../../../shared/value-objects/index.js';
|
|
8
8
|
import { toError } from '../../../shared/error-utils.js';
|
|
9
9
|
import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
|
|
10
|
+
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
10
11
|
const DEFAULT_CONFIG = {
|
|
11
12
|
metricsRetentionDays: 90,
|
|
12
13
|
anomalyThreshold: 2.5,
|
|
@@ -268,7 +269,8 @@ export class ProductionIntelService {
|
|
|
268
269
|
async getDomainHealth(domain) {
|
|
269
270
|
const timeRange = TimeRange.lastNDays(1);
|
|
270
271
|
const metricsResult = await this.getMetricsHistory('*', timeRange, domain);
|
|
271
|
-
|
|
272
|
+
// #1157: metric names come from stored production metrics.
|
|
273
|
+
const metrics = createSafeRecord();
|
|
272
274
|
if (metricsResult.success) {
|
|
273
275
|
for (const metric of metricsResult.value) {
|
|
274
276
|
if (!metrics[metric.name]) {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: drop the generic eval/exec finding that language-specific SAST
|
|
3
|
+
* already reported as code injection on the same line.
|
|
4
|
+
*
|
|
5
|
+
* The scan-security task runs text patterns over every file and SAST over
|
|
6
|
+
* JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
|
|
7
|
+
* CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
|
|
8
|
+
* the same finding. Other generic rules (secrets, CORS, debug mode) can flag
|
|
9
|
+
* a different value or a higher severity on a line SAST also matched, so
|
|
10
|
+
* they are always kept.
|
|
11
|
+
*/
|
|
12
|
+
/** Title of the generic-pattern eval/exec finding in the scan-security handler. */
|
|
13
|
+
export declare const GENERIC_EVAL_EXEC_TITLE = "Dangerous eval/exec usage";
|
|
14
|
+
interface LocatedFinding {
|
|
15
|
+
title: string;
|
|
16
|
+
severity?: string;
|
|
17
|
+
location: {
|
|
18
|
+
file: string;
|
|
19
|
+
line?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
interface SastFinding {
|
|
23
|
+
severity?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
references?: readonly string[];
|
|
26
|
+
location: {
|
|
27
|
+
file: string;
|
|
28
|
+
line?: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generic findings without the eval/exec matches SAST already reported as
|
|
33
|
+
* CWE-95 on the same real file and line, at the same or a higher severity, so
|
|
34
|
+
* dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
|
|
35
|
+
* eval/exec match is eval alone; a line that also calls exec() is kept,
|
|
36
|
+
* since SAST's eval rule does not report the exec call.
|
|
37
|
+
*/
|
|
38
|
+
export declare function dropGenericEvalCoveredBySast<T extends LocatedFinding>(generic: readonly T[], sast: readonly SastFinding[], isEvalOnly: (finding: T) => boolean): Promise<T[]>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=generic-finding-dedup.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: drop the generic eval/exec finding that language-specific SAST
|
|
3
|
+
* already reported as code injection on the same line.
|
|
4
|
+
*
|
|
5
|
+
* The scan-security task runs text patterns over every file and SAST over
|
|
6
|
+
* JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
|
|
7
|
+
* CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
|
|
8
|
+
* the same finding. Other generic rules (secrets, CORS, debug mode) can flag
|
|
9
|
+
* a different value or a higher severity on a line SAST also matched, so
|
|
10
|
+
* they are always kept.
|
|
11
|
+
*/
|
|
12
|
+
import { realpath } from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
/** Title of the generic-pattern eval/exec finding in the scan-security handler. */
|
|
15
|
+
export const GENERIC_EVAL_EXEC_TITLE = 'Dangerous eval/exec usage';
|
|
16
|
+
/** CWE-95 (eval injection): SAST's eval() and Function-constructor rules. */
|
|
17
|
+
function isEvalInjection(finding) {
|
|
18
|
+
return /\[CWE-95\]/.test(finding.description ?? '') ||
|
|
19
|
+
(finding.references ?? []).some(ref => /\/definitions\/95\.html$/.test(ref));
|
|
20
|
+
}
|
|
21
|
+
const SEVERITY_RANK = {
|
|
22
|
+
informational: 0, low: 1, medium: 2, high: 3, critical: 4,
|
|
23
|
+
};
|
|
24
|
+
const rank = (severity) => SEVERITY_RANK[severity ?? ''] ?? -1;
|
|
25
|
+
async function realPathOf(file, cache) {
|
|
26
|
+
const resolved = path.resolve(file);
|
|
27
|
+
let real = cache.get(resolved);
|
|
28
|
+
if (real === undefined) {
|
|
29
|
+
real = await realpath(resolved).catch(() => resolved);
|
|
30
|
+
cache.set(resolved, real);
|
|
31
|
+
}
|
|
32
|
+
return real;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generic findings without the eval/exec matches SAST already reported as
|
|
36
|
+
* CWE-95 on the same real file and line, at the same or a higher severity, so
|
|
37
|
+
* dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
|
|
38
|
+
* eval/exec match is eval alone; a line that also calls exec() is kept,
|
|
39
|
+
* since SAST's eval rule does not report the exec call.
|
|
40
|
+
*/
|
|
41
|
+
export async function dropGenericEvalCoveredBySast(generic, sast, isEvalOnly) {
|
|
42
|
+
const evalSast = sast.filter(isEvalInjection);
|
|
43
|
+
if (evalSast.length === 0)
|
|
44
|
+
return [...generic];
|
|
45
|
+
const cache = new Map();
|
|
46
|
+
// Highest SAST CWE-95 severity per real file and line.
|
|
47
|
+
const covered = new Map();
|
|
48
|
+
for (const finding of evalSast) {
|
|
49
|
+
const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
|
|
50
|
+
covered.set(key, Math.max(covered.get(key) ?? -1, rank(finding.severity)));
|
|
51
|
+
}
|
|
52
|
+
const kept = [];
|
|
53
|
+
for (const finding of generic) {
|
|
54
|
+
const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
|
|
55
|
+
const sastRank = covered.get(key);
|
|
56
|
+
const duplicate = finding.title === GENERIC_EVAL_EXEC_TITLE && isEvalOnly(finding) &&
|
|
57
|
+
sastRank !== undefined && sastRank >= rank(finding.severity);
|
|
58
|
+
if (!duplicate)
|
|
59
|
+
kept.push(finding);
|
|
60
|
+
}
|
|
61
|
+
return kept;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=generic-finding-dedup.js.map
|
|
@@ -22,28 +22,33 @@
|
|
|
22
22
|
* complete, with a reason; each member can be scanned directly.
|
|
23
23
|
*/
|
|
24
24
|
import * as fs from 'fs/promises';
|
|
25
|
+
// #1161: manifests and lockfiles are read from a validated descriptor; one
|
|
26
|
+
// linked out of the project, or to a device, is refused instead of read.
|
|
27
|
+
import { readConfinedText } from '../../../../shared/io/confined-read.js';
|
|
25
28
|
import * as path from 'path';
|
|
26
29
|
import semver from 'semver';
|
|
27
30
|
import { parse as parseYaml } from 'yaml';
|
|
28
31
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
29
32
|
import { classifyNpmSpec, exactNpmVersion } from '../../../../shared/security/osv-lookup.js';
|
|
33
|
+
import { createSafeRecord, getOwn, setOwn } from '../../../../shared/utils/safe-record.js';
|
|
30
34
|
import { LOCKFILES, parseLockfile } from './lockfile-versions.js';
|
|
31
35
|
/** The reason a workspace root's scan is not complete (#1057). */
|
|
32
36
|
export const WORKSPACE_NOT_SCANNED = 'workspace member dependencies are not scanned yet (#1057); scan each member directory separately';
|
|
33
37
|
const OUT_OF_SYNC = 'lockfile out of sync with package.json';
|
|
34
38
|
/** All declared dependencies of a manifest (later fields win, as npm resolves them). */
|
|
35
39
|
export function declaredDependencies(manifest) {
|
|
36
|
-
|
|
40
|
+
// #1157: a dependency named `__proto__` is kept as an own entry, not dropped.
|
|
41
|
+
const out = createSafeRecord();
|
|
37
42
|
for (const field of ['peerDependencies', 'optionalDependencies', 'devDependencies', 'dependencies']) {
|
|
38
43
|
for (const [name, spec] of Object.entries(manifest[field] ?? {})) {
|
|
39
44
|
if (typeof spec === 'string')
|
|
40
|
-
out
|
|
45
|
+
setOwn(out, name, spec);
|
|
41
46
|
}
|
|
42
47
|
}
|
|
43
48
|
return out;
|
|
44
49
|
}
|
|
45
50
|
async function readManifest(file) {
|
|
46
|
-
return safeJsonParse(await
|
|
51
|
+
return safeJsonParse(await readConfinedText(file, { outsideRoot: 'allow' }));
|
|
47
52
|
}
|
|
48
53
|
async function exists(file) {
|
|
49
54
|
try {
|
|
@@ -123,7 +128,7 @@ async function pnpmDeclaresPackages(file) {
|
|
|
123
128
|
const st = await fs.stat(file); // follows a link; a dangling one throws
|
|
124
129
|
if (!st.isFile() || st.size > MAX_PNPM_WORKSPACE_BYTES)
|
|
125
130
|
return true;
|
|
126
|
-
const text = await
|
|
131
|
+
const text = await readConfinedText(file, { outsideRoot: 'allow', maxBytes: MAX_PNPM_WORKSPACE_BYTES });
|
|
127
132
|
doc = parseYaml(text, { uniqueKeys: false, merge: true, maxAliasCount: 100 });
|
|
128
133
|
}
|
|
129
134
|
catch {
|
|
@@ -182,7 +187,10 @@ export function resolveFromRecord(dependencies, lockedVersions = {}) {
|
|
|
182
187
|
members: () => [],
|
|
183
188
|
hasImporter: () => true,
|
|
184
189
|
recordedSpec: () => null,
|
|
185
|
-
resolve: (_importer, name) =>
|
|
190
|
+
resolve: (_importer, name) => {
|
|
191
|
+
const version = getOwn(lockedVersions, name);
|
|
192
|
+
return version !== undefined ? { version } : undefined;
|
|
193
|
+
},
|
|
186
194
|
};
|
|
187
195
|
return Object.entries(dependencies).map(([name, spec]) => resolveOne(name, spec, '', index, new Set()));
|
|
188
196
|
}
|
|
@@ -202,7 +210,7 @@ export async function resolveDependencies(manifestPath) {
|
|
|
202
210
|
if (found) {
|
|
203
211
|
const member = path.relative(found.dir, realManifestDir).split(path.sep).join('/');
|
|
204
212
|
try {
|
|
205
|
-
const parsed = parseLockfile(found.file, await
|
|
213
|
+
const parsed = parseLockfile(found.file, await readConfinedText(path.join(found.dir, found.file), { outsideRoot: 'allow' }));
|
|
206
214
|
const rootManifest = member ? await readManifest(path.join(found.dir, 'package.json')).catch(() => ({})) : manifest;
|
|
207
215
|
// A member scanned directly: the root lockfile covers it if it lists the
|
|
208
216
|
// importer (npm/pnpm) or, for yarn, if the root declares workspaces.
|
|
@@ -11,6 +11,7 @@ import { ok, err } from '../../../../shared/types/index.js';
|
|
|
11
11
|
import { ALL_SECURITY_PATTERNS, BUILT_IN_RULE_SETS } from './security-patterns.js';
|
|
12
12
|
import { toError } from '../../../../shared/error-utils.js';
|
|
13
13
|
import { safeJsonParse } from '../../../../shared/safe-json.js';
|
|
14
|
+
import { readConfinedFile } from '../../../../shared/io/confined-read.js';
|
|
14
15
|
import { CLAUDE_TIER_MODELS, DEFAULT_OPUS_MODEL } from '../../../../shared/llm/model-registry.js';
|
|
15
16
|
import { isSemgrepAvailable, runSemgrepWithRules, convertSemgrepFindings, } from '../semgrep-integration.js';
|
|
16
17
|
// ============================================================================
|
|
@@ -303,8 +304,9 @@ export class SASTScanner {
|
|
|
303
304
|
let content;
|
|
304
305
|
let sourceDigest;
|
|
305
306
|
try {
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
// #1161: open once and validate the opened descriptor, so a file swapped
|
|
308
|
+
// after the sast-scan path check cannot redirect the read.
|
|
309
|
+
const bytes = await readConfinedFile(filePath, { outsideRoot: 'allow' });
|
|
308
310
|
sourceDigest = createHash('sha256').update(bytes).digest('hex');
|
|
309
311
|
content = bytes.toString('utf8');
|
|
310
312
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
-
import
|
|
7
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
/**
|
|
10
10
|
* Get the default SAST vulnerability patterns for JS/TS analysis
|
|
@@ -173,7 +173,7 @@ export async function performSASTScan(findSourceFiles, shouldExclude) {
|
|
|
173
173
|
continue;
|
|
174
174
|
}
|
|
175
175
|
try {
|
|
176
|
-
const content = await
|
|
176
|
+
const content = await readConfinedText(filePath, { outsideRoot: 'allow' }); // #1161
|
|
177
177
|
const lines = content.split('\n');
|
|
178
178
|
filesScanned++;
|
|
179
179
|
linesScanned += lines.length;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Extracted from security-auditor.ts - Secret/credential detection
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
|
-
import
|
|
6
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
7
7
|
/**
|
|
8
8
|
* Get the comprehensive set of secret detection patterns
|
|
9
9
|
*/
|
|
@@ -198,7 +198,7 @@ export function validateSecret(type, value) {
|
|
|
198
198
|
export async function scanFileForSecrets(file) {
|
|
199
199
|
const secrets = [];
|
|
200
200
|
try {
|
|
201
|
-
const content = await
|
|
201
|
+
const content = await readConfinedText(file.value, { outsideRoot: 'allow' }); // #1161
|
|
202
202
|
const lines = content.split('\n');
|
|
203
203
|
const secretPatterns = getSecretPatterns();
|
|
204
204
|
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
13
13
|
import { v4 as uuidv4 } from 'uuid';
|
|
14
14
|
import * as fs from 'fs/promises';
|
|
15
|
+
import { readConfinedText } from '../../../shared/io/confined-read.js';
|
|
15
16
|
import * as path from 'path';
|
|
16
17
|
import { ok, err } from '../../../shared/types/index.js';
|
|
17
18
|
import { toError } from '../../../shared/error-utils.js';
|
|
@@ -249,7 +250,7 @@ export class SecurityAuditorService {
|
|
|
249
250
|
const dependencies = [];
|
|
250
251
|
try {
|
|
251
252
|
if (ecosystem === 'npm') {
|
|
252
|
-
const content = await
|
|
253
|
+
const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
|
|
253
254
|
const packageJson = safeJsonParse(content);
|
|
254
255
|
const allDeps = {
|
|
255
256
|
...packageJson.dependencies,
|
|
@@ -263,7 +264,7 @@ export class SecurityAuditorService {
|
|
|
263
264
|
}
|
|
264
265
|
}
|
|
265
266
|
else if (ecosystem === 'pip') {
|
|
266
|
-
const content = await
|
|
267
|
+
const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
|
|
267
268
|
const lines = content.split('\n');
|
|
268
269
|
for (const line of lines) {
|
|
269
270
|
const trimmed = line.trim();
|
|
@@ -125,7 +125,8 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
|
|
|
125
125
|
runTests(request: SimpleTestRequest): Promise<Result<TestRunResult, Error>>;
|
|
126
126
|
/**
|
|
127
127
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
128
|
-
* the retries did to the run (#1130).
|
|
128
|
+
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
129
|
+
* as passed and flaky in the run's own counts (#1170).
|
|
129
130
|
*/
|
|
130
131
|
private retryFailures;
|
|
131
132
|
/**
|
|
@@ -9,6 +9,7 @@ import { TestExecutionEvents, createEvent, } from '../../shared/events/index.js'
|
|
|
9
9
|
import { TestExecutorService } from './services/test-executor.js';
|
|
10
10
|
import { FlakyDetectorService } from './services/flaky-detector.js';
|
|
11
11
|
import { RetryHandlerService } from './services/retry-handler.js';
|
|
12
|
+
import { applyRetryOutcome } from './services/retry-outcome.js';
|
|
12
13
|
import { TestPrioritizerService } from './services/test-prioritizer.js';
|
|
13
14
|
import { createE2ETestRunnerService, } from './services/e2e-runner.js';
|
|
14
15
|
import { createDomainFinding, } from '../../coordination/consensus/domain-findings.js';
|
|
@@ -162,7 +163,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
162
163
|
}
|
|
163
164
|
/**
|
|
164
165
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
165
|
-
* the retries did to the run (#1130).
|
|
166
|
+
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
167
|
+
* as passed and flaky in the run's own counts (#1170).
|
|
166
168
|
*/
|
|
167
169
|
async retryFailures(run, retryCount) {
|
|
168
170
|
if (!retryCount || retryCount <= 0)
|
|
@@ -179,17 +181,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
179
181
|
});
|
|
180
182
|
if (!retried.success)
|
|
181
183
|
return;
|
|
182
|
-
|
|
183
|
-
run.retries = {
|
|
184
|
-
totalRetries: retried.value.retried,
|
|
185
|
-
nowPassing: retried.value.nowPassing,
|
|
186
|
-
stillFailing: retried.value.stillFailing,
|
|
187
|
-
tests: (retried.value.tests ?? []).map(({ testId, ...outcome }) => ({
|
|
188
|
-
name: byId.get(testId)?.testName ?? testId,
|
|
189
|
-
file: byId.get(testId)?.file ?? '',
|
|
190
|
-
...outcome,
|
|
191
|
-
})),
|
|
192
|
-
};
|
|
184
|
+
applyRetryOutcome(run, retried.value);
|
|
193
185
|
}
|
|
194
186
|
/**
|
|
195
187
|
* Detect test framework from file patterns and project configuration
|
|
@@ -686,11 +678,10 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
686
678
|
/**
|
|
687
679
|
* Record execution results for DT learning
|
|
688
680
|
*/
|
|
689
|
-
async recordExecutionResults(runId, testFiles, result,
|
|
681
|
+
async recordExecutionResults(runId, testFiles, result, _prioritizationInfo) {
|
|
690
682
|
// Record each test execution for learning
|
|
691
683
|
for (let i = 0; i < testFiles.length; i++) {
|
|
692
684
|
const testId = this.generateTestId(testFiles[i]);
|
|
693
|
-
const info = prioritizationInfo;
|
|
694
685
|
// Find if this test failed (check if it's in failed tests)
|
|
695
686
|
const failedTest = result.failedTests.find(t => t.file === testFiles[i]);
|
|
696
687
|
const passed = !failedTest;
|
|
@@ -80,6 +80,11 @@ export interface ITestRunResult {
|
|
|
80
80
|
fileCoverages?: IFileCoverageData[];
|
|
81
81
|
/** #1130: what the requested retries of failed tests did. Absent when none were requested. */
|
|
82
82
|
retries?: IRunRetrySummary;
|
|
83
|
+
/**
|
|
84
|
+
* #1170: tests that failed and then passed on a retry. They are counted in
|
|
85
|
+
* `passed`, not `failed`. Absent when no test passed on a retry.
|
|
86
|
+
*/
|
|
87
|
+
flaky?: number;
|
|
83
88
|
}
|
|
84
89
|
/** #1130: the measured outcome of a run's retries, per failed test. */
|
|
85
90
|
export interface IRunRetrySummary {
|
|
@@ -102,8 +107,13 @@ export interface ITestCaseResult {
|
|
|
102
107
|
status: 'passed' | 'failed' | 'skipped';
|
|
103
108
|
/** Runner-reported duration in ms; omitted when the runner reported none. */
|
|
104
109
|
duration?: number;
|
|
105
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* The runner's failure message for a failed test, or for the failed first
|
|
112
|
+
* attempt of a flaky test, when it reported one.
|
|
113
|
+
*/
|
|
106
114
|
failureMessage?: string;
|
|
115
|
+
/** #1170: the test failed and then passed on a retry, so it is `passed`. */
|
|
116
|
+
flaky?: true;
|
|
107
117
|
}
|
|
108
118
|
export interface IFileCoverageData {
|
|
109
119
|
path: string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: a run's final outcome after its failed tests were retried.
|
|
3
|
+
*
|
|
4
|
+
* A test that failed and then passed on a retry is passed, and flaky: it
|
|
5
|
+
* leaves `failed`/`failedTests`, its runner test case reads `passed` with
|
|
6
|
+
* `flaky: true`, and the run counts it in `flaky`. A test whose retries all
|
|
7
|
+
* failed, or whose retry matched no test, stays failed.
|
|
8
|
+
*/
|
|
9
|
+
import type { IRetryResult, ITestRunResult } from '../interfaces';
|
|
10
|
+
/**
|
|
11
|
+
* Default retries of a failed test, shared by `aqe test execute` and MCP
|
|
12
|
+
* `test_execute_parallel` so both surfaces rerun a failure the same number of
|
|
13
|
+
* times (#1170).
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_TEST_RETRY_COUNT = 2;
|
|
16
|
+
/** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
|
|
17
|
+
export declare function applyRetryOutcome(run: ITestRunResult, retried: IRetryResult): void;
|
|
18
|
+
//# sourceMappingURL=retry-outcome.d.ts.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1170: a run's final outcome after its failed tests were retried.
|
|
3
|
+
*
|
|
4
|
+
* A test that failed and then passed on a retry is passed, and flaky: it
|
|
5
|
+
* leaves `failed`/`failedTests`, its runner test case reads `passed` with
|
|
6
|
+
* `flaky: true`, and the run counts it in `flaky`. A test whose retries all
|
|
7
|
+
* failed, or whose retry matched no test, stays failed.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default retries of a failed test, shared by `aqe test execute` and MCP
|
|
11
|
+
* `test_execute_parallel` so both surfaces rerun a failure the same number of
|
|
12
|
+
* times (#1170).
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_TEST_RETRY_COUNT = 2;
|
|
15
|
+
/** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
|
|
16
|
+
export function applyRetryOutcome(run, retried) {
|
|
17
|
+
const byId = new Map(run.failedTests.map(t => [t.testId, t]));
|
|
18
|
+
const outcomes = retried.tests ?? [];
|
|
19
|
+
const summary = {
|
|
20
|
+
totalRetries: retried.retried,
|
|
21
|
+
nowPassing: retried.nowPassing,
|
|
22
|
+
stillFailing: retried.stillFailing,
|
|
23
|
+
tests: outcomes.map(({ testId, ...outcome }) => ({
|
|
24
|
+
name: byId.get(testId)?.testName ?? testId,
|
|
25
|
+
file: byId.get(testId)?.file ?? '',
|
|
26
|
+
...outcome,
|
|
27
|
+
})),
|
|
28
|
+
};
|
|
29
|
+
run.retries = summary;
|
|
30
|
+
const passedOnRetry = new Set(outcomes.filter(o => o.passed && !o.unmatched).map(o => o.testId));
|
|
31
|
+
const recovered = run.failedTests.filter(t => passedOnRetry.has(t.testId));
|
|
32
|
+
if (recovered.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
run.failedTests = run.failedTests.filter(t => !passedOnRetry.has(t.testId));
|
|
35
|
+
run.failed = Math.max(0, run.failed - recovered.length);
|
|
36
|
+
run.passed += recovered.length;
|
|
37
|
+
run.flaky = (run.flaky ?? 0) + recovered.length;
|
|
38
|
+
if (run.failed === 0 && run.status === 'failed')
|
|
39
|
+
run.status = 'passed';
|
|
40
|
+
if (run.testCases) {
|
|
41
|
+
const pending = [...recovered];
|
|
42
|
+
run.testCases = run.testCases.map(testCase => {
|
|
43
|
+
if (testCase.status !== 'failed')
|
|
44
|
+
return testCase;
|
|
45
|
+
const index = pending.findIndex(t => t.testName === testCase.name && t.file === testCase.file);
|
|
46
|
+
if (index < 0)
|
|
47
|
+
return testCase;
|
|
48
|
+
pending.splice(index, 1);
|
|
49
|
+
return { ...testCase, status: 'passed', flaky: true };
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=retry-outcome.js.map
|