agentic-qe 3.14.7 → 3.14.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/helpers/.helpers-version +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +18 -9
- package/.claude/helpers/helpers.manifest.json +6 -5
- package/.claude/helpers/hook-handler.cjs +40 -12
- package/.claude/helpers/memory.cjs +86 -0
- package/.claude/helpers/router.cjs +105 -0
- package/.claude/helpers/session.cjs +166 -0
- package/.claude/helpers/statusline.cjs +73 -621
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +130 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
- package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
- package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-AK2W76RG.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-MGZCWHIY.js → agent-handler-4HZEQ3WQ.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-JZ54MCSP.js → agent-memory-branch-IBHZQSRN.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
- package/dist/cli/chunks/{arena-CUVH3V7H.js → arena-EJBIGSF4.js} +2 -2
- package/dist/cli/chunks/{arena-YSWTKBCL.js → arena-LCLRGUIK.js} +4 -4
- package/dist/cli/chunks/{audit-LVU76QGA.js → audit-PY4JNDQQ.js} +3 -3
- package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-DB3LOJQU.js → better-sqlite3-2JG5K6XT.js} +2 -2
- package/dist/cli/chunks/{brain-handler-SD63KOQ6.js → brain-handler-3UYK55GA.js} +4 -4
- package/dist/cli/chunks/{branch-enumerator-4MNOPUC7.js → branch-enumerator-GOSWOX46.js} +2 -2
- package/dist/cli/chunks/{browser-OLPNTWQE.js → browser-DC2JV47Z.js} +2 -2
- package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
- package/dist/cli/chunks/{chunk-QQFQDEUE.js → chunk-25EEIAHS.js} +2 -2
- package/dist/cli/chunks/{chunk-DOBKEXMJ.js → chunk-3576QGPP.js} +1 -1
- package/dist/cli/chunks/{chunk-3M7J4U74.js → chunk-3EKG7HFV.js} +4 -4
- package/dist/cli/chunks/{chunk-DYTQHRUS.js → chunk-3FCHH4VP.js} +1 -1
- package/dist/cli/chunks/{chunk-EJ6MMYLK.js → chunk-3S5IIK32.js} +1 -1
- package/dist/cli/chunks/{chunk-NOHWJOBS.js → chunk-3X2JSW3R.js} +1 -1
- package/dist/cli/chunks/{chunk-7EZ2Z2CK.js → chunk-4HXFPBAA.js} +1 -1
- package/dist/cli/chunks/{chunk-XBYQ2BS4.js → chunk-4PY44TKH.js} +2 -2
- package/dist/cli/chunks/{chunk-5FSLMYAC.js → chunk-4RNCVSVN.js} +2 -2
- package/dist/cli/chunks/{chunk-X7ADKL7T.js → chunk-56M4QNXU.js} +2 -2
- package/dist/cli/chunks/{chunk-JHJUSSAU.js → chunk-5X4HDW5W.js} +2 -2
- package/dist/cli/chunks/{chunk-7MIOK72I.js → chunk-673XJBGW.js} +7 -7
- package/dist/cli/chunks/{chunk-77QZHIVX.js → chunk-6F7MFHTY.js} +2 -2
- package/dist/cli/chunks/{chunk-Q6NTEICT.js → chunk-6GJWT2OY.js} +2 -2
- package/dist/cli/chunks/{chunk-GV4DYPJP.js → chunk-6GNWVPMR.js} +2 -2
- package/dist/cli/chunks/{chunk-V5AK56DA.js → chunk-6VTC3OHD.js} +2 -2
- package/dist/cli/chunks/{chunk-MM56VPNE.js → chunk-775WGWLL.js} +3 -3
- package/dist/cli/chunks/{chunk-A3DK3XNZ.js → chunk-77WL5HQW.js} +1 -1
- package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
- package/dist/cli/chunks/{chunk-RC2A4JZ5.js → chunk-7TNCEVWX.js} +2 -2
- package/dist/cli/chunks/{chunk-XL5KIYE3.js → chunk-7X3LMTRA.js} +2 -2
- package/dist/cli/chunks/{chunk-VW6FRMLW.js → chunk-A53MMSGC.js} +2 -2
- package/dist/cli/chunks/{chunk-UFSVUBTR.js → chunk-A5CLVZC3.js} +2 -2
- package/dist/cli/chunks/{chunk-4INST4ZL.js → chunk-AEYJ4ZLA.js} +1 -1
- package/dist/cli/chunks/{chunk-5U6N4V5M.js → chunk-AJ5PCJQ2.js} +4 -4
- package/dist/cli/chunks/{chunk-OAZX6WFU.js → chunk-AJMAKUS3.js} +2 -2
- package/dist/cli/chunks/{chunk-74IOEOMH.js → chunk-AOD2ES44.js} +2 -2
- package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
- package/dist/cli/chunks/{chunk-PYKY22GC.js → chunk-AUFV2G2J.js} +5 -5
- package/dist/cli/chunks/{chunk-KD2BLA5Y.js → chunk-B2QKBQYD.js} +1 -1
- package/dist/cli/chunks/{chunk-6EGS77BB.js → chunk-BCCSV3RH.js} +1 -1
- package/dist/cli/chunks/{chunk-JOZ47MV6.js → chunk-BFIXUKOR.js} +1 -1
- package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
- package/dist/cli/chunks/{chunk-OIDWDGLG.js → chunk-BITFGVZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-ONR2NXXD.js → chunk-BL6273KR.js} +3 -3
- package/dist/cli/chunks/{chunk-BLG7SH4A.js → chunk-BOIUENWW.js} +1 -1
- package/dist/cli/chunks/{chunk-T77GZF4B.js → chunk-BT3MI2BW.js} +1 -1
- package/dist/cli/chunks/{chunk-UYUJT6QO.js → chunk-BTBJ2NLH.js} +2 -2
- package/dist/cli/chunks/{chunk-YMW57PEL.js → chunk-BUVJIVFG.js} +1 -1
- package/dist/cli/chunks/{chunk-QUORH2MG.js → chunk-BZIPW2PA.js} +8 -8
- package/dist/cli/chunks/{chunk-GVVFTFMB.js → chunk-C647D42G.js} +2 -2
- package/dist/cli/chunks/{chunk-AJUBT4NP.js → chunk-CBWM5NOO.js} +3 -3
- package/dist/cli/chunks/{chunk-F2OPFVQH.js → chunk-CIEXUYY7.js} +1 -1
- package/dist/cli/chunks/{chunk-QGOWNVVG.js → chunk-CLUHGBLN.js} +4 -4
- package/dist/cli/chunks/{chunk-WOV6XI3A.js → chunk-CQEWL32R.js} +1 -1
- package/dist/cli/chunks/{chunk-3QJU4Q4R.js → chunk-CXUC7YKA.js} +2 -2
- package/dist/cli/chunks/{chunk-HZY42OVU.js → chunk-D2Y36V5J.js} +2 -2
- package/dist/cli/chunks/{chunk-WF6UISKW.js → chunk-DSJJHPPS.js} +4 -4
- package/dist/cli/chunks/{chunk-FYPX5WBJ.js → chunk-DZHXCOSK.js} +1 -1
- package/dist/cli/chunks/{chunk-TXSPBLBT.js → chunk-EBV3WFIR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y6AKKQIQ.js → chunk-EKO5QL2B.js} +1 -1
- package/dist/cli/chunks/{chunk-MZB2UV2O.js → chunk-EMOZ5O5S.js} +1 -1
- package/dist/cli/chunks/{chunk-23CX7JNL.js → chunk-ES7TAJRJ.js} +2 -2
- package/dist/cli/chunks/{chunk-Z4Q5PCRZ.js → chunk-EXQGHTPD.js} +4 -4
- package/dist/cli/chunks/{chunk-A2VUCUTT.js → chunk-F2WAB4WK.js} +2 -2
- package/dist/cli/chunks/{chunk-CQNMGK6Y.js → chunk-F57FTFWS.js} +2 -2
- package/dist/cli/chunks/{chunk-OEPNNLR4.js → chunk-F6JJNBE5.js} +1 -1
- package/dist/cli/chunks/{chunk-UBJG3IHT.js → chunk-FRC7AFB4.js} +2 -2
- package/dist/cli/chunks/{chunk-2G63VIJE.js → chunk-G36RZF2Y.js} +1 -1
- package/dist/cli/chunks/{chunk-YRHTQZU4.js → chunk-G3C7Z6FO.js} +2 -2
- package/dist/cli/chunks/{chunk-B4I43GE2.js → chunk-GA63ESNT.js} +2 -2
- package/dist/cli/chunks/{chunk-7QYOTUOX.js → chunk-GHMJFICO.js} +2 -2
- package/dist/cli/chunks/{chunk-HYOPJHHW.js → chunk-GK5WLUX3.js} +1 -1
- package/dist/cli/chunks/{chunk-A5MA7A23.js → chunk-GQJ4QDEN.js} +6 -6
- package/dist/cli/chunks/{chunk-UA7TDVL7.js → chunk-GVLRE3BV.js} +4 -4
- package/dist/cli/chunks/{chunk-25P6JA6V.js → chunk-H5UH234L.js} +1 -1
- package/dist/cli/chunks/{chunk-BE4KALTE.js → chunk-HBAFXWSO.js} +1 -1
- package/dist/cli/chunks/{chunk-EGOIIUBD.js → chunk-HE3BDBAO.js} +2 -2
- package/dist/cli/chunks/{chunk-P2UPYSDJ.js → chunk-HHANMCD2.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUOVNFXK.js → chunk-HPVYJ6JH.js} +2 -2
- package/dist/cli/chunks/{chunk-RKI3IQKQ.js → chunk-I6NZFBT3.js} +3 -3
- package/dist/cli/chunks/{chunk-QVH5Y7AP.js → chunk-ISBOHF6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-IWFFO6VT.js → chunk-J24AJEDE.js} +2 -2
- package/dist/cli/chunks/{chunk-5GFKTJ65.js → chunk-J5HTQHJK.js} +2 -2
- package/dist/cli/chunks/{chunk-LY7MFGBD.js → chunk-JDOVO4E4.js} +150 -149
- package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
- package/dist/cli/chunks/{chunk-HXXHMLJ5.js → chunk-JRK5GX56.js} +1 -1
- package/dist/cli/chunks/{chunk-36VKMAMN.js → chunk-JRLZ7LZ3.js} +2 -2
- package/dist/cli/chunks/{chunk-6PJPQGF4.js → chunk-JTOFLDU7.js} +2 -2
- package/dist/cli/chunks/{chunk-CVOQ6ESD.js → chunk-K6EOHGKS.js} +2 -2
- package/dist/cli/chunks/{chunk-LU2EDWQK.js → chunk-KKXH25IH.js} +2 -2
- package/dist/cli/chunks/{chunk-EYXE2XKP.js → chunk-KNSQWM2E.js} +2 -2
- package/dist/cli/chunks/{chunk-IEJ7ZV3M.js → chunk-L5T32SRF.js} +1 -1
- package/dist/cli/chunks/{chunk-BEFTQVEW.js → chunk-LKFBW2QM.js} +2 -2
- package/dist/cli/chunks/{chunk-C3FXFU2T.js → chunk-LMAI74EP.js} +1 -1
- package/dist/cli/chunks/{chunk-P7XSPP5D.js → chunk-LQVS5IWH.js} +2 -2
- package/dist/cli/chunks/{chunk-4EKV7PHB.js → chunk-LRGTPUJA.js} +2 -2
- package/dist/cli/chunks/{chunk-MT7UNBZ7.js → chunk-LTHV4PIG.js} +2 -2
- package/dist/cli/chunks/{chunk-B2YGVSOP.js → chunk-M7QKCHLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-H5RQPO3X.js → chunk-N3ASALOL.js} +2 -2
- package/dist/cli/chunks/{chunk-MQZ53OR3.js → chunk-NEXBTLN6.js} +2 -2
- package/dist/cli/chunks/{chunk-BD7FEUN3.js → chunk-NJEEKYEP.js} +3 -3
- package/dist/cli/chunks/{chunk-UOI6ULCH.js → chunk-NWUFTLSF.js} +2 -2
- package/dist/cli/chunks/{chunk-RT6O2HW2.js → chunk-O4QB2GFL.js} +2 -2
- package/dist/cli/chunks/{chunk-MZMG6CUJ.js → chunk-OA75C4HY.js} +2 -2
- package/dist/cli/chunks/{chunk-HYFQUWNB.js → chunk-OVMG6EEF.js} +2 -2
- package/dist/cli/chunks/{chunk-FSSR6WBE.js → chunk-OX7MJFLC.js} +2 -2
- package/dist/cli/chunks/{chunk-ENK44A6Q.js → chunk-OZJQN7YE.js} +2 -2
- package/dist/cli/chunks/{chunk-LXZMP3VX.js → chunk-PFXCRRR6.js} +25 -25
- package/dist/cli/chunks/{chunk-WIH522AP.js → chunk-PVJLQ2YZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZUB5YOCM.js → chunk-QDRFLM77.js} +2 -2
- package/dist/cli/chunks/{chunk-NHUGHAY6.js → chunk-QH7C4PTX.js} +1 -1
- package/dist/cli/chunks/{chunk-VXKWNRGA.js → chunk-QKM4XT2F.js} +2 -2
- package/dist/cli/chunks/{chunk-ON2UTP2U.js → chunk-QP7EKLWU.js} +2 -2
- package/dist/cli/chunks/{chunk-KUHLTVWC.js → chunk-QPACHVDI.js} +1 -1
- package/dist/cli/chunks/{chunk-PCJQCEBA.js → chunk-QQVE65ER.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3NSU24F.js → chunk-QYCZYJH7.js} +2 -2
- package/dist/cli/chunks/{chunk-AEUEMVJK.js → chunk-R6I5I724.js} +2 -2
- package/dist/cli/chunks/{chunk-5D7ZFWDS.js → chunk-RJJIPTVH.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWEKAEEV.js → chunk-RM6OC35G.js} +1 -1
- package/dist/cli/chunks/{chunk-ZELWDJXT.js → chunk-RTD4U7IW.js} +2 -2
- package/dist/cli/chunks/{chunk-O5V7RHVG.js → chunk-SKJQKOFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-6RD44SCE.js → chunk-SMBGK7XI.js} +1 -1
- package/dist/cli/chunks/{chunk-ND4QTZOL.js → chunk-SPS472C5.js} +2 -2
- package/dist/cli/chunks/{chunk-TFK2AYIN.js → chunk-SUNXA2UR.js} +2 -2
- package/dist/cli/chunks/{chunk-RDGPXENG.js → chunk-SVP3BP52.js} +2 -2
- package/dist/cli/chunks/{chunk-NBLDBVAW.js → chunk-T4WQPE77.js} +1 -1
- package/dist/cli/chunks/{chunk-ZS4XVJGV.js → chunk-T53ZN4NO.js} +2 -2
- package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
- package/dist/cli/chunks/{chunk-JZT7BU44.js → chunk-T7YCNOW5.js} +2 -2
- package/dist/cli/chunks/{chunk-EADSQN5T.js → chunk-TCQWVVSR.js} +1 -1
- package/dist/cli/chunks/{chunk-XYLQZWF6.js → chunk-TGRHO4ES.js} +2 -2
- package/dist/cli/chunks/{chunk-QPLSYEWJ.js → chunk-TP7L4EX6.js} +2 -2
- package/dist/cli/chunks/{chunk-N5XOXPHZ.js → chunk-TT45RCLN.js} +2 -2
- package/dist/cli/chunks/{chunk-OZGIOKEA.js → chunk-TUZNWRYC.js} +1 -1
- package/dist/cli/chunks/{chunk-53BXTTRO.js → chunk-U2QTL5T2.js} +3 -3
- package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
- package/dist/cli/chunks/{chunk-SRPLERER.js → chunk-UHLZKH6B.js} +4 -4
- package/dist/cli/chunks/{chunk-HPWWYT67.js → chunk-UIWXKRTK.js} +2 -2
- package/dist/cli/chunks/{chunk-XWYELBZS.js → chunk-UNFE4RPV.js} +1 -1
- package/dist/cli/chunks/{chunk-FW4DJ4FJ.js → chunk-UQGIC5OX.js} +1 -1
- package/dist/cli/chunks/{chunk-GLGKQX2V.js → chunk-VAXTPLO3.js} +2 -2
- package/dist/cli/chunks/{chunk-VYDVI6FZ.js → chunk-VCSNNLWL.js} +2 -2
- package/dist/cli/chunks/{chunk-J7AQZLIH.js → chunk-VSPNIDQK.js} +4 -4
- package/dist/cli/chunks/{chunk-EIGRV3J6.js → chunk-VV2JVYOI.js} +2 -2
- package/dist/cli/chunks/{chunk-CBONQM5D.js → chunk-VW7AXJQS.js} +2 -2
- package/dist/cli/chunks/{chunk-O6MO5KMR.js → chunk-W7JUD4EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-QFETNCNN.js → chunk-WFKE7NZ5.js} +2 -2
- package/dist/cli/chunks/{chunk-ROVZSZCS.js → chunk-WVEHKAIH.js} +3 -3
- package/dist/cli/chunks/{chunk-YO4ESCB4.js → chunk-XAESN54Q.js} +1 -1
- package/dist/cli/chunks/{chunk-RKUAWQOF.js → chunk-XECZYQT5.js} +2 -2
- package/dist/cli/chunks/{chunk-RLW25X66.js → chunk-XFT4FYTC.js} +2 -2
- package/dist/cli/chunks/{chunk-SM2YJ2AL.js → chunk-YHX74M7C.js} +2 -2
- package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
- package/dist/cli/chunks/{chunk-IAENZ2DR.js → chunk-Z5UZOYQS.js} +2 -2
- package/dist/cli/chunks/{chunk-G367W7XR.js → chunk-Z6G3QVZ4.js} +12 -12
- package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
- package/dist/cli/chunks/{ci-output-RLS32FUY.js → ci-output-UO5BDFU4.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-MRCC7WCM.js → circuit-breaker-UQDPXYRD.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-LIZCEKDF.js → claude-flow-setup-62QES3QX.js} +2 -2
- package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
- package/dist/cli/chunks/{cline-installer-T7H6R2RC.js → cline-installer-X7VZTSZG.js} +2 -2
- package/dist/cli/chunks/{code-XMBLI7OF.js → code-H3BF4L4H.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-QS7BYLEX.js → code-index-extractor-BJGFZGGL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-6PGT5FM6.js → codex-installer-KVZWKU6S.js} +2 -2
- package/dist/cli/chunks/{completions-2A3WRXY2.js → completions-YMILE6V7.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-23HOOGJ7.js → complexity-analyzer-J26N2PWG.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-4FSF7B3N.js → continuedev-installer-MAR42OV7.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-A5GRQQUU.js → copilot-installer-CVOJF6OT.js} +2 -2
- package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
- package/dist/cli/chunks/{cost-tracker-Z4STQ5VB.js → cost-tracker-SXLWXE55.js} +2 -2
- package/dist/cli/chunks/{coverage-NUPP6KZZ.js → coverage-D7HCHFP3.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
- package/dist/cli/chunks/{cursor-installer-FVJ7ROPJ.js → cursor-installer-X37VHIKW.js} +2 -2
- package/dist/cli/chunks/{daemon-D662EX5N.js → daemon-JN7SOH6F.js} +4 -4
- package/dist/cli/chunks/{daemon-7ZZA2MMN.js → daemon-LIW47IDM.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-IB4TQ2KA.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
- package/dist/cli/chunks/{detect-LGLBZN4I.js → detect-WRFCWAX5.js} +2 -2
- package/dist/cli/chunks/{dist-node-Z3OL42YE.js → dist-node-6FWT4XZO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-L3CLNL7U.js → domain-handler-SNFPNMRT.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-GQ3V5X6L.js → domain-plugins-MXKHH62P.js} +2 -2
- package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
- package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-UGD6USYH.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
- package/dist/cli/chunks/{eval-3B7UIYGY.js → eval-AMUXTMJB.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-3RQ4NYY3.js → experience-capture-middleware-3D65TR2C.js} +4 -4
- package/dist/cli/chunks/{fast-paths-QOSAEPYD.js → fast-paths-Y7BBMM56.js} +2 -2
- package/dist/cli/chunks/{feature-flags-TLF4NKOH.js → feature-flags-JMQQ7JW4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-3S5TH6P4.js → feature-flags-VESRRQ6V.js} +2 -2
- package/dist/cli/chunks/{file-discovery-AEVMJRNB.js → file-discovery-JJKQQUV6.js} +2 -2
- package/dist/cli/chunks/{fleet-E6WTXWFL.js → fleet-WIGHICJF.js} +4 -4
- package/dist/cli/chunks/{gnn-wrapper-MCKH3AUU.js → gnn-wrapper-BFNPETTT.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-U7XENHRR.js → heartbeat-handler-HDXKTGUI.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
- package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-5GW4SAEI.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-7BLZBK5T.js → hnswlib-node-LKV2H47B.js} +2 -2
- package/dist/cli/chunks/{hooks-F3O2SB6H.js → hooks-KDSFYQQG.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-PV4EKXHB.js → hypergraph-engine-GDLPEPUC.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-VOWO5ZTW.js → hypergraph-handler-4UMFA2EW.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
- package/dist/cli/chunks/{init-handler-ENJ5ONJX.js → init-handler-4GCHPQHD.js} +6 -6
- package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
- package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-HNNJOOPE.js → kilocode-installer-HJZMT2G5.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-UZBIQ3IC.js → kiro-installer-WUPY67HG.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
- package/dist/cli/chunks/{learning-YMLCVFUT.js → learning-AXKIS7IG.js} +4 -4
- package/dist/cli/chunks/{llm-router-YWTARCCT.js → llm-router-HUDPNZLJ.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
- package/dist/cli/chunks/{load-DKE3F3IP.js → load-RM44POD7.js} +2 -2
- package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
- package/dist/cli/chunks/{mcp-5PSGIUCW.js → mcp-5JVQRBOP.js} +2 -2
- package/dist/cli/chunks/{memory-3L3O6JMM.js → memory-VGZ2V6PL.js} +5 -5
- package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
- package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-AEEO7IA4.js → multi-model-executor-WPRKCSCM.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-ABBO355U.js → opencode-installer-YAJMRCQO.js} +2 -2
- package/dist/cli/chunks/{orchestrator-E36Q7MKE.js → orchestrator-MUGWBUYP.js} +6 -6
- package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-H4XKSID4.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
- package/dist/cli/chunks/{pipeline-BGFEHXIN.js → pipeline-F4DXDUDC.js} +2 -2
- package/dist/cli/chunks/{platform-GK7ZVDJI.js → platform-HI3A3OWF.js} +2 -2
- package/dist/cli/chunks/{plugin-CAH2CKI6.js → plugin-XRITPTR7.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-M5EYRONA.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
- package/dist/cli/chunks/{project-root-BSNZC243.js → project-root-2VN4WO2A.js} +2 -2
- package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JDSSC2SF.js → protocol-handler-ZEVHSEBG.js} +2 -2
- package/dist/cli/chunks/{prove-ANPTOZJE.js → prove-C4BLZWBS.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
- package/dist/cli/chunks/{quality-SXWGYRQR.js → quality-M3DTE4KK.js} +2 -2
- package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
- package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
- package/dist/cli/chunks/{real-embeddings-WSRYAOZM.js → real-embeddings-YWSE3IRT.js} +2 -2
- package/dist/cli/chunks/{ref-validation-AZ3LRWEK.js → ref-validation-ZWOTFA3T.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-2QKGFIEU.js → roocode-installer-GJBIWETD.js} +2 -2
- package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
- package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
- package/dist/cli/chunks/{routing-handler-UYDC5MMD.js → routing-handler-CFYLGNAR.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-QXADPVEY.js → ruvector-commands-EDKG456B.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-GD4NBFKT.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-7SXG66IL.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
- package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
- package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
- package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
- package/dist/cli/chunks/{security-YKB622PK.js → security-ZU2GW3ZM.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-KMLAV7JK.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-OYY27DFV.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
- package/dist/cli/chunks/{standalone-memory-2DOABVLC.js → standalone-memory-3UXDZ7HI.js} +2 -2
- package/dist/cli/chunks/{status-handler-EXRKETV7.js → status-handler-264CHTWS.js} +2 -2
- package/dist/cli/chunks/{structural-health-2SKK6DU6.js → structural-health-E2QPUOZE.js} +2 -2
- package/dist/cli/chunks/{sync-UW7SX7GO.js → sync-2ACMWM7D.js} +2 -2
- package/dist/cli/chunks/{sync-DQ2YUNI6.js → sync-N2L2OST4.js} +2 -2
- package/dist/cli/chunks/{task-handler-LYQ6WYUY.js → task-handler-IB5CVOTY.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DIJO232S.js → task-handlers-QBMYNJHE.js} +3 -3
- package/dist/cli/chunks/{test-WRHZMUCW.js → test-7RGLRDSP.js} +6 -6
- package/dist/cli/chunks/{test-scheduling-HI23RXFK.js → test-scheduling-RJABJT2W.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-23SA6SWZ.js → token-bootstrap-JVHMHB72.js} +2 -2
- package/dist/cli/chunks/{token-usage-M7RRDPXO.js → token-usage-3ECHQVCY.js} +2 -2
- package/dist/cli/chunks/{transformers-4TC35KKS.js → transformers-KJH3IJWI.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-F4LTKAWD.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
- package/dist/cli/chunks/{types-NBXV6LXQ.js → types-5BAPXOLS.js} +2 -2
- package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
- package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
- package/dist/cli/chunks/{upgrade-4BGOU5RM.js → upgrade-S5NFQZID.js} +2 -2
- package/dist/cli/chunks/{validate-EDWAR63H.js → validate-BIBWOLJD.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-VI72CPR7.js → validate-swarm-WAA3LBHH.js} +2 -2
- package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-Y5XBRQXF.js → web-tree-sitter-OTBQTHAV.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-VEX23WAF.js → windsurf-installer-NNQ22EW6.js} +2 -2
- package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
- package/dist/cli/chunks/{witness-chain-3YNL6YGY.js → witness-chain-E7MUBOJW.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-MJZGZRWT.js → witness-chain-repair-FW4QSN4C.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-TTJYXTBE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-EM6YXYOY.js → witness-key-manager-4CGRNDMJ.js} +2 -2
- package/dist/cli/chunks/{workflow-2RBDOM7V.js → workflow-4VRSTRAN.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
- package/dist/cli/chunks/{wrappers-5OTAVVOV.js → wrappers-4M4UTGEU.js} +2 -2
- package/dist/cli/commands/ci.js +17 -6
- package/dist/cli/commands/quality-gate.js +6 -1
- package/dist/cli/index.js +7 -2
- package/dist/cli/process-store-cleanup.d.ts +7 -0
- package/dist/cli/process-store-cleanup.js +27 -0
- package/dist/cli/utils/ci-config.d.ts +3 -3
- package/dist/cli/utils/ci-config.js +202 -68
- package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
- package/dist/domains/quality-assessment/quality-evidence.js +7 -2
- package/dist/domains/test-execution/services/retry-handler.js +32 -13
- package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
- package/dist/domains/test-execution/services/test-executor.js +66 -22
- package/dist/init/fleet-integration.js +3 -2
- package/dist/init/init-wizard-steps.js +3 -2
- package/dist/init/phases/06-code-intelligence.js +6 -4
- package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
- package/dist/integrations/ruvector/sona-persistence.js +74 -20
- package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
- package/dist/integrations/ruvector/sona-wrapper.js +13 -0
- package/dist/kernel/memory-backend.js +5 -4
- package/dist/kernel/unified-memory.js +3 -2
- package/dist/learning/aqe-learning-engine.js +3 -2
- package/dist/mcp/bundle.js +440 -439
- package/dist/mcp/connection-pool.d.ts +2 -0
- package/dist/mcp/connection-pool.js +13 -2
- package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
- package/dist/mcp/handlers/memory-handlers.js +16 -6
- package/dist/mcp/protocol-server.js +29 -8
- package/dist/mcp/types.d.ts +2 -0
- package/dist/optimization/session-cache.js +13 -11
- package/dist/plugins/cache.js +10 -3
- package/dist/shared/embeddings/embedding-cache.js +4 -4
- package/dist/shared/llm/cache.js +7 -10
- package/dist/shared/retry-engine.js +4 -0
- package/dist/shared/test-runner-process.d.ts +10 -0
- package/dist/shared/test-runner-process.js +210 -0
- package/dist/validation/quality-verdict.js +3 -2
- package/dist/workers/quality-daemon/priority-queue.js +4 -1
- package/package.json +4 -4
- package/dist/cli/chunks/adapter-TVQKH65T.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +0 -2
- package/dist/cli/chunks/base-W42BURDL.js +0 -2
- package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +0 -2
- package/dist/cli/chunks/chunk-2IMSJ7IO.js +0 -2
- package/dist/cli/chunks/chunk-FBZC4IGB.js +0 -2
- package/dist/cli/chunks/chunk-MNQN7UZX.js +0 -4
- package/dist/cli/chunks/chunk-OXHF3L2T.js +0 -2
- package/dist/cli/chunks/chunk-PELENDDQ.js +0 -2
- package/dist/cli/chunks/chunk-TW3SR4TS.js +0 -2
- package/dist/cli/chunks/chunk-V6RE4YRQ.js +0 -2
- package/dist/cli/chunks/chunk-ZQZD55MN.js +0 -3
- package/dist/cli/chunks/ci-J3TDK5RA.js +0 -81
- package/dist/cli/chunks/client-3BD2DI4N.js +0 -2
- package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +0 -2
- package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +0 -2
- package/dist/cli/chunks/domain-transfer-MFCI76IY.js +0 -2
- package/dist/cli/chunks/dream-FTP33IJB.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +0 -2
- package/dist/cli/chunks/hnsw-index-MS5KODD7.js +0 -2
- package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +0 -2
- package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +0 -2
- package/dist/cli/chunks/init-wizard-I5DFZUQL.js +0 -2
- package/dist/cli/chunks/kernel-MISPSPPA.js +0 -2
- package/dist/cli/chunks/knowledge-graph-L26JESGE.js +0 -2
- package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +0 -2
- package/dist/cli/chunks/load-test-H5ISNNM5.js +0 -2
- package/dist/cli/chunks/memory-backend-HWDNOBKW.js +0 -2
- package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +0 -2
- package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +0 -2
- package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +0 -2
- package/dist/cli/chunks/quality-gate-GYNCA4ZY.js +0 -7
- package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +0 -2
- package/dist/cli/chunks/router-MTP5LH4H.js +0 -2
- package/dist/cli/chunks/routing-feedback-GWETVB4L.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +0 -2
- package/dist/cli/chunks/safe-db-FWWGAPVE.js +0 -2
- package/dist/cli/chunks/schedule-TPA4V4D5.js +0 -2
- package/dist/cli/chunks/scheduler-5ZTEPNDD.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +0 -2
- package/dist/cli/chunks/unified-memory-OVFEPRPS.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +0 -2
- package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +0 -2
- package/dist/cli/chunks/visual-security-2FUM5GLI.js +0 -2
- package/dist/cli/chunks/witness-chain-MH6GA5L6.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-H6G65YKU.js +0 -2
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
8
9
|
import { join } from 'node:path';
|
|
9
10
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
11
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -16,6 +17,7 @@ import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.
|
|
|
16
17
|
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
17
18
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
18
19
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
20
|
+
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
19
21
|
const DEFAULT_CONFIG = {
|
|
20
22
|
simulateForTesting: false,
|
|
21
23
|
simulatedTestsPerFile: 5,
|
|
@@ -368,19 +370,29 @@ Provide:
|
|
|
368
370
|
return err(new Error(`Test file not found: ${missingFile}`));
|
|
369
371
|
}
|
|
370
372
|
// Build command based on framework
|
|
371
|
-
const { command, args, report } = this.buildTestCommand(files, framework);
|
|
373
|
+
const { command, args, report, coverageDirectory } = this.buildTestCommand(files, framework);
|
|
372
374
|
const fileLabel = files.join(', ');
|
|
373
375
|
return new Promise((resolve) => {
|
|
374
376
|
let stdout = '';
|
|
375
377
|
let stderr = '';
|
|
376
378
|
let killed = false;
|
|
379
|
+
let termination;
|
|
377
380
|
let settled = false;
|
|
381
|
+
const cleanupArtifacts = () => {
|
|
382
|
+
report?.cleanup();
|
|
383
|
+
if (coverageDirectory) {
|
|
384
|
+
try {
|
|
385
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
386
|
+
}
|
|
387
|
+
catch { /* Best effort. */ }
|
|
388
|
+
}
|
|
389
|
+
};
|
|
378
390
|
const finish = (result, cleanup = true) => {
|
|
379
391
|
if (settled)
|
|
380
392
|
return;
|
|
381
393
|
settled = true;
|
|
382
394
|
if (cleanup)
|
|
383
|
-
|
|
395
|
+
cleanupArtifacts();
|
|
384
396
|
resolve(result);
|
|
385
397
|
};
|
|
386
398
|
// Spawn the test runner process
|
|
@@ -390,6 +402,7 @@ Provide:
|
|
|
390
402
|
try {
|
|
391
403
|
proc = spawn(command, args, {
|
|
392
404
|
cwd: process.cwd(),
|
|
405
|
+
detached: process.platform !== 'win32',
|
|
393
406
|
env: {
|
|
394
407
|
...process.env,
|
|
395
408
|
FORCE_COLOR: '0', // Disable color codes for easier parsing
|
|
@@ -401,10 +414,15 @@ Provide:
|
|
|
401
414
|
finish(err(new Error(`Failed to spawn test runner: ${toErrorMessage(error)}. Is '${command}' installed?`)));
|
|
402
415
|
return;
|
|
403
416
|
}
|
|
417
|
+
const untrackExit = trackTestRunnerExit(proc);
|
|
404
418
|
// Set timeout
|
|
405
419
|
const timeoutId = setTimeout(() => {
|
|
406
420
|
killed = true;
|
|
407
|
-
proc
|
|
421
|
+
termination = terminateTestRunner(proc);
|
|
422
|
+
// Keep the timeout outcome immediate; cleanup waits for the owned
|
|
423
|
+
// group, rather than treating the root's close as descendant exit.
|
|
424
|
+
termination.catch(error => logger.warn(`Test runner cleanup failed: ${toErrorMessage(error)}`));
|
|
425
|
+
termination.then(untrackExit, () => undefined);
|
|
408
426
|
finish(err(new Error(`Test execution timed out after ${timeout}ms for files: ${fileLabel}`)), false);
|
|
409
427
|
}, timeout);
|
|
410
428
|
proc.stdout?.on('data', (data) => {
|
|
@@ -416,9 +434,12 @@ Provide:
|
|
|
416
434
|
proc.on('close', (code) => {
|
|
417
435
|
clearTimeout(timeoutId);
|
|
418
436
|
if (killed) {
|
|
419
|
-
|
|
420
|
-
|
|
437
|
+
// Coverage and JSON reports belong to this run; clean both only
|
|
438
|
+
// after the entire owned process group has stopped.
|
|
439
|
+
termination?.then(() => cleanupArtifacts(), () => undefined);
|
|
440
|
+
return; // The timeout result has already been returned.
|
|
421
441
|
}
|
|
442
|
+
untrackExit();
|
|
422
443
|
// Parse results based on framework. Vitest 5 writes the JSON report to
|
|
423
444
|
// a file instead of stdout, so read it back through the report handle.
|
|
424
445
|
let reportText;
|
|
@@ -434,10 +455,10 @@ Provide:
|
|
|
434
455
|
return;
|
|
435
456
|
}
|
|
436
457
|
const parseResult = this.parseTestOutput(reportText, stderr, fileLabel, framework, code);
|
|
437
|
-
//
|
|
438
|
-
//
|
|
439
|
-
if (parseResult.success && !parseResult.value.coverage &&
|
|
440
|
-
const diskCoverage = this.readCoverageFromDisk();
|
|
458
|
+
// Read only this invocation's coverage artifacts. A previous or
|
|
459
|
+
// concurrent run's project coverage directory is not evidence.
|
|
460
|
+
if (parseResult.success && !parseResult.value.coverage && coverageDirectory) {
|
|
461
|
+
const diskCoverage = this.readCoverageFromDisk(coverageDirectory);
|
|
441
462
|
if (diskCoverage) {
|
|
442
463
|
parseResult.value.coverage = diskCoverage.summary;
|
|
443
464
|
if (diskCoverage.perFile.length > 0) {
|
|
@@ -451,6 +472,7 @@ Provide:
|
|
|
451
472
|
clearTimeout(timeoutId);
|
|
452
473
|
if (killed)
|
|
453
474
|
return;
|
|
475
|
+
untrackExit();
|
|
454
476
|
finish(err(new Error(`Failed to spawn test runner: ${error.message}. Is '${command}' installed?`)));
|
|
455
477
|
});
|
|
456
478
|
});
|
|
@@ -460,22 +482,35 @@ Provide:
|
|
|
460
482
|
*/
|
|
461
483
|
buildTestCommand(fileOrFiles, framework) {
|
|
462
484
|
const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];
|
|
485
|
+
const createCoverageDirectory = () => mkdtempSync(join(tmpdir(), 'aqe-test-coverage-'));
|
|
463
486
|
switch (framework.toLowerCase()) {
|
|
464
487
|
case 'vitest': {
|
|
465
488
|
// --outputFile makes Vitest 4 and 5 both write the JSON report to a
|
|
466
489
|
// file we own; Vitest 5 no longer prints it to stdout.
|
|
467
|
-
const
|
|
490
|
+
const coverageDirectory = createCoverageDirectory();
|
|
491
|
+
let report;
|
|
492
|
+
try {
|
|
493
|
+
report = createVitestJsonReport();
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
497
|
+
throw error;
|
|
498
|
+
}
|
|
468
499
|
return {
|
|
469
500
|
command: 'npx',
|
|
470
|
-
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
|
|
501
|
+
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
|
|
471
502
|
report,
|
|
503
|
+
coverageDirectory,
|
|
472
504
|
};
|
|
473
505
|
}
|
|
474
|
-
case 'jest':
|
|
506
|
+
case 'jest': {
|
|
507
|
+
const coverageDirectory = createCoverageDirectory();
|
|
475
508
|
return {
|
|
476
509
|
command: 'npx',
|
|
477
|
-
args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults'],
|
|
510
|
+
args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults', `--coverageDirectory=${coverageDirectory}`],
|
|
511
|
+
coverageDirectory,
|
|
478
512
|
};
|
|
513
|
+
}
|
|
479
514
|
case 'mocha':
|
|
480
515
|
// Note: mocha has no built-in coverage — requires external nyc/c8 wrapper.
|
|
481
516
|
// Coverage data will be unavailable for mocha-based test runs.
|
|
@@ -491,11 +526,20 @@ Provide:
|
|
|
491
526
|
};
|
|
492
527
|
default: {
|
|
493
528
|
// Default to vitest
|
|
494
|
-
const
|
|
529
|
+
const coverageDirectory = createCoverageDirectory();
|
|
530
|
+
let report;
|
|
531
|
+
try {
|
|
532
|
+
report = createVitestJsonReport();
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
rmSync(coverageDirectory, { recursive: true, force: true });
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
495
538
|
return {
|
|
496
539
|
command: 'npx',
|
|
497
|
-
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args],
|
|
540
|
+
args: ['vitest', 'run', ...files, '--reporter=json', '--no-color', ...report.args, `--coverage.reportsDirectory=${coverageDirectory}`],
|
|
498
541
|
report,
|
|
542
|
+
coverageDirectory,
|
|
499
543
|
};
|
|
500
544
|
}
|
|
501
545
|
}
|
|
@@ -1003,16 +1047,16 @@ Provide:
|
|
|
1003
1047
|
return { perFile };
|
|
1004
1048
|
}
|
|
1005
1049
|
/**
|
|
1006
|
-
* Read coverage from
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1050
|
+
* Read coverage from the private output directory of a completed runner.
|
|
1051
|
+
* Setting the directory does not enable coverage; project configuration
|
|
1052
|
+
* still decides whether coverage is collected.
|
|
1009
1053
|
*/
|
|
1010
|
-
readCoverageFromDisk() {
|
|
1054
|
+
readCoverageFromDisk(coverageDirectory) {
|
|
1011
1055
|
try {
|
|
1012
1056
|
// Check common coverage output paths
|
|
1013
1057
|
const candidates = [
|
|
1014
|
-
join(
|
|
1015
|
-
join(
|
|
1058
|
+
join(coverageDirectory, 'coverage-summary.json'),
|
|
1059
|
+
join(coverageDirectory, 'coverage-final.json'),
|
|
1016
1060
|
];
|
|
1017
1061
|
for (const filePath of candidates) {
|
|
1018
1062
|
if (!existsSync(filePath))
|
|
@@ -122,12 +122,13 @@ export class FleetInitEnhancer {
|
|
|
122
122
|
enableVectorEmbeddings: true,
|
|
123
123
|
});
|
|
124
124
|
// Find all source files
|
|
125
|
-
const glob = await import('
|
|
126
|
-
const files = await glob
|
|
125
|
+
const { glob } = await import('tinyglobby');
|
|
126
|
+
const files = await glob([
|
|
127
127
|
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
128
128
|
], {
|
|
129
129
|
cwd: this.projectRoot,
|
|
130
130
|
ignore: ['node_modules/**', 'dist/**', 'coverage/**', '.agentic-qe/**'],
|
|
131
|
+
expandDirectories: false,
|
|
131
132
|
});
|
|
132
133
|
console.log(chalk.gray(` Indexing ${files.length} files...`));
|
|
133
134
|
// Index files
|
|
@@ -200,12 +200,13 @@ export async function runCodeIntelligenceScan(projectPath) {
|
|
|
200
200
|
namespace: 'code-intelligence:kg',
|
|
201
201
|
enableVectorEmbeddings: true,
|
|
202
202
|
});
|
|
203
|
-
const glob = await import('
|
|
204
|
-
const files = await glob
|
|
203
|
+
const { glob } = await import('tinyglobby');
|
|
204
|
+
const files = await glob([
|
|
205
205
|
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
206
206
|
], {
|
|
207
207
|
cwd: projectPath,
|
|
208
208
|
ignore: ['node_modules/**', 'dist/**', 'coverage/**', '.agentic-qe/**'],
|
|
209
|
+
expandDirectories: false,
|
|
209
210
|
});
|
|
210
211
|
const result = await kgService.index({
|
|
211
212
|
paths: files.map(f => join(projectPath, f)),
|
|
@@ -230,12 +230,13 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
230
230
|
filesToIndex = changedFiles;
|
|
231
231
|
}
|
|
232
232
|
else {
|
|
233
|
-
const glob = await import('
|
|
234
|
-
const files = await glob
|
|
233
|
+
const { glob } = await import('tinyglobby');
|
|
234
|
+
const files = await glob([
|
|
235
235
|
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
236
236
|
], {
|
|
237
237
|
cwd: projectRoot,
|
|
238
238
|
ignore: SCAN_IGNORE_PATTERNS,
|
|
239
|
+
expandDirectories: false,
|
|
239
240
|
});
|
|
240
241
|
filesToIndex = files.map(f => join(projectRoot, f));
|
|
241
242
|
}
|
|
@@ -439,12 +440,13 @@ export class CodeIntelligencePhase extends BasePhase {
|
|
|
439
440
|
* Find files modified since the given date
|
|
440
441
|
*/
|
|
441
442
|
async findChangedFiles(projectRoot, since) {
|
|
442
|
-
const glob = await import('
|
|
443
|
-
const files = await glob
|
|
443
|
+
const { glob } = await import('tinyglobby');
|
|
444
|
+
const files = await glob([
|
|
444
445
|
'**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'
|
|
445
446
|
], {
|
|
446
447
|
cwd: projectRoot,
|
|
447
448
|
ignore: SCAN_IGNORE_PATTERNS,
|
|
449
|
+
expandDirectories: false,
|
|
448
450
|
});
|
|
449
451
|
const sinceMs = since.getTime();
|
|
450
452
|
const changed = [];
|
|
@@ -112,6 +112,7 @@ export class PersistentSONAEngine {
|
|
|
112
112
|
initPromise = null;
|
|
113
113
|
pendingSaves = new Map();
|
|
114
114
|
saveTimer = null;
|
|
115
|
+
consecutiveSaveFailures = 0;
|
|
115
116
|
serverClient = null;
|
|
116
117
|
constructor(config) {
|
|
117
118
|
this.config = {
|
|
@@ -270,8 +271,6 @@ export class PersistentSONAEngine {
|
|
|
270
271
|
ON CONFLICT(id) DO UPDATE SET
|
|
271
272
|
confidence = excluded.confidence,
|
|
272
273
|
usage_count = excluded.usage_count,
|
|
273
|
-
success_count = excluded.success_count,
|
|
274
|
-
failure_count = excluded.failure_count,
|
|
275
274
|
metadata = excluded.metadata,
|
|
276
275
|
updated_at = datetime('now'),
|
|
277
276
|
last_used_at = excluded.last_used_at
|
|
@@ -288,6 +287,8 @@ export class PersistentSONAEngine {
|
|
|
288
287
|
SET confidence = ?,
|
|
289
288
|
success_count = success_count + ?,
|
|
290
289
|
failure_count = failure_count + ?,
|
|
290
|
+
usage_count = usage_count + 1,
|
|
291
|
+
last_used_at = datetime('now'),
|
|
291
292
|
updated_at = datetime('now')
|
|
292
293
|
WHERE id = ?
|
|
293
294
|
`));
|
|
@@ -432,6 +433,13 @@ export class PersistentSONAEngine {
|
|
|
432
433
|
// Get updated pattern and persist confidence change
|
|
433
434
|
const pattern = this.getPattern(patternId);
|
|
434
435
|
if (pattern) {
|
|
436
|
+
// Feedback needs a durable row before incrementing its counters.
|
|
437
|
+
// Remove the queued snapshot only after its write succeeds.
|
|
438
|
+
const pending = this.pendingSaves.get(patternId);
|
|
439
|
+
if (pending) {
|
|
440
|
+
this.savePatternToDb(pending);
|
|
441
|
+
this.pendingSaves.delete(patternId);
|
|
442
|
+
}
|
|
435
443
|
this.persistPatternConfidenceUpdate(patternId, pattern.confidence, success ? 1 : 0, success ? 0 : 1);
|
|
436
444
|
}
|
|
437
445
|
}
|
|
@@ -548,19 +556,27 @@ export class PersistentSONAEngine {
|
|
|
548
556
|
if (!stmt)
|
|
549
557
|
throw new Error('Statement not prepared');
|
|
550
558
|
const result = stmt.run(patternId);
|
|
551
|
-
|
|
559
|
+
// Delete queued writes too: otherwise the next batch or sync restores it.
|
|
560
|
+
const pending = this.pendingSaves.delete(patternId);
|
|
561
|
+
const cached = this.baseEngine.deletePattern(patternId);
|
|
562
|
+
return result.changes > 0 || pending || cached;
|
|
552
563
|
}
|
|
553
564
|
/**
|
|
554
565
|
* Clear all patterns for this domain
|
|
555
566
|
*/
|
|
556
567
|
clearDomainPatterns() {
|
|
557
568
|
this.ensureInitialized();
|
|
558
|
-
//
|
|
559
|
-
this.baseEngine.clear();
|
|
560
|
-
// Clear in SQLite for this domain
|
|
569
|
+
// Finish the durable delete first so a failed statement preserves memory.
|
|
561
570
|
const stmt = this.prepared.get('deleteByDomain');
|
|
562
|
-
if (stmt)
|
|
563
|
-
|
|
571
|
+
if (!stmt)
|
|
572
|
+
throw new Error('Statement not prepared');
|
|
573
|
+
stmt.run(this.config.domain);
|
|
574
|
+
for (const pattern of this.baseEngine.getPatternsByDomain(this.config.domain)) {
|
|
575
|
+
this.baseEngine.deletePattern(pattern.id);
|
|
576
|
+
}
|
|
577
|
+
for (const [id, pattern] of this.pendingSaves) {
|
|
578
|
+
if (pattern.domain === this.config.domain)
|
|
579
|
+
this.pendingSaves.delete(id);
|
|
564
580
|
}
|
|
565
581
|
}
|
|
566
582
|
/**
|
|
@@ -791,10 +807,19 @@ export class PersistentSONAEngine {
|
|
|
791
807
|
this.saveTimer = null;
|
|
792
808
|
}
|
|
793
809
|
if (this.pendingSaves.size > 0) {
|
|
810
|
+
const failures = [];
|
|
794
811
|
for (const pattern of this.pendingSaves.values()) {
|
|
795
|
-
|
|
812
|
+
try {
|
|
813
|
+
this.savePatternToDb(pattern);
|
|
814
|
+
this.pendingSaves.delete(pattern.id);
|
|
815
|
+
}
|
|
816
|
+
catch (error) {
|
|
817
|
+
failures.push(new Error(toErrorMessage(error)));
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
if (failures.length > 0) {
|
|
821
|
+
throw new AggregateError(failures, `Deferred SONA saves failed: ${failures.map(error => error.message).join('; ')}`);
|
|
796
822
|
}
|
|
797
|
-
this.pendingSaves.clear();
|
|
798
823
|
}
|
|
799
824
|
// A10 fix: checkpoint the request counter once per process lifetime
|
|
800
825
|
// (cheap — not on the instantAdapt hot path) so short-lived CLI/MCP
|
|
@@ -813,6 +838,8 @@ export class PersistentSONAEngine {
|
|
|
813
838
|
this.db = null;
|
|
814
839
|
this.persistence = null;
|
|
815
840
|
this.initialized = false;
|
|
841
|
+
// A completed initialization promise belongs to the closed lifecycle.
|
|
842
|
+
this.initPromise = null;
|
|
816
843
|
console.log(`[PersistentSONAEngine] Closed: domain=${this.config.domain}`);
|
|
817
844
|
}
|
|
818
845
|
// ==========================================================================
|
|
@@ -1018,6 +1045,8 @@ export class PersistentSONAEngine {
|
|
|
1018
1045
|
else {
|
|
1019
1046
|
// Batch saves
|
|
1020
1047
|
this.pendingSaves.set(pattern.id, pattern);
|
|
1048
|
+
// New explicit work starts a fresh, bounded recovery cycle.
|
|
1049
|
+
this.consecutiveSaveFailures = 0;
|
|
1021
1050
|
this.scheduleSave();
|
|
1022
1051
|
}
|
|
1023
1052
|
}
|
|
@@ -1034,11 +1063,12 @@ export class PersistentSONAEngine {
|
|
|
1034
1063
|
const actionEmbedding = pattern.action?.value && Array.isArray(pattern.action.value)
|
|
1035
1064
|
? this.floatArrayToBuffer(pattern.action.value)
|
|
1036
1065
|
: null;
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1066
|
+
// Encode strings too: the reader parses JSON, so raw "123"/"false"
|
|
1067
|
+
// would otherwise change the action type after restarting. Legacy raw
|
|
1068
|
+
// non-JSON strings remain readable through rowToPattern's fallback.
|
|
1069
|
+
const actionValue = pattern.action?.value !== undefined
|
|
1070
|
+
? JSON.stringify(pattern.action.value)
|
|
1071
|
+
: null;
|
|
1042
1072
|
stmt.run(pattern.id, pattern.type, pattern.domain, stateEmbedding, actionEmbedding, pattern.action?.type ?? 'unknown', actionValue, pattern.outcome?.reward ?? 0, pattern.outcome?.success ? 1 : 0, pattern.outcome?.quality ?? 0, pattern.confidence, pattern.usageCount, 0, // success_count (tracked separately from usageCount)
|
|
1043
1073
|
0, // failure_count
|
|
1044
1074
|
pattern.metadata ? JSON.stringify(pattern.metadata) : null, pattern.createdAt?.toISOString() ?? new Date().toISOString(), pattern.lastUsedAt?.toISOString() ?? null);
|
|
@@ -1046,17 +1076,41 @@ export class PersistentSONAEngine {
|
|
|
1046
1076
|
/**
|
|
1047
1077
|
* Schedule batched save
|
|
1048
1078
|
*/
|
|
1049
|
-
scheduleSave() {
|
|
1050
|
-
if (this.saveTimer)
|
|
1079
|
+
scheduleSave(delayMs = this.config.autoSaveInterval) {
|
|
1080
|
+
if (this.saveTimer) {
|
|
1081
|
+
// New explicit work must survive natural exit, even during a retry delay.
|
|
1082
|
+
if (this.consecutiveSaveFailures === 0)
|
|
1083
|
+
this.saveTimer.ref();
|
|
1051
1084
|
return;
|
|
1085
|
+
}
|
|
1052
1086
|
this.saveTimer = setTimeout(() => {
|
|
1053
1087
|
this.saveTimer = null;
|
|
1054
1088
|
const patterns = Array.from(this.pendingSaves.values());
|
|
1055
|
-
this.pendingSaves.clear();
|
|
1056
1089
|
for (const pattern of patterns) {
|
|
1057
|
-
|
|
1090
|
+
try {
|
|
1091
|
+
this.savePatternToDb(pattern);
|
|
1092
|
+
this.pendingSaves.delete(pattern.id);
|
|
1093
|
+
}
|
|
1094
|
+
catch (error) {
|
|
1095
|
+
logger.warn('Deferred SONA save failed; retaining pending pattern', {
|
|
1096
|
+
patternId: pattern.id, error: toErrorMessage(error),
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
if (this.pendingSaves.size > 0) {
|
|
1101
|
+
this.consecutiveSaveFailures++;
|
|
1102
|
+
// Stop after five failed batches; close() can still flush retained rows.
|
|
1103
|
+
if (this.consecutiveSaveFailures < 5 && this.db?.open) {
|
|
1104
|
+
this.scheduleSave(Math.min(60000, Math.max(1000, this.config.autoSaveInterval) * 2 ** (this.consecutiveSaveFailures - 1)));
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
else {
|
|
1108
|
+
this.consecutiveSaveFailures = 0;
|
|
1058
1109
|
}
|
|
1059
|
-
},
|
|
1110
|
+
}, delayMs);
|
|
1111
|
+
// The initial batch must flush on natural exit; only failure retries are optional.
|
|
1112
|
+
if (this.consecutiveSaveFailures > 0)
|
|
1113
|
+
this.saveTimer.unref();
|
|
1060
1114
|
}
|
|
1061
1115
|
/**
|
|
1062
1116
|
* Update pattern usage in SQLite
|
|
@@ -108,6 +108,15 @@ class QESONAPatternRegistry {
|
|
|
108
108
|
getByDomain(domain) {
|
|
109
109
|
return Array.from(this.patterns.values()).filter(p => p.domain === domain);
|
|
110
110
|
}
|
|
111
|
+
/** Remove a pattern and its trajectory associations from the registry. */
|
|
112
|
+
delete(id) {
|
|
113
|
+
const removed = this.patterns.delete(id);
|
|
114
|
+
for (const [trajectoryId, patternId] of this.trajectoryMap) {
|
|
115
|
+
if (patternId === id)
|
|
116
|
+
this.trajectoryMap.delete(trajectoryId);
|
|
117
|
+
}
|
|
118
|
+
return removed;
|
|
119
|
+
}
|
|
111
120
|
/**
|
|
112
121
|
* Clear all patterns
|
|
113
122
|
*/
|
|
@@ -380,6 +389,10 @@ export class QESONA {
|
|
|
380
389
|
engineStats,
|
|
381
390
|
};
|
|
382
391
|
}
|
|
392
|
+
/** Stop recalling a pattern without resetting learned model weights. */
|
|
393
|
+
deletePattern(patternId) {
|
|
394
|
+
return this.registry.delete(patternId);
|
|
395
|
+
}
|
|
383
396
|
/**
|
|
384
397
|
* Clear all patterns
|
|
385
398
|
*/
|
|
@@ -56,9 +56,9 @@ export class InMemoryBackend {
|
|
|
56
56
|
return value !== undefined;
|
|
57
57
|
}
|
|
58
58
|
async search(pattern, limit = MEMORY_CONSTANTS.DEFAULT_SEARCH_LIMIT, options) {
|
|
59
|
-
//
|
|
60
|
-
const escaped = pattern.replace(/[
|
|
61
|
-
const regex = new RegExp(escaped.replace(/\*/g, '.*'));
|
|
59
|
+
// Match the same whole-key glob contract as persistent memory.
|
|
60
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
61
|
+
const regex = new RegExp(`^${escaped.replace(/\*/g, '.*').replace(/\?/g, '.')}$`, 'su');
|
|
62
62
|
const results = [];
|
|
63
63
|
// When a namespace is supplied, scope the scan to that prefix. Matches
|
|
64
64
|
// HybridBackend's namespace-aware search and lets LearningCoordinator's
|
|
@@ -68,7 +68,8 @@ export class InMemoryBackend {
|
|
|
68
68
|
for (const key of this.store.keys()) {
|
|
69
69
|
if (nsPrefix && !key.startsWith(nsPrefix))
|
|
70
70
|
continue;
|
|
71
|
-
|
|
71
|
+
const searchableKey = nsPrefix ? key.slice(nsPrefix.length) : key;
|
|
72
|
+
if (regex.test(searchableKey)) {
|
|
72
73
|
results.push(key);
|
|
73
74
|
if (results.length >= limit)
|
|
74
75
|
break;
|
|
@@ -582,10 +582,11 @@ export class UnifiedMemoryManager {
|
|
|
582
582
|
}
|
|
583
583
|
async kvSearch(pattern, namespace = 'default', limit = 100) {
|
|
584
584
|
this.ensureInitialized();
|
|
585
|
-
|
|
585
|
+
// Only glob wildcards are special; SQL LIKE's own wildcard/escape bytes are literal.
|
|
586
|
+
const sqlPattern = pattern.replace(/[!%_]/g, '!$&').replace(/\*/g, '%').replace(/\?/g, '_');
|
|
586
587
|
const rows = this.db.prepare(`
|
|
587
588
|
SELECT key FROM kv_store
|
|
588
|
-
WHERE namespace = ? AND key LIKE ?
|
|
589
|
+
WHERE namespace = ? AND key LIKE ? ESCAPE '!'
|
|
589
590
|
AND (expires_at IS NULL OR expires_at > ?)
|
|
590
591
|
LIMIT ?
|
|
591
592
|
`).all(namespace, sqlPattern, Date.now(), limit);
|
|
@@ -752,7 +752,7 @@ export class AQELearningEngine {
|
|
|
752
752
|
*/
|
|
753
753
|
async localAnalyze(targetPath, depth) {
|
|
754
754
|
try {
|
|
755
|
-
const glob = await import('
|
|
755
|
+
const { glob } = await import('tinyglobby');
|
|
756
756
|
const { existsSync, readFileSync } = await import('fs');
|
|
757
757
|
const { join } = await import('path');
|
|
758
758
|
// Scan patterns based on depth
|
|
@@ -762,9 +762,10 @@ export class AQELearningEngine {
|
|
|
762
762
|
? ['**/*.ts', '**/*.js', '**/*.json', '**/*.py']
|
|
763
763
|
: ['**/*'];
|
|
764
764
|
const ignore = ['node_modules/**', 'dist/**', 'coverage/**', '.git/**'];
|
|
765
|
-
const files = await glob
|
|
765
|
+
const files = await glob(patterns, {
|
|
766
766
|
cwd: targetPath,
|
|
767
767
|
ignore,
|
|
768
|
+
expandDirectories: false,
|
|
768
769
|
onlyFiles: true,
|
|
769
770
|
});
|
|
770
771
|
// Detect languages and frameworks
|