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
@@ -9,6 +9,7 @@
9
9
  import { MCPToolBase } from '../base.js';
10
10
  import { toErrorMessage } from '../../../shared/error-utils.js';
11
11
  import { secureRandom, secureRandomFloat } from '../../../shared/utils/crypto-random.js';
12
+ import { DEFAULT_TEST_RETRY_COUNT } from '../../../domains/test-execution/services/retry-outcome.js';
12
13
  // ============================================================================
13
14
  // Tool Implementation
14
15
  // ============================================================================
@@ -22,7 +23,7 @@ export class TestExecuteTool extends MCPToolBase {
22
23
  timeout: 300000,
23
24
  };
24
25
  async execute(params, context) {
25
- const { testFiles = [], testSuites = [], pattern, parallel = true, parallelism = 4, retryCount = 3, timeout = 60000, collectCoverage = false, reportFormat = 'json', failFast = false, } = params;
26
+ const { testFiles = [], testSuites = [], pattern, parallel = true, parallelism = 4, retryCount = DEFAULT_TEST_RETRY_COUNT, collectCoverage = false, failFast = false, } = params;
26
27
  const startTime = Date.now();
27
28
  try {
28
29
  // Determine files to test
@@ -164,7 +165,7 @@ const TEST_EXECUTE_SCHEMA = {
164
165
  description: 'Number of retries for failed tests',
165
166
  minimum: 0,
166
167
  maximum: 5,
167
- default: 3,
168
+ default: DEFAULT_TEST_RETRY_COUNT,
168
169
  },
169
170
  timeout: {
170
171
  type: 'number',
@@ -584,6 +584,20 @@ export interface CoverageAnalyzeResult {
584
584
  * this is "no measurement", never 0%.
585
585
  */
586
586
  unmeasured?: boolean;
587
+ /**
588
+ * #1154: `insufficient-evidence` when source files under the target are not
589
+ * in the report, or the report is older than the sources. The figures then
590
+ * cover the measured files only and must not be read as a pass.
591
+ */
592
+ evidenceStatus?: 'complete' | 'insufficient-evidence';
593
+ /** #1154: source files under the target with no entry in the report. */
594
+ unmeasuredFiles?: string[];
595
+ /** #1154: the report is older than these source files. */
596
+ staleReport?: {
597
+ reportPath: string;
598
+ reportModified: string;
599
+ newerFiles: string[];
600
+ };
587
601
  /** Caveats the caller should surface (e.g. "no instrumentation ran"). */
588
602
  warning?: string;
589
603
  }
@@ -309,6 +309,9 @@ export function createCRDTStore(config) {
309
309
  applyState(incoming) {
310
310
  // Apply registers
311
311
  for (const [key, state] of Object.entries(incoming.registers)) {
312
+ // One malformed peer entry must not block unrelated state from converging.
313
+ if (typeof state?.timestamp !== 'number' || !Number.isFinite(state.timestamp))
314
+ continue;
312
315
  if (!registers.has(key)) {
313
316
  registers.set(key, createLWWRegisterFromState(nodeId, state));
314
317
  }
@@ -431,6 +434,8 @@ export function createCRDTStore(config) {
431
434
  // Apply delta similar to full state, but only for included keys
432
435
  if (delta.registers) {
433
436
  for (const [key, state] of Object.entries(delta.registers)) {
437
+ if (typeof state?.timestamp !== 'number' || !Number.isFinite(state.timestamp))
438
+ continue;
434
439
  if (!registers.has(key)) {
435
440
  registers.set(key, createLWWRegisterFromState(nodeId, state));
436
441
  }
@@ -7,6 +7,11 @@
7
7
  *
8
8
  * @module memory/crdt/lww-register
9
9
  */
10
+ function assertFiniteTimestamp(timestamp) {
11
+ if (!Number.isFinite(timestamp)) {
12
+ throw new RangeError('LWW register timestamp must be a finite number');
13
+ }
14
+ }
10
15
  // =============================================================================
11
16
  // LWW Register Implementation
12
17
  // =============================================================================
@@ -26,10 +31,12 @@
26
31
  * ```
27
32
  */
28
33
  export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
34
+ const timestamp = initialTimestamp ?? (initialValue !== undefined ? Date.now() : 0);
35
+ assertFiniteTimestamp(timestamp);
29
36
  // Internal state
30
37
  let state = {
31
38
  value: initialValue,
32
- timestamp: initialTimestamp ?? (initialValue !== undefined ? Date.now() : 0),
39
+ timestamp,
33
40
  nodeId: initialValue !== undefined ? nodeId : '',
34
41
  version: initialValue !== undefined ? 1 : 0,
35
42
  lastUpdated: Date.now(),
@@ -51,6 +58,7 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
51
58
  },
52
59
  set(value, timestamp) {
53
60
  let ts = timestamp ?? Date.now();
61
+ assertFiniteTimestamp(ts);
54
62
  // Without an explicit timestamp the write means "now": a second write by
55
63
  // this node within one clock tick (or after a backwards clock step) must
56
64
  // still supersede its own earlier write, not tie with it and be dropped.
@@ -88,6 +96,8 @@ export function createLWWRegister(nodeId, initialValue, initialTimestamp) {
88
96
  // (0) would otherwise beat a real write at a negative timestamp.
89
97
  if (incoming.version === 0)
90
98
  return;
99
+ // NaN breaks total ordering; infinity would permanently outrank finite writes.
100
+ assertFiniteTimestamp(incoming.timestamp);
91
101
  // Only update if incoming timestamp wins
92
102
  if (state.version === 0 ||
93
103
  compareTimestamps(incoming.timestamp, incoming.nodeId, state.timestamp, state.nodeId) > 0) {
@@ -134,7 +144,7 @@ export function isLWWRegisterState(value) {
134
144
  return false;
135
145
  }
136
146
  const state = value;
137
- return (typeof state.timestamp === 'number' &&
147
+ return (typeof state.timestamp === 'number' && Number.isFinite(state.timestamp) &&
138
148
  typeof state.nodeId === 'string' &&
139
149
  typeof state.version === 'number' &&
140
150
  typeof state.lastUpdated === 'number' &&
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { detectQEDomain } from '../learning/qe-patterns.js';
10
10
  import { toErrorMessage } from '../shared/error-utils.js';
11
+ import { createSafeRecord } from '../shared/utils/safe-record.js';
11
12
  /**
12
13
  * Default early exit configuration
13
14
  */
@@ -374,7 +375,8 @@ export class EarlyExitTokenOptimizer {
374
375
  reasonBreakdown[attempt.reason]++;
375
376
  }
376
377
  // Calculate domain breakdown
377
- const domainBreakdown = {};
378
+ // #1157: domains come from recorded requests.
379
+ const domainBreakdown = createSafeRecord();
378
380
  for (const reuse of this.reuseHistory) {
379
381
  const domain = reuse.domain ?? 'unknown';
380
382
  if (!domainBreakdown[domain]) {
@@ -645,6 +645,11 @@ export class GOAPPlanner {
645
645
  if (current === null || current === undefined) {
646
646
  return undefined;
647
647
  }
648
+ // #1157: goal and condition keys can come from callers; an inherited
649
+ // member such as `constructor` is not part of the world state.
650
+ if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
651
+ return undefined;
652
+ }
648
653
  current = current[part];
649
654
  }
650
655
  return current;
@@ -900,6 +900,11 @@ export class PlanExecutor {
900
900
  if (current === null || current === undefined) {
901
901
  return undefined;
902
902
  }
903
+ // #1157: goal and condition keys can come from callers; an inherited
904
+ // member such as `constructor` is not part of the world state.
905
+ if (typeof current !== 'object' || !Object.hasOwn(current, part)) {
906
+ return undefined;
907
+ }
903
908
  current = current[part];
904
909
  }
905
910
  return current;
@@ -26,7 +26,7 @@ const PATTERNS = [
26
26
  },
27
27
  {
28
28
  category: 'api_key_header',
29
- regex: /(Authorization:\s*Bearer\s+)\S+/gi,
29
+ regex: /(Authorization:\s*(?:Bearer|Token)\s+)\S+/gi,
30
30
  replacement: '$1<REDACTED:api_key>',
31
31
  modes: ['strict', 'balanced'],
32
32
  },
@@ -38,7 +38,8 @@ const PATTERNS = [
38
38
  },
39
39
  {
40
40
  category: 'private_key',
41
- regex: /-----BEGIN\s[\w\s]*PRIVATE KEY-----[\s\S]*?-----END\s[\w\s]*PRIVATE KEY-----/g,
41
+ // A block with no END line (truncated output) is redacted to end of input.
42
+ regex: /-----BEGIN\s[\w\s]*PRIVATE KEY-----(?:[\s\S]*?-----END\s[\w\s]*PRIVATE KEY-----|[\s\S]*)/g,
42
43
  replacement: '<REDACTED:private_key>',
43
44
  modes: ['strict', 'balanced'],
44
45
  },
@@ -66,6 +67,25 @@ const PATTERNS = [
66
67
  replacement: '<REDACTED:slack_token>',
67
68
  modes: ['strict', 'balanced'],
68
69
  },
70
+ {
71
+ category: 'huggingface_token',
72
+ regex: /\bhf_[A-Za-z0-9]{30,}\b/g,
73
+ replacement: '<REDACTED:huggingface_token>',
74
+ modes: ['strict', 'balanced'],
75
+ },
76
+ {
77
+ category: 'npm_token',
78
+ regex: /\bnpm_[A-Za-z0-9]{36,}\b/g,
79
+ replacement: '<REDACTED:npm_token>',
80
+ modes: ['strict', 'balanced'],
81
+ },
82
+ {
83
+ // Cognitum API keys; the trailing lookahead skips snake_case identifiers.
84
+ category: 'cognitum_key',
85
+ regex: /\bcog_[A-Za-z0-9-]{20,}(?!\w)/g,
86
+ replacement: '<REDACTED:cognitum_key>',
87
+ modes: ['strict', 'balanced'],
88
+ },
69
89
  {
70
90
  category: 'stripe_key',
71
91
  regex: /\b(sk_live_|pk_live_|sk_test_|pk_test_|rk_live_|rk_test_)[A-Za-z0-9]{10,}\b/g,
@@ -0,0 +1,74 @@
1
+ /**
2
+ * #1161: read a file inside the project root without a check-then-use race.
3
+ *
4
+ * The payload path guard (#1126) checks a path by name and the handler opens
5
+ * it again later, so a file or symlink swapped in between could be read
6
+ * unchecked. These readers OPEN first and validate what was opened:
7
+ *
8
+ * - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
9
+ * final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
10
+ * - the descriptor must be a regular file within the size limit (fstat);
11
+ * - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
12
+ * re-resolved realpath, which must be the same inode) must lie inside the
13
+ * project root, so a directory component swapped for a symlink is caught;
14
+ * - the content is read from that same descriptor, and never past the limit,
15
+ * even if the file grows after the fstat.
16
+ *
17
+ * A path spelled outside the root is refused before any filesystem call,
18
+ * unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
19
+ * from a trusted source (the other checks still apply).
20
+ */
21
+ import { type Stats } from 'node:fs';
22
+ import { CallerInputError } from '../error-utils.js';
23
+ /** Default upper bound for a confined read when the caller names none. */
24
+ export declare const DEFAULT_MAX_CONFINED_READ_BYTES: number;
25
+ export type ConfinedReadReason = 'not-found' | 'not-a-file' | 'outside-project-root' | 'unreadable' | 'too-large';
26
+ export interface ConfinedReadOptions {
27
+ /** Project root; defaults to findProjectRoot(). */
28
+ projectRoot?: string;
29
+ /** Refuse files larger than this; defaults to DEFAULT_MAX_CONFINED_READ_BYTES. */
30
+ maxBytes?: number;
31
+ /**
32
+ * A path spelled outside the project root is refused ('refuse', default),
33
+ * or read without the containment check ('allow') when the caller already
34
+ * trusts it. Paths spelled inside the root are always held to the root.
35
+ */
36
+ outsideRoot?: 'refuse' | 'allow';
37
+ }
38
+ /**
39
+ * A confined read that was refused; `reason` matches the payload guard's.
40
+ * `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
41
+ * otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
42
+ * TOO_LARGE), so callers that report error codes keep working.
43
+ */
44
+ export declare class ConfinedReadError extends CallerInputError {
45
+ readonly filePath: string;
46
+ readonly reason: ConfinedReadReason;
47
+ readonly code: string;
48
+ constructor(filePath: string, reason: ConfinedReadReason, errnoCode?: string);
49
+ }
50
+ /** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
51
+ export declare const CONFINED_OPEN_FLAGS: number;
52
+ /** True when `candidate` is `root` or lies beneath it (both absolute). */
53
+ export declare function isWithinRoot(root: string, candidate: string): boolean;
54
+ /**
55
+ * Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
56
+ * to the opened file itself. Elsewhere, re-resolve the path and accept it only
57
+ * if it is the same inode as the descriptor, so a swap after the open is
58
+ * detected. Returns null when it cannot be proven.
59
+ */
60
+ export declare function openedLocation(fd: number, lexical: string, opened: Stats): Promise<string | null>;
61
+ /** Synchronous openedLocation, for callers that read synchronously. */
62
+ export declare function openedLocationSync(fd: number, lexical: string, opened: Stats): string | null;
63
+ /**
64
+ * Read a file by path, confined to the project root and validated on the
65
+ * opened descriptor (see the module comment). Throws ConfinedReadError.
66
+ */
67
+ export declare function readConfinedFile(filePath: string, options?: ConfinedReadOptions): Promise<Buffer>;
68
+ /** readConfinedFile decoded as UTF-8. */
69
+ export declare function readConfinedText(filePath: string, options?: ConfinedReadOptions): Promise<string>;
70
+ /** Synchronous readConfinedFile, for callers that cannot await. */
71
+ export declare function readConfinedFileSync(filePath: string, options?: ConfinedReadOptions): Buffer;
72
+ /** readConfinedFileSync decoded as UTF-8. */
73
+ export declare function readConfinedTextSync(filePath: string, options?: ConfinedReadOptions): string;
74
+ //# sourceMappingURL=confined-read.d.ts.map
@@ -0,0 +1,256 @@
1
+ /**
2
+ * #1161: read a file inside the project root without a check-then-use race.
3
+ *
4
+ * The payload path guard (#1126) checks a path by name and the handler opens
5
+ * it again later, so a file or symlink swapped in between could be read
6
+ * unchecked. These readers OPEN first and validate what was opened:
7
+ *
8
+ * - the path's realpath is opened with O_NOFOLLOW (a symlink swapped onto the
9
+ * final name fails the open) and O_NONBLOCK (a FIFO cannot hang the open);
10
+ * - the descriptor must be a regular file within the size limit (fstat);
11
+ * - the descriptor's real location (/proc/self/fd/N on Linux; elsewhere the
12
+ * re-resolved realpath, which must be the same inode) must lie inside the
13
+ * project root, so a directory component swapped for a symlink is caught;
14
+ * - the content is read from that same descriptor, and never past the limit,
15
+ * even if the file grows after the fstat.
16
+ *
17
+ * A path spelled outside the root is refused before any filesystem call,
18
+ * unless the caller opts into `outsideRoot: 'allow'` for paths it accepts
19
+ * from a trusted source (the other checks still apply).
20
+ */
21
+ import { constants as fsConstants } from 'node:fs';
22
+ import * as fsSync from 'node:fs';
23
+ import * as fs from 'node:fs/promises';
24
+ import * as path from 'node:path';
25
+ import { findProjectRoot } from '../../kernel/project-root.js';
26
+ import { CallerInputError } from '../error-utils.js';
27
+ /** Default upper bound for a confined read when the caller names none. */
28
+ export const DEFAULT_MAX_CONFINED_READ_BYTES = 128 * 1024 * 1024;
29
+ /**
30
+ * A confined read that was refused; `reason` matches the payload guard's.
31
+ * `code` is the errno code when the filesystem gave one (ENOENT, ELOOP, ...),
32
+ * otherwise the reason in errno style (OUTSIDE_PROJECT_ROOT, NOT_A_FILE,
33
+ * TOO_LARGE), so callers that report error codes keep working.
34
+ */
35
+ export class ConfinedReadError extends CallerInputError {
36
+ filePath;
37
+ reason;
38
+ code;
39
+ constructor(filePath, reason, errnoCode) {
40
+ super(`Cannot read ${filePath}: ${reason}`);
41
+ this.filePath = filePath;
42
+ this.reason = reason;
43
+ this.name = 'ConfinedReadError';
44
+ this.code = errnoCode ?? reason.toUpperCase().replace(/-/g, '_');
45
+ }
46
+ }
47
+ /** Flags for opening a checked realpath: read-only, no final symlink, no FIFO wait. */
48
+ export const CONFINED_OPEN_FLAGS = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0) | (fsConstants.O_NONBLOCK ?? 0);
49
+ /** True when `candidate` is `root` or lies beneath it (both absolute). */
50
+ export function isWithinRoot(root, candidate) {
51
+ const relative = path.relative(root, candidate);
52
+ return relative === '' || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
53
+ }
54
+ /**
55
+ * Where an OPEN descriptor really points. On Linux, /proc/self/fd/N resolves
56
+ * to the opened file itself. Elsewhere, re-resolve the path and accept it only
57
+ * if it is the same inode as the descriptor, so a swap after the open is
58
+ * detected. Returns null when it cannot be proven.
59
+ */
60
+ export async function openedLocation(fd, lexical, opened) {
61
+ const sameFile = async (candidate) => {
62
+ const st = await fs.stat(candidate).catch(() => null);
63
+ return st !== null && st.dev === opened.dev && st.ino === opened.ino;
64
+ };
65
+ const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
66
+ if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
67
+ return viaProc;
68
+ const real = await fs.realpath(lexical).catch(() => null);
69
+ if (real && await sameFile(real))
70
+ return real;
71
+ return null;
72
+ }
73
+ /** Synchronous openedLocation, for callers that read synchronously. */
74
+ export function openedLocationSync(fd, lexical, opened) {
75
+ const sameFile = (candidate) => {
76
+ try {
77
+ const st = fsSync.statSync(candidate);
78
+ return st.dev === opened.dev && st.ino === opened.ino;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ };
84
+ const realOrNull = (p) => {
85
+ try {
86
+ return fsSync.realpathSync(p);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ };
92
+ const viaProc = realOrNull(`/proc/self/fd/${fd}`);
93
+ if (viaProc && path.isAbsolute(viaProc) && sameFile(viaProc))
94
+ return viaProc;
95
+ const real = realOrNull(lexical);
96
+ if (real && sameFile(real))
97
+ return real;
98
+ return null;
99
+ }
100
+ function reasonFor(error) {
101
+ const code = error?.code;
102
+ if (code === 'ENOENT' || code === 'ENOTDIR')
103
+ return 'not-found';
104
+ // ELOOP: a symlink was swapped onto the checked realpath's final name.
105
+ if (code === 'EISDIR' || code === 'ELOOP')
106
+ return 'not-a-file';
107
+ return 'unreadable';
108
+ }
109
+ function fail(filePath, reason, error) {
110
+ return new ConfinedReadError(filePath, reason, error?.code);
111
+ }
112
+ function plan(filePath, rootReal, options) {
113
+ if (typeof filePath !== 'string' || filePath === '' || filePath.includes('\0')) {
114
+ throw fail(String(filePath), 'unreadable');
115
+ }
116
+ const rootLexical = path.resolve(options.projectRoot ?? findProjectRoot());
117
+ const lexical = path.resolve(filePath);
118
+ const inRoot = isWithinRoot(rootLexical, lexical) || isWithinRoot(rootReal, lexical);
119
+ // Spelled outside the root: refused before any filesystem call, so the
120
+ // reason cannot reveal whether an outside path exists.
121
+ if (!inRoot && options.outsideRoot !== 'allow')
122
+ throw fail(filePath, 'outside-project-root');
123
+ return { lexical, rootReal, inRoot, limit: options.maxBytes ?? DEFAULT_MAX_CONFINED_READ_BYTES };
124
+ }
125
+ /** Check the opened descriptor's stat before anything is read. */
126
+ function checkOpened(filePath, st, limit) {
127
+ if (!st.isFile())
128
+ throw fail(filePath, 'not-a-file');
129
+ if (st.size > limit)
130
+ throw fail(filePath, 'too-large');
131
+ }
132
+ /**
133
+ * Read a file by path, confined to the project root and validated on the
134
+ * opened descriptor (see the module comment). Throws ConfinedReadError.
135
+ */
136
+ export async function readConfinedFile(filePath, options = {}) {
137
+ const root = path.resolve(options.projectRoot ?? findProjectRoot());
138
+ const rootReal = await fs.realpath(root).catch(() => root);
139
+ const p = plan(filePath, rootReal, options);
140
+ let real;
141
+ try {
142
+ real = await fs.realpath(p.lexical);
143
+ }
144
+ catch (error) {
145
+ throw fail(filePath, reasonFor(error), error);
146
+ }
147
+ if (p.inRoot && !isWithinRoot(p.rootReal, real))
148
+ throw fail(filePath, 'outside-project-root');
149
+ let handle;
150
+ try {
151
+ handle = await fs.open(real, CONFINED_OPEN_FLAGS);
152
+ }
153
+ catch (error) {
154
+ throw fail(filePath, reasonFor(error), error);
155
+ }
156
+ try {
157
+ const st = await handle.stat();
158
+ checkOpened(filePath, st, p.limit);
159
+ if (p.inRoot) {
160
+ const location = await openedLocation(handle.fd, real, st);
161
+ if (!location || !isWithinRoot(p.rootReal, location))
162
+ throw fail(filePath, 'outside-project-root');
163
+ }
164
+ // Read at most limit + 1 bytes from this descriptor: a file that grew
165
+ // after the fstat is refused rather than read without bound.
166
+ const chunks = [];
167
+ let total = 0;
168
+ for (;;) {
169
+ const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
170
+ const { bytesRead } = await handle.read(chunk, 0, chunk.length, null);
171
+ if (bytesRead === 0)
172
+ break;
173
+ chunks.push(chunk.subarray(0, bytesRead));
174
+ total += bytesRead;
175
+ if (total > p.limit)
176
+ throw fail(filePath, 'too-large');
177
+ }
178
+ return Buffer.concat(chunks, total);
179
+ }
180
+ catch (error) {
181
+ if (error instanceof ConfinedReadError)
182
+ throw error;
183
+ throw fail(filePath, reasonFor(error), error);
184
+ }
185
+ finally {
186
+ await handle.close().catch(() => undefined);
187
+ }
188
+ }
189
+ /** readConfinedFile decoded as UTF-8. */
190
+ export async function readConfinedText(filePath, options = {}) {
191
+ return (await readConfinedFile(filePath, options)).toString('utf-8');
192
+ }
193
+ /** Synchronous readConfinedFile, for callers that cannot await. */
194
+ export function readConfinedFileSync(filePath, options = {}) {
195
+ const root = path.resolve(options.projectRoot ?? findProjectRoot());
196
+ let rootReal = root;
197
+ try {
198
+ rootReal = fsSync.realpathSync(root);
199
+ }
200
+ catch { /* keep the lexical root */ }
201
+ const p = plan(filePath, rootReal, options);
202
+ let real;
203
+ try {
204
+ real = fsSync.realpathSync(p.lexical);
205
+ }
206
+ catch (error) {
207
+ throw fail(filePath, reasonFor(error), error);
208
+ }
209
+ if (p.inRoot && !isWithinRoot(p.rootReal, real))
210
+ throw fail(filePath, 'outside-project-root');
211
+ let fd;
212
+ try {
213
+ fd = fsSync.openSync(real, CONFINED_OPEN_FLAGS);
214
+ }
215
+ catch (error) {
216
+ throw fail(filePath, reasonFor(error), error);
217
+ }
218
+ try {
219
+ const st = fsSync.fstatSync(fd);
220
+ checkOpened(filePath, st, p.limit);
221
+ if (p.inRoot) {
222
+ const location = openedLocationSync(fd, real, st);
223
+ if (!location || !isWithinRoot(p.rootReal, location))
224
+ throw fail(filePath, 'outside-project-root');
225
+ }
226
+ const chunks = [];
227
+ let total = 0;
228
+ for (;;) {
229
+ const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, p.limit + 1 - total));
230
+ const bytesRead = fsSync.readSync(fd, chunk, 0, chunk.length, null);
231
+ if (bytesRead === 0)
232
+ break;
233
+ chunks.push(chunk.subarray(0, bytesRead));
234
+ total += bytesRead;
235
+ if (total > p.limit)
236
+ throw fail(filePath, 'too-large');
237
+ }
238
+ return Buffer.concat(chunks, total);
239
+ }
240
+ catch (error) {
241
+ if (error instanceof ConfinedReadError)
242
+ throw error;
243
+ throw fail(filePath, reasonFor(error), error);
244
+ }
245
+ finally {
246
+ try {
247
+ fsSync.closeSync(fd);
248
+ }
249
+ catch { /* already closed */ }
250
+ }
251
+ }
252
+ /** readConfinedFileSync decoded as UTF-8. */
253
+ export function readConfinedTextSync(filePath, options = {}) {
254
+ return readConfinedFileSync(filePath, options).toString('utf-8');
255
+ }
256
+ //# sourceMappingURL=confined-read.js.map
@@ -74,12 +74,12 @@ export declare class FileReader {
74
74
  */
75
75
  private inProjectRoot;
76
76
  /**
77
- * #1021 round 2b: read an in-root path without a check-then-use race.
78
- * The file is OPENED first and the open descriptor is verified — its real
79
- * location (/proc/self/fd/N on Linux; otherwise the re-resolved realpath,
80
- * which must be the same inode) must lie inside the root — and the content
81
- * is read from that same descriptor. Swapping a symlink (file or directory
82
- * component) between the check and the read can no longer redirect it.
77
+ * #1021 round 2b / #1161: read an in-root path without a check-then-use
78
+ * race. readConfinedText opens the path once and verifies the opened
79
+ * descriptor (a regular file whose real location lies inside the root) and
80
+ * reads from that same descriptor, so swapping a symlink (file or directory
81
+ * component) between a check and the read cannot redirect it, and a FIFO or
82
+ * device cannot hang or flood the read.
83
83
  */
84
84
  private readContained;
85
85
  /**
@@ -7,6 +7,7 @@ import * as path from 'node:path';
7
7
  import { ok, err } from '../types/index.js';
8
8
  import { validatePath } from '../security/path-traversal-validator.js';
9
9
  import { safeJsonParse } from '../safe-json.js';
10
+ import { ConfinedReadError, readConfinedText } from './confined-read.js';
10
11
  /** Extensions never read, inside or outside the project root. */
11
12
  const DENIED_EXTENSIONS = ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'];
12
13
  export class FileReadError extends Error {
@@ -65,25 +66,6 @@ function readError(error, absolutePath) {
65
66
  }
66
67
  return new FileReadError(message, absolutePath, nodeError.code, nodeError);
67
68
  }
68
- /**
69
- * #1021 round 2b: where an OPEN descriptor really points. On Linux,
70
- * /proc/self/fd/N resolves to the opened file itself. Elsewhere, re-resolve
71
- * the path and accept it only if it is the same inode as the descriptor, so
72
- * a swap after the open is detected. Returns null when it cannot be proven.
73
- */
74
- async function openedLocation(fd, lexical, opened) {
75
- const sameFile = async (candidate) => {
76
- const st = await fs.stat(candidate).catch(() => null);
77
- return st !== null && st.dev === opened.dev && st.ino === opened.ino;
78
- };
79
- const viaProc = await fs.realpath(`/proc/self/fd/${fd}`).catch(() => null);
80
- if (viaProc && path.isAbsolute(viaProc) && await sameFile(viaProc))
81
- return viaProc;
82
- const real = await fs.realpath(lexical).catch(() => null);
83
- if (real && await sameFile(real))
84
- return real;
85
- return null;
86
- }
87
69
  /** True when `candidate` is `root` or lies beneath it (both absolute). */
88
70
  function isWithin(root, candidate) {
89
71
  const relative = path.relative(root, candidate);
@@ -341,38 +323,30 @@ export class FileReader {
341
323
  return { lexical, rootReal };
342
324
  }
343
325
  /**
344
- * #1021 round 2b: read an in-root path without a check-then-use race.
345
- * The file is OPENED first and the open descriptor is verified — its real
346
- * location (/proc/self/fd/N on Linux; otherwise the re-resolved realpath,
347
- * which must be the same inode) must lie inside the root — and the content
348
- * is read from that same descriptor. Swapping a symlink (file or directory
349
- * component) between the check and the read can no longer redirect it.
326
+ * #1021 round 2b / #1161: read an in-root path without a check-then-use
327
+ * race. readConfinedText opens the path once and verifies the opened
328
+ * descriptor (a regular file whose real location lies inside the root) and
329
+ * reads from that same descriptor, so swapping a symlink (file or directory
330
+ * component) between a check and the read cannot redirect it, and a FIFO or
331
+ * device cannot hang or flood the read.
350
332
  */
351
333
  async readContained(filePath, lexical, rootReal) {
352
334
  this.stats.totalReads++;
353
- let handle;
354
335
  try {
355
- handle = await fs.open(lexical, 'r');
336
+ // The lexical root, so a path spelled under a symlinked root still
337
+ // counts as inside; the primitive resolves the root's realpath itself.
338
+ return ok(await readConfinedText(lexical, { projectRoot: this.projectRoot ?? rootReal }));
356
339
  }
357
340
  catch (error) {
358
- return err(readError(error, lexical));
359
- }
360
- try {
361
- const opened = await handle.stat();
362
- const location = await openedLocation(handle.fd, lexical, opened);
363
- if (!location || !isWithin(rootReal, location)) {
341
+ if (!(error instanceof ConfinedReadError))
342
+ return err(readError(error, lexical));
343
+ if (error.reason === 'outside-project-root') {
364
344
  return err(new PathTraversalError(filePath, ['Path resolves outside the project root'], 'critical'));
365
345
  }
366
- if (!opened.isFile()) {
367
- return err(new FileReadError('Path is a directory: ' + lexical, lexical, 'EISDIR'));
346
+ if (error.reason === 'not-a-file') {
347
+ return err(new FileReadError('Not a regular file: ' + lexical, lexical, error.code === 'NOT_A_FILE' ? 'EISDIR' : error.code));
368
348
  }
369
- return ok(await handle.readFile('utf-8'));
370
- }
371
- catch (error) {
372
- return err(readError(error, lexical));
373
- }
374
- finally {
375
- await handle.close().catch(() => undefined);
349
+ return err(readError({ code: error.reason === 'not-found' ? 'ENOENT' : error.code }, lexical));
376
350
  }
377
351
  }
378
352
  /**