agentic-qe 3.15.11 → 3.15.13

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 (522) hide show
  1. package/.claude/hooks/aqe-hook.cjs +38 -2
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +267 -0
  4. package/assets/skills/skills-manifest.json +1 -1
  5. package/dist/cli/bundle.js +6 -6
  6. package/dist/cli/chunks/adapter-KCQDVYY2.js +2 -0
  7. package/dist/cli/chunks/{agent-booster-wasm-TIDSQ3ZK.js → agent-booster-wasm-6RRQWMNE.js} +2 -2
  8. package/dist/cli/chunks/{agent-handler-G3EPBVA7.js → agent-handler-AOH6TV7W.js} +2 -2
  9. package/dist/cli/chunks/{agent-memory-branch-ARC5C7GW.js → agent-memory-branch-2P54SF5N.js} +2 -2
  10. package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +2 -0
  11. package/dist/cli/chunks/{arena-K4I4QDXB.js → arena-NSVFCAF5.js} +2 -2
  12. package/dist/cli/chunks/{arena-36DTATJV.js → arena-X6MOGQHA.js} +4 -4
  13. package/dist/cli/chunks/{audit-WQSJSJZF.js → audit-27DJLQNM.js} +3 -3
  14. package/dist/cli/chunks/base-WCACU3FN.js +2 -0
  15. package/dist/cli/chunks/{better-sqlite3-BB4K67MT.js → better-sqlite3-BU5GXILS.js} +2 -2
  16. package/dist/cli/chunks/{brain-handler-CU3GOIU3.js → brain-handler-GTQNHHZS.js} +3 -3
  17. package/dist/cli/chunks/{branch-enumerator-NJQX7ZNB.js → branch-enumerator-5CLULOCU.js} +2 -2
  18. package/dist/cli/chunks/{browser-6YJF4FQW.js → browser-R4DMU3LN.js} +2 -2
  19. package/dist/cli/chunks/browser-workflow-G6IASEAP.js +2 -0
  20. package/dist/cli/chunks/{chunk-G4FAPO57.js → chunk-2G7TVT6W.js} +2 -2
  21. package/dist/cli/chunks/{chunk-HDNWSKHA.js → chunk-32ZMWEP3.js} +2 -2
  22. package/dist/cli/chunks/{chunk-FWSGPE3V.js → chunk-3AN5TNGD.js} +3 -3
  23. package/dist/cli/chunks/{chunk-X4J73KP3.js → chunk-3LJ7LQMV.js} +1 -1
  24. package/dist/cli/chunks/{chunk-3RHOPP7A.js → chunk-3QZEGE67.js} +1 -1
  25. package/dist/cli/chunks/{chunk-RBZCA7SD.js → chunk-3RZV5DGO.js} +2 -2
  26. package/dist/cli/chunks/{chunk-DDEOZPWJ.js → chunk-3Y2ROSCL.js} +2 -2
  27. package/dist/cli/chunks/{chunk-LD5CFK53.js → chunk-3Y7TJFHU.js} +2 -2
  28. package/dist/cli/chunks/{chunk-I36CRDHF.js → chunk-3YNLWPBF.js} +2 -2
  29. package/dist/cli/chunks/{chunk-ZMC543GI.js → chunk-42J34YG4.js} +2 -2
  30. package/dist/cli/chunks/{chunk-YNOCQ2SL.js → chunk-4OVC4RIL.js} +1 -1
  31. package/dist/cli/chunks/{chunk-2KFFEKSI.js → chunk-526QYFJU.js} +2 -2
  32. package/dist/cli/chunks/{chunk-LBX7M4LW.js → chunk-5FKWCZNF.js} +2 -2
  33. package/dist/cli/chunks/{chunk-OH5V5EJW.js → chunk-5K26BEYB.js} +2 -2
  34. package/dist/cli/chunks/{chunk-TCYSBC7Y.js → chunk-5MDERQH3.js} +1 -1
  35. package/dist/cli/chunks/{chunk-V5AADCBC.js → chunk-5VMAV6T6.js} +1 -1
  36. package/dist/cli/chunks/{chunk-YBBT3YYG.js → chunk-5ZGM3RMH.js} +1 -1
  37. package/dist/cli/chunks/{chunk-RTY7VSZB.js → chunk-6KATY3KS.js} +2 -2
  38. package/dist/cli/chunks/{chunk-LPU6PAJE.js → chunk-6Z7PRBSG.js} +2 -2
  39. package/dist/cli/chunks/{chunk-6NA3KZZT.js → chunk-72ASBE35.js} +7 -7
  40. package/dist/cli/chunks/{chunk-GBFUANTC.js → chunk-756CGMEH.js} +1 -1
  41. package/dist/cli/chunks/{chunk-UTTSH4NH.js → chunk-75RDHBAX.js} +3 -3
  42. package/dist/cli/chunks/{chunk-XGPTZUKQ.js → chunk-7CMTY45A.js} +2 -2
  43. package/dist/cli/chunks/{chunk-NC6K7SCQ.js → chunk-7JUC2MVZ.js} +2 -2
  44. package/dist/cli/chunks/{chunk-RTFKTKSO.js → chunk-7NA7JXNB.js} +2 -2
  45. package/dist/cli/chunks/{chunk-GWJWSLDA.js → chunk-7PLIEBY7.js} +2 -2
  46. package/dist/cli/chunks/{chunk-OURITHFV.js → chunk-7YTGHGK4.js} +2 -2
  47. package/dist/cli/chunks/{chunk-ITL3IN2E.js → chunk-A64JFBWI.js} +2 -2
  48. package/dist/cli/chunks/{chunk-OHR7C777.js → chunk-AL6FBH3E.js} +2 -2
  49. package/dist/cli/chunks/{chunk-5N25I53C.js → chunk-AQSVJNEH.js} +2 -2
  50. package/dist/cli/chunks/{chunk-FL32MTKT.js → chunk-ARJW4I2O.js} +2 -2
  51. package/dist/cli/chunks/{chunk-ZQHDA4O7.js → chunk-ASQYASNV.js} +1 -1
  52. package/dist/cli/chunks/{chunk-4HJKQIX5.js → chunk-BEGR4D6N.js} +2 -2
  53. package/dist/cli/chunks/{chunk-G77MLBDF.js → chunk-BK577VL7.js} +2 -2
  54. package/dist/cli/chunks/{chunk-NPZOBSAN.js → chunk-BLSLEVDI.js} +2 -2
  55. package/dist/cli/chunks/{chunk-R5LGV6GZ.js → chunk-BTVEYBW2.js} +2 -2
  56. package/dist/cli/chunks/{chunk-2CW7VRPH.js → chunk-C6JTLKG7.js} +5 -5
  57. package/dist/cli/chunks/{chunk-EWPUQCN4.js → chunk-C7JM7CD3.js} +2 -2
  58. package/dist/cli/chunks/{chunk-325QCVDI.js → chunk-CCMKSHAT.js} +2 -2
  59. package/dist/cli/chunks/{chunk-V7DA4HAK.js → chunk-CE7B5LU7.js} +1 -1
  60. package/dist/cli/chunks/{chunk-4RAQ7PJA.js → chunk-CM4LSLKR.js} +2 -2
  61. package/dist/cli/chunks/chunk-CRWPZT74.js +62 -0
  62. package/dist/cli/chunks/{chunk-U3LJNNVJ.js → chunk-CT6SAVXQ.js} +2 -2
  63. package/dist/cli/chunks/chunk-CV77DMDQ.js +2 -0
  64. package/dist/cli/chunks/{chunk-UMVSWQNB.js → chunk-DFUASIKA.js} +2 -2
  65. package/dist/cli/chunks/{chunk-KSE5TDM5.js → chunk-DLD7RUZ4.js} +2 -2
  66. package/dist/cli/chunks/{chunk-4MUBW4RT.js → chunk-DNDL7SOS.js} +2 -2
  67. package/dist/cli/chunks/{chunk-EJPK7OTR.js → chunk-DVGRPK7A.js} +2 -2
  68. package/dist/cli/chunks/{chunk-WCVCOT4E.js → chunk-E56B6IDX.js} +2 -2
  69. package/dist/cli/chunks/{chunk-7HEMJHPP.js → chunk-E7CLYGS7.js} +1 -1
  70. package/dist/cli/chunks/{chunk-R5GRABPQ.js → chunk-EXGMJFAT.js} +1 -1
  71. package/dist/cli/chunks/chunk-F3YS57NF.js +21 -0
  72. package/dist/cli/chunks/{chunk-I4K2HTQU.js → chunk-FZ76G4QJ.js} +1 -1
  73. package/dist/cli/chunks/{chunk-4UX35V7P.js → chunk-G2Q66Z23.js} +2 -2
  74. package/dist/cli/chunks/{chunk-KJCIMNHS.js → chunk-G6WDYBLQ.js} +1 -1
  75. package/dist/cli/chunks/{chunk-VWUZSNVC.js → chunk-G77ERMUD.js} +1 -1
  76. package/dist/cli/chunks/{chunk-FZHSG75I.js → chunk-GB6HBNH2.js} +2 -2
  77. package/dist/cli/chunks/{chunk-KDI5JOYZ.js → chunk-GHM6MQNK.js} +2 -2
  78. package/dist/cli/chunks/{chunk-H7BLYMNU.js → chunk-GHY6Z6KO.js} +5 -5
  79. package/dist/cli/chunks/{chunk-TFW7CCKS.js → chunk-GII6UM3F.js} +1 -1
  80. package/dist/cli/chunks/{chunk-DOBZPSKE.js → chunk-GU5HNCWI.js} +1 -1
  81. package/dist/cli/chunks/{chunk-AFFN6E6Q.js → chunk-H4GG2NLO.js} +2 -2
  82. package/dist/cli/chunks/{chunk-7R5HC56U.js → chunk-H4H2YSFH.js} +1 -1
  83. package/dist/cli/chunks/{chunk-J4JMCZVA.js → chunk-HD7YIFOI.js} +2 -2
  84. package/dist/cli/chunks/{chunk-5MTWCCZJ.js → chunk-HOAJUIBQ.js} +2 -2
  85. package/dist/cli/chunks/{chunk-T5KHJ3J7.js → chunk-HQZGPJYG.js} +2 -2
  86. package/dist/cli/chunks/{chunk-VEEYL2CZ.js → chunk-HZ5NXFXH.js} +2 -2
  87. package/dist/cli/chunks/{chunk-LQ4NUC6Q.js → chunk-I3C7JOXC.js} +2 -2
  88. package/dist/cli/chunks/{chunk-Z2EA7A4Z.js → chunk-IC3TQEOA.js} +1 -1
  89. package/dist/cli/chunks/{chunk-E44NNCEU.js → chunk-IJUHSJ2U.js} +2 -2
  90. package/dist/cli/chunks/{chunk-EH2S6AOR.js → chunk-J2ZIFFM6.js} +2 -2
  91. package/dist/cli/chunks/{chunk-GVKVJJQX.js → chunk-JGZ722G3.js} +2 -2
  92. package/dist/cli/chunks/{chunk-EK5GMOSO.js → chunk-JQGMW45H.js} +1 -1
  93. package/dist/cli/chunks/{chunk-XGBU3KEM.js → chunk-JRRXCODW.js} +2 -2
  94. package/dist/cli/chunks/{chunk-5WYZHDIZ.js → chunk-K3TLLJMX.js} +1 -1
  95. package/dist/cli/chunks/{chunk-LXQ3B4RY.js → chunk-K4CZA77U.js} +2 -2
  96. package/dist/cli/chunks/chunk-K65CGKLD.js +8 -0
  97. package/dist/cli/chunks/{chunk-HFFPYC4G.js → chunk-KADFXPPN.js} +2 -2
  98. package/dist/cli/chunks/{chunk-APPZATXA.js → chunk-KB56CPU4.js} +2 -2
  99. package/dist/cli/chunks/{chunk-25P77WA5.js → chunk-KCW47QR5.js} +1 -1
  100. package/dist/cli/chunks/{chunk-WM3SRRA6.js → chunk-KDNJ4F3P.js} +2 -2
  101. package/dist/cli/chunks/{chunk-5ERFHEEE.js → chunk-KDVZND5Q.js} +1 -1
  102. package/dist/cli/chunks/{chunk-YOCULVHR.js → chunk-KUAKV3IW.js} +1 -1
  103. package/dist/cli/chunks/{chunk-M5XYIQYZ.js → chunk-KV4T4MXK.js} +2 -2
  104. package/dist/cli/chunks/{chunk-MIK4RBEH.js → chunk-KWYH3FI4.js} +1 -1
  105. package/dist/cli/chunks/{chunk-UKKYMW3S.js → chunk-LFJALJOA.js} +2 -2
  106. package/dist/cli/chunks/{chunk-K7V2WZNF.js → chunk-LL7LDPXS.js} +1 -1
  107. package/dist/cli/chunks/{chunk-55CH76ZO.js → chunk-LUZNKJE6.js} +3 -3
  108. package/dist/cli/chunks/{chunk-OV5RPLKV.js → chunk-LWR3FV3Y.js} +2 -2
  109. package/dist/cli/chunks/{chunk-SMVVAVN2.js → chunk-LZYQHVD4.js} +2 -2
  110. package/dist/cli/chunks/{chunk-672XOJDG.js → chunk-M6AAGIG7.js} +1 -1
  111. package/dist/cli/chunks/{chunk-WCAVIJ64.js → chunk-MAMQA43L.js} +1 -1
  112. package/dist/cli/chunks/chunk-MB46UBGY.js +3 -0
  113. package/dist/cli/chunks/{chunk-AP3ADWDK.js → chunk-MFW5HSG4.js} +2 -2
  114. package/dist/cli/chunks/{chunk-NKTWKYHB.js → chunk-MGZ5FJUW.js} +2 -2
  115. package/dist/cli/chunks/{chunk-ERN43HOX.js → chunk-MVVB7C2E.js} +410 -410
  116. package/dist/cli/chunks/{chunk-57LNKSW7.js → chunk-N4CYAKOX.js} +2 -2
  117. package/dist/cli/chunks/chunk-NT4DBXSX.js +2 -0
  118. package/dist/cli/chunks/{chunk-BZPE3LDO.js → chunk-NU3W5WFT.js} +2 -2
  119. package/dist/cli/chunks/chunk-NURIILUB.js +2 -0
  120. package/dist/cli/chunks/{chunk-ITPGWGQS.js → chunk-NW7IBHJA.js} +4 -4
  121. package/dist/cli/chunks/{chunk-OD5D4LSZ.js → chunk-NZ3GUMB2.js} +2 -2
  122. package/dist/cli/chunks/{chunk-35M2X3C5.js → chunk-NZD4DPSU.js} +2 -2
  123. package/dist/cli/chunks/{chunk-EIDJNT5C.js → chunk-O6FGXMHD.js} +1 -1
  124. package/dist/cli/chunks/{chunk-OYJC3YON.js → chunk-OCAEXYFA.js} +2 -2
  125. package/dist/cli/chunks/{chunk-Y7B5EUIJ.js → chunk-OFACHK5O.js} +2 -2
  126. package/dist/cli/chunks/{chunk-5MNASJOH.js → chunk-P7A4NKTZ.js} +2 -2
  127. package/dist/cli/chunks/{chunk-M7XFBSIK.js → chunk-PB6J6HAA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-5HQP4SLM.js → chunk-PHP5UBT4.js} +2 -2
  129. package/dist/cli/chunks/{chunk-KXS3Y2AX.js → chunk-PIDQVU3L.js} +2 -2
  130. package/dist/cli/chunks/{chunk-4UBVAJFO.js → chunk-PSFSPGUD.js} +2 -2
  131. package/dist/cli/chunks/chunk-PT4FMJPQ.js +3 -0
  132. package/dist/cli/chunks/{chunk-HDJUYAZG.js → chunk-Q3UDLV5Z.js} +1 -1
  133. package/dist/cli/chunks/{chunk-CIAL4YRY.js → chunk-QDEJ4CI2.js} +2 -2
  134. package/dist/cli/chunks/{chunk-S6IYEBAI.js → chunk-QPNG5ZN2.js} +2 -2
  135. package/dist/cli/chunks/{chunk-YPX2TV3M.js → chunk-R7SYRCRP.js} +1 -1
  136. package/dist/cli/chunks/{chunk-XNLIWQYE.js → chunk-RF7HWBHN.js} +2 -2
  137. package/dist/cli/chunks/{chunk-5YLOLACR.js → chunk-RFNW2LGD.js} +2 -2
  138. package/dist/cli/chunks/{chunk-2VLYUF7U.js → chunk-S5AZCIZS.js} +2 -2
  139. package/dist/cli/chunks/{chunk-ETVAYGCB.js → chunk-SE4VNN4I.js} +3 -3
  140. package/dist/cli/chunks/{chunk-E6PF35JZ.js → chunk-SG3NX7QE.js} +2 -2
  141. package/dist/cli/chunks/{chunk-VYTILW4R.js → chunk-SSU73QAX.js} +2 -2
  142. package/dist/cli/chunks/{chunk-ZP75ASUU.js → chunk-SVLQRAMF.js} +1 -1
  143. package/dist/cli/chunks/{chunk-JGJXXAS6.js → chunk-SYV2V3PL.js} +4 -4
  144. package/dist/cli/chunks/{chunk-4RH5I24Q.js → chunk-T3PGQFDI.js} +2 -2
  145. package/dist/cli/chunks/{chunk-O4JAKWWM.js → chunk-TCBBNUBP.js} +17 -17
  146. package/dist/cli/chunks/{chunk-QDESWOZP.js → chunk-TOQWL2ZF.js} +2 -2
  147. package/dist/cli/chunks/{chunk-NTB342NJ.js → chunk-TSQC2KKZ.js} +4 -4
  148. package/dist/cli/chunks/{chunk-NQZNMCZU.js → chunk-TWDW32W2.js} +2 -2
  149. package/dist/cli/chunks/{chunk-CO3DX2AX.js → chunk-TWJTK4CC.js} +2 -2
  150. package/dist/cli/chunks/{chunk-FUYOOKTH.js → chunk-U2FUXDDJ.js} +3 -3
  151. package/dist/cli/chunks/{chunk-XDI5X3FR.js → chunk-UDQSYWVF.js} +1 -1
  152. package/dist/cli/chunks/chunk-UOC3O6RP.js +5 -0
  153. package/dist/cli/chunks/chunk-UT2VZ33P.js +2 -0
  154. package/dist/cli/chunks/{chunk-IOZRKXR5.js → chunk-UTRV7T2N.js} +2 -2
  155. package/dist/cli/chunks/{chunk-ZMHCMJ4J.js → chunk-UXZSUMEA.js} +2 -2
  156. package/dist/cli/chunks/{chunk-G4CKPWF6.js → chunk-VRHRBAEM.js} +1 -1
  157. package/dist/cli/chunks/{chunk-AUUJBXWX.js → chunk-VRVMIPTM.js} +2 -2
  158. package/dist/cli/chunks/{chunk-IENZSO3K.js → chunk-VTDFVFST.js} +2 -2
  159. package/dist/cli/chunks/{chunk-JFLU7L3W.js → chunk-VTOBUZL6.js} +2 -2
  160. package/dist/cli/chunks/{chunk-KKYO2NKV.js → chunk-VU5TBX2V.js} +2 -2
  161. package/dist/cli/chunks/{chunk-XS2XF3YG.js → chunk-W26B7ERY.js} +1 -1
  162. package/dist/cli/chunks/{chunk-DOFREOPQ.js → chunk-W2QWSQVE.js} +2 -2
  163. package/dist/cli/chunks/{chunk-KSLLHFVY.js → chunk-W3INMZZ6.js} +1 -1
  164. package/dist/cli/chunks/{chunk-FLU5FDSC.js → chunk-W3PPFHI5.js} +59 -59
  165. package/dist/cli/chunks/chunk-WKGTGOYS.js +13 -0
  166. package/dist/cli/chunks/{chunk-4X4MWMHB.js → chunk-WNQS4WTS.js} +2 -2
  167. package/dist/cli/chunks/{chunk-XJKZ7FTR.js → chunk-WO274FRI.js} +2 -2
  168. package/dist/cli/chunks/{chunk-76SNL7GU.js → chunk-WOCGL4QP.js} +2 -2
  169. package/dist/cli/chunks/{chunk-HYXUN7BW.js → chunk-WQL7WCIZ.js} +1 -1
  170. package/dist/cli/chunks/{chunk-BTVWA35P.js → chunk-X2Z7F4EU.js} +2 -2
  171. package/dist/cli/chunks/{chunk-VBK2YAYY.js → chunk-X7N2JF2X.js} +2 -2
  172. package/dist/cli/chunks/{chunk-NT7JRHMH.js → chunk-XEAEYC6Y.js} +1 -1
  173. package/dist/cli/chunks/{chunk-G2IJFNZS.js → chunk-XNBOGCF3.js} +2 -2
  174. package/dist/cli/chunks/{chunk-LCVEEII4.js → chunk-XPRVF4YE.js} +2 -2
  175. package/dist/cli/chunks/{chunk-AMZKAJLJ.js → chunk-YBQH2VOP.js} +2 -2
  176. package/dist/cli/chunks/{chunk-JUMICXM6.js → chunk-YQFLQE53.js} +2 -2
  177. package/dist/cli/chunks/{chunk-M5RQ6U3G.js → chunk-YSZ5OE3Z.js} +2 -2
  178. package/dist/cli/chunks/{chunk-RQMCZQN2.js → chunk-YXRASAPI.js} +2 -2
  179. package/dist/cli/chunks/{chunk-X3PZCXWG.js → chunk-YZEXYO4W.js} +1 -1
  180. package/dist/cli/chunks/{chunk-TL6OFMXF.js → chunk-YZWBNBTW.js} +2 -2
  181. package/dist/cli/chunks/{chunk-CFWGGRE7.js → chunk-ZAKQLAHT.js} +1 -1
  182. package/dist/cli/chunks/ci-ENOASTYB.js +81 -0
  183. package/dist/cli/chunks/{ci-config-J665XNOX.js → ci-config-B26OXHQM.js} +2 -2
  184. package/dist/cli/chunks/{ci-output-PEQQQWVD.js → ci-output-JTCLLNOQ.js} +2 -2
  185. package/dist/cli/chunks/{circuit-breaker-HHB2JSKH.js → circuit-breaker-23JMFNM5.js} +2 -2
  186. package/dist/cli/chunks/{claude-flow-setup-JKUJRWPN.js → claude-flow-setup-ON6L462G.js} +2 -2
  187. package/dist/cli/chunks/client-TV3V2YZ5.js +2 -0
  188. package/dist/cli/chunks/{cline-installer-Y77BWTAN.js → cline-installer-OWQ4D2FQ.js} +2 -2
  189. package/dist/cli/chunks/{code-LV2HAGJY.js → code-2ZRL7SEU.js} +19 -18
  190. package/dist/cli/chunks/{code-index-extractor-4GKKSETB.js → code-index-extractor-JXSQVM67.js} +2 -2
  191. package/dist/cli/chunks/{codex-installer-WMKBYE5Y.js → codex-installer-7LXZYBSQ.js} +2 -2
  192. package/dist/cli/chunks/{completions-SBGFAOIJ.js → completions-C2LR623C.js} +2 -2
  193. package/dist/cli/chunks/{complexity-analyzer-AQHFIJXC.js → complexity-analyzer-TGQLHCYJ.js} +2 -2
  194. package/dist/cli/chunks/{continuedev-installer-26AYFS2E.js → continuedev-installer-RUGD24D2.js} +2 -2
  195. package/dist/cli/chunks/{copilot-installer-4UD3DK55.js → copilot-installer-ZLFVLEJP.js} +2 -2
  196. package/dist/cli/chunks/core-handlers-PZT4OLWR.js +2 -0
  197. package/dist/cli/chunks/{cost-tracker-TP4NZCG4.js → cost-tracker-RT4QL745.js} +2 -2
  198. package/dist/cli/chunks/{coverage-B2KIXHAI.js → coverage-NV3C4IMM.js} +11 -10
  199. package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +2 -0
  200. package/dist/cli/chunks/{cursor-installer-AVZEQZ4W.js → cursor-installer-LJKLNFF6.js} +2 -2
  201. package/dist/cli/chunks/{daemon-XM2A7LQU.js → daemon-BMDXCQT5.js} +3 -3
  202. package/dist/cli/chunks/{daemon-P574WWBW.js → daemon-FBH3IRYN.js} +4 -4
  203. package/dist/cli/chunks/{dag-attention-scheduler-MIWOZ6ET.js → dag-attention-scheduler-JGDED55I.js} +2 -2
  204. package/dist/cli/chunks/{detect-TYR7HT23.js → detect-SZIHIVCJ.js} +2 -2
  205. package/dist/cli/chunks/{dist-node-2DGVQGLS.js → dist-node-FV3KWXQ6.js} +2 -2
  206. package/dist/cli/chunks/{domain-handler-RRA4ZOMF.js → domain-handler-GI5JWQOV.js} +2 -2
  207. package/dist/cli/chunks/{domain-plugins-IVZEZ5RB.js → domain-plugins-BUWY36TL.js} +2 -2
  208. package/dist/cli/chunks/domain-transfer-GCY7W5DA.js +2 -0
  209. package/dist/cli/chunks/dream-TRFBGDSQ.js +2 -0
  210. package/dist/cli/chunks/{embed-and-insert-pattern-VNIEOVPO.js → embed-and-insert-pattern-GPRR3ZGD.js} +2 -2
  211. package/dist/cli/chunks/{eval-QV4LVPUF.js → eval-XPB3IGAP.js} +2 -2
  212. package/dist/cli/chunks/{experience-capture-middleware-DAPKT763.js → experience-capture-middleware-2E554UB3.js} +3 -3
  213. package/dist/cli/chunks/{fast-paths-WVRFPHX7.js → fast-paths-ZSMWZPUC.js} +2 -2
  214. package/dist/cli/chunks/{feature-flags-DEFTUIYT.js → feature-flags-GIWVDVVC.js} +2 -2
  215. package/dist/cli/chunks/{feature-flags-O7ZXDDCD.js → feature-flags-N7EOGE5P.js} +2 -2
  216. package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +2 -0
  217. package/dist/cli/chunks/fleet-HCHDOUCX.js +44 -0
  218. package/dist/cli/chunks/{gnn-wrapper-LS4LZJDR.js → gnn-wrapper-CZNCNXXZ.js} +2 -2
  219. package/dist/cli/chunks/{heartbeat-handler-RFTERD4K.js → heartbeat-handler-6YUIF2YQ.js} +4 -4
  220. package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +2 -0
  221. package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +2 -0
  222. package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +2 -0
  223. package/dist/cli/chunks/{hnsw-legacy-bridge-GPKGFFHY.js → hnsw-legacy-bridge-J3M3IK24.js} +2 -2
  224. package/dist/cli/chunks/{hnswlib-node-PHL3F2PR.js → hnswlib-node-ULGTGDZW.js} +2 -2
  225. package/dist/cli/chunks/{hooks-GYJ6D4QM.js → hooks-C4BUGYUQ.js} +28 -28
  226. package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +2 -0
  227. package/dist/cli/chunks/{hypergraph-engine-YGEQPCKJ.js → hypergraph-engine-WINGVMPG.js} +2 -2
  228. package/dist/cli/chunks/{hypergraph-handler-ZIMM647V.js → hypergraph-handler-GADMWKAU.js} +3 -3
  229. package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +2 -0
  230. package/dist/cli/chunks/{init-guard-VOMBXJXG.js → init-guard-K2T4QWAO.js} +2 -2
  231. package/dist/cli/chunks/{init-handler-PSMUBWK5.js → init-handler-PCZTDZYI.js} +6 -6
  232. package/dist/cli/chunks/init-wizard-TZDJQK3U.js +2 -0
  233. package/dist/cli/chunks/kernel-Y6RRIOKW.js +2 -0
  234. package/dist/cli/chunks/{kilocode-installer-2YNTFBWJ.js → kilocode-installer-XENXNEIU.js} +2 -2
  235. package/dist/cli/chunks/{kiro-installer-XHJDPVAZ.js → kiro-installer-3PG2TJ67.js} +2 -2
  236. package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +2 -0
  237. package/dist/cli/chunks/{learning-GNSIDRNG.js → learning-6KDH7FK4.js} +3 -3
  238. package/dist/cli/chunks/{llm-router-LQDM7IU2.js → llm-router-RKVDEWU2.js} +4 -4
  239. package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +2 -0
  240. package/dist/cli/chunks/{load-YATHI72E.js → load-ITHC564X.js} +2 -2
  241. package/dist/cli/chunks/load-test-RUF7DZA5.js +2 -0
  242. package/dist/cli/chunks/{mcp-4Y6GDLYK.js → mcp-TCL5UW3N.js} +2 -2
  243. package/dist/cli/chunks/{memory-OUW3L7H2.js → memory-BKDAY2N2.js} +5 -5
  244. package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +2 -0
  245. package/dist/cli/chunks/{memory-handlers-G3LFF53U.js → memory-handlers-WN4FXFOA.js} +2 -2
  246. package/dist/cli/chunks/{multi-model-executor-UBZJXAD2.js → multi-model-executor-VHAT7ZPF.js} +2 -2
  247. package/dist/cli/chunks/{opencode-installer-AMMNWVH5.js → opencode-installer-E3VM3EEY.js} +2 -2
  248. package/dist/cli/chunks/{orchestrator-Y44WDOER.js → orchestrator-BMQ6X762.js} +58 -20
  249. package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +2 -0
  250. package/dist/cli/chunks/{pattern-usage-recorder-ESR42RME.js → pattern-usage-recorder-GOOR2BV5.js} +2 -2
  251. package/dist/cli/chunks/{pipeline-EDTS6OSC.js → pipeline-5NSFQQIX.js} +2 -2
  252. package/dist/cli/chunks/{platform-5WONJSUX.js → platform-SQM34J5G.js} +2 -2
  253. package/dist/cli/chunks/{plugin-IJXPCLD4.js → plugin-UQJZRMZG.js} +2 -2
  254. package/dist/cli/chunks/{prime-radiant-advanced-wasm-5ECKGZK6.js → prime-radiant-advanced-wasm-WMDJOL4S.js} +2 -2
  255. package/dist/cli/chunks/project-root-IO5KRNGL.js +2 -0
  256. package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +2 -0
  257. package/dist/cli/chunks/{protocol-handler-DRD3GVNW.js → protocol-handler-OBDCVY6X.js} +2 -2
  258. package/dist/cli/chunks/{prove-KTGW2HMJ.js → prove-XDC7I4XT.js} +2 -2
  259. package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +2 -0
  260. package/dist/cli/chunks/{quality-DV2WPRRS.js → quality-L4GQ6WX4.js} +2 -2
  261. package/dist/cli/chunks/{quality-gate-HFUAFVZC.js → quality-gate-MJG66LKN.js} +3 -3
  262. package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +2 -0
  263. package/dist/cli/chunks/real-embeddings-HW4G2LWL.js +2 -0
  264. package/dist/cli/chunks/{ref-validation-QWSKS5OY.js → ref-validation-FC7JOJ2C.js} +2 -2
  265. package/dist/cli/chunks/{roocode-installer-RBAYRCHX.js → roocode-installer-KWS4CEIC.js} +2 -2
  266. package/dist/cli/chunks/router-YUO3I7RU.js +2 -0
  267. package/dist/cli/chunks/routing-feedback-36SLQGJE.js +2 -0
  268. package/dist/cli/chunks/{routing-handler-FMPP3XKO.js → routing-handler-QF4WVB2S.js} +2 -2
  269. package/dist/cli/chunks/{ruvector-commands-KZZT4HWF.js → ruvector-commands-2MTCOUK6.js} +2 -2
  270. package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +2 -0
  271. package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +2 -0
  272. package/dist/cli/chunks/{rvf-migration-coordinator-7CHEV35N.js → rvf-migration-coordinator-BREJCXWN.js} +2 -2
  273. package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +2 -0
  274. package/dist/cli/chunks/{rvf-store-integrity-Q2TH52SN.js → rvf-store-integrity-KKC6HOJD.js} +2 -2
  275. package/dist/cli/chunks/safe-db-4RRIGRXD.js +2 -0
  276. package/dist/cli/chunks/schedule-25RTO4DQ.js +2 -0
  277. package/dist/cli/chunks/scheduler-BPIOJZ5P.js +2 -0
  278. package/dist/cli/chunks/{security-CUEA3UIM.js → security-OSAE7VAP.js} +3 -3
  279. package/dist/cli/chunks/{shared-rvf-adapter-DROMBRV2.js → shared-rvf-adapter-COUOS665.js} +2 -2
  280. package/dist/cli/chunks/{shared-rvf-dual-writer-DBNABOP7.js → shared-rvf-dual-writer-YXMPZKQE.js} +2 -2
  281. package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +2 -0
  282. package/dist/cli/chunks/{standalone-memory-IAHA3M6B.js → standalone-memory-E6JBMOIL.js} +2 -2
  283. package/dist/cli/chunks/{status-handler-AFUCASTX.js → status-handler-AFTCIYIX.js} +2 -2
  284. package/dist/cli/chunks/{structural-health-AQRV6JJ6.js → structural-health-2FROCEI4.js} +2 -2
  285. package/dist/cli/chunks/{sync-XW5TLZ7M.js → sync-VAYTOWDC.js} +2 -2
  286. package/dist/cli/chunks/{sync-GX7FMJHL.js → sync-YIQYOFGW.js} +2 -2
  287. package/dist/cli/chunks/task-handler-KVQHDEX3.js +62 -0
  288. package/dist/cli/chunks/task-handlers-MVVECQA6.js +9 -0
  289. package/dist/cli/chunks/{test-D2XDJNDX.js → test-5JSVTOMY.js} +4 -4
  290. package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +2 -0
  291. package/dist/cli/chunks/{test-scheduling-TS6I2PR7.js → test-scheduling-HBOHVLI3.js} +3 -3
  292. package/dist/cli/chunks/{token-bootstrap-HBBLPCZ3.js → token-bootstrap-5VEPTPFA.js} +2 -2
  293. package/dist/cli/chunks/{token-usage-3MBUX4PR.js → token-usage-TBJHDLY6.js} +2 -2
  294. package/dist/cli/chunks/{transformers-ZWMQO3L2.js → transformers-VAWYMHMZ.js} +2 -2
  295. package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +2 -0
  296. package/dist/cli/chunks/{types-5YEMGPSQ.js → types-R5SDZU2E.js} +2 -2
  297. package/dist/cli/chunks/unified-memory-TLGSSLMI.js +2 -0
  298. package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +2 -0
  299. package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +2 -0
  300. package/dist/cli/chunks/{upgrade-2TPBKIHI.js → upgrade-K5PIHXRB.js} +2 -2
  301. package/dist/cli/chunks/{validate-XRAXXFW6.js → validate-RPTS7RYJ.js} +2 -2
  302. package/dist/cli/chunks/{validate-swarm-IYSCS3BZ.js → validate-swarm-B2ZL556X.js} +2 -2
  303. package/dist/cli/chunks/visual-security-6Q44XNLB.js +2 -0
  304. package/dist/cli/chunks/{web-tree-sitter-PZQ3ZG2P.js → web-tree-sitter-K4DUJC32.js} +2 -2
  305. package/dist/cli/chunks/{windsurf-installer-U6XWFRVT.js → windsurf-installer-OK2AJN35.js} +2 -2
  306. package/dist/cli/chunks/witness-chain-KDOMXDQX.js +2 -0
  307. package/dist/cli/chunks/witness-chain-N3OY2RMH.js +2 -0
  308. package/dist/cli/chunks/{witness-chain-repair-K7YX2AO6.js → witness-chain-repair-L6Y5RFXR.js} +2 -2
  309. package/dist/cli/chunks/{witness-chain-verifier-GUTC3W7N.js → witness-chain-verifier-N4CW7FZX.js} +2 -2
  310. package/dist/cli/chunks/{witness-key-manager-YBNKMOP6.js → witness-key-manager-TDNPS3WD.js} +2 -2
  311. package/dist/cli/chunks/{workflow-UAJUILFQ.js → workflow-XRZA3YCY.js} +4 -4
  312. package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +2 -0
  313. package/dist/cli/chunks/{wrappers-AVZ3GPAL.js → wrappers-5JIFWKN6.js} +2 -2
  314. package/dist/cli/commands/ci.js +7 -0
  315. package/dist/cli/commands/code.js +6 -0
  316. package/dist/cli/commands/coverage.js +7 -1
  317. package/dist/cli/commands/fleet-run.d.ts +12 -0
  318. package/dist/cli/commands/fleet-run.js +175 -0
  319. package/dist/cli/commands/fleet.js +2 -117
  320. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
  321. package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
  322. package/dist/cli/handlers/task-handler.d.ts +5 -0
  323. package/dist/cli/handlers/task-handler.js +26 -0
  324. package/dist/cli/utils/coverage-verdict.d.ts +11 -2
  325. package/dist/cli/utils/coverage-verdict.js +26 -6
  326. package/dist/cli/utils/fleet-operation.d.ts +10 -2
  327. package/dist/cli/utils/fleet-operation.js +20 -3
  328. package/dist/cli/utils/fleet-result.d.ts +20 -4
  329. package/dist/cli/utils/fleet-result.js +32 -21
  330. package/dist/cli/utils/fleet-shard.d.ts +36 -0
  331. package/dist/cli/utils/fleet-shard.js +110 -0
  332. package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
  333. package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
  334. package/dist/coordination/handlers/coverage-collection.js +2 -1
  335. package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
  336. package/dist/coordination/handlers/coverage-evidence.js +159 -0
  337. package/dist/coordination/handlers/coverage-handlers.js +16 -3
  338. package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
  339. package/dist/coordination/handlers/coverage-scope.js +321 -0
  340. package/dist/coordination/handlers/coverage-target.d.ts +9 -0
  341. package/dist/coordination/handlers/coverage-target.js +15 -5
  342. package/dist/coordination/handlers/handler-types.d.ts +2 -2
  343. package/dist/coordination/handlers/handler-utils.d.ts +11 -0
  344. package/dist/coordination/handlers/handler-utils.js +22 -8
  345. package/dist/coordination/handlers/misc-handlers.js +5 -2
  346. package/dist/coordination/handlers/quality-handlers.js +2 -2
  347. package/dist/coordination/handlers/security-handlers.js +12 -2
  348. package/dist/coordination/protocols/security-audit.js +11 -1
  349. package/dist/coordination/task-executor.js +7 -2
  350. package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
  351. package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
  352. package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
  353. package/dist/domains/code-intelligence/coordinator.js +24 -27
  354. package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
  355. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
  356. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +51 -5
  357. package/dist/domains/code-intelligence/services/semantic-analyzer.js +144 -78
  358. package/dist/domains/coverage-analysis/collected-metrics.d.ts +10 -0
  359. package/dist/domains/coverage-analysis/collected-metrics.js +29 -0
  360. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +11 -3
  361. package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
  362. package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
  363. package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
  364. package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
  365. package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
  366. package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
  367. package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
  368. package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
  369. package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
  370. package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
  371. package/dist/domains/quality-assessment/coordinator.js +10 -4
  372. package/dist/domains/quality-assessment/interfaces.d.ts +2 -0
  373. package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
  374. package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
  375. package/dist/domains/security-compliance/index.d.ts +1 -1
  376. package/dist/domains/security-compliance/interfaces.d.ts +46 -5
  377. package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
  378. package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
  379. package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
  380. package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
  381. package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
  382. package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
  383. package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
  384. package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
  385. package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
  386. package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
  387. package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
  388. package/dist/domains/security-compliance/services/scanners/index.js +1 -1
  389. package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
  390. package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
  391. package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
  392. package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
  393. package/dist/domains/security-compliance/services/security-auditor.js +106 -65
  394. package/dist/domains/test-execution/coordinator.d.ts +2 -1
  395. package/dist/domains/test-execution/coordinator.js +33 -27
  396. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  397. package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
  398. package/dist/domains/test-execution/services/test-executor.js +16 -4
  399. package/dist/domains/visual-accessibility/coordinator.js +34 -9
  400. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
  401. package/dist/domains/visual-accessibility/plugin.js +5 -0
  402. package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
  403. package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
  404. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
  405. package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
  406. package/dist/init/phases/10-workers.js +42 -4
  407. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +23 -1
  408. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +50 -15
  409. package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +7 -2
  410. package/dist/integrations/agentic-flow/reasoning-bank/index.js +8 -0
  411. package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
  412. package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
  413. package/dist/learning/embedder-endpoint-client.d.ts +8 -0
  414. package/dist/learning/embedder-endpoint-client.js +20 -0
  415. package/dist/learning/embedder-recovery.d.ts +63 -0
  416. package/dist/learning/embedder-recovery.js +94 -0
  417. package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
  418. package/dist/learning/qe-reasoning-bank.d.ts +21 -0
  419. package/dist/learning/qe-reasoning-bank.js +54 -8
  420. package/dist/learning/real-embeddings.d.ts +23 -0
  421. package/dist/learning/real-embeddings.js +69 -2
  422. package/dist/learning/real-qe-reasoning-bank.d.ts +24 -4
  423. package/dist/learning/real-qe-reasoning-bank.js +58 -20
  424. package/dist/logging/redaction.js +142 -12
  425. package/dist/mcp/bundle.js +509 -497
  426. package/dist/mcp/daemon-mode.d.ts +126 -0
  427. package/dist/mcp/daemon-mode.js +257 -0
  428. package/dist/mcp/entry.d.ts +4 -0
  429. package/dist/mcp/entry.js +50 -2
  430. package/dist/mcp/handlers/domain-handler-configs.d.ts +8 -0
  431. package/dist/mcp/handlers/domain-handler-configs.js +14 -2
  432. package/dist/mcp/handlers/handler-factory.js +3 -0
  433. package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
  434. package/dist/mcp/handlers/model-route-handlers.js +139 -0
  435. package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
  436. package/dist/mcp/handlers/orchestrate-routes.js +94 -3
  437. package/dist/mcp/handlers/task-handlers.d.ts +3 -242
  438. package/dist/mcp/handlers/task-handlers.js +11 -788
  439. package/dist/mcp/handlers/task-inference.d.ts +26 -0
  440. package/dist/mcp/handlers/task-inference.js +156 -0
  441. package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
  442. package/dist/mcp/handlers/task-learning-handlers.js +230 -0
  443. package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
  444. package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
  445. package/dist/mcp/protocol-server.js +15 -2
  446. package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
  447. package/dist/mcp/services/reasoning-bank-service.js +9 -0
  448. package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
  449. package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
  450. package/dist/mcp/tools/coverage-analysis/index.js +8 -2
  451. package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
  452. package/dist/mcp/tools/visual-accessibility/index.js +29 -13
  453. package/dist/mcp/types.d.ts +14 -0
  454. package/dist/routing/advisor/redaction.js +22 -2
  455. package/dist/shared/events/domain-events.d.ts +2 -0
  456. package/dist/shared/llm/providers/response-deadline.js +16 -2
  457. package/dist/shared/metrics/code-metrics.js +21 -3
  458. package/dist/shared/parsers/typescript-parser.d.ts +6 -0
  459. package/dist/shared/parsers/typescript-parser.js +13 -1
  460. package/dist/shared/types/index.js +3 -1
  461. package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
  462. package/package.json +3 -3
  463. package/dist/cli/chunks/adapter-V4GSGOOK.js +0 -2
  464. package/dist/cli/chunks/aqe-learning-engine-6WQTM5YR.js +0 -2
  465. package/dist/cli/chunks/base-AK7BXBX2.js +0 -2
  466. package/dist/cli/chunks/browser-workflow-VTDFBW7T.js +0 -2
  467. package/dist/cli/chunks/chunk-2DTX7YAZ.js +0 -6
  468. package/dist/cli/chunks/chunk-72ZBJD2E.js +0 -3
  469. package/dist/cli/chunks/chunk-EBPJY4DI.js +0 -3
  470. package/dist/cli/chunks/chunk-H43AFUKL.js +0 -2
  471. package/dist/cli/chunks/chunk-HJ3XNTTJ.js +0 -2
  472. package/dist/cli/chunks/chunk-IO5537OM.js +0 -2
  473. package/dist/cli/chunks/chunk-IW6WDGHM.js +0 -2
  474. package/dist/cli/chunks/chunk-K2HBNYAZ.js +0 -62
  475. package/dist/cli/chunks/chunk-LRL56ZYL.js +0 -21
  476. package/dist/cli/chunks/chunk-VLD7Z2ED.js +0 -13
  477. package/dist/cli/chunks/chunk-VO3DRK4P.js +0 -3
  478. package/dist/cli/chunks/ci-6GUFAZMJ.js +0 -81
  479. package/dist/cli/chunks/client-HL2COSFM.js +0 -2
  480. package/dist/cli/chunks/core-handlers-IX7ATLM6.js +0 -2
  481. package/dist/cli/chunks/cross-domain-router-YYKLAPJO.js +0 -2
  482. package/dist/cli/chunks/domain-transfer-DOBI67K6.js +0 -2
  483. package/dist/cli/chunks/dream-T6EP7B3F.js +0 -2
  484. package/dist/cli/chunks/file-discovery-JYMVTDMU.js +0 -2
  485. package/dist/cli/chunks/fleet-FVAUMKUT.js +0 -46
  486. package/dist/cli/chunks/heartbeat-scheduler-4N5MUJ7S.js +0 -2
  487. package/dist/cli/chunks/hnsw-adapter-ZPAJDSLR.js +0 -2
  488. package/dist/cli/chunks/hnsw-index-4CTH6RHB.js +0 -2
  489. package/dist/cli/chunks/hybrid-backend-AW6UTXQS.js +0 -2
  490. package/dist/cli/chunks/impact-analyzer-MZK3JMSV.js +0 -2
  491. package/dist/cli/chunks/init-wizard-FUC7KDVX.js +0 -2
  492. package/dist/cli/chunks/kernel-ZCPMCVMW.js +0 -2
  493. package/dist/cli/chunks/knowledge-graph-NUJKEDNF.js +0 -2
  494. package/dist/cli/chunks/llm-router-service-B2BFBQ76.js +0 -2
  495. package/dist/cli/chunks/load-test-ZHQ2MUGO.js +0 -2
  496. package/dist/cli/chunks/memory-backend-AAMQG6WH.js +0 -2
  497. package/dist/cli/chunks/pattern-null-store-RFNVA46O.js +0 -2
  498. package/dist/cli/chunks/project-root-7QL4KP5C.js +0 -2
  499. package/dist/cli/chunks/protocol-executor-2NW5BD4R.js +0 -2
  500. package/dist/cli/chunks/qe-reasoning-bank-G2JZOGKD.js +0 -2
  501. package/dist/cli/chunks/queen-coordinator-GRG5FT2A.js +0 -2
  502. package/dist/cli/chunks/real-embeddings-RQRVOKVM.js +0 -2
  503. package/dist/cli/chunks/router-LQB5SWAF.js +0 -2
  504. package/dist/cli/chunks/routing-feedback-OEEXA55N.js +0 -2
  505. package/dist/cli/chunks/rvf-dual-writer-BZK4M7BO.js +0 -2
  506. package/dist/cli/chunks/rvf-migration-adapter-EZZUJL2E.js +0 -2
  507. package/dist/cli/chunks/rvf-native-adapter-6COXTQZ3.js +0 -2
  508. package/dist/cli/chunks/safe-db-PE6G3L55.js +0 -2
  509. package/dist/cli/chunks/schedule-OLKQ6QYW.js +0 -2
  510. package/dist/cli/chunks/scheduler-LSGBDFAT.js +0 -2
  511. package/dist/cli/chunks/sqlite-persistence-HH4DNTYH.js +0 -2
  512. package/dist/cli/chunks/task-handler-TFKVUTNF.js +0 -60
  513. package/dist/cli/chunks/task-handlers-SS4ZDXNF.js +0 -9
  514. package/dist/cli/chunks/test-runner-process-PSSBNNGR.js +0 -2
  515. package/dist/cli/chunks/tree-sitter-wasm-parser-TYRQRJ2W.js +0 -2
  516. package/dist/cli/chunks/unified-memory-AGDZQ5XD.js +0 -2
  517. package/dist/cli/chunks/unified-memory-hnsw-X5TJ3JDE.js +0 -2
  518. package/dist/cli/chunks/unified-persistence-UCV7YETW.js +0 -2
  519. package/dist/cli/chunks/visual-security-ZLXRIQZV.js +0 -2
  520. package/dist/cli/chunks/witness-chain-CVIWYTD2.js +0 -2
  521. package/dist/cli/chunks/witness-chain-VBKORKOX.js +0 -2
  522. package/dist/cli/chunks/workflow-orchestrator-3ZN7MVCE.js +0 -2
