agentic-qe 3.12.1 → 3.12.3

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 (373) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +87 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/cli/bundle.js +5 -5
  5. package/dist/cli/chunks/adapter-D657MKZY.js +2 -0
  6. package/dist/cli/chunks/{agent-booster-wasm-P4VYM5KK.js → agent-booster-wasm-XFAQATTH.js} +2 -2
  7. package/dist/cli/chunks/{agent-handler-PBQ7L2TO.js → agent-handler-2ZV4CA3U.js} +2 -2
  8. package/dist/cli/chunks/{agent-memory-branch-UPWO3X6V.js → agent-memory-branch-6WGP7F5T.js} +2 -2
  9. package/dist/cli/chunks/aqe-learning-engine-AFR6OZJK.js +2 -0
  10. package/dist/cli/chunks/{arena-QYTP3FG6.js → arena-FWX7XZAE.js} +4 -4
  11. package/dist/cli/chunks/{arena-LEUTILZ7.js → arena-KJUNQK4N.js} +2 -2
  12. package/dist/cli/chunks/{audit-TB6M2YLK.js → audit-YFUDEOKN.js} +3 -3
  13. package/dist/cli/chunks/base-K5QRGZWE.js +2 -0
  14. package/dist/cli/chunks/{hnswlib-node-62RTSHAY.js → better-sqlite3-FE55OGYB.js} +2 -2
  15. package/dist/cli/chunks/brain-handler-ZCK4WTPK.js +89 -0
  16. package/dist/cli/chunks/{branch-enumerator-WEIP3DXB.js → branch-enumerator-HTVINRYG.js} +2 -2
  17. package/dist/cli/chunks/{browser-HY6VLXHZ.js → browser-WUL2B77M.js} +2 -2
  18. package/dist/cli/chunks/browser-workflow-ZMMKCGYW.js +2 -0
  19. package/dist/cli/chunks/{chunk-NHRBKOYD.js → chunk-2CPJCXV6.js} +2 -2
  20. package/dist/cli/chunks/{chunk-D72N5V2S.js → chunk-2HCMRGMO.js} +2 -2
  21. package/dist/cli/chunks/{chunk-UBPJQKYS.js → chunk-2LNDU7AW.js} +2 -2
  22. package/dist/cli/chunks/{chunk-ONSNNY6J.js → chunk-2OX74DOO.js} +1 -1
  23. package/dist/cli/chunks/{chunk-QORWBION.js → chunk-2YDZXFO2.js} +2 -2
  24. package/dist/cli/chunks/{chunk-QJXUK54J.js → chunk-32L7DKNQ.js} +2 -2
  25. package/dist/cli/chunks/{chunk-UZXDYT6O.js → chunk-3YC4YUGB.js} +2 -2
  26. package/dist/cli/chunks/{chunk-NOCPO55P.js → chunk-4EHW4TNA.js} +2 -2
  27. package/dist/cli/chunks/{chunk-QZBPXJ5C.js → chunk-4HP7N6SP.js} +2 -2
  28. package/dist/cli/chunks/{chunk-XTAXSKPC.js → chunk-5FAWIIWF.js} +2 -2
  29. package/dist/cli/chunks/{chunk-YGB3MT3R.js → chunk-67BCEHU5.js} +1 -1
  30. package/dist/cli/chunks/{chunk-3W2FZXFD.js → chunk-6E47R27C.js} +1 -1
  31. package/dist/cli/chunks/{chunk-74VIADSJ.js → chunk-6HQDPDN5.js} +2 -2
  32. package/dist/cli/chunks/chunk-6SQ72FG7.js +2 -0
  33. package/dist/cli/chunks/{chunk-RJ7TU2MP.js → chunk-6SUSRXXF.js} +1 -1
  34. package/dist/cli/chunks/{chunk-FFSS3Y6W.js → chunk-72QQDR3Y.js} +2 -2
  35. package/dist/cli/chunks/{chunk-CP4GSICY.js → chunk-7Q74K3HZ.js} +1 -1
  36. package/dist/cli/chunks/{chunk-UEC53US3.js → chunk-7WF3TW3G.js} +4 -4
  37. package/dist/cli/chunks/chunk-7XUM4LBC.js +2 -0
  38. package/dist/cli/chunks/{chunk-UGPBL7LX.js → chunk-ADQFQBFJ.js} +2 -2
  39. package/dist/cli/chunks/{chunk-BALFQQB7.js → chunk-AIWRYWK2.js} +2 -2
  40. package/dist/cli/chunks/{chunk-XJTGLG7G.js → chunk-AZ24ONMX.js} +1 -1
  41. package/dist/cli/chunks/{chunk-LRWBOJ5Y.js → chunk-BDGKB2PT.js} +2 -2
  42. package/dist/cli/chunks/{chunk-NK2Z6FGF.js → chunk-BEPP57C2.js} +2 -2
  43. package/dist/cli/chunks/{chunk-HGKSU4QV.js → chunk-BQ2K4BPD.js} +2 -2
  44. package/dist/cli/chunks/{chunk-QOAI6ETC.js → chunk-BSNNTOHY.js} +3 -3
  45. package/dist/cli/chunks/chunk-CHFTHSMM.js +9 -0
  46. package/dist/cli/chunks/{chunk-IHWWZOHP.js → chunk-CL6SNCFF.js} +1 -1
  47. package/dist/cli/chunks/{chunk-7N2SCRWJ.js → chunk-CXMOIE7D.js} +2 -2
  48. package/dist/cli/chunks/{chunk-PZ3Q34OT.js → chunk-CYSBM52D.js} +2 -2
  49. package/dist/cli/chunks/{chunk-X2CEX4KC.js → chunk-D4GMAUTP.js} +10 -10
  50. package/dist/cli/chunks/{chunk-JDZIBSMY.js → chunk-DCYBV6HV.js} +1 -1
  51. package/dist/cli/chunks/chunk-DDYP6FBC.js +2 -0
  52. package/dist/cli/chunks/{chunk-SFQFBLWQ.js → chunk-DHUZHT5D.js} +1 -1
  53. package/dist/cli/chunks/{chunk-X2K3BTI4.js → chunk-DMD6WVJ2.js} +2 -2
  54. package/dist/cli/chunks/{chunk-GW3M7GQH.js → chunk-DTZFZ5M7.js} +2 -2
  55. package/dist/cli/chunks/{chunk-WBDV4V3H.js → chunk-DW7OI5IF.js} +2 -2
  56. package/dist/cli/chunks/{chunk-CYYT6YEV.js → chunk-DZ775UGW.js} +2 -2
  57. package/dist/cli/chunks/{chunk-BNMV5DCM.js → chunk-E2U3LTGM.js} +1 -1
  58. package/dist/cli/chunks/{chunk-KQV5644J.js → chunk-E53UR2EW.js} +3 -3
  59. package/dist/cli/chunks/{chunk-XYV6YUWS.js → chunk-EH7TSJPS.js} +2 -2
  60. package/dist/cli/chunks/{chunk-42GFB7VX.js → chunk-EHO52NKU.js} +2 -2
  61. package/dist/cli/chunks/{chunk-75AVUS5U.js → chunk-EOUJ6X5H.js} +1 -1
  62. package/dist/cli/chunks/{chunk-ZNITDSWL.js → chunk-FHHCH7WL.js} +1 -1
  63. package/dist/cli/chunks/{chunk-PQ4NSXZM.js → chunk-FJACKKRL.js} +2 -2
  64. package/dist/cli/chunks/{chunk-45QNHMTP.js → chunk-FTM562PF.js} +1 -1
  65. package/dist/cli/chunks/{chunk-4KI72C2E.js → chunk-FXOOOJQD.js} +1 -1
  66. package/dist/cli/chunks/chunk-G5OGKVLO.js +2 -0
  67. package/dist/cli/chunks/{chunk-42PYEEYQ.js → chunk-GGTCD4MA.js} +1 -1
  68. package/dist/cli/chunks/{chunk-GASACVTU.js → chunk-GMFFMJD6.js} +2 -2
  69. package/dist/cli/chunks/{chunk-JRNDFC23.js → chunk-GS6G7AVS.js} +2 -2
  70. package/dist/cli/chunks/{chunk-BKKJEKNT.js → chunk-GV2BS5NC.js} +2 -2
  71. package/dist/cli/chunks/{chunk-JRHRC2MP.js → chunk-HGJQSTQD.js} +1 -1
  72. package/dist/cli/chunks/{chunk-M5P5WNXA.js → chunk-HJ2LG5IH.js} +1 -1
  73. package/dist/cli/chunks/{chunk-UR655D4K.js → chunk-HJ4U64BL.js} +2 -2
  74. package/dist/cli/chunks/chunk-ILRKO6A5.js +43 -0
  75. package/dist/cli/chunks/{chunk-LZ6TJ7XL.js → chunk-IWQHQLT6.js} +2 -2
  76. package/dist/cli/chunks/{chunk-SHKOPOPD.js → chunk-J2RJOJ5Q.js} +1 -1
  77. package/dist/cli/chunks/{chunk-JIM4VSLF.js → chunk-KA4EAMMQ.js} +3 -3
  78. package/dist/cli/chunks/{chunk-6432JORM.js → chunk-KE3RK35K.js} +1 -1
  79. package/dist/cli/chunks/{chunk-VTFYY4SH.js → chunk-KGHSKDC7.js} +2 -2
  80. package/dist/cli/chunks/{chunk-3I3Z4C5X.js → chunk-KKOFH26C.js} +1 -1
  81. package/dist/cli/chunks/{chunk-AGWKCY42.js → chunk-KNWBRMLL.js} +2 -2
  82. package/dist/cli/chunks/{chunk-C7HGYLNF.js → chunk-KRS4KGX5.js} +2 -2
  83. package/dist/cli/chunks/{chunk-VHJCQBD2.js → chunk-KVHCWH4H.js} +2 -2
  84. package/dist/cli/chunks/{chunk-N3PSRG6F.js → chunk-KXKACV3E.js} +2 -2
  85. package/dist/cli/chunks/{chunk-BLU7OLQZ.js → chunk-L2X3BWMN.js} +2 -2
  86. package/dist/cli/chunks/{chunk-4U5MJX2H.js → chunk-L6GZGEFQ.js} +2 -2
  87. package/dist/cli/chunks/{chunk-DSNFOX22.js → chunk-LCM7TY76.js} +2 -2
  88. package/dist/cli/chunks/{chunk-NVXSM7UO.js → chunk-LGYEOYQJ.js} +2 -2
  89. package/dist/cli/chunks/{chunk-J4IAMQZI.js → chunk-LHAUFY4Y.js} +2 -2
  90. package/dist/cli/chunks/{chunk-OJORNYN3.js → chunk-LNIHLNW4.js} +3 -3
  91. package/dist/cli/chunks/{chunk-PRA73XZY.js → chunk-M32DTUZM.js} +2 -2
  92. package/dist/cli/chunks/{chunk-GGF5FZWS.js → chunk-M7W6VJ65.js} +1 -1
  93. package/dist/cli/chunks/{chunk-HZGFER4N.js → chunk-MB7TZQW3.js} +3 -3
  94. package/dist/cli/chunks/{chunk-RIASOMB2.js → chunk-MOX25RZQ.js} +2 -2
  95. package/dist/cli/chunks/{chunk-BPM7NEHS.js → chunk-MOXKKY5Q.js} +6 -6
  96. package/dist/cli/chunks/{chunk-UKF4V7LE.js → chunk-MS6VOSPY.js} +5 -5
  97. package/dist/cli/chunks/{chunk-QXZOUETY.js → chunk-MSDIIRLM.js} +2 -2
  98. package/dist/cli/chunks/{chunk-BBNQDHGF.js → chunk-MZ7SIO6R.js} +2 -2
  99. package/dist/cli/chunks/{chunk-HDI3FD4G.js → chunk-N4ML23ZG.js} +1 -1
  100. package/dist/cli/chunks/{chunk-7KHIOWBN.js → chunk-NAMJGRGC.js} +1 -1
  101. package/dist/cli/chunks/{chunk-IE6FDICX.js → chunk-NJDLJ3KD.js} +2 -2
  102. package/dist/cli/chunks/{chunk-4LKQZW2H.js → chunk-NKTLKMUB.js} +1 -1
  103. package/dist/cli/chunks/{chunk-CXUHD2O5.js → chunk-NLDLUHOF.js} +2 -2
  104. package/dist/cli/chunks/{chunk-XDRAU3W6.js → chunk-NOSQI2OW.js} +2 -2
  105. package/dist/cli/chunks/{chunk-ZCDGLNJ7.js → chunk-NT66CT73.js} +2 -2
  106. package/dist/cli/chunks/{chunk-JWZNWVLG.js → chunk-NX522PRH.js} +2 -2
  107. package/dist/cli/chunks/{chunk-O65OPAZH.js → chunk-OBL6W4Z5.js} +2 -2
  108. package/dist/cli/chunks/chunk-OPG2HV2W.js +2 -0
  109. package/dist/cli/chunks/{chunk-BCBITOMT.js → chunk-PDX7IYTJ.js} +2 -2
  110. package/dist/cli/chunks/{chunk-IC6SOVGO.js → chunk-PEHEANAM.js} +2 -2
  111. package/dist/cli/chunks/{chunk-J6ZCULWG.js → chunk-PPUDKQ4X.js} +2 -2
  112. package/dist/cli/chunks/{chunk-WPEGG6DX.js → chunk-PSDH7CIL.js} +1 -1
  113. package/dist/cli/chunks/{chunk-NTMN2ZJY.js → chunk-PTPN6HQ7.js} +2 -2
  114. package/dist/cli/chunks/{chunk-C2K4LQI5.js → chunk-PXCJDB7J.js} +1 -1
  115. package/dist/cli/chunks/{chunk-WPG5LXR7.js → chunk-QILF6BZH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-BAHXVVX3.js → chunk-R6WMGSEK.js} +2 -2
  117. package/dist/cli/chunks/{chunk-2PQ7YADF.js → chunk-RE42RJYR.js} +2 -2
  118. package/dist/cli/chunks/{chunk-BWNMAXV7.js → chunk-RLBNAB6Y.js} +1 -1
  119. package/dist/cli/chunks/{chunk-BXIJY6SB.js → chunk-ROFCS47F.js} +1 -1
  120. package/dist/cli/chunks/{chunk-7KK6XSYK.js → chunk-RSZOCQOL.js} +2 -2
  121. package/dist/cli/chunks/{chunk-NEXJUTHF.js → chunk-S47YGWXK.js} +2 -2
  122. package/dist/cli/chunks/{chunk-5H5A74U2.js → chunk-SFS3UHNF.js} +1 -1
  123. package/dist/cli/chunks/{chunk-U5ITD7ZD.js → chunk-SGMJ277D.js} +1 -1
  124. package/dist/cli/chunks/{chunk-OXVAGR64.js → chunk-SPI4LUJ6.js} +2 -2
  125. package/dist/cli/chunks/{chunk-FBYFDD7L.js → chunk-SV7J5FDW.js} +2 -2
  126. package/dist/cli/chunks/{chunk-S42RFOZJ.js → chunk-TP3UAWMB.js} +2 -2
  127. package/dist/cli/chunks/{chunk-OEXSBR72.js → chunk-TXLPOXAN.js} +1 -1
  128. package/dist/cli/chunks/{chunk-R4A6PY5D.js → chunk-UAPUA6OY.js} +2 -2
  129. package/dist/cli/chunks/{chunk-55MQ2SFP.js → chunk-UGW23T6S.js} +2 -2
  130. package/dist/cli/chunks/{chunk-774X6OJY.js → chunk-UGXHMQ6P.js} +2 -2
  131. package/dist/cli/chunks/{chunk-GLO53MUQ.js → chunk-UIHZ34SJ.js} +2 -2
  132. package/dist/cli/chunks/{chunk-TMPRR3FZ.js → chunk-ULQCEM7K.js} +2 -2
  133. package/dist/cli/chunks/{chunk-YNXQMJGJ.js → chunk-UZ7FXVH5.js} +1 -1
  134. package/dist/cli/chunks/{chunk-LAJHHR3Q.js → chunk-VFYMWDSJ.js} +1 -1
  135. package/dist/cli/chunks/{chunk-XS6BIOPQ.js → chunk-VSD6JE2H.js} +2 -2
  136. package/dist/cli/chunks/{chunk-MIAY35K6.js → chunk-VUCVSKJC.js} +2 -2
  137. package/dist/cli/chunks/{chunk-I4BZLVFE.js → chunk-WBZNLFTV.js} +3 -3
  138. package/dist/cli/chunks/{chunk-PDS5P5QD.js → chunk-WFPGIP4N.js} +2 -2
  139. package/dist/cli/chunks/{chunk-PZZDAECU.js → chunk-WKE6WL5C.js} +3 -3
  140. package/dist/cli/chunks/{chunk-VFRWLSQO.js → chunk-WQASUQ5P.js} +1 -1
  141. package/dist/cli/chunks/{chunk-GXMNCW2M.js → chunk-WUE53ZPH.js} +1 -1
  142. package/dist/cli/chunks/{chunk-UBWSYDO5.js → chunk-XBOCRCC6.js} +1 -1
  143. package/dist/cli/chunks/{chunk-HHMTQQUE.js → chunk-XDHGCBTS.js} +2 -2
  144. package/dist/cli/chunks/chunk-XQ5JT7KM.js +3 -0
  145. package/dist/cli/chunks/{chunk-USTUWUCE.js → chunk-XUUVAAHV.js} +2 -2
  146. package/dist/cli/chunks/{chunk-6RX5QZMU.js → chunk-XZGOXLZH.js} +1 -1
  147. package/dist/cli/chunks/{chunk-DQ3J7ZT6.js → chunk-Y5L37K7X.js} +2 -2
  148. package/dist/cli/chunks/{chunk-5HMGDB7B.js → chunk-Y625LP6K.js} +3 -3
  149. package/dist/cli/chunks/{chunk-REJGZP27.js → chunk-Y6XNISHP.js} +2 -2
  150. package/dist/cli/chunks/{chunk-LF5XOYR7.js → chunk-YDYKFSD2.js} +11 -11
  151. package/dist/cli/chunks/{chunk-U55X2ZUM.js → chunk-YEC55GO5.js} +2 -2
  152. package/dist/cli/chunks/{chunk-6ONUCDVL.js → chunk-YOG5KQZF.js} +2 -2
  153. package/dist/cli/chunks/{chunk-6BCVKCG5.js → chunk-YUDGQZJN.js} +2 -2
  154. package/dist/cli/chunks/{chunk-EOBZJDJR.js → chunk-Z3SXMYVI.js} +3 -3
  155. package/dist/cli/chunks/chunk-ZFLE4D4X.js +18 -0
  156. package/dist/cli/chunks/{chunk-W52R3G22.js → chunk-ZGKQCUPB.js} +2 -2
  157. package/dist/cli/chunks/{chunk-MCUILJ33.js → chunk-ZTKCGEB6.js} +1 -1
  158. package/dist/cli/chunks/{ci-IU5HVUL5.js → ci-MMLUV6L6.js} +2 -2
  159. package/dist/cli/chunks/{ci-output-CLI4A43F.js → ci-output-25GS6RXR.js} +2 -2
  160. package/dist/cli/chunks/{circuit-breaker-ZR5OFMW7.js → circuit-breaker-4OWAN6R6.js} +2 -2
  161. package/dist/cli/chunks/{claude-flow-setup-UBMA6ZHJ.js → claude-flow-setup-LR3SRBX6.js} +2 -2
  162. package/dist/cli/chunks/client-WI7RRUZO.js +2 -0
  163. package/dist/cli/chunks/{cline-installer-EWYELOBI.js → cline-installer-YSZWRZUI.js} +2 -2
  164. package/dist/cli/chunks/{code-YSPF4MXN.js → code-UUWUIXI7.js} +2 -2
  165. package/dist/cli/chunks/{code-index-extractor-WW5OKSTN.js → code-index-extractor-2LSPQORU.js} +2 -2
  166. package/dist/cli/chunks/{codex-installer-GLADK5PY.js → codex-installer-E5BVXZVA.js} +2 -2
  167. package/dist/cli/chunks/{completions-2KTWZ3AK.js → completions-YKXBKZSO.js} +2 -2
  168. package/dist/cli/chunks/{complexity-analyzer-KMX4OWKB.js → complexity-analyzer-HNT2QRWB.js} +2 -2
  169. package/dist/cli/chunks/{continuedev-installer-4FHU4OEJ.js → continuedev-installer-AW5VCB66.js} +2 -2
  170. package/dist/cli/chunks/{copilot-installer-AKR4WE7B.js → copilot-installer-B6SVZXQT.js} +2 -2
  171. package/dist/cli/chunks/core-handlers-T6URR57V.js +2 -0
  172. package/dist/cli/chunks/{cost-tracker-BUJ6WEWY.js → cost-tracker-POZMBN2V.js} +2 -2
  173. package/dist/cli/chunks/{coverage-OB6HVQS4.js → coverage-V5BGPN5Q.js} +3 -3
  174. package/dist/cli/chunks/cross-domain-router-WHTTKHWM.js +2 -0
  175. package/dist/cli/chunks/{cursor-installer-3AOE4O3Q.js → cursor-installer-EYBI4QVK.js} +2 -2
  176. package/dist/cli/chunks/{daemon-4RAL5URG.js → daemon-CF6ENQB2.js} +3 -3
  177. package/dist/cli/chunks/{daemon-JGSPLYGO.js → daemon-HKARXY2W.js} +4 -4
  178. package/dist/cli/chunks/{dag-attention-scheduler-DSBTHIMH.js → dag-attention-scheduler-XIL5IAP7.js} +2 -2
  179. package/dist/cli/chunks/{detect-6CVW2VUQ.js → detect-RRX2U2KK.js} +2 -2
  180. package/dist/cli/chunks/{dist-node-EWPKBTYA.js → dist-node-DOANNRCS.js} +2 -2
  181. package/dist/cli/chunks/{domain-handler-HLVIJU25.js → domain-handler-QMTJV5OR.js} +2 -2
  182. package/dist/cli/chunks/{domain-transfer-7Y3BR3YU.js → domain-transfer-FSNH75XW.js} +2 -2
  183. package/dist/cli/chunks/dream-QUL6SURC.js +2 -0
  184. package/dist/cli/chunks/{embed-and-insert-pattern-ZMJ3263X.js → embed-and-insert-pattern-NI7PGONV.js} +2 -2
  185. package/dist/cli/chunks/eval-6ZAF2RY3.js +17 -0
  186. package/dist/cli/chunks/{experience-capture-middleware-OGJ3JOSQ.js → experience-capture-middleware-JMXR7N5G.js} +3 -3
  187. package/dist/cli/chunks/{fast-paths-5XCY3Y6U.js → fast-paths-YB7XZZ76.js} +2 -2
  188. package/dist/cli/chunks/{feature-flags-R5V2FRJR.js → feature-flags-2RC4GFC4.js} +2 -2
  189. package/dist/cli/chunks/{feature-flags-VULQI6KY.js → feature-flags-KJSP7KR6.js} +2 -2
  190. package/dist/cli/chunks/{file-discovery-HW33C3HC.js → file-discovery-SUPBXFYI.js} +2 -2
  191. package/dist/cli/chunks/{fleet-NH3XR5OY.js → fleet-KSXFOLFW.js} +3 -3
  192. package/dist/cli/chunks/{gnn-wrapper-L3XMLPTG.js → gnn-wrapper-DFZ5KPPK.js} +2 -2
  193. package/dist/cli/chunks/{heartbeat-handler-TIQFBT4D.js → heartbeat-handler-G3EADK2H.js} +4 -4
  194. package/dist/cli/chunks/heartbeat-scheduler-VZNKE33K.js +2 -0
  195. package/dist/cli/chunks/hnsw-adapter-LGWLDZLC.js +2 -0
  196. package/dist/cli/chunks/hnsw-index-66FOOI7U.js +2 -0
  197. package/dist/cli/chunks/{hnsw-legacy-bridge-YL2SUIPA.js → hnsw-legacy-bridge-MA676GER.js} +2 -2
  198. package/dist/cli/chunks/{better-sqlite3-IPKCAVLS.js → hnswlib-node-SKTT5KIH.js} +2 -2
  199. package/dist/cli/chunks/{hooks-UR2ZF54G.js → hooks-HTCPMZNZ.js} +10 -10
  200. package/dist/cli/chunks/hybrid-router-I5MEVQDF.js +2 -0
  201. package/dist/cli/chunks/{hypergraph-engine-NX45AOPY.js → hypergraph-engine-QPB3IH4A.js} +2 -2
  202. package/dist/cli/chunks/{hypergraph-handler-LUM4YI4K.js → hypergraph-handler-GBFSVD7N.js} +3 -3
  203. package/dist/cli/chunks/impact-analyzer-K6ANYIY3.js +2 -0
  204. package/dist/cli/chunks/{init-handler-YTKKNTVV.js → init-handler-XYBTBCPD.js} +6 -6
  205. package/dist/cli/chunks/init-wizard-URHGXJ32.js +2 -0
  206. package/dist/cli/chunks/kernel-OKI5ZY5P.js +2 -0
  207. package/dist/cli/chunks/{kilocode-installer-ZW7DVH7T.js → kilocode-installer-LY6JOBFY.js} +2 -2
  208. package/dist/cli/chunks/{kiro-installer-IA7INW4N.js → kiro-installer-JF6NXTJL.js} +2 -2
  209. package/dist/cli/chunks/knowledge-graph-VQQSK7T5.js +2 -0
  210. package/dist/cli/chunks/{learning-4AZ5PGTT.js → learning-BIISN67N.js} +3 -3
  211. package/dist/cli/chunks/{llm-router-WQ4E3AOP.js → llm-router-YZUNVZQE.js} +5 -5
  212. package/dist/cli/chunks/llm-router-service-TISH33SY.js +2 -0
  213. package/dist/cli/chunks/{load-4FAH7CZO.js → load-MTWNBNLL.js} +2 -2
  214. package/dist/cli/chunks/load-test-KWKWC4Q7.js +2 -0
  215. package/dist/cli/chunks/{mcp-KLLHI6DG.js → mcp-37PYMNHQ.js} +2 -2
  216. package/dist/cli/chunks/{memory-Q5HLIUC6.js → memory-IXUUDCI3.js} +5 -5
  217. package/dist/cli/chunks/memory-backend-JSQQMXVS.js +2 -0
  218. package/dist/cli/chunks/memory-handlers-RM2VOFJX.js +2 -0
  219. package/dist/cli/chunks/{multi-model-executor-ABI73AFV.js → multi-model-executor-RKKS5XYG.js} +2 -2
  220. package/dist/cli/chunks/{opencode-installer-KRPQ6JOJ.js → opencode-installer-3VXI5MTR.js} +2 -2
  221. package/dist/cli/chunks/{orchestrator-SUPEONRG.js → orchestrator-UO3ZOGFZ.js} +5 -5
  222. package/dist/cli/chunks/pattern-null-store-SXBIUKE5.js +2 -0
  223. package/dist/cli/chunks/{pattern-usage-recorder-R4GKK6RZ.js → pattern-usage-recorder-YJKRL2GI.js} +2 -2
  224. package/dist/cli/chunks/{pipeline-LCUETNGD.js → pipeline-GJQJKXWX.js} +2 -2
  225. package/dist/cli/chunks/{platform-WJDIB4X3.js → platform-RHVCZK6C.js} +2 -2
  226. package/dist/cli/chunks/{plugin-2X5NY2RF.js → plugin-ZKAIW7O6.js} +2 -2
  227. package/dist/cli/chunks/{prime-radiant-advanced-wasm-3T665QC6.js → prime-radiant-advanced-wasm-4X3DSKQV.js} +2 -2
  228. package/dist/cli/chunks/protocol-executor-D3Q5P3WY.js +2 -0
  229. package/dist/cli/chunks/{protocol-handler-JTXRF7GU.js → protocol-handler-KKYQZMB2.js} +2 -2
  230. package/dist/cli/chunks/{prove-BFPWWPOC.js → prove-OD6RPKWX.js} +2 -2
  231. package/dist/cli/chunks/provider-manager-2EIX7E5Q.js +2 -0
  232. package/dist/cli/chunks/qe-reasoning-bank-ITOW2ZHC.js +2 -0
  233. package/dist/cli/chunks/{quality-F7UZU4RN.js → quality-ZRWBXCKO.js} +2 -2
  234. package/dist/cli/chunks/{quality-gate-R5L4UZIX.js → quality-gate-Y6BWQV7J.js} +3 -3
  235. package/dist/cli/chunks/queen-coordinator-TO5X2EXL.js +2 -0
  236. package/dist/cli/chunks/{real-embeddings-LZD6HTQF.js → real-embeddings-YYEUO4P2.js} +2 -2
  237. package/dist/cli/chunks/{roocode-installer-6TTG7VSH.js → roocode-installer-JBCPS3FK.js} +2 -2
  238. package/dist/cli/chunks/router-GZJQEJU3.js +2 -0
  239. package/dist/cli/chunks/routing-feedback-CRXSKFNS.js +2 -0
  240. package/dist/cli/chunks/{routing-handler-SW442GK7.js → routing-handler-KTPJOSBJ.js} +2 -2
  241. package/dist/cli/chunks/{ruvector-commands-CLFGKXMW.js → ruvector-commands-SCZZVRE7.js} +2 -2
  242. package/dist/cli/chunks/{rvf-dual-writer-EVPPXXXS.js → rvf-dual-writer-IP7GELQJ.js} +2 -2
  243. package/dist/cli/chunks/{rvf-migration-adapter-NOHDIRIP.js → rvf-migration-adapter-WLFTDARU.js} +2 -2
  244. package/dist/cli/chunks/{rvf-migration-coordinator-BYJ3M7WZ.js → rvf-migration-coordinator-MGFDQ5WD.js} +2 -2
  245. package/dist/cli/chunks/rvf-native-adapter-WHADT5HX.js +2 -0
  246. package/dist/cli/chunks/rvf-store-integrity-OTOAGT5W.js +2 -0
  247. package/dist/cli/chunks/safe-db-MIZ2OFWC.js +2 -0
  248. package/dist/cli/chunks/schedule-XFILYTYC.js +2 -0
  249. package/dist/cli/chunks/scheduler-EIPJ777A.js +2 -0
  250. package/dist/cli/chunks/{security-IXDKBPSG.js → security-B2CLZKRB.js} +3 -3
  251. package/dist/cli/chunks/shared-rvf-adapter-2PMFAQMN.js +2 -0
  252. package/dist/cli/chunks/{shared-rvf-dual-writer-FFKBKYNL.js → shared-rvf-dual-writer-B6P732AV.js} +2 -2
  253. package/dist/cli/chunks/sqlite-persistence-PFU3GSRD.js +2 -0
  254. package/dist/cli/chunks/status-handler-M6SN2W2D.js +47 -0
  255. package/dist/cli/chunks/{structural-health-55X6BTLT.js → structural-health-YCCTGI3K.js} +2 -2
  256. package/dist/cli/chunks/{sync-BUGDXW3Y.js → sync-3SDMVAIU.js} +2 -2
  257. package/dist/cli/chunks/{sync-NUG67HGK.js → sync-KSRF77ID.js} +2 -2
  258. package/dist/cli/chunks/{task-handler-T6ZKXV4S.js → task-handler-MIKRB2SL.js} +2 -2
  259. package/dist/cli/chunks/{task-handlers-H63TB2UI.js → task-handlers-YXKRUBQ4.js} +3 -3
  260. package/dist/cli/chunks/{test-VEK76SBT.js → test-MLOLQCB7.js} +4 -4
  261. package/dist/cli/chunks/{test-scheduling-QZM6PNZH.js → test-scheduling-3KXESUZS.js} +3 -3
  262. package/dist/cli/chunks/token-bootstrap-6V2PMDBJ.js +2 -0
  263. package/dist/cli/chunks/{token-usage-OBY6UEUR.js → token-usage-DP6THJ3I.js} +2 -2
  264. package/dist/cli/chunks/{transformers-EFNY2MRX.js → transformers-QFOBOP2Y.js} +2 -2
  265. package/dist/cli/chunks/{tree-sitter-wasm-parser-EU2S5NVM.js → tree-sitter-wasm-parser-COK2XERS.js} +2 -2
  266. package/dist/cli/chunks/{types-3DYRKX23.js → types-PYHUCVOZ.js} +2 -2
  267. package/dist/cli/chunks/unified-memory-OUVCMFGK.js +2 -0
  268. package/dist/cli/chunks/unified-memory-hnsw-YGQPOHXB.js +2 -0
  269. package/dist/cli/chunks/unified-persistence-GFRZVDOW.js +2 -0
  270. package/dist/cli/chunks/{upgrade-H5V53FRF.js → upgrade-ONP2HNGL.js} +2 -2
  271. package/dist/cli/chunks/{validate-IL22VB5I.js → validate-NWSICDAY.js} +2 -2
  272. package/dist/cli/chunks/{validate-swarm-WZKECK3W.js → validate-swarm-KXS5P3U7.js} +2 -2
  273. package/dist/cli/chunks/{vibium-KKM23OTQ.js → vibium-TZSGZRCQ.js} +2 -2
  274. package/dist/cli/chunks/visual-security-LVOOYQ64.js +2 -0
  275. package/dist/cli/chunks/{web-tree-sitter-NJM5YBOY.js → web-tree-sitter-V2FADNRA.js} +2 -2
  276. package/dist/cli/chunks/{windsurf-installer-SLP43TVT.js → windsurf-installer-GQM7KWDC.js} +2 -2
  277. package/dist/cli/chunks/{witness-chain-XBEPT4XD.js → witness-chain-GTITDIA2.js} +2 -2
  278. package/dist/cli/chunks/witness-chain-QNFPV4UL.js +2 -0
  279. package/dist/cli/chunks/{witness-key-manager-DAAMNYOW.js → witness-key-manager-AHRM2M52.js} +2 -2
  280. package/dist/cli/chunks/{workflow-SZOOU6D3.js → workflow-XCGHEL3I.js} +4 -4
  281. package/dist/cli/chunks/workflow-orchestrator-MIVBCALG.js +2 -0
  282. package/dist/cli/chunks/{wrappers-I2CBKWGF.js → wrappers-VGO2GO4J.js} +2 -2
  283. package/dist/cli/commands/eval.js +73 -3
  284. package/dist/cli/commands/llm-router.js +2 -0
  285. package/dist/cli/handlers/status-handler.d.ts +5 -0
  286. package/dist/cli/handlers/status-handler.js +35 -0
  287. package/dist/coordination/consensus/providers/index.js +11 -0
  288. package/dist/integrations/ruvector/brain-rvf-exporter.js +115 -13
  289. package/dist/integrations/ruvector/rvf-dual-writer.js +20 -3
  290. package/dist/integrations/ruvector/rvf-store-integrity.d.ts +49 -0
  291. package/dist/integrations/ruvector/rvf-store-integrity.js +137 -0
  292. package/dist/integrations/ruvector/shared-rvf-adapter.js +23 -5
  293. package/dist/learning/pattern-store.js +23 -5
  294. package/dist/learning/qe-flywheel/platform-signer.d.ts +32 -0
  295. package/dist/learning/qe-flywheel/platform-signer.js +60 -0
  296. package/dist/learning/qe-flywheel/receipt.js +9 -2
  297. package/dist/mcp/bundle.js +425 -406
  298. package/dist/shared/llm/billing-modes.d.ts +24 -0
  299. package/dist/shared/llm/billing-modes.js +56 -0
  300. package/dist/shared/llm/cost-tracker.js +2 -0
  301. package/dist/shared/llm/interfaces.d.ts +61 -3
  302. package/dist/shared/llm/provider-manager.d.ts +34 -0
  303. package/dist/shared/llm/provider-manager.js +152 -3
  304. package/dist/shared/llm/providers/claude-code.d.ts +57 -0
  305. package/dist/shared/llm/providers/claude-code.js +312 -0
  306. package/dist/shared/llm/providers/cognitum.d.ts +64 -0
  307. package/dist/shared/llm/providers/cognitum.js +369 -0
  308. package/dist/shared/llm/providers/index.d.ts +2 -0
  309. package/dist/shared/llm/providers/index.js +2 -0
  310. package/dist/shared/llm/router/config-store.d.ts +31 -11
  311. package/dist/shared/llm/router/config-store.js +82 -12
  312. package/dist/shared/llm/router/hybrid-router.js +16 -0
  313. package/dist/shared/llm/router/types.js +7 -0
  314. package/dist/shared/llm/spend-ledger.d.ts +64 -0
  315. package/dist/shared/llm/spend-ledger.js +115 -0
  316. package/dist/shared/llm/translation/message-formatter.js +2 -0
  317. package/dist/shared/llm/translation/prompt-translator.js +2 -0
  318. package/dist/shared/llm/translation/tool-translator.js +2 -0
  319. package/dist/validation/index.d.ts +1 -0
  320. package/dist/validation/index.js +2 -0
  321. package/dist/validation/provider-llm-executor.d.ts +45 -0
  322. package/dist/validation/provider-llm-executor.js +98 -0
  323. package/package.json +2 -2
  324. package/dist/cli/chunks/adapter-X4UEC6UJ.js +0 -2
  325. package/dist/cli/chunks/aqe-learning-engine-5FG7JCY7.js +0 -2
  326. package/dist/cli/chunks/base-CWPMFSZG.js +0 -2
  327. package/dist/cli/chunks/brain-handler-JF3OK35F.js +0 -89
  328. package/dist/cli/chunks/browser-workflow-A77OFBVY.js +0 -2
  329. package/dist/cli/chunks/chunk-CDVKFAYP.js +0 -18
  330. package/dist/cli/chunks/chunk-CJTXZI37.js +0 -2
  331. package/dist/cli/chunks/chunk-FNMEVLSN.js +0 -2
  332. package/dist/cli/chunks/chunk-P7G5LGUE.js +0 -3
  333. package/dist/cli/chunks/chunk-R7XEACKR.js +0 -2
  334. package/dist/cli/chunks/chunk-RAS7WRN5.js +0 -24
  335. package/dist/cli/chunks/chunk-TGIKKD43.js +0 -9
  336. package/dist/cli/chunks/client-KKCFGD7R.js +0 -2
  337. package/dist/cli/chunks/core-handlers-KRSSJEO5.js +0 -2
  338. package/dist/cli/chunks/cross-domain-router-27QGWU27.js +0 -2
  339. package/dist/cli/chunks/dream-M6K47Q4H.js +0 -2
  340. package/dist/cli/chunks/eval-73XW2WJD.js +0 -15
  341. package/dist/cli/chunks/heartbeat-scheduler-URXBF5RW.js +0 -2
  342. package/dist/cli/chunks/hnsw-adapter-WWAGM6HK.js +0 -2
  343. package/dist/cli/chunks/hnsw-index-UFV2HSZE.js +0 -2
  344. package/dist/cli/chunks/hybrid-router-3U6Q6OTL.js +0 -2
  345. package/dist/cli/chunks/impact-analyzer-EUEX6ZRO.js +0 -2
  346. package/dist/cli/chunks/init-wizard-POKY2LRY.js +0 -2
  347. package/dist/cli/chunks/kernel-HPAONLZY.js +0 -2
  348. package/dist/cli/chunks/knowledge-graph-2WCUFG63.js +0 -2
  349. package/dist/cli/chunks/llm-router-service-D5VMG6SD.js +0 -2
  350. package/dist/cli/chunks/load-test-DHG26REU.js +0 -2
  351. package/dist/cli/chunks/memory-backend-GLWQ4DAL.js +0 -2
  352. package/dist/cli/chunks/memory-handlers-P72I4VV4.js +0 -2
  353. package/dist/cli/chunks/pattern-null-store-Y2YFTE3V.js +0 -2
  354. package/dist/cli/chunks/protocol-executor-HNT67NN5.js +0 -2
  355. package/dist/cli/chunks/provider-manager-5YGPZIEZ.js +0 -2
  356. package/dist/cli/chunks/qe-reasoning-bank-Z5UGOA3F.js +0 -2
  357. package/dist/cli/chunks/queen-coordinator-P5LU5NWI.js +0 -2
  358. package/dist/cli/chunks/router-CRGHUAVR.js +0 -2
  359. package/dist/cli/chunks/routing-feedback-BVX5ZBCF.js +0 -2
  360. package/dist/cli/chunks/rvf-native-adapter-FZJSQOJM.js +0 -2
  361. package/dist/cli/chunks/safe-db-USYNEOC6.js +0 -2
  362. package/dist/cli/chunks/schedule-KCRCQ3PS.js +0 -2
  363. package/dist/cli/chunks/scheduler-CX3UHI4U.js +0 -2
  364. package/dist/cli/chunks/shared-rvf-adapter-VCOK3OVD.js +0 -2
  365. package/dist/cli/chunks/sqlite-persistence-K23C4TFH.js +0 -2
  366. package/dist/cli/chunks/status-handler-M5W64S5U.js +0 -46
  367. package/dist/cli/chunks/token-bootstrap-W5IAMJW4.js +0 -2
  368. package/dist/cli/chunks/unified-memory-NCDBQLLF.js +0 -2
  369. package/dist/cli/chunks/unified-memory-hnsw-T7NSGQ2H.js +0 -2
  370. package/dist/cli/chunks/unified-persistence-XUAYDCMM.js +0 -2
  371. package/dist/cli/chunks/visual-security-3TUC4GPP.js +0 -2
  372. package/dist/cli/chunks/witness-chain-QLOKUZXC.js +0 -2
  373. package/dist/cli/chunks/workflow-orchestrator-6JAYTZ7L.js +0 -2
