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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP server daemon mode (#1158)
|
|
3
|
+
*
|
|
4
|
+
* The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
|
|
5
|
+
* a detached background process with no stdin (`stdio: 'ignore'`), only to
|
|
6
|
+
* host the worker daemon. The #513 guard treats stdin EOF as "the client is
|
|
7
|
+
* gone" and shuts the server down, so that daemon used to exit within
|
|
8
|
+
* seconds of starting.
|
|
9
|
+
*
|
|
10
|
+
* `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
|
|
11
|
+
* EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
|
|
12
|
+
* the process alive (worker timers are unref'd, also #513). The server then
|
|
13
|
+
* stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
|
|
14
|
+
* `shutdown` method, or a crash.
|
|
15
|
+
*
|
|
16
|
+
* Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
|
|
17
|
+
* MCP client always talks to the server over a pipe/socket, so an
|
|
18
|
+
* `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
|
|
19
|
+
* server into an orphan that outlives the client: the #513 guard stays on and
|
|
20
|
+
* a warning is logged. The variable is also removed from `process.env` once
|
|
21
|
+
* read, so processes the server spawns do not inherit it.
|
|
22
|
+
*
|
|
23
|
+
* Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
|
|
24
|
+
* opened with O_APPEND by start-daemon.cjs), so renaming the file would not
|
|
25
|
+
* stop the writes. Instead, on each heartbeat the server copies an oversized
|
|
26
|
+
* daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
|
|
27
|
+
* the next write lands at the new end of the file. start-daemon.cjs rotates an
|
|
28
|
+
* oversized log at start-up the same way (a rename, as nothing writes it then).
|
|
29
|
+
*/
|
|
30
|
+
export declare const DAEMON_MODE_ENV = "AQE_MCP_DAEMON";
|
|
31
|
+
/** Default interval of the daemon heartbeat line in daemon.log. */
|
|
32
|
+
export declare const DEFAULT_DAEMON_HEARTBEAT_MS = 60000;
|
|
33
|
+
/** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
|
|
34
|
+
export declare const DAEMON_HEARTBEAT_ENV = "AQE_DAEMON_HEARTBEAT_SECONDS";
|
|
35
|
+
/** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
|
|
36
|
+
export declare const DAEMON_LOG_MAX_SIZE_ENV = "AQE_DAEMON_LOG_MAX_SIZE";
|
|
37
|
+
export declare const DEFAULT_DAEMON_LOG_MAX_BYTES: number;
|
|
38
|
+
/**
|
|
39
|
+
* Absolute path of daemon.log, set by start-daemon.cjs for the server it
|
|
40
|
+
* starts. Internal: the server rotates the log only when this file is the one
|
|
41
|
+
* its stdout/stderr write to.
|
|
42
|
+
*/
|
|
43
|
+
export declare const DAEMON_LOG_PATH_ENV = "AQE_MCP_DAEMON_LOG";
|
|
44
|
+
export interface ParsedSetting {
|
|
45
|
+
value: number;
|
|
46
|
+
/** Set when the raw value was rejected and the default applies. */
|
|
47
|
+
warning?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
|
|
51
|
+
* (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
|
|
52
|
+
* Unset, empty or invalid values fall back to the 5 MB default.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseDaemonLogMaxBytes(raw: string | undefined): ParsedSetting;
|
|
55
|
+
/** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
|
|
56
|
+
export declare function parseDaemonHeartbeatMs(raw: string | undefined): ParsedSetting;
|
|
57
|
+
/** What `fd 0` is connected to, as far as the guard cares. */
|
|
58
|
+
export type StdinKind = 'tty' | 'pipe' | 'other';
|
|
59
|
+
/** How the server's lifecycle reacts to stdin. */
|
|
60
|
+
export type StdinGuardMode =
|
|
61
|
+
/** Normal stdio client: stdin EOF/close shuts the server down (#513). */
|
|
62
|
+
'stdio'
|
|
63
|
+
/** Interactive terminal: no guard, so Ctrl-D does not kill a debug session. */
|
|
64
|
+
| 'tty'
|
|
65
|
+
/** `AQE_MCP_DAEMON` with a non-pipe stdin: stdin is ignored (#1158). */
|
|
66
|
+
| 'daemon';
|
|
67
|
+
export interface StdinGuardDecision {
|
|
68
|
+
mode: StdinGuardMode;
|
|
69
|
+
/** Set when daemon mode was requested but refused. */
|
|
70
|
+
warning?: string;
|
|
71
|
+
}
|
|
72
|
+
/** Whether the environment asks for daemon mode. */
|
|
73
|
+
export declare function isDaemonModeRequested(env: Readonly<Record<string, string | undefined>>): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Classify the process's stdin. A FIFO or socket means a client is (or was)
|
|
76
|
+
* connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
|
|
77
|
+
*/
|
|
78
|
+
export declare function detectStdinKind(stdin?: {
|
|
79
|
+
isTTY?: boolean;
|
|
80
|
+
}, fd?: number): StdinKind;
|
|
81
|
+
/** Decide how the server should treat stdin EOF. Pure: no side effects. */
|
|
82
|
+
export declare function resolveStdinGuardMode(env: Readonly<Record<string, string | undefined>>, stdinKind: StdinKind): StdinGuardDecision;
|
|
83
|
+
export interface DaemonHeartbeatStatus {
|
|
84
|
+
totalWorkers: number;
|
|
85
|
+
errorWorkers: number;
|
|
86
|
+
/** Worker runs since the daemon started, all workers together. */
|
|
87
|
+
totalExecutions: number;
|
|
88
|
+
failedExecutions: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Keep a daemon-mode server alive and log one heartbeat line per interval.
|
|
92
|
+
* The timer is deliberately ref'd: nothing else holds the event loop open in
|
|
93
|
+
* daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
|
|
94
|
+
* an error it throws is ignored. Returns a function that stops it.
|
|
95
|
+
*/
|
|
96
|
+
export declare function startDaemonHeartbeat(log: (message: string) => void, getStatus: () => DaemonHeartbeatStatus | undefined, intervalMs?: number, beforeBeat?: () => void): () => void;
|
|
97
|
+
export type DaemonLogRotation = {
|
|
98
|
+
rotated: true;
|
|
99
|
+
bytes: number;
|
|
100
|
+
kept: boolean;
|
|
101
|
+
error?: string;
|
|
102
|
+
} | {
|
|
103
|
+
rotated: false;
|
|
104
|
+
reason: 'disabled' | 'not-a-regular-file' | 'not-our-log' | 'under-cap' | 'error';
|
|
105
|
+
error?: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
|
|
109
|
+
* to `<logPath>.1` (replacing the previous one) and truncate it in place
|
|
110
|
+
* through the server's own descriptor, which start-daemon.cjs opened with
|
|
111
|
+
* O_APPEND, so later writes start again at offset 0 of the same file.
|
|
112
|
+
*
|
|
113
|
+
* Acts only when `logPath` is a regular file (not a symlink, #970) and is the
|
|
114
|
+
* very file one of `fds` (stdout/stderr) writes to, matched by device and
|
|
115
|
+
* inode, so it never truncates a file the server does not own. If the copy
|
|
116
|
+
* fails the log is still truncated, to keep disk use bounded. Lines written
|
|
117
|
+
* between the copy and the truncate are lost; the window is one copy long.
|
|
118
|
+
*/
|
|
119
|
+
export declare function rotateDaemonLog(logPath: string, maxBytes: number, fds?: readonly number[]): DaemonLogRotation;
|
|
120
|
+
/**
|
|
121
|
+
* The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
|
|
122
|
+
* line into the fresh log after each rotation and a warning the first time a
|
|
123
|
+
* check fails. Returns undefined when there is nothing to rotate.
|
|
124
|
+
*/
|
|
125
|
+
export declare function createDaemonLogRotator(logPath: string | undefined, maxBytes: number, log: (message: string) => void): (() => void) | undefined;
|
|
126
|
+
//# sourceMappingURL=daemon-mode.d.ts.map
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP server daemon mode (#1158)
|
|
3
|
+
*
|
|
4
|
+
* The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
|
|
5
|
+
* a detached background process with no stdin (`stdio: 'ignore'`), only to
|
|
6
|
+
* host the worker daemon. The #513 guard treats stdin EOF as "the client is
|
|
7
|
+
* gone" and shuts the server down, so that daemon used to exit within
|
|
8
|
+
* seconds of starting.
|
|
9
|
+
*
|
|
10
|
+
* `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
|
|
11
|
+
* EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
|
|
12
|
+
* the process alive (worker timers are unref'd, also #513). The server then
|
|
13
|
+
* stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
|
|
14
|
+
* `shutdown` method, or a crash.
|
|
15
|
+
*
|
|
16
|
+
* Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
|
|
17
|
+
* MCP client always talks to the server over a pipe/socket, so an
|
|
18
|
+
* `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
|
|
19
|
+
* server into an orphan that outlives the client: the #513 guard stays on and
|
|
20
|
+
* a warning is logged. The variable is also removed from `process.env` once
|
|
21
|
+
* read, so processes the server spawns do not inherit it.
|
|
22
|
+
*
|
|
23
|
+
* Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
|
|
24
|
+
* opened with O_APPEND by start-daemon.cjs), so renaming the file would not
|
|
25
|
+
* stop the writes. Instead, on each heartbeat the server copies an oversized
|
|
26
|
+
* daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
|
|
27
|
+
* the next write lands at the new end of the file. start-daemon.cjs rotates an
|
|
28
|
+
* oversized log at start-up the same way (a rename, as nothing writes it then).
|
|
29
|
+
*/
|
|
30
|
+
import { closeSync, constants, fstatSync, ftruncateSync, lstatSync, openSync, readSync, renameSync, unlinkSync, writeSync, } from 'node:fs';
|
|
31
|
+
export const DAEMON_MODE_ENV = 'AQE_MCP_DAEMON';
|
|
32
|
+
/** Only these values enable daemon mode; anything else (or unset) is off. */
|
|
33
|
+
const DAEMON_ON_VALUES = new Set(['1', 'true', 'yes', 'on']);
|
|
34
|
+
/** Default interval of the daemon heartbeat line in daemon.log. */
|
|
35
|
+
export const DEFAULT_DAEMON_HEARTBEAT_MS = 60_000;
|
|
36
|
+
/** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
|
|
37
|
+
export const DAEMON_HEARTBEAT_ENV = 'AQE_DAEMON_HEARTBEAT_SECONDS';
|
|
38
|
+
const MAX_HEARTBEAT_SECONDS = 86_400;
|
|
39
|
+
/** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
|
|
40
|
+
export const DAEMON_LOG_MAX_SIZE_ENV = 'AQE_DAEMON_LOG_MAX_SIZE';
|
|
41
|
+
export const DEFAULT_DAEMON_LOG_MAX_BYTES = 5 * 1024 * 1024;
|
|
42
|
+
const MIN_DAEMON_LOG_MAX_BYTES = 1024;
|
|
43
|
+
/**
|
|
44
|
+
* Absolute path of daemon.log, set by start-daemon.cjs for the server it
|
|
45
|
+
* starts. Internal: the server rotates the log only when this file is the one
|
|
46
|
+
* its stdout/stderr write to.
|
|
47
|
+
*/
|
|
48
|
+
export const DAEMON_LOG_PATH_ENV = 'AQE_MCP_DAEMON_LOG';
|
|
49
|
+
const OFF_VALUES = new Set(['0', 'off', 'false', 'no', 'none', 'disable', 'disabled']);
|
|
50
|
+
const SIZE_UNITS = { '': 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
|
|
51
|
+
/**
|
|
52
|
+
* Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
|
|
53
|
+
* (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
|
|
54
|
+
* Unset, empty or invalid values fall back to the 5 MB default.
|
|
55
|
+
*/
|
|
56
|
+
export function parseDaemonLogMaxBytes(raw) {
|
|
57
|
+
const text = (raw ?? '').trim().toLowerCase();
|
|
58
|
+
if (text === '')
|
|
59
|
+
return { value: DEFAULT_DAEMON_LOG_MAX_BYTES };
|
|
60
|
+
if (OFF_VALUES.has(text))
|
|
61
|
+
return { value: 0 };
|
|
62
|
+
const match = /^(\d+)\s*([kmg]?)b?$/.exec(text);
|
|
63
|
+
const bytes = match ? Number(match[1]) * SIZE_UNITS[match[2]] : NaN;
|
|
64
|
+
if (Number.isSafeInteger(bytes) && bytes >= MIN_DAEMON_LOG_MAX_BYTES)
|
|
65
|
+
return { value: bytes };
|
|
66
|
+
return {
|
|
67
|
+
value: DEFAULT_DAEMON_LOG_MAX_BYTES,
|
|
68
|
+
warning: `[AQE] WARN ${DAEMON_LOG_MAX_SIZE_ENV}=${JSON.stringify(raw)} ignored: expected bytes ` +
|
|
69
|
+
`(at least ${MIN_DAEMON_LOG_MAX_BYTES}) or a size such as 512K or 5M; using 5M\n`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
|
|
73
|
+
export function parseDaemonHeartbeatMs(raw) {
|
|
74
|
+
const text = (raw ?? '').trim();
|
|
75
|
+
if (text === '')
|
|
76
|
+
return { value: DEFAULT_DAEMON_HEARTBEAT_MS };
|
|
77
|
+
const seconds = /^\d+$/.test(text) ? Number(text) : NaN;
|
|
78
|
+
if (seconds >= 1 && seconds <= MAX_HEARTBEAT_SECONDS)
|
|
79
|
+
return { value: seconds * 1000 };
|
|
80
|
+
return {
|
|
81
|
+
value: DEFAULT_DAEMON_HEARTBEAT_MS,
|
|
82
|
+
warning: `[AQE] WARN ${DAEMON_HEARTBEAT_ENV}=${JSON.stringify(raw)} ignored: expected whole ` +
|
|
83
|
+
`seconds from 1 to ${MAX_HEARTBEAT_SECONDS}; using 60\n`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Whether the environment asks for daemon mode. */
|
|
87
|
+
export function isDaemonModeRequested(env) {
|
|
88
|
+
const raw = env[DAEMON_MODE_ENV];
|
|
89
|
+
if (raw === undefined)
|
|
90
|
+
return false;
|
|
91
|
+
return DAEMON_ON_VALUES.has(raw.trim().toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Classify the process's stdin. A FIFO or socket means a client is (or was)
|
|
95
|
+
* connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
|
|
96
|
+
*/
|
|
97
|
+
export function detectStdinKind(stdin = process.stdin, fd = 0) {
|
|
98
|
+
if (stdin.isTTY)
|
|
99
|
+
return 'tty';
|
|
100
|
+
try {
|
|
101
|
+
const stat = fstatSync(fd);
|
|
102
|
+
return stat.isFIFO() || stat.isSocket() ? 'pipe' : 'other';
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Unknown stdin: treat it as a client pipe so the #513 guard stays on.
|
|
106
|
+
return 'pipe';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Decide how the server should treat stdin EOF. Pure: no side effects. */
|
|
110
|
+
export function resolveStdinGuardMode(env, stdinKind) {
|
|
111
|
+
const requested = isDaemonModeRequested(env);
|
|
112
|
+
if (stdinKind === 'tty')
|
|
113
|
+
return { mode: 'tty' };
|
|
114
|
+
if (!requested)
|
|
115
|
+
return { mode: 'stdio' };
|
|
116
|
+
if (stdinKind === 'pipe') {
|
|
117
|
+
return {
|
|
118
|
+
mode: 'stdio',
|
|
119
|
+
warning: `[AQE] WARN ${DAEMON_MODE_ENV} ignored: stdin is a pipe (an MCP client is attached), ` +
|
|
120
|
+
'so the server still shuts down when stdin closes\n',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { mode: 'daemon' };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Keep a daemon-mode server alive and log one heartbeat line per interval.
|
|
127
|
+
* The timer is deliberately ref'd: nothing else holds the event loop open in
|
|
128
|
+
* daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
|
|
129
|
+
* an error it throws is ignored. Returns a function that stops it.
|
|
130
|
+
*/
|
|
131
|
+
export function startDaemonHeartbeat(log, getStatus, intervalMs = DEFAULT_DAEMON_HEARTBEAT_MS, beforeBeat) {
|
|
132
|
+
const startedAt = Date.now();
|
|
133
|
+
const timer = setInterval(() => {
|
|
134
|
+
try {
|
|
135
|
+
beforeBeat?.();
|
|
136
|
+
}
|
|
137
|
+
catch { /* never let rotation stop the heartbeat */ }
|
|
138
|
+
const uptimeS = Math.round((Date.now() - startedAt) / 1000);
|
|
139
|
+
let status;
|
|
140
|
+
try {
|
|
141
|
+
status = getStatus();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
status = undefined;
|
|
145
|
+
}
|
|
146
|
+
const workers = status
|
|
147
|
+
? `${status.totalWorkers} workers (${status.errorWorkers} in error), ` +
|
|
148
|
+
`${status.totalExecutions} runs (${status.failedExecutions} failed)`
|
|
149
|
+
: 'workers unavailable';
|
|
150
|
+
log(`[AQE] Daemon heartbeat: pid ${process.pid}, up ${uptimeS}s, ${workers}\n`);
|
|
151
|
+
}, intervalMs);
|
|
152
|
+
return () => clearInterval(timer);
|
|
153
|
+
}
|
|
154
|
+
/** Copy `src` to a fresh `dest`; neither path may be a symlink. */
|
|
155
|
+
function copyNoFollow(src, dest, srcIno) {
|
|
156
|
+
const nofollow = constants.O_NOFOLLOW ?? 0;
|
|
157
|
+
const input = openSync(src, constants.O_RDONLY | nofollow);
|
|
158
|
+
let output;
|
|
159
|
+
try {
|
|
160
|
+
if (fstatSync(input).ino !== srcIno)
|
|
161
|
+
throw new Error('daemon.log changed while rotating');
|
|
162
|
+
try {
|
|
163
|
+
unlinkSync(dest);
|
|
164
|
+
}
|
|
165
|
+
catch { /* absent */ }
|
|
166
|
+
// O_EXCL: fails on anything already there, a symlink included.
|
|
167
|
+
output = openSync(dest, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | nofollow, 0o644);
|
|
168
|
+
const buffer = Buffer.allocUnsafe(64 * 1024);
|
|
169
|
+
let read;
|
|
170
|
+
while ((read = readSync(input, buffer, 0, buffer.length, null)) > 0) {
|
|
171
|
+
writeSync(output, buffer, 0, read);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
if (output !== undefined)
|
|
176
|
+
closeSync(output);
|
|
177
|
+
closeSync(input);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
|
|
182
|
+
* to `<logPath>.1` (replacing the previous one) and truncate it in place
|
|
183
|
+
* through the server's own descriptor, which start-daemon.cjs opened with
|
|
184
|
+
* O_APPEND, so later writes start again at offset 0 of the same file.
|
|
185
|
+
*
|
|
186
|
+
* Acts only when `logPath` is a regular file (not a symlink, #970) and is the
|
|
187
|
+
* very file one of `fds` (stdout/stderr) writes to, matched by device and
|
|
188
|
+
* inode, so it never truncates a file the server does not own. If the copy
|
|
189
|
+
* fails the log is still truncated, to keep disk use bounded. Lines written
|
|
190
|
+
* between the copy and the truncate are lost; the window is one copy long.
|
|
191
|
+
*/
|
|
192
|
+
export function rotateDaemonLog(logPath, maxBytes, fds = [1, 2]) {
|
|
193
|
+
if (maxBytes <= 0)
|
|
194
|
+
return { rotated: false, reason: 'disabled' };
|
|
195
|
+
try {
|
|
196
|
+
const stat = lstatSync(logPath);
|
|
197
|
+
if (!stat.isFile())
|
|
198
|
+
return { rotated: false, reason: 'not-a-regular-file' };
|
|
199
|
+
const fd = fds.find((candidate) => {
|
|
200
|
+
try {
|
|
201
|
+
const own = fstatSync(candidate);
|
|
202
|
+
return own.dev === stat.dev && own.ino === stat.ino;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
if (fd === undefined)
|
|
209
|
+
return { rotated: false, reason: 'not-our-log' };
|
|
210
|
+
if (stat.size <= maxBytes)
|
|
211
|
+
return { rotated: false, reason: 'under-cap' };
|
|
212
|
+
const tmp = `${logPath}.1.${process.pid}.tmp`;
|
|
213
|
+
let copyError;
|
|
214
|
+
try {
|
|
215
|
+
copyNoFollow(logPath, tmp, stat.ino);
|
|
216
|
+
renameSync(tmp, `${logPath}.1`); // replaces the old one, never follows it
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
copyError = error instanceof Error ? error.message : String(error);
|
|
220
|
+
try {
|
|
221
|
+
unlinkSync(tmp);
|
|
222
|
+
}
|
|
223
|
+
catch { /* absent */ }
|
|
224
|
+
}
|
|
225
|
+
ftruncateSync(fd, 0);
|
|
226
|
+
return copyError === undefined
|
|
227
|
+
? { rotated: true, bytes: stat.size, kept: true }
|
|
228
|
+
: { rotated: true, bytes: stat.size, kept: false, error: copyError };
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
return { rotated: false, reason: 'error', error: error instanceof Error ? error.message : String(error) };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
|
|
236
|
+
* line into the fresh log after each rotation and a warning the first time a
|
|
237
|
+
* check fails. Returns undefined when there is nothing to rotate.
|
|
238
|
+
*/
|
|
239
|
+
export function createDaemonLogRotator(logPath, maxBytes, log) {
|
|
240
|
+
if (!logPath || maxBytes <= 0)
|
|
241
|
+
return undefined;
|
|
242
|
+
let warned = false;
|
|
243
|
+
return () => {
|
|
244
|
+
const result = rotateDaemonLog(logPath, maxBytes);
|
|
245
|
+
if (result.rotated) {
|
|
246
|
+
log(result.kept
|
|
247
|
+
? `[AQE] daemon.log rotated: ${result.bytes} bytes moved to daemon.log.1 (cap ${maxBytes})\n`
|
|
248
|
+
: `[AQE] WARN daemon.log truncated at ${result.bytes} bytes (cap ${maxBytes}); ` +
|
|
249
|
+
`could not keep daemon.log.1: ${result.error}\n`);
|
|
250
|
+
}
|
|
251
|
+
else if (result.reason === 'error' && !warned) {
|
|
252
|
+
warned = true;
|
|
253
|
+
log(`[AQE] WARN daemon.log size check failed: ${result.error}\n`);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=daemon-mode.js.map
|
package/dist/mcp/entry.d.ts
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* Environment Variables:
|
|
13
13
|
* AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
|
|
14
14
|
* AQE_VERBOSE: Enable verbose logging
|
|
15
|
+
* AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
|
|
16
|
+
* server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
|
|
17
|
+
* AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
|
|
18
|
+
* heartbeat interval and daemon.log size cap (#1207).
|
|
15
19
|
*/
|
|
16
20
|
export {};
|
|
17
21
|
//# sourceMappingURL=entry.d.ts.map
|
package/dist/mcp/entry.js
CHANGED
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* Environment Variables:
|
|
13
13
|
* AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
|
|
14
14
|
* AQE_VERBOSE: Enable verbose logging
|
|
15
|
+
* AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
|
|
16
|
+
* server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
|
|
17
|
+
* AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
|
|
18
|
+
* heartbeat interval and daemon.log size cap (#1207).
|
|
15
19
|
*/
|
|
16
20
|
import { quickStart } from './protocol-server.js';
|
|
17
21
|
import { createHTTPServer } from './http-server.js';
|
|
@@ -25,7 +29,8 @@ import { initFeatureFlagsFromEnv } from '../integrations/ruvector/feature-flags.
|
|
|
25
29
|
import { resetSharedRvfAdapter } from '../integrations/ruvector/shared-rvf-adapter.js';
|
|
26
30
|
import { resetSharedRvfDualWriter } from '../integrations/ruvector/shared-rvf-dual-writer.js';
|
|
27
31
|
import { claimProcessLifecycle, closeRegisteredStores } from '../kernel/process-lifecycle.js';
|
|
28
|
-
import { startBackgroundWorkers } from './background-workers.js';
|
|
32
|
+
import { getBackgroundWorkersState, startBackgroundWorkers } from './background-workers.js';
|
|
33
|
+
import { DAEMON_HEARTBEAT_ENV, DAEMON_LOG_MAX_SIZE_ENV, DAEMON_LOG_PATH_ENV, DAEMON_MODE_ENV, createDaemonLogRotator, detectStdinKind, parseDaemonHeartbeatMs, parseDaemonLogMaxBytes, resolveStdinGuardMode, startDaemonHeartbeat, } from './daemon-mode.js';
|
|
29
34
|
import { readFileSync } from 'node:fs';
|
|
30
35
|
import { resolve, dirname } from 'node:path';
|
|
31
36
|
import { fileURLToPath } from 'node:url';
|
|
@@ -95,11 +100,15 @@ async function main() {
|
|
|
95
100
|
// resolved, which is why `kill <pid>` appeared to be "ignored" and only
|
|
96
101
|
// `kill -9` worked.
|
|
97
102
|
let shuttingDown = false;
|
|
103
|
+
let stopDaemonHeartbeat = null;
|
|
104
|
+
let daemonStatus = null;
|
|
105
|
+
const daemonWarnings = [];
|
|
98
106
|
const shutdown = async (reason) => {
|
|
99
107
|
if (shuttingDown)
|
|
100
108
|
return;
|
|
101
109
|
shuttingDown = true;
|
|
102
110
|
originalStderrWrite(`[AQE] Shutting down (${reason})\n`);
|
|
111
|
+
stopDaemonHeartbeat?.();
|
|
103
112
|
const watchdog = setTimeout(() => {
|
|
104
113
|
originalStderrWrite('[AQE] Shutdown watchdog fired — forcing exit\n');
|
|
105
114
|
process.exit(0);
|
|
@@ -139,10 +148,29 @@ async function main() {
|
|
|
139
148
|
// reaches EOF. An orphaned stdio MCP server has no parent to serve, so exit
|
|
140
149
|
// instead of lingering at high CPU. Guarded to a piped stdin so an
|
|
141
150
|
// interactive TTY debug session (Ctrl-D) is unaffected.
|
|
142
|
-
|
|
151
|
+
// #1158: start-daemon.cjs runs the server with no stdin and AQE_MCP_DAEMON=1;
|
|
152
|
+
// that daemon mode skips this guard (only when stdin is not a client pipe).
|
|
153
|
+
const stdinGuard = resolveStdinGuardMode(process.env, detectStdinKind(process.stdin));
|
|
154
|
+
const daemonLogPath = process.env[DAEMON_LOG_PATH_ENV];
|
|
155
|
+
delete process.env[DAEMON_MODE_ENV]; // never inherited by processes we spawn
|
|
156
|
+
delete process.env[DAEMON_LOG_PATH_ENV];
|
|
157
|
+
if (stdinGuard.mode === 'stdio') {
|
|
143
158
|
process.stdin.on('end', () => { void shutdown('stdin-eof'); });
|
|
144
159
|
process.stdin.on('close', () => { void shutdown('stdin-close'); });
|
|
145
160
|
}
|
|
161
|
+
else if (stdinGuard.mode === 'daemon') {
|
|
162
|
+
// Worker timers are unref'd (#513), so a daemon with no stdin needs its
|
|
163
|
+
// own ref'd timer to stay up, from the start of boot; it also logs
|
|
164
|
+
// liveness to daemon.log.
|
|
165
|
+
// #1207: each heartbeat also keeps daemon.log under its size cap.
|
|
166
|
+
const heartbeat = parseDaemonHeartbeatMs(process.env[DAEMON_HEARTBEAT_ENV]);
|
|
167
|
+
const logCap = parseDaemonLogMaxBytes(process.env[DAEMON_LOG_MAX_SIZE_ENV]);
|
|
168
|
+
for (const parsed of [heartbeat, logCap])
|
|
169
|
+
if (parsed.warning)
|
|
170
|
+
daemonWarnings.push(parsed.warning);
|
|
171
|
+
const log = (message) => { originalStderrWrite(message); }; // declared further down
|
|
172
|
+
stopDaemonHeartbeat = startDaemonHeartbeat(log, () => daemonStatus?.(), heartbeat.value, createDaemonLogRotator(daemonLogPath, logCap.value, log));
|
|
173
|
+
}
|
|
146
174
|
// Catch unhandled exceptions/rejections to prevent MCP connection drops
|
|
147
175
|
process.on('uncaughtException', (error) => {
|
|
148
176
|
process.stderr.write(`[AQE] FATAL uncaught exception: ${error.message}\n`);
|
|
@@ -334,6 +362,26 @@ async function main() {
|
|
|
334
362
|
// IMP-10: Start background workers (heartbeat scheduler, etc.) and the
|
|
335
363
|
// QualityDaemon. #1061: AQE_WORKERS_ENABLED=false skips both.
|
|
336
364
|
await startBackgroundWorkers(originalStderrWrite);
|
|
365
|
+
if (stdinGuard.warning)
|
|
366
|
+
originalStderrWrite(stdinGuard.warning);
|
|
367
|
+
for (const warning of daemonWarnings)
|
|
368
|
+
originalStderrWrite(warning);
|
|
369
|
+
if (stdinGuard.mode === 'daemon') {
|
|
370
|
+
if (getBackgroundWorkersState().state !== 'disabled') {
|
|
371
|
+
const { getDaemon } = await import('../workers/daemon.js');
|
|
372
|
+
daemonStatus = () => {
|
|
373
|
+
const health = getDaemon().getStatus().workerManager;
|
|
374
|
+
const workers = Object.values(health.workers);
|
|
375
|
+
return {
|
|
376
|
+
totalWorkers: health.totalWorkers,
|
|
377
|
+
errorWorkers: health.errorWorkers,
|
|
378
|
+
totalExecutions: workers.reduce((sum, w) => sum + w.totalExecutions, 0),
|
|
379
|
+
failedExecutions: workers.reduce((sum, w) => sum + w.failedExecutions, 0),
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
originalStderrWrite(`[AQE] Daemon mode (${DAEMON_MODE_ENV}): stdin EOF ignored; stop with SIGTERM (stop-daemon.cjs)\n`);
|
|
384
|
+
}
|
|
337
385
|
// Start HTTP server for AG-UI/A2A/A2UI if port is specified
|
|
338
386
|
const httpPort = parseInt(process.env.AQE_HTTP_PORT || '0', 10);
|
|
339
387
|
if (httpPort > 0) {
|
|
@@ -21,6 +21,8 @@ export interface TestExecuteResult {
|
|
|
21
21
|
total: number;
|
|
22
22
|
passed: number;
|
|
23
23
|
failed: number;
|
|
24
|
+
/** #1170: tests that failed and then passed on a retry; counted in `passed`. */
|
|
25
|
+
flaky?: number;
|
|
24
26
|
duration: number;
|
|
25
27
|
/** Measured line coverage of the run, or null when none was collected (#1027 N5). */
|
|
26
28
|
coverage?: number | null;
|
|
@@ -15,6 +15,7 @@ import { buildRiskDecisionFromQualityGate, validateRiskDecision, } from '../../c
|
|
|
15
15
|
import { INSUFFICIENT_EVIDENCE, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
16
16
|
import { validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
|
|
17
17
|
import { validateBehaviorExamples } from '../../domains/test-generation/services/behavior-example-validation.js';
|
|
18
|
+
import { DEFAULT_TEST_RETRY_COUNT } from '../../domains/test-execution/services/retry-outcome.js';
|
|
18
19
|
const SUPPORTED_LANGUAGES = Object.keys(DEFAULT_FRAMEWORKS);
|
|
19
20
|
/**
|
|
20
21
|
* Normalize a language string from MCP input. Returns the canonical
|
|
@@ -67,7 +68,7 @@ export const testGenerateConfig = {
|
|
|
67
68
|
let framework;
|
|
68
69
|
if (params.framework) {
|
|
69
70
|
framework = params.framework;
|
|
70
|
-
const fwLang = FRAMEWORK_TO_LANGUAGE[framework];
|
|
71
|
+
const fwLang = Object.hasOwn(FRAMEWORK_TO_LANGUAGE, framework) ? FRAMEWORK_TO_LANGUAGE[framework] : undefined; // #1157
|
|
71
72
|
if (fwLang && fwLang !== language) {
|
|
72
73
|
// typescript<->javascript is a soft compatibility — JS frameworks
|
|
73
74
|
// can target both. Treat as same family.
|
|
@@ -190,7 +191,8 @@ export const testExecuteConfig = {
|
|
|
190
191
|
testSuites: params.testSuites || [],
|
|
191
192
|
parallel: params.parallel !== false,
|
|
192
193
|
parallelism: params.parallelism || 4,
|
|
193
|
-
|
|
194
|
+
// #1170: the same default as `aqe test execute`.
|
|
195
|
+
retryCount: params.retryCount ?? DEFAULT_TEST_RETRY_COUNT,
|
|
194
196
|
timeout: params.timeout || 60000,
|
|
195
197
|
collectCoverage: params.collectCoverage || false,
|
|
196
198
|
reportFormat: params.reportFormat || 'json',
|
|
@@ -203,6 +205,8 @@ export const testExecuteConfig = {
|
|
|
203
205
|
const total = data.total || 0;
|
|
204
206
|
const passed = data.passed || 0;
|
|
205
207
|
const failed = data.failed || 0;
|
|
208
|
+
// #1170: tests that passed on a retry; already counted in `passed`.
|
|
209
|
+
const flaky = typeof data.flaky === 'number' && data.flaky > 0 ? data.flaky : undefined;
|
|
206
210
|
// #1027 N5: no measured coverage → null, never a hardcoded 0.
|
|
207
211
|
const coverage = typeof data.coverage === 'number' && Number.isFinite(data.coverage) ? data.coverage : null;
|
|
208
212
|
// #1110: report only what was measured. A figure with no measurement is
|
|
@@ -275,6 +279,7 @@ export const testExecuteConfig = {
|
|
|
275
279
|
summary: {
|
|
276
280
|
totalTests: total,
|
|
277
281
|
passRate: total > 0 ? (passed / total) * 100 : 0,
|
|
282
|
+
...(flaky !== undefined ? { flaky } : {}),
|
|
278
283
|
...(avgTestDuration !== undefined ? { avgDuration: avgTestDuration } : {}),
|
|
279
284
|
...(efficiency !== null ? { parallelEfficiency: efficiency } : {}),
|
|
280
285
|
},
|
|
@@ -285,6 +290,7 @@ export const testExecuteConfig = {
|
|
|
285
290
|
total,
|
|
286
291
|
passed,
|
|
287
292
|
failed,
|
|
293
|
+
...(flaky !== undefined ? { flaky } : {}),
|
|
288
294
|
duration,
|
|
289
295
|
coverage,
|
|
290
296
|
savedFiles,
|
|
@@ -449,6 +455,11 @@ export const coverageAnalyzeConfig = {
|
|
|
449
455
|
...(data.runStatus === 'passed' || data.runStatus === 'failed' ? { runStatus: data.runStatus } : {}),
|
|
450
456
|
// #995: the target has no measurement at all — distinct from a measured 0%.
|
|
451
457
|
...(data.unmeasured === true ? { unmeasured: true } : {}),
|
|
458
|
+
// #1154: target files the report does not cover, and a stale report.
|
|
459
|
+
...(data.evidenceStatus === 'complete' || data.evidenceStatus === 'insufficient-evidence'
|
|
460
|
+
? { evidenceStatus: data.evidenceStatus } : {}),
|
|
461
|
+
...(Array.isArray(data.unmeasuredFiles) ? { unmeasuredFiles: data.unmeasuredFiles } : {}),
|
|
462
|
+
...(data.staleReport ? { staleReport: data.staleReport } : {}),
|
|
452
463
|
...(data.warning ? { warning: data.warning } : {}),
|
|
453
464
|
};
|
|
454
465
|
},
|
|
@@ -15,12 +15,17 @@ export interface OrchestrateRequest {
|
|
|
15
15
|
filePaths?: string[];
|
|
16
16
|
}
|
|
17
17
|
export type OrchestrateRoute =
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Submit `type` to `domain` with `payload`. `executionOwner: 'caller'` runs
|
|
20
|
+
* the task through the MCP task executor, as the domain's own tool does,
|
|
21
|
+
* instead of the domain plugin.
|
|
22
|
+
*/
|
|
19
23
|
{
|
|
20
24
|
kind: 'route';
|
|
21
25
|
type: string;
|
|
22
26
|
domain: DomainName;
|
|
23
27
|
payload: Record<string, unknown>;
|
|
28
|
+
executionOwner?: 'caller';
|
|
24
29
|
}
|
|
25
30
|
/** The request lacks what the handler needs; `error` says what to supply. */
|
|
26
31
|
| {
|
|
@@ -8,8 +8,11 @@
|
|
|
8
8
|
* supplied, or is refused with the input it needs. A payload is never filled
|
|
9
9
|
* with values the request did not contain.
|
|
10
10
|
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { resolve } from 'node:path';
|
|
11
13
|
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
12
14
|
import { confineIndexPaths } from '../../domains/code-intelligence/index-path-guard.js';
|
|
15
|
+
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
13
16
|
const needs = (type, what) => ({
|
|
14
17
|
kind: 'needs-input',
|
|
15
18
|
error: `task_orchestrate inferred '${type}' from the description, but ${what}`,
|
|
@@ -26,6 +29,52 @@ async function projectFiles(type, filePaths) {
|
|
|
26
29
|
}
|
|
27
30
|
return { files: accepted };
|
|
28
31
|
}
|
|
32
|
+
/** Source and report extensions that mark a bare word in a description as a file. */
|
|
33
|
+
const PATH_EXTENSION = /\.(?:[cm]?[jt]sx?|py|go|rs|java|kt|cs|rb|php|swift|info|lcov|json|xml)$/i;
|
|
34
|
+
/** Words after which a description names what to measure ("coverage for src"). */
|
|
35
|
+
const TARGET_PREPOSITION = /^(?:for|of|in|under|on)$/i;
|
|
36
|
+
/**
|
|
37
|
+
* The paths a description names: words with a path separator or a source /
|
|
38
|
+
* report extension, else a word after "for/of/in/under/on" that exists
|
|
39
|
+
* (`analyze coverage for src`). Anything else is prose.
|
|
40
|
+
*/
|
|
41
|
+
function pathsInDescription(task) {
|
|
42
|
+
const words = task.split(/\s+/).map(w => w.replace(/^[`'"(]+|[`'",;:!?)]+$|\.$/g, '')).filter(Boolean);
|
|
43
|
+
const pathLike = words.filter(w => !/^https?:/i.test(w) && (/[\\/]/.test(w) || PATH_EXTENSION.test(w)));
|
|
44
|
+
if (pathLike.length > 0)
|
|
45
|
+
return [...new Set(pathLike)];
|
|
46
|
+
// Resolved as the coverage handler resolves its target: from the cwd.
|
|
47
|
+
const named = words.filter((w, i) => i > 0 && TARGET_PREPOSITION.test(words[i - 1]) &&
|
|
48
|
+
/^[\w.-]+$/.test(w) && existsSync(resolve(w)));
|
|
49
|
+
return [...new Set(named)];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* #1200: the one target an orchestrated coverage task measures — the single
|
|
53
|
+
* filePath, else the one path the description names, else '.' (the default
|
|
54
|
+
* of coverage_analyze_sublinear).
|
|
55
|
+
* The task then runs the handler coverage_analyze_sublinear runs, so it
|
|
56
|
+
* resolves the target, reads the report and judges its evidence the same way.
|
|
57
|
+
*/
|
|
58
|
+
async function coverageRoute(request) {
|
|
59
|
+
const type = 'analyze-coverage';
|
|
60
|
+
const given = request.filePaths ?? [];
|
|
61
|
+
const candidates = given.length > 0 ? given : pathsInDescription(request.task);
|
|
62
|
+
if (candidates.length > 1) {
|
|
63
|
+
return needs(type, `coverage is analyzed for one target, and ${given.length > 0 ? 'filePaths' : 'the description'} ` +
|
|
64
|
+
`names ${candidates.length} (${candidates.join(', ')}). Pass one file or directory, or use ` +
|
|
65
|
+
'coverage_analyze_sublinear with a target.');
|
|
66
|
+
}
|
|
67
|
+
const target = candidates[0] ?? '.';
|
|
68
|
+
if (target !== '.') {
|
|
69
|
+
const confined = await requirePayloadPath(type, 'target', target, { allowDirectory: true, allowMissing: true });
|
|
70
|
+
if (!confined.success)
|
|
71
|
+
return needs(type, `the ${confined.error.message.replace(/^Invalid [\w-]+ payload: /, '')}`);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
kind: 'route', type, domain: 'coverage-analysis', executionOwner: 'caller',
|
|
75
|
+
payload: { target, detectGaps: true },
|
|
76
|
+
};
|
|
77
|
+
}
|
|
29
78
|
/** Decide how task_orchestrate runs an inferred task type. */
|
|
30
79
|
export async function routeInferredTask(type, request) {
|
|
31
80
|
const filePaths = request.filePaths ?? [];
|
|
@@ -59,6 +108,10 @@ export async function routeInferredTask(type, request) {
|
|
|
59
108
|
return confined;
|
|
60
109
|
return { kind: 'route', type: 'analyze-quality', domain: 'quality-assessment', payload: { sourceFiles: confined.files } };
|
|
61
110
|
}
|
|
111
|
+
case 'analyze-coverage':
|
|
112
|
+
// #1200: the domain plugin's handler needs coverageData, which a
|
|
113
|
+
// description never carries; the coverage tool's handler finds it.
|
|
114
|
+
return coverageRoute(request);
|
|
62
115
|
case 'test-accessibility':
|
|
63
116
|
// run-accessibility-audit falls back to URL-pattern heuristics when no
|
|
64
117
|
// browser is available, which reports violations nobody measured.
|