@@ -6,6 +6,11 @@ import { Result } from '../../../shared/types';
6
6
  import { MemoryBackend } from '../../../kernel/interfaces';
7
7
  import { NomicEmbedderConfig, IEmbeddingProvider } from '../../../shared/embeddings';
8
8
  import { SearchRequest, SearchResults, SearchResult } from '../interfaces';
9
+ /**
10
+ * #1224: the message for a search over an empty index. "No results" is only
11
+ * reported after searching an index that holds code.
12
+ */
13
+ export declare const NOTHING_INDEXED_FOR_SEARCH: string;
9
14
  /**
10
15
  * Interface for the semantic analyzer service
11
16
  */
@@ -18,7 +23,10 @@ export interface ISemanticAnalyzerService {
18
23
  findSimilar(code: string, limit?: number): Promise<Result<SearchResult[], Error>>;
19
24
  /** Analyze code semantics */
20
25
  analyze(code: string): Promise<Result<SemanticAnalysis, Error>>;
21
- /** Get code embeddings */
26
+ /**
27
+ * Get code embeddings. Throws when no embedding model is available: no
28
+ * pseudo-embedding is substituted (ADR-097).
29
+ */
22
30
  getEmbedding(code: string): Promise<number[]>;
23
31
  }
24
32
  /**
@@ -56,8 +64,15 @@ export interface HalsteadMetrics {
56
64
  export interface SemanticAnalyzerConfig {
57
65
  /** Embedding vector dimension (384 for all-MiniLM-L6-v2) */
