agentic-qe 3.15.2 → 3.15.4

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 (445) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +46 -6
  2. package/.claude/hooks/aqe-hook.cjs +280 -51
  3. package/.claude/skills/skills-manifest.json +1 -1
  4. package/CHANGELOG.md +155 -0
  5. package/assets/skills/skills-manifest.json +1 -1
  6. package/dist/adapters/ag-ui/state-delta-cache.js +14 -5
  7. package/dist/adapters/trajectory-adapter.js +3 -1
  8. package/dist/cli/bundle.js +5 -5
  9. package/dist/cli/chunks/adapter-T54G3TBK.js +2 -0
  10. package/dist/cli/chunks/{agent-booster-wasm-664M7426.js → agent-booster-wasm-MHJBRXMK.js} +2 -2
  11. package/dist/cli/chunks/{agent-handler-E47ITH45.js → agent-handler-G64SD7J2.js} +2 -2
  12. package/dist/cli/chunks/{agent-memory-branch-CFWVOJX3.js → agent-memory-branch-G4UXFPKH.js} +2 -2
  13. package/dist/cli/chunks/aqe-learning-engine-HLCJJ3JM.js +2 -0
  14. package/dist/cli/chunks/{arena-ZU5CGBGH.js → arena-63M3M6EW.js} +2 -2
  15. package/dist/cli/chunks/{arena-JM3OY263.js → arena-QJMKYPHS.js} +4 -4
  16. package/dist/cli/chunks/{audit-HVBRC5AS.js → audit-UDFVTWSX.js} +3 -3
  17. package/dist/cli/chunks/base-VLD755UU.js +2 -0
  18. package/dist/cli/chunks/{better-sqlite3-45JLBQX3.js → better-sqlite3-JLX2G56I.js} +2 -2
  19. package/dist/cli/chunks/{brain-handler-FKDONZYA.js → brain-handler-PWF32LLW.js} +3 -3
  20. package/dist/cli/chunks/{branch-enumerator-M3DPS3D5.js → branch-enumerator-PB7QWXDP.js} +2 -2
  21. package/dist/cli/chunks/{browser-TG2TV6NR.js → browser-CYNV2F3U.js} +2 -2
  22. package/dist/cli/chunks/browser-workflow-6M6VLWRF.js +2 -0
  23. package/dist/cli/chunks/{chunk-JFFVYCTV.js → chunk-2534PXIV.js} +2 -2
  24. package/dist/cli/chunks/{chunk-GHXNRF63.js → chunk-2DRMTRBM.js} +2 -2
  25. package/dist/cli/chunks/{chunk-L77Z3Q6L.js → chunk-2ICC4H6K.js} +2 -2
  26. package/dist/cli/chunks/{chunk-EATZW5T2.js → chunk-2LL35V3A.js} +2 -2
  27. package/dist/cli/chunks/{chunk-MEUJWTOX.js → chunk-2MU4WCMQ.js} +2 -2
  28. package/dist/cli/chunks/{chunk-3RC5UMRJ.js → chunk-33IUCP34.js} +2 -2
  29. package/dist/cli/chunks/{chunk-UX4BOI6K.js → chunk-35A22AUL.js} +1 -1
  30. package/dist/cli/chunks/{chunk-Z7XCXHEB.js → chunk-3BDDOFYW.js} +2 -2
  31. package/dist/cli/chunks/chunk-3C2BFLYC.js +54 -0
  32. package/dist/cli/chunks/{chunk-56CE7UO4.js → chunk-3MSBVOYW.js} +6 -6
  33. package/dist/cli/chunks/{chunk-EDRIROCG.js → chunk-3ZIVBTX6.js} +2 -2
  34. package/dist/cli/chunks/{chunk-CRYZXTSQ.js → chunk-4GLR2S2M.js} +2 -2
  35. package/dist/cli/chunks/{chunk-DHSGCI6H.js → chunk-54ITMOFM.js} +6 -6
  36. package/dist/cli/chunks/{chunk-2AWU2E6R.js → chunk-54XTJBHV.js} +1 -1
  37. package/dist/cli/chunks/{chunk-JSTKSPYT.js → chunk-5B5D5KCV.js} +1 -1
  38. package/dist/cli/chunks/{chunk-NP2WWIZ3.js → chunk-5GWTJJEO.js} +1 -1
  39. package/dist/cli/chunks/{chunk-D75HDHX3.js → chunk-5H7MR6HP.js} +1 -1
  40. package/dist/cli/chunks/{chunk-NWYAV2UG.js → chunk-5SS2Z7JC.js} +2 -2
  41. package/dist/cli/chunks/chunk-5XXLWJU7.js +2 -0
  42. package/dist/cli/chunks/{chunk-B4H66LPR.js → chunk-6EHVPFHW.js} +1 -1
  43. package/dist/cli/chunks/{chunk-HSXLHNSS.js → chunk-6HO3XRXE.js} +2 -2
  44. package/dist/cli/chunks/chunk-6HTO4BLV.js +2 -0
  45. package/dist/cli/chunks/{chunk-SVHFSOGT.js → chunk-6QPW4OVH.js} +1 -1
  46. package/dist/cli/chunks/{chunk-BKZSTZDB.js → chunk-6TMUZGM2.js} +1 -1
  47. package/dist/cli/chunks/{chunk-2AOAEMJG.js → chunk-73MTUM6F.js} +2 -2
  48. package/dist/cli/chunks/{chunk-ANI3KPB7.js → chunk-73PCVMGA.js} +2 -2
  49. package/dist/cli/chunks/{chunk-HADOG2PT.js → chunk-76PRW2KY.js} +2 -2
  50. package/dist/cli/chunks/{chunk-NL6HKEPR.js → chunk-7INP6HZH.js} +3 -3
  51. package/dist/cli/chunks/{chunk-QB7H62A4.js → chunk-7X2IVMXN.js} +2 -2
  52. package/dist/cli/chunks/{chunk-ZVQSIH7Y.js → chunk-A4OPQJ4A.js} +8 -8
  53. package/dist/cli/chunks/{chunk-SKQTRYE7.js → chunk-ADF6LGHZ.js} +2 -2
  54. package/dist/cli/chunks/{chunk-5YS2DF5G.js → chunk-AHVN3UQZ.js} +2 -2
  55. package/dist/cli/chunks/{chunk-3XF7YTQC.js → chunk-AOKSLWON.js} +54 -54
  56. package/dist/cli/chunks/{chunk-CFDIYZGA.js → chunk-ASKPTGUU.js} +2 -2
  57. package/dist/cli/chunks/{chunk-LH3H4V7C.js → chunk-B7GJXQD2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-HOBBYORR.js → chunk-B7J3O2WM.js} +1 -1
  59. package/dist/cli/chunks/{chunk-J4EJMAH3.js → chunk-BBKLVHDQ.js} +1 -1
  60. package/dist/cli/chunks/{chunk-WMNVFCKY.js → chunk-BND6M2JX.js} +2 -2
  61. package/dist/cli/chunks/{chunk-LRVR56PD.js → chunk-BPGFCUDO.js} +1 -1
  62. package/dist/cli/chunks/{chunk-O6QTCUSL.js → chunk-BY3IL56R.js} +1 -1
  63. package/dist/cli/chunks/{chunk-3KXKJSKS.js → chunk-BY5PLEPZ.js} +32 -32
  64. package/dist/cli/chunks/{chunk-DGKPGRBT.js → chunk-BZWZTGMF.js} +2 -2
  65. package/dist/cli/chunks/{chunk-AS27JP67.js → chunk-C5EN5WB6.js} +1 -1
  66. package/dist/cli/chunks/chunk-CFXFGQEN.js +15 -0
  67. package/dist/cli/chunks/{chunk-X4CADOSD.js → chunk-CQ3WSTJ2.js} +2 -2
  68. package/dist/cli/chunks/{chunk-HFF5ERIE.js → chunk-D7RVZ5C2.js} +2 -2
  69. package/dist/cli/chunks/{chunk-HS3O763N.js → chunk-DAYMT7TH.js} +21 -21
  70. package/dist/cli/chunks/{chunk-W6PLBRRS.js → chunk-DBIK4OFX.js} +1 -1
  71. package/dist/cli/chunks/{chunk-OWZ3F7DJ.js → chunk-DEJM2P5K.js} +1 -1
  72. package/dist/cli/chunks/{chunk-TC4B5D4Z.js → chunk-DF4Y3HPO.js} +1 -1
  73. package/dist/cli/chunks/{chunk-7UA7SMM4.js → chunk-DFJGXXCL.js} +1 -1
  74. package/dist/cli/chunks/{chunk-SZYK5JL7.js → chunk-DPL4ZXTE.js} +1 -1
  75. package/dist/cli/chunks/{chunk-6WVEICL2.js → chunk-DVE5SM5G.js} +4 -4
  76. package/dist/cli/chunks/{chunk-QR5ILM34.js → chunk-EGHK6NMH.js} +2 -2
  77. package/dist/cli/chunks/{chunk-E6GANSLP.js → chunk-EWUFVWRT.js} +2 -2
  78. package/dist/cli/chunks/{chunk-HBMBO4FD.js → chunk-EY5IUF7U.js} +2 -2
  79. package/dist/cli/chunks/{chunk-JCB6K24D.js → chunk-FDK2GF4G.js} +2 -2
  80. package/dist/cli/chunks/{chunk-QZNFZ5IQ.js → chunk-FRBCX46J.js} +2 -2
  81. package/dist/cli/chunks/{chunk-FCMCQ6OX.js → chunk-G3ZUB3HD.js} +2 -2
  82. package/dist/cli/chunks/{chunk-QGCFMACF.js → chunk-GAXTPQCZ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-6O4KVU4K.js → chunk-GJVRQBLI.js} +2 -2
  84. package/dist/cli/chunks/{chunk-NLY5NUHZ.js → chunk-GLKLEHK3.js} +2 -2
  85. package/dist/cli/chunks/{chunk-IM67YHDK.js → chunk-HCDTLV5J.js} +2 -2
  86. package/dist/cli/chunks/{chunk-MY2XZHW3.js → chunk-HEDLZWPM.js} +1 -1
  87. package/dist/cli/chunks/{chunk-WUSSZ2S6.js → chunk-HEKCN5XQ.js} +2 -2
  88. package/dist/cli/chunks/{chunk-FRZVLRVR.js → chunk-HFSBONCS.js} +2 -2
  89. package/dist/cli/chunks/{chunk-IAOB2G3X.js → chunk-HX5KQK7I.js} +2 -2
  90. package/dist/cli/chunks/{chunk-BT6TZTCL.js → chunk-I43QRLLB.js} +2 -2
  91. package/dist/cli/chunks/{chunk-QJN5RW2U.js → chunk-I53365HG.js} +3 -3
  92. package/dist/cli/chunks/{chunk-55T7PDYP.js → chunk-I5A3HGO6.js} +2 -2
  93. package/dist/cli/chunks/{chunk-AR5V7VNC.js → chunk-I6E4X3L3.js} +1 -1
  94. package/dist/cli/chunks/chunk-IKWAPHJA.js +2 -0
  95. package/dist/cli/chunks/{chunk-UKRK3IE3.js → chunk-ISASRHZP.js} +2 -2
  96. package/dist/cli/chunks/{chunk-IHKRKRAV.js → chunk-J3RNVHDH.js} +1 -1
  97. package/dist/cli/chunks/{chunk-T75PWWK4.js → chunk-JFQDWAU3.js} +2 -2
  98. package/dist/cli/chunks/{chunk-3KTAMNKI.js → chunk-JL3TI43V.js} +2 -2
  99. package/dist/cli/chunks/{chunk-3DCRAW43.js → chunk-K2VUYRMG.js} +2 -2
  100. package/dist/cli/chunks/{chunk-RIAKRZCZ.js → chunk-KOLHZSEC.js} +2 -2
  101. package/dist/cli/chunks/{chunk-HXT4XDQO.js → chunk-LGA6J4I4.js} +2 -2
  102. package/dist/cli/chunks/{chunk-MDDECCAC.js → chunk-LJRZAALA.js} +169 -168
  103. package/dist/cli/chunks/{chunk-2B2MGJ2W.js → chunk-LOLAEDZD.js} +2 -2
  104. package/dist/cli/chunks/{chunk-2JEPRQMT.js → chunk-LPSE6DOQ.js} +1 -1
  105. package/dist/cli/chunks/{chunk-6KEYA4EH.js → chunk-LRTF5RMG.js} +4 -4
  106. package/dist/cli/chunks/{chunk-CV7E627D.js → chunk-LXYTC62V.js} +2 -2
  107. package/dist/cli/chunks/{chunk-YYVLMW65.js → chunk-LY53L6NH.js} +2 -2
  108. package/dist/cli/chunks/{chunk-HMDSBWF6.js → chunk-LZSLJJII.js} +2 -2
  109. package/dist/cli/chunks/{chunk-IT753IPZ.js → chunk-M6SJALLA.js} +2 -2
  110. package/dist/cli/chunks/{chunk-GDSLQTJC.js → chunk-MBV57LKC.js} +2 -2
  111. package/dist/cli/chunks/{chunk-I7J2ESGR.js → chunk-MGH4XIHH.js} +2 -2
  112. package/dist/cli/chunks/{chunk-Q32UGPWK.js → chunk-MVTUFPM2.js} +2 -2
  113. package/dist/cli/chunks/{chunk-UZL4JYVW.js → chunk-N6CRIUTO.js} +2 -2
  114. package/dist/cli/chunks/{chunk-326V7N25.js → chunk-NBMQOP2R.js} +1 -1
  115. package/dist/cli/chunks/{chunk-ZIKH7U5A.js → chunk-NIJMLEAX.js} +2 -2
  116. package/dist/cli/chunks/{chunk-MYDZBABD.js → chunk-O7TMY4GS.js} +2 -2
  117. package/dist/cli/chunks/{chunk-LVDZ25VX.js → chunk-OFQDM73J.js} +2 -2
  118. package/dist/cli/chunks/{chunk-WBZIOTY6.js → chunk-OG4KHX7S.js} +2 -2
  119. package/dist/cli/chunks/{chunk-GJTH6VBH.js → chunk-OHH6BUZK.js} +1 -1
  120. package/dist/cli/chunks/{chunk-T5N2PIPS.js → chunk-OOK6GPJR.js} +2 -2
  121. package/dist/cli/chunks/{chunk-AXJ75X6I.js → chunk-P7GM3EE7.js} +1 -1
  122. package/dist/cli/chunks/{chunk-IQB5ZBYO.js → chunk-PB2WSCBW.js} +3 -3
  123. package/dist/cli/chunks/{chunk-M36DAETL.js → chunk-PCWZCXBD.js} +2 -2
  124. package/dist/cli/chunks/{chunk-Z3PANQUT.js → chunk-PEA4DVXW.js} +1 -1
  125. package/dist/cli/chunks/{chunk-WBCE6V2N.js → chunk-PJAXWCFC.js} +1 -1
  126. package/dist/cli/chunks/{chunk-V67UQRQN.js → chunk-PMXWDTDK.js} +2 -2
  127. package/dist/cli/chunks/chunk-QIAX3JJB.js +3 -0
  128. package/dist/cli/chunks/chunk-R47LNH5W.js +2 -0
  129. package/dist/cli/chunks/{chunk-A6L2OCMO.js → chunk-RA3MI5WK.js} +2 -2
  130. package/dist/cli/chunks/{chunk-ITM26I6O.js → chunk-RB2SL5GD.js} +2 -2
  131. package/dist/cli/chunks/{chunk-XQBH3366.js → chunk-RG67RZIX.js} +2 -2
  132. package/dist/cli/chunks/{chunk-NBV37CEK.js → chunk-RI4JPBZD.js} +2 -2
  133. package/dist/cli/chunks/{chunk-2Q4Y3VQ6.js → chunk-RJ5CZ7B6.js} +2 -2
  134. package/dist/cli/chunks/{chunk-ATGIGJSL.js → chunk-RJMBHZYL.js} +1 -1
  135. package/dist/cli/chunks/{chunk-MOSXT6AO.js → chunk-RWZ4F44Y.js} +2 -2
  136. package/dist/cli/chunks/{chunk-URWT3EQT.js → chunk-S5D3HCGN.js} +2 -2
  137. package/dist/cli/chunks/{chunk-KQMCCHPO.js → chunk-SCL2OYN7.js} +2 -2
  138. package/dist/cli/chunks/{chunk-Y5VPLOA7.js → chunk-SIUUAKCE.js} +1 -1
  139. package/dist/cli/chunks/{chunk-JIRX6KUR.js → chunk-SJB4KMZS.js} +3 -3
  140. package/dist/cli/chunks/{chunk-TZH2QAFZ.js → chunk-SOSJFEFB.js} +2 -2
  141. package/dist/cli/chunks/{chunk-IBAXNCR2.js → chunk-SZWXUG36.js} +2 -2
  142. package/dist/cli/chunks/{chunk-KTLYL3BS.js → chunk-T3BMCEQR.js} +2 -2
  143. package/dist/cli/chunks/chunk-TB22Y3WW.js +4 -0
  144. package/dist/cli/chunks/{chunk-GJ7DON5S.js → chunk-TVQPYP2Z.js} +3 -3
  145. package/dist/cli/chunks/chunk-U2E5F3VZ.js +14 -0
  146. package/dist/cli/chunks/{chunk-ZSKQPXRW.js → chunk-UK5HY6LC.js} +1 -1
  147. package/dist/cli/chunks/{chunk-RO6HAZLV.js → chunk-UORI2CZ4.js} +1 -1
  148. package/dist/cli/chunks/{chunk-VTGAPHJE.js → chunk-V3NZ23X6.js} +2 -2
  149. package/dist/cli/chunks/{chunk-W7P7EOJ4.js → chunk-VAXQUD5G.js} +1 -1
  150. package/dist/cli/chunks/{chunk-EQG3JYSV.js → chunk-VMSO6DMF.js} +2 -2
  151. package/dist/cli/chunks/{chunk-6UO5YSNN.js → chunk-W3PPYNHF.js} +2 -2
  152. package/dist/cli/chunks/{chunk-FH6N2LKG.js → chunk-W6TJXK5Y.js} +2 -2
  153. package/dist/cli/chunks/{chunk-WJ7657IX.js → chunk-WEDVLKRB.js} +2 -2
  154. package/dist/cli/chunks/{chunk-N653RGT3.js → chunk-WI5AEB7Q.js} +2 -2
  155. package/dist/cli/chunks/{chunk-W5EKSBS4.js → chunk-WO4NSPLX.js} +2 -2
  156. package/dist/cli/chunks/{chunk-YH7VOLBP.js → chunk-WW6WUMS7.js} +2 -2
  157. package/dist/cli/chunks/{chunk-6OL2WES5.js → chunk-WYO5VN2L.js} +1 -1
  158. package/dist/cli/chunks/{chunk-PZK7O445.js → chunk-X5S5UEM6.js} +2 -2
  159. package/dist/cli/chunks/{chunk-NKWMTXBL.js → chunk-XHCCH7UC.js} +3 -3
  160. package/dist/cli/chunks/{chunk-GSC6JXDE.js → chunk-XKIFNKHV.js} +1 -1
  161. package/dist/cli/chunks/{chunk-FNPZINHV.js → chunk-XZ5Z56OP.js} +1 -1
  162. package/dist/cli/chunks/{chunk-6XLCFDIB.js → chunk-YQ6BK7QC.js} +2 -2
  163. package/dist/cli/chunks/{chunk-DNS37AHW.js → chunk-YUWUFYHK.js} +1 -1
  164. package/dist/cli/chunks/{chunk-YJSKT6G6.js → chunk-YZ2AGC7O.js} +1 -1
  165. package/dist/cli/chunks/{chunk-5TEPPW4J.js → chunk-Z56QTRRB.js} +2 -2
  166. package/dist/cli/chunks/{chunk-4MCO43NX.js → chunk-ZAOQIVHG.js} +4 -4
  167. package/dist/cli/chunks/{chunk-TMYGGYRY.js → chunk-ZF5JTQEE.js} +1 -1
  168. package/dist/cli/chunks/{chunk-HYWW4A2E.js → chunk-ZKXZTIVF.js} +2 -2
  169. package/dist/cli/chunks/{chunk-N4MNSEKY.js → chunk-ZP6ANUP7.js} +1 -1
  170. package/dist/cli/chunks/{chunk-5DFPAJ5O.js → chunk-ZURYZEHX.js} +2 -2
  171. package/dist/cli/chunks/{ci-JNBOR6FP.js → ci-NGMGB43T.js} +3 -3
  172. package/dist/cli/chunks/{ci-output-FYNKONEQ.js → ci-output-BMJABAEX.js} +2 -2
  173. package/dist/cli/chunks/{circuit-breaker-KOIXRDAD.js → circuit-breaker-GYD5CMJQ.js} +2 -2
  174. package/dist/cli/chunks/{claude-flow-setup-4CO7KHRN.js → claude-flow-setup-MMOYVBVD.js} +2 -2
  175. package/dist/cli/chunks/client-FUHNNK5O.js +2 -0
  176. package/dist/cli/chunks/{cline-installer-CMYAPKK5.js → cline-installer-B2SOZ44R.js} +2 -2
  177. package/dist/cli/chunks/{code-WFIAEP3H.js → code-V3FIRAXD.js} +3 -3
  178. package/dist/cli/chunks/{code-index-extractor-IYM6HWJN.js → code-index-extractor-CV6A756Z.js} +2 -2
  179. package/dist/cli/chunks/{codex-installer-DORVWRSU.js → codex-installer-EUC6J47Y.js} +2 -2
  180. package/dist/cli/chunks/{completions-54VM2MX2.js → completions-DQQIBAHR.js} +2 -2
  181. package/dist/cli/chunks/{complexity-analyzer-EGZDP5N4.js → complexity-analyzer-HPXMXP5I.js} +2 -2
  182. package/dist/cli/chunks/{continuedev-installer-4SDVDD4T.js → continuedev-installer-RCIYXH6V.js} +2 -2
  183. package/dist/cli/chunks/{copilot-installer-7FJQ7PCL.js → copilot-installer-VUH32SHF.js} +2 -2
  184. package/dist/cli/chunks/core-handlers-F7TLX4LM.js +2 -0
  185. package/dist/cli/chunks/cost-tracker-YLCKLOAL.js +2 -0
  186. package/dist/cli/chunks/{coverage-DI5LDRJ7.js → coverage-IVKDV236.js} +3 -3
  187. package/dist/cli/chunks/cross-domain-router-EGWPY67O.js +2 -0
  188. package/dist/cli/chunks/{cursor-installer-RTSZP5YD.js → cursor-installer-B42FN62K.js} +2 -2
  189. package/dist/cli/chunks/{daemon-SP3APEZY.js → daemon-DECQRQII.js} +3 -3
  190. package/dist/cli/chunks/{daemon-LM7LETPV.js → daemon-IPTOSCHM.js} +4 -4
  191. package/dist/cli/chunks/{dag-attention-scheduler-C3QBODFE.js → dag-attention-scheduler-RY7CDYSC.js} +2 -2
  192. package/dist/cli/chunks/{detect-I4RBUFFJ.js → detect-NW53BMJN.js} +2 -2
  193. package/dist/cli/chunks/{dist-node-PT6TCBCO.js → dist-node-LE6KHXAB.js} +2 -2
  194. package/dist/cli/chunks/{domain-handler-MJMTMB5X.js → domain-handler-JGXFT4LW.js} +2 -2
  195. package/dist/cli/chunks/{domain-plugins-Y4A2WYJW.js → domain-plugins-GY3RYKKK.js} +2 -2
  196. package/dist/cli/chunks/{domain-transfer-DUO42TLA.js → domain-transfer-CGBRXNTC.js} +2 -2
  197. package/dist/cli/chunks/dream-V4QN6OF5.js +2 -0
  198. package/dist/cli/chunks/{embed-and-insert-pattern-66ZQK4AI.js → embed-and-insert-pattern-65H4XHWR.js} +2 -2
  199. package/dist/cli/chunks/{eval-NQ7H27UF.js → eval-YPYIZQUR.js} +2 -2
  200. package/dist/cli/chunks/{experience-capture-middleware-MHEYPTIG.js → experience-capture-middleware-4JXVF5PL.js} +3 -3
  201. package/dist/cli/chunks/{fast-paths-YYDGN6ZC.js → fast-paths-HYQTAF2S.js} +2 -2
  202. package/dist/cli/chunks/{feature-flags-FY4DOYS2.js → feature-flags-HNSAFFX2.js} +2 -2
  203. package/dist/cli/chunks/{feature-flags-YFGUORHY.js → feature-flags-YACUH6OW.js} +2 -2
  204. package/dist/cli/chunks/{file-discovery-TOMDY7TK.js → file-discovery-R73BYEXB.js} +2 -2
  205. package/dist/cli/chunks/{fleet-MO3UCWB4.js → fleet-6M3BP4OO.js} +3 -3
  206. package/dist/cli/chunks/{gnn-wrapper-SLW4PPXQ.js → gnn-wrapper-QLD7KHXV.js} +2 -2
  207. package/dist/cli/chunks/{heartbeat-handler-36RFCP4E.js → heartbeat-handler-EZP333X4.js} +4 -4
  208. package/dist/cli/chunks/heartbeat-scheduler-3N3L6CRM.js +2 -0
  209. package/dist/cli/chunks/hnsw-adapter-2BXJYDXI.js +2 -0
  210. package/dist/cli/chunks/hnsw-index-2DLI5OVO.js +2 -0
  211. package/dist/cli/chunks/{hnsw-legacy-bridge-BJLWBKHE.js → hnsw-legacy-bridge-47CUCSAU.js} +2 -2
  212. package/dist/cli/chunks/{hnswlib-node-RAYNVJCJ.js → hnswlib-node-SVNYDJZH.js} +2 -2
  213. package/dist/cli/chunks/{hooks-JMHFWVEQ.js → hooks-6V5LMWP6.js} +10 -10
  214. package/dist/cli/chunks/hybrid-backend-OW4J65YH.js +2 -0
  215. package/dist/cli/chunks/{hypergraph-engine-JUDBKPOX.js → hypergraph-engine-L2FOBIFF.js} +2 -2
  216. package/dist/cli/chunks/{hypergraph-handler-AXTWXOZU.js → hypergraph-handler-DU6Z57EE.js} +3 -3
  217. package/dist/cli/chunks/impact-analyzer-ZH5I2RG6.js +2 -0
  218. package/dist/cli/chunks/{init-handler-PARJNZFF.js → init-handler-HETPWU67.js} +6 -6
  219. package/dist/cli/chunks/init-wizard-NIKM3ZOK.js +2 -0
  220. package/dist/cli/chunks/kernel-2EOSVM6X.js +2 -0
  221. package/dist/cli/chunks/{kilocode-installer-22HX2E4V.js → kilocode-installer-NHKYGJ7Q.js} +2 -2
  222. package/dist/cli/chunks/{kiro-installer-OVPBLY7J.js → kiro-installer-24UK6GGR.js} +2 -2
  223. package/dist/cli/chunks/knowledge-graph-D3BPWNNO.js +2 -0
  224. package/dist/cli/chunks/{learning-DWXPJ3R6.js → learning-QLVRZNHT.js} +3 -3
  225. package/dist/cli/chunks/{llm-router-7PPVVKNG.js → llm-router-XRMI2VMG.js} +4 -4
  226. package/dist/cli/chunks/llm-router-service-TJPPZFUN.js +2 -0
  227. package/dist/cli/chunks/{load-VI5XHNZA.js → load-W5UWL5C7.js} +2 -2
  228. package/dist/cli/chunks/load-test-RFT7IDOL.js +2 -0
  229. package/dist/cli/chunks/{mcp-UW4Z3Z64.js → mcp-N7ALQ4BL.js} +2 -2
  230. package/dist/cli/chunks/{memory-UD2KCB5M.js → memory-WV52DLSA.js} +5 -5
  231. package/dist/cli/chunks/memory-backend-O2O4CFKZ.js +2 -0
  232. package/dist/cli/chunks/memory-handlers-DAEGUDBD.js +2 -0
  233. package/dist/cli/chunks/{multi-model-executor-5O4WWU5Z.js → multi-model-executor-3FVTZCSO.js} +2 -2
  234. package/dist/cli/chunks/{opencode-installer-DTRFDGM7.js → opencode-installer-NTPWGHUW.js} +2 -2
  235. package/dist/cli/chunks/{orchestrator-ENJIKV6Z.js → orchestrator-ORGJ6VAA.js} +85 -26
  236. package/dist/cli/chunks/pattern-null-store-TUBNXS34.js +2 -0
  237. package/dist/cli/chunks/{pattern-usage-recorder-QPNIU5PD.js → pattern-usage-recorder-WWXHUH5U.js} +2 -2
  238. package/dist/cli/chunks/{pipeline-G3JYDNPE.js → pipeline-ZOKZFXTH.js} +2 -2
  239. package/dist/cli/chunks/{platform-P4WR6N3D.js → platform-CDNL322F.js} +2 -2
  240. package/dist/cli/chunks/{plugin-C7763Q5W.js → plugin-ZVLFNZZ4.js} +2 -2
  241. package/dist/cli/chunks/{prime-radiant-advanced-wasm-DH6R3XSZ.js → prime-radiant-advanced-wasm-FVJDU2JY.js} +2 -2
  242. package/dist/cli/chunks/{project-root-7DTXDLEG.js → project-root-UCHQH3QL.js} +2 -2
  243. package/dist/cli/chunks/protocol-executor-6FQTTO3Y.js +2 -0
  244. package/dist/cli/chunks/{protocol-handler-EODULGOZ.js → protocol-handler-4YBN5R23.js} +2 -2
  245. package/dist/cli/chunks/{prove-A7G3SIOF.js → prove-BHDHY664.js} +2 -2
  246. package/dist/cli/chunks/qe-reasoning-bank-TKPND56C.js +2 -0
  247. package/dist/cli/chunks/{quality-JTURFUX3.js → quality-46AK277P.js} +2 -2
  248. package/dist/cli/chunks/{quality-gate-M2EI754V.js → quality-gate-WANE7TCN.js} +3 -3
  249. package/dist/cli/chunks/queen-coordinator-DWMXLPJG.js +2 -0
  250. package/dist/cli/chunks/{real-embeddings-DI7JMCG7.js → real-embeddings-56MNGJGJ.js} +2 -2
  251. package/dist/cli/chunks/{ref-validation-MSFMNKDR.js → ref-validation-S7UWXQIP.js} +2 -2
  252. package/dist/cli/chunks/{roocode-installer-XIMFFHOH.js → roocode-installer-TEYOQYL6.js} +2 -2
  253. package/dist/cli/chunks/router-QIMUYRCC.js +2 -0
  254. package/dist/cli/chunks/routing-feedback-4OH5ZNF4.js +2 -0
  255. package/dist/cli/chunks/{routing-handler-MCDKNBQW.js → routing-handler-KDTLMRWD.js} +2 -2
  256. package/dist/cli/chunks/{ruvector-commands-OBSYAK2X.js → ruvector-commands-AOUDXCYE.js} +2 -2
  257. package/dist/cli/chunks/rvf-dual-writer-S6JBZL54.js +2 -0
  258. package/dist/cli/chunks/rvf-migration-adapter-TSGMLMYR.js +2 -0
  259. package/dist/cli/chunks/{rvf-migration-coordinator-4DTRIHY6.js → rvf-migration-coordinator-V74MVBHS.js} +2 -2
  260. package/dist/cli/chunks/rvf-native-adapter-Z7QOW47S.js +2 -0
  261. package/dist/cli/chunks/{rvf-store-integrity-CWAVMRC4.js → rvf-store-integrity-QI47Y354.js} +2 -2
  262. package/dist/cli/chunks/safe-db-JLOVBJNC.js +2 -0
  263. package/dist/cli/chunks/schedule-IM6XOBGR.js +2 -0
  264. package/dist/cli/chunks/scheduler-XL2SVVK5.js +2 -0
  265. package/dist/cli/chunks/{security-74TWSO74.js → security-SN6MWOJT.js} +3 -3
  266. package/dist/cli/chunks/{shared-rvf-adapter-ZHNAGE5H.js → shared-rvf-adapter-2LB56LP4.js} +2 -2
  267. package/dist/cli/chunks/{shared-rvf-dual-writer-BS5WAVCC.js → shared-rvf-dual-writer-WU7PFKQM.js} +2 -2
  268. package/dist/cli/chunks/sqlite-persistence-LWMIIC4U.js +2 -0
  269. package/dist/cli/chunks/{standalone-memory-3HGHTE7S.js → standalone-memory-F6FSRFWC.js} +2 -2
  270. package/dist/cli/chunks/{status-handler-XWEEGNGH.js → status-handler-DHD5MS4G.js} +2 -2
  271. package/dist/cli/chunks/{structural-health-TB5JGMVS.js → structural-health-P6HPSQMR.js} +2 -2
  272. package/dist/cli/chunks/{sync-T4VLBURM.js → sync-LISJGDSE.js} +2 -2
  273. package/dist/cli/chunks/sync-SNAXAVCN.js +2 -0
  274. package/dist/cli/chunks/{task-handler-RQ65QKXX.js → task-handler-ZT44NT5Z.js} +2 -2
  275. package/dist/cli/chunks/{task-handlers-USYWJ4H2.js → task-handlers-R6DQ5324.js} +3 -3
  276. package/dist/cli/chunks/test-MUFHR4JQ.js +34 -0
  277. package/dist/cli/chunks/test-scheduling-TAUSLZJP.js +15 -0
  278. package/dist/cli/chunks/token-bootstrap-UGRH7OPU.js +2 -0
  279. package/dist/cli/chunks/{token-usage-CISTB5K5.js → token-usage-IX65ECBR.js} +2 -2
  280. package/dist/cli/chunks/{transformers-C7LV763N.js → transformers-QKPSVW2W.js} +2 -2
  281. package/dist/cli/chunks/{tree-sitter-wasm-parser-P26JC3YV.js → tree-sitter-wasm-parser-Z7PPA2JO.js} +2 -2
  282. package/dist/cli/chunks/{types-YMVMKIWB.js → types-ULNNGGGH.js} +2 -2
  283. package/dist/cli/chunks/unified-memory-F5IJY7W7.js +2 -0
  284. package/dist/cli/chunks/unified-memory-hnsw-C3WAMAQL.js +2 -0
  285. package/dist/cli/chunks/unified-persistence-EWXXOTCB.js +2 -0
  286. package/dist/cli/chunks/{upgrade-U2REOPAW.js → upgrade-ECI3YUYA.js} +2 -2
  287. package/dist/cli/chunks/{validate-NDTCKN7P.js → validate-3JKRUW2S.js} +2 -2
  288. package/dist/cli/chunks/{validate-swarm-OJUGVH5Q.js → validate-swarm-LZWANCIE.js} +2 -2
  289. package/dist/cli/chunks/visual-security-CKLTAIAB.js +2 -0
  290. package/dist/cli/chunks/{web-tree-sitter-2CLRSA7K.js → web-tree-sitter-N5V4A6XG.js} +2 -2
  291. package/dist/cli/chunks/{windsurf-installer-DSUJJ4PG.js → windsurf-installer-5TBM5B3C.js} +2 -2
  292. package/dist/cli/chunks/{witness-chain-TEGL4ZWB.js → witness-chain-MFP3HBWQ.js} +2 -2
  293. package/dist/cli/chunks/witness-chain-Z6LWFEZS.js +2 -0
  294. package/dist/cli/chunks/witness-chain-repair-5QWRFVUK.js +2 -0
  295. package/dist/cli/chunks/{witness-chain-verifier-SPXKFC67.js → witness-chain-verifier-SRAT7LVY.js} +2 -2
  296. package/dist/cli/chunks/{witness-key-manager-EALOV4OV.js → witness-key-manager-FYZXQTLJ.js} +2 -2
  297. package/dist/cli/chunks/{workflow-PYI6HCAG.js → workflow-M7TUYYXY.js} +5 -5
  298. package/dist/cli/chunks/workflow-orchestrator-OFTAR2NA.js +2 -0
  299. package/dist/cli/chunks/wrappers-COU73OQ6.js +2 -0
  300. package/dist/cli/commands/test.js +30 -12
  301. package/dist/cli/commands/workflow.js +3 -0
  302. package/dist/cli/scheduler/persistent-scheduler.d.ts +2 -0
  303. package/dist/cli/scheduler/persistent-scheduler.js +12 -2
  304. package/dist/cli/utils/generated-test-writer.d.ts +35 -0
  305. package/dist/cli/utils/generated-test-writer.js +44 -0
  306. package/dist/context/compiler.js +4 -1
  307. package/dist/coordination/consensus/providers/ollama-provider.js +16 -27
  308. package/dist/coordination/consensus/providers/openrouter-provider.js +13 -24
  309. package/dist/coordination/handlers/test-execution-handlers.js +4 -2
  310. package/dist/coordination/protocols/defect-investigation.js +4 -1
  311. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.d.ts +3 -0
  312. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +57 -0
  313. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +127 -39
  314. package/dist/domains/coverage-analysis/services/gap-detector.js +3 -1
  315. package/dist/domains/learning-optimization/services/learning-coordinator.js +4 -2
  316. package/dist/domains/test-execution/services/flaky-detector.js +8 -2
  317. package/dist/domains/test-execution/services/retry-handler.js +23 -20
  318. package/dist/domains/test-execution/services/test-executor.js +5 -2
  319. package/dist/domains/test-generation/services/test-generator.js +5 -2
  320. package/dist/governance/compliance-reporter.js +8 -7
  321. package/dist/governance/proof-envelope-integration.js +3 -1
  322. package/dist/init/phases/07-hooks.js +30 -4
  323. package/dist/init/phases/10-workers.js +42 -6
  324. package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.d.ts +4 -1
  325. package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.js +6 -2
  326. package/dist/integrations/browser/qe-dashboard/wasm-vector-store.js +2 -1
  327. package/dist/integrations/ruvector/coverage-router.d.ts +3 -1
  328. package/dist/integrations/ruvector/coverage-router.js +7 -6
  329. package/dist/integrations/ruvector/diff-risk-classifier.js +5 -4
  330. package/dist/integrations/ruvector/rvf-dual-writer.js +10 -1
  331. package/dist/integrations/vibium/runtime.js +2 -6
  332. package/dist/learning/dream/dream-engine.d.ts +5 -0
  333. package/dist/learning/dream/dream-engine.js +20 -3
  334. package/dist/learning/embedding-space.d.ts +18 -0
  335. package/dist/learning/embedding-space.js +33 -0
  336. package/dist/learning/rvf-pattern-store.js +19 -5
  337. package/dist/mcp/bundle.js +442 -441
  338. package/dist/mcp/handlers/domain-handler-configs.d.ts +42 -0
  339. package/dist/mcp/handlers/handler-factory.js +3 -1
  340. package/dist/mcp/handlers/save-results-option.d.ts +62 -0
  341. package/dist/mcp/handlers/save-results-option.js +35 -0
  342. package/dist/mcp/protocol-server.js +22 -11
  343. package/dist/mcp/security/rate-limiter.d.ts +8 -1
  344. package/dist/mcp/security/rate-limiter.js +33 -4
  345. package/dist/mcp/services/session-resume.js +11 -0
  346. package/dist/mcp/services/session-store.d.ts +31 -2
  347. package/dist/mcp/services/session-store.js +95 -16
  348. package/dist/mcp/services/session-write-buffer.d.ts +55 -0
  349. package/dist/mcp/services/session-write-buffer.js +144 -0
  350. package/dist/mcp/types.d.ts +18 -0
  351. package/dist/memory/crdt/convergence-tracker.js +14 -24
  352. package/dist/memory/crdt/crdt-store.js +15 -0
  353. package/dist/memory/crdt/g-counter.js +10 -8
  354. package/dist/memory/crdt/lww-register.js +3 -3
  355. package/dist/memory/crdt/or-set.js +18 -0
  356. package/dist/planning/goap-planner.js +18 -10
  357. package/dist/shared/embeddings/embedding-cache.d.ts +3 -3
  358. package/dist/shared/embeddings/embedding-cache.js +8 -8
  359. package/dist/shared/embeddings/nomic-embedder.js +9 -6
  360. package/dist/shared/embeddings/ollama-client.d.ts +1 -1
  361. package/dist/shared/embeddings/ollama-client.js +30 -31
  362. package/dist/shared/git/git-analyzer.d.ts +4 -1
  363. package/dist/shared/git/git-analyzer.js +9 -4
  364. package/dist/shared/llm/cache.js +1 -1
  365. package/dist/shared/llm/cost-tracker.js +8 -6
  366. package/dist/shared/llm/providers/azure-openai.js +5 -21
  367. package/dist/shared/llm/providers/bedrock.js +5 -21
  368. package/dist/shared/llm/providers/claude.js +5 -21
  369. package/dist/shared/llm/providers/cognitum.js +5 -17
  370. package/dist/shared/llm/providers/gemini.js +9 -23
  371. package/dist/shared/llm/providers/ollama.js +5 -21
  372. package/dist/shared/llm/providers/openai.js +5 -21
  373. package/dist/shared/llm/providers/openrouter.js +9 -23
  374. package/dist/shared/llm/providers/response-deadline.d.ts +3 -0
  375. package/dist/shared/llm/providers/response-deadline.js +100 -0
  376. package/dist/shared/llm/spend-ledger.js +3 -2
  377. package/dist/shared/metrics/code-metrics.d.ts +1 -0
  378. package/dist/shared/metrics/code-metrics.js +3 -44
  379. package/dist/shared/metrics/cognitive-complexity.d.ts +17 -0
  380. package/dist/shared/metrics/cognitive-complexity.js +108 -0
  381. package/dist/shared/npm-cli-invocation.d.ts +21 -0
  382. package/dist/shared/npm-cli-invocation.js +28 -0
  383. package/dist/shared/optional-module.js +24 -0
  384. package/dist/shared/test-runner-args.d.ts +42 -0
  385. package/dist/shared/test-runner-args.js +74 -0
  386. package/dist/shared/utils/safe-record.d.ts +18 -0
  387. package/dist/shared/utils/safe-record.js +28 -0
  388. package/dist/test-scheduling/executors/vitest-executor.js +23 -5
  389. package/dist/workers/quality-daemon/git-watcher.js +5 -0
  390. package/package.json +1 -1
  391. package/dist/adapters/ag-ui/json-patch-utils.d.ts +0 -136
  392. package/dist/adapters/ag-ui/json-patch-utils.js +0 -575
  393. package/dist/cli/chunks/adapter-EUIELRLI.js +0 -2
  394. package/dist/cli/chunks/aqe-learning-engine-LXRKHASR.js +0 -2
  395. package/dist/cli/chunks/base-4DSLX33Y.js +0 -2
  396. package/dist/cli/chunks/browser-workflow-AWCQLQZK.js +0 -2
  397. package/dist/cli/chunks/chunk-E2QHUMCR.js +0 -2
  398. package/dist/cli/chunks/chunk-I7ECEOFV.js +0 -2
  399. package/dist/cli/chunks/chunk-LW4BCFIV.js +0 -15
  400. package/dist/cli/chunks/chunk-QJGKL67W.js +0 -54
  401. package/dist/cli/chunks/chunk-RLQ4MYB6.js +0 -3
  402. package/dist/cli/chunks/chunk-X43HA3RF.js +0 -14
  403. package/dist/cli/chunks/chunk-Z3K4JZXQ.js +0 -4
  404. package/dist/cli/chunks/client-UJVHZXNQ.js +0 -2
  405. package/dist/cli/chunks/core-handlers-AFXZOSH3.js +0 -2
  406. package/dist/cli/chunks/cost-tracker-D6YSKTQC.js +0 -2
  407. package/dist/cli/chunks/cross-domain-router-ZLNVKLIR.js +0 -2
  408. package/dist/cli/chunks/dream-4OPJXXEG.js +0 -2
  409. package/dist/cli/chunks/heartbeat-scheduler-J5KLHO6C.js +0 -2
  410. package/dist/cli/chunks/hnsw-adapter-56P6XSFR.js +0 -2
  411. package/dist/cli/chunks/hnsw-index-GFZ6XCEW.js +0 -2
  412. package/dist/cli/chunks/hybrid-backend-TUBWJDDN.js +0 -2
  413. package/dist/cli/chunks/impact-analyzer-FXVGKS6B.js +0 -2
  414. package/dist/cli/chunks/init-wizard-LK73HQ7W.js +0 -2
  415. package/dist/cli/chunks/kernel-TCZDKRSI.js +0 -2
  416. package/dist/cli/chunks/knowledge-graph-TWMB2GH2.js +0 -2
  417. package/dist/cli/chunks/llm-router-service-HPDH3P77.js +0 -2
  418. package/dist/cli/chunks/load-test-HTYOUYSN.js +0 -2
  419. package/dist/cli/chunks/memory-backend-X5BE2MPK.js +0 -2
  420. package/dist/cli/chunks/memory-handlers-SQXMFX5X.js +0 -2
  421. package/dist/cli/chunks/pattern-null-store-OCQGQZU6.js +0 -2
  422. package/dist/cli/chunks/protocol-executor-CYEQHQCL.js +0 -2
  423. package/dist/cli/chunks/qe-reasoning-bank-GSTA5WJ4.js +0 -2
  424. package/dist/cli/chunks/queen-coordinator-Y2Q5RQL7.js +0 -2
  425. package/dist/cli/chunks/router-4QB5L4IW.js +0 -2
  426. package/dist/cli/chunks/routing-feedback-YBVHJY5L.js +0 -2
  427. package/dist/cli/chunks/rvf-dual-writer-T5B456SW.js +0 -2
  428. package/dist/cli/chunks/rvf-migration-adapter-2O2NL7ZF.js +0 -2
  429. package/dist/cli/chunks/rvf-native-adapter-RDB3GWTW.js +0 -2
  430. package/dist/cli/chunks/safe-db-YXVMLFU4.js +0 -2
  431. package/dist/cli/chunks/schedule-K6XWCCSK.js +0 -2
  432. package/dist/cli/chunks/scheduler-4MW22D6Q.js +0 -2
  433. package/dist/cli/chunks/sqlite-persistence-UVDHUSAU.js +0 -2
  434. package/dist/cli/chunks/sync-LSPNSVDI.js +0 -2
  435. package/dist/cli/chunks/test-M2XTKD62.js +0 -33
  436. package/dist/cli/chunks/test-scheduling-GYXJQHJL.js +0 -15
  437. package/dist/cli/chunks/token-bootstrap-OTEMRUFR.js +0 -2
  438. package/dist/cli/chunks/unified-memory-UUK77NSE.js +0 -2
  439. package/dist/cli/chunks/unified-memory-hnsw-JOUE6WNF.js +0 -2
  440. package/dist/cli/chunks/unified-persistence-3DRJGNQE.js +0 -2
  441. package/dist/cli/chunks/visual-security-EM7FQG5X.js +0 -2
  442. package/dist/cli/chunks/witness-chain-7NZ6IIUN.js +0 -2
  443. package/dist/cli/chunks/witness-chain-repair-ZWS5WXFL.js +0 -2
  444. package/dist/cli/chunks/workflow-orchestrator-3C3S5FIM.js +0 -2
  445. package/dist/cli/chunks/wrappers-NXJHGK3W.js +0 -2
