agentic-qe 3.9.30 → 3.9.32

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 (345) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +208 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/bridge/captured-experience-bridge.js +31 -2
  5. package/dist/cli/bundle.js +5 -5
  6. package/dist/cli/chunks/adapter-CDQOF5TF.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-TOSXWTUQ.js → agent-booster-wasm-WKS3E6KT.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-2BU6TYZZ.js → agent-handler-LYCAWE7S.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-JFG3BXZY.js → agent-memory-branch-XF7IOMRK.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-RZK22CJB.js +2 -0
  11. package/dist/cli/chunks/{audit-4IGZZKUW.js → audit-D2AY3HFP.js} +2 -2
  12. package/dist/cli/chunks/base-UGH6TVO4.js +2 -0
  13. package/dist/cli/chunks/{hnswlib-node-STKRZIU3.js → better-sqlite3-K2VWFDKT.js} +2 -2
  14. package/dist/cli/chunks/{brain-handler-RIDW27HH.js → brain-handler-NNW4TAO2.js} +4 -4
  15. package/dist/cli/chunks/{branch-enumerator-GMYHLLWD.js → branch-enumerator-OM5HNZKV.js} +2 -2
  16. package/dist/cli/chunks/{browser-N76A3I2P.js → browser-Y2FU2NV4.js} +2 -2
  17. package/dist/cli/chunks/browser-workflow-SGOL3FCJ.js +2 -0
  18. package/dist/cli/chunks/{chunk-ETEHVG76.js → chunk-2L5GAOST.js} +2 -2
  19. package/dist/cli/chunks/{chunk-ECX6VXMW.js → chunk-2XC4XVCI.js} +1 -1
  20. package/dist/cli/chunks/{chunk-L7X3A36M.js → chunk-2Z2IQBIJ.js} +1 -1
  21. package/dist/cli/chunks/{chunk-UYLHIGNC.js → chunk-33PGBYTC.js} +2 -2
  22. package/dist/cli/chunks/{chunk-OOFWYDG6.js → chunk-3MHWBCSC.js} +1 -1
  23. package/dist/cli/chunks/{chunk-FI4HRS2G.js → chunk-3R4CMTWF.js} +2 -2
  24. package/dist/cli/chunks/{chunk-IP6ZTXNJ.js → chunk-45N22VAB.js} +2 -2
  25. package/dist/cli/chunks/{chunk-FG5GL26L.js → chunk-4H4PEZUX.js} +2 -2
  26. package/dist/cli/chunks/{chunk-CNNVL5W4.js → chunk-4VAZSCTZ.js} +2 -2
  27. package/dist/cli/chunks/{chunk-AWWD3EI3.js → chunk-5A6LBGRU.js} +2 -2
  28. package/dist/cli/chunks/{chunk-ER6BT4GS.js → chunk-5DSANX6S.js} +2 -2
  29. package/dist/cli/chunks/chunk-5R5WOLZM.js +5 -0
  30. package/dist/cli/chunks/{chunk-RNO6CE7I.js → chunk-5WR42V5O.js} +2 -2
  31. package/dist/cli/chunks/{chunk-UEXOMDRS.js → chunk-5XY6SULI.js} +2 -2
  32. package/dist/cli/chunks/{chunk-WVODEWH5.js → chunk-62UXGD5J.js} +14 -8
  33. package/dist/cli/chunks/{chunk-EWNJ6OAT.js → chunk-667I4RTC.js} +1 -1
  34. package/dist/cli/chunks/{chunk-ND6VCNN5.js → chunk-6EKXBWJD.js} +2 -2
  35. package/dist/cli/chunks/{chunk-Y57V4FDT.js → chunk-6R6QCGNU.js} +2 -2
  36. package/dist/cli/chunks/{chunk-VRP4GB4Y.js → chunk-6SYP7QX6.js} +4 -4
  37. package/dist/cli/chunks/{chunk-BFJLKG3D.js → chunk-6YGFAJ3X.js} +1 -1
  38. package/dist/cli/chunks/{chunk-UWWX4RK7.js → chunk-6ZG6TBWF.js} +4 -4
  39. package/dist/cli/chunks/{chunk-QSV4ROZD.js → chunk-7AISRWBS.js} +2 -2
  40. package/dist/cli/chunks/{chunk-SJCEPKZO.js → chunk-7IDPVSTF.js} +1 -1
  41. package/dist/cli/chunks/{chunk-HQIWLMDS.js → chunk-7PTW3M67.js} +2 -2
  42. package/dist/cli/chunks/{chunk-TA3QYAZ6.js → chunk-A4UNK5SY.js} +2 -2
  43. package/dist/cli/chunks/chunk-A6VI5BZU.js +95 -0
  44. package/dist/cli/chunks/{chunk-XVTZXCHI.js → chunk-BBPOTFIY.js} +2 -2
  45. package/dist/cli/chunks/{chunk-OEGFOMXP.js → chunk-BDXEL3GM.js} +2 -2
  46. package/dist/cli/chunks/{chunk-YETPSL6H.js → chunk-BGRC4676.js} +3 -3
  47. package/dist/cli/chunks/chunk-BQML7B4W.js +180 -0
  48. package/dist/cli/chunks/{chunk-DEDFPHJL.js → chunk-BV3SGEV7.js} +1 -1
  49. package/dist/cli/chunks/{chunk-FGMHVSLV.js → chunk-DBE2LIYG.js} +2 -2
  50. package/dist/cli/chunks/{chunk-2GBBZLXT.js → chunk-DFY7F4TE.js} +1 -1
  51. package/dist/cli/chunks/{chunk-LDGNVPBZ.js → chunk-EFEJLZDN.js} +1 -1
  52. package/dist/cli/chunks/{chunk-ZKZTSYPU.js → chunk-ESNBKAT6.js} +2 -2
  53. package/dist/cli/chunks/{chunk-5F26LSG2.js → chunk-EVSUZKD5.js} +2 -2
  54. package/dist/cli/chunks/{chunk-QOJ7EAF5.js → chunk-FFBF5BLQ.js} +1 -1
  55. package/dist/cli/chunks/{chunk-3AICELMQ.js → chunk-FIONYUVH.js} +2 -2
  56. package/dist/cli/chunks/{chunk-UROPIIB2.js → chunk-FNQCWEVJ.js} +2 -2
  57. package/dist/cli/chunks/{chunk-5DJAJPBG.js → chunk-FV2MU6CY.js} +2 -2
  58. package/dist/cli/chunks/{chunk-QTS2DS42.js → chunk-FWEYOD3S.js} +2 -2
  59. package/dist/cli/chunks/{chunk-XK6YXCS7.js → chunk-G6AJMFWL.js} +3 -3
  60. package/dist/cli/chunks/{chunk-R57J3O6I.js → chunk-G6VVOUUF.js} +2 -2
  61. package/dist/cli/chunks/{chunk-2O5TT3UT.js → chunk-G77CYF7H.js} +3 -3
  62. package/dist/cli/chunks/{chunk-TULNR2AH.js → chunk-H7YKTJMY.js} +2 -2
  63. package/dist/cli/chunks/{chunk-GEXVUFK4.js → chunk-HGWQC7PR.js} +2 -2
  64. package/dist/cli/chunks/{chunk-QLNS6DGB.js → chunk-HHBFI3YA.js} +2 -2
  65. package/dist/cli/chunks/{chunk-WP6X67YI.js → chunk-HPQZSXED.js} +1 -1
  66. package/dist/cli/chunks/{chunk-HA7N45KB.js → chunk-HR6NX6DW.js} +2 -2
  67. package/dist/cli/chunks/{chunk-HB52S6IV.js → chunk-I6Q6BPVH.js} +1 -1
  68. package/dist/cli/chunks/{chunk-BM73MJLE.js → chunk-IGEZVFOM.js} +2 -2
  69. package/dist/cli/chunks/{chunk-QBDXUI2H.js → chunk-IGQPGXP7.js} +2 -2
  70. package/dist/cli/chunks/{chunk-Q26GG6WO.js → chunk-IJQJV7BC.js} +3 -3
  71. package/dist/cli/chunks/chunk-JDW6GN3A.js +2 -0
  72. package/dist/cli/chunks/{chunk-GZ3U2QT2.js → chunk-JRYNHFZA.js} +1 -1
  73. package/dist/cli/chunks/{chunk-MV3NUANS.js → chunk-KHZRNJ3A.js} +1 -1
  74. package/dist/cli/chunks/chunk-LHDTXTS7.js +2 -0
  75. package/dist/cli/chunks/{chunk-52TRKIAQ.js → chunk-LI2IOJMM.js} +1 -1
  76. package/dist/cli/chunks/{heartbeat-scheduler-CNJBAO5C.js → chunk-LR5VW3OS.js} +2 -2
  77. package/dist/cli/chunks/{chunk-2NFGUFYU.js → chunk-LTSNDM5N.js} +2 -2
  78. package/dist/cli/chunks/{chunk-3EP2YZSY.js → chunk-M5PYPGBC.js} +2 -2
  79. package/dist/cli/chunks/{chunk-JCWHX4XV.js → chunk-MEHNT37H.js} +2 -2
  80. package/dist/cli/chunks/{chunk-QHKK2H4H.js → chunk-MERMCKPG.js} +1 -1
  81. package/dist/cli/chunks/{chunk-Q53UMLLC.js → chunk-MIHQIAVK.js} +2 -2
  82. package/dist/cli/chunks/{chunk-VOBNJWZF.js → chunk-MMVSERJQ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-37I6K7QO.js → chunk-MQQANXFS.js} +2 -2
  84. package/dist/cli/chunks/{chunk-YKFURJNP.js → chunk-MTOHV22P.js} +1 -1
  85. package/dist/cli/chunks/{chunk-MOLOWMON.js → chunk-NVZHCAEB.js} +2 -2
  86. package/dist/cli/chunks/{chunk-YXR5RYRE.js → chunk-NW5FYGDE.js} +2 -2
  87. package/dist/cli/chunks/{chunk-NMBHF7ZD.js → chunk-NZRJWK5H.js} +61 -121
  88. package/dist/cli/chunks/chunk-O5NEZCTB.js +2 -0
  89. package/dist/cli/chunks/{chunk-E7UHOKKL.js → chunk-O5UGJ3OI.js} +2 -2
  90. package/dist/cli/chunks/{chunk-Q4HJRYQB.js → chunk-OK2TFTXP.js} +2 -2
  91. package/dist/cli/chunks/{chunk-FGDEM4HU.js → chunk-OKEHGXIS.js} +2 -2
  92. package/dist/cli/chunks/{chunk-C6TNYLD7.js → chunk-OKRY4LNE.js} +3 -3
  93. package/dist/cli/chunks/{chunk-3WIU2E2Y.js → chunk-OMOGD2NN.js} +2 -2
  94. package/dist/cli/chunks/{chunk-DJRWVNHK.js → chunk-ONNTJXU7.js} +2 -2
  95. package/dist/cli/chunks/chunk-OPOGZAN5.js +14 -0
  96. package/dist/cli/chunks/{chunk-OTFJCZNY.js → chunk-PG5F2VHA.js} +2 -2
  97. package/dist/cli/chunks/{chunk-MYF7F3ZP.js → chunk-PHRMWRXA.js} +2 -2
  98. package/dist/cli/chunks/{chunk-7D2DM23U.js → chunk-PIXUX2NR.js} +2 -2
  99. package/dist/cli/chunks/{chunk-IWC6GR24.js → chunk-PLGMPG7S.js} +2 -2
  100. package/dist/cli/chunks/{chunk-T2DIMSQF.js → chunk-PPS6VN24.js} +1 -1
  101. package/dist/cli/chunks/{chunk-AUNNGKLN.js → chunk-PQAYCK2U.js} +2 -2
  102. package/dist/cli/chunks/{chunk-FU74OETU.js → chunk-PS6ISBED.js} +2 -2
  103. package/dist/cli/chunks/{chunk-JNRRDG7O.js → chunk-QPYNQSWD.js} +2 -2
  104. package/dist/cli/chunks/{chunk-MHPK4ZPK.js → chunk-QRTZ67BC.js} +2 -2
  105. package/dist/cli/chunks/{chunk-Z3TXQOS7.js → chunk-REW3W3ZW.js} +1 -1
  106. package/dist/cli/chunks/{chunk-3PZDXE5E.js → chunk-RHXYZ6AZ.js} +127 -127
  107. package/dist/cli/chunks/{chunk-IEGAEXQX.js → chunk-RZXAXWBD.js} +2 -2
  108. package/dist/cli/chunks/{chunk-4UZQSPR4.js → chunk-S4M7U6CZ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-H27XUYWZ.js → chunk-SJETAUZA.js} +1 -1
  110. package/dist/cli/chunks/{chunk-MZ7M2CDV.js → chunk-SLH7LFVY.js} +2 -2
  111. package/dist/cli/chunks/{chunk-6EP3GHED.js → chunk-SRJ5N7LD.js} +2 -2
  112. package/dist/cli/chunks/{chunk-XDYTQPJM.js → chunk-T5ADVYPH.js} +1 -1
  113. package/dist/cli/chunks/{chunk-TYZGEVP6.js → chunk-THYGFSTA.js} +12 -6
  114. package/dist/cli/chunks/{chunk-XKH4E2IQ.js → chunk-TX2DBLTL.js} +1 -1
  115. package/dist/cli/chunks/{chunk-HJDHQBMJ.js → chunk-UJMGNO6L.js} +1 -1
  116. package/dist/cli/chunks/{chunk-MCXRS2TZ.js → chunk-UUQ3SOKM.js} +1 -1
  117. package/dist/cli/chunks/{chunk-USN2JKUW.js → chunk-V5RLGPEW.js} +2 -2
  118. package/dist/cli/chunks/chunk-V6HM2BKJ.js +2 -0
  119. package/dist/cli/chunks/{chunk-R5IW5ARI.js → chunk-V7I6FTLG.js} +1 -1
  120. package/dist/cli/chunks/{chunk-2MKSEL6F.js → chunk-V7ZBPSVG.js} +1 -1
  121. package/dist/cli/chunks/{chunk-IOINZWNA.js → chunk-VJL7DNUU.js} +29 -17
  122. package/dist/cli/chunks/{chunk-JCDEMPJS.js → chunk-VKCWWR6C.js} +1 -1
  123. package/dist/cli/chunks/chunk-VKNCMGOJ.js +29 -0
  124. package/dist/cli/chunks/{chunk-GRPEDIYG.js → chunk-W2VTHUDK.js} +2 -2
  125. package/dist/cli/chunks/{chunk-SAVITYEX.js → chunk-W3JB3G7C.js} +2 -2
  126. package/dist/cli/chunks/{chunk-WTXRPYNN.js → chunk-WQ4MT74X.js} +1 -1
  127. package/dist/cli/chunks/{chunk-GY4EGQO3.js → chunk-WTNM7NA4.js} +1 -1
  128. package/dist/cli/chunks/chunk-XB3SIYGU.js +62 -0
  129. package/dist/cli/chunks/{chunk-IHRFR5SV.js → chunk-XCUNQ3FK.js} +2 -2
  130. package/dist/cli/chunks/{chunk-ITBPDVK5.js → chunk-XHQFVTFD.js} +1 -1
  131. package/dist/cli/chunks/{chunk-KJZXBZQR.js → chunk-YBUUAFKR.js} +1 -1
  132. package/dist/cli/chunks/{chunk-KR2PGNXX.js → chunk-YJV6TTCW.js} +2 -2
  133. package/dist/cli/chunks/{chunk-BQLFOJ5G.js → chunk-YUSGT2CU.js} +1 -1
  134. package/dist/cli/chunks/{chunk-5E3YCZC5.js → chunk-YUTSN5BK.js} +2 -2
  135. package/dist/cli/chunks/{chunk-DDMFTEJP.js → chunk-YVMJTBXB.js} +3 -3
  136. package/dist/cli/chunks/chunk-YVQ4PR4H.js +2 -0
  137. package/dist/cli/chunks/{chunk-RYMHYTOK.js → chunk-Z2EDNMCQ.js} +3 -3
  138. package/dist/cli/chunks/{chunk-QNSUPXUU.js → chunk-ZESMMAKZ.js} +2 -2
  139. package/dist/cli/chunks/chunk-ZIVOT3B7.js +2 -0
  140. package/dist/cli/chunks/{ci-BYCH3NPL.js → ci-NSF6OHB4.js} +2 -2
  141. package/dist/cli/chunks/{ci-output-P7P4XH6F.js → ci-output-ZPDJ42U3.js} +2 -2
  142. package/dist/cli/chunks/{circuit-breaker-VLX556ZI.js → circuit-breaker-Y2RUJDYG.js} +2 -2
  143. package/dist/cli/chunks/{claude-flow-setup-JPR425PL.js → claude-flow-setup-OH6G6KM2.js} +2 -2
  144. package/dist/cli/chunks/client-QQGRKAY7.js +2 -0
  145. package/dist/cli/chunks/{cline-installer-FOY47NSH.js → cline-installer-IHH4F27G.js} +2 -2
  146. package/dist/cli/chunks/{code-57SN4ZDY.js → code-SFAHWFTX.js} +2 -2
  147. package/dist/cli/chunks/{code-index-extractor-GT7UFRYU.js → code-index-extractor-GXECMOM2.js} +2 -2
  148. package/dist/cli/chunks/{codex-installer-JAGWONAV.js → codex-installer-UPMSAFCQ.js} +2 -2
  149. package/dist/cli/chunks/{completions-7YLHPGSV.js → completions-5TX6LDHY.js} +2 -2
  150. package/dist/cli/chunks/{complexity-analyzer-TQUF6BEI.js → complexity-analyzer-J2ZR3XZB.js} +2 -2
  151. package/dist/cli/chunks/{continuedev-installer-TICV6IGT.js → continuedev-installer-GWYZKB5A.js} +2 -2
  152. package/dist/cli/chunks/{copilot-installer-A6PDMI52.js → copilot-installer-DQZMQWI7.js} +2 -2
  153. package/dist/cli/chunks/{cost-tracker-NZPNHNV2.js → cost-tracker-V7KIGCLZ.js} +2 -2
  154. package/dist/cli/chunks/{coverage-HBEB2LKS.js → coverage-3X6LA2GZ.js} +3 -3
  155. package/dist/cli/chunks/cross-domain-router-3SHAGRVP.js +2 -0
  156. package/dist/cli/chunks/{cursor-installer-R4FM7MGN.js → cursor-installer-ENDG4JIU.js} +2 -2
  157. package/dist/cli/chunks/daemon-4XVAO7GT.js +16 -0
  158. package/dist/cli/chunks/daemon-TC65CQFK.js +10 -0
  159. package/dist/cli/chunks/{dag-attention-scheduler-2L7VCYZ3.js → dag-attention-scheduler-JOSCDRZC.js} +2 -2
  160. package/dist/cli/chunks/{detect-EEWB4IYE.js → detect-KWZX3OMK.js} +2 -2
  161. package/dist/cli/chunks/{dist-node-7RM6BB2X.js → dist-node-R4U2PJ47.js} +2 -2
  162. package/dist/cli/chunks/{domain-handler-RVGHBDUJ.js → domain-handler-BMYYZO2L.js} +2 -2
  163. package/dist/cli/chunks/{domain-transfer-M5MERQG5.js → domain-transfer-MSDBBDLC.js} +2 -2
  164. package/dist/cli/chunks/dream-OCZK42FM.js +2 -0
  165. package/dist/cli/chunks/{embed-and-insert-pattern-MS55QS73.js → embed-and-insert-pattern-MFINPOLS.js} +2 -2
  166. package/dist/cli/chunks/{eval-MBTMI7KN.js → eval-OER6UNUY.js} +2 -2
  167. package/dist/cli/chunks/{experience-capture-middleware-Z5XB7D6A.js → experience-capture-middleware-F5I77ECG.js} +3 -3
  168. package/dist/cli/chunks/{fast-paths-FSWLHI4I.js → fast-paths-P3KT5DUQ.js} +2 -2
  169. package/dist/cli/chunks/{feature-flags-QUPNH2J5.js → feature-flags-5EBWQ5WU.js} +2 -2
  170. package/dist/cli/chunks/{feature-flags-ATYOPR5D.js → feature-flags-DYFZSQLV.js} +2 -2
  171. package/dist/cli/chunks/{file-discovery-SOJJEQ2E.js → file-discovery-MOBVABSM.js} +2 -2
  172. package/dist/cli/chunks/{fleet-PWBTDWVG.js → fleet-J3R3NQNC.js} +3 -3
  173. package/dist/cli/chunks/{gnn-wrapper-2N67VQOQ.js → gnn-wrapper-QD76SULF.js} +2 -2
  174. package/dist/cli/chunks/{heartbeat-handler-5PSG2UPO.js → heartbeat-handler-AJEWTPZ4.js} +4 -4
  175. package/dist/cli/chunks/heartbeat-scheduler-EAVZR6TJ.js +2 -0
  176. package/dist/cli/chunks/hnsw-adapter-BY4XB7FB.js +2 -0
  177. package/dist/cli/chunks/hnsw-index-657CZRG7.js +2 -0
  178. package/dist/cli/chunks/{hnsw-legacy-bridge-YIXH5T4U.js → hnsw-legacy-bridge-5VRM5N7K.js} +2 -2
  179. package/dist/cli/chunks/{better-sqlite3-3U2AVWQ3.js → hnswlib-node-BWUH4OQT.js} +2 -2
  180. package/dist/cli/chunks/hooks-7PMVKQOE.js +248 -0
  181. package/dist/cli/chunks/{hybrid-router-RL47S47Z.js → hybrid-router-2K2LW45J.js} +2 -2
  182. package/dist/cli/chunks/{hypergraph-engine-XW2IHFWW.js → hypergraph-engine-2CQ735JO.js} +2 -2
  183. package/dist/cli/chunks/{hypergraph-handler-AQXKY4UF.js → hypergraph-handler-AQ53GVIW.js} +3 -3
  184. package/dist/cli/chunks/impact-analyzer-GI6UVAMT.js +2 -0
  185. package/dist/cli/chunks/{init-handler-KXYGJQI5.js → init-handler-ZOVJPAWO.js} +6 -6
  186. package/dist/cli/chunks/init-wizard-HOH577MH.js +2 -0
  187. package/dist/cli/chunks/kernel-JDYBG5GE.js +2 -0
  188. package/dist/cli/chunks/{kilocode-installer-VSULDGRO.js → kilocode-installer-GWQCNLKI.js} +2 -2
  189. package/dist/cli/chunks/{kiro-installer-SH4D2UXW.js → kiro-installer-6KVES4MO.js} +2 -2
  190. package/dist/cli/chunks/knowledge-graph-RAQOWLG3.js +2 -0
  191. package/dist/cli/chunks/learning-6XMNWXRT.js +117 -0
  192. package/dist/cli/chunks/{llm-router-YXXSQX5K.js → llm-router-GS4AZJJC.js} +4 -4
  193. package/dist/cli/chunks/{load-S52R2SLL.js → load-FEMEQNE6.js} +2 -2
  194. package/dist/cli/chunks/load-test-3MEJ43U2.js +2 -0
  195. package/dist/cli/chunks/{mcp-ZWMAJIU7.js → mcp-6V2H7EXU.js} +2 -2
  196. package/dist/cli/chunks/{memory-4YTWWDK7.js → memory-YLGPOB2H.js} +5 -5
  197. package/dist/cli/chunks/memory-backend-2A47ZRGO.js +2 -0
  198. package/dist/cli/chunks/memory-handlers-UBTBC7D2.js +2 -0
  199. package/dist/cli/chunks/{multi-model-executor-F3VEM2UF.js → multi-model-executor-SL2EKAH2.js} +2 -2
  200. package/dist/cli/chunks/{opencode-installer-Z2CUJQ6D.js → opencode-installer-ADOJVGNA.js} +2 -2
  201. package/dist/cli/chunks/{orchestrator-UPXR2XOF.js → orchestrator-O4IWW2VU.js} +37 -18
  202. package/dist/cli/chunks/{pipeline-6MEMAIXM.js → pipeline-5BD5YQNQ.js} +2 -2
  203. package/dist/cli/chunks/{platform-H72FLOM7.js → platform-HXSUOOJH.js} +2 -2
  204. package/dist/cli/chunks/{plugin-GIMQFDVR.js → plugin-HOLH5CUH.js} +2 -2
  205. package/dist/cli/chunks/{prime-radiant-advanced-wasm-DM5FR5SV.js → prime-radiant-advanced-wasm-PJTL7OLS.js} +2 -2
  206. package/dist/cli/chunks/protocol-executor-3FR7FBVM.js +2 -0
  207. package/dist/cli/chunks/{protocol-handler-YW3N333B.js → protocol-handler-K27YGLC7.js} +2 -2
  208. package/dist/cli/chunks/{prove-IJY524KK.js → prove-MHCLHQQ6.js} +2 -2
  209. package/dist/cli/chunks/{provider-manager-FNG6YR2V.js → provider-manager-3645PPXX.js} +2 -2
  210. package/dist/cli/chunks/qe-reasoning-bank-CHNYPYQW.js +2 -0
  211. package/dist/cli/chunks/{quality-EZLAMSCP.js → quality-NDE6EDOY.js} +2 -2
  212. package/dist/cli/chunks/queen-coordinator-J6ZRYTBX.js +2 -0
  213. package/dist/cli/chunks/{real-embeddings-MFRCC6GH.js → real-embeddings-VD3EVV3U.js} +2 -2
  214. package/dist/cli/chunks/{roocode-installer-H3ZIRGWU.js → roocode-installer-63Y45UUG.js} +2 -2
  215. package/dist/cli/chunks/router-23HRN2Z6.js +2 -0
  216. package/dist/cli/chunks/routing-feedback-R6A4B6ZG.js +2 -0
  217. package/dist/cli/chunks/{routing-handler-T2A7FYHW.js → routing-handler-76XISU2E.js} +2 -2
  218. package/dist/cli/chunks/{ruvector-commands-TCLWBP2M.js → ruvector-commands-AEKOZZHZ.js} +2 -2
  219. package/dist/cli/chunks/{rvf-dual-writer-BE3JCPYC.js → rvf-dual-writer-4DMUIZQF.js} +2 -2
  220. package/dist/cli/chunks/{rvf-migration-adapter-MLUX5YGR.js → rvf-migration-adapter-YUTXFOZ3.js} +2 -2
  221. package/dist/cli/chunks/{rvf-migration-coordinator-OAQXTASZ.js → rvf-migration-coordinator-XJ5N2W37.js} +2 -2
  222. package/dist/cli/chunks/rvf-native-adapter-QINEJZM7.js +2 -0
  223. package/dist/cli/chunks/safe-db-YXMCSKFH.js +2 -0
  224. package/dist/cli/chunks/schedule-XVFD27P5.js +2 -0
  225. package/dist/cli/chunks/scheduler-NWH2IDEU.js +2 -0
  226. package/dist/cli/chunks/{security-SHWJWJ4M.js → security-6YS6GQGO.js} +3 -3
  227. package/dist/cli/chunks/shared-rvf-adapter-FTZY35WI.js +2 -0
  228. package/dist/cli/chunks/{shared-rvf-dual-writer-BKSR2FFK.js → shared-rvf-dual-writer-MH2Y65HA.js} +2 -2
  229. package/dist/cli/chunks/sqlite-persistence-BR6YJF5P.js +2 -0
  230. package/dist/cli/chunks/{status-handler-QK5KMKYC.js → status-handler-57JQMPY5.js} +2 -2
  231. package/dist/cli/chunks/{structural-health-3BRNCAYQ.js → structural-health-34D5VWRD.js} +2 -2
  232. package/dist/cli/chunks/sync-HJD2US5P.js +2 -0
  233. package/dist/cli/chunks/sync-TTQ6ZB5D.js +17 -0
  234. package/dist/cli/chunks/{task-handler-VH2CLUIA.js → task-handler-4RF57637.js} +2 -2
  235. package/dist/cli/chunks/{task-handlers-BUZNV2VX.js → task-handlers-BRSK7HDE.js} +3 -3
  236. package/dist/cli/chunks/{test-K24JQQZ2.js → test-GMUW2VR3.js} +4 -4
  237. package/dist/cli/chunks/{test-scheduling-MHXRV5VI.js → test-scheduling-7LF24IFV.js} +3 -3
  238. package/dist/cli/chunks/{token-bootstrap-3NZDLG52.js → token-bootstrap-VYT4RTHU.js} +2 -2
  239. package/dist/cli/chunks/{token-usage-C4BGA2O7.js → token-usage-NFNCPQGW.js} +2 -2
  240. package/dist/cli/chunks/{transformers-ZIIFB2V4.js → transformers-GGD5GIEY.js} +2 -2
  241. package/dist/cli/chunks/{tree-sitter-wasm-parser-GES2AV7A.js → tree-sitter-wasm-parser-GKYG6NKT.js} +2 -2
  242. package/dist/cli/chunks/{types-L3MO5VNC.js → types-WJ3ZTRD5.js} +2 -2
  243. package/dist/cli/chunks/unified-memory-AT3Z4CY7.js +2 -0
  244. package/dist/cli/chunks/unified-memory-hnsw-6FOIGINN.js +2 -0
  245. package/dist/cli/chunks/unified-persistence-TCJB7MQS.js +2 -0
  246. package/dist/cli/chunks/{upgrade-EKJYS5S5.js → upgrade-IMBT4F6K.js} +2 -2
  247. package/dist/cli/chunks/{validate-WYWWB5PQ.js → validate-76OVF45Z.js} +2 -2
  248. package/dist/cli/chunks/{validate-swarm-SBSWKJ3H.js → validate-swarm-HH2ZYWXA.js} +2 -2
  249. package/dist/cli/chunks/{vibium-VEMTLNFV.js → vibium-74WQNDBX.js} +2 -2
  250. package/dist/cli/chunks/visual-security-IBAUX2K5.js +2 -0
  251. package/dist/cli/chunks/{web-tree-sitter-STW2WR2J.js → web-tree-sitter-W6RGE4SL.js} +2 -2
  252. package/dist/cli/chunks/{windsurf-installer-6ZXMJASZ.js → windsurf-installer-7DMSFCA2.js} +2 -2
  253. package/dist/cli/chunks/{witness-chain-PTULB4MR.js → witness-chain-BLZ4ZKAD.js} +2 -2
  254. package/dist/cli/chunks/witness-chain-GNNF23XU.js +2 -0
  255. package/dist/cli/chunks/{workflow-TEBAAHNR.js → workflow-RNSDKRZ4.js} +4 -4
  256. package/dist/cli/chunks/workflow-orchestrator-S2YONHGM.js +2 -0
  257. package/dist/cli/chunks/{wrappers-DVMVRKXK.js → wrappers-J7RXMIOY.js} +2 -2
  258. package/dist/cli/commands/hooks-handlers/editing-hooks.js +9 -3
  259. package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +16 -24
  260. package/dist/cli/commands/hooks-handlers/hooks-shared.d.ts +1 -1
  261. package/dist/cli/commands/hooks-handlers/hooks-shared.js +8 -1
  262. package/dist/cli/commands/hooks-handlers/routing-hooks.js +15 -3
  263. package/dist/cli/commands/hooks-handlers/task-hooks.js +37 -46
  264. package/dist/cli/commands/learning.js +194 -0
  265. package/dist/domains/learning-optimization/services/learning-coordinator.js +37 -17
  266. package/dist/init/phases/10-workers.js +20 -1
  267. package/dist/kernel/hybrid-backend.d.ts +17 -7
  268. package/dist/kernel/hybrid-backend.js +24 -10
  269. package/dist/kernel/interfaces.d.ts +33 -6
  270. package/dist/kernel/kernel.d.ts +1 -0
  271. package/dist/kernel/kernel.js +57 -0
  272. package/dist/kernel/memory-backend.d.ts +5 -5
  273. package/dist/kernel/memory-backend.js +14 -7
  274. package/dist/kernel/unified-memory-schemas.d.ts +1 -1
  275. package/dist/kernel/unified-memory-schemas.js +7 -1
  276. package/dist/learning/agent-routing.d.ts +134 -1
  277. package/dist/learning/agent-routing.js +185 -2
  278. package/dist/learning/dream/dream-insights-pruner.d.ts +49 -0
  279. package/dist/learning/dream/dream-insights-pruner.js +53 -0
  280. package/dist/learning/dream/dream-scheduler.js +17 -0
  281. package/dist/learning/loop-health.d.ts +84 -0
  282. package/dist/learning/loop-health.js +91 -0
  283. package/dist/learning/pattern-usage-recorder.d.ts +58 -0
  284. package/dist/learning/pattern-usage-recorder.js +72 -0
  285. package/dist/learning/qe-reasoning-bank-types.d.ts +11 -0
  286. package/dist/learning/qe-reasoning-bank.d.ts +11 -0
  287. package/dist/learning/qe-reasoning-bank.js +86 -3
  288. package/dist/learning/routing-topology-gate.d.ts +40 -0
  289. package/dist/learning/routing-topology-gate.js +55 -0
  290. package/dist/learning/sqlite-persistence.d.ts +6 -1
  291. package/dist/learning/sqlite-persistence.js +14 -20
  292. package/dist/mcp/bundle.js +3837 -3811
  293. package/dist/mcp/handlers/core-handlers.js +21 -0
  294. package/dist/routing/routing-feedback.js +7 -3
  295. package/dist/routing/routing-outcomes-migration.d.ts +31 -0
  296. package/dist/routing/routing-outcomes-migration.js +60 -0
  297. package/dist/workers/interfaces.d.ts +26 -0
  298. package/dist/workers/worker-manager.d.ts +15 -12
  299. package/dist/workers/worker-manager.js +11 -0
  300. package/dist/workers/workers/learning-consolidation.d.ts +28 -0
  301. package/dist/workers/workers/learning-consolidation.js +302 -71
  302. package/package.json +3 -1
  303. package/dist/cli/chunks/adapter-HV42JOZD.js +0 -2
  304. package/dist/cli/chunks/aqe-learning-engine-GL22PE2V.js +0 -2
  305. package/dist/cli/chunks/base-4KQ2FGUX.js +0 -2
  306. package/dist/cli/chunks/browser-workflow-CTE7BDM4.js +0 -2
  307. package/dist/cli/chunks/chunk-3NGNSKL3.js +0 -14
  308. package/dist/cli/chunks/chunk-6HSFZ6SL.js +0 -180
  309. package/dist/cli/chunks/chunk-7Z3GBQNV.js +0 -2
  310. package/dist/cli/chunks/chunk-AQJ6XS34.js +0 -2
  311. package/dist/cli/chunks/chunk-H2IMXQCJ.js +0 -2
  312. package/dist/cli/chunks/chunk-SPCANEJY.js +0 -95
  313. package/dist/cli/chunks/client-FRVNMXQO.js +0 -2
  314. package/dist/cli/chunks/cross-domain-router-BVCPAWG2.js +0 -2
  315. package/dist/cli/chunks/daemon-PHIZPZIE.js +0 -19
  316. package/dist/cli/chunks/dream-77ODIFIF.js +0 -2
  317. package/dist/cli/chunks/hnsw-adapter-CQGQS3V7.js +0 -2
  318. package/dist/cli/chunks/hnsw-index-2ACF6FOJ.js +0 -2
  319. package/dist/cli/chunks/hooks-YROFO6PE.js +0 -259
  320. package/dist/cli/chunks/impact-analyzer-LWEGK23B.js +0 -2
  321. package/dist/cli/chunks/init-wizard-7BS3QMWR.js +0 -2
  322. package/dist/cli/chunks/kernel-TX67WXSI.js +0 -2
  323. package/dist/cli/chunks/knowledge-graph-TDSP2UE2.js +0 -2
  324. package/dist/cli/chunks/learning-RRWV3SEL.js +0 -107
  325. package/dist/cli/chunks/load-test-GEBBBUMV.js +0 -2
  326. package/dist/cli/chunks/memory-backend-WQS2MLW2.js +0 -2
  327. package/dist/cli/chunks/memory-handlers-RTY5MBA5.js +0 -2
  328. package/dist/cli/chunks/protocol-executor-DT7XHMLL.js +0 -2
  329. package/dist/cli/chunks/qe-reasoning-bank-LDNETZVA.js +0 -2
  330. package/dist/cli/chunks/queen-coordinator-AF7HCQSM.js +0 -2
  331. package/dist/cli/chunks/router-OWQ5EI72.js +0 -2
  332. package/dist/cli/chunks/routing-feedback-B43DEQMK.js +0 -2
  333. package/dist/cli/chunks/rvf-native-adapter-XBJDXHNI.js +0 -2
  334. package/dist/cli/chunks/safe-db-RT3LEDUG.js +0 -2
  335. package/dist/cli/chunks/schedule-EHUDCKS2.js +0 -2
  336. package/dist/cli/chunks/scheduler-GEGZ4J3C.js +0 -2
  337. package/dist/cli/chunks/shared-rvf-adapter-LNBUNRAM.js +0 -2
  338. package/dist/cli/chunks/sqlite-persistence-3DGRJH3K.js +0 -2
  339. package/dist/cli/chunks/sync-5CDYOT3H.js +0 -23
  340. package/dist/cli/chunks/unified-memory-ZSBX4LYU.js +0 -2
  341. package/dist/cli/chunks/unified-memory-hnsw-Y6EKAMRP.js +0 -2
  342. package/dist/cli/chunks/unified-persistence-2PDVU2U5.js +0 -2
  343. package/dist/cli/chunks/visual-security-RHMFLKVQ.js +0 -2
  344. package/dist/cli/chunks/witness-chain-QO237QOF.js +0 -2
  345. package/dist/cli/chunks/workflow-orchestrator-RHM5MIGE.js +0 -2
