agentic-qe 3.15.14 → 3.15.16

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 (513) hide show
  1. package/.claude/agents/v3/templates/qx-report-template.html +1 -1
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +136 -0
  4. package/assets/agents/v3/templates/qx-report-template.html +1 -1
  5. package/assets/skills/skills-manifest.json +1 -1
  6. package/dist/audit/witness-chain.d.ts +7 -0
  7. package/dist/audit/witness-chain.js +10 -0
  8. package/dist/cli/bundle.js +6 -6
  9. package/dist/cli/chunks/adapter-6CQ2PIP5.js +2 -0
  10. package/dist/cli/chunks/agent-booster-wasm-45NWEKVS.js +2 -0
  11. package/dist/cli/chunks/{agent-handler-P3IY7XEE.js → agent-handler-LVHMYFEF.js} +2 -2
  12. package/dist/cli/chunks/{agent-memory-branch-WWKC2H3G.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
  13. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
  14. package/dist/cli/chunks/{arena-EIV5OALF.js → arena-CZKHXDDS.js} +2 -2
  15. package/dist/cli/chunks/{arena-4BMFF6BS.js → arena-ELDZH3CZ.js} +4 -4
  16. package/dist/cli/chunks/{audit-DNTI453H.js → audit-5MT4T47Z.js} +3 -3
  17. package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
  18. package/dist/cli/chunks/{better-sqlite3-TQBQGNC6.js → better-sqlite3-6TGYPC2B.js} +2 -2
  19. package/dist/cli/chunks/{brain-handler-HY57CNAO.js → brain-handler-HQWZFO52.js} +3 -3
  20. package/dist/cli/chunks/{branch-enumerator-THPMZPHQ.js → branch-enumerator-WVILM4SO.js} +2 -2
  21. package/dist/cli/chunks/{browser-O6JJOZCK.js → browser-RX5ALU3H.js} +2 -2
  22. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
  23. package/dist/cli/chunks/{chunk-CIINJHOX.js → chunk-24OX5TQJ.js} +1 -1
  24. package/dist/cli/chunks/{chunk-6P4Q4RTC.js → chunk-24QHCVX6.js} +1 -1
  25. package/dist/cli/chunks/{chunk-U6IOQKCT.js → chunk-2H4XH6FT.js} +2 -2
  26. package/dist/cli/chunks/{chunk-OGEIHS76.js → chunk-2YZ4G6NW.js} +1 -1
  27. package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
  28. package/dist/cli/chunks/{chunk-5PLBQZ5J.js → chunk-32GN3JKR.js} +1 -1
  29. package/dist/cli/chunks/{chunk-AJVLVF7V.js → chunk-3HD7E6HN.js} +2 -2
  30. package/dist/cli/chunks/{chunk-X7CUI7KH.js → chunk-4D4DENG6.js} +2 -2
  31. package/dist/cli/chunks/{chunk-E2JLAW3U.js → chunk-4LQFBY5L.js} +6 -6
  32. package/dist/cli/chunks/{chunk-E3QIQMMN.js → chunk-4NFQLP6R.js} +1 -1
  33. package/dist/cli/chunks/{chunk-7Y3LXH57.js → chunk-525CFDUE.js} +2 -2
  34. package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
  35. package/dist/cli/chunks/{chunk-X6Q2N5S5.js → chunk-5JZRZI4S.js} +2 -2
  36. package/dist/cli/chunks/{chunk-MB4UKUBV.js → chunk-5LAVKGLH.js} +2 -2
  37. package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
  38. package/dist/cli/chunks/{chunk-NKOLILT7.js → chunk-5PBLPQ5T.js} +2 -2
  39. package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
  40. package/dist/cli/chunks/{chunk-7T6L3LFN.js → chunk-5SPCGMBB.js} +2 -2
  41. package/dist/cli/chunks/{chunk-2QLE6NDW.js → chunk-5V3TI2LG.js} +1 -1
  42. package/dist/cli/chunks/{chunk-A2T56XVL.js → chunk-5VZL4UVN.js} +2 -2
  43. package/dist/cli/chunks/{chunk-TWOV3I3A.js → chunk-63GMRQ25.js} +1 -1
  44. package/dist/cli/chunks/{chunk-YGOSSVY5.js → chunk-63ZKI4PX.js} +6 -6
  45. package/dist/cli/chunks/{chunk-FHPNWHY7.js → chunk-67Z5R7RJ.js} +2 -2
  46. package/dist/cli/chunks/{chunk-PCQZIAXB.js → chunk-6DPYNAOK.js} +2 -2
  47. package/dist/cli/chunks/{chunk-WCM6WE7G.js → chunk-6ICX3FEG.js} +3 -3
  48. package/dist/cli/chunks/{chunk-JB7R77SH.js → chunk-6XXZDV2C.js} +2 -2
  49. package/dist/cli/chunks/{chunk-FJOIBZUB.js → chunk-6ZBXSOX6.js} +2 -2
  50. package/dist/cli/chunks/{chunk-WZQADC5R.js → chunk-72XSEQMW.js} +2 -2
  51. package/dist/cli/chunks/{chunk-AYLEH2UF.js → chunk-7TE5ONQQ.js} +1 -1
  52. package/dist/cli/chunks/{chunk-7QUSNBAA.js → chunk-A5GBXCP5.js} +2 -2
  53. package/dist/cli/chunks/{chunk-7724KXM2.js → chunk-AAMLQ2LF.js} +3 -3
  54. package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
  55. package/dist/cli/chunks/{chunk-2UZBLC5H.js → chunk-AGRV5B3T.js} +2 -2
  56. package/dist/cli/chunks/{chunk-V6SE2ZU2.js → chunk-AJMJNQMP.js} +1 -1
  57. package/dist/cli/chunks/{chunk-2HPNGK7A.js → chunk-AR67RJPY.js} +2 -2
  58. package/dist/cli/chunks/{chunk-G7HGUQAE.js → chunk-ASEOFRIG.js} +2 -2
  59. package/dist/cli/chunks/{chunk-7TH4PJSU.js → chunk-BEKDKVQT.js} +2 -2
  60. package/dist/cli/chunks/{chunk-M5JEA6ZY.js → chunk-BY5OF7OH.js} +2 -2
  61. package/dist/cli/chunks/{chunk-OLUOVNUF.js → chunk-C5FP5GW3.js} +2 -2
  62. package/dist/cli/chunks/{chunk-R5RRWLRI.js → chunk-C6D5AHBO.js} +2 -2
  63. package/dist/cli/chunks/{chunk-K7GFYFBO.js → chunk-CAKMOVZ6.js} +2 -2
  64. package/dist/cli/chunks/{chunk-6NIGSY5L.js → chunk-CEYSYSK5.js} +2 -2
  65. package/dist/cli/chunks/{chunk-U4TML2VD.js → chunk-CGGUM2YJ.js} +2 -2
  66. package/dist/cli/chunks/{chunk-YE54T2NQ.js → chunk-CJSHWQXP.js} +2 -2
  67. package/dist/cli/chunks/{chunk-7SQTLUEN.js → chunk-CRPIYUTJ.js} +2 -2
  68. package/dist/cli/chunks/{chunk-65EE2EST.js → chunk-D6COXLYE.js} +2 -2
  69. package/dist/cli/chunks/{chunk-4WLIOPHX.js → chunk-DTMAS2GB.js} +2 -2
  70. package/dist/cli/chunks/{chunk-E7QTWGPI.js → chunk-DVYHMDFR.js} +470 -411
  71. package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
  72. package/dist/cli/chunks/{chunk-HSDWPQQY.js → chunk-E3D4GPLP.js} +3 -3
  73. package/dist/cli/chunks/{chunk-JJHLGGPP.js → chunk-EA4YQVKS.js} +1 -1
  74. package/dist/cli/chunks/{chunk-EIEEST4T.js → chunk-EGYE5UPQ.js} +2 -2
  75. package/dist/cli/chunks/{chunk-O756AOUX.js → chunk-EK7OLYOZ.js} +2 -2
  76. package/dist/cli/chunks/{chunk-57DRT6UA.js → chunk-F742SZAX.js} +2 -2
  77. package/dist/cli/chunks/{chunk-6OI5SK7M.js → chunk-FBDVGRSC.js} +1 -1
  78. package/dist/cli/chunks/{chunk-H3C5FJRH.js → chunk-FDDC72IA.js} +2 -2
  79. package/dist/cli/chunks/{chunk-IQRPR4KB.js → chunk-FL64OUBA.js} +2 -2
  80. package/dist/cli/chunks/{chunk-BNG4J3CE.js → chunk-FLNAW7C4.js} +2 -2
  81. package/dist/cli/chunks/{chunk-C3OIBFAA.js → chunk-G5RHFBAY.js} +2 -2
  82. package/dist/cli/chunks/{chunk-NPCXGX7N.js → chunk-GAHNO6JJ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-PNRPVQGI.js → chunk-GFWHUQSF.js} +2 -2
  84. package/dist/cli/chunks/{chunk-OCN53CCK.js → chunk-GJYHWYXR.js} +2 -2
  85. package/dist/cli/chunks/{chunk-5Z4MO2F3.js → chunk-GQ6TUIKY.js} +1 -1
  86. package/dist/cli/chunks/{chunk-N736GLWZ.js → chunk-GSKMOPL7.js} +2 -2
  87. package/dist/cli/chunks/{chunk-43XHGWYH.js → chunk-HCH4Y6XX.js} +2 -2
  88. package/dist/cli/chunks/{chunk-QP6GL3O5.js → chunk-HGWXF45W.js} +1 -1
  89. package/dist/cli/chunks/{chunk-PGN4TARY.js → chunk-HJ6ZGVTB.js} +2 -2
  90. package/dist/cli/chunks/{chunk-M2TG7VDK.js → chunk-HLUXXCHF.js} +1 -1
  91. package/dist/cli/chunks/{chunk-UMHFTQTR.js → chunk-HVRRLYX6.js} +4 -4
  92. package/dist/cli/chunks/{chunk-L7PC675Y.js → chunk-I7MQIM2U.js} +1 -1
  93. package/dist/cli/chunks/{chunk-JSSU4RIK.js → chunk-IESR7TNB.js} +2 -2
  94. package/dist/cli/chunks/{chunk-H4LYXLAT.js → chunk-IHRXZZQM.js} +1 -1
  95. package/dist/cli/chunks/{chunk-HV43NX4A.js → chunk-IOKYCMTJ.js} +6 -6
  96. package/dist/cli/chunks/{chunk-NZQYJCO6.js → chunk-IOQ6ZQ5W.js} +1 -1
  97. package/dist/cli/chunks/{chunk-JO26SG47.js → chunk-IOYG4VFL.js} +2 -2
  98. package/dist/cli/chunks/{chunk-6O63ZTVX.js → chunk-IUBJVHNB.js} +2 -2
  99. package/dist/cli/chunks/{chunk-XSPMLJCQ.js → chunk-J442IZLE.js} +1 -1
  100. package/dist/cli/chunks/{chunk-LTGQJYYO.js → chunk-J4ELZNLY.js} +2 -2
  101. package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
  102. package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
  103. package/dist/cli/chunks/{chunk-TOJF3ZG4.js → chunk-JHQCRRJI.js} +2 -2
  104. package/dist/cli/chunks/{chunk-QUZ745UQ.js → chunk-JQ3DYUMS.js} +2 -2
  105. package/dist/cli/chunks/{chunk-P2TPH3TC.js → chunk-KITOPKRG.js} +2 -2
  106. package/dist/cli/chunks/{chunk-QNQE3EOH.js → chunk-KKU2QGSJ.js} +2 -2
  107. package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
  108. package/dist/cli/chunks/{chunk-L5VSLPMW.js → chunk-KNSRL6NO.js} +2 -2
  109. package/dist/cli/chunks/{chunk-INGXD5IX.js → chunk-KPRCB5LT.js} +2 -2
  110. package/dist/cli/chunks/{chunk-GY4P7KAI.js → chunk-KQYJ4VQ5.js} +1 -1
  111. package/dist/cli/chunks/{chunk-Z2S7DNFP.js → chunk-KU2AUFGX.js} +2 -2
  112. package/dist/cli/chunks/{chunk-O5CEL447.js → chunk-KVF4NXGQ.js} +2 -2
  113. package/dist/cli/chunks/{chunk-2IJO3657.js → chunk-KXCLACFG.js} +2 -2
  114. package/dist/cli/chunks/{chunk-ZJGFQK27.js → chunk-L2DWPVNJ.js} +1 -1
  115. package/dist/cli/chunks/{chunk-E7OR6V3V.js → chunk-L6QSTQME.js} +2 -2
  116. package/dist/cli/chunks/{chunk-RE6JTSDM.js → chunk-LE4QJREF.js} +1 -1
  117. package/dist/cli/chunks/{chunk-DSQESXL4.js → chunk-LKTTUHLF.js} +2 -2
  118. package/dist/cli/chunks/{chunk-YGC5QKQ4.js → chunk-LQLPB2T6.js} +2 -2
  119. package/dist/cli/chunks/{chunk-VGZOPQQY.js → chunk-LRSX2FJM.js} +1 -1
  120. package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
  121. package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
  122. package/dist/cli/chunks/{chunk-56NSE3LJ.js → chunk-MAFQV4U4.js} +2 -2
  123. package/dist/cli/chunks/{chunk-MKYOE7NE.js → chunk-MD43XRX5.js} +1 -1
  124. package/dist/cli/chunks/{chunk-3TF27MG5.js → chunk-MI5MFHRA.js} +2 -2
  125. package/dist/cli/chunks/{chunk-JK6PMLQQ.js → chunk-MO55CVMT.js} +32 -32
  126. package/dist/cli/chunks/{chunk-X6NJOT3V.js → chunk-N7HL5PHH.js} +1 -1
  127. package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
  128. package/dist/cli/chunks/{chunk-WUGXXNK4.js → chunk-NDJ7P2EP.js} +1 -1
  129. package/dist/cli/chunks/{chunk-D5GB5PUU.js → chunk-NO3IV5Q5.js} +1 -1
  130. package/dist/cli/chunks/{chunk-3XACRXBY.js → chunk-NQXXI77K.js} +2 -2
  131. package/dist/cli/chunks/{chunk-EC65UZ77.js → chunk-NVEWF4JV.js} +1 -1
  132. package/dist/cli/chunks/{chunk-JI67T6Q2.js → chunk-NZU4ACBZ.js} +2 -2
  133. package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
  134. package/dist/cli/chunks/{chunk-YEFTK4HD.js → chunk-OAEE6JWQ.js} +2 -2
  135. package/dist/cli/chunks/{chunk-JAOCHPYX.js → chunk-OCV2XEWQ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-IDBA5GK2.js → chunk-P3EYRILV.js} +2 -2
  137. package/dist/cli/chunks/{chunk-4RPBODN5.js → chunk-PEQDY4BO.js} +2 -2
  138. package/dist/cli/chunks/{chunk-CPPYZYXC.js → chunk-PF7RBAYL.js} +2 -2
  139. package/dist/cli/chunks/{chunk-WCPSR4MJ.js → chunk-PHT5N7SC.js} +2 -2
  140. package/dist/cli/chunks/{chunk-O2AAYJUV.js → chunk-PINSJCM3.js} +1 -1
  141. package/dist/cli/chunks/{chunk-HEDGFKC5.js → chunk-PPUZWYUG.js} +2 -2
  142. package/dist/cli/chunks/{chunk-XMCSKYDE.js → chunk-QPEOLAAS.js} +1 -1
  143. package/dist/cli/chunks/{chunk-7MUO4DEH.js → chunk-QQWBWEJS.js} +18 -18
  144. package/dist/cli/chunks/{chunk-UFP7SN5V.js → chunk-QVDCVD5D.js} +2 -2
  145. package/dist/cli/chunks/{chunk-NHEG2DLN.js → chunk-RJIEG3NA.js} +2 -2
  146. package/dist/cli/chunks/{chunk-KJ5A54ZH.js → chunk-RV74I3YO.js} +2 -2
  147. package/dist/cli/chunks/{chunk-UDSB3XCG.js → chunk-S75SOOZL.js} +2 -2
  148. package/dist/cli/chunks/{chunk-BPDAQB3F.js → chunk-SASBO5Y5.js} +2 -2
  149. package/dist/cli/chunks/{chunk-VJBJRFUO.js → chunk-SDLWKRVL.js} +9 -9
  150. package/dist/cli/chunks/{chunk-J6ASX536.js → chunk-SHKOCGNK.js} +2 -2
  151. package/dist/cli/chunks/{chunk-J35JWDJE.js → chunk-SI6DPU5D.js} +1 -1
  152. package/dist/cli/chunks/{chunk-V3MGY76S.js → chunk-SJ6Y4725.js} +2 -2
  153. package/dist/cli/chunks/{chunk-FTYRPEJS.js → chunk-SR52XP5F.js} +1 -1
  154. package/dist/cli/chunks/{chunk-ZUE524JL.js → chunk-SSUAAX3F.js} +2 -2
  155. package/dist/cli/chunks/{chunk-VG32EEUG.js → chunk-SSYAQZXA.js} +2 -2
  156. package/dist/cli/chunks/{chunk-HTVGHHX2.js → chunk-SUDMM5SO.js} +2 -2
  157. package/dist/cli/chunks/{chunk-K2SMP4OD.js → chunk-TIUKLYAI.js} +1 -1
  158. package/dist/cli/chunks/{chunk-VCVRZD4Y.js → chunk-TVGI32MB.js} +33 -33
  159. package/dist/cli/chunks/{chunk-CAZM63TP.js → chunk-U2A7NHZA.js} +2 -2
  160. package/dist/cli/chunks/{chunk-WBC6WB32.js → chunk-UE5ZOZR2.js} +2 -2
  161. package/dist/cli/chunks/{chunk-BQJ7CV53.js → chunk-UHEOGZLX.js} +12 -12
  162. package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
  163. package/dist/cli/chunks/{chunk-XN3KCKAM.js → chunk-V5NHZV7S.js} +2 -2
  164. package/dist/cli/chunks/{chunk-UNYTHZDZ.js → chunk-VJCIEHEF.js} +1 -1
  165. package/dist/cli/chunks/{chunk-5Y7UFHJD.js → chunk-VMDFFTCK.js} +1 -1
  166. package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
  167. package/dist/cli/chunks/{chunk-UPWLMIDY.js → chunk-VWPM27GU.js} +2 -2
  168. package/dist/cli/chunks/{chunk-USAKCGHC.js → chunk-VXFLJNCA.js} +2 -2
  169. package/dist/cli/chunks/{chunk-WKI46WWN.js → chunk-W5HQUIML.js} +2 -2
  170. package/dist/cli/chunks/{chunk-Z54G2YOL.js → chunk-WP4RETKG.js} +2 -2
  171. package/dist/cli/chunks/{chunk-IRPNEXOU.js → chunk-XIIQ5QTT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-O32BFQV4.js → chunk-XIQW7EFL.js} +2 -2
  173. package/dist/cli/chunks/{chunk-TW6Z6W4X.js → chunk-XWUWX7BV.js} +13 -13
  174. package/dist/cli/chunks/{chunk-57FX3GP6.js → chunk-Y4PFUMOU.js} +1 -1
  175. package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
  176. package/dist/cli/chunks/{chunk-4T7XV5KQ.js → chunk-YLMNVLDK.js} +1 -1
  177. package/dist/cli/chunks/{chunk-TSP6SU5V.js → chunk-YNMJEDN5.js} +2 -2
  178. package/dist/cli/chunks/{chunk-PWQWKYBG.js → chunk-YPBSUGMI.js} +1 -1
  179. package/dist/cli/chunks/{chunk-QP2HLKTS.js → chunk-YRAX7SFJ.js} +2 -2
  180. package/dist/cli/chunks/{chunk-O3ERGUXH.js → chunk-YTHTQPWR.js} +1 -1
  181. package/dist/cli/chunks/{chunk-MR2OPUSA.js → chunk-YU2BDRSD.js} +1 -1
  182. package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
  183. package/dist/cli/chunks/{chunk-2W5MQDHM.js → chunk-ZFL436FN.js} +2 -2
  184. package/dist/cli/chunks/{chunk-7MISCSL5.js → chunk-ZJH5MU2I.js} +2 -2
  185. package/dist/cli/chunks/{chunk-52KOPIMI.js → chunk-ZQ2XW3IP.js} +2 -2
  186. package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
  187. package/dist/cli/chunks/{ci-UMA2SMNW.js → ci-MFUR4CWV.js} +2 -2
  188. package/dist/cli/chunks/{ci-config-UQSILJFQ.js → ci-config-PNDLQ6XV.js} +2 -2
  189. package/dist/cli/chunks/{ci-output-U6YZLLKH.js → ci-output-PFZ4M7NC.js} +2 -2
  190. package/dist/cli/chunks/{circuit-breaker-ATYQP6X2.js → circuit-breaker-5HH6NLZN.js} +2 -2
  191. package/dist/cli/chunks/{claude-flow-setup-6YHFD7AN.js → claude-flow-setup-QCKYLGLC.js} +2 -2
  192. package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
  193. package/dist/cli/chunks/{cline-installer-EPE7IOZE.js → cline-installer-EASVPFXR.js} +2 -2
  194. package/dist/cli/chunks/{code-NUEJ4XYO.js → code-UJXDVYRK.js} +4 -3
  195. package/dist/cli/chunks/{code-index-extractor-D4DBT6OL.js → code-index-extractor-BZJ3UDP4.js} +2 -2
  196. package/dist/cli/chunks/{codex-installer-633SM4LR.js → codex-installer-XSQZUVOZ.js} +4 -4
  197. package/dist/cli/chunks/{completions-WUKVIW3L.js → completions-OWOOJFI2.js} +2 -2
  198. package/dist/cli/chunks/{complexity-analyzer-F73ACR5H.js → complexity-analyzer-KP5TOHDT.js} +2 -2
  199. package/dist/cli/chunks/{continuedev-installer-QH42TKMS.js → continuedev-installer-IFKQXLHM.js} +2 -2
  200. package/dist/cli/chunks/{copilot-installer-Y3XC7BTT.js → copilot-installer-IGJ6KGQY.js} +2 -2
  201. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
  202. package/dist/cli/chunks/{cost-tracker-57QPV7E3.js → cost-tracker-MMDDNKZB.js} +2 -2
  203. package/dist/cli/chunks/{coverage-IBCHMBCR.js → coverage-LUH2B7NT.js} +3 -3
  204. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
  205. package/dist/cli/chunks/{cursor-installer-F4UYQHIN.js → cursor-installer-4YLM5GWM.js} +2 -2
  206. package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
  207. package/dist/cli/chunks/{daemon-XR4Q6YZF.js → daemon-MZKVM4CJ.js} +3 -3
  208. package/dist/cli/chunks/{dag-attention-scheduler-ZR5ZD3TW.js → dag-attention-scheduler-X4CYW665.js} +2 -2
  209. package/dist/cli/chunks/{detect-GEGYURLL.js → detect-7BM2XINO.js} +2 -2
  210. package/dist/cli/chunks/{dist-node-JU3KT2JO.js → dist-node-Y5APLEYB.js} +2 -2
  211. package/dist/cli/chunks/{domain-handler-7QI3FJGE.js → domain-handler-X3ZRJNAH.js} +2 -2
  212. package/dist/cli/chunks/{domain-plugins-O2YRM2PD.js → domain-plugins-2UW5KQJB.js} +2 -2
  213. package/dist/cli/chunks/{domain-transfer-7J3S2OS6.js → domain-transfer-35W4CIBV.js} +2 -2
  214. package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
  215. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
  216. package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
  217. package/dist/cli/chunks/{eval-RVMCIUOR.js → eval-4QA2SROK.js} +2 -2
  218. package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
  219. package/dist/cli/chunks/{fast-paths-QUKPKWKZ.js → fast-paths-FIORX6GN.js} +2 -2
  220. package/dist/cli/chunks/{feature-flags-K7JXNKJI.js → feature-flags-6LYI2T4G.js} +2 -2
  221. package/dist/cli/chunks/{feature-flags-5JCSKL2P.js → feature-flags-ZOO7LMIC.js} +2 -2
  222. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
  223. package/dist/cli/chunks/{fleet-II4Q6HXK.js → fleet-7WF53H4F.js} +3 -3
  224. package/dist/cli/chunks/{gnn-wrapper-M7VO2EMS.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
  225. package/dist/cli/chunks/{heartbeat-handler-ND5CY26N.js → heartbeat-handler-DEKKMOVW.js} +4 -4
  226. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
  227. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
  228. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
  229. package/dist/cli/chunks/{hnsw-legacy-bridge-N3AUUUU7.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
  230. package/dist/cli/chunks/{hnswlib-node-NZY3E5EN.js → hnswlib-node-4YOQC6L4.js} +2 -2
  231. package/dist/cli/chunks/{hooks-QVJDTII5.js → hooks-TAOKV4EJ.js} +23 -22
  232. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
  233. package/dist/cli/chunks/{hypergraph-engine-ZRY6MTDV.js → hypergraph-engine-BODRJLHL.js} +2 -2
  234. package/dist/cli/chunks/{hypergraph-handler-56DO4XZQ.js → hypergraph-handler-RKMYJNTU.js} +3 -3
  235. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
  236. package/dist/cli/chunks/{init-guard-DTF4EVUY.js → init-guard-MXHSLSB2.js} +2 -2
  237. package/dist/cli/chunks/{init-handler-M6CNQHMX.js → init-handler-HUE57IFW.js} +6 -6
  238. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
  239. package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
  240. package/dist/cli/chunks/{kilocode-installer-IJN7XKBH.js → kilocode-installer-S333IKYQ.js} +2 -2
  241. package/dist/cli/chunks/{kiro-installer-UKKPGPDC.js → kiro-installer-WM5DLQWC.js} +2 -2
  242. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
  243. package/dist/cli/chunks/{learning-W2HETWQ4.js → learning-LNHMQLH5.js} +3 -3
  244. package/dist/cli/chunks/{llm-router-Y546K4VX.js → llm-router-EWFXYZZR.js} +4 -4
  245. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
  246. package/dist/cli/chunks/{load-MKAB2AXE.js → load-FGYGWVDK.js} +2 -2
  247. package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
  248. package/dist/cli/chunks/{mcp-AZKUS6K3.js → mcp-2FHNAAOM.js} +2 -2
  249. package/dist/cli/chunks/{memory-ZDOQN2KU.js → memory-DZMQ73AB.js} +5 -5
  250. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
  251. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
  252. package/dist/cli/chunks/{multi-model-executor-WWVXDHG4.js → multi-model-executor-6F2UAEUW.js} +2 -2
  253. package/dist/cli/chunks/{opencode-installer-YUJNXXWS.js → opencode-installer-XY3BGOTZ.js} +2 -2
  254. package/dist/cli/chunks/{orchestrator-Z6PWPLRE.js → orchestrator-B4CNKUOS.js} +17 -17
  255. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
  256. package/dist/cli/chunks/{pattern-usage-recorder-TPWPX32U.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
  257. package/dist/cli/chunks/{pipeline-4BBGTE4M.js → pipeline-FG5RKVRO.js} +2 -2
  258. package/dist/cli/chunks/{platform-5GSHXCV5.js → platform-3BT4KEVJ.js} +2 -2
  259. package/dist/cli/chunks/{plugin-OFDVF5HS.js → plugin-WI4RIN7O.js} +2 -2
  260. package/dist/cli/chunks/{prime-radiant-advanced-wasm-NC6MUYGJ.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
  261. package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
  262. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
  263. package/dist/cli/chunks/{protocol-handler-MPOAAEPA.js → protocol-handler-WNODKPGW.js} +2 -2
  264. package/dist/cli/chunks/{prove-CDKMAIVM.js → prove-5RHAEPYZ.js} +2 -2
  265. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
  266. package/dist/cli/chunks/{quality-ZH4F7R7R.js → quality-WPHR7BGQ.js} +2 -2
  267. package/dist/cli/chunks/{quality-gate-IDRMW6OE.js → quality-gate-4RKTEZMX.js} +3 -3
  268. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
  269. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
  270. package/dist/cli/chunks/{ref-validation-Z5GCGVXK.js → ref-validation-TPAWHOHH.js} +2 -2
  271. package/dist/cli/chunks/{roocode-installer-IZ2S7PH2.js → roocode-installer-7AVHFNDI.js} +2 -2
  272. package/dist/cli/chunks/router-EP34O3KB.js +2 -0
  273. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
  274. package/dist/cli/chunks/{routing-handler-NAX35VUW.js → routing-handler-YKEDVJSH.js} +2 -2
  275. package/dist/cli/chunks/{ruvector-commands-5YW2SOFF.js → ruvector-commands-JUAMM354.js} +2 -2
  276. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
  277. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
  278. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
  279. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
  280. package/dist/cli/chunks/{rvf-store-integrity-IPGCAT6C.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
  281. package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
  282. package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
  283. package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
  284. package/dist/cli/chunks/{security-3IH4BO5Z.js → security-ORDN3RD2.js} +3 -3
  285. package/dist/cli/chunks/{shared-rvf-adapter-ABY7PAY2.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
  286. package/dist/cli/chunks/{shared-rvf-dual-writer-6KENLN2W.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
  287. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
  288. package/dist/cli/chunks/{standalone-memory-RLFAUGOW.js → standalone-memory-OXRJYZXN.js} +2 -2
  289. package/dist/cli/chunks/{status-handler-FCOZBPE5.js → status-handler-BCX5D4HY.js} +2 -2
  290. package/dist/cli/chunks/{structural-health-4RDA5UUM.js → structural-health-LFG7RUU6.js} +2 -2
  291. package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
  292. package/dist/cli/chunks/{sync-KGEEXXCC.js → sync-YJEE2K2L.js} +2 -2
  293. package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
  294. package/dist/cli/chunks/{task-handlers-6H7L2UT4.js → task-handlers-CILP36I7.js} +4 -4
  295. package/dist/cli/chunks/{test-S7IG6EIX.js → test-SD457QJ6.js} +4 -4
  296. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
  297. package/dist/cli/chunks/{test-scheduling-7XYXI4L2.js → test-scheduling-ISI2O4Q5.js} +3 -3
  298. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
  299. package/dist/cli/chunks/{token-usage-Y2YTPOFE.js → token-usage-XOC5KG7S.js} +2 -2
  300. package/dist/cli/chunks/{transformers-UCJ3HHHC.js → transformers-LSLQAARK.js} +2 -2
  301. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
  302. package/dist/cli/chunks/{types-6CMFPETH.js → types-5BLCGLCR.js} +2 -2
  303. package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
  304. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
  305. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
  306. package/dist/cli/chunks/{upgrade-K25DN6WU.js → upgrade-RQJYLK3J.js} +2 -2
  307. package/dist/cli/chunks/{validate-T4V3TBY3.js → validate-QBHWXXCK.js} +2 -2
  308. package/dist/cli/chunks/{validate-swarm-XSRC576T.js → validate-swarm-IKXBKFB5.js} +2 -2
  309. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
  310. package/dist/cli/chunks/{web-tree-sitter-YOZXHRTN.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
  311. package/dist/cli/chunks/{windsurf-installer-ITPU2IYL.js → windsurf-installer-HQGDZT5D.js} +2 -2
  312. package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
  313. package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
  314. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
  315. package/dist/cli/chunks/{witness-chain-verifier-DTDSVKOG.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
  316. package/dist/cli/chunks/{witness-key-manager-EWACWGAW.js → witness-key-manager-RXYQNFJB.js} +2 -2
  317. package/dist/cli/chunks/{workflow-ZIQ4FV42.js → workflow-FBKCA4H6.js} +4 -4
  318. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
  319. package/dist/cli/chunks/wrappers-TWSKBTWD.js +2 -0
  320. package/dist/cli/commands/code.js +4 -0
  321. package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
  322. package/dist/cli/handlers/task-handler.d.ts +5 -0
  323. package/dist/cli/handlers/task-handler.js +21 -1
  324. package/dist/cli/utils/task-result.d.ts +11 -0
  325. package/dist/cli/utils/task-result.js +39 -0
  326. package/dist/coordination/handlers/test-execution-handlers.js +92 -58
  327. package/dist/coordination/mincut/mincut-persistence.js +29 -25
  328. package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
  329. package/dist/domains/code-intelligence/coordinator.js +46 -13
  330. package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
  331. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +32 -7
  332. package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
  333. package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
  334. package/dist/domains/quality-assessment/coordinator.js +2 -1
  335. package/dist/domains/test-execution/coordinator.js +10 -5
  336. package/dist/domains/test-execution/interfaces.d.ts +12 -0
  337. package/dist/domains/test-execution/plugin.js +6 -2
  338. package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
  339. package/dist/domains/test-execution/services/retry-handler.js +14 -9
  340. package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
  341. package/dist/domains/test-execution/services/test-executor.js +28 -9
  342. package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
  343. package/dist/domains/visual-accessibility/coordinator.js +15 -7
  344. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
  345. package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
  346. package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
  347. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
  348. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
  349. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
  350. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
  351. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
  352. package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
  353. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
  354. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
  355. package/dist/feedback/coverage-learner.js +13 -9
  356. package/dist/feedback/test-outcome-tracker.js +13 -9
  357. package/dist/governance/witness-chain.d.ts +5 -0
  358. package/dist/governance/witness-chain.js +22 -6
  359. package/dist/init/init-wizard-hooks.d.ts +1 -1
  360. package/dist/init/init-wizard-hooks.js +7 -8
  361. package/dist/init/phases/08-mcp.js +9 -0
  362. package/dist/init/settings-merge.d.ts +13 -0
  363. package/dist/init/settings-merge.js +49 -2
  364. package/dist/integrations/agent-booster-wasm/agent_booster_wasm.js +849 -0
  365. package/dist/integrations/agent-booster-wasm/agent_booster_wasm_bg.wasm +0 -0
  366. package/dist/integrations/agent-booster-wasm/index.d.ts +8 -0
  367. package/dist/integrations/agent-booster-wasm/index.js +25 -2
  368. package/dist/integrations/agent-booster-wasm/package.json +16 -0
  369. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
  370. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
  371. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
  372. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
  373. package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
  374. package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
  375. package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
  376. package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
  377. package/dist/integrations/ruvector/delta-tracker.js +16 -0
  378. package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
  379. package/dist/integrations/ruvector/sona-persistence.js +49 -24
  380. package/dist/kernel/unified-memory.d.ts +24 -0
  381. package/dist/kernel/unified-memory.js +63 -8
  382. package/dist/learning/aqe-learning-engine.js +1 -1
  383. package/dist/learning/dream/dream-engine.d.ts +3 -2
  384. package/dist/learning/dream/dream-engine.js +42 -24
  385. package/dist/learning/dream/dream-lock-retry.d.ts +38 -0
  386. package/dist/learning/dream/dream-lock-retry.js +66 -0
  387. package/dist/learning/dream/speculative-dreamer.js +1 -1
  388. package/dist/learning/embed-and-insert-pattern.js +4 -2
  389. package/dist/learning/embedder-endpoint-client.d.ts +31 -0
  390. package/dist/learning/embedder-endpoint-client.js +103 -10
  391. package/dist/learning/embedding-space.d.ts +12 -0
  392. package/dist/learning/embedding-space.js +17 -0
  393. package/dist/learning/experience-capture-middleware.js +25 -13
  394. package/dist/learning/experience-capture.js +1 -1
  395. package/dist/learning/experience-consolidation.d.ts +18 -0
  396. package/dist/learning/experience-consolidation.js +55 -8
  397. package/dist/learning/experience-space-verification.d.ts +71 -0
  398. package/dist/learning/experience-space-verification.js +147 -0
  399. package/dist/learning/pattern-lifecycle.d.ts +40 -4
  400. package/dist/learning/pattern-lifecycle.js +153 -76
  401. package/dist/learning/pattern-null-store.d.ts +5 -0
  402. package/dist/learning/pattern-null-store.js +8 -0
  403. package/dist/learning/pattern-promotion.js +6 -3
  404. package/dist/learning/pattern-store.d.ts +6 -0
  405. package/dist/learning/pattern-store.js +19 -6
  406. package/dist/learning/qe-reasoning-bank.js +2 -2
  407. package/dist/learning/real-embeddings.js +3 -1
  408. package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
  409. package/dist/learning/real-qe-reasoning-bank.js +77 -47
  410. package/dist/learning/rvf-pattern-store.js +6 -2
  411. package/dist/learning/sqlite-persistence.d.ts +6 -0
  412. package/dist/learning/sqlite-persistence.js +10 -0
  413. package/dist/mcp/bundle.js +642 -571
  414. package/dist/mcp/entry.js +4 -0
  415. package/dist/mcp/handlers/domain-handler-configs.js +2 -0
  416. package/dist/mcp/handlers/trajectory-judge.js +1 -1
  417. package/dist/mcp/protocol-server.js +1 -0
  418. package/dist/mcp/tools/visual-accessibility/index.js +8 -2
  419. package/dist/mcp/types.d.ts +6 -0
  420. package/dist/optimization/session-cache.d.ts +17 -1
  421. package/dist/optimization/session-cache.js +40 -36
  422. package/dist/planning/goap-planner.d.ts +6 -0
  423. package/dist/planning/goap-planner.js +35 -19
  424. package/dist/planning/plan-executor.js +24 -15
  425. package/dist/routing/co-execution-repository.js +12 -9
  426. package/dist/routing/routing-feedback.d.ts +8 -0
  427. package/dist/routing/routing-feedback.js +46 -24
  428. package/dist/routing/routing-outcomes-migration.js +7 -2
  429. package/dist/shared/llm/spend-ledger.d.ts +9 -0
  430. package/dist/shared/llm/spend-ledger.js +64 -39
  431. package/dist/shared/sqlite-lock-wait.d.ts +27 -0
  432. package/dist/shared/sqlite-lock-wait.js +37 -0
  433. package/dist/shared/sqlite-write-queue.d.ts +28 -0
  434. package/dist/shared/sqlite-write-queue.js +38 -0
  435. package/dist/shared/test-runner-project.d.ts +69 -0
  436. package/dist/shared/test-runner-project.js +186 -0
  437. package/dist/skills/security-visual-testing/index.d.ts +3 -1
  438. package/dist/skills/security-visual-testing/index.js +49 -35
  439. package/dist/skills/security-visual-testing/types.d.ts +19 -3
  440. package/dist/workers/workers/heartbeat-scheduler.js +5 -5
  441. package/dist/workers/workers/learning-consolidation.js +8 -7
  442. package/package.json +4 -2
  443. package/dist/cli/chunks/adapter-23KA2YW7.js +0 -2
  444. package/dist/cli/chunks/agent-booster-wasm-2DLAEZK6.js +0 -2
  445. package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +0 -2
  446. package/dist/cli/chunks/base-XPWGYDKD.js +0 -2
  447. package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +0 -2
  448. package/dist/cli/chunks/chunk-3FITMWWJ.js +0 -21
  449. package/dist/cli/chunks/chunk-ARRBXCII.js +0 -4
  450. package/dist/cli/chunks/chunk-BBYJBZHG.js +0 -14
  451. package/dist/cli/chunks/chunk-BM3EJLMV.js +0 -153
  452. package/dist/cli/chunks/chunk-D3ZZ2NLL.js +0 -62
  453. package/dist/cli/chunks/chunk-DLTB5KCR.js +0 -2
  454. package/dist/cli/chunks/chunk-DRLSJJIC.js +0 -6
  455. package/dist/cli/chunks/chunk-HAYKLXCT.js +0 -744
  456. package/dist/cli/chunks/chunk-HHBF2BZC.js +0 -65
  457. package/dist/cli/chunks/chunk-K7RT6ITZ.js +0 -2
  458. package/dist/cli/chunks/chunk-L752CNG3.js +0 -13
  459. package/dist/cli/chunks/chunk-MQXWG55U.js +0 -12
  460. package/dist/cli/chunks/chunk-WM2QRIRD.js +0 -14
  461. package/dist/cli/chunks/chunk-WRC3HLUY.js +0 -29
  462. package/dist/cli/chunks/chunk-XTZGAG6P.js +0 -27
  463. package/dist/cli/chunks/chunk-YKQWIXUY.js +0 -2
  464. package/dist/cli/chunks/client-E43GWLQH.js +0 -2
  465. package/dist/cli/chunks/core-handlers-R5A3SQDY.js +0 -2
  466. package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +0 -2
  467. package/dist/cli/chunks/daemon-BYYPIJ7G.js +0 -18
  468. package/dist/cli/chunks/dream-6C4NURSE.js +0 -2
  469. package/dist/cli/chunks/embed-and-insert-pattern-URES5Q6J.js +0 -3
  470. package/dist/cli/chunks/experience-capture-middleware-SYJQSBKE.js +0 -40
  471. package/dist/cli/chunks/file-discovery-J5IE5KP7.js +0 -2
  472. package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +0 -2
  473. package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +0 -2
  474. package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +0 -2
  475. package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +0 -2
  476. package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +0 -2
  477. package/dist/cli/chunks/init-wizard-RTLCRWDT.js +0 -2
  478. package/dist/cli/chunks/kernel-2OWIGGGT.js +0 -2
  479. package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +0 -2
  480. package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +0 -2
  481. package/dist/cli/chunks/load-test-D6QYNIVT.js +0 -2
  482. package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +0 -2
  483. package/dist/cli/chunks/memory-handlers-3SQVY7FE.js +0 -2
  484. package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +0 -2
  485. package/dist/cli/chunks/project-root-DDGBWDP6.js +0 -2
  486. package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +0 -2
  487. package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +0 -2
  488. package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +0 -2
  489. package/dist/cli/chunks/real-embeddings-I2UVNNB3.js +0 -2
  490. package/dist/cli/chunks/router-FT5WJPUH.js +0 -2
  491. package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +0 -2
  492. package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +0 -2
  493. package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +0 -2
  494. package/dist/cli/chunks/rvf-migration-coordinator-VUIZHTVG.js +0 -2
  495. package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +0 -2
  496. package/dist/cli/chunks/safe-db-TDZKUOZJ.js +0 -2
  497. package/dist/cli/chunks/schedule-CRKTRY2A.js +0 -2
  498. package/dist/cli/chunks/scheduler-6ZBDVQWN.js +0 -2
  499. package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +0 -2
  500. package/dist/cli/chunks/sync-54LUAUTK.js +0 -2
  501. package/dist/cli/chunks/task-handler-K3OXHYKU.js +0 -62
  502. package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +0 -2
  503. package/dist/cli/chunks/token-bootstrap-3QMABE45.js +0 -2
  504. package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +0 -2
  505. package/dist/cli/chunks/unified-memory-QARWQKJ2.js +0 -2
  506. package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +0 -2
  507. package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +0 -2
  508. package/dist/cli/chunks/visual-security-O4ALMCXQ.js +0 -2
  509. package/dist/cli/chunks/witness-chain-B3YW5NMS.js +0 -2
  510. package/dist/cli/chunks/witness-chain-PIYR72HJ.js +0 -2
  511. package/dist/cli/chunks/witness-chain-repair-YUG7E3UX.js +0 -2
  512. package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +0 -2
  513. package/dist/cli/chunks/wrappers-PW2O27LL.js +0 -2
@@ -31,6 +31,7 @@ import { v4 as uuidv4 } from 'uuid';
31
31
  import { getUnifiedPersistence } from '../../kernel/unified-persistence.js';
32
32
  import { registerStoreCloser } from '../../kernel/process-lifecycle.js';
33
33
  import { ConceptGraph } from './concept-graph.js';
34
+ import { DREAM_LOCK_WAIT_MS, DREAM_SHUTDOWN_LOCK_WAIT_MS, isBusyError, retryWhileBusy, withBusyTimeout, } from './dream-lock-retry.js';
34
35
  import { SpreadingActivation, } from './spreading-activation.js';
35
36
  import { InsightGenerator, } from './insight-generator.js';
36
37
  import { DEFAULT_VALIDATION_THRESHOLDS, } from './rvcow-branch-manager.js';
@@ -277,16 +278,14 @@ export class DreamEngine {
277
278
  await this.persistence.initialize();
278
279
  }
279
280
  this.db = this.persistence.getDatabase();
280
- // ADR-001 Option C: dynamic-import paths in checkAndTriggerDream() open
281
- // a fresh handle that the hook/worker busy_timeout pragmas never reach.
282
- // 60s patient timeout here keeps dream cycles from failing under WAL
283
- // contention from MCP workers (was 71% failure rate observed).
284
- try {
285
- this.db.pragma('busy_timeout = 60000');
286
- }
287
- catch { /* fail-soft */ }
288
- // Migrate legacy schema: rename 'duration' → 'duration_ms' if needed
289
- this.migrateSchema();
281
+ // #1253: no 60 s busy_timeout on this shared connection. better-sqlite3
282
+ // waits synchronously, so it froze the whole process (the MCP event loop)
283
+ // while another writer held the database. Dream writes instead wait
284
+ // briefly per attempt and retry asynchronously (dream-lock-retry.ts),
285
+ // which keeps the patience that avoided failures under contention (#1060).
286
+ // Migrate legacy schema: rename 'duration' → 'duration_ms' if needed.
287
+ // #1253: a short lock wait only; migrateSchema() logs and carries on.
288
+ withBusyTimeout(this.db, DREAM_LOCK_WAIT_MS, () => this.migrateSchema());
290
289
  // Initialize concept graph (shares same unified persistence)
291
290
  this.graph = new ConceptGraph();
292
291
  await this.graph.initialize();
@@ -296,9 +295,19 @@ export class DreamEngine {
296
295
  'committed in one short transaction instead of a SAVEPOINT held across the dream');
297
296
  }
298
297
  // #1060: a process that exited mid-dream left its cycle 'running'.
299
- const abandoned = markAbandonedCycles(this.db, Math.max(this.config.maxDurationMs, MAX_TOOL_DREAM_MS) + ABANDONED_CYCLE_GRACE_MS);
300
- if (abandoned > 0) {
301
- dreamLogger.info('Marked abandoned dream cycles as interrupted', { abandoned });
298
+ // #1253: housekeeping, so a locked database skips it after a short
299
+ // wait instead of blocking the process; the next initialize() retries.
300
+ const db = this.db;
301
+ try {
302
+ const abandoned = withBusyTimeout(db, DREAM_LOCK_WAIT_MS, () => markAbandonedCycles(db, Math.max(this.config.maxDurationMs, MAX_TOOL_DREAM_MS) + ABANDONED_CYCLE_GRACE_MS));
303
+ if (abandoned > 0) {
304
+ dreamLogger.info('Marked abandoned dream cycles as interrupted', { abandoned });
305
+ }
306
+ }
307
+ catch (error) {
308
+ if (!isBusyError(error))
309
+ throw error;
310
+ dreamLogger.warn('Abandoned dream cycle sweep skipped: database is locked', { error: toErrorMessage(error) });
302
311
  }
303
312
  this.initialized = true;
304
313
  this.closing = false;
@@ -433,7 +442,7 @@ export class DreamEngine {
433
442
  let committed = false;
434
443
  try {
435
444
  if (commitResults)
436
- await this.saveCycle(cycle);
445
+ await this.saveCycle(cycle, live);
437
446
  if (!live())
438
447
  throw new Error('Dream cycle cancelled');
439
448
  // 1. Check we have enough concepts
@@ -483,7 +492,7 @@ export class DreamEngine {
483
492
  committed = true; // nothing to record: the caller decides
484
493
  return { ...result, pending: computed };
485
494
  }
486
- const commit = this.commitComputed(db, computed);
495
+ const commit = await this.commitComputed(db, computed, live);
487
496
  committed = true;
488
497
  result.commitDurationMs = commit.durationMs;
489
498
  result.retention = commit.retention;
@@ -499,7 +508,7 @@ export class DreamEngine {
499
508
  cycle.durationMs = Date.now() - startTime;
500
509
  if (commitResults && this.db === db) {
501
510
  try {
502
- this.updateCycleSync(cycle);
511
+ await retryWhileBusy(db, () => this.updateCycleSync(cycle), { shouldContinue: () => this.db === db });
503
512
  }
504
513
  catch { /* best effort */ }
505
514
  }
@@ -528,9 +537,10 @@ export class DreamEngine {
528
537
  * #1060: write the results of a `dream(…, { commit: false })` run, in the
529
538
  * same single transaction a normal dream uses. Returns the commit duration
530
539
  * in ms. Throws (and writes nothing) if the engine is closed or the write
531
- * fails.
540
+ * fails. #1253: async, because a locked database is retried without
541
+ * blocking the process.
532
542
  */
533
- commitDreamResult(result) {
543
+ async commitDreamResult(result) {
534
544
  this.ensureInitialized();
535
545
  if (this.closing) {
536
546
  throw new Error('Dream engine is closing; nothing is committed');
@@ -538,7 +548,8 @@ export class DreamEngine {
538
548
  if (!result.pending) {
539
549
  throw new Error('Dream result has nothing pending to commit (it was already committed)');
540
550
  }
541
- const commit = this.commitComputed(this.db, result.pending);
551
+ const db = this.db;
552
+ const commit = await this.commitComputed(db, result.pending, () => !this.closing && this.db === db);
542
553
  result.pending = undefined;
543
554
  result.commitDurationMs = commit.durationMs;
544
555
  result.retention = commit.retention;
@@ -548,8 +559,12 @@ export class DreamEngine {
548
559
  * Commit a computed dream, then record it in the witness chain (#1060) and
549
560
  * run the default retention steps (#1239).
550
561
  */
551
- commitComputed(db, computed) {
552
- const commit = commitDream(db, computed);
562
+ async commitComputed(db, computed, live) {
563
+ // #1253: retry a locked database asynchronously; each attempt is short.
564
+ const commit = await retryWhileBusy(db, () => commitDream(db, computed), {
565
+ shouldContinue: live,
566
+ cancelledError: () => new Error('Dream cycle cancelled'),
567
+ });
553
568
  try {
554
569
  this._witnessChain?.append('DREAM_COMMIT', {
555
570
  cycleId: computed.cycle.id,
@@ -613,7 +628,9 @@ export class DreamEngine {
613
628
  cycle.endTime = new Date();
614
629
  cycle.durationMs = Date.now() - startTime;
615
630
  try {
616
- this.updateCycleSync(cycle);
631
+ // #1253: a short wait only; if the database stays locked, the
632
+ // abandoned-cycle sweep marks the cycle interrupted later.
633
+ withBusyTimeout(this.db, DREAM_SHUTDOWN_LOCK_WAIT_MS, () => this.updateCycleSync(cycle));
617
634
  }
618
635
  catch {
619
636
  // Best effort during shutdown
@@ -912,16 +929,17 @@ export class DreamEngine {
912
929
  // ==========================================================================
913
930
  // Persistence
914
931
  // ==========================================================================
915
- async saveCycle(cycle) {
932
+ async saveCycle(cycle, live) {
916
933
  if (!this.db)
917
934
  return;
935
+ const db = this.db;
918
936
  const stmt = this.db.prepare(`
919
937
  INSERT INTO dream_cycles
920
938
  (id, start_time, end_time, duration_ms, concepts_processed, associations_found,
921
939
  insights_generated, status, error, created_at)
922
940
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
923
941
  `);
924
- stmt.run(cycle.id, cycle.startTime.toISOString(), cycle.endTime?.toISOString() ?? null, cycle.durationMs ?? null, cycle.conceptsProcessed, cycle.associationsFound, cycle.insightsGenerated, cycle.status, cycle.error ?? null, cycle.startTime.toISOString());
942
+ await retryWhileBusy(db, () => stmt.run(cycle.id, cycle.startTime.toISOString(), cycle.endTime?.toISOString() ?? null, cycle.durationMs ?? null, cycle.conceptsProcessed, cycle.associationsFound, cycle.insightsGenerated, cycle.status, cycle.error ?? null, cycle.startTime.toISOString()), { shouldContinue: live, cancelledError: () => new Error('Dream cycle cancelled') });
925
943
  }
926
944
  updateCycleSync(cycle) {
927
945
  if (!this.db)
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Lock waits for dream writes (#1253).
3
+ *
4
+ * better-sqlite3 waits for a locked database synchronously, so a long
5
+ * busy_timeout freezes the whole process: in the MCP server that is the event
6
+ * loop and every tool call. Dream writes therefore wait only briefly per
7
+ * attempt and retry asynchronously, so other work runs between attempts.
8
+ */
9
+ import type { Database as DatabaseType } from 'better-sqlite3';
10
+ /** Longest a single dream write attempt blocks the process on a locked database. */
11
+ export declare const DREAM_LOCK_WAIT_MS = 200;
12
+ /** Total time a dream write keeps retrying a locked database before it fails. */
13
+ export declare const DREAM_LOCK_RETRY_BUDGET_MS = 60000;
14
+ /** True for SQLite "database is locked" / "busy" failures. */
15
+ export declare function isBusyError(error: unknown): boolean;
16
+ /** Run `fn` with a temporary busy_timeout, restoring the connection's previous value. */
17
+ export declare function withBusyTimeout<T>(db: DatabaseType, timeoutMs: number, fn: () => T): T;
18
+ export interface RetryWhileBusyOptions {
19
+ /** Synchronous wait per attempt (default DREAM_LOCK_WAIT_MS). */
20
+ waitMs?: number;
21
+ /** Total retry time before the busy error is thrown (default DREAM_LOCK_RETRY_BUDGET_MS). */
22
+ budgetMs?: number;
23
+ /** Checked before every attempt; when false, `cancelledError` is thrown instead of retrying. */
24
+ shouldContinue?: () => boolean;
25
+ cancelledError?: () => Error;
26
+ /** Injectable for tests. */
27
+ sleep?: (ms: number) => Promise<void>;
28
+ now?: () => number;
29
+ }
30
+ /**
31
+ * Run a synchronous write, retrying while the database is locked. Each attempt
32
+ * blocks for at most `waitMs`; between attempts the event loop is free. Errors
33
+ * other than a busy database are thrown at once.
34
+ */
35
+ export declare function retryWhileBusy<T>(db: DatabaseType, fn: () => T, options?: RetryWhileBusyOptions): Promise<T>;
36
+ /** Wait for the synchronous best-effort write made while a dream is interrupted at shutdown. */
37
+ export declare const DREAM_SHUTDOWN_LOCK_WAIT_MS = 1000;
38
+ //# sourceMappingURL=dream-lock-retry.d.ts.map
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Lock waits for dream writes (#1253).
3
+ *
4
+ * better-sqlite3 waits for a locked database synchronously, so a long
5
+ * busy_timeout freezes the whole process: in the MCP server that is the event
6
+ * loop and every tool call. Dream writes therefore wait only briefly per
7
+ * attempt and retry asynchronously, so other work runs between attempts.
8
+ */
9
+ /** Longest a single dream write attempt blocks the process on a locked database. */
10
+ export const DREAM_LOCK_WAIT_MS = 200;
11
+ /** Total time a dream write keeps retrying a locked database before it fails. */
12
+ export const DREAM_LOCK_RETRY_BUDGET_MS = 60_000;
13
+ /** Longest pause between attempts; the pause doubles from 25 ms up to this. */
14
+ const MAX_BACKOFF_MS = 1000;
15
+ /** True for SQLite "database is locked" / "busy" failures. */
16
+ export function isBusyError(error) {
17
+ const code = error?.code;
18
+ if (typeof code === 'string' && /^SQLITE_(BUSY|LOCKED)/.test(code))
19
+ return true;
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ return /database is locked|database table is locked|SQLITE_BUSY/i.test(message);
22
+ }
23
+ /** Run `fn` with a temporary busy_timeout, restoring the connection's previous value. */
24
+ export function withBusyTimeout(db, timeoutMs, fn) {
25
+ const previous = db.pragma('busy_timeout', { simple: true });
26
+ db.pragma(`busy_timeout = ${timeoutMs}`);
27
+ try {
28
+ return fn();
29
+ }
30
+ finally {
31
+ try {
32
+ db.pragma(`busy_timeout = ${previous}`);
33
+ }
34
+ catch { /* connection closed */ }
35
+ }
36
+ }
37
+ /**
38
+ * Run a synchronous write, retrying while the database is locked. Each attempt
39
+ * blocks for at most `waitMs`; between attempts the event loop is free. Errors
40
+ * other than a busy database are thrown at once.
41
+ */
42
+ export async function retryWhileBusy(db, fn, options = {}) {
43
+ const waitMs = options.waitMs ?? DREAM_LOCK_WAIT_MS;
44
+ const budgetMs = options.budgetMs ?? DREAM_LOCK_RETRY_BUDGET_MS;
45
+ const sleep = options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
46
+ const now = options.now ?? Date.now;
47
+ const started = now();
48
+ let backoff = 25;
49
+ for (;;) {
50
+ if (options.shouldContinue && !options.shouldContinue()) {
51
+ throw options.cancelledError?.() ?? new Error('Cancelled while waiting for a locked database');
52
+ }
53
+ try {
54
+ return withBusyTimeout(db, waitMs, fn);
55
+ }
56
+ catch (error) {
57
+ if (!isBusyError(error) || now() - started + backoff >= budgetMs)
58
+ throw error;
59
+ }
60
+ await sleep(backoff);
61
+ backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);
62
+ }
63
+ }
64
+ /** Wait for the synchronous best-effort write made while a dream is interrupted at shutdown. */
65
+ export const DREAM_SHUTDOWN_LOCK_WAIT_MS = 1000;
66
+ //# sourceMappingURL=dream-lock-retry.js.map
@@ -117,7 +117,7 @@ export class SpeculativeDreamer {
117
117
  let commitDurationMs;
118
118
  if (winner?.result) {
119
119
  try {
120
- commitDurationMs = this.engine.commitDreamResult(winner.result);
120
+ commitDurationMs = await this.engine.commitDreamResult(winner.result);
121
121
  winner.selected = true;
122
122
  }
123
123
  catch (error) {
@@ -18,6 +18,7 @@
18
18
  * fail-soft (errors are logged at debug level and swallowed) — pattern row
19
19
  * persistence must not regress when embedding computation fails.
20
20
  */
21
+ import { writeWhenUnlockedOn } from '../shared/sqlite-write-queue.js';
21
22
  import { computeRealEmbedding, DEFAULT_EMBEDDING_CONFIG, getActiveEmbeddingSpaceIdentity, } from './real-embeddings.js';
22
23
  /**
23
24
  * Compute an embedding for a pattern (`name + description + tags`) and persist
@@ -44,8 +45,9 @@ export async function ensurePatternEmbedding(db, patternId, name, description, t
44
45
  const spaceId = getActiveEmbeddingSpaceIdentity()?.spaceId;
45
46
  if (!spaceId)
46
47
  throw new Error('VECTOR_SPACE_UNVERIFIED: embedder has no runtime provenance');
47
- db.prepare(`INSERT OR REPLACE INTO qe_pattern_embeddings (pattern_id, embedding, dimension, model, space_id)
48
- VALUES (?, ?, ?, ?, ?)`).run(patternId, buffer, embedding.length, fullConfig.modelName, spaceId);
48
+ // #1283: queued on the shared connection so a locked memory.db does not freeze the MCP server.
49
+ await writeWhenUnlockedOn(db, () => db.prepare(`INSERT OR REPLACE INTO qe_pattern_embeddings (pattern_id, embedding, dimension, model, space_id)
50
+ VALUES (?, ?, ?, ?, ?)`).run(patternId, buffer, embedding.length, fullConfig.modelName, spaceId));
49
51
  }
50
52
  catch (error) {
51
53
  // Non-fatal: pattern row already persisted; embedding can be backfilled later.
@@ -82,6 +82,16 @@ interface ParsedEndpoint {
82
82
  */
83
83
  export declare function redactEndpoint(endpoint: string): string;
84
84
  export declare function parseEndpoint(endpoint: string): ParsedEndpoint;
85
+ /**
86
+ * #1216: a connect or request timeout. The host did not answer within the
87
+ * budget, so the breaker opens on the first one instead of counting it as one
88
+ * failure of `failureThreshold`.
89
+ */
90
+ export declare class EmbedderEndpointTimeoutError extends Error {
91
+ readonly phase: 'connect' | 'request';
92
+ readonly limitMs: number;
93
+ constructor(phase: 'connect' | 'request', limitMs: number);
94
+ }
85
95
  /**
86
96
  * OpenAI-compatible embeddings client with keep-alive, circuit breaker, and identity probe.
87
97
  */
@@ -93,7 +103,28 @@ export declare class EmbedderEndpointClient {
93
103
  private cachedIdentity;
94
104
  /** True while a probe is in flight — prevents the embed() lazy-probe race. */
95
105
  private probeInFlight;
106
+ /**
107
+ * #1216: set when the breaker window elapsed and no probe has succeeded
108
+ * since. The next probe is the breaker's half-open trial; it runs in the
109
+ * background so no caller waits on a host that may still not answer.
110
+ */
111
+ private trialPending;
112
+ /** #1216: requests waiting on the host, abandoned when the breaker opens. */
113
+ private readonly inFlight;
96
114
  constructor(options: EmbedderEndpointClientOptions);
115
+ /**
116
+ * #1216: the breaker opened, so the host is treated as down. Requests that
117
+ * are still waiting on it fail now rather than each waiting out its own
118
+ * timeout.
119
+ */
120
+ private abandonInFlight;
121
+ /**
122
+ * #1216: true while the endpoint is not known to work: the breaker is open,
123
+ * or its window elapsed and the trial probe has not succeeded yet.
124
+ */
125
+ needsTrial(): boolean;
126
+ /** Start the half-open trial probe in the background (one at a time). */
127
+ private startTrialProbe;
97
128
  /** Public, redacted endpoint URL for logs/metrics. */
98
129
  getSafeEndpoint(): string;
99
130
  /**
@@ -82,35 +82,60 @@ export function parseEndpoint(endpoint) {
82
82
  safeUrl: url.toString().replace(/\/$/, ''),
83
83
  };
84
84
  }
85
+ /**
86
+ * #1216: a connect or request timeout. The host did not answer within the
87
+ * budget, so the breaker opens on the first one instead of counting it as one
88
+ * failure of `failureThreshold`.
89
+ */
90
+ export class EmbedderEndpointTimeoutError extends Error {
91
+ phase;
92
+ limitMs;
93
+ constructor(phase, limitMs) {
94
+ super(`[EmbedderEndpointClient] ${phase} timeout after ${limitMs}ms`);
95
+ this.phase = phase;
96
+ this.limitMs = limitMs;
97
+ this.name = 'EmbedderEndpointTimeoutError';
98
+ }
99
+ }
85
100
  /**
86
101
  * Circuit breaker state.
87
102
  *
88
- * Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold`.
103
+ * Tracks failure timestamps within `windowMs`. Opens when count reaches `threshold`,
104
+ * or at once on a timeout (#1216): timeouts arrive one timeout apart, so with a
105
+ * 30 s request timeout and a 60 s window they would never add up to three.
89
106
  * While open, every request fast-fails until the window expires. On recovery
90
107
  * (window elapses), the breaker calls `onRecover` so the client can invalidate
91
108
  * cached endpoint identity — endpoint restarts often coincide with model swaps.
109
+ * Whenever it opens, it calls `onTrip` so the client can abandon requests
110
+ * still waiting on the host.
92
111
  */
93
112
  class CircuitBreaker {
94
113
  threshold;
95
114
  windowMs;
96
115
  onRecover;
116
+ onTrip;
97
117
  failures = [];
98
118
  trippedAt = null;
99
- constructor(threshold, windowMs, onRecover = () => { }) {
119
+ constructor(threshold, windowMs, onRecover = () => { }, onTrip = () => { }) {
100
120
  this.threshold = threshold;
101
121
  this.windowMs = windowMs;
102
122
  this.onRecover = onRecover;
123
+ this.onTrip = onTrip;
103
124
  }
104
125
  recordSuccess() {
105
126
  this.failures = [];
106
127
  this.trippedAt = null;
107
128
  }
108
- recordFailure() {
129
+ recordFailure(tripNow = false) {
130
+ // Requests abandoned when the breaker opened fail too; they must not
131
+ // extend the window.
132
+ if (this.trippedAt !== null)
133
+ return;
109
134
  const now = Date.now();
110
135
  this.failures = this.failures.filter((t) => now - t < this.windowMs);
111
136
  this.failures.push(now);
112
- if (this.failures.length >= this.threshold) {
113
- this.trippedAt = now;
137
+ if (tripNow || this.failures.length >= this.threshold) {
138
+ this.trip();
114
139
  }
115
140
  }
116
141
  isOpen() {
@@ -128,6 +153,7 @@ class CircuitBreaker {
128
153
  /** #1204: open (or re-open) the breaker for a full window from now. */
129
154
  trip() {
130
155
  this.trippedAt = Date.now();
156
+ this.onTrip();
131
157
  }
132
158
  /** For tests / observability */
133
159
  getState() {
@@ -145,6 +171,14 @@ export class EmbedderEndpointClient {
145
171
  cachedIdentity = null;
146
172
  /** True while a probe is in flight — prevents the embed() lazy-probe race. */
147
173
  probeInFlight = null;
174
+ /**
175
+ * #1216: set when the breaker window elapsed and no probe has succeeded
176
+ * since. The next probe is the breaker's half-open trial; it runs in the
177
+ * background so no caller waits on a host that may still not answer.
178
+ */
179
+ trialPending = false;
180
+ /** #1216: requests waiting on the host, abandoned when the breaker opens. */
181
+ inFlight = new Set();
148
182
  constructor(options) {
149
183
  this.opts = {
150
184
  endpoint: options.endpoint,
@@ -177,6 +211,35 @@ export class EmbedderEndpointClient {
177
211
  // On breaker recovery, drop identity so the next embed() re-probes.
178
212
  // Endpoint restarts (the common cause of recovery) often change models.
179
213
  this.cachedIdentity = null;
214
+ this.trialPending = true;
215
+ }, () => this.abandonInFlight());
216
+ }
217
+ /**
218
+ * #1216: the breaker opened, so the host is treated as down. Requests that
219
+ * are still waiting on it fail now rather than each waiting out its own
220
+ * timeout.
221
+ */
222
+ abandonInFlight() {
223
+ if (this.inFlight.size === 0)
224
+ return;
225
+ const err = new Error(`[EmbedderEndpointClient] circuit breaker opened for ${this.parsed.safeUrl} — request abandoned`);
226
+ for (const reject of [...this.inFlight])
227
+ reject(err);
228
+ }
229
+ /**
230
+ * #1216: true while the endpoint is not known to work: the breaker is open,
231
+ * or its window elapsed and the trial probe has not succeeded yet.
232
+ */
233
+ needsTrial() {
234
+ return this.breaker.isOpen() || this.trialPending;
235
+ }
236
+ /** Start the half-open trial probe in the background (one at a time). */
237
+ startTrialProbe() {
238
+ if (this.probeInFlight)
239
+ return;
240
+ this.probe().catch(() => {
241
+ // Still failing: keep fast-failing for another full window.
242
+ this.breaker.trip();
180
243
  });
181
244
  }
182
245
  /** Public, redacted endpoint URL for logs/metrics. */
@@ -201,6 +264,14 @@ export class EmbedderEndpointClient {
201
264
  }
202
265
  // Identity gate: every embed call must have a verified identity behind it.
203
266
  if (this.cachedIdentity === null) {
267
+ if (this.trialPending) {
268
+ // #1216: half-open. The endpoint failed until a window ago and may
269
+ // still not answer. Probe it in the background as the single trial
270
+ // and fail fast here; callers after a successful trial embed again.
271
+ this.startTrialProbe();
272
+ throw new Error(`[EmbedderEndpointClient] circuit breaker half-open for ${this.parsed.safeUrl} — ` +
273
+ `trial probe running, fast-failing`);
274
+ }
204
275
  await this.ensureProbed();
205
276
  }
206
277
  try {
@@ -210,7 +281,7 @@ export class EmbedderEndpointClient {
210
281
  return vectors;
211
282
  }
212
283
  catch (err) {
213
- this.breaker.recordFailure();
284
+ this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
214
285
  throw err;
215
286
  }
216
287
  }
@@ -242,7 +313,7 @@ export class EmbedderEndpointClient {
242
313
  this.breaker.recordSuccess();
243
314
  }
244
315
  catch (err) {
245
- this.breaker.recordFailure();
316
+ this.breaker.recordFailure(err instanceof EmbedderEndpointTimeoutError);
246
317
  throw err;
247
318
  }
248
319
  if (!vec || vec.length !== this.opts.expectedDim) {
@@ -262,6 +333,7 @@ export class EmbedderEndpointClient {
262
333
  fingerprint,
263
334
  endpoint: this.parsed.safeUrl,
264
335
  };
336
+ this.trialPending = false;
265
337
  return this.cachedIdentity;
266
338
  }
267
339
  getCachedIdentity() {
@@ -374,18 +446,30 @@ export class EmbedderEndpointClient {
374
446
  const requestTimeoutMs = this.opts.requestTimeoutMs;
375
447
  return new Promise((resolve, reject) => {
376
448
  let settled = false;
449
+ // #1285: removes this request's listeners from its socket. Keep-alive
450
+ // sockets serve many requests; listeners left behind pile up and a
451
+ // finished request's timeout handler would fire for a later request.
452
+ let detachFromSocket = () => { };
377
453
  const safeResolve = (val) => {
378
454
  if (settled)
379
455
  return;
380
456
  settled = true;
457
+ detachFromSocket();
458
+ this.inFlight.delete(abandon);
381
459
  resolve(val);
382
460
  };
383
461
  const safeReject = (err) => {
384
462
  if (settled)
385
463
  return;
386
464
  settled = true;
465
+ detachFromSocket();
466
+ this.inFlight.delete(abandon);
387
467
  reject(err);
388
468
  };
469
+ const abandon = (err) => {
470
+ safeReject(err);
471
+ req.destroy(err);
472
+ };
389
473
  const req = requestFn(reqOptions, (res) => {
390
474
  const chunks = [];
391
475
  res.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
@@ -426,18 +510,27 @@ export class EmbedderEndpointClient {
426
510
  else {
427
511
  onConnect();
428
512
  }
429
- socket.on('timeout', () => {
513
+ const onTimeout = () => {
430
514
  // Distinguish phase for the error message.
431
515
  const phase = socket.connecting ? 'connect' : 'request';
432
516
  const limit = socket.connecting ? connectTimeoutMs : requestTimeoutMs;
433
- const err = new Error(`[EmbedderEndpointClient] ${phase} timeout after ${limit}ms`);
517
+ const err = new EmbedderEndpointTimeoutError(phase, limit);
434
518
  // Reject FIRST, then destroy. If we destroy first, the 'error' event
435
519
  // races us and we might lose the timeout-specific message.
436
520
  safeReject(err);
437
521
  req.destroy(err);
438
- });
522
+ };
523
+ socket.on('timeout', onTimeout);
524
+ detachFromSocket = () => {
525
+ socket.removeListener('timeout', onTimeout);
526
+ socket.removeListener('connect', onConnect);
527
+ };
528
+ // Settled before the socket was assigned: nothing of ours may stay on it.
529
+ if (settled)
530
+ detachFromSocket();
439
531
  });
440
532
  req.on('error', (err) => safeReject(err));
533
+ this.inFlight.add(abandon);
441
534
  req.write(body);
442
535
  req.end();
443
536
  });
@@ -57,6 +57,18 @@ export declare const EMBEDDING_RUNTIME_UNAVAILABLE_CAUSE: string;
57
57
  export declare function reportEmbeddingRuntimeUnavailable(): void;
58
58
  /** @internal test-only seam */
59
59
  export declare function __resetEmbeddingRuntimeNoticeForTests(): void;
60
+ /**
61
+ * #1217: record the embedding space of a vector stored on a
62
+ * captured_experiences row. ExperienceReplay compares only vectors of the
63
+ * active space. On a table without the column (it is added by
64
+ * ExperienceReplay's schema) the vector stays without provenance: it is never
65
+ * compared, and ExperienceReplay re-embeds it at its next start.
66
+ */
67
+ export declare function recordExperienceEmbeddingSpace(db: {
68
+ prepare(sql: string): {
69
+ run(...params: unknown[]): unknown;
70
+ };
71
+ }, experienceId: string, spaceId: string | undefined): void;
60
72
  /** Sidecar path used to bind a persistent ANN index to one embedding space. */
61
73
  export declare function embeddingSpaceManifestPath(indexPath: string): string;
62
74
  /**
@@ -120,6 +120,23 @@ export function reportEmbeddingRuntimeUnavailable() {
120
120
  export function __resetEmbeddingRuntimeNoticeForTests() {
121
121
  embeddingRuntimeNoticeShown = false;
122
122
  }
123
+ /**
124
+ * #1217: record the embedding space of a vector stored on a
125
+ * captured_experiences row. ExperienceReplay compares only vectors of the
126
+ * active space. On a table without the column (it is added by
127
+ * ExperienceReplay's schema) the vector stays without provenance: it is never
128
+ * compared, and ExperienceReplay re-embeds it at its next start.
129
+ */
130
+ export function recordExperienceEmbeddingSpace(db, experienceId, spaceId) {
131
+ if (!spaceId)
132
+ return;
133
+ try {
134
+ db.prepare('UPDATE captured_experiences SET embedding_space_id = ? WHERE id = ?').run(spaceId, experienceId);
135
+ }
136
+ catch {
137
+ // Older table without the column; see above.
138
+ }
139
+ }
123
140
  /** Sidecar path used to bind a persistent ANN index to one embedding space. */
124
141
  export function embeddingSpaceManifestPath(indexPath) {
125
142
  return `${indexPath}.space.json`;