agentic-qe 3.15.10 → 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 (536) hide show
  1. package/.claude/hooks/aqe-hook.cjs +38 -2
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +263 -0
  4. package/README.md +8 -0
  5. package/assets/skills/skills-manifest.json +1 -1
  6. package/dist/adapters/a2a/agent-cards/generator.js +6 -3
  7. package/dist/adapters/a2a/tasks/task-router.js +3 -1
  8. package/dist/adapters/trajectory-adapter.js +1 -1
  9. package/dist/agents/claim-verifier/verifiers/output-verifier.d.ts +3 -1
  10. package/dist/agents/claim-verifier/verifiers/output-verifier.js +31 -2
  11. package/dist/agents/overlay-loader.js +26 -21
  12. package/dist/cli/bundle.js +6 -6
  13. package/dist/cli/chunks/adapter-HL7MOCQN.js +2 -0
  14. package/dist/cli/chunks/{agent-booster-wasm-H7ANGXW4.js → agent-booster-wasm-5VZCKTIJ.js} +2 -2
  15. package/dist/cli/chunks/{agent-handler-SVXSHEET.js → agent-handler-K3C6CQCD.js} +2 -2
  16. package/dist/cli/chunks/{agent-memory-branch-WKQH36XL.js → agent-memory-branch-NVFQ25WS.js} +2 -2
  17. package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +2 -0
  18. package/dist/cli/chunks/{arena-EKOOFVST.js → arena-QGWIJADQ.js} +2 -2
  19. package/dist/cli/chunks/{arena-OPS36NFZ.js → arena-TSZVDSXS.js} +4 -4
  20. package/dist/cli/chunks/{audit-AO5NDZRI.js → audit-KIEE2SHJ.js} +3 -3
  21. package/dist/cli/chunks/base-WIM7G3HC.js +2 -0
  22. package/dist/cli/chunks/{better-sqlite3-TFLVEMMY.js → better-sqlite3-BNB32NW3.js} +2 -2
  23. package/dist/cli/chunks/{brain-handler-ADBBJPYW.js → brain-handler-MPC5SPYI.js} +3 -3
  24. package/dist/cli/chunks/{branch-enumerator-HGHUYYL5.js → branch-enumerator-LZ7UXKAY.js} +2 -2
  25. package/dist/cli/chunks/{browser-5LU6P4SZ.js → browser-VDHAW4RK.js} +2 -2
  26. package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +2 -0
  27. package/dist/cli/chunks/{chunk-5LPYV3TK.js → chunk-23PQF7NN.js} +1 -1
  28. package/dist/cli/chunks/{chunk-2ZMF4NCF.js → chunk-26672ISV.js} +2 -2
  29. package/dist/cli/chunks/{chunk-U53ZB4IX.js → chunk-2ASQRBK2.js} +2 -2
  30. package/dist/cli/chunks/{chunk-7PJIR4ST.js → chunk-2E2QO44T.js} +2 -2
  31. package/dist/cli/chunks/{chunk-2T7RRL6G.js → chunk-2IVE5AR3.js} +1 -1
  32. package/dist/cli/chunks/{chunk-B6LTH6YV.js → chunk-2JYUA27M.js} +1 -1
  33. package/dist/cli/chunks/{chunk-PFG6VQ5Z.js → chunk-2PPSS4JD.js} +2 -2
  34. package/dist/cli/chunks/{chunk-NZYLNXT6.js → chunk-32UTHIY5.js} +5 -5
  35. package/dist/cli/chunks/{chunk-5E6GHSTY.js → chunk-33I2ZP6E.js} +2 -2
  36. package/dist/cli/chunks/{chunk-XLZYRTNO.js → chunk-35MIUSXQ.js} +2 -2
  37. package/dist/cli/chunks/{chunk-7LFZ4CHM.js → chunk-35NW676P.js} +2 -2
  38. package/dist/cli/chunks/{chunk-4G63WT4F.js → chunk-3EWQN37E.js} +2 -2
  39. package/dist/cli/chunks/{chunk-GZLZCZ42.js → chunk-3IU4LDZR.js} +2 -2
  40. package/dist/cli/chunks/{chunk-CESIR27V.js → chunk-47RMGDG4.js} +2 -2
  41. package/dist/cli/chunks/chunk-4A76VPU4.js +3 -0
  42. package/dist/cli/chunks/{chunk-DT7SIJOA.js → chunk-4CB3QPZM.js} +2 -2
  43. package/dist/cli/chunks/{chunk-ERQKYIP7.js → chunk-4HWUECVD.js} +5 -5
  44. package/dist/cli/chunks/{chunk-MA7JIQ6U.js → chunk-4KUOYDY2.js} +5 -5
  45. package/dist/cli/chunks/{chunk-VWNFAW2M.js → chunk-4LWMAAWK.js} +2 -2
  46. package/dist/cli/chunks/{chunk-IKISCIGH.js → chunk-4PU5GTZW.js} +2 -2
  47. package/dist/cli/chunks/{chunk-ZXPY654C.js → chunk-4SA7M34P.js} +1 -1
  48. package/dist/cli/chunks/{chunk-NGKNYIQZ.js → chunk-4Y6OEBJZ.js} +1 -1
  49. package/dist/cli/chunks/{chunk-KOBVYY6H.js → chunk-5A66EGEW.js} +2 -2
  50. package/dist/cli/chunks/{chunk-Z2O2YJAF.js → chunk-5ADXFUMO.js} +2 -2
  51. package/dist/cli/chunks/{chunk-YKMU4LBV.js → chunk-5S4UIDFK.js} +1 -1
  52. package/dist/cli/chunks/{chunk-Z7IYW5U7.js → chunk-5TAEW5OV.js} +1 -1
  53. package/dist/cli/chunks/chunk-5Z23ZMXZ.js +742 -0
  54. package/dist/cli/chunks/{chunk-6TB6YOCZ.js → chunk-65TH6RPD.js} +1 -1
  55. package/dist/cli/chunks/{chunk-3Y7SPD72.js → chunk-66PXR3NI.js} +2 -2
  56. package/dist/cli/chunks/{chunk-3P34JFQH.js → chunk-6E6HB4N4.js} +14 -14
  57. package/dist/cli/chunks/{chunk-6PX4OXQO.js → chunk-6QRI3JVE.js} +2 -2
  58. package/dist/cli/chunks/{chunk-WBM6N6IM.js → chunk-7DNR4KKR.js} +1 -1
  59. package/dist/cli/chunks/{chunk-6XCMKIZN.js → chunk-7JFDLL2F.js} +1 -1
  60. package/dist/cli/chunks/chunk-7OEFBWAG.js +5 -0
  61. package/dist/cli/chunks/{chunk-Y76IAYQD.js → chunk-7QEUHNKO.js} +1 -1
  62. package/dist/cli/chunks/{chunk-WQ4PYWSW.js → chunk-7TA5MUPW.js} +1 -1
  63. package/dist/cli/chunks/{chunk-2XGVTYVX.js → chunk-A2JCRXTK.js} +2 -2
  64. package/dist/cli/chunks/{chunk-ESUO3GTJ.js → chunk-A5Y7DAVQ.js} +2 -2
  65. package/dist/cli/chunks/{chunk-ATHWDAXB.js → chunk-ADUAJIAU.js} +2 -2
  66. package/dist/cli/chunks/{chunk-IU2IV4NE.js → chunk-AJEXPFAB.js} +1 -1
  67. package/dist/cli/chunks/{chunk-YK7JN5N7.js → chunk-BC4T6SCV.js} +4 -4
  68. package/dist/cli/chunks/{chunk-KSIWGGJI.js → chunk-BMG2JLSQ.js} +2 -2
  69. package/dist/cli/chunks/chunk-BOSMELJX.js +180 -0
  70. package/dist/cli/chunks/{chunk-7OZVZIBE.js → chunk-BYRCB5JT.js} +2 -2
  71. package/dist/cli/chunks/{chunk-FAUCT5KR.js → chunk-C3YOVASQ.js} +6 -5
  72. package/dist/cli/chunks/{chunk-DMFTELBS.js → chunk-C74M4WUI.js} +2 -2
  73. package/dist/cli/chunks/{chunk-2SXBBUM6.js → chunk-CA5UNWQF.js} +2 -2
  74. package/dist/cli/chunks/{chunk-UCJMVXO4.js → chunk-CDA5Z74H.js} +2 -2
  75. package/dist/cli/chunks/{chunk-NVYIZCSR.js → chunk-CPIBIR3X.js} +2 -2
  76. package/dist/cli/chunks/{chunk-YK3BVZY6.js → chunk-CU36D7TN.js} +2 -2
  77. package/dist/cli/chunks/{chunk-H32EPIR2.js → chunk-DAUEK66C.js} +1 -1
  78. package/dist/cli/chunks/{chunk-6KIL6CMD.js → chunk-DRCBRUGN.js} +2 -2
  79. package/dist/cli/chunks/{chunk-EWFECZ2U.js → chunk-DZGPUGUG.js} +2 -2
  80. package/dist/cli/chunks/{chunk-YDAQK5UF.js → chunk-EF6OERRR.js} +1 -1
  81. package/dist/cli/chunks/{chunk-KG336OV3.js → chunk-EN7GRVEQ.js} +2 -2
  82. package/dist/cli/chunks/{chunk-DBMNJSBV.js → chunk-ENGL7FIJ.js} +1 -1
  83. package/dist/cli/chunks/{chunk-FKL3R5JQ.js → chunk-FAGKBOX2.js} +2 -2
  84. package/dist/cli/chunks/{chunk-NAXGWDVM.js → chunk-FNUFTWEO.js} +3 -3
  85. package/dist/cli/chunks/{chunk-RWWOHCMG.js → chunk-FZJCBSN4.js} +2 -2
  86. package/dist/cli/chunks/{chunk-ABFFWZPC.js → chunk-G24SWTAX.js} +151 -149
  87. package/dist/cli/chunks/{chunk-ODJNUMV3.js → chunk-G3AABG4Q.js} +2 -2
  88. package/dist/cli/chunks/{chunk-FBXTQNRH.js → chunk-GJKZ7UQO.js} +2 -2
  89. package/dist/cli/chunks/{chunk-DEF34AFL.js → chunk-GKFV6CUD.js} +2 -2
  90. package/dist/cli/chunks/{chunk-SY2IB442.js → chunk-HLGFHHWV.js} +2 -2
  91. package/dist/cli/chunks/{chunk-CZGOSJQ4.js → chunk-HM3LSFTY.js} +2 -2
  92. package/dist/cli/chunks/chunk-HSA5IGGW.js +2 -0
  93. package/dist/cli/chunks/{chunk-GJHWY3ZX.js → chunk-HZBXJFGN.js} +2 -2
  94. package/dist/cli/chunks/chunk-IA55PFLG.js +7 -0
  95. package/dist/cli/chunks/{chunk-MNN5J4GU.js → chunk-ICKUINKD.js} +2 -2
  96. package/dist/cli/chunks/{chunk-XEB3NLJR.js → chunk-IETBWYHW.js} +2 -2
  97. package/dist/cli/chunks/{chunk-A55QKKT2.js → chunk-IL7GQNNE.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LRZY4KS2.js → chunk-INZARYUD.js} +2 -2
  99. package/dist/cli/chunks/{chunk-OBAREPDC.js → chunk-IPA7K556.js} +2 -2
  100. package/dist/cli/chunks/{chunk-CFBEBXLO.js → chunk-IVTQF55W.js} +3 -3
  101. package/dist/cli/chunks/{chunk-FFTPAWM6.js → chunk-J7Y7ZBIT.js} +8 -8
  102. package/dist/cli/chunks/{chunk-I33O4BRQ.js → chunk-JGIJPDGD.js} +2 -2
  103. package/dist/cli/chunks/chunk-JNXK47OL.js +2 -0
  104. package/dist/cli/chunks/{chunk-PCEW6Q2C.js → chunk-JOWUS2X5.js} +1 -1
  105. package/dist/cli/chunks/{chunk-KI73QCR5.js → chunk-JR6CUKAI.js} +2 -2
  106. package/dist/cli/chunks/chunk-JRYWLOBD.js +21 -0
  107. package/dist/cli/chunks/{chunk-SO45NA4D.js → chunk-JW5PDJ5O.js} +11 -11
  108. package/dist/cli/chunks/{chunk-APSRPR4W.js → chunk-K3A3NWT3.js} +2 -2
  109. package/dist/cli/chunks/{chunk-FESZBPUB.js → chunk-KA5SHLMW.js} +2 -2
  110. package/dist/cli/chunks/{chunk-OPFGRS5S.js → chunk-KGA7VAI4.js} +2 -2
  111. package/dist/cli/chunks/chunk-KJDI5CHX.js +2 -0
  112. package/dist/cli/chunks/{chunk-V2RSNVMW.js → chunk-L3PV7VXK.js} +1 -1
  113. package/dist/cli/chunks/{chunk-C522H7XR.js → chunk-L7NGKANW.js} +32 -32
  114. package/dist/cli/chunks/{chunk-DNRWGATA.js → chunk-LFBA735S.js} +7 -7
  115. package/dist/cli/chunks/{chunk-V2M2XCR5.js → chunk-MAJXZYGK.js} +1 -1
  116. package/dist/cli/chunks/{chunk-FZOWULMH.js → chunk-MCPEC6OO.js} +1 -1
  117. package/dist/cli/chunks/{chunk-LMS3Y7JD.js → chunk-MCPXNUDK.js} +2 -2
  118. package/dist/cli/chunks/{chunk-GWZZ7DAO.js → chunk-MMEALJ4D.js} +2 -2
  119. package/dist/cli/chunks/{chunk-G3CZCUPM.js → chunk-MYF5CNGV.js} +2 -2
  120. package/dist/cli/chunks/{chunk-NNFZUTDH.js → chunk-MYUMJ2ZI.js} +1 -1
  121. package/dist/cli/chunks/{chunk-WDQ7IEZY.js → chunk-N7O3PF6Y.js} +2 -2
  122. package/dist/cli/chunks/{chunk-YAKGBHO4.js → chunk-NA3F6FEO.js} +2 -2
  123. package/dist/cli/chunks/chunk-NNBQZR73.js +6 -0
  124. package/dist/cli/chunks/{chunk-6C3II5OM.js → chunk-NV74SICL.js} +2 -2
  125. package/dist/cli/chunks/chunk-NVRYELCY.js +13 -0
  126. package/dist/cli/chunks/{chunk-UHTTW3IT.js → chunk-NX4BCSOZ.js} +2 -2
  127. package/dist/cli/chunks/{chunk-EN2QSKFF.js → chunk-O3IM4WRZ.js} +2 -2
  128. package/dist/cli/chunks/{chunk-S75EYIJG.js → chunk-O4QJMANM.js} +1 -1
  129. package/dist/cli/chunks/{chunk-NPPHWFA2.js → chunk-OHVYINGM.js} +18 -18
  130. package/dist/cli/chunks/{chunk-DE4YJQJF.js → chunk-P5E26N2X.js} +2 -2
  131. package/dist/cli/chunks/chunk-P7UFJ6DO.js +14 -0
  132. package/dist/cli/chunks/{chunk-XFVTGAAJ.js → chunk-PGSJBXTD.js} +2 -2
  133. package/dist/cli/chunks/{chunk-CZ2IF6MC.js → chunk-PT2NXS43.js} +1 -1
  134. package/dist/cli/chunks/{chunk-RK73HB2F.js → chunk-PTBOLBM4.js} +2 -2
  135. package/dist/cli/chunks/{chunk-EAU5KDFO.js → chunk-PX5OPXY6.js} +1 -1
  136. package/dist/cli/chunks/chunk-QCPVUNN3.js +2 -0
  137. package/dist/cli/chunks/{chunk-VKRTTFB6.js → chunk-QSGEBCDB.js} +2 -2
  138. package/dist/cli/chunks/{chunk-SKQUUE4F.js → chunk-QUJJYTJH.js} +2 -2
  139. package/dist/cli/chunks/chunk-QWG3SILX.js +59 -0
  140. package/dist/cli/chunks/{chunk-D6DA2KFD.js → chunk-RCOLPF3B.js} +2 -2
  141. package/dist/cli/chunks/{chunk-SU5H66SD.js → chunk-RYHG3I7J.js} +2 -2
  142. package/dist/cli/chunks/chunk-SBHM5X2S.js +4 -0
  143. package/dist/cli/chunks/{chunk-62OAY5KJ.js → chunk-SDRJJUPO.js} +1 -1
  144. package/dist/cli/chunks/{chunk-FB6TI3BH.js → chunk-SG2TX72G.js} +2 -2
  145. package/dist/cli/chunks/{chunk-H2PYU7MN.js → chunk-SITL5YZV.js} +4 -4
  146. package/dist/cli/chunks/{chunk-AI4VYSFS.js → chunk-SPC4RBLF.js} +2 -2
  147. package/dist/cli/chunks/{chunk-BQUAE3CP.js → chunk-SQVZ3TRU.js} +2 -2
  148. package/dist/cli/chunks/{chunk-TBLI254A.js → chunk-SUX5XB2Z.js} +2 -2
  149. package/dist/cli/chunks/{chunk-VFSYMOAL.js → chunk-T4EN5VVK.js} +2 -2
  150. package/dist/cli/chunks/{chunk-KNQ2ERFX.js → chunk-TGMXUZZC.js} +2 -2
  151. package/dist/cli/chunks/{chunk-7TB6FK4B.js → chunk-TLRHAMX5.js} +1 -1
  152. package/dist/cli/chunks/{chunk-V6JBOIMX.js → chunk-TOWOJGEI.js} +1 -1
  153. package/dist/cli/chunks/{chunk-JHIY4VCC.js → chunk-TSOQ2QLT.js} +3 -3
  154. package/dist/cli/chunks/{chunk-YYTGXD3R.js → chunk-TVA5GRIU.js} +2 -2
  155. package/dist/cli/chunks/{chunk-6MVVSSID.js → chunk-TXEUVUMO.js} +1 -1
  156. package/dist/cli/chunks/{chunk-7ZCDZHDB.js → chunk-U6IXYQO4.js} +2 -2
  157. package/dist/cli/chunks/{chunk-NW5JUCCG.js → chunk-U7ZHDGXG.js} +1 -1
  158. package/dist/cli/chunks/{chunk-UARKIZAS.js → chunk-UCSK2RMI.js} +2 -2
  159. package/dist/cli/chunks/{chunk-RPHY2DU6.js → chunk-UIKQPO4Y.js} +2 -2
  160. package/dist/cli/chunks/chunk-UJNGGFGX.js +2 -0
  161. package/dist/cli/chunks/{chunk-EDLFX4ZB.js → chunk-ULCW6IVQ.js} +2 -2
  162. package/dist/cli/chunks/{chunk-M2QV7PT7.js → chunk-UREDS662.js} +2 -2
  163. package/dist/cli/chunks/{chunk-MG27QY4D.js → chunk-URSTP3WI.js} +2 -2
  164. package/dist/cli/chunks/{chunk-2ZI5FKSF.js → chunk-UUZZXHUF.js} +2 -2
  165. package/dist/cli/chunks/{chunk-IPJ7Q3AJ.js → chunk-UZED4YZ5.js} +1 -1
  166. package/dist/cli/chunks/{chunk-VFKF2XO7.js → chunk-VF7FTD64.js} +1 -1
  167. package/dist/cli/chunks/{chunk-YCGP5VFP.js → chunk-VUR5THML.js} +2 -2
  168. package/dist/cli/chunks/{chunk-WDVRE6GN.js → chunk-VXVTFKRA.js} +2 -2
  169. package/dist/cli/chunks/chunk-VZBC6DP7.js +2 -0
  170. package/dist/cli/chunks/{chunk-GHBNRMSJ.js → chunk-W4II6SIH.js} +2 -2
  171. package/dist/cli/chunks/{chunk-TNMBRDCA.js → chunk-W5HQIYQU.js} +3 -3
  172. package/dist/cli/chunks/{chunk-H74Q7TJN.js → chunk-W7H55PY4.js} +1 -1
  173. package/dist/cli/chunks/{chunk-OY2AHLSF.js → chunk-WDEXOLK2.js} +1 -1
  174. package/dist/cli/chunks/{chunk-VJQYDYAJ.js → chunk-WGTEZT7G.js} +2 -2
  175. package/dist/cli/chunks/{chunk-GRCIBCJ2.js → chunk-WLRU6ESI.js} +2 -2
  176. package/dist/cli/chunks/{chunk-ACWFKES2.js → chunk-WTAUF6O4.js} +2 -2
  177. package/dist/cli/chunks/chunk-XCNSGSKV.js +3 -0
  178. package/dist/cli/chunks/{chunk-6S3WJGUV.js → chunk-XZOYKB22.js} +2 -2
  179. package/dist/cli/chunks/chunk-YIDAXOUX.js +8 -0
  180. package/dist/cli/chunks/{chunk-LQEURY7C.js → chunk-YLKIXEPP.js} +1 -1
  181. package/dist/cli/chunks/chunk-YNVEDFPQ.js +2 -0
  182. package/dist/cli/chunks/{chunk-PGYMKGOE.js → chunk-YUA6ZKKY.js} +2 -2
  183. package/dist/cli/chunks/{chunk-GJMLK5UT.js → chunk-YVJEUX3I.js} +2 -2
  184. package/dist/cli/chunks/{chunk-AH3ZD3NJ.js → chunk-YWWMNTBF.js} +2 -2
  185. package/dist/cli/chunks/{chunk-37OWRCUN.js → chunk-ZGROHCOW.js} +2 -2
  186. package/dist/cli/chunks/{chunk-OEKP73MC.js → chunk-ZPVGX4DI.js} +2 -2
  187. package/dist/cli/chunks/{chunk-6GP6W46M.js → chunk-ZROAMFX2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-OY3NJNP2.js → chunk-ZYOYR3UR.js} +1 -1
  189. package/dist/cli/chunks/ci-BZNWW3I3.js +81 -0
  190. package/dist/cli/chunks/{ci-config-7ODMNAUM.js → ci-config-LOHNXOKV.js} +2 -2
  191. package/dist/cli/chunks/{ci-output-FXZ7ZZW3.js → ci-output-LCOQBSJL.js} +2 -2
  192. package/dist/cli/chunks/{circuit-breaker-4VOUEPOX.js → circuit-breaker-7LRXTLFE.js} +2 -2
  193. package/dist/cli/chunks/{claude-flow-setup-7D4SGLM4.js → claude-flow-setup-HBU4VWC3.js} +2 -2
  194. package/dist/cli/chunks/client-4PNYDFYS.js +2 -0
  195. package/dist/cli/chunks/{cline-installer-WRRT7BGQ.js → cline-installer-CO6MLH6X.js} +2 -2
  196. package/dist/cli/chunks/{code-ZDJRIL3S.js → code-SIXBS6JM.js} +3 -3
  197. package/dist/cli/chunks/{code-index-extractor-4S4SHM56.js → code-index-extractor-GWJKZ2IQ.js} +2 -2
  198. package/dist/cli/chunks/{codex-installer-YTRHNDWR.js → codex-installer-6NINVWXJ.js} +2 -2
  199. package/dist/cli/chunks/{completions-6N64JUXJ.js → completions-7VIX3GML.js} +2 -2
  200. package/dist/cli/chunks/{complexity-analyzer-I4A26VCJ.js → complexity-analyzer-FBQR6ZP2.js} +2 -2
  201. package/dist/cli/chunks/{continuedev-installer-IIDR66LB.js → continuedev-installer-VA7RIXW5.js} +2 -2
  202. package/dist/cli/chunks/{copilot-installer-SVVFY3S2.js → copilot-installer-4QEBC4MU.js} +2 -2
  203. package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +2 -0
  204. package/dist/cli/chunks/{cost-tracker-VGFS6IBX.js → cost-tracker-GRYKHPWL.js} +2 -2
  205. package/dist/cli/chunks/coverage-USPMNKOU.js +50 -0
  206. package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +2 -0
  207. package/dist/cli/chunks/{cursor-installer-UPETT57E.js → cursor-installer-ZXIPSZVH.js} +2 -2
  208. package/dist/cli/chunks/{daemon-CQFNZLXU.js → daemon-D7F3RGI5.js} +3 -3
  209. package/dist/cli/chunks/{daemon-7BDJHEIJ.js → daemon-N2VRHPSJ.js} +4 -4
  210. package/dist/cli/chunks/{dag-attention-scheduler-PJVABHON.js → dag-attention-scheduler-NL6BA7BY.js} +2 -2
  211. package/dist/cli/chunks/{detect-56SKAGWX.js → detect-XC2HCIIT.js} +2 -2
  212. package/dist/cli/chunks/{dist-node-UYTYUMLN.js → dist-node-A3Y26MEI.js} +2 -2
  213. package/dist/cli/chunks/{domain-handler-YOYLBYJE.js → domain-handler-WV6SFXRB.js} +2 -2
  214. package/dist/cli/chunks/{domain-plugins-7TARX2XF.js → domain-plugins-KJIF6Z2B.js} +2 -2
  215. package/dist/cli/chunks/{domain-transfer-AKVSBD6E.js → domain-transfer-L3F6AES2.js} +2 -2
  216. package/dist/cli/chunks/dream-QOB3JCOM.js +2 -0
  217. package/dist/cli/chunks/{embed-and-insert-pattern-IS6HSR66.js → embed-and-insert-pattern-PA3Y4KGO.js} +2 -2
  218. package/dist/cli/chunks/{eval-GNB574IM.js → eval-YGEZNUVE.js} +2 -2
  219. package/dist/cli/chunks/{experience-capture-middleware-RCAOCKM7.js → experience-capture-middleware-D4T7NW6B.js} +3 -3
  220. package/dist/cli/chunks/{fast-paths-KTZ5SF54.js → fast-paths-6JYK7RYQ.js} +2 -2
  221. package/dist/cli/chunks/{feature-flags-KFHSR5YF.js → feature-flags-DKXMDVPE.js} +2 -2
  222. package/dist/cli/chunks/{feature-flags-ITX5LQ57.js → feature-flags-RBH2GDSR.js} +2 -2
  223. package/dist/cli/chunks/file-discovery-BN76S2PR.js +2 -0
  224. package/dist/cli/chunks/fleet-43YMXACN.js +46 -0
  225. package/dist/cli/chunks/{gnn-wrapper-RLFW3GSX.js → gnn-wrapper-MV54UC4C.js} +2 -2
  226. package/dist/cli/chunks/{heartbeat-handler-EM2URCYZ.js → heartbeat-handler-7DKMVQQH.js} +4 -4
  227. package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +2 -0
  228. package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +2 -0
  229. package/dist/cli/chunks/hnsw-index-HE4AX22U.js +2 -0
  230. package/dist/cli/chunks/{hnsw-legacy-bridge-JMHEOIBH.js → hnsw-legacy-bridge-6IWREDQC.js} +2 -2
  231. package/dist/cli/chunks/{hnswlib-node-CBP73QHY.js → hnswlib-node-5BIESSCK.js} +2 -2
  232. package/dist/cli/chunks/{hooks-IP7XE34Z.js → hooks-3EETRM62.js} +30 -30
  233. package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +2 -0
  234. package/dist/cli/chunks/{hypergraph-engine-ONAYHU25.js → hypergraph-engine-RSWCB2D3.js} +2 -2
  235. package/dist/cli/chunks/{hypergraph-handler-VINJRAID.js → hypergraph-handler-552LXKL3.js} +3 -3
  236. package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +2 -0
  237. package/dist/cli/chunks/{init-guard-RYVV5R3Z.js → init-guard-OTDBJ5HD.js} +2 -2
  238. package/dist/cli/chunks/{init-handler-MPRGWMOE.js → init-handler-3FK3TKEA.js} +26 -25
  239. package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +2 -0
  240. package/dist/cli/chunks/kernel-2WZOQEZS.js +2 -0
  241. package/dist/cli/chunks/{kilocode-installer-OPD7JBRL.js → kilocode-installer-KZ2O4LF3.js} +2 -2
  242. package/dist/cli/chunks/{kiro-installer-M4OPUNK2.js → kiro-installer-MLCCXRF7.js} +2 -2
  243. package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +2 -0
  244. package/dist/cli/chunks/{learning-4UWTQLMF.js → learning-QUCMBD77.js} +3 -3
  245. package/dist/cli/chunks/{llm-router-SQ56FF6Z.js → llm-router-PDEV3UP2.js} +4 -4
  246. package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +2 -0
  247. package/dist/cli/chunks/{load-HPHKDGGL.js → load-XFVVLO7E.js} +2 -2
  248. package/dist/cli/chunks/load-test-BEWEE44J.js +2 -0
  249. package/dist/cli/chunks/{mcp-TELMAC7Z.js → mcp-74G3CL2S.js} +2 -2
  250. package/dist/cli/chunks/{memory-PFQ3KPVJ.js → memory-XIFM6JNX.js} +5 -5
  251. package/dist/cli/chunks/memory-backend-NYKBBKZR.js +2 -0
  252. package/dist/cli/chunks/memory-handlers-ZCKURV6S.js +2 -0
  253. package/dist/cli/chunks/{multi-model-executor-3VDRX6TZ.js → multi-model-executor-7L4W3O2Q.js} +2 -2
  254. package/dist/cli/chunks/{opencode-installer-PJ576R63.js → opencode-installer-BPG422LF.js} +2 -2
  255. package/dist/cli/chunks/{orchestrator-72QP4UU7.js → orchestrator-OEAFLAEV.js} +61 -23
  256. package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +2 -0
  257. package/dist/cli/chunks/{pattern-usage-recorder-754YQW7C.js → pattern-usage-recorder-LOPNCULT.js} +2 -2
  258. package/dist/cli/chunks/{pipeline-AVXY4MVB.js → pipeline-VWTYUZB7.js} +2 -2
  259. package/dist/cli/chunks/{platform-3E3DXLYB.js → platform-WFJJ3X2E.js} +2 -2
  260. package/dist/cli/chunks/{plugin-7FUQAKRE.js → plugin-744TPUSG.js} +2 -2
  261. package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIB4F5NV.js → prime-radiant-advanced-wasm-BD5BLNDR.js} +2 -2
  262. package/dist/cli/chunks/project-root-C7ELXZRK.js +2 -0
  263. package/dist/cli/chunks/protocol-executor-SUVE33BM.js +2 -0
  264. package/dist/cli/chunks/{protocol-handler-BQRYMUTG.js → protocol-handler-JIBILI74.js} +2 -2
  265. package/dist/cli/chunks/{prove-H52QGC6B.js → prove-MNOL5FYW.js} +2 -2
  266. package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +2 -0
  267. package/dist/cli/chunks/{quality-QO4XPAUM.js → quality-JEGBDGGX.js} +2 -2
  268. package/dist/cli/chunks/{quality-gate-FBKE5E6F.js → quality-gate-SYJ6ROMI.js} +3 -3
  269. package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +2 -0
  270. package/dist/cli/chunks/real-embeddings-ZWXS5ZFV.js +2 -0
  271. package/dist/cli/chunks/{ref-validation-LF76ZOBD.js → ref-validation-RRHUFW2N.js} +2 -2
  272. package/dist/cli/chunks/{roocode-installer-3BYEBTQ7.js → roocode-installer-XFO6JSVN.js} +2 -2
  273. package/dist/cli/chunks/router-4FTAVYLJ.js +2 -0
  274. package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +2 -0
  275. package/dist/cli/chunks/{routing-handler-DST7BVCU.js → routing-handler-L2K3JASE.js} +2 -2
  276. package/dist/cli/chunks/{ruvector-commands-XE32PGKC.js → ruvector-commands-A6CINHGM.js} +2 -2
  277. package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +2 -0
  278. package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +2 -0
  279. package/dist/cli/chunks/{rvf-migration-coordinator-VP32XC75.js → rvf-migration-coordinator-T4RY7L53.js} +2 -2
  280. package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +2 -0
  281. package/dist/cli/chunks/{rvf-store-integrity-SH2AMVI7.js → rvf-store-integrity-IR33TGQS.js} +2 -2
  282. package/dist/cli/chunks/safe-db-QXDZ6QY3.js +2 -0
  283. package/dist/cli/chunks/schedule-CZKD6RIY.js +2 -0
  284. package/dist/cli/chunks/scheduler-BLA3Q4CH.js +2 -0
  285. package/dist/cli/chunks/{security-VSPNKCDS.js → security-Z5GDE2IH.js} +3 -3
  286. package/dist/cli/chunks/{shared-rvf-adapter-HX6AHL3P.js → shared-rvf-adapter-SIZMEHPM.js} +2 -2
  287. package/dist/cli/chunks/{shared-rvf-dual-writer-MX4FC2JE.js → shared-rvf-dual-writer-HLM65RDS.js} +2 -2
  288. package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +2 -0
  289. package/dist/cli/chunks/{standalone-memory-O4QUTK6L.js → standalone-memory-SKSZG7P5.js} +2 -2
  290. package/dist/cli/chunks/{status-handler-Z2BP6EOG.js → status-handler-766YOOMJ.js} +2 -2
  291. package/dist/cli/chunks/{structural-health-R36WNLQG.js → structural-health-M45FNOLT.js} +2 -2
  292. package/dist/cli/chunks/{sync-QF5Y3EMZ.js → sync-6CJ24B5T.js} +2 -2
  293. package/dist/cli/chunks/{sync-2ELWUFQU.js → sync-B2U366I3.js} +2 -2
  294. package/dist/cli/chunks/{task-handler-43PYE75J.js → task-handler-P6IFLCKP.js} +17 -15
  295. package/dist/cli/chunks/task-handlers-DPWMUKFC.js +9 -0
  296. package/dist/cli/chunks/{test-UWA377D4.js → test-TODH7KRF.js} +11 -11
  297. package/dist/cli/chunks/test-runner-process-46IPK3GH.js +2 -0
  298. package/dist/cli/chunks/{test-scheduling-YQZPJRRN.js → test-scheduling-VMVMVRHT.js} +3 -3
  299. package/dist/cli/chunks/{token-bootstrap-F7C6UKTC.js → token-bootstrap-XQW7BMCK.js} +2 -2
  300. package/dist/cli/chunks/{token-usage-DO6WLMXP.js → token-usage-JCZEIRKO.js} +2 -2
  301. package/dist/cli/chunks/{transformers-H5RGFKVO.js → transformers-U2ML3OHE.js} +2 -2
  302. package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +2 -0
  303. package/dist/cli/chunks/{types-PJS2FGPF.js → types-GGEPCHP6.js} +2 -2
  304. package/dist/cli/chunks/unified-memory-FL26RTV3.js +2 -0
  305. package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +2 -0
  306. package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +2 -0
  307. package/dist/cli/chunks/{upgrade-4IC4F6AB.js → upgrade-T5GRM7HS.js} +2 -2
  308. package/dist/cli/chunks/{validate-DHUWW7PF.js → validate-XMUJPLP3.js} +2 -2
  309. package/dist/cli/chunks/{validate-swarm-OERQNOX5.js → validate-swarm-KJLF7JEH.js} +2 -2
  310. package/dist/cli/chunks/visual-security-IJVPO5FA.js +2 -0
  311. package/dist/cli/chunks/{web-tree-sitter-TV7DMKES.js → web-tree-sitter-LOHVZ7G5.js} +2 -2
  312. package/dist/cli/chunks/{windsurf-installer-QZPWSH37.js → windsurf-installer-33FBTXJU.js} +2 -2
  313. package/dist/cli/chunks/witness-chain-5FAFCQKP.js +2 -0
  314. package/dist/cli/chunks/witness-chain-V2M32W5D.js +2 -0
  315. package/dist/cli/chunks/{witness-chain-repair-RUXIOE7F.js → witness-chain-repair-VWBO4NXE.js} +2 -2
  316. package/dist/cli/chunks/{witness-chain-verifier-YXENHB42.js → witness-chain-verifier-BHJ3ZAEK.js} +2 -2
  317. package/dist/cli/chunks/{witness-key-manager-HL26AGFO.js → witness-key-manager-WNVPH2Z3.js} +2 -2
  318. package/dist/cli/chunks/{workflow-EOVVCN2E.js → workflow-6QR5MQTO.js} +4 -4
  319. package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +2 -0
  320. package/dist/cli/chunks/{wrappers-AGODHBOO.js → wrappers-EHOL62TS.js} +2 -2
  321. package/dist/cli/commands/ci.js +7 -0
  322. package/dist/cli/commands/coverage.js +7 -1
  323. package/dist/cli/commands/fleet.js +5 -2
  324. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +4 -3
  325. package/dist/cli/commands/hooks-handlers/stats-hooks.js +22 -4
  326. package/dist/cli/commands/hooks-handlers/tool-loop-guardrail.js +11 -6
  327. package/dist/cli/commands/test.js +5 -2
  328. package/dist/cli/handlers/init-handler.d.ts +12 -0
  329. package/dist/cli/handlers/init-handler.js +27 -12
  330. package/dist/cli/handlers/task-handler.js +6 -0
  331. package/dist/cli/utils/ci-output.d.ts +2 -0
  332. package/dist/cli/utils/ci-output.js +2 -0
  333. package/dist/cli/utils/coverage-verdict.d.ts +11 -2
  334. package/dist/cli/utils/coverage-verdict.js +26 -6
  335. package/dist/cli/utils/fleet-operation.d.ts +5 -0
  336. package/dist/cli/utils/fleet-operation.js +7 -1
  337. package/dist/cli/utils/fleet-result.d.ts +5 -3
  338. package/dist/cli/utils/fleet-result.js +9 -3
  339. package/dist/cli/utils/progress.d.ts +16 -2
  340. package/dist/cli/utils/progress.js +31 -14
  341. package/dist/coordination/consensus/consensus-engine.js +3 -1
  342. package/dist/coordination/handlers/code-intelligence-handlers.js +3 -2
  343. package/dist/coordination/handlers/coverage-collection.d.ts +2 -0
  344. package/dist/coordination/handlers/coverage-collection.js +5 -2
  345. package/dist/coordination/handlers/coverage-evidence.d.ts +75 -0
  346. package/dist/coordination/handlers/coverage-evidence.js +159 -0
  347. package/dist/coordination/handlers/coverage-handlers.js +16 -3
  348. package/dist/coordination/handlers/coverage-runner.d.ts +3 -8
  349. package/dist/coordination/handlers/coverage-runner.js +6 -22
  350. package/dist/coordination/handlers/coverage-scope.d.ts +40 -0
  351. package/dist/coordination/handlers/coverage-scope.js +321 -0
  352. package/dist/coordination/handlers/coverage-stderr.d.ts +23 -0
  353. package/dist/coordination/handlers/coverage-stderr.js +39 -0
  354. package/dist/coordination/handlers/coverage-target.d.ts +9 -0
  355. package/dist/coordination/handlers/coverage-target.js +21 -8
  356. package/dist/coordination/handlers/handler-utils.d.ts +5 -0
  357. package/dist/coordination/handlers/handler-utils.js +11 -5
  358. package/dist/coordination/handlers/requirements-handlers.js +3 -2
  359. package/dist/coordination/handlers/security-handlers.js +34 -20
  360. package/dist/coordination/queen-coordinator.js +8 -3
  361. package/dist/coordination/task-executability.d.ts +12 -0
  362. package/dist/coordination/task-executability.js +27 -0
  363. package/dist/coordination/workflow-orchestrator.d.ts +6 -0
  364. package/dist/coordination/workflow-orchestrator.js +22 -8
  365. package/dist/domains/code-intelligence/services/metric-collector/listing-process-owner.js +4 -1
  366. package/dist/domains/code-intelligence/services/product-factors-bridge.js +7 -4
  367. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -0
  368. package/dist/domains/code-intelligence/services/semantic-analyzer.js +10 -7
  369. package/dist/domains/coverage-analysis/services/coverage-parser.js +19 -10
  370. package/dist/domains/learning-optimization/interfaces.d.ts +2 -0
  371. package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -1
  372. package/dist/domains/learning-optimization/services/metrics-optimizer.js +14 -4
  373. package/dist/domains/learning-optimization/services/production-intel.js +3 -1
  374. package/dist/domains/security-compliance/generic-finding-dedup.d.ts +40 -0
  375. package/dist/domains/security-compliance/generic-finding-dedup.js +63 -0
  376. package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +14 -6
  377. package/dist/domains/security-compliance/services/scanners/sast-scanner.js +4 -2
  378. package/dist/domains/security-compliance/services/security-auditor-sast.js +2 -2
  379. package/dist/domains/security-compliance/services/security-auditor-secrets.js +2 -2
  380. package/dist/domains/security-compliance/services/security-auditor.js +3 -2
  381. package/dist/domains/test-execution/coordinator.d.ts +2 -1
  382. package/dist/domains/test-execution/coordinator.js +5 -14
  383. package/dist/domains/test-execution/interfaces.d.ts +11 -1
  384. package/dist/domains/test-execution/services/retry-outcome.d.ts +18 -0
  385. package/dist/domains/test-execution/services/retry-outcome.js +53 -0
  386. package/dist/domains/test-generation/coordinator.js +2 -2
  387. package/dist/domains/test-generation/services/pattern-matcher.js +4 -4
  388. package/dist/domains/test-generation/services/test-generator.js +2 -2
  389. package/dist/governance/evolution-pipeline-integration.js +3 -1
  390. package/dist/hooks/cross-phase-hooks.js +3 -1
  391. package/dist/init/init-wizard-steps.js +5 -1
  392. package/dist/init/phases/04-database.js +7 -0
  393. package/dist/init/phases/10-workers.js +42 -4
  394. package/dist/init/phases/12-verification.js +14 -4
  395. package/dist/init/settings-merge.js +7 -4
  396. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +29 -0
  397. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +70 -6
  398. package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +10 -3
  399. package/dist/integrations/agentic-flow/reasoning-bank/index.js +13 -0
  400. package/dist/integrations/ruvector/filter-adapter.js +2 -1
  401. package/dist/learning/dream/insight-generator.js +5 -4
  402. package/dist/learning/embedder-endpoint-client.d.ts +8 -0
  403. package/dist/learning/embedder-endpoint-client.js +20 -0
  404. package/dist/learning/embedder-recovery.d.ts +63 -0
  405. package/dist/learning/embedder-recovery.js +94 -0
  406. package/dist/learning/memory-auditor.js +3 -1
  407. package/dist/learning/qe-patterns.js +2 -1
  408. package/dist/learning/qe-reasoning-bank-types.d.ts +5 -0
  409. package/dist/learning/qe-reasoning-bank.d.ts +21 -0
  410. package/dist/learning/qe-reasoning-bank.js +54 -8
  411. package/dist/learning/real-embeddings.d.ts +23 -0
  412. package/dist/learning/real-embeddings.js +69 -2
  413. package/dist/learning/real-qe-reasoning-bank.d.ts +39 -0
  414. package/dist/learning/real-qe-reasoning-bank.js +108 -38
  415. package/dist/logging/redaction.js +142 -12
  416. package/dist/mcp/bundle.js +520 -503
  417. package/dist/mcp/daemon-mode.d.ts +126 -0
  418. package/dist/mcp/daemon-mode.js +257 -0
  419. package/dist/mcp/entry.d.ts +4 -0
  420. package/dist/mcp/entry.js +50 -2
  421. package/dist/mcp/handlers/domain-handler-configs.d.ts +2 -0
  422. package/dist/mcp/handlers/domain-handler-configs.js +13 -2
  423. package/dist/mcp/handlers/orchestrate-routes.d.ts +6 -1
  424. package/dist/mcp/handlers/orchestrate-routes.js +53 -0
  425. package/dist/mcp/handlers/task-handlers.d.ts +23 -1
  426. package/dist/mcp/handlers/task-handlers.js +90 -19
  427. package/dist/mcp/handlers/validation-pipeline-handler.js +9 -9
  428. package/dist/mcp/protocol-server.js +11 -8
  429. package/dist/mcp/qe-tool-bridge.js +3 -0
  430. package/dist/mcp/services/reasoning-bank-service.d.ts +9 -2
  431. package/dist/mcp/services/reasoning-bank-service.js +13 -0
  432. package/dist/mcp/tool-annotations.js +4 -1
  433. package/dist/mcp/tools/coherence/check.js +1 -0
  434. package/dist/mcp/tools/coherence/consensus.js +4 -2
  435. package/dist/mcp/tools/learning-optimization/optimize.js +1 -2
  436. package/dist/mcp/tools/mincut/index.js +3 -0
  437. package/dist/mcp/tools/quality-assessment/gate.js +7 -0
  438. package/dist/mcp/tools/qx-analysis/analyze.js +1 -0
  439. package/dist/mcp/tools/requirements-validation/quality-criteria.js +10 -3
  440. package/dist/mcp/tools/security-compliance/scan.js +4 -2
  441. package/dist/mcp/tools/test-execution/e2e-execute.js +2 -2
  442. package/dist/mcp/tools/test-execution/execute.js +3 -2
  443. package/dist/mcp/types.d.ts +14 -0
  444. package/dist/memory/crdt/crdt-store.js +5 -0
  445. package/dist/memory/crdt/lww-register.js +12 -2
  446. package/dist/optimization/early-exit-token-optimizer.js +3 -1
  447. package/dist/planning/goap-planner.js +5 -0
  448. package/dist/planning/plan-executor.js +5 -0
  449. package/dist/routing/advisor/redaction.js +22 -2
  450. package/dist/shared/io/confined-read.d.ts +74 -0
  451. package/dist/shared/io/confined-read.js +256 -0
  452. package/dist/shared/io/file-reader.d.ts +6 -6
  453. package/dist/shared/io/file-reader.js +16 -42
  454. package/dist/shared/llm/providers/claude-code.js +4 -1
  455. package/dist/shared/llm/providers/response-deadline.js +16 -2
  456. package/dist/shared/native-module-errors.d.ts +51 -0
  457. package/dist/shared/native-module-errors.js +129 -0
  458. package/dist/shared/safe-db.js +14 -4
  459. package/dist/shared/security/osv-client.js +4 -1
  460. package/dist/shared/types/index.js +3 -1
  461. package/dist/shared/types/test-frameworks.js +2 -2
  462. package/dist/strange-loop/infra-healing/infra-aware-agent-provider.js +8 -1
  463. package/dist/sync/readers/json-reader.js +2 -1
  464. package/dist/validation/anchor-set.d.ts +6 -0
  465. package/dist/validation/anchor-set.js +9 -1
  466. package/dist/validation/quality-gate-runner.d.ts +7 -1
  467. package/dist/validation/quality-gate-runner.js +3 -3
  468. package/package.json +3 -3
  469. package/dist/cli/chunks/adapter-TR5SLAZC.js +0 -2
  470. package/dist/cli/chunks/aqe-learning-engine-DXWKCHY2.js +0 -2
  471. package/dist/cli/chunks/base-GTB6POYE.js +0 -2
  472. package/dist/cli/chunks/browser-workflow-MSBOLYUY.js +0 -2
  473. package/dist/cli/chunks/chunk-4SJYIX54.js +0 -3
  474. package/dist/cli/chunks/chunk-6P7424AO.js +0 -21
  475. package/dist/cli/chunks/chunk-6X5DHU6Q.js +0 -14
  476. package/dist/cli/chunks/chunk-CMBLM26R.js +0 -2
  477. package/dist/cli/chunks/chunk-DKAC3E3B.js +0 -3
  478. package/dist/cli/chunks/chunk-DURHK377.js +0 -742
  479. package/dist/cli/chunks/chunk-FPUDRSFJ.js +0 -180
  480. package/dist/cli/chunks/chunk-G5I6KGMW.js +0 -59
  481. package/dist/cli/chunks/chunk-HOZUDE4C.js +0 -2
  482. package/dist/cli/chunks/chunk-N6PIIK6G.js +0 -3
  483. package/dist/cli/chunks/chunk-NSHU347M.js +0 -2
  484. package/dist/cli/chunks/chunk-PPSAMXYN.js +0 -13
  485. package/dist/cli/chunks/chunk-TYFZXDGZ.js +0 -4
  486. package/dist/cli/chunks/chunk-U4OICXV2.js +0 -6
  487. package/dist/cli/chunks/chunk-WSF24I3D.js +0 -2
  488. package/dist/cli/chunks/chunk-XBVUVFJK.js +0 -4
  489. package/dist/cli/chunks/chunk-XUZDBQ5X.js +0 -6
  490. package/dist/cli/chunks/chunk-YBSBABOS.js +0 -2
  491. package/dist/cli/chunks/chunk-ZG5666GJ.js +0 -2
  492. package/dist/cli/chunks/ci-MSKMVH5X.js +0 -81
  493. package/dist/cli/chunks/client-POSVREVS.js +0 -2
  494. package/dist/cli/chunks/core-handlers-V243GY7X.js +0 -2
  495. package/dist/cli/chunks/coverage-B7MCGNTE.js +0 -49
  496. package/dist/cli/chunks/cross-domain-router-N3AIEM3B.js +0 -2
  497. package/dist/cli/chunks/dream-UA7MKOPQ.js +0 -2
  498. package/dist/cli/chunks/file-discovery-YCMNKZAK.js +0 -2
  499. package/dist/cli/chunks/fleet-2Y3ZE6CE.js +0 -46
  500. package/dist/cli/chunks/heartbeat-scheduler-QH5V6G2P.js +0 -2
  501. package/dist/cli/chunks/hnsw-adapter-OJNFAGJS.js +0 -2
  502. package/dist/cli/chunks/hnsw-index-DFUNARVD.js +0 -2
  503. package/dist/cli/chunks/hybrid-backend-SSGQQEQ2.js +0 -2
  504. package/dist/cli/chunks/impact-analyzer-CRGCA7ZD.js +0 -2
  505. package/dist/cli/chunks/init-wizard-NIMZ4J55.js +0 -2
  506. package/dist/cli/chunks/kernel-JQK7PRAI.js +0 -2
  507. package/dist/cli/chunks/knowledge-graph-YPVVIKEU.js +0 -2
  508. package/dist/cli/chunks/llm-router-service-5OGAUOXF.js +0 -2
  509. package/dist/cli/chunks/load-test-UKNV5MWW.js +0 -2
  510. package/dist/cli/chunks/memory-backend-ZW4BTRNK.js +0 -2
  511. package/dist/cli/chunks/memory-handlers-FCXN437E.js +0 -2
  512. package/dist/cli/chunks/pattern-null-store-4DUV6MQC.js +0 -2
  513. package/dist/cli/chunks/project-root-JCAUNL6O.js +0 -2
  514. package/dist/cli/chunks/protocol-executor-RNZNZP3A.js +0 -2
  515. package/dist/cli/chunks/qe-reasoning-bank-WK6TQOG2.js +0 -2
  516. package/dist/cli/chunks/queen-coordinator-4452SXZQ.js +0 -2
  517. package/dist/cli/chunks/real-embeddings-RWGOVOXO.js +0 -2
  518. package/dist/cli/chunks/router-3DIS5X4R.js +0 -2
  519. package/dist/cli/chunks/routing-feedback-OPXRCXM7.js +0 -2
  520. package/dist/cli/chunks/rvf-dual-writer-JL6T727I.js +0 -2
  521. package/dist/cli/chunks/rvf-migration-adapter-V7IBDUCS.js +0 -2
  522. package/dist/cli/chunks/rvf-native-adapter-O3UQTEBK.js +0 -2
  523. package/dist/cli/chunks/safe-db-EVB4ZC7T.js +0 -2
  524. package/dist/cli/chunks/schedule-ORDDXXY4.js +0 -2
  525. package/dist/cli/chunks/scheduler-XFLJSFIU.js +0 -2
  526. package/dist/cli/chunks/sqlite-persistence-Y7B42CJ3.js +0 -2
  527. package/dist/cli/chunks/task-handlers-KPWAEMKH.js +0 -9
  528. package/dist/cli/chunks/test-runner-process-3XZUYST2.js +0 -2
  529. package/dist/cli/chunks/tree-sitter-wasm-parser-YTBCBHUO.js +0 -2
  530. package/dist/cli/chunks/unified-memory-EHD4VNFW.js +0 -2
  531. package/dist/cli/chunks/unified-memory-hnsw-ZODGM4UK.js +0 -2
  532. package/dist/cli/chunks/unified-persistence-MHSI7ABK.js +0 -2
  533. package/dist/cli/chunks/visual-security-54MLFKWY.js +0 -2
  534. package/dist/cli/chunks/witness-chain-LC6Q2W27.js +0 -2
  535. package/dist/cli/chunks/witness-chain-QUIBAF3W.js +0 -2
  536. package/dist/cli/chunks/workflow-orchestrator-UKHEJVSK.js +0 -2