@@ -1,2 +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.12.1");process.exit(0)}
2
- import{a,b,c,d,e,f,g}from"./chunk-BKKJEKNT.js";import"./chunk-FNMEVLSN.js";import"./chunk-NOCPO55P.js";import"./chunk-USTUWUCE.js";import"./chunk-U5ITD7ZD.js";export{c as PersistentWitnessChain,a as SPRTAccumulator,b as WitnessChain,f as createPersistentWitnessChain,e as createWitnessChain,d as createWitnessChainSQLitePersistence,g as isWitnessChainFeatureEnabled};
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.12.3");process.exit(0)}
2
+ import{a,b,c,d,e,f,g}from"./chunk-GV2BS5NC.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{c as PersistentWitnessChain,a as SPRTAccumulator,b as WitnessChain,f as createPersistentWitnessChain,e as createWitnessChain,d as createWitnessChainSQLitePersistence,g as isWitnessChainFeatureEnabled};
@@ -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.12.3");process.exit(0)}
2
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-DZ775UGW.js";import"./chunk-SPI4LUJ6.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-2LNDU7AW.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{a as GENESIS_PREV_HASH,f as WitnessChain,i as _resetWitnessChainForTests,h as createWitnessChain,g as getWitnessChain,d as hashWith,e as serializeEntry,b as sha256,c as shake256};
@@ -1,2 +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.12.1");process.exit(0)}
2
- import{a,b,c}from"./chunk-OXVAGR64.js";import"./chunk-IE6FDICX.js";import"./chunk-U5ITD7ZD.js";export{a as WitnessKeyManager,c as _resetDefaultWitnessKeyManagerForTests,b as getDefaultWitnessKeyManager};
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.12.3");process.exit(0)}
2
+ import{a,b,c}from"./chunk-SPI4LUJ6.js";import"./chunk-NJDLJ3KD.js";import"./chunk-SGMJ277D.js";export{a as WitnessKeyManager,c as _resetDefaultWitnessKeyManagerForTests,b as getDefaultWitnessKeyManager};
@@ -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.12.1");process.exit(0)}
2
- import"./chunk-X2K3BTI4.js";import{b as $}from"./chunk-45QNHMTP.js";import{d as R}from"./chunk-NEXJUTHF.js";import{b as k,c as C,d as b}from"./chunk-NK2Z6FGF.js";import{c as W}from"./chunk-O65OPAZH.js";import"./chunk-4LKQZW2H.js";import"./chunk-UBPJQKYS.js";import"./chunk-U5ITD7ZD.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.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(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);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.12.3");process.exit(0)}
2
+ import"./chunk-DMD6WVJ2.js";import{b as $}from"./chunk-FTM562PF.js";import{d as R}from"./chunk-S47YGWXK.js";import{b as k,c as C,d as b}from"./chunk-BEPP57C2.js";import{c as W}from"./chunk-OBL6W4Z5.js";import"./chunk-NKTLKMUB.js";import"./chunk-2LNDU7AW.js";import"./chunk-SGMJ277D.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.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(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
3
3
  Running workflow from: ${t}