58
66
  embeddingDimension: number;
59
- /** Minimum similarity score threshold */
67
+ /** Minimum word-overlap score for fuzzy and text-only matches */
60
68
  minScore: number;
69
+ /**
70
+ * #1224: minimum cosine similarity for vector hits. Sentence-embedding
71
+ * models score a relevant file well below 0.5 (all-MiniLM-L6-v2 gave 0.37
72
+ * for "login" against a login function), so the text threshold would hide
73
+ * every vector hit.
74
+ */
75
+ minVectorScore: number;
61
76
  /** Maximum search results */
62
77
  maxResults: number;
63
78
  /** Storage namespace */
@@ -84,6 +99,8 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
84
99
  private readonly analysisCache;
85
100
  private embedder;
86
101
  private embedderInitialized;
102
+ /** #1224: why no embedder is in use, once initialization has run. */
103
+ private embedderUnavailableReason;
87
104
  constructor(memory: MemoryBackend, config?: Partial<SemanticAnalyzerConfig>);
88
105
  /**
89
106
  * Initialize the Nomic embedder lazily
@@ -106,15 +123,31 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
106
123
  */
107
124
  analyze(code: string): Promise<Result<SemanticAnalysis, Error>>;
108
125
  /**
109
- * Get embedding vector for code
110
- * Uses Nomic embeddings via Ollama when available, falls back to pseudo-embeddings
126
+ * Get embedding vector for code.
127
+ * Uses Nomic embeddings via Ollama (or the injected provider). Throws when
128
+ * neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
111
129
  */