@@ -134,6 +134,14 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
134
134
  private findHighlights;
135
135
  private findSemanticHighlights;
136
136
  private fileToKey;
137
+ /**
138
+ * Content identity for the analysis and embedding caches.
139
+ *
140
+ * This keys cache entries, so it has to separate any two distinct inputs.
141
+ * A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
142
+ * "Aa" and "BB" collide, so two different functions would share one entry
143
+ * and the second caller would receive the first one's result.
144
+ */
137
145
  private hashCode;
138
146
  private cacheEmbedding;
139
147
  private cacheAnalysis;
@@ -2,6 +2,7 @@
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';
@@ -635,14 +636,16 @@ export class SemanticAnalyzerService {
635
636
  fileToKey(file) {
636
637
  return file.replace(/[/\\]/g, ':').replace(/\./g, '_');
637
638
  }
639
+ /**
640
+ * Content identity for the analysis and embedding caches.
641
+ *
642
+ * This keys cache entries, so it has to separate any two distinct inputs.
643
+ * A 31-multiplier 32-bit hash does not: for any shared prefix and suffix,
644
+ * "Aa" and "BB" collide, so two different functions would share one entry
645
+ * and the second caller would receive the first one's result.
646
+ */
638
647
  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);
648
+ return createHash('sha256').update(str, 'utf8').digest('hex');
646
649
  }