4
4
  `));let s=k(c);if(!s.success||!s.workflow){console.log(o.red("Failed to parse pipeline:"));for(let w of s.errors)console.log(o.red(` ${w}`));await a(1)}let r={...W(l.params,"params")};if(s.pipeline){for(let w of s.pipeline.stages)if(w.params)for(let[S,h]of Object.entries(w.params))r[S]=h}if(!d.workflowOrchestrator.getWorkflow(s.workflow.id)){let w=d.workflowOrchestrator.registerWorkflow(s.workflow);w.success||(console.log(o.red(`Failed to register workflow: ${w.error.message}`)),await a(1))}let n=await d.workflowOrchestrator.executeWorkflow(s.workflow.id,r);if(!n.success){console.log(o.red(`Failed to start workflow: ${n.error.message}`)),await a(1);return}let p=n.value;if(console.log(o.cyan(` Execution ID: ${p}`)),console.log(o.gray(` Workflow: ${s.workflow.name}`)),console.log(o.gray(` Stages: ${s.workflow.steps.length}`)),console.log(""),l.watch){console.log(o.blue(`Workflow Progress:
5
5
  `));let w,S=Date.now();for(;;){let g=d.workflowOrchestrator.getWorkflowStatus(p);if(!g)break;if(!w||w.progress!==g.progress||w.status!==g.status||JSON.stringify(w.currentSteps)!==JSON.stringify(g.currentSteps)){process.stdout.write("\r\x1B[K");let v="\u2588".repeat(Math.floor(g.progress/5))+"\u2591".repeat(20-Math.floor(g.progress/5)),D=g.status==="completed"?o.green:g.status==="failed"?o.red:g.status==="running"?o.yellow:o.gray;console.log(` [${v}] ${g.progress}% - ${D(g.status)}`),g.currentSteps.length>0&&l.verbose&&console.log(o.gray(` Running: ${g.currentSteps.join(", ")}`)),w=g}if(g.status==="completed"||g.status==="failed"||g.status==="cancelled")break;await new Promise(v=>setTimeout(v,500))}let h=d.workflowOrchestrator.getWorkflowStatus(p);if(h){console.log("");let g=h.duration||Date.now()-S;h.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(g)}`)),console.log(o.gray(` Completed: ${h.completedSteps.length} stages`)),h.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${h.skippedSteps.length} stages`))):h.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${h.error}`)),console.log(o.gray(` Failed stages: ${h.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${h.status}`))}}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${p}' to check progress`));console.log(""),await a(0)}catch(s){console.error(o.red(`
