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.
Files changed (393) hide show
  1. package/.claude/helpers/.helpers-version +1 -1
  2. package/.claude/helpers/auto-memory-hook.mjs +18 -9
  3. package/.claude/helpers/helpers.manifest.json +6 -5
  4. package/.claude/helpers/hook-handler.cjs +40 -12
  5. package/.claude/helpers/memory.cjs +86 -0
  6. package/.claude/helpers/router.cjs +105 -0
  7. package/.claude/helpers/session.cjs +166 -0
  8. package/.claude/helpers/statusline.cjs +73 -621
  9. package/.claude/skills/skills-manifest.json +1 -1
  10. package/CHANGELOG.md +130 -0
  11. package/assets/skills/skills-manifest.json +1 -1
  12. package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
  13. package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
  14. package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
  15. package/dist/cli/bundle.js +6 -6
  16. package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
  17. package/dist/cli/chunks/{agent-booster-wasm-AK2W76RG.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
  18. package/dist/cli/chunks/{agent-handler-MGZCWHIY.js → agent-handler-4HZEQ3WQ.js} +2 -2
  19. package/dist/cli/chunks/{agent-memory-branch-JZ54MCSP.js → agent-memory-branch-IBHZQSRN.js} +2 -2
  20. package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
  21. package/dist/cli/chunks/{arena-CUVH3V7H.js → arena-EJBIGSF4.js} +2 -2
  22. package/dist/cli/chunks/{arena-YSWTKBCL.js → arena-LCLRGUIK.js} +4 -4
  23. package/dist/cli/chunks/{audit-LVU76QGA.js → audit-PY4JNDQQ.js} +3 -3
  24. package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
  25. package/dist/cli/chunks/{better-sqlite3-DB3LOJQU.js → better-sqlite3-2JG5K6XT.js} +2 -2
  26. package/dist/cli/chunks/{brain-handler-SD63KOQ6.js → brain-handler-3UYK55GA.js} +4 -4
  27. package/dist/cli/chunks/{branch-enumerator-4MNOPUC7.js → branch-enumerator-GOSWOX46.js} +2 -2
  28. package/dist/cli/chunks/{browser-OLPNTWQE.js → browser-DC2JV47Z.js} +2 -2
  29. package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
  30. package/dist/cli/chunks/{chunk-QQFQDEUE.js → chunk-25EEIAHS.js} +2 -2
  31. package/dist/cli/chunks/{chunk-DOBKEXMJ.js → chunk-3576QGPP.js} +1 -1
  32. package/dist/cli/chunks/{chunk-3M7J4U74.js → chunk-3EKG7HFV.js} +4 -4
  33. package/dist/cli/chunks/{chunk-DYTQHRUS.js → chunk-3FCHH4VP.js} +1 -1
  34. package/dist/cli/chunks/{chunk-EJ6MMYLK.js → chunk-3S5IIK32.js} +1 -1
  35. package/dist/cli/chunks/{chunk-NOHWJOBS.js → chunk-3X2JSW3R.js} +1 -1
  36. package/dist/cli/chunks/{chunk-7EZ2Z2CK.js → chunk-4HXFPBAA.js} +1 -1
  37. package/dist/cli/chunks/{chunk-XBYQ2BS4.js → chunk-4PY44TKH.js} +2 -2
  38. package/dist/cli/chunks/{chunk-5FSLMYAC.js → chunk-4RNCVSVN.js} +2 -2
  39. package/dist/cli/chunks/{chunk-X7ADKL7T.js → chunk-56M4QNXU.js} +2 -2
  40. package/dist/cli/chunks/{chunk-JHJUSSAU.js → chunk-5X4HDW5W.js} +2 -2
  41. package/dist/cli/chunks/{chunk-7MIOK72I.js → chunk-673XJBGW.js} +7 -7
  42. package/dist/cli/chunks/{chunk-77QZHIVX.js → chunk-6F7MFHTY.js} +2 -2
  43. package/dist/cli/chunks/{chunk-Q6NTEICT.js → chunk-6GJWT2OY.js} +2 -2
  44. package/dist/cli/chunks/{chunk-GV4DYPJP.js → chunk-6GNWVPMR.js} +2 -2
  45. package/dist/cli/chunks/{chunk-V5AK56DA.js → chunk-6VTC3OHD.js} +2 -2
  46. package/dist/cli/chunks/{chunk-MM56VPNE.js → chunk-775WGWLL.js} +3 -3
  47. package/dist/cli/chunks/{chunk-A3DK3XNZ.js → chunk-77WL5HQW.js} +1 -1
  48. package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
  49. package/dist/cli/chunks/{chunk-RC2A4JZ5.js → chunk-7TNCEVWX.js} +2 -2
  50. package/dist/cli/chunks/{chunk-XL5KIYE3.js → chunk-7X3LMTRA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-VW6FRMLW.js → chunk-A53MMSGC.js} +2 -2
  52. package/dist/cli/chunks/{chunk-UFSVUBTR.js → chunk-A5CLVZC3.js} +2 -2
  53. package/dist/cli/chunks/{chunk-4INST4ZL.js → chunk-AEYJ4ZLA.js} +1 -1
  54. package/dist/cli/chunks/{chunk-5U6N4V5M.js → chunk-AJ5PCJQ2.js} +4 -4
  55. package/dist/cli/chunks/{chunk-OAZX6WFU.js → chunk-AJMAKUS3.js} +2 -2
  56. package/dist/cli/chunks/{chunk-74IOEOMH.js → chunk-AOD2ES44.js} +2 -2
  57. package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
  58. package/dist/cli/chunks/{chunk-PYKY22GC.js → chunk-AUFV2G2J.js} +5 -5
  59. package/dist/cli/chunks/{chunk-KD2BLA5Y.js → chunk-B2QKBQYD.js} +1 -1
  60. package/dist/cli/chunks/{chunk-6EGS77BB.js → chunk-BCCSV3RH.js} +1 -1
  61. package/dist/cli/chunks/{chunk-JOZ47MV6.js → chunk-BFIXUKOR.js} +1 -1
  62. package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
  63. package/dist/cli/chunks/{chunk-OIDWDGLG.js → chunk-BITFGVZ4.js} +2 -2
  64. package/dist/cli/chunks/{chunk-ONR2NXXD.js → chunk-BL6273KR.js} +3 -3
  65. package/dist/cli/chunks/{chunk-BLG7SH4A.js → chunk-BOIUENWW.js} +1 -1
  66. package/dist/cli/chunks/{chunk-T77GZF4B.js → chunk-BT3MI2BW.js} +1 -1
  67. package/dist/cli/chunks/{chunk-UYUJT6QO.js → chunk-BTBJ2NLH.js} +2 -2
  68. package/dist/cli/chunks/{chunk-YMW57PEL.js → chunk-BUVJIVFG.js} +1 -1
  69. package/dist/cli/chunks/{chunk-QUORH2MG.js → chunk-BZIPW2PA.js} +8 -8
  70. package/dist/cli/chunks/{chunk-GVVFTFMB.js → chunk-C647D42G.js} +2 -2
  71. package/dist/cli/chunks/{chunk-AJUBT4NP.js → chunk-CBWM5NOO.js} +3 -3
  72. package/dist/cli/chunks/{chunk-F2OPFVQH.js → chunk-CIEXUYY7.js} +1 -1
  73. package/dist/cli/chunks/{chunk-QGOWNVVG.js → chunk-CLUHGBLN.js} +4 -4
  74. package/dist/cli/chunks/{chunk-WOV6XI3A.js → chunk-CQEWL32R.js} +1 -1
  75. package/dist/cli/chunks/{chunk-3QJU4Q4R.js → chunk-CXUC7YKA.js} +2 -2
  76. package/dist/cli/chunks/{chunk-HZY42OVU.js → chunk-D2Y36V5J.js} +2 -2
  77. package/dist/cli/chunks/{chunk-WF6UISKW.js → chunk-DSJJHPPS.js} +4 -4
  78. package/dist/cli/chunks/{chunk-FYPX5WBJ.js → chunk-DZHXCOSK.js} +1 -1
  79. package/dist/cli/chunks/{chunk-TXSPBLBT.js → chunk-EBV3WFIR.js} +2 -2
  80. package/dist/cli/chunks/{chunk-Y6AKKQIQ.js → chunk-EKO5QL2B.js} +1 -1
  81. package/dist/cli/chunks/{chunk-MZB2UV2O.js → chunk-EMOZ5O5S.js} +1 -1
  82. package/dist/cli/chunks/{chunk-23CX7JNL.js → chunk-ES7TAJRJ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-Z4Q5PCRZ.js → chunk-EXQGHTPD.js} +4 -4
  84. package/dist/cli/chunks/{chunk-A2VUCUTT.js → chunk-F2WAB4WK.js} +2 -2
  85. package/dist/cli/chunks/{chunk-CQNMGK6Y.js → chunk-F57FTFWS.js} +2 -2
  86. package/dist/cli/chunks/{chunk-OEPNNLR4.js → chunk-F6JJNBE5.js} +1 -1
  87. package/dist/cli/chunks/{chunk-UBJG3IHT.js → chunk-FRC7AFB4.js} +2 -2
  88. package/dist/cli/chunks/{chunk-2G63VIJE.js → chunk-G36RZF2Y.js} +1 -1
  89. package/dist/cli/chunks/{chunk-YRHTQZU4.js → chunk-G3C7Z6FO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-B4I43GE2.js → chunk-GA63ESNT.js} +2 -2
  91. package/dist/cli/chunks/{chunk-7QYOTUOX.js → chunk-GHMJFICO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-HYOPJHHW.js → chunk-GK5WLUX3.js} +1 -1
  93. package/dist/cli/chunks/{chunk-A5MA7A23.js → chunk-GQJ4QDEN.js} +6 -6
  94. package/dist/cli/chunks/{chunk-UA7TDVL7.js → chunk-GVLRE3BV.js} +4 -4
  95. package/dist/cli/chunks/{chunk-25P6JA6V.js → chunk-H5UH234L.js} +1 -1
  96. package/dist/cli/chunks/{chunk-BE4KALTE.js → chunk-HBAFXWSO.js} +1 -1
  97. package/dist/cli/chunks/{chunk-EGOIIUBD.js → chunk-HE3BDBAO.js} +2 -2
  98. package/dist/cli/chunks/{chunk-P2UPYSDJ.js → chunk-HHANMCD2.js} +1 -1
  99. package/dist/cli/chunks/{chunk-ZUOVNFXK.js → chunk-HPVYJ6JH.js} +2 -2
  100. package/dist/cli/chunks/{chunk-RKI3IQKQ.js → chunk-I6NZFBT3.js} +3 -3
  101. package/dist/cli/chunks/{chunk-QVH5Y7AP.js → chunk-ISBOHF6Y.js} +1 -1
  102. package/dist/cli/chunks/{chunk-IWFFO6VT.js → chunk-J24AJEDE.js} +2 -2
  103. package/dist/cli/chunks/{chunk-5GFKTJ65.js → chunk-J5HTQHJK.js} +2 -2
  104. package/dist/cli/chunks/{chunk-LY7MFGBD.js → chunk-JDOVO4E4.js} +150 -149
  105. package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
  106. package/dist/cli/chunks/{chunk-HXXHMLJ5.js → chunk-JRK5GX56.js} +1 -1
  107. package/dist/cli/chunks/{chunk-36VKMAMN.js → chunk-JRLZ7LZ3.js} +2 -2
  108. package/dist/cli/chunks/{chunk-6PJPQGF4.js → chunk-JTOFLDU7.js} +2 -2
  109. package/dist/cli/chunks/{chunk-CVOQ6ESD.js → chunk-K6EOHGKS.js} +2 -2
  110. package/dist/cli/chunks/{chunk-LU2EDWQK.js → chunk-KKXH25IH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-EYXE2XKP.js → chunk-KNSQWM2E.js} +2 -2
  112. package/dist/cli/chunks/{chunk-IEJ7ZV3M.js → chunk-L5T32SRF.js} +1 -1
  113. package/dist/cli/chunks/{chunk-BEFTQVEW.js → chunk-LKFBW2QM.js} +2 -2
  114. package/dist/cli/chunks/{chunk-C3FXFU2T.js → chunk-LMAI74EP.js} +1 -1
  115. package/dist/cli/chunks/{chunk-P7XSPP5D.js → chunk-LQVS5IWH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-4EKV7PHB.js → chunk-LRGTPUJA.js} +2 -2
  117. package/dist/cli/chunks/{chunk-MT7UNBZ7.js → chunk-LTHV4PIG.js} +2 -2
  118. package/dist/cli/chunks/{chunk-B2YGVSOP.js → chunk-M7QKCHLQ.js} +2 -2
  119. package/dist/cli/chunks/{chunk-H5RQPO3X.js → chunk-N3ASALOL.js} +2 -2
  120. package/dist/cli/chunks/{chunk-MQZ53OR3.js → chunk-NEXBTLN6.js} +2 -2
  121. package/dist/cli/chunks/{chunk-BD7FEUN3.js → chunk-NJEEKYEP.js} +3 -3
  122. package/dist/cli/chunks/{chunk-UOI6ULCH.js → chunk-NWUFTLSF.js} +2 -2
  123. package/dist/cli/chunks/{chunk-RT6O2HW2.js → chunk-O4QB2GFL.js} +2 -2
  124. package/dist/cli/chunks/{chunk-MZMG6CUJ.js → chunk-OA75C4HY.js} +2 -2
  125. package/dist/cli/chunks/{chunk-HYFQUWNB.js → chunk-OVMG6EEF.js} +2 -2
  126. package/dist/cli/chunks/{chunk-FSSR6WBE.js → chunk-OX7MJFLC.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ENK44A6Q.js → chunk-OZJQN7YE.js} +2 -2
  128. package/dist/cli/chunks/{chunk-LXZMP3VX.js → chunk-PFXCRRR6.js} +25 -25
  129. package/dist/cli/chunks/{chunk-WIH522AP.js → chunk-PVJLQ2YZ.js} +1 -1
  130. package/dist/cli/chunks/{chunk-ZUB5YOCM.js → chunk-QDRFLM77.js} +2 -2
  131. package/dist/cli/chunks/{chunk-NHUGHAY6.js → chunk-QH7C4PTX.js} +1 -1
  132. package/dist/cli/chunks/{chunk-VXKWNRGA.js → chunk-QKM4XT2F.js} +2 -2
  133. package/dist/cli/chunks/{chunk-ON2UTP2U.js → chunk-QP7EKLWU.js} +2 -2
  134. package/dist/cli/chunks/{chunk-KUHLTVWC.js → chunk-QPACHVDI.js} +1 -1
  135. package/dist/cli/chunks/{chunk-PCJQCEBA.js → chunk-QQVE65ER.js} +2 -2
  136. package/dist/cli/chunks/{chunk-Q3NSU24F.js → chunk-QYCZYJH7.js} +2 -2
  137. package/dist/cli/chunks/{chunk-AEUEMVJK.js → chunk-R6I5I724.js} +2 -2
  138. package/dist/cli/chunks/{chunk-5D7ZFWDS.js → chunk-RJJIPTVH.js} +2 -2
  139. package/dist/cli/chunks/{chunk-ZWEKAEEV.js → chunk-RM6OC35G.js} +1 -1
  140. package/dist/cli/chunks/{chunk-ZELWDJXT.js → chunk-RTD4U7IW.js} +2 -2
  141. package/dist/cli/chunks/{chunk-O5V7RHVG.js → chunk-SKJQKOFJ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-6RD44SCE.js → chunk-SMBGK7XI.js} +1 -1
  143. package/dist/cli/chunks/{chunk-ND4QTZOL.js → chunk-SPS472C5.js} +2 -2
  144. package/dist/cli/chunks/{chunk-TFK2AYIN.js → chunk-SUNXA2UR.js} +2 -2
  145. package/dist/cli/chunks/{chunk-RDGPXENG.js → chunk-SVP3BP52.js} +2 -2
  146. package/dist/cli/chunks/{chunk-NBLDBVAW.js → chunk-T4WQPE77.js} +1 -1
  147. package/dist/cli/chunks/{chunk-ZS4XVJGV.js → chunk-T53ZN4NO.js} +2 -2
  148. package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
  149. package/dist/cli/chunks/{chunk-JZT7BU44.js → chunk-T7YCNOW5.js} +2 -2
  150. package/dist/cli/chunks/{chunk-EADSQN5T.js → chunk-TCQWVVSR.js} +1 -1
  151. package/dist/cli/chunks/{chunk-XYLQZWF6.js → chunk-TGRHO4ES.js} +2 -2
  152. package/dist/cli/chunks/{chunk-QPLSYEWJ.js → chunk-TP7L4EX6.js} +2 -2
  153. package/dist/cli/chunks/{chunk-N5XOXPHZ.js → chunk-TT45RCLN.js} +2 -2
  154. package/dist/cli/chunks/{chunk-OZGIOKEA.js → chunk-TUZNWRYC.js} +1 -1
  155. package/dist/cli/chunks/{chunk-53BXTTRO.js → chunk-U2QTL5T2.js} +3 -3
  156. package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
  157. package/dist/cli/chunks/{chunk-SRPLERER.js → chunk-UHLZKH6B.js} +4 -4
  158. package/dist/cli/chunks/{chunk-HPWWYT67.js → chunk-UIWXKRTK.js} +2 -2
  159. package/dist/cli/chunks/{chunk-XWYELBZS.js → chunk-UNFE4RPV.js} +1 -1
  160. package/dist/cli/chunks/{chunk-FW4DJ4FJ.js → chunk-UQGIC5OX.js} +1 -1
  161. package/dist/cli/chunks/{chunk-GLGKQX2V.js → chunk-VAXTPLO3.js} +2 -2
  162. package/dist/cli/chunks/{chunk-VYDVI6FZ.js → chunk-VCSNNLWL.js} +2 -2
  163. package/dist/cli/chunks/{chunk-J7AQZLIH.js → chunk-VSPNIDQK.js} +4 -4
  164. package/dist/cli/chunks/{chunk-EIGRV3J6.js → chunk-VV2JVYOI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-CBONQM5D.js → chunk-VW7AXJQS.js} +2 -2
  166. package/dist/cli/chunks/{chunk-O6MO5KMR.js → chunk-W7JUD4EZ.js} +2 -2
  167. package/dist/cli/chunks/{chunk-QFETNCNN.js → chunk-WFKE7NZ5.js} +2 -2
  168. package/dist/cli/chunks/{chunk-ROVZSZCS.js → chunk-WVEHKAIH.js} +3 -3
  169. package/dist/cli/chunks/{chunk-YO4ESCB4.js → chunk-XAESN54Q.js} +1 -1
  170. package/dist/cli/chunks/{chunk-RKUAWQOF.js → chunk-XECZYQT5.js} +2 -2
  171. package/dist/cli/chunks/{chunk-RLW25X66.js → chunk-XFT4FYTC.js} +2 -2
  172. package/dist/cli/chunks/{chunk-SM2YJ2AL.js → chunk-YHX74M7C.js} +2 -2
  173. package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
  174. package/dist/cli/chunks/{chunk-IAENZ2DR.js → chunk-Z5UZOYQS.js} +2 -2
  175. package/dist/cli/chunks/{chunk-G367W7XR.js → chunk-Z6G3QVZ4.js} +12 -12
  176. package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
  177. package/dist/cli/chunks/{ci-output-RLS32FUY.js → ci-output-UO5BDFU4.js} +2 -2
  178. package/dist/cli/chunks/{circuit-breaker-MRCC7WCM.js → circuit-breaker-UQDPXYRD.js} +2 -2
  179. package/dist/cli/chunks/{claude-flow-setup-LIZCEKDF.js → claude-flow-setup-62QES3QX.js} +2 -2
  180. package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
  181. package/dist/cli/chunks/{cline-installer-T7H6R2RC.js → cline-installer-X7VZTSZG.js} +2 -2
  182. package/dist/cli/chunks/{code-XMBLI7OF.js → code-H3BF4L4H.js} +3 -3
  183. package/dist/cli/chunks/{code-index-extractor-QS7BYLEX.js → code-index-extractor-BJGFZGGL.js} +2 -2
  184. package/dist/cli/chunks/{codex-installer-6PGT5FM6.js → codex-installer-KVZWKU6S.js} +2 -2
  185. package/dist/cli/chunks/{completions-2A3WRXY2.js → completions-YMILE6V7.js} +2 -2
  186. package/dist/cli/chunks/{complexity-analyzer-23HOOGJ7.js → complexity-analyzer-J26N2PWG.js} +2 -2
  187. package/dist/cli/chunks/{continuedev-installer-4FSF7B3N.js → continuedev-installer-MAR42OV7.js} +2 -2
  188. package/dist/cli/chunks/{copilot-installer-A5GRQQUU.js → copilot-installer-CVOJF6OT.js} +2 -2
  189. package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
  190. package/dist/cli/chunks/{cost-tracker-Z4STQ5VB.js → cost-tracker-SXLWXE55.js} +2 -2
  191. package/dist/cli/chunks/{coverage-NUPP6KZZ.js → coverage-D7HCHFP3.js} +3 -3
  192. package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
  193. package/dist/cli/chunks/{cursor-installer-FVJ7ROPJ.js → cursor-installer-X37VHIKW.js} +2 -2
  194. package/dist/cli/chunks/{daemon-D662EX5N.js → daemon-JN7SOH6F.js} +4 -4
  195. package/dist/cli/chunks/{daemon-7ZZA2MMN.js → daemon-LIW47IDM.js} +4 -4
  196. package/dist/cli/chunks/{dag-attention-scheduler-IB4TQ2KA.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
  197. package/dist/cli/chunks/{detect-LGLBZN4I.js → detect-WRFCWAX5.js} +2 -2
  198. package/dist/cli/chunks/{dist-node-Z3OL42YE.js → dist-node-6FWT4XZO.js} +2 -2
  199. package/dist/cli/chunks/{domain-handler-L3CLNL7U.js → domain-handler-SNFPNMRT.js} +2 -2
  200. package/dist/cli/chunks/{domain-plugins-GQ3V5X6L.js → domain-plugins-MXKHH62P.js} +2 -2
  201. package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
  202. package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
  203. package/dist/cli/chunks/{embed-and-insert-pattern-UGD6USYH.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
  204. package/dist/cli/chunks/{eval-3B7UIYGY.js → eval-AMUXTMJB.js} +2 -2
  205. package/dist/cli/chunks/{experience-capture-middleware-3RQ4NYY3.js → experience-capture-middleware-3D65TR2C.js} +4 -4
  206. package/dist/cli/chunks/{fast-paths-QOSAEPYD.js → fast-paths-Y7BBMM56.js} +2 -2
  207. package/dist/cli/chunks/{feature-flags-TLF4NKOH.js → feature-flags-JMQQ7JW4.js} +2 -2
  208. package/dist/cli/chunks/{feature-flags-3S5TH6P4.js → feature-flags-VESRRQ6V.js} +2 -2
  209. package/dist/cli/chunks/{file-discovery-AEVMJRNB.js → file-discovery-JJKQQUV6.js} +2 -2
  210. package/dist/cli/chunks/{fleet-E6WTXWFL.js → fleet-WIGHICJF.js} +4 -4
  211. package/dist/cli/chunks/{gnn-wrapper-MCKH3AUU.js → gnn-wrapper-BFNPETTT.js} +2 -2
  212. package/dist/cli/chunks/{heartbeat-handler-U7XENHRR.js → heartbeat-handler-HDXKTGUI.js} +4 -4
  213. package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
  214. package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
  215. package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
  216. package/dist/cli/chunks/{hnsw-legacy-bridge-5GW4SAEI.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
  217. package/dist/cli/chunks/{hnswlib-node-7BLZBK5T.js → hnswlib-node-LKV2H47B.js} +2 -2
  218. package/dist/cli/chunks/{hooks-F3O2SB6H.js → hooks-KDSFYQQG.js} +10 -10
  219. package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
  220. package/dist/cli/chunks/{hypergraph-engine-PV4EKXHB.js → hypergraph-engine-GDLPEPUC.js} +2 -2
  221. package/dist/cli/chunks/{hypergraph-handler-VOWO5ZTW.js → hypergraph-handler-4UMFA2EW.js} +3 -3
  222. package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
  223. package/dist/cli/chunks/{init-handler-ENJ5ONJX.js → init-handler-4GCHPQHD.js} +6 -6
  224. package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
  225. package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
  226. package/dist/cli/chunks/{kilocode-installer-HNNJOOPE.js → kilocode-installer-HJZMT2G5.js} +2 -2
  227. package/dist/cli/chunks/{kiro-installer-UZBIQ3IC.js → kiro-installer-WUPY67HG.js} +2 -2
  228. package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
  229. package/dist/cli/chunks/{learning-YMLCVFUT.js → learning-AXKIS7IG.js} +4 -4
  230. package/dist/cli/chunks/{llm-router-YWTARCCT.js → llm-router-HUDPNZLJ.js} +4 -4
  231. package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
  232. package/dist/cli/chunks/{load-DKE3F3IP.js → load-RM44POD7.js} +2 -2
  233. package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
  234. package/dist/cli/chunks/{mcp-5PSGIUCW.js → mcp-5JVQRBOP.js} +2 -2
  235. package/dist/cli/chunks/{memory-3L3O6JMM.js → memory-VGZ2V6PL.js} +5 -5
  236. package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
  237. package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
  238. package/dist/cli/chunks/{multi-model-executor-AEEO7IA4.js → multi-model-executor-WPRKCSCM.js} +2 -2
  239. package/dist/cli/chunks/{opencode-installer-ABBO355U.js → opencode-installer-YAJMRCQO.js} +2 -2
  240. package/dist/cli/chunks/{orchestrator-E36Q7MKE.js → orchestrator-MUGWBUYP.js} +6 -6
  241. package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
  242. package/dist/cli/chunks/{pattern-usage-recorder-H4XKSID4.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
  243. package/dist/cli/chunks/{pipeline-BGFEHXIN.js → pipeline-F4DXDUDC.js} +2 -2
  244. package/dist/cli/chunks/{platform-GK7ZVDJI.js → platform-HI3A3OWF.js} +2 -2
  245. package/dist/cli/chunks/{plugin-CAH2CKI6.js → plugin-XRITPTR7.js} +2 -2
  246. package/dist/cli/chunks/{prime-radiant-advanced-wasm-M5EYRONA.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
  247. package/dist/cli/chunks/{project-root-BSNZC243.js → project-root-2VN4WO2A.js} +2 -2
  248. package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
  249. package/dist/cli/chunks/{protocol-handler-JDSSC2SF.js → protocol-handler-ZEVHSEBG.js} +2 -2
  250. package/dist/cli/chunks/{prove-ANPTOZJE.js → prove-C4BLZWBS.js} +2 -2
  251. package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
  252. package/dist/cli/chunks/{quality-SXWGYRQR.js → quality-M3DTE4KK.js} +2 -2
  253. package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
  254. package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
  255. package/dist/cli/chunks/{real-embeddings-WSRYAOZM.js → real-embeddings-YWSE3IRT.js} +2 -2
  256. package/dist/cli/chunks/{ref-validation-AZ3LRWEK.js → ref-validation-ZWOTFA3T.js} +2 -2
  257. package/dist/cli/chunks/{roocode-installer-2QKGFIEU.js → roocode-installer-GJBIWETD.js} +2 -2
  258. package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
  259. package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
  260. package/dist/cli/chunks/{routing-handler-UYDC5MMD.js → routing-handler-CFYLGNAR.js} +2 -2
  261. package/dist/cli/chunks/{ruvector-commands-QXADPVEY.js → ruvector-commands-EDKG456B.js} +2 -2
  262. package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
  263. package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
  264. package/dist/cli/chunks/{rvf-migration-coordinator-GD4NBFKT.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
  265. package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
  266. package/dist/cli/chunks/{rvf-store-integrity-7SXG66IL.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
  267. package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
  268. package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
  269. package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
  270. package/dist/cli/chunks/{security-YKB622PK.js → security-ZU2GW3ZM.js} +3 -3
  271. package/dist/cli/chunks/{shared-rvf-adapter-KMLAV7JK.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
  272. package/dist/cli/chunks/{shared-rvf-dual-writer-OYY27DFV.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
  273. package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
  274. package/dist/cli/chunks/{standalone-memory-2DOABVLC.js → standalone-memory-3UXDZ7HI.js} +2 -2
  275. package/dist/cli/chunks/{status-handler-EXRKETV7.js → status-handler-264CHTWS.js} +2 -2
  276. package/dist/cli/chunks/{structural-health-2SKK6DU6.js → structural-health-E2QPUOZE.js} +2 -2
  277. package/dist/cli/chunks/{sync-UW7SX7GO.js → sync-2ACMWM7D.js} +2 -2
  278. package/dist/cli/chunks/{sync-DQ2YUNI6.js → sync-N2L2OST4.js} +2 -2
  279. package/dist/cli/chunks/{task-handler-LYQ6WYUY.js → task-handler-IB5CVOTY.js} +2 -2
  280. package/dist/cli/chunks/{task-handlers-DIJO232S.js → task-handlers-QBMYNJHE.js} +3 -3
  281. package/dist/cli/chunks/{test-WRHZMUCW.js → test-7RGLRDSP.js} +6 -6
  282. package/dist/cli/chunks/{test-scheduling-HI23RXFK.js → test-scheduling-RJABJT2W.js} +3 -3
  283. package/dist/cli/chunks/{token-bootstrap-23SA6SWZ.js → token-bootstrap-JVHMHB72.js} +2 -2
  284. package/dist/cli/chunks/{token-usage-M7RRDPXO.js → token-usage-3ECHQVCY.js} +2 -2
  285. package/dist/cli/chunks/{transformers-4TC35KKS.js → transformers-KJH3IJWI.js} +2 -2
  286. package/dist/cli/chunks/{tree-sitter-wasm-parser-F4LTKAWD.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
  287. package/dist/cli/chunks/{types-NBXV6LXQ.js → types-5BAPXOLS.js} +2 -2
  288. package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
  289. package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
  290. package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
  291. package/dist/cli/chunks/{upgrade-4BGOU5RM.js → upgrade-S5NFQZID.js} +2 -2
  292. package/dist/cli/chunks/{validate-EDWAR63H.js → validate-BIBWOLJD.js} +2 -2
  293. package/dist/cli/chunks/{validate-swarm-VI72CPR7.js → validate-swarm-WAA3LBHH.js} +2 -2
  294. package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
  295. package/dist/cli/chunks/{web-tree-sitter-Y5XBRQXF.js → web-tree-sitter-OTBQTHAV.js} +2 -2
  296. package/dist/cli/chunks/{windsurf-installer-VEX23WAF.js → windsurf-installer-NNQ22EW6.js} +2 -2
  297. package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
  298. package/dist/cli/chunks/{witness-chain-3YNL6YGY.js → witness-chain-E7MUBOJW.js} +2 -2
  299. package/dist/cli/chunks/{witness-chain-repair-MJZGZRWT.js → witness-chain-repair-FW4QSN4C.js} +2 -2
  300. package/dist/cli/chunks/{witness-chain-verifier-TTJYXTBE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
  301. package/dist/cli/chunks/{witness-key-manager-EM6YXYOY.js → witness-key-manager-4CGRNDMJ.js} +2 -2
  302. package/dist/cli/chunks/{workflow-2RBDOM7V.js → workflow-4VRSTRAN.js} +4 -4
  303. package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
  304. package/dist/cli/chunks/{wrappers-5OTAVVOV.js → wrappers-4M4UTGEU.js} +2 -2
  305. package/dist/cli/commands/ci.js +17 -6
  306. package/dist/cli/commands/quality-gate.js +6 -1
  307. package/dist/cli/index.js +7 -2
  308. package/dist/cli/process-store-cleanup.d.ts +7 -0
  309. package/dist/cli/process-store-cleanup.js +27 -0
  310. package/dist/cli/utils/ci-config.d.ts +3 -3
  311. package/dist/cli/utils/ci-config.js +202 -68
  312. package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
  313. package/dist/domains/quality-assessment/quality-evidence.js +7 -2
  314. package/dist/domains/test-execution/services/retry-handler.js +32 -13
  315. package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
  316. package/dist/domains/test-execution/services/test-executor.js +66 -22
  317. package/dist/init/fleet-integration.js +3 -2
  318. package/dist/init/init-wizard-steps.js +3 -2
  319. package/dist/init/phases/06-code-intelligence.js +6 -4
  320. package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
  321. package/dist/integrations/ruvector/sona-persistence.js +74 -20
  322. package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
  323. package/dist/integrations/ruvector/sona-wrapper.js +13 -0
  324. package/dist/kernel/memory-backend.js +5 -4
  325. package/dist/kernel/unified-memory.js +3 -2
  326. package/dist/learning/aqe-learning-engine.js +3 -2
  327. package/dist/mcp/bundle.js +440 -439
  328. package/dist/mcp/connection-pool.d.ts +2 -0
  329. package/dist/mcp/connection-pool.js +13 -2
  330. package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
  331. package/dist/mcp/handlers/memory-handlers.js +16 -6
  332. package/dist/mcp/protocol-server.js +29 -8
  333. package/dist/mcp/types.d.ts +2 -0
  334. package/dist/optimization/session-cache.js +13 -11
  335. package/dist/plugins/cache.js +10 -3
  336. package/dist/shared/embeddings/embedding-cache.js +4 -4
  337. package/dist/shared/llm/cache.js +7 -10
  338. package/dist/shared/retry-engine.js +4 -0
  339. package/dist/shared/test-runner-process.d.ts +10 -0
  340. package/dist/shared/test-runner-process.js +210 -0
  341. package/dist/validation/quality-verdict.js +3 -2
  342. package/dist/workers/quality-daemon/priority-queue.js +4 -1
  343. package/package.json +4 -4
  344. package/dist/cli/chunks/adapter-TVQKH65T.js +0 -2
  345. package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +0 -2
  346. package/dist/cli/chunks/base-W42BURDL.js +0 -2
  347. package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +0 -2
  348. package/dist/cli/chunks/chunk-2IMSJ7IO.js +0 -2
  349. package/dist/cli/chunks/chunk-FBZC4IGB.js +0 -2
  350. package/dist/cli/chunks/chunk-MNQN7UZX.js +0 -4
  351. package/dist/cli/chunks/chunk-OXHF3L2T.js +0 -2
  352. package/dist/cli/chunks/chunk-PELENDDQ.js +0 -2
  353. package/dist/cli/chunks/chunk-TW3SR4TS.js +0 -2
  354. package/dist/cli/chunks/chunk-V6RE4YRQ.js +0 -2
  355. package/dist/cli/chunks/chunk-ZQZD55MN.js +0 -3
  356. package/dist/cli/chunks/ci-J3TDK5RA.js +0 -81
  357. package/dist/cli/chunks/client-3BD2DI4N.js +0 -2
  358. package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +0 -2
  359. package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +0 -2
  360. package/dist/cli/chunks/domain-transfer-MFCI76IY.js +0 -2
  361. package/dist/cli/chunks/dream-FTP33IJB.js +0 -2
  362. package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +0 -2
  363. package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +0 -2
  364. package/dist/cli/chunks/hnsw-index-MS5KODD7.js +0 -2
  365. package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +0 -2
  366. package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +0 -2
  367. package/dist/cli/chunks/init-wizard-I5DFZUQL.js +0 -2
  368. package/dist/cli/chunks/kernel-MISPSPPA.js +0 -2
  369. package/dist/cli/chunks/knowledge-graph-L26JESGE.js +0 -2
  370. package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +0 -2
  371. package/dist/cli/chunks/load-test-H5ISNNM5.js +0 -2
  372. package/dist/cli/chunks/memory-backend-HWDNOBKW.js +0 -2
  373. package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +0 -2
  374. package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +0 -2
  375. package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +0 -2
  376. package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +0 -2
  377. package/dist/cli/chunks/quality-gate-GYNCA4ZY.js +0 -7
  378. package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +0 -2
  379. package/dist/cli/chunks/router-MTP5LH4H.js +0 -2
  380. package/dist/cli/chunks/routing-feedback-GWETVB4L.js +0 -2
  381. package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +0 -2
  382. package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +0 -2
  383. package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +0 -2
  384. package/dist/cli/chunks/safe-db-FWWGAPVE.js +0 -2
  385. package/dist/cli/chunks/schedule-TPA4V4D5.js +0 -2
  386. package/dist/cli/chunks/scheduler-5ZTEPNDD.js +0 -2
  387. package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +0 -2
  388. package/dist/cli/chunks/unified-memory-OVFEPRPS.js +0 -2
  389. package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +0 -2
  390. package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +0 -2
  391. package/dist/cli/chunks/visual-security-2FUM5GLI.js +0 -2
  392. package/dist/cli/chunks/witness-chain-MH6GA5L6.js +0 -2
  393. 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
- report?.cleanup();
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.kill('SIGTERM');
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
- report?.cleanup();
420
- return; // Timeout result was already returned; child has now closed.
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
- // If no coverage in stdout JSON, try reading from disk
438
- // (vitest/jest write coverage to coverage/coverage-summary.json)
439
- if (parseResult.success && !parseResult.value.coverage && ['vitest', 'jest'].includes(framework.toLowerCase())) {
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 report = createVitestJsonReport();
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 report = createVitestJsonReport();
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 disk files written by vitest/jest.
1007
- * Both runners write coverage-summary.json to a coverage/ directory when
1008
- * --coverage is passed, rather than embedding it in stdout JSON.
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(process.cwd(), 'coverage', 'coverage-summary.json'),
1015
- join(process.cwd(), 'coverage', 'coverage-final.json'),
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('fast-glob');
126
- const files = await glob.default([
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('fast-glob');
204
- const files = await glob.default([
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('fast-glob');
234
- const files = await glob.default([
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('fast-glob');
443
- const files = await glob.default([
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 = [];
@@ -95,6 +95,7 @@ export declare class PersistentSONAEngine {
95
95
  private initPromise;
96
96
  private pendingSaves;
97
97
  private saveTimer;
98
+ private consecutiveSaveFailures;
98
99
  private serverClient;
99
100
  constructor(config: PersistentSONAConfig);
100
101
  /**
@@ -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
- return result.changes > 0;
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
- // Clear in base engine
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
- stmt.run(this.config.domain);
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
- this.savePatternToDb(pattern);
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
- const actionValue = typeof pattern.action?.value === 'string'
1038
- ? pattern.action.value
1039
- : pattern.action?.value !== undefined
1040
- ? JSON.stringify(pattern.action.value)
1041
- : null;
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
- this.savePatternToDb(pattern);
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
- }, this.config.autoSaveInterval);
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
@@ -199,6 +199,8 @@ export declare class QESONA {
199
199
  * Get statistics
200
200
  */
201
201
  getStats(): QESONAStats;
202
+ /** Stop recalling a pattern without resetting learned model weights. */
203
+ deletePattern(patternId: string): boolean;
202
204
  /**
203
205
  * Clear all patterns
204
206
  */
@@ -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
- // Escape regex-special chars first, then convert glob wildcards to regex
60
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
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
- if (regex.test(key)) {
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
- const sqlPattern = pattern.replace(/\*/g, '%').replace(/\?/g, '_');
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('fast-glob');
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.default(patterns, {
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