112
130
  getEmbedding(code: string): Promise<number[]>;
113
131
  /**
114
132
  * Check if using real Nomic embeddings
115
133
  */
116
134
  isUsingNomicEmbeddings(): boolean;
135
+ /** #1224: embed `text`, or say why no real embedding is available. */
136
+ private tryEmbed;
137
+ /** Identifies the model behind stored vectors, so vectors from another model are not compared. */
138
+ private embeddingModelId;
139
+ private isCurrentModelVector;
140
+ private vectorKeyPrefix;
141
+ private contentKeyPattern;
142
+ /**
143
+ * #1224: vector search when an embedding model is available. Otherwise (or
144
+ * when no indexed file has a vector from that model) it matches query words
145
+ * against the indexed text and says so through `lexicalOnlyReason`; no
146
+ * similarity is invented for those hits.
147
+ */
117
148
  private semanticSearch;
149
+ /** Word-overlap matching for a semantic query when no vectors can be used. */
150
+ private lexicalSearch;
118
151
  private exactSearch;
119
152
  private fuzzySearch;
120
153
  private extractConcepts;
@@ -122,11 +155,16 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
122
155
  private calculateComplexity;
123
156
  private extractDependencies;
124
157
  private generateSuggestions;
125
- private generateCodeEmbedding;
126
158
  private extractCodeMetadata;