@@ -1,5 +1,5 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.2");process.exit(0)}
2
- import"./chunk-A6L2OCMO.js";import{b as $}from"./chunk-ATGIGJSL.js";import{a as k,b as W,c as v,g as C}from"./chunk-RLQ4MYB6.js";import{c as b}from"./chunk-URWT3EQT.js";import"./chunk-2AWU2E6R.js";import"./chunk-3KTAMNKI.js";import"./chunk-D75HDHX3.js";import{Command as D}from"commander";import o from"chalk";function O(w,i){let h=w.indexOf("=");return h>0&&(i[w.substring(0,h)]=w.substring(h+1)),i}function V(w,i,h){let m=new D("workflow").description("Manage QE workflows and pipelines (ADR-041)");return m.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(n,t)=>{if(!await h())return;let u=(await import("path")).resolve(n);try{console.log(o.blue(`
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.4");process.exit(0)}
2
+ import"./chunk-RA3MI5WK.js";import{b as $}from"./chunk-RJMBHZYL.js";import{a as k,b as W,c as v,g as C}from"./chunk-QIAX3JJB.js";import{c as b}from"./chunk-S5D3HCGN.js";import"./chunk-54XTJBHV.js";import"./chunk-JL3TI43V.js";import"./chunk-5H7MR6HP.js";import{Command as D}from"commander";import o from"chalk";function O(w,i){let h=w.indexOf("=");return h>0&&(i[w.substring(0,h)]=w.substring(h+1)),i}function V(w,i,h){let m=new D("workflow").description("Manage QE workflows and pipelines (ADR-041)");return m.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(n,t)=>{if(!await h())return;let u=(await import("path")).resolve(n);try{console.log(o.blue(`
3
3
  Running workflow from: ${n}
4
4
  `));let l=k(u);if(!l.success||!l.workflow){console.log(o.red("Failed to parse pipeline:"));for(let g of l.errors)console.log(o.red(` ${g}`));await i(1)}let f={...b(t.params,"params")};if(l.pipeline){for(let g of l.pipeline.stages)if(g.params)for(let[y,p]of Object.entries(g.params))f[y]=p}if(!w.workflowOrchestrator.getWorkflow(l.workflow.id)){let g=w.workflowOrchestrator.registerWorkflow(l.workflow);g.success||(console.log(o.red(`Failed to register workflow: ${g.error.message}`)),await i(1))}let c=await w.workflowOrchestrator.executeWorkflow(l.workflow.id,f);if(!c.success){console.log(o.red(`Failed to start workflow: ${c.error.message}`)),await i(1);return}let a=c.value;if(console.log(o.cyan(` Execution ID: ${a}`)),console.log(o.gray(` Workflow: ${l.workflow.name}`)),console.log(o.gray(` Stages: ${l.workflow.steps.length}`)),console.log(""),t.watch){console.log(o.blue(`Workflow Progress:
5
5
  `));let g,y=Date.now();for(;;){let d=w.workflowOrchestrator.getWorkflowStatus(a);if(!d)break;if(!g||g.progress!==d.progress||g.status!==d.status||JSON.stringify(g.currentSteps)!==JSON.stringify(d.currentSteps)){process.stdout.write("\r\x1B[K");let S="\u2588".repeat(Math.floor(d.progress/5))+"\u2591".repeat(20-Math.floor(d.progress/5)),R=d.status==="completed"?o.green:d.status==="failed"?o.red:d.status==="running"?o.yellow:o.gray;console.log(` [${S}] ${d.progress}% - ${R(d.status)}`),d.currentSteps.length>0&&t.verbose&&console.log(o.gray(` Running: ${d.currentSteps.join(", ")}`)),g=d}if(d.status==="completed"||d.status==="failed"||d.status==="cancelled")break;await new Promise(S=>setTimeout(S,500))}let p=w.workflowOrchestrator.getWorkflowStatus(a);if(p){console.log("");let d=p.duration||Date.now()-y;p.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(d)}`)),console.log(o.gray(` Completed: ${p.completedSteps.length} stages`)),p.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${p.skippedSteps.length} stages`))):p.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${p.error}`)),console.log(o.gray(` Failed stages: ${p.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${p.status}`))}console.log(""),await i(p?.status==="completed"?0:1);return}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${a}' to check progress`));console.log(""),await i(0)}catch(l){console.error(o.red(`