@@ -14,11 +14,14 @@
14
14
  */
15
15
  import { BaseWorker } from '../base-worker';
16
16
  import { ALL_DOMAINS } from '../../shared/types';
17
+ import { TimeRange } from '../../shared/value-objects/index.js';
17
18
  import { DreamEngine } from '../../learning/dream/index.js';
18
19
  import { createPatternLifecycleManager, } from '../../learning/pattern-lifecycle.js';
19
20
  import { getUnifiedMemory } from '../../kernel/unified-memory.js';
20
21
  import { toErrorMessage } from '../../shared/error-utils.js';
21
22
  import { ExperienceConsolidator } from '../../learning/experience-consolidation.js';
23
+ import { recordLoopHealth } from '../../learning/loop-health.js';
24
+ import { pruneStaleDreamInsights } from '../../learning/dream/dream-insights-pruner.js';
22
25
  const CONFIG = {
23
26
  id: 'learning-consolidation',
24
27
  name: 'Learning Consolidation',
@@ -31,6 +34,19 @@ const CONFIG = {
31
34
  retryCount: 2,
32
35
  retryDelayMs: 30000,
33
36
  };
37
+ /**
38
+ * #486 Gap A: per-domain watermark for the mineExperiences sweep.
39
+ * Stored at `learning:consolidation-cursor:{domain}` as an ISO timestamp.
40
+ * Advances only on successful mining with non-zero experiences — failures
41
+ * leave the cursor untouched so the next tick retries the same window.
42
+ */
43
+ const CONSOLIDATION_CURSOR_PREFIX = 'learning:consolidation-cursor:';
44
+ const DEFAULT_LOOKBACK_DAYS = 1;
45
+ /**
46
+ * #488 C.2: retention window for `applied = 0` dream insights. Matches the
47
+ * `staleDaysThreshold` used by `pattern-lifecycle.ts` for consistency.
48
+ */
49
+ const DREAM_INSIGHTS_RETENTION_DAYS = 30;
34
50
  export class LearningConsolidationWorker extends BaseWorker {
35
51
  lifecycleManager = null;
36
52
  lastRunTimestamp = 0;
@@ -69,79 +85,124 @@ export class LearningConsolidationWorker extends BaseWorker {
69
85
  context.logger.info('Starting learning consolidation (Phase 7: Continuous Learning Loop)');
70
86
  const findings = [];
71
87
  const recommendations = [];
72
- // Initialize Phase 7 metrics
73
- let experiencesProcessed = 0;
74
- let patternCandidatesFound = 0;
75
- let patternsPromoted = 0;
76
- let patternsDeprecated = 0;
77
- let confidenceDecayApplied = 0;
78
- // Phase 7: Run continuous learning loop
79
- const lifecycleManager = await this.getLifecycleManager();
80
- if (lifecycleManager) {
81
- const lifecycleResult = await this.runContinuousLearningLoop(context, lifecycleManager, findings, recommendations);
82
- experiencesProcessed = lifecycleResult.experiencesProcessed;
83
- patternCandidatesFound = lifecycleResult.patternCandidatesFound;
84
- patternsPromoted = lifecycleResult.patternsPromoted;
85
- patternsDeprecated = lifecycleResult.patternsDeprecated;
86
- confidenceDecayApplied = lifecycleResult.confidenceDecayApplied;
87
- }
88
- // Collect patterns from all domains
89
- const patterns = await this.collectPatterns(context);
90
- // Consolidate and analyze
91
- const result = await this.consolidatePatterns(context, patterns);
92
- // Add Phase 7 metrics to result
93
- result.experiencesProcessed = experiencesProcessed;
94
- result.patternCandidatesFound = patternCandidatesFound;
95
- result.patternsPromoted = patternsPromoted;
96
- result.patternsDeprecated = patternsDeprecated;
97
- result.confidenceDecayApplied = confidenceDecayApplied;
98
- // Identify cross-domain patterns
99
- this.identifyCrossDomainPatterns(patterns, findings, recommendations);
100
- // Prune ineffective patterns
101
- this.pruneIneffectivePatterns(patterns, findings, recommendations);
102
- // Generate optimization recommendations
103
- this.generateOptimizations(patterns, findings, recommendations);
104
- // ADR-046: Run dream cycle for pattern discovery
105
- const dreamResult = await this.runDreamCycle(context, patterns, findings, recommendations);
106
- result.dreamInsights = dreamResult.insights;
107
- result.dreamPatternsCreated = dreamResult.patternsCreated;
108
- // Store consolidated results
109
- await context.memory.set('learning:lastConsolidation', result);
110
- await context.memory.set('learning:consolidatedPatterns', patterns);
111
- // Update last run timestamp for decay calculation
112
- this.lastRunTimestamp = Date.now();
113
- const healthScore = this.calculateHealthScore(result, patterns);
114
- context.logger.info('Learning consolidation complete', {
115
- healthScore,
116
- patternsAnalyzed: result.patternsAnalyzed,
117
- newInsights: result.newInsights,
118
- // Phase 7 metrics
119
- experiencesProcessed,
120
- patternsPromoted,
121
- patternsDeprecated,
122
- });
123
- return this.createResult(Date.now() - startTime, {
124
- itemsAnalyzed: result.patternsAnalyzed,
125
- issuesFound: result.patternsPruned + result.patternsDeprecated,
126
- healthScore,
127
- trend: this.determineTrend(result),
128
- domainMetrics: {
88
+ // #491 Bug 4a: liveness must be reported on every tick, including the
89
+ // failure path. Before this fix, `recordLoopHealth(success:true)` sat
90
+ // *after* `collectPatterns()`, which throws on installs with nothing
91
+ // to consolidate — so loop-health permanently showed `never-ran`
92
+ // even when the worker executed every cycle. Track success in a flag
93
+ // and emit the ping in `finally` (matches the
94
+ // CapturedExperienceBridge.drainSafe pattern that ships correctly).
95
+ let liveness = { success: false };
96
+ try {
97
+ // Initialize Phase 7 metrics
98
+ let experiencesProcessed = 0;
99
+ let patternCandidatesFound = 0;
100
+ let patternsPromoted = 0;
101
+ let patternsDeprecated = 0;
102
+ let confidenceDecayApplied = 0;
103
+ let patternsMined = 0;
104
+ let domainsMined = 0;
105
+ let dreamInsightsPruned = 0;
106
+ // Phase 7: Run continuous learning loop
107
+ const lifecycleManager = await this.getLifecycleManager();
108
+ if (lifecycleManager) {
109
+ const lifecycleResult = await this.runContinuousLearningLoop(context, lifecycleManager, findings, recommendations);
110
+ experiencesProcessed = lifecycleResult.experiencesProcessed;
111
+ patternCandidatesFound = lifecycleResult.patternCandidatesFound;
112
+ patternsPromoted = lifecycleResult.patternsPromoted;
113
+ patternsDeprecated = lifecycleResult.patternsDeprecated;
114
+ confidenceDecayApplied = lifecycleResult.confidenceDecayApplied;
115
+ patternsMined = lifecycleResult.patternsMined;
116
+ domainsMined = lifecycleResult.domainsMined;
117
+ dreamInsightsPruned = lifecycleResult.dreamInsightsPruned;
118
+ }
119
+ // Collect patterns from all domains
120
+ const patterns = await this.collectPatterns(context);
121
+ // Consolidate and analyze
122
+ const result = await this.consolidatePatterns(context, patterns);
123
+ // Add Phase 7 metrics to result
124
+ result.experiencesProcessed = experiencesProcessed;
125
+ result.patternCandidatesFound = patternCandidatesFound;
126
+ result.patternsPromoted = patternsPromoted;
127
+ result.patternsDeprecated = patternsDeprecated;
128
+ result.confidenceDecayApplied = confidenceDecayApplied;
129
+ result.patternsMined = patternsMined;
130
+ result.domainsMined = domainsMined;
131
+ result.dreamInsightsPruned = dreamInsightsPruned;
132
+ // Identify cross-domain patterns
133
+ this.identifyCrossDomainPatterns(patterns, findings, recommendations);
134
+ // Prune ineffective patterns
135
+ this.pruneIneffectivePatterns(patterns, findings, recommendations);
136
+ // Generate optimization recommendations
137
+ this.generateOptimizations(patterns, findings, recommendations);
138
+ // ADR-046: Run dream cycle for pattern discovery
139
+ const dreamResult = await this.runDreamCycle(context, patterns, findings, recommendations);
140
+ result.dreamInsights = dreamResult.insights;
141
+ result.dreamPatternsCreated = dreamResult.patternsCreated;
142
+ // Store consolidated results
143
+ await context.memory.set('learning:lastConsolidation', result);
144
+ await context.memory.set('learning:consolidatedPatterns', patterns);
145
+ // Reached the end without throwing — this tick is a real success.
146
+ liveness = { success: true };
147
+ // Update last run timestamp for decay calculation
148
+ this.lastRunTimestamp = Date.now();
149
+ const healthScore = this.calculateHealthScore(result, patterns);
150
+ context.logger.info('Learning consolidation complete', {
151
+ healthScore,
129
152
  patternsAnalyzed: result.patternsAnalyzed,
130
- patternsPruned: result.patternsPruned,
131
- patternsConsolidated: result.patternsConsolidated,
132
153
  newInsights: result.newInsights,
133
- crossDomainPatterns: result.crossDomainPatterns,
134
- // ADR-046: Dream cycle metrics
135
- dreamInsights: result.dreamInsights,
136
- dreamPatternsCreated: result.dreamPatternsCreated,
137
- // Phase 7: Continuous Learning Loop metrics
138
- experiencesProcessed: result.experiencesProcessed,
139
- patternCandidatesFound: result.patternCandidatesFound,
140
- patternsPromoted: result.patternsPromoted,
141
- patternsDeprecated: result.patternsDeprecated,
142
- confidenceDecayApplied: result.confidenceDecayApplied,
143
- },
144
- }, findings, recommendations);
154
+ // Phase 7 metrics
155
+ experiencesProcessed,
156
+ patternsPromoted,
157
+ patternsDeprecated,
158
+ });
159
+ return this.createResult(Date.now() - startTime, {
160
+ itemsAnalyzed: result.patternsAnalyzed,
161
+ issuesFound: result.patternsPruned + result.patternsDeprecated,
162
+ healthScore,
163
+ trend: this.determineTrend(result),
164
+ domainMetrics: {
165
+ patternsAnalyzed: result.patternsAnalyzed,
166
+ patternsPruned: result.patternsPruned,
167
+ patternsConsolidated: result.patternsConsolidated,
168
+ newInsights: result.newInsights,
169
+ crossDomainPatterns: result.crossDomainPatterns,
170
+ // ADR-046: Dream cycle metrics
171
+ dreamInsights: result.dreamInsights,
172
+ dreamPatternsCreated: result.dreamPatternsCreated,
173
+ // Phase 7: Continuous Learning Loop metrics
174
+ experiencesProcessed: result.experiencesProcessed,
175
+ patternCandidatesFound: result.patternCandidatesFound,
176
+ patternsPromoted: result.patternsPromoted,
177
+ patternsDeprecated: result.patternsDeprecated,
178
+ confidenceDecayApplied: result.confidenceDecayApplied,
179
+ // #486 Gap A: mineExperiences auto-trigger
180
+ patternsMined: result.patternsMined,
181
+ domainsMined: result.domainsMined,
182
+ // #488 C.2: dream_insights retention pruning
183
+ dreamInsightsPruned: result.dreamInsightsPruned,
184
+ },
185
+ }, findings, recommendations);
186
+ }
187
+ catch (error) {
188
+ // Record the failure shape and rethrow — BaseWorker handles
189
+ // worker-level retry/error tracking via this throw.
190
+ liveness = { success: false, error: error instanceof Error ? error.message : String(error) };
191
+ throw error;
192
+ }
193
+ finally {
194
+ // #491 Bug 4a: liveness must always reach the dashboard, even when
195
+ // collectPatterns throws on empty installs. Best-effort — must not
196
+ // throw or it would shadow the original error.
197
+ try {
198
+ await recordLoopHealth(context.memory, 'learningWorker', liveness);
199
+ }
200
+ catch (recordErr) {
201
+ context.logger.warn('recordLoopHealth failed (non-fatal)', {
202
+ error: recordErr instanceof Error ? recordErr.message : String(recordErr),
203
+ });
204
+ }
205
+ }
145
206
  }
146
207
  /**
147
208
  * Phase 7: Run the continuous learning loop
@@ -156,6 +217,9 @@ export class LearningConsolidationWorker extends BaseWorker {
156
217
  let patternsPromoted = 0;
157
218
  let patternsDeprecated = 0;
158
219
  let confidenceDecayApplied = 0;
220
+ let patternsMined = 0;
221
+ let domainsMined = 0;
222
+ let dreamInsightsPruned = 0;
159
223
  try {
160
224
  // Step 1: Extract patterns from recent experiences
161
225
  const experiences = lifecycleManager.getRecentExperiences({
@@ -266,12 +330,58 @@ export class LearningConsolidationWorker extends BaseWorker {
266
330
  // Step 6: Generate lifecycle statistics finding
267
331
  const stats = lifecycleManager.getStats();
268
332
  this.addLifecycleStatsFinding(stats, findings, recommendations);
333
+ // Step 7 (#486 Gap A): mine experiences per domain so `learning:pattern:*`
334
+ // kv stays current. Without this, the kv stays empty even after the
335
+ // bridge has populated `learning:experience:*` — no other code path
336
+ // auto-fires `mineExperiences` in default deployments.
337
+ try {
338
+ const miningResult = await this.mineExperiencesPerDomain(context, findings);
339
+ patternsMined = miningResult.patternsMined;
340
+ domainsMined = miningResult.domainsMined;
341
+ }
342
+ catch (miningError) {
343
+ context.logger.warn('Pattern mining sweep failed', {
344
+ error: toErrorMessage(miningError),
345
+ });
346
+ }
347
+ // Step 8 (#488 C.2): prune stale unapplied dream_insights so the
348
+ // table doesn't grow unbounded. Applied insights are part of the
349
+ // pattern-change audit trail and stay forever.
350
+ try {
351
+ const unifiedMemory = getUnifiedMemory();
352
+ const db = unifiedMemory.getDatabase();
353
+ const pruneResult = pruneStaleDreamInsights(db, {
354
+ retentionDays: DREAM_INSIGHTS_RETENTION_DAYS,
355
+ });
356
+ dreamInsightsPruned = pruneResult.pruned;
357
+ if (dreamInsightsPruned > 0) {
358
+ findings.push({
359
+ type: 'dream-insights-pruned',
360
+ severity: 'info',
361
+ domain: 'learning-optimization',
362
+ title: 'Stale Dream Insights Pruned',
363
+ description: `${dreamInsightsPruned} unapplied dream insights older than ${DREAM_INSIGHTS_RETENTION_DAYS} days deleted`,
364
+ context: {
365
+ pruned: dreamInsightsPruned,
366
+ retentionDays: DREAM_INSIGHTS_RETENTION_DAYS,
367
+ },
368
+ });
369
+ }
370
+ }
371
+ catch (pruneError) {
372
+ context.logger.warn('Dream insights pruning failed', {
373
+ error: toErrorMessage(pruneError),
374
+ });
375
+ }
269
376
  context.logger.info('Continuous learning loop complete', {
270
377
  experiencesProcessed,
271
378
  patternCandidatesFound,
272
379
  patternsPromoted,
273
380
  patternsDeprecated,
274
381
  confidenceDecayApplied,
382
+ patternsMined,
383
+ domainsMined,
384
+ dreamInsightsPruned,
275
385
  });
276
386
  }
277
387
  catch (error) {
@@ -285,8 +395,124 @@ export class LearningConsolidationWorker extends BaseWorker {
285
395
  patternsPromoted,
286
396
  patternsDeprecated,
287
397
  confidenceDecayApplied,
398
+ patternsMined,
399
+ domainsMined,
400
+ dreamInsightsPruned,
288
401
  };
289
402
  }
403
+ /**
404
+ * #486 Gap A: mine experiences into `learning:pattern:*` kv per domain.
405
+ *
406
+ * The producer side of the learning-optimization domain pipeline:
407
+ *
408
+ * captured_experiences (SQLite)
409
+ * → bridge drain → learning.ExperienceCaptured event
410
+ * → handleExperienceCaptured → recordExperience
411
+ * → learning:experience:* kv (✓ working post-v3.9.29)
412
+ * → mineExperiences (THIS STEP)
413
+ * → extractPatternsFromExperiences → learnPattern → storePattern
414
+ * → learning:pattern:* kv
415
+ *
416
+ * Without this step the chain ends at the experience kv, so `getPatternStats`
417
+ * reports zero patterns and the `LearningConsolidationWorker.collectPatterns`
418
+ * step a few lines above throws "No learning patterns to consolidate yet".
419
+ *
420
+ * Per-domain cursor avoids re-processing the same experiences (which would
421
+ * duplicate-write since `learnPattern` uses uuidv4 for pattern IDs). Cursor
422
+ * is stored in WorkerMemory under `learning:consolidation-cursor:{domain}`
423
+ * as an ISO timestamp. On first run, the cursor defaults to `now - 1 day`
424
+ * to match the lookback used elsewhere by `runLearningCycle`.
425
+ *
426
+ * Failures are isolated per domain — one bad domain doesn't block others.
427
+ * On failure or empty mining the cursor stays put so the next tick retries
428
+ * the same window with new experiences.
429
+ */
430
+ async mineExperiencesPerDomain(context, findings) {
431
+ const learningAPI = context.domains.getDomainAPI('learning-optimization');
432
+ if (!learningAPI || typeof learningAPI.getLearningService !== 'function') {
433
+ // The learning-optimization domain isn't available in this fleet config;
434
+ // the worker still has lifecycle work to do, so this is non-fatal.
435
+ context.logger.debug('mineExperiencesPerDomain: learning-optimization API unavailable');
436
+ return { patternsMined: 0, domainsMined: 0 };
437
+ }
438
+ const learningService = learningAPI.getLearningService();
439
+ if (!learningService) {
440
+ context.logger.debug('mineExperiencesPerDomain: learning service not initialized');
441
+ return { patternsMined: 0, domainsMined: 0 };
442
+ }
443
+ const now = new Date();
444
+ let patternsMined = 0;
445
+ let domainsMined = 0;
446
+ for (const domain of ALL_DOMAINS) {
447
+ const cursorKey = `${CONSOLIDATION_CURSOR_PREFIX}${domain}`;
448
+ let start;
449
+ try {
450
+ const cursorIso = await context.memory.get(cursorKey);
451
+ if (cursorIso) {
452
+ const parsed = new Date(cursorIso);
453
+ // Guard against corrupted cursor or clock skew: never look back further
454
+ // than DEFAULT_LOOKBACK_DAYS, never look ahead.
455
+ if (!isNaN(parsed.getTime()) && parsed < now) {
456
+ const earliest = new Date(now.getTime() - DEFAULT_LOOKBACK_DAYS * 24 * 60 * 60 * 1000);
457
+ start = parsed > earliest ? parsed : earliest;
458
+ }
459
+ else {
460
+ start = new Date(now.getTime() - DEFAULT_LOOKBACK_DAYS * 24 * 60 * 60 * 1000);
461
+ }
462
+ }
463
+ else {
464
+ start = new Date(now.getTime() - DEFAULT_LOOKBACK_DAYS * 24 * 60 * 60 * 1000);
465
+ }
466
+ }
467
+ catch {
468
+ // Cursor read failure is non-fatal — fall back to the default window.
469
+ start = new Date(now.getTime() - DEFAULT_LOOKBACK_DAYS * 24 * 60 * 60 * 1000);
470
+ }
471
+ try {
472
+ const timeRange = TimeRange.create(start, now);
473
+ const result = await learningService.mineExperiences(domain, timeRange);
474
+ if (!result.success) {
475
+ context.logger.debug(`mineExperiences failed for ${domain}`, {
476
+ error: toErrorMessage(result.error),
477
+ });
478
+ continue;
479
+ }
480
+ const { experienceCount, patterns } = result.value;
481
+ if (experienceCount > 0) {
482
+ patternsMined += patterns.length;
483
+ domainsMined++;
484
+ // Only advance the cursor when we actually processed experiences —
485
+ // otherwise an empty window would falsely consume a fresh experience
486
+ // arriving milliseconds later. Cursor advances to `now`, not to
487
+ // `last experience timestamp`, because the kv index uses
488
+ // `learning:experience:index:domain:{d}:*` keys without a per-key
489
+ // timestamp we can read here.
490
+ await context.memory.set(cursorKey, now.toISOString());
491
+ }
492
+ }
493
+ catch (domainError) {
494
+ context.logger.debug(`mineExperiences threw for ${domain}`, {
495
+ error: toErrorMessage(domainError),
496
+ });
497
+ // Cursor untouched on throw — retry next tick.
498
+ }
499
+ }
500
+ if (patternsMined > 0) {
501
+ findings.push({
502
+ type: 'pattern-mining',
503
+ severity: 'info',
504
+ domain: 'learning-optimization',
505
+ title: 'Patterns Mined from Experience Replay',
506
+ description: `${patternsMined} patterns mined into learning:pattern:* kv across ${domainsMined} domain(s) since their last consolidation tick`,
507
+ context: {
508
+ patternsMined,
509
+ domainsMined,
510
+ lookbackDays: DEFAULT_LOOKBACK_DAYS,
511
+ },
512
+ });
513
+ }
514
+ return { patternsMined, domainsMined };
515
+ }
290
516
  /**
291
517
  * Create patterns from pattern candidates
292
518
  */
@@ -509,6 +735,11 @@ export class LearningConsolidationWorker extends BaseWorker {
509
735
  // Experience consolidation metrics
510
736
  experiencesMerged: 0,
511
737
  experiencesArchived: 0,
738
+ // #486 Gap A: filled in by runContinuousLearningLoop
739
+ patternsMined: 0,
740
+ domainsMined: 0,
741
+ // #488 C.2: filled in by runContinuousLearningLoop
742
+ dreamInsightsPruned: 0,
512
743
  };
513
744
  }
514
745
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-qe",
3
- "version": "3.9.30",
3
+ "version": "3.9.32",
4
4
  "description": "Agentic Quality Engineering V3 - Domain-Driven Design Architecture with 13 Bounded Contexts, O(log n) coverage analysis, ReasoningBank learning, 60 specialized QE agents, mathematical Coherence verification, deep Claude Flow integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -62,6 +62,8 @@
62
62
  "test:all": "npm test -- --run",
63
63
  "test:mcp": "npm run test:unit:mcp",
64
64
  "test:mcp:integration": "npm test -- --run tests/integration/mcp/",
65
+ "test:integration:fast": "NODE_OPTIONS='--max-old-space-size=2048 --expose-gc' vitest run tests/integration/mcp/fleet-init-wires-daemon.test.ts tests/integration/workers/workers-reach-domains.test.ts tests/integration/learning/coordinator-roundtrip.test.ts tests/integration/bridge/bridge-end-to-end.test.ts",
66
+ "test:integration": "NODE_OPTIONS='--max-old-space-size=4096 --expose-gc' vitest run tests/integration/ --exclude='**/browser/**' --exclude='**/browser-integration/**' --exclude='**/*.e2e.test.ts'",
65
67
  "mcp:validate": "echo 'MCP validation: All tools registered in MCP server' && exit 0",
66
68
  "mcp:report": "echo 'MCP Report: uses vitest for test reporting' && exit 0",
67
69
  "test:code-intelligence": "npm test -- --run tests/unit/domains/code-intelligence/ tests/unit/coordination/mincut/",
@@ -1,2 +0,0 @@
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.9.30");process.exit(0)}
2
- import{a,b,c}from"./chunk-Q26GG6WO.js";import"./chunk-5E3YCZC5.js";import"./chunk-2MKSEL6F.js";import"./chunk-Q4HJRYQB.js";import"./chunk-RNO6CE7I.js";import"./chunk-ITBPDVK5.js";export{a as AgentBoosterAdapter,b as createAgentBoosterAdapter,c as createAgentBoosterAdapterSync};
@@ -1,2 +0,0 @@
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.9.30");process.exit(0)}
2
- import{a,b,c,d,e,f}from"./chunk-DDMFTEJP.js";import"./chunk-HA7N45KB.js";import"./chunk-WVODEWH5.js";import"./chunk-VRP4GB4Y.js";import"./chunk-R5IW5ARI.js";import"./chunk-2GBBZLXT.js";import"./chunk-QHKK2H4H.js";import"./chunk-IOINZWNA.js";import"./chunk-Y57V4FDT.js";import"./chunk-3AICELMQ.js";import"./chunk-QTS2DS42.js";import"./chunk-5DJAJPBG.js";import"./chunk-4UZQSPR4.js";import"./chunk-TYZGEVP6.js";import"./chunk-DJRWVNHK.js";import"./chunk-7Z3GBQNV.js";import"./chunk-3WIU2E2Y.js";import"./chunk-Q4HJRYQB.js";import"./chunk-LDGNVPBZ.js";import"./chunk-RNO6CE7I.js";import"./chunk-GY4EGQO3.js";import"./chunk-CNNVL5W4.js";import"./chunk-TULNR2AH.js";import"./chunk-7D2DM23U.js";import"./chunk-37I6K7QO.js";import"./chunk-XVTZXCHI.js";import"./chunk-KR2PGNXX.js";import"./chunk-GEXVUFK4.js";import"./chunk-QNSUPXUU.js";import"./chunk-UYLHIGNC.js";import"./chunk-ITBPDVK5.js";export{b as AQELearningEngine,a as DEFAULT_ENGINE_CONFIG,c as DEFAULT_META_LEARNING_CONFIG,d as MetaLearningEngine,e as createAQELearningEngine,f as createDefaultLearningEngine};
@@ -1,2 +0,0 @@
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.9.30");process.exit(0)}
2
- import{a,b,c,d,e,f}from"./chunk-OEGFOMXP.js";import"./chunk-XK6YXCS7.js";import"./chunk-TYZGEVP6.js";import"./chunk-DJRWVNHK.js";import"./chunk-7Z3GBQNV.js";import"./chunk-3WIU2E2Y.js";import"./chunk-Q4HJRYQB.js";import"./chunk-RNO6CE7I.js";import"./chunk-GY4EGQO3.js";import"./chunk-CNNVL5W4.js";import"./chunk-TULNR2AH.js";import"./chunk-7D2DM23U.js";import"./chunk-37I6K7QO.js";import"./chunk-XVTZXCHI.js";import"./chunk-KR2PGNXX.js";import"./chunk-GEXVUFK4.js";import"./chunk-QNSUPXUU.js";import"./chunk-UYLHIGNC.js";import"./chunk-ITBPDVK5.js";export{f as MCPToolBase,e as defaultToolLogger,d as getMemoryBackend,b as getSharedMemoryBackend,a as registerRvfResetFn,c as resetSharedMemoryBackend};
@@ -1,2 +0,0 @@
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.9.30");process.exit(0)}
2
- import{a}from"./chunk-IWC6GR24.js";import"./chunk-OEGFOMXP.js";import"./chunk-XK6YXCS7.js";import"./chunk-TYZGEVP6.js";import"./chunk-DJRWVNHK.js";import"./chunk-7Z3GBQNV.js";import"./chunk-3WIU2E2Y.js";import"./chunk-Q4HJRYQB.js";import"./chunk-RNO6CE7I.js";import"./chunk-GY4EGQO3.js";import"./chunk-CNNVL5W4.js";import"./chunk-TULNR2AH.js";import"./chunk-7D2DM23U.js";import"./chunk-37I6K7QO.js";import"./chunk-XVTZXCHI.js";import"./chunk-KR2PGNXX.js";import"./chunk-GEXVUFK4.js";import"./chunk-QNSUPXUU.js";import"./chunk-UYLHIGNC.js";import"./chunk-ITBPDVK5.js";export{a as BrowserWorkflowTool};
@@ -1,14 +0,0 @@
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.9.30");process.exit(0)}
2
- import{c as D}from"./chunk-52TRKIAQ.js";import{a as _}from"./chunk-SAVITYEX.js";import{k as w,o as U}from"./chunk-TYZGEVP6.js";import{b as f,d as q}from"./chunk-Q4HJRYQB.js";import{a as g,c as P}from"./chunk-RNO6CE7I.js";import{a as v}from"./chunk-ITBPDVK5.js";import{randomUUID as L}from"crypto";U();q();P();var x={alpha:.1,minOutcomes:10,weightFloor:.2,weightCeiling:2},p=class{records=new Map;config;constructor(e){this.config={...x,...e}}recordOutcome(e,t,o){let{alpha:i,minOutcomes:r,weightFloor:s,weightCeiling:n}=this.config,c=this.records.get(e),d=t?1:0,a=Math.max(0,Math.min(1,o)),l,u;c?(l=i*d+(1-i)*c.emaAccuracy,u=i*a+(1-i)*c.emaQuality):(l=d,u=a);let h=(c?.totalOutcomes??0)+1,R;h>=r?R=Math.max(s,Math.min(n,l*2)):R=1;let k={agentId:e,emaAccuracy:l,emaQuality:u,calibratedWeight:R,totalOutcomes:h,lastUpdated:new Date};return this.records.set(e,k),k}getCalibration(e){return this.records.get(e)??null}getCalibratedWeight(e){let t=this.records.get(e);return!t||t.totalOutcomes<this.config.minOutcomes?1:t.calibratedWeight}getAllCalibrations(){return Array.from(this.records.values())}reset(e){e!==void 0?this.records.delete(e):this.records.clear()}serialize(){let e={};for(let[t,o]of this.records)e[t]={...o};return e}deserialize(e){this.records.clear();for(let[t,o]of Object.entries(e))this.records.set(t,{...o,lastUpdated:new Date(o.lastUpdated)})}};var F={escalateAfterFailures:2,deEscalateAfterSuccesses:5,maxTier:"opus",minTier:"haiku"},A=["booster","haiku","sonnet","opus"];function y(m){return A.indexOf(m)}var b=class{config;states=new Map;constructor(e){this.config={...F,...e}}recordOutcome(e,t,o){let i=this.states.get(e);i||(i={agentId:e,currentTier:o,baseTier:o,consecutiveFailures:0,consecutiveSuccesses:0,escalationCount:0,deEscalationCount:0,lastAction:"none",lastActionTimestamp:new Date},this.states.set(e,i));let r=i.currentTier;if(t){if(i.consecutiveSuccesses++,i.consecutiveFailures=0,i.consecutiveSuccesses>=this.config.deEscalateAfterSuccesses){let s=y(i.currentTier),n=y(this.config.minTier);if(s>n)return i.currentTier=A[s-1],i.deEscalationCount++,i.consecutiveSuccesses=0,i.lastAction="de-escalate",i.lastActionTimestamp=new Date,{action:"de-escalate",previousTier:r,newTier:i.currentTier}}}else if(i.consecutiveFailures++,i.consecutiveSuccesses=0,i.consecutiveFailures>=this.config.escalateAfterFailures){let s=y(i.currentTier),n=y(this.config.maxTier);if(s<n)return i.currentTier=A[s+1],i.escalationCount++,i.consecutiveFailures=0,i.lastAction="escalate",i.lastActionTimestamp=new Date,{action:"escalate",previousTier:r,newTier:i.currentTier}}return{action:"none",previousTier:r,newTier:i.currentTier}}getCurrentTier(e){return this.states.get(e)?.currentTier??null}getState(e){return this.states.get(e)??null}getAllStates(){return Array.from(this.states.values())}reset(e){e?this.states.delete(e):this.states.clear()}};var T={booster:{avgInputTokens:0,avgOutputTokens:0,costPerTask:0},haiku:{avgInputTokens:2e3,avgOutputTokens:1e3,costPerTask:.0035},sonnet:{avgInputTokens:2e3,avgOutputTokens:1e3,costPerTask:.021},opus:{avgInputTokens:2e3,avgOutputTokens:1e3,costPerTask:.105}},S=["booster","haiku","sonnet","opus"],E=T.opus.costPerTask,I={qualityWeight:.6,costWeight:.4,budgetPerHourUsd:0,budgetPerDayUsd:0,minQualityThreshold:.5,enabled:!0},N=.15,C=class{config;costTracker;tierQualityEstimates=new Map;tierOutcomeCounts=new Map;constructor(e,t){let o={...I,...t};o.qualityWeight=Math.max(0,Math.min(1,o.qualityWeight)),o.costWeight=Math.max(0,Math.min(1,o.costWeight)),o.minQualityThreshold=Math.max(0,Math.min(1,o.minQualityThreshold)),o.budgetPerHourUsd=Math.max(0,o.budgetPerHourUsd),o.budgetPerDayUsd=Math.max(0,o.budgetPerDayUsd);let i=o.qualityWeight+o.costWeight;i>0&&i!==1&&(o.qualityWeight/=i,o.costWeight/=i),this.config=o,this.costTracker=e,this.tierQualityEstimates.set("booster",.3),this.tierQualityEstimates.set("haiku",.55),this.tierQualityEstimates.set("sonnet",.75),this.tierQualityEstimates.set("opus",.9)}scoreTiers(e){let t=S.map(o=>{let i=this.getQualityEstimate(o,e),r=T[o].costPerTask,s=r>0?i/r:i>0?1/0:0,n=E>0?1-r/E:1,c=this.config.qualityWeight*i+this.config.costWeight*n;return{tier:o,qualityScore:i,estimatedCostUsd:r,qualityPerDollar:s,economicScore:c}});return t.sort((o,i)=>i.economicScore-o.economicScore),t}selectTier(e){let t=this.scoreTiers(e);for(let r of t)if(!(r.qualityScore<this.config.minQualityThreshold)&&!this.wouldExceedBudget(r.tier))return{tier:r.tier,reason:`Best economic score (${r.economicScore.toFixed(3)}): quality=${r.qualityScore.toFixed(2)}, cost=$${r.estimatedCostUsd.toFixed(4)}`,scores:t};let o=t.filter(r=>r.qualityScore>=this.config.minQualityThreshold);if(o.length>0){let r=[...o].sort((s,n)=>s.estimatedCostUsd-n.estimatedCostUsd)[0];return{tier:r.tier,reason:`Budget constrained fallback to ${r.tier}`,scores:t}}let i=[...t].sort((r,s)=>s.qualityScore-r.qualityScore)[0];return{tier:i.tier,reason:`No tier meets quality threshold ${this.config.minQualityThreshold}; using best quality: ${i.tier}`,scores:t}}wouldExceedBudget(e){let t=T[e].costPerTask;if(t===0)return!1;let o=this.costTracker.getCurrentCost("hour"),i=this.costTracker.getCurrentCost("day");return this.config.budgetPerHourUsd>0&&o+t>this.config.budgetPerHourUsd||this.config.budgetPerDayUsd>0&&i+t>this.config.budgetPerDayUsd}updateFromOutcome(e,t){let o=e.outcome.qualityScore,i=this.tierQualityEstimates.get(t)??.5,r=this.tierOutcomeCounts.get(t)??0,s=r<5?.4:N,n=i*(1-s)+o*s;this.tierQualityEstimates.set(t,n),this.tierOutcomeCounts.set(t,r+1)}getEconomicReport(){let e=this.scoreTiers(.5),t=this.costTracker.getCurrentCost("hour"),o=this.costTracker.getCurrentCost("day"),i={hourly:this.config.budgetPerHourUsd>0?Math.max(0,this.config.budgetPerHourUsd-t):null,daily:this.config.budgetPerDayUsd>0?Math.max(0,this.config.budgetPerDayUsd-o):null},r=null,s=[...e].sort((a,l)=>l.qualityPerDollar-a.qualityPerDollar),n=s.find(a=>a.estimatedCostUsd>0&&isFinite(a.qualityPerDollar)),c=[...s].reverse().find(a=>a.estimatedCostUsd>0&&isFinite(a.qualityPerDollar));if(n&&c&&n.tier!==c.tier){let a=c.estimatedCostUsd-n.estimatedCostUsd;a>0&&(r={usd:a,description:`Switch from ${c.tier} ($${c.estimatedCostUsd.toFixed(4)}/task) to ${n.tier} ($${n.estimatedCostUsd.toFixed(4)}/task) for comparable tasks to save ~$${a.toFixed(4)}/task`})}let d=this.generateRecommendation(e,i);return{tierEfficiency:e,currentHourlyCostUsd:t,currentDailyCostUsd:o,budgetRemaining:i,recommendation:d,savingsOpportunity:r}}computeCostAdjustedReward(e,t,o){let i=T[t].costPerTask;if(E===0)return e;let r=i/E,s=Math.max(0,o-this.config.minQualityThreshold),n=r*(1-s),c=e-n*this.config.costWeight;return Math.max(-1,Math.min(1,c))}serializeEstimates(){let e={};for(let t of S)e[t]={quality:this.tierQualityEstimates.get(t)??.5,count:this.tierOutcomeCounts.get(t)??0};return e}deserializeEstimates(e){for(let t of S)e[t]&&(this.tierQualityEstimates.set(t,e[t].quality),this.tierOutcomeCounts.set(t,e[t].count))}getConfig(){return{...this.config}}getQualityEstimate(e,t){let o=this.tierQualityEstimates.get(e)??.5,i=e==="booster"?t*.4:e==="haiku"?t*.2:0;return Math.max(0,Math.min(1,o-i))}generateRecommendation(e,t){if(t.hourly!==null&&t.hourly<.01)return"Hourly budget nearly exhausted. Consider increasing budget or routing to cheaper tiers.";if(t.daily!==null&&t.daily<.1)return"Daily budget nearly exhausted. Only critical tasks should use expensive tiers.";let o=e[0];return o?`Most cost-efficient tier: ${o.tier} (score=${o.economicScore.toFixed(3)}, quality=${o.qualityScore.toFixed(2)})`:"No economic data available yet."}};var O=class{outcomes=[];maxOutcomes;constructor(e=1e4){this.maxOutcomes=e}add(e){this.outcomes.push(e),this.outcomes.length>this.maxOutcomes&&(this.outcomes=this.outcomes.slice(-this.maxOutcomes))}getByAgent(e,t=100){return this.outcomes.filter(o=>o.usedAgent===e).slice(-t)}getAll(e=1e3){return this.outcomes.slice(-e)}getRecentOverrides(e=50){return this.outcomes.filter(t=>!t.followedRecommendation).slice(-e)}clear(){this.outcomes=[]}get size(){return this.outcomes.length}},M=class m{static schemaMigrated=!1;outcomeStore;router=null;db=null;calibrator=null;escalationTracker=null;economicModel=null;economicPersistCounter=0;static ECONOMIC_PERSIST_INTERVAL=10;persistCount=0;maxOutcomes;static RETENTION_CLEANUP_INTERVAL=100;constructor(e=1e4,t){this.maxOutcomes=e,this.outcomeStore=new O(e),t?.enableEMACalibration&&this.enableCalibration(),t?.enableAutoEscalation&&this.enableAutoEscalation()}async initialize(){try{this.db=w(),this.db.isInitialized()||await this.db.initialize(),await this.loadFromDb(),this.loadCalibratorState()}catch(e){console.warn("[RoutingFeedbackCollector] DB init failed, using memory-only:",g(e)),this.db=null}}async loadFromDb(){if(!this.db)return;let t=this.db.getDatabase().prepare(`
3
- SELECT * FROM routing_outcomes ORDER BY created_at DESC LIMIT ?
4
- `).all(this.maxOutcomes);for(let o of t.reverse()){let i={id:o.id,task:f(o.task_json),decision:f(o.decision_json),usedAgent:o.used_agent,followedRecommendation:!!o.followed_recommendation,outcome:{success:!!o.success,qualityScore:o.quality_score,durationMs:o.duration_ms,error:o.error||void 0},timestamp:new Date(o.created_at),advisorConsultation:o.advisor_consultation_json?f(o.advisor_consultation_json):void 0};this.outcomeStore.add(i)}t.length>0&&console.log(`[RoutingFeedbackCollector] Loaded ${t.length} outcomes from DB`)}persistOutcome(e){if(this.db)try{let t=this.db.getDatabase();if(!m.schemaMigrated){for(let r of["ALTER TABLE routing_outcomes ADD COLUMN model_tier TEXT","ALTER TABLE routing_outcomes ADD COLUMN advisor_consultation_json TEXT"])try{t.prepare(r).run()}catch{}m.schemaMigrated=!0}let o=this.inferTier(e.usedAgent),i=e.advisorConsultation?JSON.stringify(e.advisorConsultation):null;t.prepare(`
5
- INSERT OR REPLACE INTO routing_outcomes (
6
- id, task_json, decision_json, used_agent,
7
- followed_recommendation, success, quality_score,
8
- duration_ms, error, model_tier, advisor_consultation_json
9
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
10
- `).run(e.id,JSON.stringify(e.task),JSON.stringify(e.decision),e.usedAgent,e.followedRecommendation?1:0,e.outcome.success?1:0,e.outcome.qualityScore,e.outcome.durationMs,e.outcome.error||null,o,i),this.persistCount++,this.persistCount%m.RETENTION_CLEANUP_INTERVAL===0&&this.enforceRetention(t)}catch(t){console.warn("[RoutingFeedbackCollector] Failed to persist outcome:",g(t))}}loadAdvisorConsultationSidecar(e){try{let{readdirSync:t,readFileSync:o}=v("fs"),{join:i}=v("path"),{homedir:r}=v("os"),s=i(r(),".agentic-qe","advisor","consultations"),n=t(s).filter(l=>l.endsWith(".json")).sort().reverse();if(n.length===0)return;let c=n[0],d=JSON.parse(o(i(s,c),"utf-8"));return Date.now()-new Date(d.timestamp).getTime()>300*1e3?void 0:d}catch{return}}inferTier(e){let t=e.toLowerCase();return t.includes("booster")||t==="tier-0"?"booster":t==="tier-1"||t.includes("haiku")?"haiku":t==="tier-2"||t.includes("sonnet")?"sonnet":t.includes("opus")?"opus":"sonnet"}enforceRetention(e){try{let t=this.maxOutcomes*2;e.prepare(`
11
- DELETE FROM routing_outcomes WHERE id NOT IN (
12
- SELECT id FROM routing_outcomes ORDER BY created_at DESC LIMIT ?
13
- )
14
- `).run(t)}catch(t){console.warn("[RoutingFeedbackCollector] Retention cleanup failed:",g(t))}}loadCalibratorState(){if(!(!this.db||!this.calibrator))try{let t=this.db.getDatabase().prepare("SELECT value FROM kv_store WHERE key = 'routing:ema_calibrator_state'").get();if(t){let o=f(t.value);o&&typeof o=="object"&&(this.calibrator.deserialize(o),console.log("[RoutingFeedbackCollector] Loaded EMA calibrator state from DB"))}}catch(e){console.warn("[RoutingFeedbackCollector] Failed to load calibrator state:",g(e))}}persistCalibratorState(){if(!(!this.db||!this.calibrator))try{let e=this.db.getDatabase(),t=JSON.stringify(this.calibrator.serialize());e.prepare("INSERT OR REPLACE INTO kv_store (key, value, updated_at) VALUES (?, ?, datetime('now'))").run("routing:ema_calibrator_state",t)}catch(e){console.warn("[RoutingFeedbackCollector] Failed to persist calibrator state:",g(e))}}loadEconomicState(){if(!(!this.db||!this.economicModel))try{let t=this.db.getDatabase().prepare("SELECT value FROM kv_store WHERE key = 'routing:economic_quality_estimates'").get();if(t){let o=f(t.value);o&&typeof o=="object"&&(this.economicModel.deserializeEstimates(o),console.log("[RoutingFeedbackCollector] Loaded economic quality estimates from DB"))}}catch(e){console.warn("[RoutingFeedbackCollector] Failed to load economic state:",g(e))}}persistEconomicState(){if(!(!this.db||!this.economicModel))try{let e=this.db.getDatabase(),t=JSON.stringify(this.economicModel.serializeEstimates());e.prepare("INSERT OR REPLACE INTO kv_store (key, value, updated_at) VALUES (?, ?, datetime('now'))").run("routing:economic_quality_estimates",t)}catch(e){console.warn("[RoutingFeedbackCollector] Failed to persist economic state:",g(e))}}connectRouter(e){this.router=e}enableCalibration(e){this.calibrator=new p(e)}getCalibratedWeight(e){return this.calibrator?.getCalibratedWeight(e)??1}enableAutoEscalation(e){this.escalationTracker=new b(e)}getEscalationState(e){return this.escalationTracker?.getState(e)??null}enableEconomicRouting(e,t){let o=t??D();this.economicModel=new C(o,e),this.loadEconomicState()}getEconomicReport(){return this.economicModel?.getEconomicReport()??null}getEconomicScore(e){return this.economicModel?.scoreTiers(e)??null}recordOutcome(e,t,o,i,r){let s=r;s||(s=this.loadAdvisorConsultationSidecar(e));let n={id:`outcome-${Date.now()}-${L().slice(0,8)}`,task:e,decision:t,usedAgent:o,followedRecommendation:o===t.recommended,outcome:i,timestamp:new Date,advisorConsultation:s};if(this.outcomeStore.add(n),this.persistOutcome(n),this.router&&this.router.updateAgentPerformance(o,i.success,i.qualityScore,i.durationMs),this.calibrator&&(this.calibrator.recordOutcome(o,i.success,i.qualityScore),this.persistCount%10===0&&this.persistCalibratorState()),this.escalationTracker){let c=t.recommended===o?"sonnet":"haiku",d=this.escalationTracker.recordOutcome(o,i.success,c);d.action!=="none"&&console.log(`[RoutingFeedbackCollector] Agent "${o}" ${d.action}d: ${d.previousTier} \u2192 ${d.newTier}`)}if(this.economicModel){let c=this.inferTier(o);this.economicModel.updateFromOutcome(n,c),this.economicPersistCounter++,this.economicPersistCounter%m.ECONOMIC_PERSIST_INTERVAL===0&&this.persistEconomicState()}return n}getAgentMetrics(e){let t=this.outcomeStore.getByAgent(e);if(t.length===0)return null;let o=t.filter(u=>u.outcome.success).length,i=t.reduce((u,h)=>u+h.outcome.durationMs,0),r=t.reduce((u,h)=>u+h.outcome.qualityScore,0),s=t.filter(u=>u.decision.recommended!==u.usedAgent&&u.decision.recommended===e).length,n=t.filter(u=>u.decision.recommended!==u.usedAgent&&u.usedAgent===e).length,c=t.slice(-10),d=c.filter(u=>u.outcome.success).length/c.length,a=o/t.length,l;return d>a+.1?l="improving":d<a-.1?l="declining":l="stable",{agentId:e,totalTasks:t.length,successfulTasks:o,successRate:o/t.length,avgQualityScore:r/t.length,avgDurationMs:i/t.length,overriddenCount:s,selectedOverOthersCount:n,trend:l,updatedAt:new Date}}getAllAgentMetrics(){let e=[];for(let t of _){let o=this.getAgentMetrics(t.id);o&&e.push(o)}return e.sort((t,o)=>o.successRate-t.successRate)}analyzeRoutingAccuracy(){let e=this.outcomeStore.getAll();if(e.length===0)return{totalOutcomes:0,followedRecommendations:0,overrideRate:0,recommendationSuccessRate:0,overrideSuccessRate:0,confidenceCorrelation:0};let t=e.filter(n=>n.followedRecommendation),o=e.filter(n=>!n.followedRecommendation),i=t.filter(n=>n.outcome.success).length,r=o.filter(n=>n.outcome.success).length,s=this.calculateConfidenceCorrelation(e);return{totalOutcomes:e.length,followedRecommendations:t.length,overrideRate:o.length/e.length,recommendationSuccessRate:t.length>0?i/t.length:0,overrideSuccessRate:o.length>0?r/o.length:0,confidenceCorrelation:s}}calculateConfidenceCorrelation(e){if(e.length<2)return 0;let t=e.map(a=>a.decision.confidence),o=e.map(a=>a.outcome.success?1:0),i=t.reduce((a,l)=>a+l,0)/t.length,r=o.reduce((a,l)=>a+l,0)/o.length,s=0,n=0,c=0;for(let a=0;a<e.length;a++){let l=t[a]-i,u=o[a]-r;s+=l*u,n+=l*l,c+=u*u}let d=Math.sqrt(n*c);return d===0?0:s/d}getImprovementRecommendations(){let e=[],t=this.analyzeRoutingAccuracy();if(t.totalOutcomes<50)return e.push("Collect more routing outcomes for reliable analysis (at least 50)"),e;t.overrideRate>.3&&t.overrideSuccessRate>t.recommendationSuccessRate&&e.push("Users are frequently overriding recommendations with better results. Consider adjusting routing weights or updating agent capabilities."),t.confidenceCorrelation<.3&&e.push("Low correlation between confidence and success. Consider improving semantic matching or adjusting weight distribution.");let o=this.getAllAgentMetrics(),i=o.filter(s=>s.successRate<.5&&s.totalTasks>=10);i.length>0&&e.push(`Agents with low success rates: ${i.map(s=>s.agentId).join(", ")}. Consider reviewing their capability mappings.`);let r=o.filter(s=>s.trend==="declining"&&s.totalTasks>=10);return r.length>0&&e.push(`Agents with declining performance: ${r.map(s=>s.agentId).join(", ")}. Monitor for potential issues.`),e.length===0&&e.push("Routing performance is healthy. Continue collecting feedback."),e}exportOutcomes(){return this.outcomeStore.getAll()}importOutcomes(e){for(let t of e)this.outcomeStore.add(t)}getStats(){let e=this.outcomeStore.getAll(),t=new Set(e.map(o=>o.usedAgent));return{totalOutcomes:this.outcomeStore.size,uniqueAgentsUsed:t.size,recentOverrides:this.outcomeStore.getRecentOverrides().length}}clear(){this.outcomeStore.clear()}};function re(m=1e4,e){return new M(m,e)}export{M as a,re as b};