agentic-qe 3.15.6 → 3.15.8
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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +263 -0
- package/README.md +2 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -6
- package/dist/cli/chunks/adapter-FC4EY447.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-W3V5P7LE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-2NQFHAWE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-457ECHHK.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-IYBQ3GPY.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-JV3WSEHU.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-5OS3T3K6.js} +3 -3
- package/dist/cli/chunks/base-2XML4WH7.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IQKBFVAO.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-KA3SGAFM.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-QZDU2VOQ.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-ZL7OLKJQ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +2 -0
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-22DOS3PM.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-2DPHFCMW.js} +2 -2
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-2GSAAUW3.js} +1 -1
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-2JCLACCS.js} +2 -2
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-2QRGIEQV.js} +1 -1
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-2UN4JOTN.js} +2 -2
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2ZRNXEVI.js} +1 -1
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-3LFLO2WK.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-3N627QRU.js} +2 -2
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-4C3RYBTT.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-4C7KE2EL.js} +2 -2
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-4GUVVGJX.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-4GYFONJB.js} +1 -1
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-4I35ARWW.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-4NTLGGXO.js} +1 -1
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-4TZLZRZ4.js} +1 -1
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-4YUBWU3E.js} +1 -1
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-52YRSWPS.js} +2 -2
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-5DZDLOY6.js} +3 -3
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-5MBNRTT5.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-5ONJ7AV6.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-5YOO5QSE.js} +1 -1
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-62T7U25U.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-6CKTLVYV.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-6E7EOHMN.js} +2 -2
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-6GIC2263.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-767SR7WH.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-7C6FMLQR.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-7CVMT64N.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-7DHSHD5B.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-7H3GNRNA.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7SLEUVPZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-7XGM7Q2N.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-A2UGPKCS.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-A6GCO6ZU.js} +2 -2
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-BEVWCF3Q.js} +3 -3
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-BLZEOGQE.js} +2 -2
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-BQUIZ5QT.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-BTMEOZYY.js} +1 -1
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-CDLG3Q2O.js} +2 -2
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-CQ3SBRDP.js} +2 -2
- package/dist/cli/chunks/chunk-CQ5G64EA.js +3 -0
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-CRUQ6RXU.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-D4IBIMWI.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-D4O3TJI7.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-DAFMHM64.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-DCYUHCPK.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-DKFSCJEF.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-DN3AKAPY.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-DY37YMMQ.js} +1 -1
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-EUVSSIGR.js} +3 -3
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-FAYXES7R.js} +2 -2
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-FEN2DHFM.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-FEPFXXI7.js} +2 -2
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-FJAO4UX2.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-FWXNFPLS.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-G6CLO74Q.js} +3 -3
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-G77Q22EN.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-GENNJRNK.js} +3 -3
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-GGSTLKY5.js} +1 -1
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-GSOK4M6V.js} +1 -1
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-HI6OBDDY.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-HNGNRIZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-HXCGV5UJ.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-I4U7YCXG.js} +3 -3
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I77D65X5.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-IJSFZO7P.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-IMSRWNWF.js} +1 -1
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-J6LL25QJ.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-J7FLNP5L.js} +2 -2
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-J7RCI25Q.js} +1 -1
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-JFWQFB3S.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-JLTGO5BB.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-JWPYMRIX.js} +14 -6
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-K4N2MBCE.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-K5R3WUJP.js} +1 -1
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-KITKQUBX.js} +1 -1
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-KJNUETCB.js} +1 -1
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-KMVFBYJO.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-KMZW2P3R.js} +2 -2
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-KNHLOANK.js} +2 -2
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-KNQUHGNY.js} +2 -2
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-KVMKYUOE.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-LHRVSK44.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-LPSMVBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-LVHZK7GW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-LZWBUVCK.js} +3 -3
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MMY52Y6R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-MUDBF2JC.js} +1 -1
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-MV4S3TEC.js} +2 -2
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-NF63NHJH.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-NHOMVBCI.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-NLYUC63R.js} +2 -2
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-NQDYOF35.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-NW7HTOSN.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-NWFBF3KT.js} +1 -1
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-NZATJ2C6.js} +2 -2
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-O4RRVTXN.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-OCLAMZJG.js} +2 -2
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-OJWEZYLR.js} +2 -2
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-OWBFVAEH.js} +2 -2
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-P2EA62YS.js} +1 -1
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-P4UT4LBE.js} +3 -3
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-PICEGWGB.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-PIEKGKW6.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PJGQ2TKN.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-PPIM7B5G.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-PUYQ6EKC.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-PWA6XBW4.js} +8 -8
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-PZ7FJ4UG.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-QFYUZYRA.js} +4 -4
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-R2NHGESM.js} +2 -2
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-RG42LDOB.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-RSMPJWQH.js} +1 -1
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-SFPGLUXS.js} +1 -1
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-SHEVM5PF.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-SJMZZMHP.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-ST7ASEJO.js} +57 -57
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-SWY6KGMF.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-T2TDTBFV.js} +1 -1
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-TC52M542.js} +2 -2
- package/dist/cli/chunks/chunk-TMNEK7TP.js +2 -0
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-U3BWBP6B.js} +2 -2
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-U7CIY3YR.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-UDCYQLTD.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-UKKFZJME.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-UQLAN5TX.js} +4 -4
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UTFMMZ57.js} +3 -3
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-UTNKMPTC.js} +1 -1
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-V4QJ3MMT.js} +1 -1
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-V7VZSNDK.js} +3 -3
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-VKFVJCIH.js} +1 -1
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VQRBBR27.js} +2 -2
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-VVK4ECVJ.js} +2 -2
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-VWRNG3UK.js} +1 -1
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-VWSGWYRB.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-W5A36V3Z.js} +2 -2
- package/dist/cli/chunks/chunk-WAWKAYPY.js +2 -0
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-WLXGUQOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-X3HM7SV4.js} +2 -2
- package/dist/cli/chunks/chunk-X6VYQVUM.js +2 -0
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-X7ZQIFES.js} +2 -2
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-XOOBLZXR.js} +2 -2
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-XZQVC3GD.js} +1 -1
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-Y5ZBF7MA.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-YNQPHRUZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-YRH7KMTU.js} +2 -2
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-YTYS2XSY.js} +1 -1
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-YUP3APSN.js} +1 -1
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-YVWMJZ6O.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-Z3LDUPLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-ZBI7PJFX.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-ZG7UKWBB.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-ZOHS32SI.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-ZOVAZTXE.js} +430 -430
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-ZWMFKZEQ.js} +2 -2
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-7NUCRGWO.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-VQVECCFI.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-P7GQ6TKF.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-5YP6N6HE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-W5H7CMU6.js} +2 -2
- package/dist/cli/chunks/client-RFUSQRUZ.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-OYANSZ54.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-OMT4UEZI.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-M2JEWKNF.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-YBS6N5O3.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-U7GS5RG6.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-QSXPIUIU.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-W5TTT743.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-KC2RT24C.js} +2 -2
- package/dist/cli/chunks/core-handlers-ZC7QB432.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-OQPVR6V4.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-TCO2A2NX.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-MH7GWD4L.js} +2 -2
- package/dist/cli/chunks/daemon-JER6HE2J.js +12 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-UJEARJZ2.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-F3SUJU5O.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-5QTCRB32.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-XKZPHDBO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-V3UEADKW.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-7PES4UHZ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-NF7UJW7B.js} +2 -2
- package/dist/cli/chunks/dream-VALD726W.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-D2HWORHF.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-UF2UBAUC.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-2OUCEHHM.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-KV5DKKHC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-6YWMTNO5.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-MTW6NMR3.js} +2 -2
- package/dist/cli/chunks/file-discovery-VL73ASNI.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-GJ66QFXK.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-52V6ANOY.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-X7NHNRC7.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +2 -0
- package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-DZBE3KMK.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-2AWWUJAZ.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-XLPVROL3.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-6TI7YP6P.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-DBIBBOXS.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +2 -0
- package/dist/cli/chunks/init-guard-OSO6MIDD.js +2 -0
- package/dist/cli/chunks/init-handler-7S7IHMUF.js +88 -0
- package/dist/cli/chunks/init-wizard-VH34J4TL.js +2 -0
- package/dist/cli/chunks/kernel-KJD24NO7.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-2KBRFXMA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-5VFR4OQZ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-G5NHL3DV.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-4EAPPMHS.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-UYMZPEY6.js} +2 -2
- package/dist/cli/chunks/load-test-OTQ2JQ5F.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-NOTDZBW5.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-QL53YIHP.js} +5 -5
- package/dist/cli/chunks/memory-backend-4QSNRRV6.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-YFFYRSM6.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-PDDDXF2B.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-75D2SKOT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-3WIZBV4T.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-TEX2JGHA.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-7ATPA6LU.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-WPSKRJE7.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-UUFOVVMU.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-PDFSYWKZ.js} +2 -2
- package/dist/cli/chunks/project-root-SRTA6TBL.js +2 -0
- package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-3VRYRIQB.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-2NAUROGF.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-ZIEI2WGA.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-KWJO4SWQ.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-TSZ4UIAE.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-DWFFRETJ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-XTZHLUBO.js} +2 -2
- package/dist/cli/chunks/router-AUD4GATI.js +2 -0
- package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-GG525TDM.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QKRJDM7Z.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-FF52OS6Q.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-M6DXTAZ4.js} +2 -2
- package/dist/cli/chunks/safe-db-Q6JUKG2A.js +2 -0
- package/dist/cli/chunks/schedule-44OSMGE5.js +2 -0
- package/dist/cli/chunks/scheduler-V3HO2QQT.js +2 -0
- package/dist/cli/chunks/security-EHXSW22U.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-6EH7UVJL.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-WML274E7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-C7QKAXS4.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-VLI7MRLM.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-3LPG6MQN.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-4IMMQEPT.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-JFJEJBVK.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-IED3K6E4.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-FH6DNTHW.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-GPKT3CKZ.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-Z42XXZP6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-HMM3AHXM.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-6Y2ERYIY.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-MB63T2XO.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-56GDQCMR.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-J4J6QV3I.js} +2 -2
- package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +2 -0
- package/dist/cli/chunks/unified-persistence-72OCJJKK.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-U4XU7LFM.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-B57HA4YK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-UPPA4M6T.js} +2 -2
- package/dist/cli/chunks/visual-security-7F5UV23J.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-GDZMUKOZ.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-VJRWCHXP.js} +2 -2
- package/dist/cli/chunks/witness-chain-KZ57QUFE.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-LFASSMZK.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-TPHN4DXN.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-Z23FVABW.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-745MJ7WO.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-T245QNQM.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-WCAYIQUX.js} +2 -2
- package/dist/cli/commands/learning.js +3 -2
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/handlers/init-guard.d.ts +21 -1
- package/dist/cli/handlers/init-guard.js +51 -8
- package/dist/cli/handlers/init-handler.js +57 -56
- package/dist/cli/index.js +11 -0
- package/dist/cli/utils/ci-output.d.ts +5 -0
- package/dist/cli/utils/ci-output.js +8 -0
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/protocols/defect-investigation.js +7 -1
- package/dist/coordination/protocols/learning-consolidation.js +6 -12
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +9 -0
- package/dist/coordination/result-saver.js +34 -4
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +8 -1
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- package/dist/domains/learning-optimization/active-patterns.d.ts +55 -0
- package/dist/domains/learning-optimization/active-patterns.js +77 -0
- package/dist/domains/learning-optimization/coordinator.js +12 -9
- package/dist/domains/learning-optimization/services/learning-coordinator.js +15 -17
- package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
- package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
- package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
- package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
- package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
- package/dist/domains/security-compliance/interfaces.d.ts +30 -0
- package/dist/domains/security-compliance/plugin.d.ts +7 -1
- package/dist/domains/security-compliance/plugin.js +19 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
- package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
- package/dist/domains/security-compliance/services/security-auditor.js +133 -92
- package/dist/domains/test-execution/services/retry-handler.js +34 -7
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +87 -7
- package/dist/kernel/shared-dirs.js +17 -5
- package/dist/learning/dream/dream-engine.d.ts +27 -1
- package/dist/learning/dream/dream-engine.js +56 -2
- package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -0
- package/dist/learning/dream/rvcow-branch-manager.js +8 -0
- package/dist/learning/dream/speculative-dreamer.d.ts +8 -0
- package/dist/learning/dream/speculative-dreamer.js +8 -0
- package/dist/mcp/background-workers.d.ts +15 -0
- package/dist/mcp/background-workers.js +71 -0
- package/dist/mcp/bundle.js +881 -878
- package/dist/mcp/entry.js +4 -49
- package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +5 -1
- package/dist/mcp/protocol-server.js +2 -1
- package/dist/mcp/types.d.ts +6 -0
- package/dist/shared/security/index.d.ts +2 -2
- package/dist/shared/security/index.js +1 -1
- package/dist/shared/security/osv-client.d.ts +79 -132
- package/dist/shared/security/osv-client.js +344 -167
- package/dist/shared/security/osv-lookup.d.ts +124 -0
- package/dist/shared/security/osv-lookup.js +246 -0
- package/dist/shared/security/osv-types.d.ts +119 -0
- package/dist/shared/security/osv-types.js +6 -0
- package/dist/workers/daemon.d.ts +5 -0
- package/dist/workers/daemon.js +16 -2
- package/dist/workers/interfaces.d.ts +6 -1
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-env.d.ts +45 -0
- package/dist/workers/worker-env.js +76 -0
- package/dist/workers/worker-manager.js +5 -2
- package/dist/workers/workers/defect-predictor.d.ts +25 -8
- package/dist/workers/workers/defect-predictor.js +223 -216
- package/dist/workers/workers/learning-consolidation.d.ts +20 -0
- package/dist/workers/workers/learning-consolidation.js +53 -22
- package/dist/workers/workers/performance-baseline.d.ts +24 -9
- package/dist/workers/workers/performance-baseline.js +187 -230
- package/dist/workers/workers/quality-gate.d.ts +11 -9
- package/dist/workers/workers/quality-gate.js +125 -267
- package/dist/workers/workers/security-scan-records.d.ts +111 -0
- package/dist/workers/workers/security-scan-records.js +128 -0
- package/dist/workers/workers/security-scan.d.ts +25 -7
- package/dist/workers/workers/security-scan.js +187 -164
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
- package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
- package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
- package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
- package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
- package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
- package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
|
@@ -7,6 +7,7 @@ import { spawn } from 'node:child_process';
|
|
|
7
7
|
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
8
8
|
import { tmpdir } from 'node:os';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
10
11
|
import { v4 as uuidv4 } from 'uuid';
|
|
11
12
|
import { ok, err } from '../../../shared/types/index.js';
|
|
12
13
|
import { TEST_EXECUTION_CONSTANTS, LLM_ANALYSIS_CONSTANTS } from '../../constants.js';
|
|
@@ -305,11 +306,13 @@ Provide:
|
|
|
305
306
|
const failedTests = [];
|
|
306
307
|
const coverages = [];
|
|
307
308
|
const allFileCoverages = [];
|
|
309
|
+
const executionResults = [];
|
|
308
310
|
let passed = 0;
|
|
309
311
|
let failed = 0;
|
|
310
312
|
let skipped = 0;
|
|
311
313
|
for (const file of testFiles) {
|
|
312
314
|
const result = await this.executeTestFile(file, framework, timeout);
|
|
315
|
+
executionResults.push(result);
|
|
313
316
|
passed += result.passed;
|
|
314
317
|
failed += result.failed;
|
|
315
318
|
skipped += result.skipped;
|
|
@@ -321,16 +324,61 @@ Provide:
|
|
|
321
324
|
allFileCoverages.push(...result.fileCoverages);
|
|
322
325
|
}
|
|
323
326
|
}
|
|
327
|
+
// Separate runner invocations each have their own coverage map. Averaging
|
|
328
|
+
// percentages double-counts source files and misses disjoint hits (#1030).
|
|
329
|
+
// If any run lacks raw counters, there is no honest combined measurement.
|
|
330
|
+
const merged = testFiles.length > 1 && !this.config.simulateForTesting
|
|
331
|
+
? this.mergeSequentialCoverage(executionResults)
|
|
332
|
+
: undefined;
|
|
333
|
+
const separateRuns = testFiles.length > 1 && !this.config.simulateForTesting;
|
|
324
334
|
return {
|
|
325
335
|
total: passed + failed + skipped,
|
|
326
336
|
passed,
|
|
327
337
|
failed,
|
|
328
338
|
skipped,
|
|
329
339
|
failedTests,
|
|
330
|
-
coverage: this.aggregateCoverage(coverages),
|
|
331
|
-
fileCoverages:
|
|
340
|
+
coverage: separateRuns ? merged?.summary : this.aggregateCoverage(coverages),
|
|
341
|
+
fileCoverages: separateRuns ? merged?.perFile
|
|
342
|
+
: allFileCoverages.length > 0 ? allFileCoverages : undefined,
|
|
332
343
|
};
|
|
333
344
|
}
|
|
345
|
+
mergeSequentialCoverage(results) {
|
|
346
|
+
if (results.some(result => !result.rawCoverageMap))
|
|
347
|
+
return undefined;
|
|
348
|
+
const merged = {};
|
|
349
|
+
for (const result of results) {
|
|
350
|
+
for (const [rawPath, entry] of Object.entries(result.rawCoverageMap)) {
|
|
351
|
+
if (!isRecord(entry) || !isRecord(entry.statementMap) || !isRecord(entry.fnMap)
|
|
352
|
+
|| !isRecord(entry.branchMap) || !isRecord(entry.s) || !isRecord(entry.f)
|
|
353
|
+
|| !isRecord(entry.b))
|
|
354
|
+
return undefined;
|
|
355
|
+
const file = fileCoverageKey(rawPath);
|
|
356
|
+
const prior = merged[file];
|
|
357
|
+
if (prior) {
|
|
358
|
+
if (!isDeepStrictEqual(prior.statementMap, entry.statementMap)
|
|
359
|
+
|| !isDeepStrictEqual(prior.fnMap, entry.fnMap)
|
|
360
|
+
|| !isDeepStrictEqual(prior.branchMap, entry.branchMap))
|
|
361
|
+
return undefined;
|
|
362
|
+
for (const counter of ['s', 'f', 'b']) {
|
|
363
|
+
const hits = mergeHitCounts(prior[counter], entry[counter]);
|
|
364
|
+
if (!hits)
|
|
365
|
+
return undefined;
|
|
366
|
+
prior[counter] = hits;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
const s = mergeHitCounts(entry.s, entry.s);
|
|
371
|
+
const f = mergeHitCounts(entry.f, entry.f);
|
|
372
|
+
const b = mergeHitCounts(entry.b, entry.b);
|
|
373
|
+
if (!s || !f || !b)
|
|
374
|
+
return undefined;
|
|
375
|
+
merged[file] = { ...entry, path: file, s, f, b };
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const coverage = this.extractCoverageFromJson({ coverageMap: merged });
|
|
380
|
+
return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
|
|
381
|
+
}
|
|
334
382
|
async executeTestFile(file, framework, timeout) {
|
|
335
383
|
return this.executeTestFiles([file], framework, timeout);
|
|
336
384
|
}
|
|
@@ -460,13 +508,14 @@ Provide:
|
|
|
460
508
|
const parseResult = this.parseTestOutput(reportText, stderr, fileLabel, framework, code);
|
|
461
509
|
// Read only this invocation's coverage artifacts. A previous or
|
|
462
510
|
// concurrent run's project coverage directory is not evidence.
|
|
463
|
-
if (parseResult.success &&
|
|
511
|
+
if (parseResult.success && coverageDirectory) {
|
|
464
512
|
const diskCoverage = this.readCoverageFromDisk(coverageDirectory);
|
|
465
513
|
if (diskCoverage) {
|
|
466
|
-
parseResult.value.coverage
|
|
467
|
-
if (diskCoverage.perFile.length > 0) {
|
|
514
|
+
parseResult.value.coverage ??= diskCoverage.summary;
|
|
515
|
+
if (!parseResult.value.fileCoverages && diskCoverage.perFile.length > 0) {
|
|
468
516
|
parseResult.value.fileCoverages = diskCoverage.perFile;
|
|
469
517
|
}
|
|
518
|
+
parseResult.value.rawCoverageMap ??= diskCoverage.rawMap;
|
|
470
519
|
}
|
|
471
520
|
}
|
|
472
521
|
finish(parseResult);
|
|
@@ -661,6 +710,7 @@ Provide:
|
|
|
661
710
|
failedTests,
|
|
662
711
|
coverage: covData.summary,
|
|
663
712
|
fileCoverages: covData.perFile.length > 0 ? covData.perFile : undefined,
|
|
713
|
+
rawCoverageMap: isRecord(json.coverageMap) && !json.coverageMap.total ? json.coverageMap : undefined,
|
|
664
714
|
});
|
|
665
715
|
}
|
|
666
716
|
catch {
|
|
@@ -715,6 +765,7 @@ Provide:
|
|
|
715
765
|
failedTests,
|
|
716
766
|
coverage: covData.summary,
|
|
717
767
|
fileCoverages: covData.perFile.length > 0 ? covData.perFile : undefined,
|
|
768
|
+
rawCoverageMap: isRecord(json.coverageMap) && !json.coverageMap.total ? json.coverageMap : undefined,
|
|
718
769
|
});
|
|
719
770
|
}
|
|
720
771
|
catch {
|
|
@@ -1067,8 +1118,8 @@ Provide:
|
|
|
1067
1118
|
try {
|
|
1068
1119
|
// Check common coverage output paths
|
|
1069
1120
|
const candidates = [
|
|
1070
|
-
join(coverageDirectory, 'coverage-summary.json'),
|
|
1071
1121
|
join(coverageDirectory, 'coverage-final.json'),
|
|
1122
|
+
join(coverageDirectory, 'coverage-summary.json'),
|
|
1072
1123
|
];
|
|
1073
1124
|
for (const filePath of candidates) {
|
|
1074
1125
|
if (!existsSync(filePath))
|
|
@@ -1117,7 +1168,7 @@ Provide:
|
|
|
1117
1168
|
if (typeof json === 'object' && !json.total) {
|
|
1118
1169
|
const result = this.extractCoverageFromJson({ coverageMap: json });
|
|
1119
1170
|
if (result.summary) {
|
|
1120
|
-
return { summary: result.summary, perFile: result.perFile };
|
|
1171
|
+
return { summary: result.summary, perFile: result.perFile, rawMap: json };
|
|
1121
1172
|
}
|
|
1122
1173
|
}
|
|
1123
1174
|
}
|
|
@@ -1216,4 +1267,33 @@ function summaryPct(metric) {
|
|
|
1216
1267
|
return null;
|
|
1217
1268
|
return metric.pct;
|
|
1218
1269
|
}
|
|
1270
|
+
function isRecord(value) {
|
|
1271
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
1272
|
+
}
|
|
1273
|
+
/** A test covers a counter if any invocation hit it. Reject incompatible maps. */
|
|
1274
|
+
function mergeHitCounts(left, right) {
|
|
1275
|
+
if (!isRecord(left) || !isRecord(right))
|
|
1276
|
+
return undefined;
|
|
1277
|
+
const keys = Object.keys(left);
|
|
1278
|
+
if (!isDeepStrictEqual(keys.sort(), Object.keys(right).sort()))
|
|
1279
|
+
return undefined;
|
|
1280
|
+
const merged = {};
|
|
1281
|
+
for (const key of keys) {
|
|
1282
|
+
const a = left[key];
|
|
1283
|
+
const b = right[key];
|
|
1284
|
+
if (typeof a === 'number' && Number.isFinite(a) && a >= 0
|
|
1285
|
+
&& typeof b === 'number' && Number.isFinite(b) && b >= 0) {
|
|
1286
|
+
merged[key] = Math.max(a, b);
|
|
1287
|
+
}
|
|
1288
|
+
else if (Array.isArray(a) && Array.isArray(b) && a.length === b.length
|
|
1289
|
+
&& a.every(v => typeof v === 'number' && Number.isFinite(v) && v >= 0)
|
|
1290
|
+
&& b.every(v => typeof v === 'number' && Number.isFinite(v) && v >= 0)) {
|
|
1291
|
+
merged[key] = a.map((v, i) => Math.max(v, b[i]));
|
|
1292
|
+
}
|
|
1293
|
+
else {
|
|
1294
|
+
return undefined;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
return merged;
|
|
1298
|
+
}
|
|
1219
1299
|
//# sourceMappingURL=test-executor.js.map
|
|
@@ -145,14 +145,26 @@ export function ensureScratchRoot(dir, ctx = currentPlatformContext()) {
|
|
|
145
145
|
writeOrigin(preferred, dir);
|
|
146
146
|
return preferred;
|
|
147
147
|
}
|
|
148
|
-
catch {
|
|
148
|
+
catch (preferredError) {
|
|
149
149
|
const uid = typeof process.getuid === 'function' ? String(process.getuid()) : 'user';
|
|
150
150
|
const fallbackBase = path.join(ctx.tmpdir || os.tmpdir(), `agentic-qe-scratch-${uid}`);
|
|
151
151
|
const fallback = path.join(fallbackBase, path.basename(preferred));
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
try {
|
|
153
|
+
ensurePrivateDir(fallbackBase);
|
|
154
|
+
ensurePrivateDir(fallback);
|
|
155
|
+
writeOrigin(fallback, dir);
|
|
156
|
+
return fallback;
|
|
157
|
+
}
|
|
158
|
+
catch (fallbackError) {
|
|
159
|
+
// Never fall back to the shared directory itself: that would mix data
|
|
160
|
+
// from unrelated projects. Give callers a usable diagnosis instead of
|
|
161
|
+
// an opaque EEXIST/ENOTDIR from the final mkdir.
|
|
162
|
+
const reason = (error) => error instanceof Error ? error.message : String(error);
|
|
163
|
+
throw new Error(`Cannot create a private AQE scratch root for "${dir}". ` +
|
|
164
|
+
`User cache "${preferred}" failed: ${reason(preferredError)}. ` +
|
|
165
|
+
`Temporary fallback "${fallback}" failed: ${reason(fallbackError)}. ` +
|
|
166
|
+
'Set AQE_PROJECT_ROOT to a project directory or make the user cache writable.');
|
|
167
|
+
}
|
|
156
168
|
}
|
|
157
169
|
}
|
|
158
170
|
function writeOrigin(root, dir) {
|
|
@@ -31,7 +31,21 @@ export interface DreamConfig {
|
|
|
31
31
|
activationConfig: ActivationConfig;
|
|
32
32
|
/** Insight generation configuration */
|
|
33
33
|
insightConfig: InsightConfig;
|
|
34
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Enable RVCOW branching for reversible dream cycles (ADR-069).
|
|
36
|
+
* Default: false (#1060).
|
|
37
|
+
*
|
|
38
|
+
* RISK — opt in only for an isolated database connection. The branch is a
|
|
39
|
+
* SQLite SAVEPOINT on the process-wide shared connection, and it stays open
|
|
40
|
+
* for the whole asynchronous dream (up to `maxDurationMs`). Every other
|
|
41
|
+
* write made on that connection in the meantime (memory_store, pattern
|
|
42
|
+
* updates, experience capture) joins the savepoint. A discard (failed
|
|
43
|
+
* validation, error, cancel) rolls those foreground writes back even though
|
|
44
|
+
* they were already acknowledged. Branch validation only inspects
|
|
45
|
+
* `qe_patterns`, which `dream()` does not write, so branching adds little
|
|
46
|
+
* protection to a dream cycle. A compute-then-commit rework is tracked in
|
|
47
|
+
* #1060.
|
|
48
|
+
*/
|
|
35
49
|
enableBranching: boolean;
|
|
36
50
|
/** Validation thresholds for dream branch quality checks */
|
|
37
51
|
branchValidationThresholds: ValidationThresholds;
|
|
@@ -104,6 +118,8 @@ export declare class DreamEngine {
|
|
|
104
118
|
private graph;
|
|
105
119
|
private db;
|
|
106
120
|
private branchManager;
|
|
121
|
+
/** #1060: marks the in-flight dream cycle interrupted (set while dreaming). */
|
|
122
|
+
private interruptActiveDream;
|
|
107
123
|
private currentCycle;
|
|
108
124
|
private initialized;
|
|
109
125
|
private cancelled;
|
|
@@ -138,6 +154,15 @@ export declare class DreamEngine {
|
|
|
138
154
|
* @returns Dream cycle result with insights and statistics
|
|
139
155
|
*/
|
|
140
156
|
dream(durationMs?: number): Promise<DreamCycleResult>;
|
|
157
|
+
/**
|
|
158
|
+
* #1060: build a synchronous handler that records a still-running cycle as
|
|
159
|
+
* 'interrupted'. It runs from close() and from a process store closer,
|
|
160
|
+
* which runs before the shared database closes (closers run newest first).
|
|
161
|
+
* When opt-in branching left a savepoint open, the savepoint is released
|
|
162
|
+
* first so foreground writes made on the shared connection during the
|
|
163
|
+
* dream are committed rather than lost with the connection.
|
|
164
|
+
*/
|
|
165
|
+
private createCycleInterrupter;
|
|
141
166
|
/**
|
|
142
167
|
* Load patterns as concepts for dreaming.
|
|
143
168
|
*
|
|
@@ -203,6 +228,7 @@ export declare class DreamEngine {
|
|
|
203
228
|
getCurrentCycle(): DreamCycle | null;
|
|
204
229
|
private saveCycle;
|
|
205
230
|
private updateCycle;
|
|
231
|
+
private updateCycleSync;
|
|
206
232
|
private saveInsight;
|
|
207
233
|
private getInsightRowById;
|
|
208
234
|
/**
|
|
@@ -21,6 +21,7 @@ import { LoggerFactory } from '../../logging/index.js';
|
|
|
21
21
|
const dreamLogger = LoggerFactory.create('dream-engine');
|
|
22
22
|
import { v4 as uuidv4 } from 'uuid';
|
|
23
23
|
import { getUnifiedPersistence } from '../../kernel/unified-persistence.js';
|
|
24
|
+
import { registerStoreCloser } from '../../kernel/process-lifecycle.js';
|
|
24
25
|
import { ConceptGraph } from './concept-graph.js';
|
|
25
26
|
import { SpreadingActivation, } from './spreading-activation.js';
|
|
26
27
|
import { InsightGenerator, } from './insight-generator.js';
|
|
@@ -43,7 +44,8 @@ export const DEFAULT_DREAM_CONFIG = {
|
|
|
43
44
|
minConfidence: 0.5,
|
|
44
45
|
maxInsightsPerCycle: 10,
|
|
45
46
|
},
|
|
46
|
-
|
|
47
|
+
// #1060: off by default; see the RISK note on DreamConfig.enableBranching.
|
|
48
|
+
enableBranching: false,
|
|
47
49
|
branchValidationThresholds: { ...DEFAULT_VALIDATION_THRESHOLDS },
|
|
48
50
|
};
|
|
49
51
|
// ============================================================================
|
|
@@ -206,6 +208,8 @@ export class DreamEngine {
|
|
|
206
208
|
graph = null;
|
|
207
209
|
db = null;
|
|
208
210
|
branchManager = null;
|
|
211
|
+
/** #1060: marks the in-flight dream cycle interrupted (set while dreaming). */
|
|
212
|
+
interruptActiveDream = null;
|
|
209
213
|
currentCycle = null;
|
|
210
214
|
initialized = false;
|
|
211
215
|
cancelled = false;
|
|
@@ -344,13 +348,18 @@ export class DreamEngine {
|
|
|
344
348
|
status: 'running',
|
|
345
349
|
};
|
|
346
350
|
await this.saveCycle(this.currentCycle);
|
|
347
|
-
// ADR-069: Create RVCOW branch before dream consolidation
|
|
351
|
+
// ADR-069: Create RVCOW branch before dream consolidation (opt-in, #1060)
|
|
348
352
|
let branch = null;
|
|
349
353
|
if (this.branchManager) {
|
|
350
354
|
const branchName = `dream-${this.currentCycle.id}-${Date.now()}`;
|
|
351
355
|
branch = this.branchManager.createBranch(branchName);
|
|
352
356
|
this.emitBranchEvent('dream:branch_created', branch);
|
|
353
357
|
}
|
|
358
|
+
// #1060: if the engine closes or the process shuts down mid-dream, record
|
|
359
|
+
// the cycle as interrupted instead of leaving it 'running' forever.
|
|
360
|
+
const interrupt = this.createCycleInterrupter(this.currentCycle, startTime, () => branch);
|
|
361
|
+
this.interruptActiveDream = interrupt;
|
|
362
|
+
const unregisterShutdownGuard = registerStoreCloser(interrupt);
|
|
354
363
|
try {
|
|
355
364
|
// 1. Check we have enough concepts
|
|
356
365
|
const allNodes = await this.graph.getActiveNodes(0);
|
|
@@ -458,6 +467,44 @@ export class DreamEngine {
|
|
|
458
467
|
this.currentCycle = null;
|
|
459
468
|
throw error;
|
|
460
469
|
}
|
|
470
|
+
finally {
|
|
471
|
+
unregisterShutdownGuard();
|
|
472
|
+
if (this.interruptActiveDream === interrupt)
|
|
473
|
+
this.interruptActiveDream = null;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* #1060: build a synchronous handler that records a still-running cycle as
|
|
478
|
+
* 'interrupted'. It runs from close() and from a process store closer,
|
|
479
|
+
* which runs before the shared database closes (closers run newest first).
|
|
480
|
+
* When opt-in branching left a savepoint open, the savepoint is released
|
|
481
|
+
* first so foreground writes made on the shared connection during the
|
|
482
|
+
* dream are committed rather than lost with the connection.
|
|
483
|
+
*/
|
|
484
|
+
createCycleInterrupter(cycle, startTime, getBranch) {
|
|
485
|
+
return () => {
|
|
486
|
+
if (cycle.status !== 'running' || !this.db)
|
|
487
|
+
return;
|
|
488
|
+
const branch = getBranch();
|
|
489
|
+
if (branch && this.branchManager) {
|
|
490
|
+
try {
|
|
491
|
+
this.branchManager.mergeBranch(branch);
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
// Branch already resolved; nothing to release
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
cycle.status = 'interrupted';
|
|
498
|
+
cycle.error = 'Interrupted: engine closed or process shut down during the dream cycle';
|
|
499
|
+
cycle.endTime = new Date();
|
|
500
|
+
cycle.durationMs = Date.now() - startTime;
|
|
501
|
+
try {
|
|
502
|
+
this.updateCycleSync(cycle);
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
// Best effort during shutdown
|
|
506
|
+
}
|
|
507
|
+
};
|
|
461
508
|
}
|
|
462
509
|
// ==========================================================================
|
|
463
510
|
// Pattern Loading
|
|
@@ -753,6 +800,9 @@ export class DreamEngine {
|
|
|
753
800
|
stmt.run(cycle.id, cycle.startTime.toISOString(), cycle.endTime?.toISOString() ?? null, cycle.durationMs ?? null, cycle.conceptsProcessed, cycle.associationsFound, cycle.insightsGenerated, cycle.status, cycle.error ?? null, cycle.startTime.toISOString());
|
|
754
801
|
}
|
|
755
802
|
async updateCycle(cycle) {
|
|
803
|
+
this.updateCycleSync(cycle);
|
|
804
|
+
}
|
|
805
|
+
updateCycleSync(cycle) {
|
|
756
806
|
if (!this.db)
|
|
757
807
|
return;
|
|
758
808
|
const stmt = this.db.prepare(`
|
|
@@ -815,6 +865,10 @@ export class DreamEngine {
|
|
|
815
865
|
* Release resources (does NOT close the shared database)
|
|
816
866
|
*/
|
|
817
867
|
async close() {
|
|
868
|
+
// #1060: a dream still in flight is recorded as interrupted before the
|
|
869
|
+
// engine lets go of the database.
|
|
870
|
+
this.interruptActiveDream?.();
|
|
871
|
+
this.interruptActiveDream = null;
|
|
818
872
|
if (this.graph) {
|
|
819
873
|
await this.graph.close();
|
|
820
874
|
this.graph = null;
|
|
@@ -13,6 +13,14 @@
|
|
|
13
13
|
* - mergeBranch -> RELEASE SAVEPOINT
|
|
14
14
|
* - discardBranch -> ROLLBACK TO SAVEPOINT
|
|
15
15
|
*
|
|
16
|
+
* WARNING (#1060): a SAVEPOINT covers every write on its connection, not just
|
|
17
|
+
* the dream's. Use an isolated connection, or keep the branch open only
|
|
18
|
+
* across synchronous work. If it stays open across `await`s on the
|
|
19
|
+
* process-wide shared connection, foreground writes made in the meantime
|
|
20
|
+
* (memory_store and other acknowledged writes) join the savepoint and are
|
|
21
|
+
* rolled back by a discard, or lost if the connection closes before
|
|
22
|
+
* RELEASE. DreamEngine therefore defaults `enableBranching` to false.
|
|
23
|
+
*
|
|
16
24
|
* @module learning/dream/rvcow-branch-manager
|
|
17
25
|
*/
|
|
18
26
|
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
@@ -13,6 +13,14 @@
|
|
|
13
13
|
* - mergeBranch -> RELEASE SAVEPOINT
|
|
14
14
|
* - discardBranch -> ROLLBACK TO SAVEPOINT
|
|
15
15
|
*
|
|
16
|
+
* WARNING (#1060): a SAVEPOINT covers every write on its connection, not just
|
|
17
|
+
* the dream's. Use an isolated connection, or keep the branch open only
|
|
18
|
+
* across synchronous work. If it stays open across `await`s on the
|
|
19
|
+
* process-wide shared connection, foreground writes made in the meantime
|
|
20
|
+
* (memory_store and other acknowledged writes) join the savepoint and are
|
|
21
|
+
* rolled back by a discard, or lost if the connection closes before
|
|
22
|
+
* RELEASE. DreamEngine therefore defaults `enableBranching` to false.
|
|
23
|
+
*
|
|
16
24
|
* @module learning/dream/rvcow-branch-manager
|
|
17
25
|
*/
|
|
18
26
|
import { existsSync, unlinkSync } from 'fs';
|
|
@@ -69,6 +69,14 @@ export declare const BUILT_IN_STRATEGIES: DreamStrategy[];
|
|
|
69
69
|
* are executed one at a time but each in its own savepoint. The branch manager
|
|
70
70
|
* ensures that failed strategies leave no trace in the database.
|
|
71
71
|
*
|
|
72
|
+
* WARNING (#1060): a SAVEPOINT covers every write on its connection, not just
|
|
73
|
+
* the dream's. Use an isolated connection, or keep the branch open only
|
|
74
|
+
* across synchronous work. If it stays open across `await`s on the
|
|
75
|
+
* process-wide shared connection, foreground writes made in the meantime
|
|
76
|
+
* (memory_store and other acknowledged writes) join the savepoint and are
|
|
77
|
+
* rolled back by a discard, or lost if the connection closes before
|
|
78
|
+
* RELEASE. DreamEngine therefore defaults `enableBranching` to false.
|
|
79
|
+
*
|
|
72
80
|
* @example
|
|
73
81
|
* ```typescript
|
|
74
82
|
* const dreamer = new SpeculativeDreamer(db);
|
|
@@ -61,6 +61,14 @@ export const BUILT_IN_STRATEGIES = [
|
|
|
61
61
|
* are executed one at a time but each in its own savepoint. The branch manager
|
|
62
62
|
* ensures that failed strategies leave no trace in the database.
|
|
63
63
|
*
|
|
64
|
+
* WARNING (#1060): a SAVEPOINT covers every write on its connection, not just
|
|
65
|
+
* the dream's. Use an isolated connection, or keep the branch open only
|
|
66
|
+
* across synchronous work. If it stays open across `await`s on the
|
|
67
|
+
* process-wide shared connection, foreground writes made in the meantime
|
|
68
|
+
* (memory_store and other acknowledged writes) join the savepoint and are
|
|
69
|
+
* rolled back by a discard, or lost if the connection closes before
|
|
70
|
+
* RELEASE. DreamEngine therefore defaults `enableBranching` to false.
|
|
71
|
+
*
|
|
64
72
|
* @example
|
|
65
73
|
* ```typescript
|
|
66
74
|
* const dreamer = new SpeculativeDreamer(db);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP background worker startup (IMP-10, #1061)
|
|
3
|
+
*
|
|
4
|
+
* Starts the worker daemon and the QualityDaemon for the MCP server, unless
|
|
5
|
+
* `AQE_WORKERS_ENABLED` is set to a falsy value (`false`, `0`, `off`, `no`).
|
|
6
|
+
* `aqe init --no-database` writes `AQE_WORKERS_ENABLED=false` (#533); before
|
|
7
|
+
* #1061 the variable was written but never read.
|
|
8
|
+
*
|
|
9
|
+
* All output goes through `log`, which the MCP entry binds to the original
|
|
10
|
+
* stderr writer so stdout stays reserved for JSON-RPC.
|
|
11
|
+
*/
|
|
12
|
+
import { type WorkerEnv } from '../workers/worker-env.js';
|
|
13
|
+
export type BackgroundWorkersOutcome = 'disabled' | 'started' | 'failed';
|
|
14
|
+
export declare function startBackgroundWorkers(log: (message: string) => void, env?: WorkerEnv): Promise<BackgroundWorkersOutcome>;
|
|
15
|
+
//# sourceMappingURL=background-workers.d.ts.map
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - MCP background worker startup (IMP-10, #1061)
|
|
3
|
+
*
|
|
4
|
+
* Starts the worker daemon and the QualityDaemon for the MCP server, unless
|
|
5
|
+
* `AQE_WORKERS_ENABLED` is set to a falsy value (`false`, `0`, `off`, `no`).
|
|
6
|
+
* `aqe init --no-database` writes `AQE_WORKERS_ENABLED=false` (#533); before
|
|
7
|
+
* #1061 the variable was written but never read.
|
|
8
|
+
*
|
|
9
|
+
* All output goes through `log`, which the MCP entry binds to the original
|
|
10
|
+
* stderr writer so stdout stays reserved for JSON-RPC.
|
|
11
|
+
*/
|
|
12
|
+
import { isWorkersEnabled } from '../workers/worker-env.js';
|
|
13
|
+
export async function startBackgroundWorkers(log, env = process.env) {
|
|
14
|
+
if (!isWorkersEnabled(env)) {
|
|
15
|
+
log(`[MCP] Background workers disabled (AQE_WORKERS_ENABLED=${env.AQE_WORKERS_ENABLED}); ` +
|
|
16
|
+
'worker daemon and quality daemon not started\n');
|
|
17
|
+
return 'disabled';
|
|
18
|
+
}
|
|
19
|
+
// In database-free mode the workers run against the in-memory unified
|
|
20
|
+
// store, so they persist nothing to disk while keeping QualityDaemon/health
|
|
21
|
+
// functional.
|
|
22
|
+
try {
|
|
23
|
+
const { getDaemon } = await import('../workers/daemon.js');
|
|
24
|
+
// ADR-001 Bug A fix: use the canonical getDaemon() default. Passing
|
|
25
|
+
// `{ autoStart: false }` here would neuter workerManager.startAll() —
|
|
26
|
+
// the only call path that schedules per-worker setInterval timers, so
|
|
27
|
+
// workers would register but never tick. DEFAULT_CONFIG.autoStart=true
|
|
28
|
+
// (workers/daemon.ts) is the contracted default; matches the
|
|
29
|
+
// shutdownDaemon() call site in entry.ts.
|
|
30
|
+
const daemon = getDaemon();
|
|
31
|
+
await daemon.start();
|
|
32
|
+
const status = daemon.getStatus();
|
|
33
|
+
log(`[MCP] Background workers started (${status.workerManager.totalWorkers} workers)\n`);
|
|
34
|
+
// IMP-10: Start QualityDaemon with persistent memory (Finding 1 & 2 resolution)
|
|
35
|
+
try {
|
|
36
|
+
const { UnifiedMemoryManager } = await import('../kernel/unified-memory.js');
|
|
37
|
+
const { PersistentWorkerMemory } = await import('../workers/quality-daemon/persistent-memory.js');
|
|
38
|
+
const { isPrivateIp } = await import('../hooks/security/ssrf-guard.js');
|
|
39
|
+
const unifiedMemory = await UnifiedMemoryManager.getInstanceAsync();
|
|
40
|
+
const persistentMemory = new PersistentWorkerMemory(unifiedMemory);
|
|
41
|
+
const qualityDaemon = daemon.getQualityDaemon({
|
|
42
|
+
notifications: {
|
|
43
|
+
// IMP-07 SSRF guard: block private IPs in webhook URLs (Finding 5)
|
|
44
|
+
urlValidator: (url) => {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = new URL(url);
|
|
47
|
+
const hostname = parsed.hostname.replace(/^\[|\]$/g, '');
|
|
48
|
+
return !isPrivateIp(hostname);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
await qualityDaemon.start(persistentMemory);
|
|
57
|
+
log(`[MCP] Quality daemon started\n`);
|
|
58
|
+
}
|
|
59
|
+
catch (qdError) {
|
|
60
|
+
log(`[MCP] WARNING: Quality daemon failed to start: ${qdError}\n`);
|
|
61
|
+
// Non-fatal — MCP continues without quality daemon
|
|
62
|
+
}
|
|
63
|
+
return 'started';
|
|
64
|
+
}
|
|
65
|
+
catch (daemonError) {
|
|
66
|
+
log(`[MCP] WARNING: Background workers failed to start: ${daemonError}\n`);
|
|
67
|
+
// Non-fatal — MCP server continues without background workers
|
|
68
|
+
return 'failed';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=background-workers.js.map
|