@@ -10,7 +10,7 @@ Note: Scheduled workflows require daemon mode to run automatically`)),console.lo
10
10
  Failed to schedule workflow:`),l),await i(1)}}),m.command("list").description("List workflows").option("-s, --scheduled","Show only scheduled workflows").option("-a, --active","Show only active executions").option("--all","Show all workflows (registered + scheduled + active)").action(async n=>{if(await h())try{if(console.log(o.blue(`
11
11
  Workflows
12
12
  `)),n.scheduled||n.all){console.log(o.cyan("Scheduled Workflows:"));let t=await w.persistentScheduler.getSchedules();if(t.length===0)console.log(o.gray(` No scheduled workflows
13
- `));else for(let e of t){let u=e.enabled?o.green("*"):o.gray("o");console.log(` ${u} ${o.white(e.workflowId)}`),console.log(o.gray(` ID: ${e.id}`)),console.log(o.gray(` Schedule: ${e.schedule} (${e.scheduleDescription})`)),console.log(o.gray(` File: ${e.pipelinePath}`)),console.log(o.gray(` Next run: ${e.nextRun}`)),e.lastRun&&console.log(o.gray(` Last run: ${e.lastRun}`)),console.log(o.gray(` Status: ${e.enabled?o.green("enabled"):o.yellow("disabled")}`)),console.log("")}}if(n.active||n.all){console.log(o.cyan("Active Executions:"));let t=w.workflowOrchestrator.getActiveExecutions();if(t.length===0)console.log(o.gray(` No active executions
13
+ `));else for(let e of t){let u=e.enabled?o.green("*"):o.gray("o");console.log(` ${u} ${o.white(e.workflowId)}`),console.log(o.gray(` ID: ${e.id}`)),console.log(o.gray(` Schedule: ${e.schedule} (${e.scheduleDescription})`)),console.log(o.gray(` File: ${e.pipelinePath}`)),console.log(o.gray(` Next run: ${e.nextRun}`)),e.lastRun&&console.log(o.gray(` Last run: ${e.lastRun}`)),console.log(o.gray(` Status: ${e.enabled?o.green("enabled"):o.yellow("disabled")}`)),e.disabledReason&&console.log(o.yellow(` Reason: ${e.disabledReason}`)),console.log("")}}if(n.active||n.all){console.log(o.cyan("Active Executions:"));let t=w.workflowOrchestrator.getActiveExecutions();if(t.length===0)console.log(o.gray(` No active executions
14
14
  `));else for(let e of t){let u=e.status==="running"?o.yellow:o.gray;console.log(` ${u("*")} ${o.white(e.workflowName)}`),console.log(o.gray(` Execution: ${e.executionId}`)),console.log(o.gray(` Status: ${e.status}`)),console.log(o.gray(` Progress: ${e.progress}%`)),e.currentSteps.length>0&&console.log(o.gray(` Current: ${e.currentSteps.join(", ")}`)),console.log("")}}if(!n.scheduled&&!n.active||n.all){console.log(o.cyan("Registered Workflows:"));let t=w.workflowOrchestrator.listWorkflows();if(t.length===0)console.log(o.gray(` No registered workflows
15
15
  `));else for(let e of t)console.log(` ${o.white(e.name)} (${o.cyan(e.id)})`),console.log(o.gray(` Version: ${e.version}`)),console.log(o.gray(` Steps: ${e.stepCount}`)),e.description&&console.log(o.gray(` ${e.description}`)),e.tags&&e.tags.length>0&&console.log(o.gray(` Tags: ${e.tags.join(", ")}`)),e.triggers&&e.triggers.length>0&&console.log(o.gray(` Triggers: ${e.triggers.join(", ")}`)),console.log("")}await i(0)}catch(t){console.error(o.red(`
16
16
  Failed to list workflows:`),t),await i(1)}}),m.command("validate <file>").description("Validate a pipeline YAML file").option("-v, --verbose","Show detailed validation results").action(async(n,t)=>{let e=await import("fs"),l=(await import("path")).resolve(n);try{console.log(o.blue(`
@@ -35,10 +35,10 @@ Workflow cancelled: ${n}
35
35
  `)):console.log(o.red(`
36
36
  Failed to cancel workflow: ${t.error.message}
37
37
  `)),await i(t.success?0:1)}catch(t){console.error(o.red(`
38
- Failed to cancel workflow:`),t),await i(1)}}),m.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:n}=await import("./browser-workflow-AWCQLQZK.js"),e=await new n().invoke({});if(e.success&&e.data){console.log(o.blue(`
38
+ Failed to cancel workflow:`),t),await i(1)}}),m.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:n}=await import("./browser-workflow-6M6VLWRF.js"),e=await new n().invoke({});if(e.success&&e.data){console.log(o.blue(`
39
39
  Browser Workflow Templates:
40
40
  `));for(let u of e.data.availableTemplates)console.log(` ${o.cyan(u)}`);console.log("")}else console.log(o.red(`Failed: ${e.error||"Unknown error"}`));await i(0)}catch(n){console.error(o.red(`
41
- Failed:`),n),await i(1)}}),m.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",O,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(n,t)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-AWCQLQZK.js"),{writeOutput:u,toJSON:l}=await import("./ci-output-FYNKONEQ.js"),s=new e,f={variables:t.var||{}};if(t.yaml)f.workflowYaml=t.yaml;else if(n)if(n.endsWith(".yaml")||n.endsWith(".yml")){let c=await import("fs"),g=(await import("path")).resolve(n);c.existsSync(g)||(console.log(o.red(`
41
+ Failed:`),n),await i(1)}}),m.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",O,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(n,t)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-6M6VLWRF.js"),{writeOutput:u,toJSON:l}=await import("./ci-output-BMJABAEX.js"),s=new e,f={variables:t.var||{}};if(t.yaml)f.workflowYaml=t.yaml;else if(n)if(n.endsWith(".yaml")||n.endsWith(".yml")){let c=await import("fs"),g=(await import("path")).resolve(n);c.existsSync(g)||(console.log(o.red(`
42
42
  File not found: ${g}
43
43
  `)),await i(1)),f.workflowYaml=c.readFileSync(g,"utf-8")}else f.templateName=n;else console.log(o.red(`
44
44
  Provide a template name or --yaml. Use "workflow browser-list" to see templates.
@@ -0,0 +1,2 @@
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.4");process.exit(0)}
2
+ import{a,b,c,d}from"./chunk-CQ3WSTJ2.js";import"./chunk-V3NZ23X6.js";import"./chunk-BY5PLEPZ.js";import"./chunk-FRBCX46J.js";import"./chunk-S5D3HCGN.js";import"./chunk-6HTO4BLV.js";import"./chunk-HCDTLV5J.js";import"./chunk-RJ5CZ7B6.js";import"./chunk-W6TJXK5Y.js";import"./chunk-NIJMLEAX.js";import"./chunk-OG4KHX7S.js";import"./chunk-RB2SL5GD.js";import"./chunk-33IUCP34.js";import"./chunk-PEA4DVXW.js";import"./chunk-54XTJBHV.js";import"./chunk-WW6WUMS7.js";import"./chunk-5XXLWJU7.js";import"./chunk-LXYTC62V.js";import"./chunk-Z56QTRRB.js";import"./chunk-JL3TI43V.js";import"./chunk-K2VUYRMG.js";import"./chunk-O7TMY4GS.js";import"./chunk-WO4NSPLX.js";import"./chunk-X5S5UEM6.js";import"./chunk-5H7MR6HP.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
@@ -0,0 +1,2 @@
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.4");process.exit(0)}
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-SZWXUG36.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-LGA6J4I4.js";import"./chunk-BY5PLEPZ.js";import"./chunk-FRBCX46J.js";import"./chunk-S5D3HCGN.js";import"./chunk-6HTO4BLV.js";import"./chunk-HCDTLV5J.js";import"./chunk-RJ5CZ7B6.js";import"./chunk-W6TJXK5Y.js";import"./chunk-NIJMLEAX.js";import"./chunk-OG4KHX7S.js";import"./chunk-RB2SL5GD.js";import"./chunk-33IUCP34.js";import"./chunk-WW6WUMS7.js";import"./chunk-5XXLWJU7.js";import"./chunk-LXYTC62V.js";import"./chunk-Z56QTRRB.js";import"./chunk-JL3TI43V.js";import"./chunk-K2VUYRMG.js";import"./chunk-O7TMY4GS.js";import"./chunk-WO4NSPLX.js";import"./chunk-X5S5UEM6.js";import"./chunk-5H7MR6HP.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
@@ -9,6 +9,8 @@ import { filterTestFilesForFramework, walkSourceFiles } from '../utils/file-disc
9
9
  import { writeOutput, toJSON, toJUnit, testRunToMarkdown } from '../utils/ci-output.js';
10
10
  import { writeQualityEvidence } from '../../domains/quality-assessment/quality-evidence.js';
11
11
  import { validateBehaviorExamples } from '../../domains/test-generation/services/behavior-example-validation.js';
12
+ import { findProjectRoot } from '../../kernel/project-root.js';
13
+ import { writeGeneratedTestFile } from '../utils/generated-test-writer.js';
12
14
  export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
13
15
  const testCmd = new Command('test')
14
16
  .description('Test generation, execution, scheduling, and load testing')
@@ -20,6 +22,7 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
20
22
  .option('-F, --format <format>', 'Output format (text|json|junit|markdown)', 'text')
21
23
  .option('-o, --output <path>', 'Write output to file')
22
24
  .option('--no-save', 'generate action: print the generated test code instead of writing test files beside the source (#925)')
25
+ .option('--force', 'generate action: overwrite existing test files instead of skipping them')
23
26
  .option('--git-ref <ref>', 'Git ref for schedule action (e.g., main, HEAD~3)')
24
27
  .option('--no-git-aware', 'Disable git-aware test selection (schedule action)')
25
28
  .option('--no-flaky', 'Disable flaky test tracking (schedule action)')
@@ -96,11 +99,16 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
96
99
  // Default text output
97
100
  console.log(chalk.green(`Generated ${generated.tests.length} tests\n`));
98
101
  console.log(chalk.cyan(' Tests:'));
99
- // #925: with --no-save the printed code is the only output, so
100
- // show every test instead of the first 10.
102
+ // #925/#936: every generated test is handled, with or without
103
+ // --no-save. A cap here used to drop tests past the 10th
104
+ // without writing or printing them.
101
105
  const noSave = options.save === false;
102
- const shown = noSave ? generated.tests : generated.tests.slice(0, 10);
103
- for (const test of shown) {
106
+ // Files may only be written inside the project that owns the target.
107
+ const fs = await import('fs');
108
+ const projectRoot = findProjectRoot(fs.statSync(targetPath).isDirectory() ? targetPath : path.dirname(targetPath));
109
+ let written = 0;
110
+ let skipped = 0;
111
+ for (const test of generated.tests) {
104
112
  console.log(` ${chalk.white(test.name)}`);
105
113
  console.log(chalk.gray(` Source: ${path.basename(test.sourceFile)}`));
106
114
  console.log(chalk.gray(` Assertions: ${test.assertions}`));
@@ -113,16 +121,26 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
113
121
  continue;
114
122
  }
115
123
  console.log(chalk.gray(` Test File: ${test.testFile}`));
116
- // Bug #295 fix: Write generated test code to disk
117
- const fs = await import('fs');
118
- const testDir = path.dirname(test.testFile);
119
- fs.mkdirSync(testDir, { recursive: true });
120
- fs.writeFileSync(test.testFile, test.testCode, 'utf-8');
121
- console.log(chalk.green(` Written to: ${test.testFile}`));
124
+ // Bug #295 fix: Write generated test code to disk, but never
125
+ // outside the project or over an existing file without --force.
126
+ const outcome = writeGeneratedTestFile(test.testFile, test.testCode, { projectRoot, force: options.force === true });
127
+ if (outcome.status === 'written') {
128
+ console.log(chalk.green(` Written to: ${outcome.path}`));
129
+ written++;
130
+ }
131
+ else if (outcome.status === 'exists') {
132
+ console.log(chalk.yellow(` ${outcome.path} exists, skipped (use --force to overwrite)`));
133
+ skipped++;
134
+ }
135
+ else {
136
+ console.log(chalk.red(` ${outcome.path} is outside the project root ${projectRoot}, skipped (not written)`));
137
+ skipped++;
138
+ }
122
139
  }
123
140
  }
124
- if (!noSave && generated.tests.length > 10) {
125
- console.log(chalk.gray(` ... and ${generated.tests.length - 10} more`));
141
+ if (!noSave) {
142
+ const skippedNote = skipped > 0 ? ` (${skipped} skipped)` : '';
143
+ console.log(chalk.gray(`\n Wrote ${written} of ${generated.tests.length} generated test files${skippedNote}.`));
126
144
  }
127
145
  console.log(`\n Coverage Estimate: ${chalk.yellow(generated.coverageEstimate == null ? 'Unmeasured' : generated.coverageEstimate + '%')}`);
128
146
  if (generated.patternsUsed.length > 0) {
@@ -238,6 +238,9 @@ export function createWorkflowCommand(context, cleanupAndExit, ensureInitialized
238
238
  console.log(chalk.gray(` Last run: ${sched.lastRun}`));
239
239
  }
240
240
  console.log(chalk.gray(` Status: ${sched.enabled ? chalk.green('enabled') : chalk.yellow('disabled')}`));
241
+ if (sched.disabledReason) {
242
+ console.log(chalk.yellow(` Reason: ${sched.disabledReason}`));
243
+ }
241
244
  console.log('');
242
245
  }
243
246
  }
@@ -32,6 +32,8 @@ export interface PersistedSchedule {
32
32
  lastRun?: string;
33
33
  /** Whether the schedule is active */
34
34
  enabled: boolean;
35
+ /** Derived load diagnostic for a disabled legacy cron expression. */
36
+ disabledReason?: string;
35
37
  /** ISO date string when schedule was created */
36
38
  createdAt: string;
37
39
  }
@@ -16,7 +16,7 @@ import { randomUUID } from 'crypto';
16
16
  import * as fs from 'fs';
17
17
  import * as path from 'path';
18
18
  import * as os from 'os';
19
- import { calculateNextRun } from '../utils/workflow-parser.js';
19
+ import { calculateNextRun, isValidCronExpression } from '../utils/workflow-parser.js';
20
20
  import { safeJsonParse } from '../../shared/safe-json.js';
21
21
  import { toErrorMessage } from '../../shared/error-utils.js';
22
22
  // ============================================================================
@@ -294,9 +294,19 @@ export class PersistentScheduler {
294
294
  }
295
295
  // Validate each schedule has required fields
296
296
  for (const schedule of data.schedules) {
297
- if (!schedule.id || !schedule.workflowId || !schedule.schedule) {
297
+ if (!schedule.id || !schedule.workflowId || !Object.prototype.hasOwnProperty.call(schedule, 'schedule')) {
298
298
  throw new Error(`Invalid schedule entry: missing required fields`);
299
299
  }
300
+ if (typeof schedule.schedule !== 'string' || !isValidCronExpression(schedule.schedule)) {
301
+ schedule.disabledReason = `Invalid cron expression: ${schedule.schedule}`;
302
+ if (schedule.enabled) {
303
+ console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${schedule.disabledReason}`);
304
+ }
305
+ schedule.enabled = false;
306
+ }
307
+ else {
308
+ delete schedule.disabledReason;
309
+ }
300
310
  }