647
650
  cacheEmbedding(key, embedding) {
648
651
  if (this.embeddingCache.size >= this.config.cacheSize) {
@@ -19,6 +19,15 @@
19
19
  import * as fs from 'fs/promises';
20
20
  import * as path from 'path';
21
21
  import { safeJsonParse } from '../../../shared/safe-json.js';
22
+ import { readConfinedText } from '../../../shared/io/confined-read.js';
23
+ /**
24
+ * #1161: coverage reports are found under caller-named directories, so read
25
+ * them from a validated descriptor: a report linked out of the project, or to
26
+ * a device such as /dev/zero, is refused instead of read.
27
+ */
28
+ function readCoverageFile(file) {
29
+ return readConfinedText(file, { outsideRoot: 'allow' });
30
+ }
22
31
  // ============================================================================
23
32
  // LCOV Parser
24
33
  // ============================================================================
@@ -28,7 +37,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
28
37
  * LCOV format is the most common output from Istanbul, nyc, c8, etc.
29
38
  */
30
39
  export async function parseLCOV(lcovPath, projectRoot) {
31
- const content = await fs.readFile(lcovPath, 'utf-8');
40
+ const content = await readCoverageFile(lcovPath);
32
41
  return parseLCOVContent(content, projectRoot || path.dirname(lcovPath));
33
42
  }
34
43
  /**
@@ -221,7 +230,7 @@ export function parseLCOVContent(content, projectRoot) {
221
230
  * Parse JSON coverage data (Istanbul/Vitest format)
222
231
  */
223
232
  export async function parseJSONCoverage(jsonPath, projectRoot) {
224
- const content = await fs.readFile(jsonPath, 'utf-8');
233
+ const content = await readCoverageFile(jsonPath);
225
234
  const data = safeJsonParse(content);
226
235
  const root = projectRoot || path.dirname(jsonPath);
227
236
  const files = new Map();
@@ -334,7 +343,7 @@ export async function parseJSONCoverage(jsonPath, projectRoot) {
334
343
  * <report><package><class><method><counter type="LINE" missed="X" covered="Y"/></method></class></package></report>
335
344
  */
336
345
  export async function parseJaCoCo(xmlPath, projectRoot) {
337
- const content = await fs.readFile(xmlPath, 'utf-8');
346
+ const content = await readCoverageFile(xmlPath);
338
347
  return parseJaCoCoContent(content, projectRoot || path.dirname(xmlPath));
339
348
  }
340
349
  export function parseJaCoCoContent(content, projectRoot) {
@@ -437,7 +446,7 @@ function parseJaCoCoCounters(xml) {
437
446
  * <Root CoveredStatements="X" TotalStatements="Y"><Assembly><Namespace><Type><Member Statement="..."/></Type></Namespace></Assembly></Root>
438
447
  */
439
448
  export async function parseDotcover(xmlPath, projectRoot) {
440
- const content = await fs.readFile(xmlPath, 'utf-8');
449
+ const content = await readCoverageFile(xmlPath);
441
450
  return parseDotcoverContent(content, projectRoot || path.dirname(xmlPath));
442
451
  }
443
452
  export function parseDotcoverContent(content, projectRoot) {
@@ -531,7 +540,7 @@ export function parseDotcoverContent(content, projectRoot) {
531
540
  * Also handles tarpaulin LCOV output by delegating to parseLCOVContent.
532
541
  */
533
542
  export async function parseTarpaulin(filePath, projectRoot) {
534
- const content = await fs.readFile(filePath, 'utf-8');
543
+ const content = await readCoverageFile(filePath);
535
544
  const root = projectRoot || path.dirname(filePath);
536
545
  // If it looks like LCOV, delegate
537
546
  if (content.includes('SF:') && content.includes('end_of_record')) {
@@ -603,7 +612,7 @@ export function parseTarpaulinContent(content, projectRoot) {
603
612
  * pkg/file.go:startLine.startCol,endLine.endCol numStatements count
604
613
  */
605
614
  export async function parseGoCover(coverPath, projectRoot) {
606
- const content = await fs.readFile(coverPath, 'utf-8');
615
+ const content = await readCoverageFile(coverPath);
607
616
  return parseGoCoverContent(content, projectRoot || path.dirname(coverPath));
608
617
  }
609
618
  export function parseGoCoverContent(content, projectRoot) {
@@ -681,7 +690,7 @@ export function parseGoCoverContent(content, projectRoot) {
681
690
  * but sets the format and language appropriately.
682
691
  */
683
692
  export async function parseKover(xmlPath, projectRoot) {
684
- const content = await fs.readFile(xmlPath, 'utf-8');
693
+ const content = await readCoverageFile(xmlPath);
685
694
  const report = parseJaCoCoContent(content, projectRoot || path.dirname(xmlPath));
686
695
  report.format = 'kover';
687
696
  report.language = 'kotlin';
@@ -698,7 +707,7 @@ export async function parseKover(xmlPath, projectRoot) {
698
707
  * { "targets": [ { "files": [ { "path": "...", "lineCoverage": 0.85, "coveredLines": N, "executableLines": N, "functions": [...] } ] } ] }
699
708
  */
700
709
  export async function parseXcresult(jsonPath, projectRoot) {
701
- const content = await fs.readFile(jsonPath, 'utf-8');
710
+ const content = await readCoverageFile(jsonPath);
702
711
  return parseXcresultContent(content, projectRoot || path.dirname(jsonPath));
703
712
  }
704
713
  export function parseXcresultContent(content, projectRoot) {
@@ -830,7 +839,7 @@ export async function parseCoverage(coveragePath, projectRoot, format, language)
830
839
  return parseXcresult(coveragePath, projectRoot);
831
840
  }
832
841
  // Content-based detection
833
- const content = await fs.readFile(coveragePath, 'utf-8');
842
+ const content = await readCoverageFile(coveragePath);
834
843
  const trimmed = content.trim();
835
844
  if (trimmed.startsWith('{')) {
836
845
  // Check for tarpaulin JSON structure
@@ -869,7 +878,7 @@ export async function parseCoverage(coveragePath, projectRoot, format, language)
869
878
  // Language-based fallback: try the first format associated with the language
870
879
  if (language) {
871
880
  const langLower = language.toLowerCase();
872
- const hints = LANGUAGE_FORMAT_HINTS[langLower];
881
+ const hints = Object.hasOwn(LANGUAGE_FORMAT_HINTS, langLower) ? LANGUAGE_FORMAT_HINTS[langLower] : undefined; // #1157
873
882
  if (hints && hints.length > 0) {
874
883
  try {
875
884
  return await parseCoverage(coveragePath, projectRoot, hints[0]);
@@ -36,6 +36,8 @@ export interface PatternContext {
36
36
  readonly testType?: string;
37
37
  readonly codeContext?: string;
38
38
  readonly tags: string[];
39
+ /** Explicit strategy objective; absent means no requested direction. */
40
+ readonly objective?: Pick<OptimizationObjective, 'metric' | 'direction'>;
39
41
  }
40
42
  export interface PatternTemplate {
41
43
  readonly type: 'code' | 'prompt' | 'workflow' | 'config';
@@ -290,7 +290,8 @@ Provide:
290
290
  let output = pattern.template.content;
291
291
  // Replace template variables
292
292
  for (const variable of pattern.template.variables) {
293
- const value = variables[variable.name] ?? variable.defaultValue;
293
+ // #1157: the variable name comes from a stored pattern; read own values only.
294
+ const value = (Object.hasOwn(variables, variable.name) ? variables[variable.name] : undefined) ?? variable.defaultValue;
294
295
  if (variable.required && value === undefined) {
295
296
  return err(new Error(`Required variable ${variable.name} not provided`));
296
297
  }
@@ -186,11 +186,21 @@ export class MetricsOptimizerService {
186
186
  async recommendStrategy(context) {
187
187
  try {
188
188
  // Search for strategies that worked well in similar contexts
189
- const keys = await this.memory.search('learning:strategy:optimized:*', 100);
189
+ const keys = await this.memory.search('learning:strategy:optimized:*', 100, { namespace: 'learning-optimization' });
190
190
  const candidates = [];
191
- for (const key of keys) {
192
- const optimized = await this.memory.get(key);
193
- if (optimized && optimized.confidence > 0.6) {
191
+ for (const found of keys) {
192
+ // SQLite returns bare keys; in-memory search includes the namespace.
193
+ // get() applies that namespace separately, as storeOptimizationResult does.
194
+ const prefix = 'learning-optimization:';
195
+ const key = found.startsWith(prefix) ? found.slice(prefix.length) : found;
196
+ const optimized = await this.memory.get(key, { namespace: 'learning-optimization' });
197
+ if (optimized
198
+ && context.tags.includes(optimized.domain)
199
+ && context.tags.includes(optimized.objective.metric)
200
+ && (!context.objective || (context.tags.includes(context.objective.metric)
201
+ && optimized.objective.metric === context.objective.metric
202
+ && optimized.objective.direction === context.objective.direction))
203
+ && optimized.confidence > 0.6) {
194
204
  const contextScore = this.scoreContextMatch(optimized, context);
195
205
  const performanceScore = optimized.improvement * optimized.confidence;
196
206
  candidates.push({
@@ -7,6 +7,7 @@ import { ok, err } from '../../../shared/types/index.js';
7
7
  import { TimeRange } from '../../../shared/value-objects/index.js';
8
8
  import { toError } from '../../../shared/error-utils.js';
9
9
  import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
10
+ import { createSafeRecord } from '../../../shared/utils/safe-record.js';
10
11
  const DEFAULT_CONFIG = {
11
12
  metricsRetentionDays: 90,
12
13
  anomalyThreshold: 2.5,
@@ -268,7 +269,8 @@ export class ProductionIntelService {
268
269
  async getDomainHealth(domain) {
269
270
  const timeRange = TimeRange.lastNDays(1);
270
271
  const metricsResult = await this.getMetricsHistory('*', timeRange, domain);
271
- const metrics = {};
272
+ // #1157: metric names come from stored production metrics.
273
+ const metrics = createSafeRecord();
272
274
  if (metricsResult.success) {
273
275
  for (const metric of metricsResult.value) {
274
276
  if (!metrics[metric.name]) {
@@ -0,0 +1,40 @@
1
+ /**
2
+ * #1170: drop the generic eval/exec finding that language-specific SAST
3
+ * already reported as code injection on the same line.
4
+ *
5
+ * The scan-security task runs text patterns over every file and SAST over
6
+ * JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
7
+ * CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
8
+ * the same finding. Other generic rules (secrets, CORS, debug mode) can flag
9
+ * a different value or a higher severity on a line SAST also matched, so
10
+ * they are always kept.
11
+ */
12
+ /** Title of the generic-pattern eval/exec finding in the scan-security handler. */
13
+ export declare const GENERIC_EVAL_EXEC_TITLE = "Dangerous eval/exec usage";
14
+ interface LocatedFinding {
15
+ title: string;
16
+ severity?: string;
17
+ location: {
18
+ file: string;
19
+ line?: number;
20
+ };
21
+ }
22
+ interface SastFinding {
23
+ severity?: string;
24
+ description?: string;
25
+ references?: readonly string[];
26
+ location: {
27
+ file: string;
28
+ line?: number;
29
+ };
30
+ }
31
+ /**
32
+ * Generic findings without the eval/exec matches SAST already reported as
33
+ * CWE-95 on the same real file and line, at the same or a higher severity, so
34
+ * dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
35
+ * eval/exec match is eval alone; a line that also calls exec() is kept,
36
+ * since SAST's eval rule does not report the exec call.
37
+ */
38
+ export declare function dropGenericEvalCoveredBySast<T extends LocatedFinding>(generic: readonly T[], sast: readonly SastFinding[], isEvalOnly: (finding: T) => boolean): Promise<T[]>;
39
+ export {};
40
+ //# sourceMappingURL=generic-finding-dedup.d.ts.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * #1170: drop the generic eval/exec finding that language-specific SAST
3
+ * already reported as code injection on the same line.
4
+ *
5
+ * The scan-security task runs text patterns over every file and SAST over
6
+ * JS/TS files, so one `eval()` was counted twice: once by SAST (critical,
7
+ * CWE-95) and once by the generic eval/exec pattern (high). Only that pair is
8
+ * the same finding. Other generic rules (secrets, CORS, debug mode) can flag
9
+ * a different value or a higher severity on a line SAST also matched, so
10
+ * they are always kept.
11
+ */
12
+ import { realpath } from 'node:fs/promises';
13
+ import * as path from 'node:path';
14
+ /** Title of the generic-pattern eval/exec finding in the scan-security handler. */
15
+ export const GENERIC_EVAL_EXEC_TITLE = 'Dangerous eval/exec usage';
16
+ /** CWE-95 (eval injection): SAST's eval() and Function-constructor rules. */
17
+ function isEvalInjection(finding) {
18
+ return /\[CWE-95\]/.test(finding.description ?? '') ||
19
+ (finding.references ?? []).some(ref => /\/definitions\/95\.html$/.test(ref));
20
+ }
21
+ const SEVERITY_RANK = {
22
+ informational: 0, low: 1, medium: 2, high: 3, critical: 4,
23
+ };
24
+ const rank = (severity) => SEVERITY_RANK[severity ?? ''] ?? -1;
25
+ async function realPathOf(file, cache) {
26
+ const resolved = path.resolve(file);
27
+ let real = cache.get(resolved);
28
+ if (real === undefined) {
29
+ real = await realpath(resolved).catch(() => resolved);
30
+ cache.set(resolved, real);
31
+ }
32
+ return real;
33
+ }
34
+ /**
35
+ * Generic findings without the eval/exec matches SAST already reported as
36
+ * CWE-95 on the same real file and line, at the same or a higher severity, so
37
+ * dropping one never lowers what the scan reports. `isEvalOnly` says whether a generic
38
+ * eval/exec match is eval alone; a line that also calls exec() is kept,
39
+ * since SAST's eval rule does not report the exec call.
40
+ */
41
+ export async function dropGenericEvalCoveredBySast(generic, sast, isEvalOnly) {
42
+ const evalSast = sast.filter(isEvalInjection);
43
+ if (evalSast.length === 0)
44
+ return [...generic];
45
+ const cache = new Map();
46
+ // Highest SAST CWE-95 severity per real file and line.
47
+ const covered = new Map();
48
+ for (const finding of evalSast) {
49
+ const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
50
+ covered.set(key, Math.max(covered.get(key) ?? -1, rank(finding.severity)));
51
+ }
52
+ const kept = [];
53
+ for (const finding of generic) {
54
+ const key = `${await realPathOf(finding.location.file, cache)}:${finding.location.line ?? 0}`;
55
+ const sastRank = covered.get(key);
56
+ const duplicate = finding.title === GENERIC_EVAL_EXEC_TITLE && isEvalOnly(finding) &&
57
+ sastRank !== undefined && sastRank >= rank(finding.severity);
58
+ if (!duplicate)
59
+ kept.push(finding);
60
+ }
61
+ return kept;
62
+ }
63
+ //# sourceMappingURL=generic-finding-dedup.js.map
@@ -22,28 +22,33 @@
22
22
  * complete, with a reason; each member can be scanned directly.
23
23
  */
24
24
  import * as fs from 'fs/promises';
25
+ // #1161: manifests and lockfiles are read from a validated descriptor; one
26
+ // linked out of the project, or to a device, is refused instead of read.
27
+ import { readConfinedText } from '../../../../shared/io/confined-read.js';
25
28
  import * as path from 'path';
26
29
  import semver from 'semver';
27
30
  import { parse as parseYaml } from 'yaml';
28
31
  import { safeJsonParse } from '../../../../shared/safe-json.js';
29
32
  import { classifyNpmSpec, exactNpmVersion } from '../../../../shared/security/osv-lookup.js';
33
+ import { createSafeRecord, getOwn, setOwn } from '../../../../shared/utils/safe-record.js';
30
34
  import { LOCKFILES, parseLockfile } from './lockfile-versions.js';
31
35
  /** The reason a workspace root's scan is not complete (#1057). */
32
36
  export const WORKSPACE_NOT_SCANNED = 'workspace member dependencies are not scanned yet (#1057); scan each member directory separately';
33
37
  const OUT_OF_SYNC = 'lockfile out of sync with package.json';
34
38
  /** All declared dependencies of a manifest (later fields win, as npm resolves them). */
35
39
  export function declaredDependencies(manifest) {
36
- const out = {};
40
+ // #1157: a dependency named `__proto__` is kept as an own entry, not dropped.
41
+ const out = createSafeRecord();
37
42
  for (const field of ['peerDependencies', 'optionalDependencies', 'devDependencies', 'dependencies']) {
38
43
  for (const [name, spec] of Object.entries(manifest[field] ?? {})) {
39
44
  if (typeof spec === 'string')
40
- out[name] = spec;
45
+ setOwn(out, name, spec);
41
46
  }
42
47
  }
43
48
  return out;
44
49
  }
45
50
  async function readManifest(file) {
46
- return safeJsonParse(await fs.readFile(file, 'utf-8'));
51
+ return safeJsonParse(await readConfinedText(file, { outsideRoot: 'allow' }));
47
52
  }
48
53
  async function exists(file) {
49
54
  try {
@@ -123,7 +128,7 @@ async function pnpmDeclaresPackages(file) {
123
128
  const st = await fs.stat(file); // follows a link; a dangling one throws
124
129
  if (!st.isFile() || st.size > MAX_PNPM_WORKSPACE_BYTES)
125
130
  return true;
126
- const text = await fs.readFile(file, 'utf-8');
131
+ const text = await readConfinedText(file, { outsideRoot: 'allow', maxBytes: MAX_PNPM_WORKSPACE_BYTES });
127
132
  doc = parseYaml(text, { uniqueKeys: false, merge: true, maxAliasCount: 100 });
128
133
  }
129
134
  catch {
@@ -182,7 +187,10 @@ export function resolveFromRecord(dependencies, lockedVersions = {}) {
182
187
  members: () => [],
183
188
  hasImporter: () => true,
184
189
  recordedSpec: () => null,
185
- resolve: (_importer, name) => (lockedVersions[name] !== undefined ? { version: lockedVersions[name] } : undefined),
190
+ resolve: (_importer, name) => {
191
+ const version = getOwn(lockedVersions, name);
192
+ return version !== undefined ? { version } : undefined;
193
+ },
186
194
  };
187
195
  return Object.entries(dependencies).map(([name, spec]) => resolveOne(name, spec, '', index, new Set()));
188
196
  }
@@ -202,7 +210,7 @@ export async function resolveDependencies(manifestPath) {
202
210
  if (found) {
203
211
  const member = path.relative(found.dir, realManifestDir).split(path.sep).join('/');
204
212
  try {
205
- const parsed = parseLockfile(found.file, await fs.readFile(path.join(found.dir, found.file), 'utf-8'));
213
+ const parsed = parseLockfile(found.file, await readConfinedText(path.join(found.dir, found.file), { outsideRoot: 'allow' }));
206
214
  const rootManifest = member ? await readManifest(path.join(found.dir, 'package.json')).catch(() => ({})) : manifest;
207
215
  // A member scanned directly: the root lockfile covers it if it lists the
208
216
  // importer (npm/pnpm) or, for yarn, if the root declares workspaces.
@@ -11,6 +11,7 @@ import { ok, err } from '../../../../shared/types/index.js';
11
11
  import { ALL_SECURITY_PATTERNS, BUILT_IN_RULE_SETS } from './security-patterns.js';
12
12
  import { toError } from '../../../../shared/error-utils.js';
13
13
  import { safeJsonParse } from '../../../../shared/safe-json.js';
14
+ import { readConfinedFile } from '../../../../shared/io/confined-read.js';
14
15
  import { CLAUDE_TIER_MODELS, DEFAULT_OPUS_MODEL } from '../../../../shared/llm/model-registry.js';
15
16
  import { isSemgrepAvailable, runSemgrepWithRules, convertSemgrepFindings, } from '../semgrep-integration.js';
16
17
  // ============================================================================
@@ -303,8 +304,9 @@ export class SASTScanner {
303
304
  let content;
304
305
  let sourceDigest;
305
306
  try {
306
- const fs = await import('fs/promises');
307
- const bytes = await fs.readFile(filePath);
307
+ // #1161: open once and validate the opened descriptor, so a file swapped
308
+ // after the sast-scan path check cannot redirect the read.
309
+ const bytes = await readConfinedFile(filePath, { outsideRoot: 'allow' });
308
310
  sourceDigest = createHash('sha256').update(bytes).digest('hex');
309
311
  content = bytes.toString('utf8');
310
312
  }
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { LoggerFactory } from '../../../logging/index.js';
6
6
  import { v4 as uuidv4 } from 'uuid';
7
- import * as fs from 'fs/promises';
7
+ import { readConfinedText } from '../../../shared/io/confined-read.js';
8
8
  import * as path from 'path';
9
9
  /**
10
10
  * Get the default SAST vulnerability patterns for JS/TS analysis
@@ -173,7 +173,7 @@ export async function performSASTScan(findSourceFiles, shouldExclude) {
173
173
  continue;
174
174
  }
175
175
  try {
176
- const content = await fs.readFile(filePath, 'utf-8');
176
+ const content = await readConfinedText(filePath, { outsideRoot: 'allow' }); // #1161
177
177
  const lines = content.split('\n');
178
178
  filesScanned++;
179
179
  linesScanned += lines.length;
@@ -3,7 +3,7 @@
3
3
  * Extracted from security-auditor.ts - Secret/credential detection
4
4
  */
5
5
  import { LoggerFactory } from '../../../logging/index.js';
6
- import * as fs from 'fs/promises';
6
+ import { readConfinedText } from '../../../shared/io/confined-read.js';
7
7
  /**
8
8
  * Get the comprehensive set of secret detection patterns
9
9
  */
@@ -198,7 +198,7 @@ export function validateSecret(type, value) {
198
198
  export async function scanFileForSecrets(file) {
199
199
  const secrets = [];
200
200
  try {
201
- const content = await fs.readFile(file.value, 'utf-8');
201
+ const content = await readConfinedText(file.value, { outsideRoot: 'allow' }); // #1161
202
202
  const lines = content.split('\n');
203
203
  const secretPatterns = getSecretPatterns();
204
204
  for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
@@ -12,6 +12,7 @@
12
12
  import { LoggerFactory } from '../../../logging/index.js';
13
13
  import { v4 as uuidv4 } from 'uuid';
14
14
  import * as fs from 'fs/promises';
15
+ import { readConfinedText } from '../../../shared/io/confined-read.js';
15
16
  import * as path from 'path';
16
17
  import { ok, err } from '../../../shared/types/index.js';
17
18
  import { toError } from '../../../shared/error-utils.js';
@@ -249,7 +250,7 @@ export class SecurityAuditorService {
249
250
  const dependencies = [];
250
251
  try {
251
252
  if (ecosystem === 'npm') {
252
- const content = await fs.readFile(manifest, 'utf-8');
253
+ const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
253
254
  const packageJson = safeJsonParse(content);
254
255
  const allDeps = {
255
256
  ...packageJson.dependencies,
@@ -263,7 +264,7 @@ export class SecurityAuditorService {
263
264
  }
264
265
  }
265
266
  else if (ecosystem === 'pip') {
266
- const content = await fs.readFile(manifest, 'utf-8');
267
+ const content = await readConfinedText(manifest, { outsideRoot: 'allow' }); // #1161
267
268
  const lines = content.split('\n');
268
269
  for (const line of lines) {
269
270
  const trimmed = line.trim();
@@ -125,7 +125,8 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
125
125
  runTests(request: SimpleTestRequest): Promise<Result<TestRunResult, Error>>;
126
126
  /**
127
127
  * Retry a run's failed tests when retries were requested, and attach what
128
- * the retries did to the run (#1130). The run's own counts are unchanged.
128
+ * the retries did to the run (#1130). A test that passed on a retry counts
129
+ * as passed and flaky in the run's own counts (#1170).
129
130
  */
130
131
  private retryFailures;
131
132
  /**
@@ -9,6 +9,7 @@ import { TestExecutionEvents, createEvent, } from '../../shared/events/index.js'
9
9
  import { TestExecutorService } from './services/test-executor.js';
10
10
  import { FlakyDetectorService } from './services/flaky-detector.js';
11
11
  import { RetryHandlerService } from './services/retry-handler.js';
12
+ import { applyRetryOutcome } from './services/retry-outcome.js';
12
13
  import { TestPrioritizerService } from './services/test-prioritizer.js';
13
14
  import { createE2ETestRunnerService, } from './services/e2e-runner.js';
14
15
  import { createDomainFinding, } from '../../coordination/consensus/domain-findings.js';
@@ -162,7 +163,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
162
163
  }
163
164
  /**
164
165
  * Retry a run's failed tests when retries were requested, and attach what
165
- * the retries did to the run (#1130). The run's own counts are unchanged.
166
+ * the retries did to the run (#1130). A test that passed on a retry counts
167
+ * as passed and flaky in the run's own counts (#1170).
166
168
  */
167
169
  async retryFailures(run, retryCount) {
168
170
  if (!retryCount || retryCount <= 0)
@@ -179,17 +181,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
179
181
  });
180
182
  if (!retried.success)
181
183
  return;
182
- const byId = new Map(run.failedTests.map(t => [t.testId, t]));
183
- run.retries = {
184
- totalRetries: retried.value.retried,
185
- nowPassing: retried.value.nowPassing,
186
- stillFailing: retried.value.stillFailing,
187
- tests: (retried.value.tests ?? []).map(({ testId, ...outcome }) => ({
188
- name: byId.get(testId)?.testName ?? testId,
189
- file: byId.get(testId)?.file ?? '',
190
- ...outcome,
191
- })),
192
- };
184
+ applyRetryOutcome(run, retried.value);
193
185
  }
194
186
  /**
195
187
  * Detect test framework from file patterns and project configuration
@@ -686,11 +678,10 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
686
678
  /**
687
679
  * Record execution results for DT learning
688
680
  */
689
- async recordExecutionResults(runId, testFiles, result, prioritizationInfo) {
681
+ async recordExecutionResults(runId, testFiles, result, _prioritizationInfo) {
690
682
  // Record each test execution for learning
691
683
  for (let i = 0; i < testFiles.length; i++) {
692
684
  const testId = this.generateTestId(testFiles[i]);
693
- const info = prioritizationInfo;
694
685
  // Find if this test failed (check if it's in failed tests)
695
686
  const failedTest = result.failedTests.find(t => t.file === testFiles[i]);
696
687
  const passed = !failedTest;
@@ -80,6 +80,11 @@ export interface ITestRunResult {
80
80
  fileCoverages?: IFileCoverageData[];
81
81
  /** #1130: what the requested retries of failed tests did. Absent when none were requested. */
82
82
  retries?: IRunRetrySummary;
83
+ /**
84
+ * #1170: tests that failed and then passed on a retry. They are counted in
85
+ * `passed`, not `failed`. Absent when no test passed on a retry.
86
+ */
87
+ flaky?: number;
83
88
  }
84
89
  /** #1130: the measured outcome of a run's retries, per failed test. */
85
90
  export interface IRunRetrySummary {
@@ -102,8 +107,13 @@ export interface ITestCaseResult {
102
107
  status: 'passed' | 'failed' | 'skipped';
103
108
  /** Runner-reported duration in ms; omitted when the runner reported none. */
104
109
  duration?: number;
105
- /** The runner's failure message for a failed test, when it reported one. */
110
+ /**
111
+ * The runner's failure message for a failed test, or for the failed first
112
+ * attempt of a flaky test, when it reported one.
113
+ */
106
114
  failureMessage?: string;
115
+ /** #1170: the test failed and then passed on a retry, so it is `passed`. */
116
+ flaky?: true;
107
117
  }
108
118
  export interface IFileCoverageData {
109
119
  path: string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * #1170: a run's final outcome after its failed tests were retried.
3
+ *
4
+ * A test that failed and then passed on a retry is passed, and flaky: it
5
+ * leaves `failed`/`failedTests`, its runner test case reads `passed` with
6
+ * `flaky: true`, and the run counts it in `flaky`. A test whose retries all
7
+ * failed, or whose retry matched no test, stays failed.
8
+ */
9
+ import type { IRetryResult, ITestRunResult } from '../interfaces';
10
+ /**
11
+ * Default retries of a failed test, shared by `aqe test execute` and MCP
12
+ * `test_execute_parallel` so both surfaces rerun a failure the same number of
13
+ * times (#1170).
14
+ */
15
+ export declare const DEFAULT_TEST_RETRY_COUNT = 2;
16
+ /** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
17
+ export declare function applyRetryOutcome(run: ITestRunResult, retried: IRetryResult): void;
18
+ //# sourceMappingURL=retry-outcome.d.ts.map
@@ -0,0 +1,53 @@
1
+ /**
2
+ * #1170: a run's final outcome after its failed tests were retried.
3
+ *
4
+ * A test that failed and then passed on a retry is passed, and flaky: it
5
+ * leaves `failed`/`failedTests`, its runner test case reads `passed` with
6
+ * `flaky: true`, and the run counts it in `flaky`. A test whose retries all
7
+ * failed, or whose retry matched no test, stays failed.
8
+ */
9
+ /**
10
+ * Default retries of a failed test, shared by `aqe test execute` and MCP
11
+ * `test_execute_parallel` so both surfaces rerun a failure the same number of
12
+ * times (#1170).
13
+ */
14
+ export const DEFAULT_TEST_RETRY_COUNT = 2;
15
+ /** Attach the retry outcome to `run` and move tests that passed on retry from failed to passed. */
16
+ export function applyRetryOutcome(run, retried) {
17
+ const byId = new Map(run.failedTests.map(t => [t.testId, t]));
18
+ const outcomes = retried.tests ?? [];
19
+ const summary = {
20
+ totalRetries: retried.retried,
21
+ nowPassing: retried.nowPassing,
22
+ stillFailing: retried.stillFailing,
23
+ tests: outcomes.map(({ testId, ...outcome }) => ({
24
+ name: byId.get(testId)?.testName ?? testId,
25
+ file: byId.get(testId)?.file ?? '',
26
+ ...outcome,
27
+ })),
28
+ };
29
+ run.retries = summary;
30
+ const passedOnRetry = new Set(outcomes.filter(o => o.passed && !o.unmatched).map(o => o.testId));
31
+ const recovered = run.failedTests.filter(t => passedOnRetry.has(t.testId));
32
+ if (recovered.length === 0)
33
+ return;
34
+ run.failedTests = run.failedTests.filter(t => !passedOnRetry.has(t.testId));
35
+ run.failed = Math.max(0, run.failed - recovered.length);
36
+ run.passed += recovered.length;
37
+ run.flaky = (run.flaky ?? 0) + recovered.length;
38
+ if (run.failed === 0 && run.status === 'failed')
39
+ run.status = 'passed';
40
+ if (run.testCases) {
41
+ const pending = [...recovered];
42
+ run.testCases = run.testCases.map(testCase => {
43
+ if (testCase.status !== 'failed')
44
+ return testCase;
45
+ const index = pending.findIndex(t => t.testName === testCase.name && t.file === testCase.file);
46
+ if (index < 0)
47
+ return testCase;
48
+ pending.splice(index, 1);
49
+ return { ...testCase, status: 'passed', flaky: true };
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=retry-outcome.js.map