agentic-qe 3.15.11 → 3.15.12

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 (431) hide show
  1. package/.claude/hooks/aqe-hook.cjs +38 -2
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +149 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +6 -6
  6. package/dist/cli/chunks/adapter-HL7MOCQN.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-5VZCKTIJ.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-K3C6CQCD.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-NVFQ25WS.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +2 -0
  11. package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-QGWIJADQ.js} +2 -2
  12. package/dist/cli/chunks/{arena-36DTATJV.js → arena-TSZVDSXS.js} +4 -4
  13. package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-KIEE2SHJ.js} +3 -3
  14. package/dist/cli/chunks/base-WIM7G3HC.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BNB32NW3.js} +2 -2
  16. package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-MPC5SPYI.js} +3 -3
  17. package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-LZ7UXKAY.js} +2 -2
  18. package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-VDHAW4RK.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +2 -0
  20. package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-23PQF7NN.js} +1 -1
  21. package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-26672ISV.js} +2 -2
  22. package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-2ASQRBK2.js} +2 -2
  23. package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-2E2QO44T.js} +2 -2
  24. package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-2IVE5AR3.js} +1 -1
  25. package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-2JYUA27M.js} +1 -1
  26. package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-2PPSS4JD.js} +2 -2
  27. package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-32UTHIY5.js} +3 -3
  28. package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-33I2ZP6E.js} +2 -2
  29. package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-35MIUSXQ.js} +2 -2
  30. package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-35NW676P.js} +2 -2
  31. package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-3EWQN37E.js} +2 -2
  32. package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-3IU4LDZR.js} +2 -2
  33. package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-47RMGDG4.js} +2 -2
  34. package/dist/cli/chunks/chunk-4A76VPU4.js +3 -0
  35. package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-4CB3QPZM.js} +2 -2
  36. package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-4HWUECVD.js} +2 -2
  37. package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-4KUOYDY2.js} +2 -2
  38. package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-4LWMAAWK.js} +2 -2
  39. package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-4PU5GTZW.js} +2 -2
  40. package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-4SA7M34P.js} +1 -1
  41. package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-4Y6OEBJZ.js} +1 -1
  42. package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-5A66EGEW.js} +2 -2
  43. package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-5ADXFUMO.js} +2 -2
  44. package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-5S4UIDFK.js} +1 -1
  45. package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5TAEW5OV.js} +1 -1
  46. package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-5Z23ZMXZ.js} +59 -59
  47. package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-65TH6RPD.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-66PXR3NI.js} +2 -2
  49. package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-6E6HB4N4.js} +4 -4
  50. package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-6QRI3JVE.js} +2 -2
  51. package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-7DNR4KKR.js} +1 -1
  52. package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-7JFDLL2F.js} +1 -1
  53. package/dist/cli/chunks/chunk-7OEFBWAG.js +5 -0
  54. package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-7QEUHNKO.js} +1 -1
  55. package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-7TA5MUPW.js} +1 -1
  56. package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-A2JCRXTK.js} +2 -2
  57. package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-A5Y7DAVQ.js} +2 -2
  58. package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-ADUAJIAU.js} +2 -2
  59. package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-AJEXPFAB.js} +1 -1
  60. package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-BC4T6SCV.js} +4 -4
  61. package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-BMG2JLSQ.js} +2 -2
  62. package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-BOSMELJX.js} +2 -2
  63. package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-BYRCB5JT.js} +2 -2
  64. package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-C3YOVASQ.js} +1 -1
  65. package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-C74M4WUI.js} +2 -2
  66. package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-CA5UNWQF.js} +2 -2
  67. package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-CDA5Z74H.js} +2 -2
  68. package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-CPIBIR3X.js} +2 -2
  69. package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-CU36D7TN.js} +2 -2
  70. package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-DAUEK66C.js} +1 -1
  71. package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-DRCBRUGN.js} +2 -2
  72. package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-DZGPUGUG.js} +2 -2
  73. package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-EF6OERRR.js} +1 -1
  74. package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-EN7GRVEQ.js} +2 -2
  75. package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-ENGL7FIJ.js} +1 -1
  76. package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-FAGKBOX2.js} +2 -2
  77. package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-FNUFTWEO.js} +3 -3
  78. package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-FZJCBSN4.js} +2 -2
  79. package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-G24SWTAX.js} +35 -35
  80. package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-G3AABG4Q.js} +2 -2
  81. package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-GJKZ7UQO.js} +2 -2
  82. package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-GKFV6CUD.js} +2 -2
  83. package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-HLGFHHWV.js} +2 -2
  84. package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-HM3LSFTY.js} +2 -2
  85. package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-HSA5IGGW.js} +2 -2
  86. package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-HZBXJFGN.js} +2 -2
  87. package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-IA55PFLG.js} +2 -2
  88. package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-ICKUINKD.js} +2 -2
  89. package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-IETBWYHW.js} +2 -2
  90. package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-IL7GQNNE.js} +2 -2
  91. package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-INZARYUD.js} +2 -2
  92. package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-IPA7K556.js} +2 -2
  93. package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-IVTQF55W.js} +3 -3
  94. package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-J7Y7ZBIT.js} +5 -5
  95. package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-JGIJPDGD.js} +2 -2
  96. package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-JNXK47OL.js} +2 -2
  97. package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-JOWUS2X5.js} +1 -1
  98. package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-JR6CUKAI.js} +2 -2
  99. package/dist/cli/chunks/chunk-JRYWLOBD.js +21 -0
  100. package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-JW5PDJ5O.js} +3 -3
  101. package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-K3A3NWT3.js} +2 -2
  102. package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-KA5SHLMW.js} +2 -2
  103. package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-KGA7VAI4.js} +2 -2
  104. package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-KJDI5CHX.js} +2 -2
  105. package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-L3PV7VXK.js} +1 -1
  106. package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-L7NGKANW.js} +2 -2
  107. package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-LFBA735S.js} +7 -7
  108. package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-MAJXZYGK.js} +1 -1
  109. package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-MCPEC6OO.js} +1 -1
  110. package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-MCPXNUDK.js} +2 -2
  111. package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-MMEALJ4D.js} +2 -2
  112. package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-MYF5CNGV.js} +2 -2
  113. package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-MYUMJ2ZI.js} +1 -1
  114. package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-N7O3PF6Y.js} +2 -2
  115. package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-NA3F6FEO.js} +2 -2
  116. package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-NNBQZR73.js} +2 -2
  117. package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-NV74SICL.js} +2 -2
  118. package/dist/cli/chunks/chunk-NVRYELCY.js +13 -0
  119. package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-NX4BCSOZ.js} +2 -2
  120. package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-O3IM4WRZ.js} +2 -2
  121. package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-O4QJMANM.js} +1 -1
  122. package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-OHVYINGM.js} +17 -17
  123. package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-P5E26N2X.js} +2 -2
  124. package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-P7UFJ6DO.js} +1 -1
  125. package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-PGSJBXTD.js} +2 -2
  126. package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-PT2NXS43.js} +1 -1
  127. package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-PTBOLBM4.js} +2 -2
  128. package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-PX5OPXY6.js} +1 -1
  129. package/dist/cli/chunks/chunk-QCPVUNN3.js +2 -0
  130. package/dist/cli/chunks/{chunk-K2HBNYAZ.js → chunk-QSGEBCDB.js} +2 -2
  131. package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-QUJJYTJH.js} +2 -2
  132. package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-QWG3SILX.js} +3 -3
  133. package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-RCOLPF3B.js} +2 -2
  134. package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-RYHG3I7J.js} +2 -2
  135. package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-SBHM5X2S.js} +2 -2
  136. package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-SDRJJUPO.js} +1 -1
  137. package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-SG2TX72G.js} +2 -2
  138. package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-SITL5YZV.js} +4 -4
  139. package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-SPC4RBLF.js} +2 -2
  140. package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-SQVZ3TRU.js} +2 -2
  141. package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-SUX5XB2Z.js} +2 -2
  142. package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-T4EN5VVK.js} +2 -2
  143. package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-TGMXUZZC.js} +2 -2
  144. package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-TLRHAMX5.js} +1 -1
  145. package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-TOWOJGEI.js} +1 -1
  146. package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-TSOQ2QLT.js} +2 -2
  147. package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-TVA5GRIU.js} +2 -2
  148. package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-TXEUVUMO.js} +1 -1
  149. package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-U6IXYQO4.js} +2 -2
  150. package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-U7ZHDGXG.js} +1 -1
  151. package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-UCSK2RMI.js} +2 -2
  152. package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-UIKQPO4Y.js} +2 -2
  153. package/dist/cli/chunks/chunk-UJNGGFGX.js +2 -0
  154. package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-ULCW6IVQ.js} +2 -2
  155. package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-UREDS662.js} +2 -2
  156. package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-URSTP3WI.js} +2 -2
  157. package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-UUZZXHUF.js} +2 -2
  158. package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-UZED4YZ5.js} +1 -1
  159. package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-VF7FTD64.js} +1 -1
  160. package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-VUR5THML.js} +2 -2
  161. package/dist/cli/chunks/{chunk-H43AFUKL.js → chunk-VXVTFKRA.js} +2 -2
  162. package/dist/cli/chunks/chunk-VZBC6DP7.js +2 -0
  163. package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-W4II6SIH.js} +2 -2
  164. package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-W5HQIYQU.js} +3 -3
  165. package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-W7H55PY4.js} +1 -1
  166. package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-WDEXOLK2.js} +1 -1
  167. package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-WGTEZT7G.js} +2 -2
  168. package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-WLRU6ESI.js} +2 -2
  169. package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-WTAUF6O4.js} +2 -2
  170. package/dist/cli/chunks/chunk-XCNSGSKV.js +3 -0
  171. package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-XZOYKB22.js} +2 -2
  172. package/dist/cli/chunks/chunk-YIDAXOUX.js +8 -0
  173. package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-YLKIXEPP.js} +1 -1
  174. package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-YNVEDFPQ.js} +1 -1
  175. package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-YUA6ZKKY.js} +2 -2
  176. package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-YVJEUX3I.js} +2 -2
  177. package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-YWWMNTBF.js} +2 -2
  178. package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-ZGROHCOW.js} +1 -1
  179. package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-ZPVGX4DI.js} +2 -2
  180. package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-ZROAMFX2.js} +2 -2
  181. package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-ZYOYR3UR.js} +1 -1
  182. package/dist/cli/chunks/ci-BZNWW3I3.js +81 -0
  183. package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-LOHNXOKV.js} +2 -2
  184. package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-LCOQBSJL.js} +2 -2
  185. package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-7LRXTLFE.js} +2 -2
  186. package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-HBU4VWC3.js} +2 -2
  187. package/dist/cli/chunks/client-4PNYDFYS.js +2 -0
  188. package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-CO6MLH6X.js} +2 -2
  189. package/dist/cli/chunks/{code-LV2HAGJY.js → code-SIXBS6JM.js} +3 -3
  190. package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-GWJKZ2IQ.js} +2 -2
  191. package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-6NINVWXJ.js} +2 -2
  192. package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-7VIX3GML.js} +2 -2
  193. package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-FBQR6ZP2.js} +2 -2
  194. package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-VA7RIXW5.js} +2 -2
  195. package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-4QEBC4MU.js} +2 -2
  196. package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +2 -0
  197. package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-GRYKHPWL.js} +2 -2
  198. package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-USPMNKOU.js} +11 -10
  199. package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +2 -0
  200. package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-ZXIPSZVH.js} +2 -2
  201. package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-D7F3RGI5.js} +3 -3
  202. package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-N2VRHPSJ.js} +4 -4
  203. package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-NL6BA7BY.js} +2 -2
  204. package/dist/cli/chunks/{detect-TYR7HT23.js → detect-XC2HCIIT.js} +2 -2
  205. package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-A3Y26MEI.js} +2 -2
  206. package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-WV6SFXRB.js} +2 -2
  207. package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-KJIF6Z2B.js} +2 -2
  208. package/dist/cli/chunks/{domain-transfer-DOBI67K6.js → domain-transfer-L3F6AES2.js} +2 -2
  209. package/dist/cli/chunks/dream-QOB3JCOM.js +2 -0
  210. package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-PA3Y4KGO.js} +2 -2
  211. package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-YGEZNUVE.js} +2 -2
  212. package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-D4T7NW6B.js} +3 -3
  213. package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-6JYK7RYQ.js} +2 -2
  214. package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-DKXMDVPE.js} +2 -2
  215. package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-RBH2GDSR.js} +2 -2
  216. package/dist/cli/chunks/file-discovery-BN76S2PR.js +2 -0
  217. package/dist/cli/chunks/fleet-43YMXACN.js +46 -0
  218. package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-MV54UC4C.js} +2 -2
  219. package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-7DKMVQQH.js} +4 -4
  220. package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +2 -0
  221. package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +2 -0
  222. package/dist/cli/chunks/hnsw-index-HE4AX22U.js +2 -0
  223. package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-6IWREDQC.js} +2 -2
  224. package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-5BIESSCK.js} +2 -2
  225. package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-3EETRM62.js} +28 -28
  226. package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +2 -0
  227. package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-RSWCB2D3.js} +2 -2
  228. package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-552LXKL3.js} +3 -3
  229. package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +2 -0
  230. package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-OTDBJ5HD.js} +2 -2
  231. package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-3FK3TKEA.js} +6 -6
  232. package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +2 -0
  233. package/dist/cli/chunks/kernel-2WZOQEZS.js +2 -0
  234. package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-KZ2O4LF3.js} +2 -2
  235. package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-MLCCXRF7.js} +2 -2
  236. package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +2 -0
  237. package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-QUCMBD77.js} +3 -3
  238. package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-PDEV3UP2.js} +4 -4
  239. package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +2 -0
  240. package/dist/cli/chunks/{load-YATHI72E.js → load-XFVVLO7E.js} +2 -2
  241. package/dist/cli/chunks/load-test-BEWEE44J.js +2 -0
  242. package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-74G3CL2S.js} +2 -2
  243. package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-XIFM6JNX.js} +5 -5
  244. package/dist/cli/chunks/memory-backend-NYKBBKZR.js +2 -0
  245. package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-ZCKURV6S.js} +2 -2
  246. package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-7L4W3O2Q.js} +2 -2
  247. package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-BPG422LF.js} +2 -2
  248. package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-OEAFLAEV.js} +58 -20
  249. package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +2 -0
  250. package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-LOPNCULT.js} +2 -2
  251. package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-VWTYUZB7.js} +2 -2
  252. package/dist/cli/chunks/{platform-5WONJSUX.js → platform-WFJJ3X2E.js} +2 -2
  253. package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-744TPUSG.js} +2 -2
  254. package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-BD5BLNDR.js} +2 -2
  255. package/dist/cli/chunks/project-root-C7ELXZRK.js +2 -0
  256. package/dist/cli/chunks/protocol-executor-SUVE33BM.js +2 -0
  257. package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-JIBILI74.js} +2 -2
  258. package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-MNOL5FYW.js} +2 -2
  259. package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +2 -0
  260. package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-JEGBDGGX.js} +2 -2
  261. package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-SYJ6ROMI.js} +3 -3
  262. package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +2 -0
  263. package/dist/cli/chunks/real-embeddings-ZWXS5ZFV.js +2 -0
  264. package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-RRHUFW2N.js} +2 -2
  265. package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-XFO6JSVN.js} +2 -2
  266. package/dist/cli/chunks/router-4FTAVYLJ.js +2 -0
  267. package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +2 -0
  268. package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-L2K3JASE.js} +2 -2
  269. package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-A6CINHGM.js} +2 -2
  270. package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +2 -0
  271. package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +2 -0
  272. package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-T4RY7L53.js} +2 -2
  273. package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +2 -0
  274. package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-IR33TGQS.js} +2 -2
  275. package/dist/cli/chunks/safe-db-QXDZ6QY3.js +2 -0
  276. package/dist/cli/chunks/schedule-CZKD6RIY.js +2 -0
  277. package/dist/cli/chunks/scheduler-BLA3Q4CH.js +2 -0
  278. package/dist/cli/chunks/{security-CUEA3UIM.js → security-Z5GDE2IH.js} +3 -3
  279. package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-SIZMEHPM.js} +2 -2
  280. package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-HLM65RDS.js} +2 -2
  281. package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +2 -0
  282. package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-SKSZG7P5.js} +2 -2
  283. package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-766YOOMJ.js} +2 -2
  284. package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-M45FNOLT.js} +2 -2
  285. package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-6CJ24B5T.js} +2 -2
  286. package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-B2U366I3.js} +2 -2
  287. package/dist/cli/chunks/{task-handler-TFKVUTNF.js → task-handler-P6IFLCKP.js} +17 -15
  288. package/dist/cli/chunks/task-handlers-DPWMUKFC.js +9 -0
  289. package/dist/cli/chunks/{test-D2XDJNDX.js → test-TODH7KRF.js} +4 -4
  290. package/dist/cli/chunks/test-runner-process-46IPK3GH.js +2 -0
  291. package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-VMVMVRHT.js} +3 -3
  292. package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-XQW7BMCK.js} +2 -2
  293. package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-JCZEIRKO.js} +2 -2
  294. package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-U2ML3OHE.js} +2 -2
  295. package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +2 -0
  296. package/dist/cli/chunks/{types-5YEMGPSQ.js → types-GGEPCHP6.js} +2 -2
  297. package/dist/cli/chunks/unified-memory-FL26RTV3.js +2 -0
  298. package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +2 -0
  299. package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +2 -0
  300. package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-T5GRM7HS.js} +2 -2
  301. package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-XMUJPLP3.js} +2 -2
  302. package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-KJLF7JEH.js} +2 -2
  303. package/dist/cli/chunks/visual-security-IJVPO5FA.js +2 -0
  304. package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-LOHVZ7G5.js} +2 -2
  305. package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-33FBTXJU.js} +2 -2
  306. package/dist/cli/chunks/witness-chain-5FAFCQKP.js +2 -0
  307. package/dist/cli/chunks/witness-chain-V2M32W5D.js +2 -0
  308. package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-VWBO4NXE.js} +2 -2
  309. package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-BHJ3ZAEK.js} +2 -2
  310. package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-WNVPH2Z3.js} +2 -2
  311. package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-6QR5MQTO.js} +4 -4
  312. package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +2 -0
  313. package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-EHOL62TS.js} +2 -2
  314. package/dist/cli/commands/ci.js +7 -0
  315. package/dist/cli/commands/coverage.js +7 -1
  316. package/dist/cli/commands/fleet.js +2 -2
  317. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
  318. package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
  319. package/dist/cli/handlers/task-handler.js +6 -0
  320. package/dist/cli/utils/coverage-verdict.d.ts +11 -2
  321. package/dist/cli/utils/coverage-verdict.js +26 -6
  322. package/dist/cli/utils/fleet-operation.d.ts +5 -0
  323. package/dist/cli/utils/fleet-operation.js +7 -1
  324. package/dist/cli/utils/fleet-result.d.ts +5 -3
  325. package/dist/cli/utils/fleet-result.js +9 -3
  326. package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
  327. package/dist/coordination/handlers/coverage-collection.js +2 -1
  328. package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
  329. package/dist/coordination/handlers/coverage-evidence.js +159 -0
  330. package/dist/coordination/handlers/coverage-handlers.js +16 -3
  331. package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
  332. package/dist/coordination/handlers/coverage-scope.js +321 -0
  333. package/dist/coordination/handlers/coverage-target.d.ts +9 -0
  334. package/dist/coordination/handlers/coverage-target.js +15 -5
  335. package/dist/coordination/handlers/handler-utils.d.ts +5 -0
  336. package/dist/coordination/handlers/handler-utils.js +8 -4
  337. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
  338. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -0
  339. package/dist/domains/code-intelligence/services/semantic-analyzer.js +10 -7
  340. package/dist/init/phases/10-workers.js +42 -4
  341. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +23 -1
  342. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +50 -15
  343. package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +7 -2
  344. package/dist/integrations/agentic-flow/reasoning-bank/index.js +8 -0
  345. package/dist/learning/embedder-endpoint-client.d.ts +8 -0
  346. package/dist/learning/embedder-endpoint-client.js +20 -0
  347. package/dist/learning/embedder-recovery.d.ts +63 -0
  348. package/dist/learning/embedder-recovery.js +94 -0
  349. package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
  350. package/dist/learning/qe-reasoning-bank.d.ts +21 -0
  351. package/dist/learning/qe-reasoning-bank.js +54 -8
  352. package/dist/learning/real-embeddings.d.ts +23 -0
  353. package/dist/learning/real-embeddings.js +69 -2
  354. package/dist/learning/real-qe-reasoning-bank.d.ts +24 -4
  355. package/dist/learning/real-qe-reasoning-bank.js +58 -20
  356. package/dist/logging/redaction.js +142 -12
  357. package/dist/mcp/bundle.js +504 -492
  358. package/dist/mcp/daemon-mode.d.ts +126 -0
  359. package/dist/mcp/daemon-mode.js +257 -0
  360. package/dist/mcp/entry.d.ts +4 -0
  361. package/dist/mcp/entry.js +50 -2
  362. package/dist/mcp/handlers/domain-handler-configs.js +5 -0
  363. package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
  364. package/dist/mcp/handlers/orchestrate-routes.js +53 -0
  365. package/dist/mcp/handlers/task-handlers.d.ts +11 -2
  366. package/dist/mcp/handlers/task-handlers.js +50 -5
  367. package/dist/mcp/protocol-server.js +3 -0
  368. package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
  369. package/dist/mcp/services/reasoning-bank-service.js +9 -0
  370. package/dist/mcp/types.d.ts +14 -0
  371. package/dist/routing/advisor/redaction.js +22 -2
  372. package/dist/shared/llm/providers/response-deadline.js +16 -2
  373. package/dist/shared/types/index.js +3 -1
  374. package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
  375. package/package.json +3 -3
  376. package/dist/cli/chunks/adapter-V4GSGOOK.js +0 -2
  377. package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +0 -2
  378. package/dist/cli/chunks/base-AK7BXBX2.js +0 -2
  379. package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +0 -2
  380. package/dist/cli/chunks/chunk-2DTX7YAZ.js +0 -6
  381. package/dist/cli/chunks/chunk-72ZBJD2E.js +0 -3
  382. package/dist/cli/chunks/chunk-EBPJY4DI.js +0 -3
  383. package/dist/cli/chunks/chunk-HJ3XNTTJ.js +0 -2
  384. package/dist/cli/chunks/chunk-IO5537OM.js +0 -2
  385. package/dist/cli/chunks/chunk-IW6WDGHM.js +0 -2
  386. package/dist/cli/chunks/chunk-LRL56ZYL.js +0 -21
  387. package/dist/cli/chunks/chunk-VLD7Z2ED.js +0 -13
  388. package/dist/cli/chunks/chunk-VO3DRK4P.js +0 -3
  389. package/dist/cli/chunks/ci-6GUFAZMJ.js +0 -81
  390. package/dist/cli/chunks/client-HL2COSFM.js +0 -2
  391. package/dist/cli/chunks/core-handlers-IX7ATLM6.js +0 -2
  392. package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +0 -2
  393. package/dist/cli/chunks/dream-T6EP7B3F.js +0 -2
  394. package/dist/cli/chunks/file-discovery-JYMVTDMU.js +0 -2
  395. package/dist/cli/chunks/fleet-FVAUMKUT.js +0 -46
  396. package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +0 -2
  397. package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +0 -2
  398. package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +0 -2
  399. package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +0 -2
  400. package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +0 -2
  401. package/dist/cli/chunks/init-wizard-FUC7KDVX.js +0 -2
  402. package/dist/cli/chunks/kernel-ZCPMCVMW.js +0 -2
  403. package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +0 -2
  404. package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +0 -2
  405. package/dist/cli/chunks/load-test-ZHQ2MUGO.js +0 -2
  406. package/dist/cli/chunks/memory-backend-AAMQG6WH.js +0 -2
  407. package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +0 -2
  408. package/dist/cli/chunks/project-root-7QL4KP5C.js +0 -2
  409. package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +0 -2
  410. package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +0 -2
  411. package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +0 -2
  412. package/dist/cli/chunks/real-embeddings-RQRVOKVM.js +0 -2
  413. package/dist/cli/chunks/router-LQB5SWAF.js +0 -2
  414. package/dist/cli/chunks/routing-feedback-OEEXA55N.js +0 -2
  415. package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +0 -2
  416. package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +0 -2
  417. package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +0 -2
  418. package/dist/cli/chunks/safe-db-PE6G3L55.js +0 -2
  419. package/dist/cli/chunks/schedule-OLKQ6QYW.js +0 -2
  420. package/dist/cli/chunks/scheduler-LSGBDFAT.js +0 -2
  421. package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +0 -2
  422. package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +0 -9
  423. package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +0 -2
  424. package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +0 -2
  425. package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +0 -2
  426. package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +0 -2
  427. package/dist/cli/chunks/unified-persistence-UCV7YETW.js +0 -2
  428. package/dist/cli/chunks/visual-security-ZLXRIQZV.js +0 -2
  429. package/dist/cli/chunks/witness-chain-CVIWYTD2.js +0 -2
  430. package/dist/cli/chunks/witness-chain-VBKORKOX.js +0 -2
  431. package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +0 -2
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Agentic QE v3 - MCP server daemon mode (#1158)
3
+ *
4
+ * The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
5
+ * a detached background process with no stdin (`stdio: 'ignore'`), only to
6
+ * host the worker daemon. The #513 guard treats stdin EOF as "the client is
7
+ * gone" and shuts the server down, so that daemon used to exit within
8
+ * seconds of starting.
9
+ *
10
+ * `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
11
+ * EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
12
+ * the process alive (worker timers are unref'd, also #513). The server then
13
+ * stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
14
+ * `shutdown` method, or a crash.
15
+ *
16
+ * Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
17
+ * MCP client always talks to the server over a pipe/socket, so an
18
+ * `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
19
+ * server into an orphan that outlives the client: the #513 guard stays on and
20
+ * a warning is logged. The variable is also removed from `process.env` once
21
+ * read, so processes the server spawns do not inherit it.
22
+ *
23
+ * Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
24
+ * opened with O_APPEND by start-daemon.cjs), so renaming the file would not
25
+ * stop the writes. Instead, on each heartbeat the server copies an oversized
26
+ * daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
27
+ * the next write lands at the new end of the file. start-daemon.cjs rotates an
28
+ * oversized log at start-up the same way (a rename, as nothing writes it then).
29
+ */
30
+ export declare const DAEMON_MODE_ENV = "AQE_MCP_DAEMON";
31
+ /** Default interval of the daemon heartbeat line in daemon.log. */
32
+ export declare const DEFAULT_DAEMON_HEARTBEAT_MS = 60000;
33
+ /** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
34
+ export declare const DAEMON_HEARTBEAT_ENV = "AQE_DAEMON_HEARTBEAT_SECONDS";
35
+ /** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
36
+ export declare const DAEMON_LOG_MAX_SIZE_ENV = "AQE_DAEMON_LOG_MAX_SIZE";
37
+ export declare const DEFAULT_DAEMON_LOG_MAX_BYTES: number;
38
+ /**
39
+ * Absolute path of daemon.log, set by start-daemon.cjs for the server it
40
+ * starts. Internal: the server rotates the log only when this file is the one
41
+ * its stdout/stderr write to.
42
+ */
43
+ export declare const DAEMON_LOG_PATH_ENV = "AQE_MCP_DAEMON_LOG";
44
+ export interface ParsedSetting {
45
+ value: number;
46
+ /** Set when the raw value was rejected and the default applies. */
47
+ warning?: string;
48
+ }
49
+ /**
50
+ * Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
51
+ * (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
52
+ * Unset, empty or invalid values fall back to the 5 MB default.
53
+ */
54
+ export declare function parseDaemonLogMaxBytes(raw: string | undefined): ParsedSetting;
55
+ /** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
56
+ export declare function parseDaemonHeartbeatMs(raw: string | undefined): ParsedSetting;
57
+ /** What `fd 0` is connected to, as far as the guard cares. */
58
+ export type StdinKind = 'tty' | 'pipe' | 'other';
59
+ /** How the server's lifecycle reacts to stdin. */
60
+ export type StdinGuardMode =
61
+ /** Normal stdio client: stdin EOF/close shuts the server down (#513). */
62
+ 'stdio'
63
+ /** Interactive terminal: no guard, so Ctrl-D does not kill a debug session. */
64
+ | 'tty'
65
+ /** `AQE_MCP_DAEMON` with a non-pipe stdin: stdin is ignored (#1158). */
66
+ | 'daemon';
67
+ export interface StdinGuardDecision {
68
+ mode: StdinGuardMode;
69
+ /** Set when daemon mode was requested but refused. */
70
+ warning?: string;
71
+ }
72
+ /** Whether the environment asks for daemon mode. */
73
+ export declare function isDaemonModeRequested(env: Readonly<Record<string, string | undefined>>): boolean;
74
+ /**
75
+ * Classify the process's stdin. A FIFO or socket means a client is (or was)
76
+ * connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
77
+ */
78
+ export declare function detectStdinKind(stdin?: {
79
+ isTTY?: boolean;
80
+ }, fd?: number): StdinKind;
81
+ /** Decide how the server should treat stdin EOF. Pure: no side effects. */
82
+ export declare function resolveStdinGuardMode(env: Readonly<Record<string, string | undefined>>, stdinKind: StdinKind): StdinGuardDecision;
83
+ export interface DaemonHeartbeatStatus {
84
+ totalWorkers: number;
85
+ errorWorkers: number;
86
+ /** Worker runs since the daemon started, all workers together. */
87
+ totalExecutions: number;
88
+ failedExecutions: number;
89
+ }
90
+ /**
91
+ * Keep a daemon-mode server alive and log one heartbeat line per interval.
92
+ * The timer is deliberately ref'd: nothing else holds the event loop open in
93
+ * daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
94
+ * an error it throws is ignored. Returns a function that stops it.
95
+ */
96
+ export declare function startDaemonHeartbeat(log: (message: string) => void, getStatus: () => DaemonHeartbeatStatus | undefined, intervalMs?: number, beforeBeat?: () => void): () => void;
97
+ export type DaemonLogRotation = {
98
+ rotated: true;
99
+ bytes: number;
100
+ kept: boolean;
101
+ error?: string;
102
+ } | {
103
+ rotated: false;
104
+ reason: 'disabled' | 'not-a-regular-file' | 'not-our-log' | 'under-cap' | 'error';
105
+ error?: string;
106
+ };
107
+ /**
108
+ * Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
109
+ * to `<logPath>.1` (replacing the previous one) and truncate it in place
110
+ * through the server's own descriptor, which start-daemon.cjs opened with
111
+ * O_APPEND, so later writes start again at offset 0 of the same file.
112
+ *
113
+ * Acts only when `logPath` is a regular file (not a symlink, #970) and is the
114
+ * very file one of `fds` (stdout/stderr) writes to, matched by device and
115
+ * inode, so it never truncates a file the server does not own. If the copy
116
+ * fails the log is still truncated, to keep disk use bounded. Lines written
117
+ * between the copy and the truncate are lost; the window is one copy long.
118
+ */
119
+ export declare function rotateDaemonLog(logPath: string, maxBytes: number, fds?: readonly number[]): DaemonLogRotation;
120
+ /**
121
+ * The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
122
+ * line into the fresh log after each rotation and a warning the first time a
123
+ * check fails. Returns undefined when there is nothing to rotate.
124
+ */
125
+ export declare function createDaemonLogRotator(logPath: string | undefined, maxBytes: number, log: (message: string) => void): (() => void) | undefined;
126
+ //# sourceMappingURL=daemon-mode.d.ts.map
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Agentic QE v3 - MCP server daemon mode (#1158)
3
+ *
4
+ * The generated `.agentic-qe/workers/start-daemon.cjs` runs the MCP server as
5
+ * a detached background process with no stdin (`stdio: 'ignore'`), only to
6
+ * host the worker daemon. The #513 guard treats stdin EOF as "the client is
7
+ * gone" and shuts the server down, so that daemon used to exit within
8
+ * seconds of starting.
9
+ *
10
+ * `AQE_MCP_DAEMON=1` selects daemon mode. It changes exactly one thing: stdin
11
+ * EOF/close no longer shuts the server down, and a ref'd heartbeat timer keeps
12
+ * the process alive (worker timers are unref'd, also #513). The server then
13
+ * stops only on SIGTERM/SIGINT (what `stop-daemon.cjs` sends), the JSON-RPC
14
+ * `shutdown` method, or a crash.
15
+ *
16
+ * Safety: daemon mode is honoured only when stdin is NOT a pipe or socket. An
17
+ * MCP client always talks to the server over a pipe/socket, so an
18
+ * `AQE_MCP_DAEMON` that leaks into a client's environment cannot turn its
19
+ * server into an orphan that outlives the client: the #513 guard stays on and
20
+ * a warning is logged. The variable is also removed from `process.env` once
21
+ * read, so processes the server spawns do not inherit it.
22
+ *
23
+ * Log size (#1207): the server's stdout/stderr ARE daemon.log (a descriptor
24
+ * opened with O_APPEND by start-daemon.cjs), so renaming the file would not
25
+ * stop the writes. Instead, on each heartbeat the server copies an oversized
26
+ * daemon.log to daemon.log.1 and truncates daemon.log in place; with O_APPEND
27
+ * the next write lands at the new end of the file. start-daemon.cjs rotates an
28
+ * oversized log at start-up the same way (a rename, as nothing writes it then).
29
+ */
30
+ import { closeSync, constants, fstatSync, ftruncateSync, lstatSync, openSync, readSync, renameSync, unlinkSync, writeSync, } from 'node:fs';
31
+ export const DAEMON_MODE_ENV = 'AQE_MCP_DAEMON';
32
+ /** Only these values enable daemon mode; anything else (or unset) is off. */
33
+ const DAEMON_ON_VALUES = new Set(['1', 'true', 'yes', 'on']);
34
+ /** Default interval of the daemon heartbeat line in daemon.log. */
35
+ export const DEFAULT_DAEMON_HEARTBEAT_MS = 60_000;
36
+ /** Heartbeat interval in seconds (#1207), also how often daemon.log size is checked. */
37
+ export const DAEMON_HEARTBEAT_ENV = 'AQE_DAEMON_HEARTBEAT_SECONDS';
38
+ const MAX_HEARTBEAT_SECONDS = 86_400;
39
+ /** Size cap of daemon.log before it is rotated to daemon.log.1 (#1207). */
40
+ export const DAEMON_LOG_MAX_SIZE_ENV = 'AQE_DAEMON_LOG_MAX_SIZE';
41
+ export const DEFAULT_DAEMON_LOG_MAX_BYTES = 5 * 1024 * 1024;
42
+ const MIN_DAEMON_LOG_MAX_BYTES = 1024;
43
+ /**
44
+ * Absolute path of daemon.log, set by start-daemon.cjs for the server it
45
+ * starts. Internal: the server rotates the log only when this file is the one
46
+ * its stdout/stderr write to.
47
+ */
48
+ export const DAEMON_LOG_PATH_ENV = 'AQE_MCP_DAEMON_LOG';
49
+ const OFF_VALUES = new Set(['0', 'off', 'false', 'no', 'none', 'disable', 'disabled']);
50
+ const SIZE_UNITS = { '': 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
51
+ /**
52
+ * Parse `AQE_DAEMON_LOG_MAX_SIZE`: bytes, or a number with a K, M or G suffix
53
+ * (binary units, optional trailing B). `0`/`off` disables rotation (value 0).
54
+ * Unset, empty or invalid values fall back to the 5 MB default.
55
+ */
56
+ export function parseDaemonLogMaxBytes(raw) {
57
+ const text = (raw ?? '').trim().toLowerCase();
58
+ if (text === '')
59
+ return { value: DEFAULT_DAEMON_LOG_MAX_BYTES };
60
+ if (OFF_VALUES.has(text))
61
+ return { value: 0 };
62
+ const match = /^(\d+)\s*([kmg]?)b?$/.exec(text);
63
+ const bytes = match ? Number(match[1]) * SIZE_UNITS[match[2]] : NaN;
64
+ if (Number.isSafeInteger(bytes) && bytes >= MIN_DAEMON_LOG_MAX_BYTES)
65
+ return { value: bytes };
66
+ return {
67
+ value: DEFAULT_DAEMON_LOG_MAX_BYTES,
68
+ warning: `[AQE] WARN ${DAEMON_LOG_MAX_SIZE_ENV}=${JSON.stringify(raw)} ignored: expected bytes ` +
69
+ `(at least ${MIN_DAEMON_LOG_MAX_BYTES}) or a size such as 512K or 5M; using 5M\n`,
70
+ };
71
+ }
72
+ /** Parse `AQE_DAEMON_HEARTBEAT_SECONDS` (whole seconds, 1 to 86400) into milliseconds. */
73
+ export function parseDaemonHeartbeatMs(raw) {
74
+ const text = (raw ?? '').trim();
75
+ if (text === '')
76
+ return { value: DEFAULT_DAEMON_HEARTBEAT_MS };
77
+ const seconds = /^\d+$/.test(text) ? Number(text) : NaN;
78
+ if (seconds >= 1 && seconds <= MAX_HEARTBEAT_SECONDS)
79
+ return { value: seconds * 1000 };
80
+ return {
81
+ value: DEFAULT_DAEMON_HEARTBEAT_MS,
82
+ warning: `[AQE] WARN ${DAEMON_HEARTBEAT_ENV}=${JSON.stringify(raw)} ignored: expected whole ` +
83
+ `seconds from 1 to ${MAX_HEARTBEAT_SECONDS}; using 60\n`,
84
+ };
85
+ }
86
+ /** Whether the environment asks for daemon mode. */
87
+ export function isDaemonModeRequested(env) {
88
+ const raw = env[DAEMON_MODE_ENV];
89
+ if (raw === undefined)
90
+ return false;
91
+ return DAEMON_ON_VALUES.has(raw.trim().toLowerCase());
92
+ }
93
+ /**
94
+ * Classify the process's stdin. A FIFO or socket means a client is (or was)
95
+ * connected; `/dev/null` (`stdio: 'ignore'`) or a regular file is 'other'.
96
+ */
97
+ export function detectStdinKind(stdin = process.stdin, fd = 0) {
98
+ if (stdin.isTTY)
99
+ return 'tty';
100
+ try {
101
+ const stat = fstatSync(fd);
102
+ return stat.isFIFO() || stat.isSocket() ? 'pipe' : 'other';
103
+ }
104
+ catch {
105
+ // Unknown stdin: treat it as a client pipe so the #513 guard stays on.
106
+ return 'pipe';
107
+ }
108
+ }
109
+ /** Decide how the server should treat stdin EOF. Pure: no side effects. */
110
+ export function resolveStdinGuardMode(env, stdinKind) {
111
+ const requested = isDaemonModeRequested(env);
112
+ if (stdinKind === 'tty')
113
+ return { mode: 'tty' };
114
+ if (!requested)
115
+ return { mode: 'stdio' };
116
+ if (stdinKind === 'pipe') {
117
+ return {
118
+ mode: 'stdio',
119
+ warning: `[AQE] WARN ${DAEMON_MODE_ENV} ignored: stdin is a pipe (an MCP client is attached), ` +
120
+ 'so the server still shuts down when stdin closes\n',
121
+ };
122
+ }
123
+ return { mode: 'daemon' };
124
+ }
125
+ /**
126
+ * Keep a daemon-mode server alive and log one heartbeat line per interval.
127
+ * The timer is deliberately ref'd: nothing else holds the event loop open in
128
+ * daemon mode. `beforeBeat` runs just before each line (log rotation, #1207);
129
+ * an error it throws is ignored. Returns a function that stops it.
130
+ */
131
+ export function startDaemonHeartbeat(log, getStatus, intervalMs = DEFAULT_DAEMON_HEARTBEAT_MS, beforeBeat) {
132
+ const startedAt = Date.now();
133
+ const timer = setInterval(() => {
134
+ try {
135
+ beforeBeat?.();
136
+ }
137
+ catch { /* never let rotation stop the heartbeat */ }
138
+ const uptimeS = Math.round((Date.now() - startedAt) / 1000);
139
+ let status;
140
+ try {
141
+ status = getStatus();
142
+ }
143
+ catch {
144
+ status = undefined;
145
+ }
146
+ const workers = status
147
+ ? `${status.totalWorkers} workers (${status.errorWorkers} in error), ` +
148
+ `${status.totalExecutions} runs (${status.failedExecutions} failed)`
149
+ : 'workers unavailable';
150
+ log(`[AQE] Daemon heartbeat: pid ${process.pid}, up ${uptimeS}s, ${workers}\n`);
151
+ }, intervalMs);
152
+ return () => clearInterval(timer);
153
+ }
154
+ /** Copy `src` to a fresh `dest`; neither path may be a symlink. */
155
+ function copyNoFollow(src, dest, srcIno) {
156
+ const nofollow = constants.O_NOFOLLOW ?? 0;
157
+ const input = openSync(src, constants.O_RDONLY | nofollow);
158
+ let output;
159
+ try {
160
+ if (fstatSync(input).ino !== srcIno)
161
+ throw new Error('daemon.log changed while rotating');
162
+ try {
163
+ unlinkSync(dest);
164
+ }
165
+ catch { /* absent */ }
166
+ // O_EXCL: fails on anything already there, a symlink included.
167
+ output = openSync(dest, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | nofollow, 0o644);
168
+ const buffer = Buffer.allocUnsafe(64 * 1024);
169
+ let read;
170
+ while ((read = readSync(input, buffer, 0, buffer.length, null)) > 0) {
171
+ writeSync(output, buffer, 0, read);
172
+ }
173
+ }
174
+ finally {
175
+ if (output !== undefined)
176
+ closeSync(output);
177
+ closeSync(input);
178
+ }
179
+ }
180
+ /**
181
+ * Keep daemon.log under `maxBytes` (#1207). When it is over the cap, copy it
182
+ * to `<logPath>.1` (replacing the previous one) and truncate it in place
183
+ * through the server's own descriptor, which start-daemon.cjs opened with
184
+ * O_APPEND, so later writes start again at offset 0 of the same file.
185
+ *
186
+ * Acts only when `logPath` is a regular file (not a symlink, #970) and is the
187
+ * very file one of `fds` (stdout/stderr) writes to, matched by device and
188
+ * inode, so it never truncates a file the server does not own. If the copy
189
+ * fails the log is still truncated, to keep disk use bounded. Lines written
190
+ * between the copy and the truncate are lost; the window is one copy long.
191
+ */
192
+ export function rotateDaemonLog(logPath, maxBytes, fds = [1, 2]) {
193
+ if (maxBytes <= 0)
194
+ return { rotated: false, reason: 'disabled' };
195
+ try {
196
+ const stat = lstatSync(logPath);
197
+ if (!stat.isFile())
198
+ return { rotated: false, reason: 'not-a-regular-file' };
199
+ const fd = fds.find((candidate) => {
200
+ try {
201
+ const own = fstatSync(candidate);
202
+ return own.dev === stat.dev && own.ino === stat.ino;
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ });
208
+ if (fd === undefined)
209
+ return { rotated: false, reason: 'not-our-log' };
210
+ if (stat.size <= maxBytes)
211
+ return { rotated: false, reason: 'under-cap' };
212
+ const tmp = `${logPath}.1.${process.pid}.tmp`;
213
+ let copyError;
214
+ try {
215
+ copyNoFollow(logPath, tmp, stat.ino);
216
+ renameSync(tmp, `${logPath}.1`); // replaces the old one, never follows it
217
+ }
218
+ catch (error) {
219
+ copyError = error instanceof Error ? error.message : String(error);
220
+ try {
221
+ unlinkSync(tmp);
222
+ }
223
+ catch { /* absent */ }
224
+ }
225
+ ftruncateSync(fd, 0);
226
+ return copyError === undefined
227
+ ? { rotated: true, bytes: stat.size, kept: true }
228
+ : { rotated: true, bytes: stat.size, kept: false, error: copyError };
229
+ }
230
+ catch (error) {
231
+ return { rotated: false, reason: 'error', error: error instanceof Error ? error.message : String(error) };
232
+ }
233
+ }
234
+ /**
235
+ * The heartbeat hook that keeps daemon.log under `maxBytes` (#1207), logging a
236
+ * line into the fresh log after each rotation and a warning the first time a
237
+ * check fails. Returns undefined when there is nothing to rotate.
238
+ */
239
+ export function createDaemonLogRotator(logPath, maxBytes, log) {
240
+ if (!logPath || maxBytes <= 0)
241
+ return undefined;
242
+ let warned = false;
243
+ return () => {
244
+ const result = rotateDaemonLog(logPath, maxBytes);
245
+ if (result.rotated) {
246
+ log(result.kept
247
+ ? `[AQE] daemon.log rotated: ${result.bytes} bytes moved to daemon.log.1 (cap ${maxBytes})\n`
248
+ : `[AQE] WARN daemon.log truncated at ${result.bytes} bytes (cap ${maxBytes}); ` +
249
+ `could not keep daemon.log.1: ${result.error}\n`);
250
+ }
251
+ else if (result.reason === 'error' && !warned) {
252
+ warned = true;
253
+ log(`[AQE] WARN daemon.log size check failed: ${result.error}\n`);
254
+ }
255
+ };
256
+ }
257
+ //# sourceMappingURL=daemon-mode.js.map
@@ -12,6 +12,10 @@
12
12
  * Environment Variables:
13
13
  * AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
14
14
  * AQE_VERBOSE: Enable verbose logging
15
+ * AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
16
+ * server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
17
+ * AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
18
+ * heartbeat interval and daemon.log size cap (#1207).
15
19
  */
16
20
  export {};
17
21
  //# sourceMappingURL=entry.d.ts.map
package/dist/mcp/entry.js CHANGED
@@ -12,6 +12,10 @@
12
12
  * Environment Variables:
13
13
  * AQE_HTTP_PORT: Port for HTTP server (0 = disabled, default: 0)
14
14
  * AQE_VERBOSE: Enable verbose logging
15
+ * AQE_MCP_DAEMON: 1 = daemon mode (#1158): stdin EOF does not shut the
16
+ * server down; only honoured when stdin is not a pipe. See daemon-mode.ts.
17
+ * AQE_DAEMON_HEARTBEAT_SECONDS / AQE_DAEMON_LOG_MAX_SIZE: daemon mode only,
18
+ * heartbeat interval and daemon.log size cap (#1207).
15
19
  */
16
20
  import { quickStart } from './protocol-server.js';
17
21
  import { createHTTPServer } from './http-server.js';
@@ -25,7 +29,8 @@ import { initFeatureFlagsFromEnv } from '../integrations/ruvector/feature-flags.
25
29
  import { resetSharedRvfAdapter } from '../integrations/ruvector/shared-rvf-adapter.js';
26
30
  import { resetSharedRvfDualWriter } from '../integrations/ruvector/shared-rvf-dual-writer.js';
27
31
  import { claimProcessLifecycle, closeRegisteredStores } from '../kernel/process-lifecycle.js';
28
- import { startBackgroundWorkers } from './background-workers.js';
32
+ import { getBackgroundWorkersState, startBackgroundWorkers } from './background-workers.js';
33
+ import { DAEMON_HEARTBEAT_ENV, DAEMON_LOG_MAX_SIZE_ENV, DAEMON_LOG_PATH_ENV, DAEMON_MODE_ENV, createDaemonLogRotator, detectStdinKind, parseDaemonHeartbeatMs, parseDaemonLogMaxBytes, resolveStdinGuardMode, startDaemonHeartbeat, } from './daemon-mode.js';
29
34
  import { readFileSync } from 'node:fs';
30
35
  import { resolve, dirname } from 'node:path';
31
36
  import { fileURLToPath } from 'node:url';
@@ -95,11 +100,15 @@ async function main() {
95
100
  // resolved, which is why `kill <pid>` appeared to be "ignored" and only
96
101
  // `kill -9` worked.
97
102
  let shuttingDown = false;
103
+ let stopDaemonHeartbeat = null;
104
+ let daemonStatus = null;
105
+ const daemonWarnings = [];
98
106
  const shutdown = async (reason) => {
99
107
  if (shuttingDown)
100
108
  return;
101
109
  shuttingDown = true;
102
110
  originalStderrWrite(`[AQE] Shutting down (${reason})\n`);
111
+ stopDaemonHeartbeat?.();
103
112
  const watchdog = setTimeout(() => {
104
113
  originalStderrWrite('[AQE] Shutdown watchdog fired — forcing exit\n');
105
114
  process.exit(0);
@@ -139,10 +148,29 @@ async function main() {
139
148
  // reaches EOF. An orphaned stdio MCP server has no parent to serve, so exit
140
149
  // instead of lingering at high CPU. Guarded to a piped stdin so an
141
150
  // interactive TTY debug session (Ctrl-D) is unaffected.
142
- if (!process.stdin.isTTY) {
151
+ // #1158: start-daemon.cjs runs the server with no stdin and AQE_MCP_DAEMON=1;
152
+ // that daemon mode skips this guard (only when stdin is not a client pipe).
153
+ const stdinGuard = resolveStdinGuardMode(process.env, detectStdinKind(process.stdin));
154
+ const daemonLogPath = process.env[DAEMON_LOG_PATH_ENV];
155
+ delete process.env[DAEMON_MODE_ENV]; // never inherited by processes we spawn
156
+ delete process.env[DAEMON_LOG_PATH_ENV];
157
+ if (stdinGuard.mode === 'stdio') {
143
158
  process.stdin.on('end', () => { void shutdown('stdin-eof'); });
144
159
  process.stdin.on('close', () => { void shutdown('stdin-close'); });
145
160
  }
161
+ else if (stdinGuard.mode === 'daemon') {
162
+ // Worker timers are unref'd (#513), so a daemon with no stdin needs its
163
+ // own ref'd timer to stay up, from the start of boot; it also logs
164
+ // liveness to daemon.log.
165
+ // #1207: each heartbeat also keeps daemon.log under its size cap.
166
+ const heartbeat = parseDaemonHeartbeatMs(process.env[DAEMON_HEARTBEAT_ENV]);
167
+ const logCap = parseDaemonLogMaxBytes(process.env[DAEMON_LOG_MAX_SIZE_ENV]);
168
+ for (const parsed of [heartbeat, logCap])
169
+ if (parsed.warning)
170
+ daemonWarnings.push(parsed.warning);
171
+ const log = (message) => { originalStderrWrite(message); }; // declared further down
172
+ stopDaemonHeartbeat = startDaemonHeartbeat(log, () => daemonStatus?.(), heartbeat.value, createDaemonLogRotator(daemonLogPath, logCap.value, log));
173
+ }
146
174
  // Catch unhandled exceptions/rejections to prevent MCP connection drops
147
175
  process.on('uncaughtException', (error) => {
148
176
  process.stderr.write(`[AQE] FATAL uncaught exception: ${error.message}\n`);
@@ -334,6 +362,26 @@ async function main() {
334
362
  // IMP-10: Start background workers (heartbeat scheduler, etc.) and the
335
363
  // QualityDaemon. #1061: AQE_WORKERS_ENABLED=false skips both.
336
364
  await startBackgroundWorkers(originalStderrWrite);
365
+ if (stdinGuard.warning)
366
+ originalStderrWrite(stdinGuard.warning);
367
+ for (const warning of daemonWarnings)
368
+ originalStderrWrite(warning);
369
+ if (stdinGuard.mode === 'daemon') {
370
+ if (getBackgroundWorkersState().state !== 'disabled') {
371
+ const { getDaemon } = await import('../workers/daemon.js');
372
+ daemonStatus = () => {
373
+ const health = getDaemon().getStatus().workerManager;
374
+ const workers = Object.values(health.workers);
375
+ return {
376
+ totalWorkers: health.totalWorkers,
377
+ errorWorkers: health.errorWorkers,
378
+ totalExecutions: workers.reduce((sum, w) => sum + w.totalExecutions, 0),
379
+ failedExecutions: workers.reduce((sum, w) => sum + w.failedExecutions, 0),
380
+ };
381
+ };
382
+ }
383
+ originalStderrWrite(`[AQE] Daemon mode (${DAEMON_MODE_ENV}): stdin EOF ignored; stop with SIGTERM (stop-daemon.cjs)\n`);
384
+ }
337
385
  // Start HTTP server for AG-UI/A2A/A2UI if port is specified
338
386
  const httpPort = parseInt(process.env.AQE_HTTP_PORT || '0', 10);
339
387
  if (httpPort > 0) {
@@ -455,6 +455,11 @@ export const coverageAnalyzeConfig = {
455
455
  ...(data.runStatus === 'passed' || data.runStatus === 'failed' ? { runStatus: data.runStatus } : {}),
456
456
  // #995: the target has no measurement at all — distinct from a measured 0%.
457
457
  ...(data.unmeasured === true ? { unmeasured: true } : {}),
458
+ // #1154: target files the report does not cover, and a stale report.
459
+ ...(data.evidenceStatus === 'complete' || data.evidenceStatus === 'insufficient-evidence'
460
+ ? { evidenceStatus: data.evidenceStatus } : {}),
461
+ ...(Array.isArray(data.unmeasuredFiles) ? { unmeasuredFiles: data.unmeasuredFiles } : {}),
462
+ ...(data.staleReport ? { staleReport: data.staleReport } : {}),
458
463
  ...(data.warning ? { warning: data.warning } : {}),
459
464
  };
460
465
  },
@@ -15,12 +15,17 @@ export interface OrchestrateRequest {
15
15
  filePaths?: string[];
16
16
  }
17
17
  export type OrchestrateRoute =
18
- /** Submit `type` to `domain` with `payload`. */
18
+ /**
19
+ * Submit `type` to `domain` with `payload`. `executionOwner: 'caller'` runs
20
+ * the task through the MCP task executor, as the domain's own tool does,
21
+ * instead of the domain plugin.
22
+ */
19
23
  {
20
24
  kind: 'route';
21
25
  type: string;
22
26
  domain: DomainName;
23
27
  payload: Record<string, unknown>;
28
+ executionOwner?: 'caller';
24
29
  }
25
30
  /** The request lacks what the handler needs; `error` says what to supply. */
26
31
  | {
@@ -8,8 +8,11 @@
8
8
  * supplied, or is refused with the input it needs. A payload is never filled
9
9
  * with values the request did not contain.
10
10
  */
11
+ import { existsSync } from 'node:fs';
12
+ import { resolve } from 'node:path';
11
13
  import { findProjectRoot } from '../../kernel/project-root.js';
12
14
  import { confineIndexPaths } from '../../domains/code-intelligence/index-path-guard.js';
15
+ import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
13
16
  const needs = (type, what) => ({
14
17
  kind: 'needs-input',
15
18
  error: `task_orchestrate inferred '${type}' from the description, but ${what}`,
@@ -26,6 +29,52 @@ async function projectFiles(type, filePaths) {
26
29
  }
27
30
  return { files: accepted };
28
31
  }
32
+ /** Source and report extensions that mark a bare word in a description as a file. */
33
+ const PATH_EXTENSION = /\.(?:[cm]?[jt]sx?|py|go|rs|java|kt|cs|rb|php|swift|info|lcov|json|xml)$/i;
34
+ /** Words after which a description names what to measure ("coverage for src"). */
35
+ const TARGET_PREPOSITION = /^(?:for|of|in|under|on)$/i;
36
+ /**
37
+ * The paths a description names: words with a path separator or a source /
38
+ * report extension, else a word after "for/of/in/under/on" that exists
39
+ * (`analyze coverage for src`). Anything else is prose.
40
+ */
41
+ function pathsInDescription(task) {
42
+ const words = task.split(/\s+/).map(w => w.replace(/^[`'"(]+|[`'",;:!?)]+$|\.$/g, '')).filter(Boolean);
43
+ const pathLike = words.filter(w => !/^https?:/i.test(w) && (/[\\/]/.test(w) || PATH_EXTENSION.test(w)));
44
+ if (pathLike.length > 0)
45
+ return [...new Set(pathLike)];
46
+ // Resolved as the coverage handler resolves its target: from the cwd.
47
+ const named = words.filter((w, i) => i > 0 && TARGET_PREPOSITION.test(words[i - 1]) &&
48
+ /^[\w.-]+$/.test(w) && existsSync(resolve(w)));
49
+ return [...new Set(named)];
50
+ }
51
+ /**
52
+ * #1200: the one target an orchestrated coverage task measures — the single
53
+ * filePath, else the one path the description names, else '.' (the default
54
+ * of coverage_analyze_sublinear).
55
+ * The task then runs the handler coverage_analyze_sublinear runs, so it
56
+ * resolves the target, reads the report and judges its evidence the same way.
57
+ */
58
+ async function coverageRoute(request) {
59
+ const type = 'analyze-coverage';
60
+ const given = request.filePaths ?? [];
61
+ const candidates = given.length > 0 ? given : pathsInDescription(request.task);
62
+ if (candidates.length > 1) {
63
+ return needs(type, `coverage is analyzed for one target, and ${given.length > 0 ? 'filePaths' : 'the description'} ` +
64
+ `names ${candidates.length} (${candidates.join(', ')}). Pass one file or directory, or use ` +
65
+ 'coverage_analyze_sublinear with a target.');
66
+ }
67
+ const target = candidates[0] ?? '.';
68
+ if (target !== '.') {
69
+ const confined = await requirePayloadPath(type, 'target', target, { allowDirectory: true, allowMissing: true });
70
+ if (!confined.success)
71
+ return needs(type, `the ${confined.error.message.replace(/^Invalid [\w-]+ payload: /, '')}`);
72
+ }
73
+ return {
74
+ kind: 'route', type, domain: 'coverage-analysis', executionOwner: 'caller',
75
+ payload: { target, detectGaps: true },
76
+ };
77
+ }
29
78
  /** Decide how task_orchestrate runs an inferred task type. */
30
79
  export async function routeInferredTask(type, request) {
31
80
  const filePaths = request.filePaths ?? [];
@@ -59,6 +108,10 @@ export async function routeInferredTask(type, request) {
59
108
  return confined;
60
109
  return { kind: 'route', type: 'analyze-quality', domain: 'quality-assessment', payload: { sourceFiles: confined.files } };
61
110
  }
111
+ case 'analyze-coverage':
112
+ // #1200: the domain plugin's handler needs coverageData, which a
113
+ // description never carries; the coverage tool's handler finds it.
114
+ return coverageRoute(request);
62
115
  case 'test-accessibility':
63
116
  // run-accessibility-audit falls back to URL-pattern heuristics when no
64
117
  // browser is available, which reports violations nobody measured.
@@ -8,7 +8,9 @@
8
8
  import { ToolResult, TaskSubmitParams, TaskSubmitResult, TaskListParams, TaskStatusParams, TaskStatusResult, TaskCancelParams } from '../types';
9
9
  import { TaskType } from '../../coordination/queen-coordinator';
10
10
  import { type RoutingLogEntry, type RoutingStats } from '../services/task-router';
11
+ import type { ExperienceGuidanceStatus } from '../../integrations/agentic-flow/reasoning-bank/index.js';
11
12
  import type { ModelTier } from '../../integrations/agentic-flow';
13
+ import { type Priority } from '../../shared/types/index.js';
12
14
  export declare function handleTaskSubmit(params: TaskSubmitParams): Promise<ToolResult<TaskSubmitResult>>;
13
15
  export declare function handleTaskList(params: TaskListParams): Promise<ToolResult<TaskStatusResult[]>>;
14
16
  export declare function handleTaskStatus(params: TaskStatusParams): Promise<ToolResult<TaskStatusResult>>;
@@ -20,7 +22,8 @@ export declare function handleTaskCancel(params: TaskCancelParams): Promise<Tool
20
22
  export interface TaskOrchestrateParams {
21
23
  task: string;
22
24
  strategy?: 'parallel' | 'sequential' | 'adaptive';
23
- priority?: 'low' | 'medium' | 'high' | 'critical';
25
+ /** Named levels, or a canonical p0-p3 priority (p0 stays p0). */
26
+ priority?: 'low' | 'medium' | 'high' | 'critical' | Priority;
24
27
  maxAgents?: number;
25
28
  /** Manual tier override (0-4) */
26
29
  manualTier?: ModelTier;
@@ -38,13 +41,19 @@ export interface TaskOrchestrateParams {
38
41
  /**
39
42
  * #1022: how learned patterns informed task_orchestrate.
40
43
  * - 'vector': embedding similarity plus text matching
41
- * - 'lexical-only': no embedding runtime; text matching only, no similarity
44
+ * - 'lexical-only': no working embedder (absent, or failed at runtime, #1187);
45
+ * text matching only, no similarity
42
46
  * scores, and experience guidance unavailable
43
47
  * - 'unavailable': the ReasoningBank could not start; no learned guidance
48
+ *
49
+ * #1204: `experienceGuidance` says the same for similar-experience guidance:
50
+ * 'unavailable' (with the reason) when its embedder failed or is absent.
51
+ * Omitted when experience replay is disabled or the ReasoningBank is down.
44
52
  */
45
53
  export interface OrchestrateLearningStatus {
46
54
  patternSearch: 'vector' | 'lexical-only' | 'unavailable';
47
55
  reason?: string;
56
+ experienceGuidance?: ExperienceGuidanceStatus;
48
57
  }
49
58
  export interface TaskOrchestrateResult {
50
59
  taskId: string;