agentic-qe 3.14.8 → 3.15.0

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 (375) hide show
  1. package/.claude/skills/release/SKILL.md +6 -0
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +145 -0
  4. package/README.md +143 -366
  5. package/assets/readme/credit-ruflo.svg +1 -0
  6. package/assets/readme/credit-ruvector.svg +1 -0
  7. package/assets/readme/project-header.svg +1 -0
  8. package/assets/readme/quality-loop.svg +1 -0
  9. package/assets/skills/skills-manifest.json +1 -1
  10. package/dist/adapters/a2a/notifications/retry-queue.js +5 -1
  11. package/dist/adapters/ag-ui/json-patch.js +14 -7
  12. package/dist/adapters/ag-ui/state-delta-cache.js +20 -12
  13. package/dist/cli/bundle.js +5 -5
  14. package/dist/cli/chunks/adapter-D7G5MIDQ.js +2 -0
  15. package/dist/cli/chunks/{agent-booster-wasm-67OKGDGZ.js → agent-booster-wasm-GDHJ6QUN.js} +2 -2
  16. package/dist/cli/chunks/{agent-handler-4HZEQ3WQ.js → agent-handler-MPYYQ2RZ.js} +2 -2
  17. package/dist/cli/chunks/{agent-memory-branch-IBHZQSRN.js → agent-memory-branch-QBSHKLA2.js} +2 -2
  18. package/dist/cli/chunks/aqe-learning-engine-G6TUFGHC.js +2 -0
  19. package/dist/cli/chunks/{arena-LCLRGUIK.js → arena-UJE2FROF.js} +4 -4
  20. package/dist/cli/chunks/{arena-EJBIGSF4.js → arena-WIGSL37B.js} +2 -2
  21. package/dist/cli/chunks/{audit-PY4JNDQQ.js → audit-VT7Y2Z7V.js} +3 -3
  22. package/dist/cli/chunks/base-B45BOC7E.js +2 -0
  23. package/dist/cli/chunks/{better-sqlite3-2JG5K6XT.js → better-sqlite3-DSL7LFRK.js} +2 -2
  24. package/dist/cli/chunks/{brain-handler-3UYK55GA.js → brain-handler-N3C2MDMK.js} +3 -3
  25. package/dist/cli/chunks/{branch-enumerator-GOSWOX46.js → branch-enumerator-B6NSQ3PZ.js} +2 -2
  26. package/dist/cli/chunks/{browser-DC2JV47Z.js → browser-KQ3YNRGW.js} +2 -2
  27. package/dist/cli/chunks/browser-workflow-MIBU4XMV.js +2 -0
  28. package/dist/cli/chunks/{chunk-RM6OC35G.js → chunk-2ORTL5WG.js} +1 -1
  29. package/dist/cli/chunks/{chunk-B2QKBQYD.js → chunk-2ZEV3O24.js} +1 -1
  30. package/dist/cli/chunks/{chunk-H5UH234L.js → chunk-32YSI6OT.js} +1 -1
  31. package/dist/cli/chunks/{chunk-GQJ4QDEN.js → chunk-3DKYBHNA.js} +4 -4
  32. package/dist/cli/chunks/{chunk-BFIXUKOR.js → chunk-3Y24VTZ3.js} +1 -1
  33. package/dist/cli/chunks/{chunk-G36RZF2Y.js → chunk-4BWDCUZZ.js} +1 -1
  34. package/dist/cli/chunks/{chunk-JRLZ7LZ3.js → chunk-4DCDIKBX.js} +2 -2
  35. package/dist/cli/chunks/{chunk-BHPTHC5O.js → chunk-4EEY23JS.js} +2 -2
  36. package/dist/cli/chunks/{chunk-NJEEKYEP.js → chunk-4FOKHGP5.js} +2 -2
  37. package/dist/cli/chunks/{chunk-NEXBTLN6.js → chunk-4OQSAUKR.js} +2 -2
  38. package/dist/cli/chunks/{chunk-KNSQWM2E.js → chunk-4YPL3OXS.js} +2 -2
  39. package/dist/cli/chunks/{chunk-QQVE65ER.js → chunk-5DJGP4TA.js} +2 -2
  40. package/dist/cli/chunks/{chunk-7TNCEVWX.js → chunk-5KN4QL3G.js} +2 -2
  41. package/dist/cli/chunks/{chunk-T6W2EYHC.js → chunk-5LN7FQZI.js} +2 -2
  42. package/dist/cli/chunks/{chunk-KKXH25IH.js → chunk-5PNRUMRV.js} +2 -2
  43. package/dist/cli/chunks/{chunk-G3C7Z6FO.js → chunk-62IEVKN3.js} +2 -2
  44. package/dist/cli/chunks/{chunk-3576QGPP.js → chunk-6GTIJNRO.js} +1 -1
  45. package/dist/cli/chunks/{chunk-SKJQKOFJ.js → chunk-6MN4L6BS.js} +2 -2
  46. package/dist/cli/chunks/{chunk-JTOFLDU7.js → chunk-7D6NVIGP.js} +6 -6
  47. package/dist/cli/chunks/{chunk-M7QKCHLQ.js → chunk-7JABIXP3.js} +2 -2
  48. package/dist/cli/chunks/chunk-7JC3LHA6.js +742 -0
  49. package/dist/cli/chunks/{chunk-LQVS5IWH.js → chunk-7WUHVGGT.js} +2 -2
  50. package/dist/cli/chunks/{chunk-I6NZFBT3.js → chunk-A37YYHUD.js} +2 -2
  51. package/dist/cli/chunks/{chunk-FRC7AFB4.js → chunk-AAQNRZKT.js} +2 -2
  52. package/dist/cli/chunks/{chunk-SPS472C5.js → chunk-AGYPPPXR.js} +2 -2
  53. package/dist/cli/chunks/chunk-AIE6OKCD.js +2 -0
  54. package/dist/cli/chunks/{chunk-5X4HDW5W.js → chunk-ANUZGOLQ.js} +2 -2
  55. package/dist/cli/chunks/{chunk-XFT4FYTC.js → chunk-AQZSF32Y.js} +2 -2
  56. package/dist/cli/chunks/{chunk-BITFGVZ4.js → chunk-ATXAMGVE.js} +2 -2
  57. package/dist/cli/chunks/{chunk-VAXTPLO3.js → chunk-AV3RX2L5.js} +2 -2
  58. package/dist/cli/chunks/{chunk-GHMJFICO.js → chunk-AW5OWYQ4.js} +2 -2
  59. package/dist/cli/chunks/{chunk-GA63ESNT.js → chunk-B6QTNTCU.js} +2 -2
  60. package/dist/cli/chunks/{chunk-HHANMCD2.js → chunk-BAPMEDWC.js} +1 -1
  61. package/dist/cli/chunks/{chunk-EKO5QL2B.js → chunk-BH2SQQ2N.js} +1 -1
  62. package/dist/cli/chunks/{chunk-W7JUD4EZ.js → chunk-C6M27NQE.js} +2 -2
  63. package/dist/cli/chunks/{chunk-4PY44TKH.js → chunk-CMYZWIXS.js} +2 -2
  64. package/dist/cli/chunks/{chunk-3FCHH4VP.js → chunk-CZWWC7GC.js} +1 -1
  65. package/dist/cli/chunks/{chunk-DSJJHPPS.js → chunk-D7NOHASX.js} +3 -3
  66. package/dist/cli/chunks/{chunk-N3ASALOL.js → chunk-DGRE6ZAA.js} +2 -2
  67. package/dist/cli/chunks/{chunk-U2QTL5T2.js → chunk-DSGRXW6K.js} +3 -3
  68. package/dist/cli/chunks/{chunk-F2WAB4WK.js → chunk-DXA7RLYU.js} +2 -2
  69. package/dist/cli/chunks/{chunk-C647D42G.js → chunk-DZHIE5UW.js} +2 -2
  70. package/dist/cli/chunks/{chunk-EMOZ5O5S.js → chunk-EBK6CUBD.js} +1 -1
  71. package/dist/cli/chunks/{chunk-PVJLQ2YZ.js → chunk-EPEKEUCF.js} +1 -1
  72. package/dist/cli/chunks/{chunk-UHLZKH6B.js → chunk-EQ4SDE4L.js} +25 -25
  73. package/dist/cli/chunks/{chunk-HE3BDBAO.js → chunk-EZPWSS3B.js} +2 -2
  74. package/dist/cli/chunks/{chunk-TCQWVVSR.js → chunk-F76SYOBT.js} +1 -1
  75. package/dist/cli/chunks/{chunk-7X3LMTRA.js → chunk-F7JVDLOI.js} +2 -2
  76. package/dist/cli/chunks/{chunk-CLUHGBLN.js → chunk-FCSETOWZ.js} +1 -1
  77. package/dist/cli/chunks/{chunk-77WL5HQW.js → chunk-FFE4XAQA.js} +1 -1
  78. package/dist/cli/chunks/{chunk-4HXFPBAA.js → chunk-FPTZP7W5.js} +1 -1
  79. package/dist/cli/chunks/{chunk-6GNWVPMR.js → chunk-FTFIA4I5.js} +2 -2
  80. package/dist/cli/chunks/{chunk-YHX74M7C.js → chunk-FTS6NGBP.js} +2 -2
  81. package/dist/cli/chunks/{chunk-UNFE4RPV.js → chunk-FZ3TQAPW.js} +1 -1
  82. package/dist/cli/chunks/{chunk-UIWXKRTK.js → chunk-G35KP72N.js} +2 -2
  83. package/dist/cli/chunks/{chunk-D2Y36V5J.js → chunk-GCHDMO5V.js} +2 -2
  84. package/dist/cli/chunks/{chunk-ES7TAJRJ.js → chunk-GRN47ANK.js} +2 -2
  85. package/dist/cli/chunks/{chunk-OVMG6EEF.js → chunk-GV7P5JYF.js} +2 -2
  86. package/dist/cli/chunks/{chunk-XAESN54Q.js → chunk-GX5RFGW2.js} +1 -1
  87. package/dist/cli/chunks/{chunk-SUNXA2UR.js → chunk-H77AUJNW.js} +2 -2
  88. package/dist/cli/chunks/{chunk-T4WQPE77.js → chunk-HBIV7PQH.js} +1 -1
  89. package/dist/cli/chunks/{chunk-VCSNNLWL.js → chunk-HOPXHZA3.js} +2 -2
  90. package/dist/cli/chunks/{chunk-GK5WLUX3.js → chunk-I3BH3KIF.js} +1 -1
  91. package/dist/cli/chunks/{chunk-RTD4U7IW.js → chunk-ILKMNDUM.js} +2 -2
  92. package/dist/cli/chunks/{chunk-LMAI74EP.js → chunk-IRHBR56R.js} +1 -1
  93. package/dist/cli/chunks/{chunk-DZHXCOSK.js → chunk-ISAMM7QA.js} +1 -1
  94. package/dist/cli/chunks/{chunk-6VTC3OHD.js → chunk-ISGFAMHZ.js} +2 -2
  95. package/dist/cli/chunks/{chunk-QPACHVDI.js → chunk-J46XGXPS.js} +1 -1
  96. package/dist/cli/chunks/{chunk-T53ZN4NO.js → chunk-J4XCBOPA.js} +2 -2
  97. package/dist/cli/chunks/{chunk-LKFBW2QM.js → chunk-JIWMFLHV.js} +2 -2
  98. package/dist/cli/chunks/{chunk-A5CLVZC3.js → chunk-JJ7WAU4I.js} +2 -2
  99. package/dist/cli/chunks/{chunk-CQEWL32R.js → chunk-JLPNYHJJ.js} +1 -1
  100. package/dist/cli/chunks/{chunk-6F7MFHTY.js → chunk-JO2YLIZH.js} +2 -2
  101. package/dist/cli/chunks/{chunk-VSPNIDQK.js → chunk-JSYNSJDQ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-AJMAKUS3.js → chunk-JYRBOSOF.js} +2 -2
  103. package/dist/cli/chunks/{chunk-3S5IIK32.js → chunk-KEZ4PXVF.js} +1 -1
  104. package/dist/cli/chunks/{chunk-TT45RCLN.js → chunk-KLGFEHEN.js} +2 -2
  105. package/dist/cli/chunks/{chunk-673XJBGW.js → chunk-KU4WLKDK.js} +2 -2
  106. package/dist/cli/chunks/{chunk-EXQGHTPD.js → chunk-KUTMQBV4.js} +4 -4
  107. package/dist/cli/chunks/{chunk-A53MMSGC.js → chunk-L6PUBB6L.js} +2 -2
  108. package/dist/cli/chunks/{chunk-F6JJNBE5.js → chunk-LDJ5DZT5.js} +1 -1
  109. package/dist/cli/chunks/{chunk-25EEIAHS.js → chunk-LLS6JYPN.js} +2 -2
  110. package/dist/cli/chunks/{chunk-NWUFTLSF.js → chunk-LPCFIFZF.js} +2 -2
  111. package/dist/cli/chunks/{chunk-SMBGK7XI.js → chunk-M5EKZA7Q.js} +1 -1
  112. package/dist/cli/chunks/{chunk-YIWBJ637.js → chunk-MEYSIVMP.js} +2 -2
  113. package/dist/cli/chunks/{chunk-BUVJIVFG.js → chunk-MFGLRMO4.js} +1 -1
  114. package/dist/cli/chunks/{chunk-HBAFXWSO.js → chunk-MM57SD2F.js} +1 -1
  115. package/dist/cli/chunks/{chunk-UQGIC5OX.js → chunk-MO3QXLF2.js} +1 -1
  116. package/dist/cli/chunks/{chunk-WFKE7NZ5.js → chunk-MRIZY6HB.js} +2 -2
  117. package/dist/cli/chunks/{chunk-O4QB2GFL.js → chunk-N2MDNEF7.js} +2 -2
  118. package/dist/cli/chunks/{chunk-GVLRE3BV.js → chunk-N5ZHIQAV.js} +3 -3
  119. package/dist/cli/chunks/{chunk-6GJWT2OY.js → chunk-NZ556KZN.js} +2 -2
  120. package/dist/cli/chunks/{chunk-K6EOHGKS.js → chunk-O5AUOBGU.js} +2 -2
  121. package/dist/cli/chunks/{chunk-RJJIPTVH.js → chunk-OBSX3I4Y.js} +2 -2
  122. package/dist/cli/chunks/{chunk-3X2JSW3R.js → chunk-OLD2CIDI.js} +1 -1
  123. package/dist/cli/chunks/{chunk-AJ5PCJQ2.js → chunk-OTJ22IO2.js} +3 -3
  124. package/dist/cli/chunks/{chunk-J5HTQHJK.js → chunk-OYVDTD3A.js} +2 -2
  125. package/dist/cli/chunks/{chunk-JDOVO4E4.js → chunk-P2PPJUGD.js} +126 -130
  126. package/dist/cli/chunks/{chunk-TUZNWRYC.js → chunk-P4FRYNHL.js} +1 -1
  127. package/dist/cli/chunks/{chunk-56M4QNXU.js → chunk-P4WE6VRR.js} +2 -2
  128. package/dist/cli/chunks/{chunk-QDRFLM77.js → chunk-P725KXHX.js} +2 -2
  129. package/dist/cli/chunks/{chunk-AOD2ES44.js → chunk-P7MNF2SK.js} +2 -2
  130. package/dist/cli/chunks/{chunk-EBV3WFIR.js → chunk-PJU5HVWV.js} +2 -2
  131. package/dist/cli/chunks/{chunk-LTHV4PIG.js → chunk-PN3FYSQ6.js} +2 -2
  132. package/dist/cli/chunks/{chunk-CIEXUYY7.js → chunk-PPFW3H7E.js} +1 -1
  133. package/dist/cli/chunks/{chunk-L5T32SRF.js → chunk-Q4RCUCHD.js} +1 -1
  134. package/dist/cli/chunks/{chunk-Z5UZOYQS.js → chunk-QRALXNNX.js} +2 -2
  135. package/dist/cli/chunks/{chunk-CBWM5NOO.js → chunk-QVX22EIM.js} +2 -2
  136. package/dist/cli/chunks/{chunk-JQAJUXRE.js → chunk-R6CZCMKD.js} +2 -2
  137. package/dist/cli/chunks/chunk-ROK5YQ5P.js +3 -0
  138. package/dist/cli/chunks/{chunk-QP7EKLWU.js → chunk-S2GNFAOC.js} +2 -2
  139. package/dist/cli/chunks/{chunk-JRK5GX56.js → chunk-S644OORE.js} +1 -1
  140. package/dist/cli/chunks/{chunk-TGRHO4ES.js → chunk-S7CROKX4.js} +2 -2
  141. package/dist/cli/chunks/{chunk-BT3MI2BW.js → chunk-S7QUHLXV.js} +1 -1
  142. package/dist/cli/chunks/{chunk-SVP3BP52.js → chunk-UGYXUPGN.js} +2 -2
  143. package/dist/cli/chunks/{chunk-ISBOHF6Y.js → chunk-URRPJ3M7.js} +1 -1
  144. package/dist/cli/chunks/{chunk-R6I5I724.js → chunk-URUOTHPO.js} +2 -2
  145. package/dist/cli/chunks/{chunk-QKM4XT2F.js → chunk-VCYOFWMG.js} +2 -2
  146. package/dist/cli/chunks/{chunk-BCCSV3RH.js → chunk-VQVFGFYK.js} +1 -1
  147. package/dist/cli/chunks/{chunk-QH7C4PTX.js → chunk-VT5SMBEM.js} +1 -1
  148. package/dist/cli/chunks/{chunk-WVEHKAIH.js → chunk-VTGRGYY4.js} +3 -3
  149. package/dist/cli/chunks/{chunk-TP7L4EX6.js → chunk-VWCFXCSV.js} +2 -2
  150. package/dist/cli/chunks/{chunk-OZJQN7YE.js → chunk-VY4557VF.js} +2 -2
  151. package/dist/cli/chunks/{chunk-4RNCVSVN.js → chunk-VYERAOQL.js} +2 -2
  152. package/dist/cli/chunks/{chunk-VV2JVYOI.js → chunk-W6H2SOIK.js} +2 -2
  153. package/dist/cli/chunks/{chunk-VW7AXJQS.js → chunk-WBR4VRQE.js} +2 -2
  154. package/dist/cli/chunks/{chunk-T7YCNOW5.js → chunk-WDV6CBED.js} +2 -2
  155. package/dist/cli/chunks/{chunk-Z6G3QVZ4.js → chunk-WO7NPGUD.js} +19 -19
  156. package/dist/cli/chunks/{chunk-AEYJ4ZLA.js → chunk-WPOYFV4X.js} +1 -1
  157. package/dist/cli/chunks/{chunk-3EKG7HFV.js → chunk-WPSGMTI4.js} +3 -3
  158. package/dist/cli/chunks/{chunk-XECZYQT5.js → chunk-WQMXQO3O.js} +2 -2
  159. package/dist/cli/chunks/{chunk-QYCZYJH7.js → chunk-WR54SKKL.js} +2 -2
  160. package/dist/cli/chunks/{chunk-BTBJ2NLH.js → chunk-X4OESN7M.js} +2 -2
  161. package/dist/cli/chunks/{chunk-HPVYJ6JH.js → chunk-X5RELRY7.js} +2 -2
  162. package/dist/cli/chunks/{chunk-BOIUENWW.js → chunk-X7JEBPEW.js} +1 -1
  163. package/dist/cli/chunks/{chunk-OX7MJFLC.js → chunk-XEABMIUH.js} +2 -2
  164. package/dist/cli/chunks/{chunk-BL6273KR.js → chunk-XELFJC77.js} +3 -3
  165. package/dist/cli/chunks/{chunk-775WGWLL.js → chunk-XPUY3ZKD.js} +2 -2
  166. package/dist/cli/chunks/{chunk-BZIPW2PA.js → chunk-XZDPR6I2.js} +2 -2
  167. package/dist/cli/chunks/{chunk-OA75C4HY.js → chunk-Y63DADOR.js} +2 -2
  168. package/dist/cli/chunks/{chunk-F57FTFWS.js → chunk-YFRZVNE4.js} +2 -2
  169. package/dist/cli/chunks/{chunk-CXUC7YKA.js → chunk-YIDZ3TEN.js} +2 -2
  170. package/dist/cli/chunks/{chunk-LRGTPUJA.js → chunk-Z6CRROLU.js} +2 -2
  171. package/dist/cli/chunks/{chunk-J24AJEDE.js → chunk-ZPH2YT3J.js} +2 -2
  172. package/dist/cli/chunks/{chunk-AUFV2G2J.js → chunk-ZV7LJPSI.js} +5 -5
  173. package/dist/cli/chunks/{chunk-AR2S4DOB.js → chunk-ZXIIB3QE.js} +1 -1
  174. package/dist/cli/chunks/{ci-5LIV2HW5.js → ci-63JINRNB.js} +3 -3
  175. package/dist/cli/chunks/{ci-output-UO5BDFU4.js → ci-output-CRFWLUAA.js} +2 -2
  176. package/dist/cli/chunks/{circuit-breaker-UQDPXYRD.js → circuit-breaker-PJLG3WYL.js} +2 -2
  177. package/dist/cli/chunks/{claude-flow-setup-62QES3QX.js → claude-flow-setup-UKHSQMJU.js} +2 -2
  178. package/dist/cli/chunks/client-A4FTITK3.js +2 -0
  179. package/dist/cli/chunks/{cline-installer-X7VZTSZG.js → cline-installer-PYQ27AS3.js} +2 -2
  180. package/dist/cli/chunks/{code-H3BF4L4H.js → code-K7VGLZ3W.js} +3 -3
  181. package/dist/cli/chunks/{code-index-extractor-BJGFZGGL.js → code-index-extractor-NNWAVWSL.js} +2 -2
  182. package/dist/cli/chunks/{codex-installer-KVZWKU6S.js → codex-installer-U4VJIKRN.js} +2 -2
  183. package/dist/cli/chunks/{completions-YMILE6V7.js → completions-DOCI3P4W.js} +2 -2
  184. package/dist/cli/chunks/{complexity-analyzer-J26N2PWG.js → complexity-analyzer-RFW2QRFR.js} +2 -2
  185. package/dist/cli/chunks/{continuedev-installer-MAR42OV7.js → continuedev-installer-S5WXXOBU.js} +2 -2
  186. package/dist/cli/chunks/{copilot-installer-CVOJF6OT.js → copilot-installer-AAQ6YLVJ.js} +2 -2
  187. package/dist/cli/chunks/core-handlers-FO3QTNWI.js +2 -0
  188. package/dist/cli/chunks/{cost-tracker-SXLWXE55.js → cost-tracker-R4VOHTWQ.js} +2 -2
  189. package/dist/cli/chunks/{coverage-D7HCHFP3.js → coverage-P54HPCLV.js} +3 -3
  190. package/dist/cli/chunks/cross-domain-router-LIV6SRWF.js +2 -0
  191. package/dist/cli/chunks/{cursor-installer-X37VHIKW.js → cursor-installer-VHBWZE5A.js} +2 -2
  192. package/dist/cli/chunks/{daemon-JN7SOH6F.js → daemon-BTRSWNB4.js} +3 -3
  193. package/dist/cli/chunks/{daemon-LIW47IDM.js → daemon-JLH5TTWZ.js} +4 -4
  194. package/dist/cli/chunks/{dag-attention-scheduler-QCHHIZBT.js → dag-attention-scheduler-5Z6DCRFK.js} +2 -2
  195. package/dist/cli/chunks/{detect-WRFCWAX5.js → detect-NWGASRJJ.js} +2 -2
  196. package/dist/cli/chunks/{dist-node-6FWT4XZO.js → dist-node-XMNNSEFJ.js} +2 -2
  197. package/dist/cli/chunks/{domain-handler-SNFPNMRT.js → domain-handler-BWVBZTNR.js} +2 -2
  198. package/dist/cli/chunks/{domain-plugins-MXKHH62P.js → domain-plugins-YAD4USA4.js} +2 -2
  199. package/dist/cli/chunks/{domain-transfer-47UJNERX.js → domain-transfer-Z3MRPZEZ.js} +2 -2
  200. package/dist/cli/chunks/dream-DNLGHYXY.js +2 -0
  201. package/dist/cli/chunks/{embed-and-insert-pattern-LZFAUNBQ.js → embed-and-insert-pattern-5CCO45WC.js} +2 -2
  202. package/dist/cli/chunks/{eval-AMUXTMJB.js → eval-JEMLTGY4.js} +2 -2
  203. package/dist/cli/chunks/{experience-capture-middleware-3D65TR2C.js → experience-capture-middleware-FKVYBBAN.js} +3 -3
  204. package/dist/cli/chunks/{fast-paths-Y7BBMM56.js → fast-paths-TFL32H3C.js} +2 -2
  205. package/dist/cli/chunks/{feature-flags-VESRRQ6V.js → feature-flags-CNGAUUMT.js} +2 -2
  206. package/dist/cli/chunks/{feature-flags-JMQQ7JW4.js → feature-flags-OHGD2NCW.js} +2 -2
  207. package/dist/cli/chunks/{file-discovery-JJKQQUV6.js → file-discovery-IHGDYW34.js} +2 -2
  208. package/dist/cli/chunks/{fleet-WIGHICJF.js → fleet-OGTSDGJ2.js} +3 -3
  209. package/dist/cli/chunks/{gnn-wrapper-BFNPETTT.js → gnn-wrapper-QYTTKNCE.js} +2 -2
  210. package/dist/cli/chunks/{heartbeat-handler-HDXKTGUI.js → heartbeat-handler-R5OD2SKN.js} +4 -4
  211. package/dist/cli/chunks/heartbeat-scheduler-DL4LXXJF.js +2 -0
  212. package/dist/cli/chunks/hnsw-adapter-Y64M43J4.js +2 -0
  213. package/dist/cli/chunks/hnsw-index-5V6DDMTA.js +2 -0
  214. package/dist/cli/chunks/{hnsw-legacy-bridge-6A7OTAPT.js → hnsw-legacy-bridge-ULJWYXBQ.js} +2 -2
  215. package/dist/cli/chunks/{hnswlib-node-LKV2H47B.js → hnswlib-node-SYKJXGE2.js} +2 -2
  216. package/dist/cli/chunks/{hooks-KDSFYQQG.js → hooks-XAJXPXTU.js} +10 -10
  217. package/dist/cli/chunks/hybrid-backend-JWT2V4FQ.js +2 -0
  218. package/dist/cli/chunks/{hypergraph-engine-GDLPEPUC.js → hypergraph-engine-GIBPGW4N.js} +2 -2
  219. package/dist/cli/chunks/{hypergraph-handler-4UMFA2EW.js → hypergraph-handler-ENFK6IDN.js} +3 -3
  220. package/dist/cli/chunks/impact-analyzer-XUZQSZZC.js +2 -0
  221. package/dist/cli/chunks/{init-handler-4GCHPQHD.js → init-handler-CSA62LGT.js} +6 -6
  222. package/dist/cli/chunks/init-wizard-KDJKHEPN.js +2 -0
  223. package/dist/cli/chunks/kernel-MUDYPGFR.js +2 -0
  224. package/dist/cli/chunks/{kilocode-installer-HJZMT2G5.js → kilocode-installer-YXFIRTSA.js} +2 -2
  225. package/dist/cli/chunks/{kiro-installer-WUPY67HG.js → kiro-installer-JW3BG2MQ.js} +2 -2
  226. package/dist/cli/chunks/knowledge-graph-GR52N7PU.js +2 -0
  227. package/dist/cli/chunks/{learning-AXKIS7IG.js → learning-BDBZ7ZVG.js} +3 -3
  228. package/dist/cli/chunks/{llm-router-HUDPNZLJ.js → llm-router-CCX2DYTC.js} +4 -4
  229. package/dist/cli/chunks/llm-router-service-QL6LVKZ4.js +2 -0
  230. package/dist/cli/chunks/{load-RM44POD7.js → load-UJTTEOOK.js} +2 -2
  231. package/dist/cli/chunks/load-test-76V75WZ5.js +2 -0
  232. package/dist/cli/chunks/{mcp-5JVQRBOP.js → mcp-2NAJYREC.js} +2 -2
  233. package/dist/cli/chunks/{memory-VGZ2V6PL.js → memory-C3UQSN5F.js} +5 -5
  234. package/dist/cli/chunks/memory-backend-SMQRS5QN.js +2 -0
  235. package/dist/cli/chunks/{memory-handlers-EI537Z32.js → memory-handlers-ESFIJENU.js} +2 -2
  236. package/dist/cli/chunks/{multi-model-executor-WPRKCSCM.js → multi-model-executor-SIHSHAD7.js} +2 -2
  237. package/dist/cli/chunks/{opencode-installer-YAJMRCQO.js → opencode-installer-KDYHUGPG.js} +2 -2
  238. package/dist/cli/chunks/{orchestrator-MUGWBUYP.js → orchestrator-MJHIQEHD.js} +5 -5
  239. package/dist/cli/chunks/pattern-null-store-MWAJMOYU.js +2 -0
  240. package/dist/cli/chunks/{pattern-usage-recorder-ZQJJ2YNG.js → pattern-usage-recorder-OLBE4UIF.js} +2 -2
  241. package/dist/cli/chunks/{pipeline-F4DXDUDC.js → pipeline-IOK2CV3U.js} +2 -2
  242. package/dist/cli/chunks/{platform-HI3A3OWF.js → platform-53JQ7JXN.js} +2 -2
  243. package/dist/cli/chunks/{plugin-XRITPTR7.js → plugin-L5SDIWDI.js} +2 -2
  244. package/dist/cli/chunks/{prime-radiant-advanced-wasm-HHNJP7CQ.js → prime-radiant-advanced-wasm-2DS67JFS.js} +2 -2
  245. package/dist/cli/chunks/{project-root-2VN4WO2A.js → project-root-LQMOFO2Z.js} +2 -2
  246. package/dist/cli/chunks/protocol-executor-32X3GAJT.js +2 -0
  247. package/dist/cli/chunks/{protocol-handler-ZEVHSEBG.js → protocol-handler-NXG2M43B.js} +2 -2
  248. package/dist/cli/chunks/{prove-C4BLZWBS.js → prove-7K7PFSSX.js} +2 -2
  249. package/dist/cli/chunks/qe-reasoning-bank-KAFV3TGI.js +2 -0
  250. package/dist/cli/chunks/{quality-M3DTE4KK.js → quality-ATILUGMJ.js} +2 -2
  251. package/dist/cli/chunks/{quality-gate-V6KS7ML3.js → quality-gate-MPZMDPIZ.js} +3 -3
  252. package/dist/cli/chunks/queen-coordinator-L3SODGRX.js +2 -0
  253. package/dist/cli/chunks/{real-embeddings-YWSE3IRT.js → real-embeddings-VZN3KIAI.js} +2 -2
  254. package/dist/cli/chunks/{ref-validation-ZWOTFA3T.js → ref-validation-EUATPVXX.js} +2 -2
  255. package/dist/cli/chunks/{roocode-installer-GJBIWETD.js → roocode-installer-7M2GOUNZ.js} +2 -2
  256. package/dist/cli/chunks/router-DDCSSXYQ.js +2 -0
  257. package/dist/cli/chunks/routing-feedback-RFASKYCD.js +2 -0
  258. package/dist/cli/chunks/{routing-handler-CFYLGNAR.js → routing-handler-VWANE652.js} +2 -2
  259. package/dist/cli/chunks/{ruvector-commands-EDKG456B.js → ruvector-commands-B2YIPGOV.js} +2 -2
  260. package/dist/cli/chunks/rvf-dual-writer-HCIF2G56.js +2 -0
  261. package/dist/cli/chunks/rvf-migration-adapter-UVAHQ7SV.js +2 -0
  262. package/dist/cli/chunks/{rvf-migration-coordinator-ZMEYMAI6.js → rvf-migration-coordinator-RQXOQJ5T.js} +2 -2
  263. package/dist/cli/chunks/rvf-native-adapter-F2I5FFHK.js +2 -0
  264. package/dist/cli/chunks/{rvf-store-integrity-AH6PNJP6.js → rvf-store-integrity-7P5YDXRH.js} +2 -2
  265. package/dist/cli/chunks/safe-db-6ZAA4S23.js +2 -0
  266. package/dist/cli/chunks/schedule-SM5Q6UVP.js +2 -0
  267. package/dist/cli/chunks/scheduler-4EYP4EZ6.js +2 -0
  268. package/dist/cli/chunks/{security-ZU2GW3ZM.js → security-VJ7TVSQF.js} +3 -3
  269. package/dist/cli/chunks/{shared-rvf-adapter-5FOVSL3T.js → shared-rvf-adapter-63NXQFBX.js} +2 -2
  270. package/dist/cli/chunks/{shared-rvf-dual-writer-IO4DC4XV.js → shared-rvf-dual-writer-JQRP7P5A.js} +2 -2
  271. package/dist/cli/chunks/sqlite-persistence-KLN2K266.js +2 -0
  272. package/dist/cli/chunks/{standalone-memory-3UXDZ7HI.js → standalone-memory-WJ72PH5P.js} +2 -2
  273. package/dist/cli/chunks/{status-handler-264CHTWS.js → status-handler-G72ZSLAX.js} +2 -2
  274. package/dist/cli/chunks/{structural-health-E2QPUOZE.js → structural-health-HYBGP4BD.js} +2 -2
  275. package/dist/cli/chunks/{sync-N2L2OST4.js → sync-5YMZZIF4.js} +2 -2
  276. package/dist/cli/chunks/{sync-2ACMWM7D.js → sync-O5FQAHT7.js} +2 -2
  277. package/dist/cli/chunks/{task-handler-IB5CVOTY.js → task-handler-E6IFNHZG.js} +2 -2
  278. package/dist/cli/chunks/{task-handlers-QBMYNJHE.js → task-handlers-P3GC2L5L.js} +3 -3
  279. package/dist/cli/chunks/{test-7RGLRDSP.js → test-OU6ERW67.js} +4 -4
  280. package/dist/cli/chunks/{test-scheduling-RJABJT2W.js → test-scheduling-3HY4I3HY.js} +7 -7
  281. package/dist/cli/chunks/{token-bootstrap-JVHMHB72.js → token-bootstrap-A5QA4CWK.js} +2 -2
  282. package/dist/cli/chunks/{token-usage-3ECHQVCY.js → token-usage-MUNQVPFT.js} +2 -2
  283. package/dist/cli/chunks/{transformers-KJH3IJWI.js → transformers-IEO25W5V.js} +2 -2
  284. package/dist/cli/chunks/{tree-sitter-wasm-parser-XN6PFI32.js → tree-sitter-wasm-parser-T2EQHEAY.js} +2 -2
  285. package/dist/cli/chunks/{types-5BAPXOLS.js → types-ODCPGCID.js} +2 -2
  286. package/dist/cli/chunks/unified-memory-B5IA2KKQ.js +2 -0
  287. package/dist/cli/chunks/unified-memory-hnsw-YF74LL3Z.js +2 -0
  288. package/dist/cli/chunks/unified-persistence-VZMGNGWY.js +2 -0
  289. package/dist/cli/chunks/{upgrade-S5NFQZID.js → upgrade-4DN6EIW2.js} +2 -2
  290. package/dist/cli/chunks/{validate-BIBWOLJD.js → validate-TBNAPDE3.js} +2 -2
  291. package/dist/cli/chunks/{validate-swarm-WAA3LBHH.js → validate-swarm-ZN7XXUY4.js} +2 -2
  292. package/dist/cli/chunks/visual-security-ZV3BLLSH.js +2 -0
  293. package/dist/cli/chunks/{web-tree-sitter-OTBQTHAV.js → web-tree-sitter-DWAWVD2X.js} +2 -2
  294. package/dist/cli/chunks/{windsurf-installer-NNQ22EW6.js → windsurf-installer-U6EROS5S.js} +2 -2
  295. package/dist/cli/chunks/{witness-chain-E7MUBOJW.js → witness-chain-EQEJS2P4.js} +2 -2
  296. package/dist/cli/chunks/witness-chain-OA24MQWX.js +2 -0
  297. package/dist/cli/chunks/{witness-chain-repair-FW4QSN4C.js → witness-chain-repair-KBXDRXS3.js} +2 -2
  298. package/dist/cli/chunks/{witness-chain-verifier-YMROEBVL.js → witness-chain-verifier-HSQGZ4R4.js} +2 -2
  299. package/dist/cli/chunks/{witness-key-manager-4CGRNDMJ.js → witness-key-manager-RAODG73T.js} +2 -2
  300. package/dist/cli/chunks/{workflow-4VRSTRAN.js → workflow-KNFJNNKG.js} +4 -4
  301. package/dist/cli/chunks/workflow-orchestrator-IMX2LSVE.js +2 -0
  302. package/dist/cli/chunks/{wrappers-4M4UTGEU.js → wrappers-NIJBA22T.js} +2 -2
  303. package/dist/cli/utils/workflow-parser.js +73 -57
  304. package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
  305. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +17 -15
  306. package/dist/domains/test-execution/services/retry-handler.js +6 -3
  307. package/dist/governance/ab-benchmarking.d.ts +5 -1
  308. package/dist/governance/ab-benchmarking.js +64 -29
  309. package/dist/mcp/bundle.js +414 -412
  310. package/dist/mcp/security/rate-limiter.d.ts +1 -0
  311. package/dist/mcp/security/rate-limiter.js +22 -5
  312. package/dist/mcp/services/session-store.js +17 -17
  313. package/dist/mcp/tools/planning/goap-status.d.ts +2 -0
  314. package/dist/mcp/tools/planning/goap-status.js +8 -2
  315. package/dist/planning/goap-planner.d.ts +3 -0
  316. package/dist/planning/goap-planner.js +80 -37
  317. package/dist/shared/embeddings/embedding-cache.js +1 -1
  318. package/dist/shared/embeddings/nomic-embedder.js +17 -7
  319. package/dist/shared/embeddings/ollama-client.js +5 -3
  320. package/dist/shared/git/git-analyzer.js +31 -30
  321. package/dist/shared/http/http-client.js +20 -13
  322. package/dist/shared/io/file-reader.js +11 -8
  323. package/dist/shared/llm/cache.d.ts +8 -29
  324. package/dist/shared/llm/cache.js +6 -2
  325. package/dist/shared/llm/cost-tracker.js +2 -1
  326. package/dist/shared/llm/provider-manager.js +4 -22
  327. package/dist/shared/llm/providers/gemini.d.ts +1 -0
  328. package/dist/shared/llm/providers/gemini.js +14 -5
  329. package/dist/shared/llm/providers/openrouter.js +6 -3
  330. package/dist/shared/metrics/code-metrics.js +1 -1
  331. package/dist/shared/metrics/system-metrics.js +8 -2
  332. package/dist/shared/retry-engine.js +2 -12
  333. package/dist/test-scheduling/executors/vitest-executor.js +26 -17
  334. package/package.json +3 -1
  335. package/dist/cli/chunks/adapter-XYCOXQCC.js +0 -2
  336. package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +0 -2
  337. package/dist/cli/chunks/base-5TQ34GMD.js +0 -2
  338. package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +0 -2
  339. package/dist/cli/chunks/chunk-7STWD4KJ.js +0 -3
  340. package/dist/cli/chunks/chunk-PFXCRRR6.js +0 -736
  341. package/dist/cli/chunks/chunk-U64QORFO.js +0 -2
  342. package/dist/cli/chunks/client-AJZKCP4I.js +0 -2
  343. package/dist/cli/chunks/core-handlers-MQHEMGDV.js +0 -2
  344. package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +0 -2
  345. package/dist/cli/chunks/dream-OSWAITPT.js +0 -2
  346. package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +0 -2
  347. package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +0 -2
  348. package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +0 -2
  349. package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +0 -2
  350. package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +0 -2
  351. package/dist/cli/chunks/init-wizard-TAOPXHHD.js +0 -2
  352. package/dist/cli/chunks/kernel-6I6VZUWY.js +0 -2
  353. package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +0 -2
  354. package/dist/cli/chunks/llm-router-service-2D74XVM3.js +0 -2
  355. package/dist/cli/chunks/load-test-53FWOWNS.js +0 -2
  356. package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +0 -2
  357. package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +0 -2
  358. package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +0 -2
  359. package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +0 -2
  360. package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +0 -2
  361. package/dist/cli/chunks/router-ZD4LXAWA.js +0 -2
  362. package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +0 -2
  363. package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +0 -2
  364. package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +0 -2
  365. package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +0 -2
  366. package/dist/cli/chunks/safe-db-F6TRB5KZ.js +0 -2
  367. package/dist/cli/chunks/schedule-HBD4BYTE.js +0 -2
  368. package/dist/cli/chunks/scheduler-6FYWPMQC.js +0 -2
  369. package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +0 -2
  370. package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +0 -2
  371. package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +0 -2
  372. package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +0 -2
  373. package/dist/cli/chunks/visual-security-APOXJ3Q3.js +0 -2
  374. package/dist/cli/chunks/witness-chain-7IP5IJGT.js +0 -2
  375. package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +0 -2
