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
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { MCPToolBase } from '../base.js';
|
|
10
10
|
import { toErrorMessage } from '../../../shared/error-utils.js';
|
|
11
11
|
import { secureRandom, secureRandomFloat } from '../../../shared/utils/crypto-random.js';
|
|
12
|
+
import { DEFAULT_TEST_RETRY_COUNT } from '../../../domains/test-execution/services/retry-outcome.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Tool Implementation
|
|
14
15
|
// ============================================================================
|
|
@@ -22,7 +23,7 @@ export class TestExecuteTool extends MCPToolBase {
|
|
|
22
23
|
timeout: 300000,
|
|
23
24
|
};
|
|
24
25
|
async execute(params, context) {
|
|
25
|
-
const { testFiles = [], testSuites = [], pattern, parallel = true, parallelism = 4, retryCount =
|
|
26
|
+
const { testFiles = [], testSuites = [], pattern, parallel = true, parallelism = 4, retryCount = DEFAULT_TEST_RETRY_COUNT, collectCoverage = false, failFast = false, } = params;
|
|
26
27
|
const startTime = Date.now();
|
|
27
28
|
try {
|
|
28
29
|
// Determine files to test
|
|
@@ -164,7 +165,7 @@ const TEST_EXECUTE_SCHEMA = {
|
|
|
164
165
|
description: 'Number of retries for failed tests',
|
|
165
166
|
minimum: 0,
|
|
166
167
|
maximum: 5,
|
|
167
|
-
default:
|
|
168
|
+
default: DEFAULT_TEST_RETRY_COUNT,
|
|
168
169
|
},
|
|
169
170
|
timeout: {
|
|
170
171
|
type: 'number',
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -584,6 +584,20 @@ export interface CoverageAnalyzeResult {
|
|
|
584
584
|
* this is "no measurement", never 0%.
|
|
585
585
|
*/
|
|
586
586
|
unmeasured?: boolean;
|
|
587
|
+
/**
|
|
588
|
+
* #1154: `insufficient-evidence` when source files under the target are not
|
|
589
|
+
* in the report, or the report is older than the sources. The figures then
|
|
590
|
+
* cover the measured files only and must not be read as a pass.
|
|
591
|
+
*/
|
|
592
|
+
evidenceStatus?: 'complete' | 'insufficient-evidence';
|
|
593
|
+
/** #1154: source files under the target with no entry in the report. */
|
|
594
|
+
unmeasuredFiles?: string[];
|
|
595
|
+
/** #1154: the report is older than these source files. */
|
|
596
|
+
staleReport?: {
|
|
597
|
+
reportPath: string;
|
|
598
|
+
reportModified: string;
|
|
599
|
+
newerFiles: string[];
|
|
600
|
+
};
|
|
587
601
|
/** Caveats the caller should surface (e.g. "no instrumentation ran"). */
|
|
588
602
|
warning?: string;
|
|
589
603
|
}
|
|
@@ -309,6 +309,9 @@ export function createCRDTStore(config) {
|
|
|
309
309
|
applyState(incoming) {
|
|
310
310
|
// Apply registers
|
|
311
311
|
for (const [key, state] of Object.entries(incoming.registers)) {
|
|
312
|
+
// One malformed peer entry must not block unrelated state from converging.
|
|
313
|
+
if (typeof state?.timestamp !== 'number' || !Number.isFinite(state.timestamp))
|
|
314
|
+
continue;
|
|
312
315
|
if (!registers.has(key)) {
|
|
313
316
|
registers.set(key, createLWWRegisterFromState(nodeId, state));
|
|
314
317
|
}
|
|
@@ -431,6 +434,8 @@ export function createCRDTStore(config) {
|
|
|
431
434
|
// Apply delta similar to full state, but only for included keys
|
|
432
435
|
if (delta.registers) {
|
|
433
436
|
for (const [key, state] of Object.entries(delta.registers)) {
|
|
437
|
+
if (typeof state?.timestamp !== 'number' || !Number.isFinite(state.timestamp))
|
|
438
|
+
continue;
|
|
434
439
|
if (!registers.has(key)) {
|
|
435
440
|
registers.set(key, createLWWRegisterFromState(nodeId, state));
|
|
436
441
|
}
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @module memory/crdt/lww-register
|
|
9
9
|
*/
|
|
10
|
+
function assertFiniteTimestamp(timestamp) {
|
|
11
|
+
if (!Number.isFinite(timestamp)) {
|
|
12
|
+
throw new RangeError('LWW register timestamp must be a finite number');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
10
15
|
// =============================================================================
|
|
11
16
|
// LWW Register Implementation
|
|
12
17
|
// =============================================================================
|
|
@@ -26,10 +31,12 @@
|
|
|
26
31
|
* ```
|
|
27
32
|
*/
|
|
28
33
|
export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
34
|
+
const timestamp = initialTimestamp ?? (initialValue !== undefined ? Date.now() : 0);
|
|
35
|
+
assertFiniteTimestamp(timestamp);
|
|
29
36
|
// Internal state
|
|
30
37
|
let state = {
|
|
31
38
|
value: initialValue,
|
|
32
|
-
timestamp
|
|
39
|
+
timestamp,
|
|
33
40
|
nodeId: initialValue !== undefined ? nodeId : '',
|
|
34
41
|
version: initialValue !== undefined ? 1 : 0,
|
|
35
42
|
lastUpdated: Date.now(),
|
|
@@ -51,6 +58,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
|
51
58
|
},
|
|
52
59
|
set(value, timestamp) {
|
|
53
60
|
let ts = timestamp ?? Date.now();
|
|
61
|
+
assertFiniteTimestamp(ts);
|
|
54
62
|
// Without an explicit timestamp the write means "now": a second write by
|
|
55
63
|
// this node within one clock tick (or after a backwards clock step) must
|
|
56
64
|
// still supersede its own earlier write, not tie with it and be dropped.
|
|
@@ -88,6 +96,8 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
|
|
|
88
96
|
// (0) would otherwise beat a real write at a negative timestamp.
|
|
89
97
|
if (incoming.version === 0)
|
|
90
98
|
return;
|
|
99
|
+
// NaN breaks total ordering; infinity would permanently outrank finite writes.
|
|
100
|
+
assertFiniteTimestamp(incoming.timestamp);
|
|
91
101
|
// Only update if incoming timestamp wins
|
|
92
102
|
if (state.version === 0 ||
|
|
93
103
|
compareTimestamps(incoming.timestamp, incoming.nodeId, state.timestamp, state.nodeId) > 0) {
|
|
@@ -134,7 +144,7 @@ export function isLWWRegisterState(value) {
|
|
|
134
144
|
return false;
|
|
135
145
|
}
|
|
136
146
|
const state = value;
|
|
137
|
-
return (typeof state.timestamp === 'number' &&
|
|
147
|
+
return (typeof state.timestamp === 'number' && Number.isFinite(state.timestamp) &&
|
|
138
148
|
typeof state.nodeId === 'string' &&
|
|
139
149
|
typeof state.version === 'number' &&
|
|
140
150
|
typeof state.lastUpdated === 'number' &&
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { detectQEDomain } from '../learning/qe-patterns.js';
|
|
10
10
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
11
|
+
import { createSafeRecord } from '../shared/utils/safe-record.js';
|
|
11
12
|
/**
|
|
12
13
|
* Default early exit configuration
|
|
13
14
|
*/
|
|
@@ -374,7 +375,8 @@ export class EarlyExitTokenOptimizer {
|
|
|
374
375
|
reasonBreakdown[attempt.reason]++;
|
|
375
376
|
}
|
|
376
377
|
// Calculate domain breakdown
|
|
377
|
-
|
|
378
|
+
// #1157: domains come from recorded requests.
|
|
379
|
+
const domainBreakdown = createSafeRecord();
|
|
378
380
|
for (const reuse of this.reuseHistory) {
|
|
379
381
|
const domain = reuse.domain ?? 'unknown';
|
|
380
382
|
if (!domainBreakdown[domain]) {
|
|
@@ -645,6 +645,11 @@ export class GOAPPlanner {
|
|
|
645
645
|
if (current === null || current === undefined) {
|
|
646
646
|
return undefined;
|
|
647
647
|
}
|
|
648
|
+
// #1157: goal and condition keys can come from callers; an inherited
|
|
649
|
+
// member such as `constructor` is not part of the world state.
|
|
650
|
+
if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
|
|
651
|
+
return undefined;
|
|
652
|
+
}
|
|
648
653
|
current = current[part];
|
|
649
654
|
}
|
|
650
655
|
return current;
|
|
@@ -900,6 +900,11 @@ export class PlanExecutor {
|
|
|
900
900
|
if (current === null || current === undefined) {
|
|
901
901
|
return undefined;
|
|
902
902
|
}
|
|
903
|
+
// #1157: goal and condition keys can come from callers; an inherited
|
|
904
|
+
// member such as `constructor` is not part of the world state.
|
|
905
|
+
if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
|
|
906
|
+
return undefined;
|
|
907
|
+
}
|
|
903
908
|
current = current[part];
|
|
904
909
|
}
|
|
905
910
|
return current;
|
|
@@ -26,7 +26,7 @@ const PATTERNS = [
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
category: 'api_key_header',
|
|
29
|
-
regex: /(Authorization:\s*Bearer\s+)\S+/gi,
|
|
29
|
+
regex: /(Authorization:\s*(?:Bearer|Token)\s+)\S+/gi,
|
|
30
30
|
replacement: '$1<REDACTED:api_key>',
|
|
31
31
|
modes: ['strict', 'balanced'],
|
|
32
32
|
},
|
|
@@ -38,7 +38,8 @@ const PATTERNS = [
|
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
category: 'private_key',
|
|
41
|
-
|
|
41
|
+
// A block with no END line (truncated output) is redacted to end of input.
|
|
42
|
+
regex: /-----BEGIN\s[\w\s]*PRIVATE KEY-----(?:[\s\S]*?-----END\s[\w\s]*PRIVATE KEY-----|[\s\S]*)/g,
|
|
42
43
|
replacement: '<REDACTED:private_key>',
|
|
43
44
|
modes: ['strict', 'balanced'],
|
|
44
45
|
},
|
|
@@ -66,6 +67,25 @@ const PATTERNS = [
|
|
|
66
67
|
replacement: '<REDACTED:slack_token>',
|
|
67
68
|
modes: ['strict', 'balanced'],
|
|
68
69
|
},
|
|
70
|
+
{
|
|
71
|
+
category: 'huggingface_token',
|
|
72
|
+
regex: /\bhf_[A-Za-z0-9]{30,}\b/g,
|
|
73
|
+
replacement: '<REDACTED:huggingface_token>',
|
|
74
|
+
modes: ['strict', 'balanced'],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
category: 'npm_token',
|
|
78
|
+
regex: /\bnpm_[A-Za-z0-9]{36,}\b/g,
|
|
79
|
+
replacement: '<REDACTED:npm_token>',
|
|
80
|
+
modes: ['strict', 'balanced'],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
// Cognitum API keys; the trailing lookahead skips snake_case identifiers.
|
|
84
|
+
category: 'cognitum_key',
|
|
85
|
+
regex: /\bcog_[A-Za-z0-9-]{20,}(?!\w)/g,
|
|
86
|
+
replacement: '<REDACTED:cognitum_key>',
|
|
87
|
+
modes: ['strict', 'balanced'],
|
|
88
|
+
},
|
|
69
89
|
{
|
|
70
90
|
category: 'stripe_key',
|
|
71
91
|
regex: /\b(sk_live_|pk_live_|sk_test_|pk_test_|rk_live_|rk_test_)[A-Za-z0-9]{10,}\b/g,
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1161: read a file inside the project root without a check-then-use race.
|
|
3
|
+
*
|
|
4
|
+
* The payload path guard (#1126) checks a path by name and the handler opens
|
|
5
|
+
* it again later, so a file or symlink swapped in between could be read
|
|
6
|
+
* unchecked. These readers OPEN first and validate what was opened:
|
|
7
|
+
*
|
|
8
|
+
* - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
|
|
9
|
+
* final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
|
|
10
|
+
* - the descriptor must be a regular file within the size limit (fstat);
|
|
11
|
+
* - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
|
|
12
|
+
* re-resolved realpath, which must be the same inode) must lie inside the
|
|
13
|
+
* project root, so a directory component swapped for a symlink is caught;
|
|
14
|
+
* - the content is read from that same descriptor, and never past the limit,
|
|
15
|
+
* even if the file grows after the fstat.
|
|
16
|
+
*
|
|
17
|
+
* A path spelled outside the root is refused before any filesystem call,
|
|
18
|
+
* unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
|
|
19
|
+
* from a trusted source (the other checks still apply).
|
|
20
|
+
*/
|
|
21
|
+
import { type Stats } from 'node:fs';
|
|
22
|
+
import { CallerInputError } from '../error-utils.js';
|
|
23
|
+
/** Default upper bound for a confined read when the caller names none. */
|
|
24
|
+
export declare const DEFAULT_MAX_CONFINED_READ_BYTES: number;
|
|
25
|
+
export type ConfinedReadReason = 'not-found' | 'not-a-file' | 'outside-project-root' | 'unreadable' | 'too-large';
|
|
26
|
+
export interface ConfinedReadOptions {
|
|
27
|
+
/** Project root; defaults to findProjectRoot(). */
|
|
28
|
+
projectRoot?: string;
|
|
29
|
+
/** Refuse files larger than this; defaults to DEFAULT_MAX_CONFINED_READ_BYTES. */
|
|
30
|
+
maxBytes?: number;
|
|
31
|
+
/**
|
|
32
|
+
* A path spelled outside the project root is refused ('refuse', default),
|
|
33
|
+
* or read without the containment check ('allow') when the caller already
|
|
34
|
+
* trusts it. Paths spelled inside the root are always held to the root.
|
|
35
|
+
*/
|
|
36
|
+
outsideRoot?: 'refuse' | 'allow';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A confined read that was refused; `reason` matches the payload guard's.
|
|
40
|
+
* `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
|
|
41
|
+
* otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
|
|
42
|
+
* TOO_LARGE), so callers that report error codes keep working.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ConfinedReadError extends CallerInputError {
|
|
45
|
+
readonly filePath: string;
|
|
46
|
+
readonly reason: ConfinedReadReason;
|
|
47
|
+
readonly code: string;
|
|
48
|
+
constructor(filePath: string, reason: ConfinedReadReason, errnoCode?: string);
|
|
49
|
+
}
|
|
50
|
+
/** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
|
|
51
|
+
export declare const CONFINED_OPEN_FLAGS: number;
|
|
52
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
53
|
+
export declare function isWithinRoot(root: string, candidate: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
|
|
56
|
+
* to the opened file itself. Elsewhere, re-resolve the path and accept it only
|
|
57
|
+
* if it is the same inode as the descriptor, so a swap after the open is
|
|
58
|
+
* detected. Returns null when it cannot be proven.
|
|
59
|
+
*/
|
|
60
|
+
export declare function openedLocation(fd: number, lexical: string, opened: Stats): Promise<string | null>;
|
|
61
|
+
/** Synchronous openedLocation, for callers that read synchronously. */
|
|
62
|
+
export declare function openedLocationSync(fd: number, lexical: string, opened: Stats): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Read a file by path, confined to the project root and validated on the
|
|
65
|
+
* opened descriptor (see the module comment). Throws ConfinedReadError.
|
|
66
|
+
*/
|
|
67
|
+
export declare function readConfinedFile(filePath: string, options?: ConfinedReadOptions): Promise<Buffer>;
|
|
68
|
+
/** readConfinedFile decoded as UTF-8. */
|
|
69
|
+
export declare function readConfinedText(filePath: string, options?: ConfinedReadOptions): Promise<string>;
|
|
70
|
+
/** Synchronous readConfinedFile, for callers that cannot await. */
|
|
71
|
+
export declare function readConfinedFileSync(filePath: string, options?: ConfinedReadOptions): Buffer;
|
|
72
|
+
/** readConfinedFileSync decoded as UTF-8. */
|
|
73
|
+
export declare function readConfinedTextSync(filePath: string, options?: ConfinedReadOptions): string;
|
|
74
|
+
//# sourceMappingURL=confined-read.d.ts.map
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1161: read a file inside the project root without a check-then-use race.
|
|
3
|
+
*
|
|
4
|
+
* The payload path guard (#1126) checks a path by name and the handler opens
|
|
5
|
+
* it again later, so a file or symlink swapped in between could be read
|
|
6
|
+
* unchecked. These readers OPEN first and validate what was opened:
|
|
7
|
+
*
|
|
8
|
+
* - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
|
|
9
|
+
* final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
|
|
10
|
+
* - the descriptor must be a regular file within the size limit (fstat);
|
|
11
|
+
* - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
|
|
12
|
+
* re-resolved realpath, which must be the same inode) must lie inside the
|
|
13
|
+
* project root, so a directory component swapped for a symlink is caught;
|
|
14
|
+
* - the content is read from that same descriptor, and never past the limit,
|
|
15
|
+
* even if the file grows after the fstat.
|
|
16
|
+
*
|
|
17
|
+
* A path spelled outside the root is refused before any filesystem call,
|
|
18
|
+
* unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
|
|
19
|
+
* from a trusted source (the other checks still apply).
|
|
20
|
+
*/
|
|
21
|
+
import { constants as fsConstants } from 'node:fs';
|
|
22
|
+
import * as fsSync from 'node:fs';
|
|
23
|
+
import * as fs from 'node:fs/promises';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
26
|
+
import { CallerInputError } from '../error-utils.js';
|
|
27
|
+
/** Default upper bound for a confined read when the caller names none. */
|
|
28
|
+
export const DEFAULT_MAX_CONFINED_READ_BYTES = 128 * 1024 * 1024;
|
|
29
|
+
/**
|
|
30
|
+
* A confined read that was refused; `reason` matches the payload guard's.
|
|
31
|
+
* `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
|
|
32
|
+
* otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
|
|
33
|
+
* TOO_LARGE), so callers that report error codes keep working.
|
|
34
|
+
*/
|
|
35
|
+
export class ConfinedReadError extends CallerInputError {
|
|
36
|
+
filePath;
|
|
37
|
+
reason;
|
|
38
|
+
code;
|
|
39
|
+
constructor(filePath, reason, errnoCode) {
|
|
40
|
+
super(`Cannot read ${filePath}: ${reason}`);
|
|
41
|
+
this.filePath = filePath;
|
|
42
|
+
this.reason = reason;
|
|
43
|
+
this.name = 'ConfinedReadError';
|
|
44
|
+
this.code = errnoCode ?? reason.toUpperCase().replace(/-/g, '_');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
|
|
48
|
+
export const CONFINED_OPEN_FLAGS = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0) | (fsConstants.O_NONBLOCK ?? 0);
|
|
49
|
+
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
50
|
+
export function isWithinRoot(root, candidate) {
|
|
51
|
+
const relative = path.relative(root, candidate);
|
|
52
|
+
return relative === '' || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
|
|
56
|
+
* to the opened file itself. Elsewhere, re-resolve the path and accept it only
|
|
57
|
+
* if it is the same inode as the descriptor, so a swap after the open is
|
|
58
|
+
* detected. Returns null when it cannot be proven.
|
|
59
|
+
*/
|
|
60
|
+
export async function openedLocation(fd, lexical, opened) {
|
|
61
|
+
const sameFile = async (candidate) => {
|
|
62
|
+
const st = await fs.stat(candidate).catch(() => null);
|
|
63
|
+
return st !== null && st.dev === opened.dev && st.ino === opened.ino;
|
|
64
|
+
};
|
|
65
|
+
const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
|
|
66
|
+
if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
|
|
67
|
+
return viaProc;
|
|
68
|
+
const real = await fs.realpath(lexical).catch(() => null);
|
|
69
|
+
if (real && await sameFile(real))
|
|
70
|
+
return real;
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/** Synchronous openedLocation, for callers that read synchronously. */
|
|
74
|
+
export function openedLocationSync(fd, lexical, opened) {
|
|
75
|
+
const sameFile = (candidate) => {
|
|
76
|
+
try {
|
|
77
|
+
const st = fsSync.statSync(candidate);
|
|
78
|
+
return st.dev === opened.dev && st.ino === opened.ino;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const realOrNull = (p) => {
|
|
85
|
+
try {
|
|
86
|
+
return fsSync.realpathSync(p);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const viaProc = realOrNull(`/proc/self/fd/${fd}`);
|
|
93
|
+
if (viaProc && path.isAbsolute(viaProc) && sameFile(viaProc))
|
|
94
|
+
return viaProc;
|
|
95
|
+
const real = realOrNull(lexical);
|
|
96
|
+
if (real && sameFile(real))
|
|
97
|
+
return real;
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function reasonFor(error) {
|
|
101
|
+
const code = error?.code;
|
|
102
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
103
|
+
return 'not-found';
|
|
104
|
+
// ELOOP: a symlink was swapped onto the checked realpath's final name.
|
|
105
|
+
if (code === 'EISDIR' || code === 'ELOOP')
|
|
106
|
+
return 'not-a-file';
|
|
107
|
+
return 'unreadable';
|
|
108
|
+
}
|
|
109
|
+
function fail(filePath, reason, error) {
|
|
110
|
+
return new ConfinedReadError(filePath, reason, error?.code);
|
|
111
|
+
}
|
|
112
|
+
function plan(filePath, rootReal, options) {
|
|
113
|
+
if (typeof filePath !== 'string' || filePath === '' || filePath.includes('\0')) {
|
|
114
|
+
throw fail(String(filePath), 'unreadable');
|
|
115
|
+
}
|
|
116
|
+
const rootLexical = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
117
|
+
const lexical = path.resolve(filePath);
|
|
118
|
+
const inRoot = isWithinRoot(rootLexical, lexical) || isWithinRoot(rootReal, lexical);
|
|
119
|
+
// Spelled outside the root: refused before any filesystem call, so the
|
|
120
|
+
// reason cannot reveal whether an outside path exists.
|
|
121
|
+
if (!inRoot && options.outsideRoot !== 'allow')
|
|
122
|
+
throw fail(filePath, 'outside-project-root');
|
|
123
|
+
return { lexical, rootReal, inRoot, limit: options.maxBytes ?? DEFAULT_MAX_CONFINED_READ_BYTES };
|
|
124
|
+
}
|
|
125
|
+
/** Check the opened descriptor's stat before anything is read. */
|
|
126
|
+
function checkOpened(filePath, st, limit) {
|
|
127
|
+
if (!st.isFile())
|
|
128
|
+
throw fail(filePath, 'not-a-file');
|
|
129
|
+
if (st.size > limit)
|
|
130
|
+
throw fail(filePath, 'too-large');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Read a file by path, confined to the project root and validated on the
|
|
134
|
+
* opened descriptor (see the module comment). Throws ConfinedReadError.
|
|
135
|
+
*/
|
|
136
|
+
export async function readConfinedFile(filePath, options = {}) {
|
|
137
|
+
const root = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
138
|
+
const rootReal = await fs.realpath(root).catch(() => root);
|
|
139
|
+
const p = plan(filePath, rootReal, options);
|
|
140
|
+
let real;
|
|
141
|
+
try {
|
|
142
|
+
real = await fs.realpath(p.lexical);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw fail(filePath, reasonFor(error), error);
|
|
146
|
+
}
|
|
147
|
+
if (p.inRoot && !isWithinRoot(p.rootReal, real))
|
|
148
|
+
throw fail(filePath, 'outside-project-root');
|
|
149
|
+
let handle;
|
|
150
|
+
try {
|
|
151
|
+
handle = await fs.open(real, CONFINED_OPEN_FLAGS);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw fail(filePath, reasonFor(error), error);
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const st = await handle.stat();
|
|
158
|
+
checkOpened(filePath, st, p.limit);
|
|
159
|
+
if (p.inRoot) {
|
|
160
|
+
const location = await openedLocation(handle.fd, real, st);
|
|
161
|
+
if (!location || !isWithinRoot(p.rootReal, location))
|
|
162
|
+
throw fail(filePath, 'outside-project-root');
|
|
163
|
+
}
|
|
164
|
+
// Read at most limit + 1 bytes from this descriptor: a file that grew
|
|
165
|
+
// after the fstat is refused rather than read without bound.
|
|
166
|
+
const chunks = [];
|
|
167
|
+
let total = 0;
|
|
168
|
+
for (;;) {
|
|
169
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
|
|
170
|
+
const { bytesRead } = await handle.read(chunk, 0, chunk.length, null);
|
|
171
|
+
if (bytesRead === 0)
|
|
172
|
+
break;
|
|
173
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
174
|
+
total += bytesRead;
|
|
175
|
+
if (total > p.limit)
|
|
176
|
+
throw fail(filePath, 'too-large');
|
|
177
|
+
}
|
|
178
|
+
return Buffer.concat(chunks, total);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof ConfinedReadError)
|
|
182
|
+
throw error;
|
|
183
|
+
throw fail(filePath, reasonFor(error), error);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await handle.close().catch(() => undefined);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** readConfinedFile decoded as UTF-8. */
|
|
190
|
+
export async function readConfinedText(filePath, options = {}) {
|
|
191
|
+
return (await readConfinedFile(filePath, options)).toString('utf-8');
|
|
192
|
+
}
|
|
193
|
+
/** Synchronous readConfinedFile, for callers that cannot await. */
|
|
194
|
+
export function readConfinedFileSync(filePath, options = {}) {
|
|
195
|
+
const root = path.resolve(options.projectRoot ?? findProjectRoot());
|
|
196
|
+
let rootReal = root;
|
|
197
|
+
try {
|
|
198
|
+
rootReal = fsSync.realpathSync(root);
|
|
199
|
+
}
|
|
200
|
+
catch { /* keep the lexical root */ }
|
|
201
|
+
const p = plan(filePath, rootReal, options);
|
|
202
|
+
let real;
|
|
203
|
+
try {
|
|
204
|
+
real = fsSync.realpathSync(p.lexical);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
throw fail(filePath, reasonFor(error), error);
|
|
208
|
+
}
|
|
209
|
+
if (p.inRoot && !isWithinRoot(p.rootReal, real))
|
|
210
|
+
throw fail(filePath, 'outside-project-root');
|
|
211
|
+
let fd;
|
|
212
|
+
try {
|
|
213
|
+
fd = fsSync.openSync(real, CONFINED_OPEN_FLAGS);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw fail(filePath, reasonFor(error), error);
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
const st = fsSync.fstatSync(fd);
|
|
220
|
+
checkOpened(filePath, st, p.limit);
|
|
221
|
+
if (p.inRoot) {
|
|
222
|
+
const location = openedLocationSync(fd, real, st);
|
|
223
|
+
if (!location || !isWithinRoot(p.rootReal, location))
|
|
224
|
+
throw fail(filePath, 'outside-project-root');
|
|
225
|
+
}
|
|
226
|
+
const chunks = [];
|
|
227
|
+
let total = 0;
|
|
228
|
+
for (;;) {
|
|
229
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
|
|
230
|
+
const bytesRead = fsSync.readSync(fd, chunk, 0, chunk.length, null);
|
|
231
|
+
if (bytesRead === 0)
|
|
232
|
+
break;
|
|
233
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
234
|
+
total += bytesRead;
|
|
235
|
+
if (total > p.limit)
|
|
236
|
+
throw fail(filePath, 'too-large');
|
|
237
|
+
}
|
|
238
|
+
return Buffer.concat(chunks, total);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (error instanceof ConfinedReadError)
|
|
242
|
+
throw error;
|
|
243
|
+
throw fail(filePath, reasonFor(error), error);
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
try {
|
|
247
|
+
fsSync.closeSync(fd);
|
|
248
|
+
}
|
|
249
|
+
catch { /* already closed */ }
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** readConfinedFileSync decoded as UTF-8. */
|
|
253
|
+
export function readConfinedTextSync(filePath, options = {}) {
|
|
254
|
+
return readConfinedFileSync(filePath, options).toString('utf-8');
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=confined-read.js.map
|
|
@@ -74,12 +74,12 @@ export declare class FileReader {
|
|
|
74
74
|
*/
|
|
75
75
|
private inProjectRoot;
|
|
76
76
|
/**
|
|
77
|
-
* #1021 round 2b: read an in-root path without a check-then-use
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
77
|
+
* #1021 round 2b / #1161: read an in-root path without a check-then-use
|
|
78
|
+
* race. readConfinedText opens the path once and verifies the opened
|
|
79
|
+
* descriptor (a regular file whose real location lies inside the root) and
|
|
80
|
+
* reads from that same descriptor, so swapping a symlink (file or directory
|
|
81
|
+
* component) between a check and the read cannot redirect it, and a FIFO or
|
|
82
|
+
* device cannot hang or flood the read.
|
|
83
83
|
*/
|
|
84
84
|
private readContained;
|
|
85
85
|
/**
|
|
@@ -7,6 +7,7 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { ok, err } from '../types/index.js';
|
|
8
8
|
import { validatePath } from '../security/path-traversal-validator.js';
|
|
9
9
|
import { safeJsonParse } from '../safe-json.js';
|
|
10
|
+
import { ConfinedReadError, readConfinedText } from './confined-read.js';
|
|
10
11
|
/** Extensions never read, inside or outside the project root. */
|
|
11
12
|
const DENIED_EXTENSIONS = ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'];
|
|
12
13
|
export class FileReadError extends Error {
|
|
@@ -65,25 +66,6 @@ function readError(error, absolutePath) {
|
|
|
65
66
|
}
|
|
66
67
|
return new FileReadError(message, absolutePath, nodeError.code, nodeError);
|
|
67
68
|
}
|
|
68
|
-
/**
|
|
69
|
-
* #1021 round 2b: where an OPEN descriptor really points. On Linux,
|
|
70
|
-
* /proc/self/fd/N resolves to the opened file itself. Elsewhere, re-resolve
|
|
71
|
-
* the path and accept it only if it is the same inode as the descriptor, so
|
|
72
|
-
* a swap after the open is detected. Returns null when it cannot be proven.
|
|
73
|
-
*/
|
|
74
|
-
async function openedLocation(fd, lexical, opened) {
|
|
75
|
-
const sameFile = async (candidate) => {
|
|
76
|
-
const st = await fs.stat(candidate).catch(() => null);
|
|
77
|
-
return st !== null && st.dev === opened.dev && st.ino === opened.ino;
|
|
78
|
-
};
|
|
79
|
-
const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
|
|
80
|
-
if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
|
|
81
|
-
return viaProc;
|
|
82
|
-
const real = await fs.realpath(lexical).catch(() => null);
|
|
83
|
-
if (real && await sameFile(real))
|
|
84
|
-
return real;
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
69
|
/** True when `candidate` is `root` or lies beneath it (both absolute). */
|
|
88
70
|
function isWithin(root, candidate) {
|
|
89
71
|
const relative = path.relative(root, candidate);
|
|
@@ -341,38 +323,30 @@ export class FileReader {
|
|
|
341
323
|
return { lexical, rootReal };
|
|
342
324
|
}
|
|
343
325
|
/**
|
|
344
|
-
* #1021 round 2b: read an in-root path without a check-then-use
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
349
|
-
*
|
|
326
|
+
* #1021 round 2b / #1161: read an in-root path without a check-then-use
|
|
327
|
+
* race. readConfinedText opens the path once and verifies the opened
|
|
328
|
+
* descriptor (a regular file whose real location lies inside the root) and
|
|
329
|
+
* reads from that same descriptor, so swapping a symlink (file or directory
|
|
330
|
+
* component) between a check and the read cannot redirect it, and a FIFO or
|
|
331
|
+
* device cannot hang or flood the read.
|
|
350
332
|
*/
|
|
351
333
|
async readContained(filePath, lexical, rootReal) {
|
|
352
334
|
this.stats.totalReads++;
|
|
353
|
-
let handle;
|
|
354
335
|
try {
|
|
355
|
-
|
|
336
|
+
// The lexical root, so a path spelled under a symlinked root still
|
|
337
|
+
// counts as inside; the primitive resolves the root's realpath itself.
|
|
338
|
+
return ok(await readConfinedText(lexical, { projectRoot: this.projectRoot ?? rootReal }));
|
|
356
339
|
}
|
|
357
340
|
catch (error) {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
const opened = await handle.stat();
|
|
362
|
-
const location = await openedLocation(handle.fd, lexical, opened);
|
|
363
|
-
if (!location || !isWithin(rootReal, location)) {
|
|
341
|
+
if (!(error instanceof ConfinedReadError))
|
|
342
|
+
return err(readError(error, lexical));
|
|
343
|
+
if (error.reason === 'outside-project-root') {
|
|
364
344
|
return err(new PathTraversalError(filePath, ['Path resolves outside the project root'], 'critical'));
|
|
365
345
|
}
|
|
366
|
-
if (
|
|
367
|
-
return err(new FileReadError('
|
|
346
|
+
if (error.reason === 'not-a-file') {
|
|
347
|
+
return err(new FileReadError('Not a regular file: ' + lexical, lexical, error.code === 'NOT_A_FILE' ? 'EISDIR' : error.code));
|
|
368
348
|
}
|
|
369
|
-
return
|
|
370
|
-
}
|
|
371
|
-
catch (error) {
|
|
372
|
-
return err(readError(error, lexical));
|
|
373
|
-
}
|
|
374
|
-
finally {
|
|
375
|
-
await handle.close().catch(() => undefined);
|
|
349
|
+
return err(readError({ code: error.reason === 'not-found' ? 'ENOENT' : error.code }, lexical));
|
|
376
350
|
}
|
|
377
351
|
}
|
|
378
352
|
/**
|