301
311
  return data;
302
312
  }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Agentic QE v3 - Generated test file writer (#936 follow-up)
3
+ *
4
+ * `aqe test generate` writes each generated test beside its source. This
5
+ * module decides whether a single write is safe:
6
+ * - the resolved path must stay inside the project root, so a bad path
7
+ * (for example from a directory named `my.ts-app`) can never create files
8
+ * outside the project;
9
+ * - an existing file is never replaced unless the caller passed --force,
10
+ * because generated files carry no marker that tells them apart from
11
+ * hand-written tests.
12
+ *
13
+ * @module cli/utils/generated-test-writer
14
+ */
15
+ export type GeneratedTestWriteStatus = 'written' | 'exists' | 'outside-project';
16
+ export interface GeneratedTestWriteResult {
17
+ status: GeneratedTestWriteStatus;
18
+ /** Absolute path that was (or would have been) written. */
19
+ path: string;
20
+ }
21
+ export interface GeneratedTestWriteOptions {
22
+ /** Directory every written file must stay inside. */
23
+ projectRoot: string;
24
+ /** Overwrite an existing file instead of skipping it. */
25
+ force?: boolean;
26
+ }
27
+ /** True when `file` is inside `root` (never equal to it). */
28
+ export declare function isInsideRoot(file: string, root: string): boolean;
29
+ /**
30
+ * Write one generated test file if it is safe to do so.
31
+ *
32
+ * @returns what happened; nothing is written unless status is 'written'.
33
+ */
34
+ export declare function writeGeneratedTestFile(testFile: string, testCode: string, options: GeneratedTestWriteOptions): GeneratedTestWriteResult;
35
+ //# sourceMappingURL=generated-test-writer.d.ts.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Agentic QE v3 - Generated test file writer (#936 follow-up)
3
+ *
4
+ * `aqe test generate` writes each generated test beside its source. This
5
+ * module decides whether a single write is safe:
6
+ * - the resolved path must stay inside the project root, so a bad path
7
+ * (for example from a directory named `my.ts-app`) can never create files
8
+ * outside the project;
9
+ * - an existing file is never replaced unless the caller passed --force,
10
+ * because generated files carry no marker that tells them apart from
11
+ * hand-written tests.
12
+ *
13
+ * @module cli/utils/generated-test-writer
14
+ */
15
+ import * as fs from 'fs';
16
+ import * as path from 'path';
17
+ /** True when `file` is inside `root` (never equal to it). */
18
+ export function isInsideRoot(file, root) {
19
+ const rel = path.relative(path.resolve(root), path.resolve(file));
20
+ return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
21
+ }
22
+ /**
23
+ * Write one generated test file if it is safe to do so.
24
+ *
25
+ * @returns what happened; nothing is written unless status is 'written'.
26
+ */
27
+ export function writeGeneratedTestFile(testFile, testCode, options) {
28
+ const target = path.resolve(testFile);
29
+ if (!isInsideRoot(target, options.projectRoot)) {
30
+ return { status: 'outside-project', path: target };
31
+ }
32
+ fs.mkdirSync(path.dirname(target), { recursive: true });
33
+ try {
34
+ // 'wx' fails if the file exists, so the check and the write are atomic.
35
+ fs.writeFileSync(target, testCode, { encoding: 'utf-8', flag: options.force ? 'w' : 'wx' });
36
+ }
37
+ catch (error) {
38
+ if (error.code === 'EEXIST')
39
+ return { status: 'exists', path: target };
40
+ throw error;
41
+ }
42
+ return { status: 'written', path: target };
43
+ }
44
+ //# sourceMappingURL=generated-test-writer.js.map
@@ -116,7 +116,10 @@ export class ContextCompiler {
116
116
  return { size: this.cache.size, ttlMs: this.cacheTtl };
117
117
  }
118
118
  buildCacheKey(request) {
119
- return `${request.agentType}:${request.targetFiles.sort().join(',')}:${request.taskDescription.slice(0, 100)}`;
119
+ // JSON tuple: a ',' or ':' in a file name or agent type cannot shift fields (#914).
120
+ // Sort a copy so the caller's targetFiles array is not reordered.
121
+ const files = [...request.targetFiles].sort();
122
+ return JSON.stringify([request.agentType, files, request.taskDescription.slice(0, 100)]);
120
123
  }
121
124
  generateSummary(request, fragments, sources) {
122
125
  return [
@@ -12,6 +12,7 @@ import { BaseModelProvider } from '../model-provider.js';
12
12
  import { CONSENSUS_CONSTANTS, OLLAMA_CONSTANTS } from '../../constants.js';
13
13
  import { toErrorMessage, toError } from '../../../shared/error-utils.js';
14
14
  import { resolveOllamaBaseUrl } from '../../../shared/llm/ollama-url.js';
15
+ import { fetchWithResponseDeadline } from '../../../shared/llm/providers/response-deadline.js';
15
16
  // ============================================================================
16
17
  // Model Information
17
18
  // ============================================================================
@@ -102,13 +103,9 @@ export class OllamaModelProvider extends BaseModelProvider {
102
103
  */
103
104
  async listModels() {
104
105
  try {
105
- const controller = new AbortController();
106
- const timeoutId = setTimeout(() => controller.abort(), CONSENSUS_CONSTANTS.OLLAMA_CONNECTION_TEST_TIMEOUT_MS);
107
- const response = await fetch(`${this.config.baseUrl}/api/tags`, {
108
- method: 'GET',
109
- signal: controller.signal,
110
- });
111
- clearTimeout(timeoutId);
106
+ // The deadline stays armed until the body is read (issue #961).
107
+ const timeoutMs = CONSENSUS_CONSTANTS.OLLAMA_CONNECTION_TEST_TIMEOUT_MS;
108
+ const response = await fetchWithResponseDeadline(`${this.config.baseUrl}/api/tags`, { method: 'GET' }, timeoutMs, () => new Error(`Ollama list models timed out after ${timeoutMs}ms`));
112
109
  if (!response.ok) {
113
110
  throw new Error(`Failed to list models: ${response.status}`);
114
111
  }
@@ -233,27 +230,19 @@ export class OllamaModelProvider extends BaseModelProvider {
233
230
  * Make a request to Ollama API
234
231
  */
235
232
  async makeRequest(request, timeout) {
236
- const controller = new AbortController();
237
- const timeoutId = setTimeout(() => controller.abort(), timeout);
238
- try {
239
- const response = await fetch(`${this.config.baseUrl}/api/chat`, {
240
- method: 'POST',
241
- headers: {
242
- 'Content-Type': 'application/json',
243
- },
244
- body: JSON.stringify(request),
245
- signal: controller.signal,
246
- });
247
- clearTimeout(timeoutId);
248
- if (!response.ok) {
249
- const errorBody = await response.text();
250
- throw new Error(`Ollama API error: ${response.status} - ${errorBody}`);
251
- }
252
- return (await response.json());
253
- }
254
- finally {
255
- clearTimeout(timeoutId);
233
+ // One deadline covers headers and the whole body, error bodies included (issue #961).
234
+ const response = await fetchWithResponseDeadline(`${this.config.baseUrl}/api/chat`, {
235
+ method: 'POST',
236
+ headers: {
237
+ 'Content-Type': 'application/json',
238
+ },
239
+ body: JSON.stringify(request),
240
+ }, timeout, () => new Error(`Ollama request timed out after ${timeout}ms`));
241
+ if (!response.ok) {
242
+ const errorBody = await response.text();
243
+ throw new Error(`Ollama API error: ${response.status} - ${errorBody}`);
256
244
  }
245
+ return (await response.json());
257
246
  }
258
247
  /**
259
248
  * Check if an error is non-retryable
@@ -11,6 +11,7 @@
11
11
  import { BaseModelProvider } from '../model-provider.js';
12
12
  import { toErrorMessage, toError } from '../../../shared/error-utils.js';
13
13
  import { resolveModelPricing } from '../../../shared/llm/cost-tracker.js';
14
+ import { fetchWithResponseDeadline } from '../../../shared/llm/providers/response-deadline.js';
14
15
  // ============================================================================
15
16
  // Model Cost and Tier Information
16
17
  // ============================================================================
@@ -286,31 +287,19 @@ export class OpenRouterModelProvider extends BaseModelProvider {
286
287
  * Make a request to OpenRouter API
287
288
  */
288
289
  async makeRequest(request, timeout) {
289
- const controller = new AbortController();
290
- const timeoutId = setTimeout(() => controller.abort(), timeout);
291
- try {
292
- const headers = {
293
- Authorization: `Bearer ${this.config.apiKey}`,
294
- 'Content-Type': 'application/json',
295
- 'HTTP-Referer': this.config.siteUrl || 'https://github.com/agentic-qe',
296
- 'X-Title': this.config.appName || 'Agentic QE',
297
- };
298
- const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
299
- method: 'POST',
300
- headers,
301
- body: JSON.stringify(request),
302
- signal: controller.signal,
303
- });
304
- clearTimeout(timeoutId);
305
- if (!response.ok) {
306
- const errorBody = await response.text();
307
- throw new Error(`OpenRouter API error: ${response.status} - ${errorBody}`);
308
- }
309
- return (await response.json());
310
- }
311
- finally {
312
- clearTimeout(timeoutId);
290
+ const headers = {
291
+ Authorization: `Bearer ${this.config.apiKey}`,
292
+ 'Content-Type': 'application/json',
293
+ 'HTTP-Referer': this.config.siteUrl || 'https://github.com/agentic-qe',
294
+ 'X-Title': this.config.appName || 'Agentic QE',
295
+ };
296
+ // One deadline covers headers and the whole body, error bodies included (issue #961).
297
+ const response = await fetchWithResponseDeadline('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers, body: JSON.stringify(request) }, timeout, () => new Error(`OpenRouter request timed out after ${timeout}ms`));
298
+ if (!response.ok) {
299
+ const errorBody = await response.text();
300
+ throw new Error(`OpenRouter API error: ${response.status} - ${errorBody}`);
313
301
  }
302
+ return (await response.json());
314
303
  }
315
304
  /**
316
305
  * Check if an error is non-retryable
@@ -10,6 +10,7 @@ import { ok, err } from '../../shared/types/index.js';
10
10
  import { toError } from '../../shared/error-utils.js';
11
11
  import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
12
12
  import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
13
+ import { jestExactPathPattern, runnerFilePath } from '../../shared/test-runner-args.js';
13
14
  function escapeRegExp(s) {
14
15
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
15
16
  }
@@ -190,7 +191,8 @@ export function registerTestExecutionHandlers(ctx) {
190
191
  let execution;
191
192
  let output;
192
193
  try {
193
- execution = spawnSync('npx', ['vitest', 'run', ...testFiles, '--reporter=json', ...report.args], options);
194
+ // #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
195
+ execution = spawnSync('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file, options.cwd)), '--reporter=json', ...report.args], options);
194
196
  output = execution.error || execution.signal
195
197
  ? ''
196
198
  : report.read(execution.stdout || '') ?? '';
@@ -201,7 +203,7 @@ export function registerTestExecutionHandlers(ctx) {
201
203
  // Preserve the existing Jest fallback when Vitest cannot produce a report.
202
204
  if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
203
205
  runner = 'jest';
204
- execution = spawnSync('npx', ['jest', ...testFiles, '--json'], options);
206
+ execution = spawnSync('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file, options.cwd)), '--json'], options);
205
207
  output = execution.stdout || '';
206
208
  }
207
209
  const diagnostics = [execution.error?.message, execution.signal && `Terminated by ${execution.signal}`, execution.stderr, output].filter(Boolean).join('\n');
@@ -11,6 +11,7 @@ import { ok, err, } from '../../shared/types/index.js';
11
11
  import { createEvent } from '../../shared/events/domain-events.js';
12
12
  import { toError } from '../../shared/error-utils.js';
13
13
  import { LoggerFactory } from '../../logging/index.js';
14
+ import { addToCount } from '../../shared/utils/safe-record.js';
14
15
  const logger = LoggerFactory.create('defect-investigation');
15
16
  export const DefectInvestigationEvents = {
16
17
  DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
@@ -351,7 +352,9 @@ export class DefectInvestigationProtocol {
351
352
  totalInvestigations: 0,
352
353
  };
353
354
  const pattern = result.rootCause.rootCause;
354
- stats.patterns[pattern] = (stats.patterns[pattern] ?? 0) + 1;
355
+ // Root causes are free text and stats come back from storage as plain
356
+ // objects, so read and write own properties only (#914).
357
+ addToCount(stats.patterns, pattern);
355
358
  stats.totalInvestigations += 1;
356
359
  await this.memory.set(patternKey, stats, {
357
360
  namespace: this.config.namespace,
@@ -0,0 +1,3 @@
1
+ /** Register a process-tree owner, returning an idempotent release callback. */
2
+ export declare function ownListingProcess(directory: string, stopTree: () => void): () => void;
3
+ //# sourceMappingURL=listing-process-owner.d.ts.map
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Own detached listing subprocesses until completion or caller termination.
3
+ * Normal attempt completion removes the handlers; interrupted callers must
4
+ * synchronously kill every owned group before deleting listing artifacts.
5
+ */
6
+ import { rmSync } from 'node:fs';
7
+ const owners = new Set();
8
+ const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
9
+ function removeHandlers() {
10
+ process.removeListener('exit', cleanup);
11
+ for (const signal of signals)
12
+ process.removeListener(signal, signalHandlers[signal]);
13
+ }
14
+ function cleanup() {
15
+ const pending = [...owners];
16
+ owners.clear();
17
+ for (const owner of pending) {
18
+ try {
19
+ owner.stopTree();
20
+ }
21
+ catch { /* Continue terminating other owned trees. */ }
22
+ }
23
+ for (const directory of new Set(pending.map(owner => owner.directory))) {
24
+ try {
25
+ rmSync(directory, { recursive: true, force: true });
26
+ }
27
+ catch { /* Best effort during exit. */ }
28
+ }
29
+ }
30
+ function interrupted(signal) {
31
+ cleanup();
32
+ removeHandlers();
33
+ // Restore signal termination (including its exit status) instead of swallowing
34
+ // Ctrl-C or converting a requested shutdown into a successful metrics result.
35
+ process.kill(process.pid, signal);
36
+ }
37
+ const signalHandlers = {
38
+ SIGINT: () => interrupted('SIGINT'),
39
+ SIGTERM: () => interrupted('SIGTERM'),
40
+ SIGHUP: () => interrupted('SIGHUP'),
41
+ };
42
+ /** Register a process-tree owner, returning an idempotent release callback. */
43
+ export function ownListingProcess(directory, stopTree) {
44
+ if (owners.size === 0) {
45
+ process.once('exit', cleanup);
46
+ for (const signal of signals)
47
+ process.on(signal, signalHandlers[signal]);
48
+ }
49
+ const owner = { directory, stopTree };
50
+ owners.add(owner);
51
+ return () => {
52
+ owners.delete(owner);
53
+ if (owners.size === 0)
54
+ removeHandlers();
55
+ };
56
+ }
57
+ //# sourceMappingURL=listing-process-owner.js.map