@@ -35,10 +35,10 @@ Workflow cancelled: ${t}
35
35
  `)):console.log(o.red(`
36
36
  Failed to cancel workflow: ${l.error.message}
37
37
  `)),await a(l.success?0:1)}catch(l){console.error(o.red(`
38
- Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-A77OFBVY.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
38
+ Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-ZMMKCGYW.js"),e=await new t().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 a(0)}catch(t){console.error(o.red(`
41
- Failed:`),t),await a(1)}}),y.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)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-A77OFBVY.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-CLI4A43F.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
41
+ Failed:`),t),await a(1)}}),y.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)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-ZMMKCGYW.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-25GS6RXR.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
42
42
  File not found: ${p}
43
43
  `)),await a(1)),f.workflowYaml=i.readFileSync(p,"utf-8")}else f.templateName=t;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.12.3");process.exit(0)}
2
+ import{a,b,c,d}from"./chunk-PDX7IYTJ.js";import"./chunk-Y6XNISHP.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-NKTLKMUB.js";import"./chunk-2LNDU7AW.js";import"./chunk-EOUJ6X5H.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
@@ -1,2 +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.12.1");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-WPG5LXR7.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-6ONUCDVL.js";import"./chunk-XDRAU3W6.js";import"./chunk-PQ4NSXZM.js";import"./chunk-FNMEVLSN.js";import"./chunk-NOCPO55P.js";import"./chunk-IE6FDICX.js";import"./chunk-O65OPAZH.js";import"./chunk-BLU7OLQZ.js";import"./chunk-UBPJQKYS.js";import"./chunk-TMPRR3FZ.js";import"./chunk-R4A6PY5D.js";import"./chunk-JRNDFC23.js";import"./chunk-6BCVKCG5.js";import"./chunk-UR655D4K.js";import"./chunk-PZ3Q34OT.js";import"./chunk-CXUHD2O5.js";import"./chunk-IC6SOVGO.js";import"./chunk-USTUWUCE.js";import"./chunk-U5ITD7ZD.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};
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.12.3");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-QILF6BZH.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-YOG5KQZF.js";import"./chunk-NOSQI2OW.js";import"./chunk-FJACKKRL.js";import"./chunk-L2X3BWMN.js";import"./chunk-G5OGKVLO.js";import"./chunk-4EHW4TNA.js";import"./chunk-NJDLJ3KD.js";import"./chunk-OBL6W4Z5.js";import"./chunk-2LNDU7AW.js";import"./chunk-ULQCEM7K.js";import"./chunk-UAPUA6OY.js";import"./chunk-GS6G7AVS.js";import"./chunk-YUDGQZJN.js";import"./chunk-HJ4U64BL.js";import"./chunk-CYSBM52D.js";import"./chunk-NLDLUHOF.js";import"./chunk-PEHEANAM.js";import"./chunk-XUUVAAHV.js";import"./chunk-SGMJ277D.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};
@@ -15,7 +15,8 @@ import chalk from 'chalk';
15
15
  import * as fs from 'fs';
16
16
  import * as path from 'path';
17
17
  import * as yaml from 'yaml';
18
- import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, } from '../../validation/parallel-eval-runner.js';
18
+ import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, MockLLMExecutor, } from '../../validation/parallel-eval-runner.js';
19
+ import { resolveEvalExecutor } from '../../validation/provider-llm-executor.js';
19
20
  import { createCommandEvalRunner, isCommandEvalSuite, } from '../../validation/command-eval-runner.js';
20
21
  import { createSkillValidationLearner, } from '../../learning/skill-validation-learner.js';
21
22
  import { createRealQEReasoningBank, } from '../../learning/real-qe-reasoning-bank.js';
@@ -54,6 +55,16 @@ const P2_SKILLS = [
54
55
  /**
55
56
  * Get skills for a specific tier
56
57
  */
58
+ /**
59
+ * ADR-123: propagate a `--max-budget-usd` flag to the provider layer via the
60
+ * AQE_MAX_BUDGET_USD env var, which ProviderManager reads as a per-run cap.
61
+ */
62
+ function applyMaxBudget(maxBudgetUsd) {
63
+ if (typeof maxBudgetUsd === 'number' && Number.isFinite(maxBudgetUsd) && maxBudgetUsd > 0) {
64
+ process.env.AQE_MAX_BUDGET_USD = String(maxBudgetUsd);
65
+ console.log(chalk.gray(` Budget cap: $${maxBudgetUsd.toFixed(2)} for this run`));
66
+ }
67
+ }
57
68
  function getSkillsByTier(tier) {
58
69
  switch (tier) {
59
70
  case 3:
@@ -295,6 +306,36 @@ async function handleRunCommand(options) {
295
306
  }
296
307
  process.exit(result.passed ? 0 : 1);
297
308
  }
309
+ // Issue #557 follow-up: resolve a REAL LLM executor by default. `--mock`
310
+ // opts into canned responses (offline testing only). If neither a provider
311
+ // is configured nor --mock is passed, fail loudly rather than fabricate.
312
+ let executor;
313
+ let evalManager;
314
+ if (options.mock) {
315
+ console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
316
+ executor = new MockLLMExecutor();
317
+ }
318
+ else {
319
+ const resolved = await resolveEvalExecutor();
320
+ if (!resolved.executor) {
321
+ console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
322
+ process.exit(1);
323
+ }
324
+ executor = resolved.executor;
325
+ evalManager = resolved.manager;
326
+ const modeLabel = resolved.billingMode === 'subscription'
327
+ ? chalk.green('subscription (no per-token charge)')
328
+ : resolved.billingMode === 'local'
329
+ ? chalk.green('local (no cost)')
330
+ : resolved.billingMode === 'metered-capped'
331
+ ? chalk.yellow('metered (server-side cap)')
332
+ : chalk.red('pay-per-token API');
333
+ console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${modeLabel}`);
334
+ if (process.env.AQE_MAX_BUDGET_USD) {
335
+ console.log(chalk.gray(` Budget cap: $${process.env.AQE_MAX_BUDGET_USD} for this run`));
336
+ }
337
+ console.log('');
338
+ }
298
339
  const { runner, reasoningBank } = await initializeRunner();