127
159
  private detectLanguage;
128
160
  private tokenize;
129
161
  private calculateFuzzyScore;
162
+ /**
163
+ * A content token matches a query token it contains, or that contains it.
164
+ * #1224: the second direction needs a content token of 3+ characters, so a
165
+ * one-letter variable such as `i` does not match the query "login".
166
+ */
167
+ private tokensMatch;
130
168
  private matchesFilters;
131
169
  private extractSnippet;
132
170
  private extractSnippetAround;
@@ -134,6 +172,14 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
134
172
  private findHighlights;
135
173
  private findSemanticHighlights;
136
174
  private fileToKey;
175
+ /**
176
+ * Content identity for the analysis and embedding caches.
177
+ *
178
+ * This keys cache entries, so it has to separate any two distinct inputs.
179
+ * A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
180
+ * "Aa" and "BB" collide, so two different functions would share one entry
181
+ * and the second caller would receive the first one's result.
182
+ */
137
183
  private hashCode;
138
184
  private cacheEmbedding;
139
185
  private cacheAnalysis;
@@ -2,12 +2,22 @@
2
2
  * Agentic QE v3 - Semantic Analyzer Service
3
3
  * Semantic code analysis using vector embeddings and HNSW search
4
4
  */
5
+ import { createHash } from 'node:crypto';
5
6
  import { ok, err } from '../../../shared/types/index.js';