@@ -66,10 +66,11 @@ export class GitAnalyzer {
66
66
  return 0.4; // Default when not in git repo
67
67
  }
68
68
  try {
69
- const relativePath = sanitizeGitArg(this.getRelativePath(filePath));
70
- // Use execFileSync with argument array to prevent injection
69
+ const relativePath = this.getRelativePath(filePath);
70
+ // Literal pathspecs preserve route filenames such as app/[id].tsx.
71
+ // execFileSync passes arguments directly without shell interpretation.
71
72
  const output = execFileSync('git', [
72
- 'log', '--oneline', '--since=90 days ago', '--', relativePath
73
+ '--literal-pathspecs', 'log', '--oneline', '--since=90 days ago', '--', relativePath
73
74
  ], {
74
75
  cwd: this.config.repoRoot,
75
76
  encoding: 'utf-8',
@@ -97,10 +98,10 @@ export class GitAnalyzer {
97
98
  return 0.5; // Default when not in git repo
98
99
  }
99
100
  try {
100
- const relativePath = sanitizeGitArg(this.getRelativePath(filePath));
101
+ const relativePath = this.getRelativePath(filePath);
101
102
  // Get blame info using execFileSync with argument array
102
103
  const blameOutput = execFileSync('git', [
103
- 'blame', '--line-porcelain', '--', relativePath
104
+ '--literal-pathspecs', 'blame', '--line-porcelain', '--', relativePath
104
105
  ], {
105
106
  cwd: this.config.repoRoot,
106
107
  encoding: 'utf-8',
@@ -143,12 +144,12 @@ export class GitAnalyzer {
143
144
  return 0.4; // Default when not in git repo
144
145
  }
145
146
  try {
146
- const relativePath = sanitizeGitArg(this.getRelativePath(filePath));
147
+ const relativePath = this.getRelativePath(filePath);
147
148
  // Get first commit date using execFileSync with argument array
148
149
  let firstCommitTimestamp = NaN;
149
150
  try {
150
151
  const firstCommitOutput = execFileSync('git', [
151
- 'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath
152
+ '--literal-pathspecs', 'log', '--format=%at', '--follow', '--diff-filter=A', '--', relativePath
152
153
  ], {
153
154
  cwd: this.config.repoRoot,
154
155
  encoding: 'utf-8',
@@ -167,7 +168,7 @@ export class GitAnalyzer {
167
168
  let lastCommitTimestamp = NaN;
168
169
  try {
169
170
  const lastCommitOutput = execFileSync('git', [
170
- 'log', '-1', '--format=%at', '--', relativePath
171
+ '--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
171
172
  ], {
172
173
  cwd: this.config.repoRoot,
173
174
  encoding: 'utf-8',
@@ -216,7 +217,7 @@ export class GitAnalyzer {
216
217
  return 0.2; // Default when not in git repo
217
218
  }
218
219
  try {
219
- const relativePath = sanitizeGitArg(this.getRelativePath(filePath));
220
+ const relativePath = this.getRelativePath(filePath);
220
221
  // Search for each keyword separately and count unique commits
221
222
  // This avoids shell injection from keywords config
222
223
  let bugCommits = 0;
@@ -225,7 +226,7 @@ export class GitAnalyzer {
225
226
  const sanitizedKeyword = sanitizeGitArg(keyword);
226
227
  try {
227
228
  const output = execFileSync('git', [
228
- 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
229
+ '--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
229
230
  ], {
230
231
  cwd: this.config.repoRoot,
231
232
  encoding: 'utf-8',
@@ -267,12 +268,12 @@ export class GitAnalyzer {
267
268
  return this.getDefaultFileHistory(filePath);
268
269
  }
269
270
  try {
270
- const relativePath = sanitizeGitArg(this.getRelativePath(filePath));
271
+ const relativePath = this.getRelativePath(filePath);
271
272
  // Get commit count using execFileSync with argument array
272
273
  let totalCommits = 0;
273
274
  try {
274
275
  const commitCountOutput = execFileSync('git', [
275
- 'log', '--oneline', '--', relativePath
276
+ '--literal-pathspecs', 'log', '--oneline', '--', relativePath
276
277
  ], {
277
278
  cwd: this.config.repoRoot,
278
279
  encoding: 'utf-8',
@@ -287,7 +288,7 @@ export class GitAnalyzer {
287
288
  let uniqueAuthors = 0;
288
289
  try {
289
290
  const authorsOutput = execFileSync('git', [
290
- 'log', '--format=%ae', '--', relativePath
291
+ '--literal-pathspecs', 'log', '--format=%ae', '--', relativePath
291
292
  ], {
292
293
  cwd: this.config.repoRoot,
293
294
  encoding: 'utf-8',
@@ -305,7 +306,7 @@ export class GitAnalyzer {
305
306
  let firstCommit = null;
306
307
  try {
307
308
  const firstCommitOutput = execFileSync('git', [
308
- 'log', '--format=%at', '--follow', '--', relativePath
309
+ '--literal-pathspecs', 'log', '--format=%at', '--follow', '--', relativePath
309
310
  ], {
310
311
  cwd: this.config.repoRoot,
311
312
  encoding: 'utf-8',
@@ -328,7 +329,7 @@ export class GitAnalyzer {
328
329
  let lastCommit = null;
329
330
  try {
330
331
  const lastCommitOutput = execFileSync('git', [
331
- 'log', '-1', '--format=%at', '--', relativePath
332
+ '--literal-pathspecs', 'log', '-1', '--format=%at', '--', relativePath
332
333
  ], {
333
334
  cwd: this.config.repoRoot,
334
335
  encoding: 'utf-8',
@@ -361,7 +362,7 @@ export class GitAnalyzer {
361
362
  const sanitizedKeyword = sanitizeGitArg(keyword);
362
363
  try {
363
364
  const bugFixOutput = execFileSync('git', [
364
- 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
365
+ '--literal-pathspecs', 'log', '--oneline', '--grep', sanitizedKeyword, '-i', '--', relativePath
365
366
  ], {
366
367
  cwd: this.config.repoRoot,
367
368
  encoding: 'utf-8',
@@ -410,19 +411,19 @@ export class GitAnalyzer {
410
411
  }
411
412
  try {
412
413
  const sinceDate = since || new Date(Date.now() - 24 * 60 * 60 * 1000);
413
- const sinceStr = sinceDate.toISOString().split('T')[0];
414
+ const sinceStr = sinceDate.toISOString();
414
415
  // Get files changed since the date using execFileSync with argument array
415
416
  const output = execFileSync('git', [
416
- 'log', `--since=${sinceStr}`, '--name-only', '--pretty=format:'
417
+ 'log', `--since=${sinceStr}`, '--name-only', '-z', '--format='
417
418
  ], {
418
419
  cwd: this.config.repoRoot,
419
420
  encoding: 'utf-8',
420
421
  stdio: ['pipe', 'pipe', 'pipe'],
421
- }).trim();
422
+ });
422
423
  if (!output)
423
424
  return [];
424
- // Deduplicate and filter empty lines manually (instead of sort -u | grep -v)
425
- const files = output.split('\n').filter(Boolean);
425
+ // NUL records preserve whitespace, newlines and Git-quoted Unicode paths.
426
+ const files = output.split('\0').filter(Boolean);
426
427
  return Array.from(new Set(files));
427
428
  }
428
429
  catch {
@@ -442,15 +443,15 @@ export class GitAnalyzer {
442
443
  // Sanitize commit hash to prevent injection
443
444
  const sanitizedHash = sanitizeGitArg(commitHash);
444
445
  const output = execFileSync('git', [
445
- 'diff-tree', '--no-commit-id', '--name-only', '-r', sanitizedHash
446
+ 'diff-tree', '--no-commit-id', '--name-only', '-z', '-r', sanitizedHash
446
447
  ], {
447
448
  cwd: this.config.repoRoot,
448
449
  encoding: 'utf-8',
449
450
  stdio: ['pipe', 'pipe', 'pipe'],
450
- }).trim();
451
+ });
451
452
  if (!output)
452
453
  return [];
453
- return output.split('\n').filter(Boolean);
454
+ return output.split('\0').filter(Boolean);
454
455
  }
455
456
  catch {
456
457
  return [];
@@ -469,14 +470,14 @@ export class GitAnalyzer {
469
470
  // Get unstaged changes using execFileSync with argument array
470
471
  try {
471
472
  const unstagedOutput = execFileSync('git', [
472
- 'diff', '--name-only', 'HEAD'
473
+ 'diff', '--name-only', '-z', 'HEAD'
473
474
  ], {
474
475
  cwd: this.config.repoRoot,
475
476
  encoding: 'utf-8',
476
477
  stdio: ['pipe', 'pipe', 'pipe'],
477
- }).trim();
478
+ });
478
479
  if (unstagedOutput) {
479
- files.push(...unstagedOutput.split('\n').filter(Boolean));
480
+ files.push(...unstagedOutput.split('\0').filter(Boolean));
480
481
  }
481
482
  }
482
483
  catch {
@@ -485,14 +486,14 @@ export class GitAnalyzer {
485
486
  // Get staged changes using execFileSync with argument array
486
487
  try {
487
488
  const stagedOutput = execFileSync('git', [
488
- 'diff', '--name-only', '--cached'
489
+ 'diff', '--name-only', '-z', '--cached'
489
490
  ], {
490
491
  cwd: this.config.repoRoot,
491
492
  encoding: 'utf-8',
492
493
  stdio: ['pipe', 'pipe', 'pipe'],
493
- }).trim();
494
+ });
494
495
  if (stagedOutput) {
495
- files.push(...stagedOutput.split('\n').filter(Boolean));
496
+ files.push(...stagedOutput.split('\0').filter(Boolean));
496
497
  }
497
498
  }
498
499
  catch {
@@ -74,8 +74,9 @@ class CircuitBreaker {
74
74
  }
75
75
  return false;
76
76
  }
77
- // half-open: allow one request through
78
- return true;
77
+ // The open -> half-open transition already admitted the recovery probe.
78
+ // Keep further requests out until that probe records success or failure.
79
+ return false;
79
80
  }
80
81
  reset(url) {
81
82
  if (url) {
@@ -253,17 +254,23 @@ export class HttpClient {
253
254
  if (!error) {
254
255
  return 'UNKNOWN_ERROR';
255
256
  }
256
- if (error.name === 'AbortError') {
257
- return 'TIMEOUT';
258
- }
259
- if (error.message.includes('ECONNREFUSED')) {
260
- return 'CONNECTION_REFUSED';
261
- }
262
- if (error.message.includes('ENOTFOUND')) {
263
- return 'DNS_ERROR';
264
- }
265
- if (error.message.includes('ETIMEDOUT')) {
266
- return 'NETWORK_TIMEOUT';
257
+ // Native fetch wraps transport errors in a TypeError whose cause carries
258
+ // the socket/DNS code. Retain message-based handling for existing callers.
259
+ const visited = new Set();
260
+ let current = error;
261
+ while (typeof current === 'object' && current !== null && !visited.has(current)) {
262
+ visited.add(current);
263
+ const detail = current;
264
+ if (detail.name === 'AbortError')
265
+ return 'TIMEOUT';
266
+ const message = typeof detail.message === 'string' ? detail.message : '';
267
+ if (detail.code === 'ECONNREFUSED' || message.includes('ECONNREFUSED'))
268
+ return 'CONNECTION_REFUSED';
269
+ if (detail.code === 'ENOTFOUND' || message.includes('ENOTFOUND'))
270
+ return 'DNS_ERROR';
271
+ if (detail.code === 'ETIMEDOUT' || message.includes('ETIMEDOUT'))
272
+ return 'NETWORK_TIMEOUT';
273
+ current = detail.cause;
267
274
  }
268
275
  return 'REQUEST_FAILED';
269
276
  }
@@ -235,27 +235,30 @@ export class FileReader {
235
235
  resolvePath(filePath) {
236
236
  // Determine if path is absolute
237
237
  const isAbsolutePath = path.isAbsolute(filePath);
238
+ const normalizedBase = path.resolve(this.basePath);
239
+ const normalizedPath = path.resolve(normalizedBase, filePath);
240
+ const relativePath = path.relative(normalizedBase, normalizedPath);
241
+ if (this.basePath && (relativePath === '..' || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath))) {
242
+ throw new PathTraversalError(filePath, ['Path escapes base directory'], 'critical');
243
+ }
244
+ // Absolute checkout prefixes are not user-controlled depth beneath the root.
245
+ // Keep validating the original spelling so encoded traversal remains blocked.
246
+ const baseDepth = this.basePath ? normalizedBase.split(/[\\/]/).filter(Boolean).length : 0;
238
247
  // SEC-004 FIX: Validate path to prevent directory traversal
239
248
  // For absolute paths, validate without basePath to avoid incorrect combination
240
249
  // For relative paths, validate with basePath for proper containment check
241
250
  const validation = validatePath(filePath, {
242
251
  basePath: isAbsolutePath ? '' : this.basePath,
243
252
  allowAbsolute: true,
253
+ maxDepth: 10 + (isAbsolutePath ? baseDepth : 0),
244
254
  // Allow common development file extensions
245
255
  deniedExtensions: ['.exe', '.bat', '.cmd', '.ps1', '.dll', '.so'],
246
256
  });
247
257
  if (!validation.valid) {
248
258
  throw new PathTraversalError(filePath, [validation.error || 'Path validation failed'], validation.riskLevel);
249
259
  }
250
- // For absolute paths, verify they stay within basePath if one is configured
251
- if (isAbsolutePath && this.basePath) {
252
- const normalizedBase = path.resolve(this.basePath);
253
- const normalizedPath = path.resolve(filePath);
254
- if (!normalizedPath.startsWith(normalizedBase)) {
255
- throw new PathTraversalError(filePath, ['Path escapes base directory'], 'critical');
256
- }
260
+ if (isAbsolutePath)
257
261
  return normalizedPath;
258
- }
259
262
  // Use the normalized path from validation if available
260
263
  if (validation.normalizedPath) {
261
264
  return validation.normalizedPath;
@@ -5,7 +5,7 @@
5
5
  * Provides efficient caching of LLM responses to reduce costs and latency
6
6
  * for repeated queries. Uses LRU (Least Recently Used) eviction policy.
7
7
  */
8
- import { CacheEntry, LLMCacheConfig, LLMCacheStats, LLMResponse, EmbeddingResponse, CompletionResponse } from './interfaces';
8
+ import { CacheEntry, LLMCacheConfig, LLMCacheStats, LLMResponse, EmbeddingResponse, CompletionResponse, type GenerateOptions } from './interfaces';
9
9
  /**
10
10
  * Default cache configuration
11
11
  */
@@ -14,6 +14,7 @@ export declare const DEFAULT_CACHE_CONFIG: LLMCacheConfig;
14
14
  * Type for cacheable response types
15
15
  */
16
16
  export type CacheableResponse = LLMResponse | EmbeddingResponse | CompletionResponse;
17
+ type CacheKeyOptions = Pick<GenerateOptions, 'model' | 'temperature' | 'maxTokens' | 'systemPrompt' | 'stopSequences' | 'effort' | 'preferredProvider'>;
17
18
  /**
18
19
  * LRU Cache implementation for LLM responses
19
20
  */
@@ -28,12 +29,7 @@ export declare class LLMCache<T = CacheableResponse> {
28
29
  /**
29
30
  * Generate a cache key from request parameters
30
31
  */
31
- static generateKey(type: 'generation' | 'embedding' | 'completion', input: string, options?: {
32
- model?: string;
33
- temperature?: number;
34
- maxTokens?: number;
35
- systemPrompt?: string;
36
- }): string;
32
+ static generateKey(type: 'generation' | 'embedding' | 'completion', input: string, options?: CacheKeyOptions): string;
37
33
  /**
38
34
  * Get a cached value
39
35
  */
@@ -99,21 +95,11 @@ export declare class LLMResponseCache {
99
95
  /**
100
96
  * Get a cached generation response
101
97
  */
102
- getGeneration(input: string, options?: {
103
- model?: string;
104
- temperature?: number;
105
- maxTokens?: number;
106
- systemPrompt?: string;
107
- }): LLMResponse | undefined;
98
+ getGeneration(input: string, options?: CacheKeyOptions): LLMResponse | undefined;
108
99
  /**
109
100
  * Cache a generation response
110
101
  */
111
- setGeneration(input: string, response: LLMResponse, options?: {
112
- model?: string;
113
- temperature?: number;
114
- maxTokens?: number;
115
- systemPrompt?: string;
116
- }, ttlMs?: number): void;
102
+ setGeneration(input: string, response: LLMResponse, options?: CacheKeyOptions, ttlMs?: number): void;
117
103
  /**
118
104
  * Get a cached embedding response
119
105
  */
@@ -129,19 +115,11 @@ export declare class LLMResponseCache {
129
115
  /**
130
116
  * Get a cached completion response
131
117
  */
132
- getCompletion(prompt: string, options?: {
133
- model?: string;
134
- temperature?: number;
135
- maxTokens?: number;
136
- }): CompletionResponse | undefined;
118
+ getCompletion(prompt: string, options?: CacheKeyOptions): CompletionResponse | undefined;
137
119
  /**
138
120
  * Cache a completion response
139
121
  */
140
- setCompletion(prompt: string, response: CompletionResponse, options?: {
141
- model?: string;
142
- temperature?: number;
143
- maxTokens?: number;
144
- }, ttlMs?: number): void;
122
+ setCompletion(prompt: string, response: CompletionResponse, options?: CacheKeyOptions, ttlMs?: number): void;
145
123
  /**
146
124
  * Get combined cache statistics
147
125
  */
@@ -160,4 +138,5 @@ export declare class LLMResponseCache {
160
138
  */
161
139
  pruneExpired(): number;
162
140
  }
141
+ export {};
163
142
  //# sourceMappingURL=cache.d.ts.map
@@ -42,6 +42,10 @@ export class LLMCache {
42
42
  options?.systemPrompt ?? '',
43
43
  input,
44
44
  ];
45
+ const outputOptions = [options?.stopSequences, options?.effort, options?.preferredProvider];
46
+ if (outputOptions.some(value => value !== undefined)) {
47
+ parts.push(JSON.stringify(outputOptions));
48
+ }
45
49
  // Encode field boundaries before hashing: prompt text may contain delimiters.
46
50
  const hash = createHash('sha256').update(JSON.stringify(parts)).digest('hex');
47
51
  return `${type}:${hash}`;
@@ -220,14 +224,14 @@ export class LLMCache {
220
224
  if (this.accessOrder.length === 0) {
221
225
  // Fallback: delete first entry
222
226
  const firstKey = this.cache.keys().next().value;
223
- if (firstKey) {
227
+ if (firstKey !== undefined) {
224
228
  this.cache.delete(firstKey);
225
229
  this.evictions++;
226
230
  }
227
231
  return;
228
232
  }
229
233
  const lruKey = this.accessOrder.shift();
230
- if (lruKey) {
234
+ if (lruKey !== undefined) {
231
235
  this.cache.delete(lruKey);
232
236
  this.evictions++;
233
237
  }
@@ -244,7 +244,8 @@ export class CostTracker {
244
244
  for (const record of relevantRecords) {
245
245
  totalCost += record.cost.totalCost;
246
246
  totalTokens += record.usage.totalTokens;
247
- byProvider[record.provider] += record.cost.totalCost;
247
+ const providerCost = Object.hasOwn(byProvider, record.provider) ? byProvider[record.provider] : 0;
248
+ byProvider[record.provider] = providerCost + record.cost.totalCost;
248
249
  byModel[record.model] = (byModel[record.model] || 0) + record.cost.totalCost;
249
250
  }
250
251
  return {
@@ -207,12 +207,7 @@ export class ProviderManager {
207
207
  // Check cache first
208
208
  if (!options?.skipCache) {
209
209
  const inputStr = typeof input === 'string' ? input : JSON.stringify(input);
210
- const cached = this.cache.getGeneration(inputStr, {
211
- model: options?.model,
212
- temperature: options?.temperature,
213
- maxTokens: options?.maxTokens,
214
- systemPrompt: options?.systemPrompt,
215
- });
210
+ const cached = this.cache.getGeneration(inputStr, options);
216
211
  if (cached) {
217
212
  return { ...cached, cached: true };
218
213
  }
@@ -224,12 +219,7 @@ export class ProviderManager {
224
219
  // Cache the response
225
220
  if (!options?.skipCache) {
226
221
  const inputStr = typeof input === 'string' ? input : JSON.stringify(input);
227
- this.cache.setGeneration(inputStr, response, {
228
- model: options?.model,
229
- temperature: options?.temperature,
230
- maxTokens: options?.maxTokens,
231
- systemPrompt: options?.systemPrompt,
232
- });
222
+ this.cache.setGeneration(inputStr, response, options);
233
223
  }
234
224
  // Track cost (in-process) and persist to the cross-process ledger.
235
225
  this.costTracker.recordUsage(response.provider, response.model, response.usage, response.requestId);
@@ -265,11 +255,7 @@ export class ProviderManager {
265
255
  await this.ensureInitialized();
266
256
  // Check cache first
267
257
  if (!options?.skipCache) {
268
- const cached = this.cache.getCompletion(prompt, {
269
- model: options?.model,
270
- temperature: options?.temperature,
271
- maxTokens: options?.maxTokens,
272
- });
258
+ const cached = this.cache.getCompletion(prompt, options);
273
259
  if (cached) {
274
260
  return { ...cached, cached: true };
275
261
  }
@@ -279,11 +265,7 @@ export class ProviderManager {
279
265
  const response = await this.executeWithFailover('complete', async (provider) => provider.complete(prompt, options));
280
266
  // Cache the response
281
267
  if (!options?.skipCache) {
282
- this.cache.setCompletion(prompt, response, {
283
- model: options?.model,
284
- temperature: options?.temperature,
285
- maxTokens: options?.maxTokens,
286
- });
268
+ this.cache.setCompletion(prompt, response, options);
287
269
  }
288
270
  // ADR-123: persist to the cross-process ledger (completion has usage too).
289
271
  this.costTracker.recordUsage(response.provider, response.model, response.usage, `complete-${response.model}-${Date.now()}`);
@@ -100,6 +100,7 @@ export declare class GeminiProvider implements LLMProvider {
100
100
  * Format input to Gemini contents format
101
101
  */
102
102
  private formatContents;
103
+ private isPromptBlocked;
103
104
  /**
104
105
  * Map Gemini finish reason to standard format
105
106
  */
@@ -191,7 +191,10 @@ export class GeminiProvider {
191
191
  totalTokens: usage.totalTokens,
192
192
  estimatedCostUsd: cost.totalCost,
193
193
  });
194
- const content = data.candidates[0]?.content?.parts
194
+ // A blocked prompt has no candidates; preserve it as a terminal result.
195
+ const blocked = this.isPromptBlocked(data.promptFeedback);
196
+ const candidate = blocked ? undefined : data.candidates[0];
197
+ const content = candidate?.content?.parts
195
198
  ?.map(p => p.text ?? '')
196
199
  .join('') ?? '';
197
200
  return {
@@ -201,7 +204,7 @@ export class GeminiProvider {
201
204
  usage,
202
205
  cost,
203
206
  latencyMs,
204
- finishReason: this.mapFinishReason(data.candidates[0]?.finishReason),
207
+ finishReason: blocked ? 'content_filter' : this.mapFinishReason(candidate?.finishReason),
205
208
  cached: false,
206
209
  requestId,
207
210
  };
@@ -269,10 +272,10 @@ export class GeminiProvider {
269
272
  buffer = lines.pop() || '';
270
273
  for (const line of lines) {
271
274
  const trimmed = line.trim();
272
- if (!trimmed || !trimmed.startsWith('data: '))
275
+ if (!trimmed || !trimmed.startsWith('data:'))
273
276
  continue;
274
277
  try {
275
- const chunk = safeJsonParse(trimmed.slice(6));
278
+ const chunk = safeJsonParse(trimmed.slice(5).trimStart());
276
279
  const text = chunk.candidates?.[0]?.content?.parts
277
280
  ?.map(p => p.text ?? '')
278
281
  .join('') ?? '';
@@ -280,7 +283,10 @@ export class GeminiProvider {
280
283
  fullContent += text;
281
284
  yield text;
282
285
  }
283
- if (chunk.candidates?.[0]?.finishReason) {
286
+ if (this.isPromptBlocked(chunk.promptFeedback)) {
287
+ finishReason = 'content_filter';
288
+ }
289
+ else if (chunk.candidates?.[0]?.finishReason) {
284
290
  finishReason = this.mapFinishReason(chunk.candidates[0].finishReason);
285
291
  }
286
292
  if (chunk.usageMetadata) {
@@ -479,6 +485,9 @@ export class GeminiProvider {
479
485
  parts: [{ text: m.content }],
480
486
  }));
481
487
  }
488
+ isPromptBlocked(feedback) {
489
+ return !!feedback?.blockReason && feedback.blockReason !== 'BLOCK_REASON_UNSPECIFIED';
490
+ }
482
491
  /**
483
492
  * Map Gemini finish reason to standard format
484
493
  */
@@ -299,11 +299,14 @@ export class OpenRouterProvider {
299
299
  buffer = lines.pop() || '';
300
300
  for (const line of lines) {
301
301
  const trimmed = line.trim();
302
- if (!trimmed || trimmed === 'data: [DONE]')
302
+ if (!trimmed || !trimmed.startsWith('data:'))
303
303
  continue;
304
- if (trimmed.startsWith('data: ')) {
304
+ const data = trimmed.slice(5).trimStart();
305
+ if (data === '[DONE]')
306
+ continue;
307
+ if (trimmed.startsWith('data:')) {
305
308
  try {
306
- const chunk = safeJsonParse(trimmed.slice(6));
309
+ const chunk = safeJsonParse(data);
307
310
  const delta = chunk.choices[0]?.delta;
308
311
  if (delta?.content) {
309
312
  fullContent += delta.content;
@@ -228,7 +228,7 @@ export class CodeMetricsAnalyzer {
228
228
  // Count decision points
229
229
  const decisionPatterns = [
230
230
  /\bif\s*\(/g,
231
- /\belse\s+if\s*\(/g,
231
+ // The if pattern already counts else-if decisions.
232
232
  /\bfor\s*\(/g,
233
233
  /\bwhile\s*\(/g,
234
234
  /\bcase\s+/g,
@@ -76,7 +76,13 @@ export class SystemMetricsCollector {
76
76
  */
77
77
  collectProcessMetrics() {
78
78
  const memUsage = process.memoryUsage();
79
- const cpuUsage = process.cpuUsage(this.lastCpuUsage ?? undefined);
79
+ const currentCpuUsage = process.cpuUsage();
80
+ const cpuUsage = this.lastCpuUsage
81
+ ? {
82
+ user: currentCpuUsage.user - this.lastCpuUsage.user,
83
+ system: currentCpuUsage.system - this.lastCpuUsage.system,
84
+ }
85
+ : currentCpuUsage;
80
86
  // Calculate CPU percentage
81
87
  const now = Date.now();
82
88
  const elapsedMs = this.lastCpuTime > 0 ? now - this.lastCpuTime : 1000;
@@ -85,7 +91,7 @@ export class SystemMetricsCollector {
85
91
  const totalCpuUs = cpuUsage.user + cpuUsage.system;
86
92
  const cpuPercent = (totalCpuUs / elapsedUs) * 100;
87
93
  // Update last values
88
- this.lastCpuUsage = cpuUsage;
94
+ this.lastCpuUsage = currentCpuUsage;
89
95
  this.lastCpuTime = now;
90
96
  // Calculate memory percentage
91
97
  const totalMem = os.totalmem();
@@ -1,14 +1,4 @@
1
- /**
2
- * Agentic QE v3 - Unified Retry Engine
3
- * IMP-03: Retry Engine with Exponential Backoff
4
- *
5
- * Provides a single, well-tested retry loop with exponential backoff,
6
- * jitter, abort signal support, and retryable-error classification.
7
- *
8
- * The circuit breaker (circuit-breaker.ts) is a separate concern that
9
- * receives success/failure signals from callers — this engine does NOT
10
- * import or depend on it. Integration is planned for a later phase.
11
- */
1
+ import { isCallerInputError } from './error-utils.js';
12
2
  // ---------------------------------------------------------------------------
13
3
  // Defaults
14
4
  // ---------------------------------------------------------------------------
@@ -59,7 +49,7 @@ const NON_RETRYABLE_HTTP_STATUSES = new Set([400, 401, 403, 404, 422]);
59
49
  * Returns `false` for recognised non-retryable client errors (4xx).
60
50
  */
61
51
  export function isRetryableError(error) {
62
- if (error == null)
52
+ if (error == null || isCallerInputError(error))
63
53
  return false;
64
54
  // --- code property (errno) -------------------------------------------
65
55
  const code = error.code;