299
340
  try {
300
341
  // Configure runner
@@ -305,7 +346,7 @@ async function handleRunCommand(options) {
305
346
  timeout: options.timeout,
306
347
  retryFailedTests: options.retry,
307
348
  };
308
- const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config);
349
+ const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config, executor);
309
350
  // Set up progress reporting
310
351
  if (options.verbose) {
311
352
  customRunner.onProgress(displayProgress);
@@ -333,11 +374,30 @@ async function handleRunCommand(options) {
333
374
  }
334
375
  finally {
335
376
  await reasoningBank.dispose();
377
+ if (evalManager)
378
+ await evalManager.dispose();
336
379
  }
337
380
  }
338
381
  async function handleRunAllCommand(options) {
339
382
  console.log(chalk.bold('\nAQE Parallel Eval Runner - Multi-Skill'));
340
383
  console.log(chalk.dim('ADR-056 Phase 5: Worker Pool Pattern\n'));
384
+ // Issue #557 follow-up: real executor by default; --mock is offline-only.
385
+ let executor;
386
+ let evalManager;
387
+ if (options.mock) {
388
+ console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
389
+ executor = new MockLLMExecutor();
390
+ }
391
+ else {
392
+ const resolved = await resolveEvalExecutor();
393
+ if (!resolved.executor) {
394
+ console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
395
+ process.exit(1);
396
+ }
397
+ executor = resolved.executor;
398
+ evalManager = resolved.manager;
399
+ console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${resolved.billingMode}`);
400
+ }
341
401
  const { runner, learner, reasoningBank } = await initializeRunner();
342
402
  try {
343
403
  // Get skills for tier
@@ -353,7 +413,7 @@ async function handleRunAllCommand(options) {
353
413
  ...DEFAULT_PARALLEL_EVAL_CONFIG,
354
414
  maxWorkers: options.parallel ? options.workers : 1,
355
415
  };
356
- const customRunner = createParallelEvalRunner(learner, config);
416
+ const customRunner = createParallelEvalRunner(learner, config, executor);
357
417
  // Run all evals
358
418
  const results = await customRunner.runMultipleEvalsParallel(skills, models);
359
419
  // Flatten results for display
@@ -394,6 +454,8 @@ async function handleRunAllCommand(options) {
394
454
  }
395
455
  finally {
396
456
  await reasoningBank.dispose();
457
+ if (evalManager)
458
+ await evalManager.dispose();
397
459
  }
398
460
  }
399
461
  async function handleStatusCommand(skill) {
@@ -531,7 +593,10 @@ export function createEvalCommand() {
531
593
  .option('--no-retry', 'Disable retry of failed tests')
532
594
  .option('-o, --output <path>', 'Output file path for results')
533
595
  .option('-v, --verbose', 'Show progress during execution', false)
596
+ .option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
597
+ .option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
534
598
  .action(async (opts) => {
599
+ applyMaxBudget(opts.maxBudgetUsd);
535
600
  await handleRunCommand({
536
601
  skill: opts.skill,
537
602
  model: opts.model,
@@ -542,6 +607,7 @@ export function createEvalCommand() {
542
607
  retry: opts.retry !== false,
543
608
  output: opts.output,
544
609
  verbose: opts.verbose,
610
+ mock: opts.mock === true,
545
611
  });
546
612
  });
547
613
  // Run all evals
@@ -554,7 +620,10 @@ export function createEvalCommand() {
554
620
  .option('-w, --workers <n>', 'Number of parallel workers', parseInt, 5)
555
621
  .option('-o, --output <path>', 'Output file path for report')
556
622
  .option('-v, --verbose', 'Show progress during execution', false)
623
+ .option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
624
+ .option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
557
625
  .action(async (opts) => {
626
+ applyMaxBudget(opts.maxBudgetUsd);
558
627
  await handleRunAllCommand({
559
628
  skillsTier: opts.skillsTier,
560
629
  models: opts.models,
@@ -562,6 +631,7 @@ export function createEvalCommand() {
562
631
  workers: opts.workers,
563
632
  output: opts.output,
564
633
  verbose: opts.verbose,
634
+ mock: opts.mock === true,
565
635
  });
566
636
  });
567
637
  // Status command
@@ -399,12 +399,14 @@ function formatCost(cost) {
399
399
  function getDefaultModelForProvider(provider) {
400
400
  const defaults = {
401
401
  claude: 'claude-sonnet-4-6',
402
+ 'claude-code': 'sonnet',
402
403
  openai: 'gpt-4o',
403
404
  ollama: 'llama3.1',
404
405
  openrouter: 'anthropic/claude-sonnet-4',
405
406
  gemini: 'gemini-2.0-pro',
406
407
  'azure-openai': 'gpt-4o',
407
408
  bedrock: 'anthropic.claude-sonnet-4-v1:0',
409
+ cognitum: 'cognitum-auto',
408
410
  onnx: 'phi-4',
409
411
  };
410
412
  return defaults[provider] || '';
@@ -22,6 +22,11 @@ export interface DaemonLivenessStatus {
22
22
  * tracks a *different*, in-process `QualityDaemon` instance that can't see a
23
23
  * truly detached process across separate CLI invocations anyway.
24
24
  */
25
+ /**
26
+ * ADR-123 (issue #557): print how the active LLM provider bills, plus any
27
+ * configured per-run budget cap. Best-effort — never throws into `aqe health`.
28
+ */
29
+ export declare function printLlmBilling(): void;
25
30
  export declare function checkDaemonLiveness(): DaemonLivenessStatus;
26
31
  export declare class StatusHandler implements ICommandHandler {
27
32
  readonly name = "status";
@@ -9,6 +9,8 @@ import { join } from 'node:path';
9
9
  import { getStatusColor, formatUptime, } from './interfaces.js';
10
10
  import { writeOutput, toJSON } from '../utils/ci-output.js';
11
11
  import { findProjectRoot } from '../../kernel/unified-memory.js';
12
+ import { loadRouterConfig } from '../../shared/llm/router/config-store.js';
13
+ import { billingModeForType } from '../../shared/llm/billing-modes.js';
12
14
  /**
13
15
  * Check whether the detached background-worker daemon (`.agentic-qe/workers/
14
16
  * start-daemon.cjs`, PID recorded in `daemon.pid` — see `10-workers.ts`) is
@@ -19,6 +21,36 @@ import { findProjectRoot } from '../../kernel/unified-memory.js';
19
21
  * tracks a *different*, in-process `QualityDaemon` instance that can't see a
20
22
  * truly detached process across separate CLI invocations anyway.
21
23
  */
24
+ /**
25
+ * ADR-123 (issue #557): print how the active LLM provider bills, plus any
26
+ * configured per-run budget cap. Best-effort — never throws into `aqe health`.
27
+ */
28
+ export function printLlmBilling() {
29
+ try {
30
+ const config = loadRouterConfig();
31
+ const primary = config.defaultProvider;
32
+ const mode = billingModeForType(primary);
33
+ const modeLabel = {
34
+ 'metered-api': `${chalk.red('●')} pay-per-token API key (no cap)`,
35
+ 'metered-capped': `${chalk.yellow('●')} pay-per-token with server-side cap`,
36
+ subscription: `${chalk.green('●')} Claude subscription (no per-token charge)`,
37
+ local: `${chalk.green('●')} local (no cost)`,
38
+ };
39
+ console.log(chalk.blue('\n LLM Billing:'));
40
+ console.log(` Provider: ${chalk.cyan(primary)} ${modeLabel[mode] ?? mode}`);
41
+ const cap = Number.parseFloat(process.env.AQE_MAX_BUDGET_USD ?? '');
42
+ if (Number.isFinite(cap) && cap > 0) {
43
+ console.log(` Per-run budget cap: ${chalk.cyan('$' + cap.toFixed(2))}`);
44
+ }
45
+ else if (mode === 'metered-api') {
46
+ console.log(chalk.gray(' No budget cap set — use AQE_MAX_BUDGET_USD or --max-budget-usd.'));
47
+ console.log(chalk.gray(' Tip: AQE_LLM_PROVIDER=claude-code runs on your Claude subscription.'));
48
+ }
49
+ }
50
+ catch {
51
+ // Billing display is informational; failures must not break health.
52
+ }
53
+ }
22
54
  export function checkDaemonLiveness() {
23
55
  try {
24
56
  const pidFile = join(findProjectRoot(), '.agentic-qe', 'workers', 'daemon.pid');
@@ -291,6 +323,9 @@ export class HealthHandler {
291
323
  else {
292
324
  console.log(` ${chalk.red('\u25CF')} Not running (stale PID: ${daemon.pid ?? 'unknown'}) \u2014 learning/consolidation snapshots will not advance`);
293
325
  }
326
+ // ADR-123 (issue #557): make LLM billing visible so a paid API key is
327
+ // never a silent surprise.
328
+ printLlmBilling();
294
329
  }
295
330
  console.log('');
296
331
  await this.cleanupAndExit(0);
@@ -184,6 +184,17 @@ export function registerProvidersFromEnv(enableLogging = false) {
184
184
  config.claude = {
185
185
  apiKey: process.env.ANTHROPIC_API_KEY,
186
186
  };
187
+ // ADR-123 (issue #557): this consensus/multi-model-verification path bills
188
+ // the pay-per-token Anthropic API, not a Claude subscription, and has no
189
+ // budget cap of its own. Surface it so the spend isn't silent. (Full
190
+ // subscription + budget support for the consensus ModelProvider layer is
191
+ // tracked as ADR-123 follow-up — it uses a different interface than the
192
+ // shared LLM ProviderManager.)
193
+ if ((process.env.AQE_LLM_NO_BILLING_NOTICE ?? '') !== '1') {
194
+ // eslint-disable-next-line no-console
195
+ console.error('⚠️ Consensus verification will use the Anthropic API key (pay-per-token, ' +
196
+ 'no budget cap). Unset ANTHROPIC_API_KEY to disable this path.');
197
+ }
187
198
  }
188
199
  // Detect OpenAI
189
200
  if (process.env.OPENAI_API_KEY) {
@@ -3,11 +3,82 @@
3
3
  * `.rvf` file using the @ruvector/rvf-node native binding via rvf-native-adapter.
4
4
  * Falls back to JSONL directory format when the native binding is unavailable.
5
5
  */
6
- import { existsSync, statSync, unlinkSync, writeFileSync } from 'fs';
7
- import { resolve } from 'path';
6
+ import { existsSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync } from 'fs';
7
+ import { basename, dirname, join, resolve } from 'path';
8
8
  import { createRvfStore, openRvfStore, openRvfStoreReadonly, isRvfNativeAvailable, } from './rvf-native-adapter.js';
9
9
  import { sha256, tableExists, queryAll, domainFilterForColumn, ensureTargetTables, mergeGenericRow, mergeAppendOnlyRow, TABLE_CONFIGS, TABLE_BLOB_COLUMNS, PK_COLUMNS, CONFIDENCE_COLUMNS, TIMESTAMP_COLUMNS, serializeRowBlobs, deserializeRowBlobs, } from './brain-shared.js';
10
10
  // --- Export ---
11
+ /**
12
+ * Sidecar suffixes that make up a complete store on disk. `''` is the store
13
+ * itself; the adapter writes `.idmap.json` on close, and we write the manifest.
14
+ */
15
+ const RVF_STORE_SUFFIXES = ['', '.idmap.json', '.manifest.json'];
16
+ /**
17
+ * Everything an abandoned tmp export can leave behind. `.lock` is cleaned up
18
+ * but deliberately absent from RVF_STORE_SUFFIXES — renaming a lock into the
19
+ * final path is the very corruption this fix exists to prevent.
20
+ */
21
+ const RVF_CLEANUP_SUFFIXES = [...RVF_STORE_SUFFIXES, '.lock'];
22
+ /** Best-effort removal of a store and its sidecars at `base`. */
23
+ function removeStoreFiles(base) {
24
+ for (const suffix of RVF_CLEANUP_SUFFIXES) {
25
+ try {
26
+ const p = `${base}${suffix}`;
27
+ if (existsSync(p))
28
+ unlinkSync(p);
29
+ }
30
+ catch {
31
+ // best-effort — a leftover tmp is inert, unlike a corrupt final store
32
+ }
33
+ }
34
+ }
35
+ /**
36
+ * Remove tmp stores orphaned by killed exports (#563). Each interrupted export
37
+ * strands a full-size tmp store, so on a project where the checkpoint hook is
38
+ * killed regularly these would accumulate unbounded.
39
+ *
40
+ * Only tmps whose owning pid is gone are removed: a live pid means a concurrent
41
+ * export is mid-write, and deleting its tmp would corrupt exactly what this
42
+ * change exists to protect.
43
+ */
44
+ function sweepStaleTmpFiles(outPath) {
45
+ const dir = dirname(outPath);
46
+ const prefix = `${basename(outPath)}.tmp.`;
47
+ let entries;
48
+ try {
49
+ entries = readdirSync(dir);
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ for (const entry of entries) {
55
+ if (!entry.startsWith(prefix))
56
+ continue;
57
+ // `<name>.rvf.tmp.<pid>` and its `<...>.tmp.<pid>.idmap.json` siblings.
58
+ const pid = Number.parseInt(entry.slice(prefix.length).split('.')[0], 10);
59
+ if (!Number.isInteger(pid) || pid <= 0)
60
+ continue;
61
+ if (pid !== process.pid && isPidAlive(pid))
62
+ continue;
63
+ try {
64
+ unlinkSync(join(dir, entry));
65
+ }
66
+ catch {
67
+ // best-effort
68
+ }
69
+ }
70
+ }
71
+ /** True when a process with `pid` exists (signal 0 probes without delivering). */
72
+ function isPidAlive(pid) {
73
+ try {
74
+ process.kill(pid, 0);
75
+ return true;
76
+ }
77
+ catch (err) {
78
+ // EPERM means it exists but belongs to another user — still alive.
79
+ return err.code === 'EPERM';
80
+ }
81
+ }
11
82
  /** Export brain state to a single `.rvf` file with vector embeddings + kernel. */
12
83
  export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
13
84
  if (!isRvfNativeAvailable()) {
@@ -15,14 +86,20 @@ export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
15
86
  }
16
87
  const outPath = resolve(options.outputPath);
17
88
  const dimension = options.dimension ?? 384;
18
- // Clean up any existing file
19
- if (existsSync(outPath))
20
- unlinkSync(outPath);
21
- const idmapPath = `${outPath}.idmap.json`;
22
- if (existsSync(idmapPath))
23
- unlinkSync(idmapPath);
89
+ // Issue #563: build the store at a private tmp path and rename it over the
90
+ // final path only once it is closed and complete. The previous code deleted
91
+ // the old store and then built the new one in place, so any interruption
92
+ // (hook timeout, session teardown, SIGKILL) left a created-but-incomplete
93
+ // store that could neither be opened (ManifestNotFound) nor created over
94
+ // (FsyncFailed) — permanently disabling the RVF backend. With tmp+rename an
95
+ // interrupted export leaves the *previous* good store untouched and orphans
96
+ // only an inert tmp file, which the next export sweeps.
97
+ const tmpPath = `${outPath}.tmp.${process.pid}`;
98
+ sweepStaleTmpFiles(outPath);
99
+ removeStoreFiles(tmpPath);
24
100
  // Create RVF container via adapter (handles idmap automatically)
25
- const rvf = createRvfStore(outPath, dimension);
101
+ const rvf = createRvfStore(tmpPath, dimension);
102
+ let closed = false;
26
103
  try {
27
104
  // --- Export all tables using TABLE_CONFIGS ---
28
105
  const allTableData = {};
@@ -153,12 +230,37 @@ export function exportBrainToRvf(db, options, sourceDbLabel = 'memory.db') {
153
230
  catch { /* best-effort */ }
154
231
  }
155
232
  // Persist manifest as sidecar JSON alongside the .rvf file
156
- const manifestPath = `${outPath}.manifest.json`;
157
- writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');
233
+ writeFileSync(`${tmpPath}.manifest.json`, JSON.stringify(manifest, null, 2), 'utf-8');
234
+ // Close before promoting: close() flushes the store and writes the idmap
235
+ // sidecar, so renaming any earlier would publish an incomplete store.
236
+ rvf.close();
237
+ closed = true;
238
+ // Promote tmp → final. The store itself goes last: until it lands, the
239
+ // previous store (if any) is still the one on disk, and a crash mid-promote
240
+ // leaves the old store readable rather than a half-written new one.
241
+ for (const suffix of [...RVF_STORE_SUFFIXES].reverse()) {
242
+ const from = `${tmpPath}${suffix}`;
243
+ const to = `${outPath}${suffix}`;
244
+ if (existsSync(from)) {
245
+ renameSync(from, to);
246
+ }
247
+ else if (existsSync(to)) {
248
+ // No new sidecar produced — drop the stale one so it can't be read
249
+ // against the new store.
250
+ unlinkSync(to);
251
+ }
252
+ }
158
253
  return manifest;
159
254
  }
160
- finally {
161
- rvf.close();
255
+ catch (err) {
256
+ if (!closed) {
257
+ try {
258
+ rvf.close();
259
+ }
260
+ catch { /* best-effort */ }
261
+ }
262
+ removeStoreFiles(tmpPath);
263
+ throw err;
162
264
  }
163
265
  }
164
266
  /** Legacy field-to-table mapping for older RVF exports. */
@@ -87,14 +87,31 @@ export class RvfDualWriter {
87
87
  nativeAdapter = adapter.openRvfStore(this.config.rvfPath);
88
88
  }
89
89
  catch {
90
- nativeAdapter = adapter.createRvfStore(this.config.rvfPath, this.config.dimensions);
90
+ try {
91
+ nativeAdapter = adapter.createRvfStore(this.config.rvfPath, this.config.dimensions);
92
+ }
93
+ catch (createErr) {
94
+ // Issue #563: open failed *and* create failed, so the file on disk is
95
+ // provably unusable — the signature of an export killed mid-write
96
+ // (open → ManifestNotFound, create → FsyncFailed because the path
97
+ // exists). Previously this fell to the catch below and disabled RVF
98
+ // silently for the whole run. Quarantine and rebuild instead.
99
+ const { quarantineUnusableStore } = await import('./rvf-store-integrity.js');
100
+ const quarantined = quarantineUnusableStore(this.config.rvfPath, createErr instanceof Error ? createErr.message : String(createErr));
101
+ if (!quarantined)
102
+ throw createErr; // live peer, or nothing to move
103
+ nativeAdapter = adapter.createRvfStore(this.config.rvfPath, this.config.dimensions);
104
+ }
91
105
  }
92
106
  this.rvfStore = wrapNativeAdapter(nativeAdapter, this.config.dimensions);
93
107
  this.rvfAvailable = true;
94
108
  }
95
- catch {
96
- // Native adapter module not available at all
109
+ catch (err) {
110
+ // Native adapter unavailable, or recovery itself failed. Degrade to
111
+ // sqlite-only — but say so, instead of vanishing silently (#563).
97
112
  this.rvfAvailable = false;
113
+ console.warn(`[RVF] Dual-writer disabled for ${this.config.rvfPath}; falling back to SQLite: ` +
114
+ `${err instanceof Error ? err.message : String(err)}`);
98
115
  }
99
116
  }
100
117
  /**
@@ -0,0 +1,49 @@
1
+ /**
2
+ * RVF store integrity helpers (issue #563).
3
+ *
4
+ * An export that is killed mid-write leaves a store that was created but never
5
+ * completed. Such a file cannot be opened (`RVF error 0x0106: ManifestNotFound`)
6
+ * and cannot be created over either, because the path already exists
7
+ * (`RVF error 0x0303: FsyncFailed`). Both paths fail forever, so the RVF
8
+ * backend stays disabled for the life of the project until someone deletes the
9
+ * file by hand.
10
+ *
11
+ * Recovery has to be evidence-based rather than fingerprint-based. Measured
12
+ * against @ruvector/rvf-node 0.1.8:
13
+ *
14
+ * • A *valid, empty* store is 162 bytes with magic `SFVR` — byte-for-byte
15
+ * the size the issue reports as "truncated: header only". Size and magic
16
+ * therefore cannot distinguish a broken store from a healthy empty one.
17
+ * • `<store>.lock` is a 104-byte record with magic `FLVR` and the owning pid
18
+ * as a little-endian u32 at offset 4. `FLVR` in a lock is the *normal*
19
+ * case — the issue reads it as "RVF store bytes leaked into the lock", but
20
+ * the store magic is `SFVR`; a 104-byte `FLVR` lock is just a live-or-stale
21
+ * lock record.
22
+ *
23
+ * So the only sound trigger is "open failed *and* create failed": at that point
24
+ * the file is provably unusable. The lock's pid is used as a *guard* — if it is
25
+ * held by a live process, the store is presumed healthy and left alone.
26
+ */
27
+ /** The pid recorded in `<rvfPath>.lock`, or null if there is no readable lock. */
28
+ export declare function readLockOwnerPid(rvfPath: string): number | null;
29
+ /**
30
+ * True when the store's lock is held by a process that is still running.
31
+ *
32
+ * Deliberately conservative: an unreadable or pid-less lock reports false (the
33
+ * caller's open already failed, so there is nothing to protect), while a live
34
+ * pid reports true and blocks recovery. Pid reuse can only produce a false
35
+ * "alive", which fails safe — we leave the store alone.
36
+ */
37
+ export declare function isLockHeldByLiveProcess(rvfPath: string): boolean;
38
+ /**
39
+ * Move an unusable store and its sidecars aside so the next create succeeds.
40
+ * Returns the quarantine base path, or null if nothing was quarantined.
41
+ *
42
+ * Only call this once open *and* create have both failed — that is the proof
43
+ * the file is unusable. The store is a derived cache, rebuilt from the unified
44
+ * DB, so quarantining is recoverable; we move rather than delete because the
45
+ * bytes may hold writes that never reached SQLite, and they are the only
46
+ * evidence if this recurs.
47
+ */
48
+ export declare function quarantineUnusableStore(rvfPath: string, reason: string): string | null;
49
+ //# sourceMappingURL=rvf-store-integrity.d.ts.map