6
7
  import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
7
8
  import { toError } from '../../../shared/error-utils.js';
9
+ /**
10
+ * #1224: the message for a search over an empty index. "No results" is only
11
+ * reported after searching an index that holds code.
12
+ */
13
+ export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
14
+ 'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
15
+ /** Upper bound on indexed files one exact/fuzzy search reads. */
16
+ const MAX_INDEXED_FILES_SCANNED = 100_000;
8
17
  const DEFAULT_CONFIG = {
9
18
  embeddingDimension: EMBEDDING_CONFIG.DIMENSIONS, // 384 for all-MiniLM-L6-v2
10
19
  minScore: 0.5,
20
+ minVectorScore: 0.3,
11
21
  maxResults: 100,
12
22
  namespace: 'code-intelligence:semantic',
13
23
  enableCaching: true,
@@ -25,6 +35,8 @@ export class SemanticAnalyzerService {
25
35
  analysisCache = new Map();
26
36
  embedder = null;
27
37
  embedderInitialized = false;
38
+ /** #1224: why no embedder is in use, once initialization has run. */
39
+ embedderUnavailableReason = null;
28
40
  constructor(memory, config = {}) {
29
41
  this.memory = memory;
30
42
  this.config = { ...DEFAULT_CONFIG, ...config };
@@ -42,9 +54,11 @@ export class SemanticAnalyzerService {
42
54
  return;
43
55
  }
44
56
  if (this.config.useNomicEmbeddings) {
57
+ // #1224: no pseudo-embedding fallback. A failed embed throws, and the
58
+ // search reports itself as lexical-only instead.
45
59
  const nomicEmbedder = new NomicEmbedder({
46
- enableFallback: true,
47
60
  ...this.config.nomicConfig,
61
+ enableFallback: false,
48
62
  });
49
63
  // Check if Ollama is available
50
64
  const isAvailable = await nomicEmbedder.healthCheck();
@@ -54,6 +68,13 @@ export class SemanticAnalyzerService {
54
68
  this.config.embeddingDimension =
55
69
  EMBEDDING_CONFIG.DIMENSIONS;
56
70
  }
71
+ else {
72
+ this.embedderUnavailableReason =
73
+ `no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
74
+ }
75
+ }
76
+ else {
77
+ this.embedderUnavailableReason = 'embeddings are disabled for code search';
57
78
  }
58
79
  this.embedderInitialized = true;
59
80
  }
@@ -64,11 +85,23 @@ export class SemanticAnalyzerService {
64
85
  const startTime = Date.now();
65
86
  try {
66
87
  const { query, type, scope, limit = this.config.maxResults, filters } = request;
88
+ if (type !== 'semantic' && type !== 'exact' && type !== 'fuzzy') {
89
+ return err(new Error(`Unknown search type: ${type}`));
90
+ }
91
+ // #1224: an empty answer from an empty index is not "no results".
92
+ const indexed = await this.memory.search(this.contentKeyPattern(), 1);
93
+ if (indexed.length === 0) {
94
+ return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
95
+ }
67
96
  let results;
97
+ let lexicalOnlyReason;
68
98
  switch (type) {
69
- case 'semantic':
70
- results = await this.semanticSearch(query, limit, scope, filters);
99
+ case 'semantic': {
100
+ const semantic = await this.semanticSearch(query, limit, scope, filters);
101
+ results = semantic.results;
102
+ lexicalOnlyReason = semantic.lexicalOnlyReason;
71
103
  break;
104
+ }
72
105
  case 'exact':
73
106
  results = await this.exactSearch(query, limit, scope, filters);
74
107
  break;
@@ -83,6 +116,11 @@ export class SemanticAnalyzerService {
83
116
  results,
84
117
  total: results.length,
85
118
  searchTime,
119
+ ...(type === 'semantic'
120
+ ? lexicalOnlyReason === undefined
121
+ ? { mode: 'vector' }
122
+ : { mode: 'lexical-only', reason: lexicalOnlyReason }
123
+ : {}),
86
124
  });
87
125
  }
88
126
  catch (error) {
@@ -94,17 +132,20 @@ export class SemanticAnalyzerService {
94
132
  */
95
133
  async indexCode(file, content) {
96
134
  try {
97
- // Generate embedding for the code
98
- const embedding = await this.getEmbedding(content);
99
135
  // Extract code metadata
100
136
  const metadata = this.extractCodeMetadata(file, content);
101
- // Store in vector index
102
- const key = `${this.config.namespace}:code:${this.fileToKey(file)}`;
103
- await this.memory.storeVector(key, embedding, {
104
- file,
105
- ...metadata,
106
- indexedAt: new Date().toISOString(),
107
- });
137
+ // #1224: store a vector only when a real embedding model produced one;
138
+ // without it the file is still searchable by text.
139
+ const embedded = await this.tryEmbed(content);
140
+ if (embedded.vector) {
141
+ const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
142
+ await this.memory.storeVector(key, embedded.vector, {
143
+ file,
144
+ ...metadata,
145
+ embeddingModel: this.embeddingModelId(),
146
+ indexedAt: new Date().toISOString(),
147
+ });
148
+ }
108
149
  // Store content for retrieval.
109
150
  // The key is already fully namespace-qualified, so do NOT also pass a
110
151
  // {namespace} store option: every read path (semanticSearch/findSimilar/
@@ -125,13 +166,13 @@ export class SemanticAnalyzerService {
125
166
  async findSimilar(code, limit = 10) {
126
167
  try {
127
168
  const embedding = await this.getEmbedding(code);
128
- const vectorResults = await this.memory.vectorSearch(embedding, limit);
169
+ const vectorResults = await this.memory.vectorSearch(embedding, limit, this.vectorKeyPrefix());
129
170
  const results = [];
130
171
  for (const vr of vectorResults) {
131
- if (vr.score < this.config.minScore)
172
+ if (vr.score < this.config.minVectorScore)
132
173
  continue;
133
174
  const metadata = vr.metadata;
134
- if (!metadata?.file)
175
+ if (!metadata?.file || !this.isCurrentModelVector(metadata))
135
176
  continue;
136
177
  const contentKey = `${this.config.namespace}:content:${this.fileToKey(metadata.file)}`;
137
178
  const stored = await this.memory.get(contentKey);
@@ -189,8 +230,9 @@ export class SemanticAnalyzerService {
189
230
  }
190
231
  }
191
232
  /**
192
- * Get embedding vector for code
193
- * Uses Nomic embeddings via Ollama when available, falls back to pseudo-embeddings
233
+ * Get embedding vector for code.
234
+ * Uses Nomic embeddings via Ollama (or the injected provider). Throws when
235
+ * neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
194
236
  */
195
237
  async getEmbedding(code) {
196
238
  // Check cache
@@ -200,15 +242,10 @@ export class SemanticAnalyzerService {
200
242
  }
201
243
  // Initialize embedder lazily
202
244
  await this.initializeEmbedder();
203
- // Generate embedding using Nomic or fallback
204
- let embedding;
205
- if (this.embedder) {
206
- embedding = await this.embedder.embed(code);
207
- }
208
- else {
209
- // Fallback to pseudo-embedding when Ollama is not available
210
- embedding = this.generateCodeEmbedding(code);
245
+ if (!this.embedder) {
246
+ throw new Error(`Code embeddings unavailable: ${this.embedderUnavailableReason ?? 'no embedding model'}`);
211
247
  }
248
+ const embedding = await this.embedder.embed(code);
212
249
  // Cache result
213
250
  if (this.config.enableCaching) {
214
251
  this.cacheEmbedding(cacheKey, embedding);
@@ -221,22 +258,67 @@ export class SemanticAnalyzerService {
221
258
  isUsingNomicEmbeddings() {
222
259
  return this.embedder !== null && this.embedder instanceof NomicEmbedder;
223
260
  }
261
+ /** #1224: embed `text`, or say why no real embedding is available. */
262
+ async tryEmbed(text) {
263
+ await this.initializeEmbedder();
264
+ if (!this.embedder) {
265
+ return { reason: this.embedderUnavailableReason ?? 'no embedding model available' };
266
+ }
267
+ try {
268
+ return { vector: await this.getEmbedding(text) };
269
+ }
270
+ catch (error) {
271
+ return { reason: `the embedding model failed: ${toError(error).message}` };
272
+ }
273
+ }
274
+ /** Identifies the model behind stored vectors, so vectors from another model are not compared. */
275
+ embeddingModelId() {
276
+ return this.embedder instanceof NomicEmbedder ? EMBEDDING_CONFIG.MODEL : 'injected-provider';
277
+ }
278
+ isCurrentModelVector(metadata) {
279
+ return metadata.embeddingModel === this.embeddingModelId();
280
+ }
281
+ vectorKeyPrefix() {
282
+ return `${this.config.namespace}:code:`;
283
+ }
284
+ contentKeyPattern() {
285
+ return `${this.config.namespace}:content:*`;
286
+ }
224
287
  // ============================================================================
225
288
  // Private Search Methods
226
289
  // ============================================================================
290
+ /**
291
+ * #1224: vector search when an embedding model is available. Otherwise (or
292
+ * when no indexed file has a vector from that model) it matches query words
293
+ * against the indexed text and says so through `lexicalOnlyReason`; no
294
+ * similarity is invented for those hits.
295
+ */
227
296
  async semanticSearch(query, limit, scope, filters) {
228
- // Generate query embedding
229
- const queryEmbedding = await this.getEmbedding(query);
230
- // Perform vector search
231
- const vectorResults = await this.memory.vectorSearch(queryEmbedding, limit * 2);
297
+ const embedded = await this.tryEmbed(query);
298
+ if (!embedded.vector) {
299
+ return {
300
+ results: await this.lexicalSearch(query, limit, scope, filters),
301
+ lexicalOnlyReason: embedded.reason,
302
+ };
303
+ }
304
+ // Only this namespace's vectors, from the model that embedded the query.
305
+ const vectorResults = (await this.memory.vectorSearch(embedded.vector, limit * 2, this.vectorKeyPrefix()))
306
+ .filter((vr) => {
307
+ const metadata = vr.metadata;
308
+ return !!metadata?.file && this.isCurrentModelVector(metadata);
309
+ });
310
+ if (vectorResults.length === 0) {
311
+ return {
312
+ results: await this.lexicalSearch(query, limit, scope, filters),
313
+ lexicalOnlyReason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
314
+ };
315
+ }
232
316
  // Convert to search results with filtering
233
317
  const results = [];
234
318
  for (const vr of vectorResults) {
235
- if (vr.score < this.config.minScore)
319
+ if (vr.score < this.config.minVectorScore)
236
320
  continue;
237
321
  const metadata = vr.metadata;
238
- if (!metadata?.file)
239
- continue;
240
322
  // Apply scope filter
241
323
  if (scope && scope.length > 0) {
242
324
  const matchesScope = scope.some((s) => metadata.file.includes(s));
@@ -257,17 +339,23 @@ export class SemanticAnalyzerService {
257
339
  score: vr.score,
258
340
  highlights: this.findSemanticHighlights(stored.content, query),
259
341
  metadata: stored.metadata,
342
+ matchType: 'vector',
260
343
  });
261
344
  if (results.length >= limit)
262
345
  break;
263
346
  }
264
347
  }
265
- return results;
348
+ return { results };
349
+ }
350
+ /** Word-overlap matching for a semantic query when no vectors can be used. */
351
+ async lexicalSearch(query, limit, scope, filters) {
352
+ const hits = await this.fuzzySearch(query, limit, scope, filters);
353
+ return hits.map((hit) => ({ ...hit, matchType: 'lexical' }));
266
354
  }
267
355
  async exactSearch(query, limit, scope, filters) {
268
356
  const results = [];
269
- const pattern = `${this.config.namespace}:content:*`;
270
- const keys = await this.memory.search(pattern, limit * 3);
357
+ // #1224: scan every indexed file; a cap here hid matches in later files.
358
+ const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
271
359
  for (const key of keys) {
272
360
  const stored = await this.memory.get(key);
273
361
  if (!stored)
@@ -302,8 +390,7 @@ export class SemanticAnalyzerService {
302
390
  }
303
391
  async fuzzySearch(query, limit, scope, filters) {
304
392
  const results = [];
305
- const pattern = `${this.config.namespace}:content:*`;
306
- const keys = await this.memory.search(pattern, limit * 5);
393
+ const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
307
394
  const queryTokens = this.tokenize(query.toLowerCase());
308
395
  for (const key of keys) {
309
396
  const stored = await this.memory.get(key);
@@ -323,7 +410,7 @@ export class SemanticAnalyzerService {
323
410
  const contentTokens = this.tokenize(stored.content.toLowerCase());
324
411
  const score = this.calculateFuzzyScore(queryTokens, contentTokens);
325
412
  if (score >= this.config.minScore) {
326
- const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => ct.includes(t) || t.includes(ct)));
413
+ const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
327
414
  results.push({
328
415
  file: stored.file,
329
416
  snippet: this.extractSnippet(stored.content, 200),
@@ -499,38 +586,6 @@ export class SemanticAnalyzerService {
499
586
  // ============================================================================
500
587
  // Private Helper Methods
501
588
  // ============================================================================
502
- generateCodeEmbedding(code) {
503
- // Fallback: Generate a pseudo-embedding based on code features
504
- // Used when Ollama/Nomic is not available
505
- const embedding = new Array(this.config.embeddingDimension).fill(0);
506
- // Extract tokens and features
507
- const tokens = this.tokenize(code);
508
- const concepts = this.extractConcepts(code);
509
- // Combine token-based and concept-based features
510
- for (let i = 0; i < tokens.length; i++) {
511
- const token = tokens[i];
512
- for (let j = 0; j < token.length && j < embedding.length; j++) {
513
- embedding[(i + j) % embedding.length] += token.charCodeAt(j) / 1000;
514
- }
515
- }
516
- // Add concept signals
517
- const conceptIndex = new Map([
518
- ['object-oriented', 0],
519
- ['asynchronous', 1],
520
- ['functional', 2],
521
- ['type-safe', 3],
522
- ['modular', 4],
523
- ]);
524
- for (const concept of concepts) {
525
- const idx = conceptIndex.get(concept);
526
- if (idx !== undefined) {
527
- embedding[idx] += 0.5;
528
- }
529
- }
530
- // Normalize
531
- const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
532
- return embedding.map((v) => v / magnitude);
533
- }
534
589
  extractCodeMetadata(file, content) {
535
590
  return {
536
591
  language: this.detectLanguage(file),
@@ -563,12 +618,21 @@ export class SemanticAnalyzerService {
563
618
  return 0;
564
619
  let matches = 0;
565
620
  for (const qt of queryTokens) {
566
- if (contentTokens.some((ct) => ct.includes(qt) || qt.includes(ct))) {
621
+ if (contentTokens.some((ct) => this.tokensMatch(qt, ct))) {
567
622
  matches++;
568
623
  }
569
624
  }
570
625
  return matches / queryTokens.length;
571
626
  }
627
+ /**
628
+ * A content token matches a query token it contains, or that contains it.
629
+ * #1224: the second direction needs a content token of 3+ characters, so a
630
+ * one-letter variable such as `i` does not match the query "login".
631
+ */
632
+ tokensMatch(queryToken, contentToken) {
633
+ return contentToken.includes(queryToken) ||
634
+ (contentToken.length >= 3 && queryToken.includes(contentToken));
635
+ }
572
636
  matchesFilters(metadata, filters) {
573
637
  for (const filter of filters) {
574
638
  const value = metadata[filter.field];
@@ -635,14 +699,16 @@ export class SemanticAnalyzerService {
635
699
  fileToKey(file) {
636
700
  return file.replace(/[/\\]/g, ':').replace(/\./g, '_');
637
701
  }
702
+ /**
703
+ * Content identity for the analysis and embedding caches.
704
+ *
705
+ * This keys cache entries, so it has to separate any two distinct inputs.
706
+ * A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
707
+ * "Aa" and "BB" collide, so two different functions would share one entry
708
+ * and the second caller would receive the first one's result.
709
+ */
638
710
  hashCode(str) {
639
- let hash = 0;
640
- for (let i = 0; i < str.length; i++) {
641
- const char = str.charCodeAt(i);
642
- hash = (hash << 5) - hash + char;
643
- hash = hash & hash;
644
- }
645
- return hash.toString(16);
711
+ return createHash('sha256').update(str, 'utf8').digest('hex');
646
712
  }
647
713
  cacheEmbedding(key, embedding) {
648
714
  if (this.embeddingCache.size >= this.config.cacheSize) {
@@ -14,6 +14,16 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
14
14
  * (or the cwd when none is known), so one file never has two records.
15
15
  */
16
16
  export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
17
+ /**
18
+ * #1030: the per-file record key of each path in ONE report, keyed by the
19
+ * path as the report wrote it. A path is left out when its record would not
20
+ * be a measurement of a project file: it resolves outside the project root
21
+ * (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
22
+ * (it would resolve to a junk key), or the report lists the same file under
23
+ * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
24
+ * unknown.
25
+ */
26
+ export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
17
27
  /** Read the canonical key first, then a measured legacy relative key if present. */
18
28
  export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
19
29
  export interface CollectedMetrics {
@@ -17,6 +17,35 @@ import { findProjectRoot } from '../../kernel/project-root.js';
17
17
  export function fileCoverageKey(filePath, projectRoot) {
18
18
  return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
19
19
  }
20
+ /**
21
+ * #1030: the per-file record key of each path in ONE report, keyed by the
22
+ * path as the report wrote it. A path is left out when its record would not
23
+ * be a measurement of a project file: it resolves outside the project root
24
+ * (lcov `SF:../../outside.ts`), it is a Windows absolute path read on POSIX
25
+ * (it would resolve to a junk key), or the report lists the same file under
26
+ * two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
27
+ * unknown.
28
+ */
29
+ export function projectFileCoverageKeys(paths, projectRoot) {
30
+ const root = path.resolve(projectRoot ?? findProjectRoot());
31
+ const keys = new Map();
32
+ const spellings = new Map();
33
+ for (const filePath of paths) {
34
+ if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath))
35
+ continue;
36
+ const key = fileCoverageKey(filePath, root);
37
+ const relative = path.relative(root, key);
38
+ if (relative === '' || relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
39
+ continue;
40
+ keys.set(filePath, key);
41
+ spellings.set(key, (spellings.get(key) ?? 0) + 1);
42
+ }
43
+ for (const [filePath, key] of keys) {
44
+ if ((spellings.get(key) ?? 0) > 1)
45
+ keys.delete(filePath);
46
+ }
47
+ return keys;
48
+ }
20
49
  /** Read the canonical key first, then a measured legacy relative key if present. */
21
50
  export function fileCoverageLookupKeys(filePath, projectRoot) {
22
51
  const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
@@ -11,7 +11,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
11
11
  import { writeQualityEvidence, writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
12
12
  import { measuredCoverageSummary } from '../../quality-assessment/coverage-report-event.js';
13
13
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
14
- import { collectedMetrics, collectedSummary, fileCoverageKey } from '../collected-metrics.js';
14
+ import { collectedMetrics, collectedSummary, projectFileCoverageKeys } from '../collected-metrics.js';
15
15
  /**
16
16
  * Whether an analyze request carries instrumented (measured) coverage (#1008).
17
17
  * Fail-closed: an explicit `request.measured` wins; otherwise only data a
@@ -510,7 +510,11 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
510
510
  * (The vector index via storeVector is kept for similarity search.)
511
511
  */
512
512
  async storeFileCoverageKV(files, projectRoot, runStatus) {
513
+ const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
513
514
  for (const file of files) {
515
+ const key = keys.get(file.path);
516
+ if (!key)
517
+ continue;
514
518
  try {
515
519
  // #1014: a metric with no data is null (not collected), never 0%.
516
520
  const pct = (m) => m.total > 0 ? Math.round((m.covered / m.total) * 10000) / 100 : null;
@@ -518,7 +522,7 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
518
522
  continue;
519
523
  // #1014: stamped, so readers can tell it from legacy unstamped
520
524
  // estimate records written by <= 3.15.4.
521
- await this.memory.set(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, {
525
+ await this.memory.set(`coverage:file:${key}`, {
522
526
  line: pct(file.lines),
523
527
  branch: pct(file.branches),
524
528
  function: pct(file.functions),
@@ -533,11 +537,15 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
533
537
  }
534
538
  }
535
539
  async indexFileCoverageVectors(files, projectRoot) {
540
+ const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
536
541
  for (const file of files) {
542
+ const key = keys.get(file.path);
543
+ if (!key)
544
+ continue;
537
545
  try {
538
546
  // Create a vector representation of the file coverage
539
547
  const embedding = this.createCoverageEmbedding(file);
540
- await this.memory.storeVector(`coverage:file:${fileCoverageKey(file.path, projectRoot)}`, embedding, {
548
+ await this.memory.storeVector(`coverage:file:${key}`, embedding, {
541
549
  path: file.path,
542
550
  lineCoverage: file.lines.covered / (file.lines.total || 1),
543
551
  branchCoverage: file.branches.covered / (file.branches.total || 1),
@@ -129,6 +129,8 @@ export interface CoverageReport {
129
129
  files: Map<string, FileCoverageData>;
130
130
  /** Summary statistics */
131
131
  summary: CoverageSummary;
132
+ /** Parts of the report that could not be attributed and are not in `files` (#1232). */
133
+ warnings?: string[];
132
134
  }
133
135
  /**
134
136
  * Summary statistics for entire coverage report
@@ -461,12 +461,20 @@ export function parseDotcoverContent(content, projectRoot) {
461
461
  // Parse <Statement> elements to build per-file coverage
462
462
  const stmtPattern = /<Statement\s+FileIndex="(\d+)"\s+Line="(\d+)"\s+Column="\d+"\s+EndLine="\d+"\s+EndColumn="\d+"\s+Covered="(\w+)"\s*\/>/g;
463
463
  const fileData = new Map();
464
+ // #1232: statements whose FileIndex is not in the file table, by index; never named after a made-up file.
465
+ const unknownIndices = new Map();
466
+ let statementCount = 0;
464
467
  let sm;
465
468
  while ((sm = stmtPattern.exec(content)) !== null) {
469
+ statementCount++;
466
470
  const fileIdx = sm[1];
467
471
  const lineNum = parseInt(sm[2], 10);
468
472
  const isCovered = sm[3] === 'True';
469
- const filePath = fileIndex.get(fileIdx) || `file-${fileIdx}`;
473
+ const filePath = fileIndex.get(fileIdx);
474
+ if (!filePath) {
475
+ unknownIndices.set(fileIdx, (unknownIndices.get(fileIdx) ?? 0) + 1);
476
+ continue;
477
+ }
470
478
  if (!fileData.has(filePath)) {
471
479
  fileData.set(filePath, { lineDetails: new Map(), total: 0, covered: 0 });
472
480
  }
@@ -476,14 +484,21 @@ export function parseDotcoverContent(content, projectRoot) {
476
484
  if (isCovered)
477
485
  data.covered++;
478
486
  }
487
+ const warnings = [];
488
+ if (unknownIndices.size > 0) {
489
+ const skipped = [...unknownIndices.values()].reduce((sum, n) => sum + n, 0);
490
+ warnings.push(`dotCover report references FileIndex ${[...unknownIndices.keys()].join(', ')} missing from its file table; ` +
491
+ `${skipped} statement(s) skipped and their coverage is not reported`);
492
+ }
479
493
  // If no Statement elements found, parse from CoveredStatements/TotalStatements attributes
480
- if (fileData.size === 0) {
494
+ if (statementCount === 0) {
481
495
  const rootPattern = /CoveredStatements="(\d+)"\s+TotalStatements="(\d+)"/;
482
496
  const rootMatch = rootPattern.exec(content);
483
497
  if (rootMatch) {
484
498
  const covered = parseInt(rootMatch[1], 10);
485
499
  const total = parseInt(rootMatch[2], 10);
486
500
  const filePath = path.join(projectRoot, 'aggregate');
501
+ warnings.push("dotCover report has no per-file statements; report totals are listed under 'aggregate', which is not a project file");
487
502
  files.set(filePath, {
488
503
  path: filePath,
489
504
  relativePath: 'aggregate',
@@ -526,6 +541,7 @@ export function parseDotcoverContent(content, projectRoot) {
526
541
  language: 'csharp',
527
542
  files,
528
543
  summary: calculateSummary(files),
544
+ ...(warnings.length > 0 ? { warnings } : {}),
529
545
  };
530
546
  }
531
547
  // ============================================================================