agentic-qe 3.14.7 → 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 (428) hide show
  1. package/.claude/helpers/.helpers-version +1 -1
  2. package/.claude/helpers/auto-memory-hook.mjs +18 -9
  3. package/.claude/helpers/helpers.manifest.json +6 -5
  4. package/.claude/helpers/hook-handler.cjs +40 -12
  5. package/.claude/helpers/memory.cjs +86 -0
  6. package/.claude/helpers/router.cjs +105 -0
  7. package/.claude/helpers/session.cjs +166 -0
  8. package/.claude/helpers/statusline.cjs +73 -621
  9. package/.claude/skills/release/SKILL.md +6 -0
  10. package/.claude/skills/skills-manifest.json +1 -1
  11. package/CHANGELOG.md +275 -0
  12. package/README.md +143 -366
  13. package/assets/readme/credit-ruflo.svg +1 -0
  14. package/assets/readme/credit-ruvector.svg +1 -0
  15. package/assets/readme/project-header.svg +1 -0
  16. package/assets/readme/quality-loop.svg +1 -0
  17. package/assets/skills/skills-manifest.json +1 -1
  18. package/dist/adapters/a2a/notifications/retry-queue.js +10 -1
  19. package/dist/adapters/ag-ui/json-patch.js +14 -7
  20. package/dist/adapters/ag-ui/state-delta-cache.js +20 -12
  21. package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
  22. package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
  23. package/dist/cli/bundle.js +6 -6
  24. package/dist/cli/chunks/adapter-D7G5MIDQ.js +2 -0
  25. package/dist/cli/chunks/{agent-booster-wasm-AK2W76RG.js → agent-booster-wasm-GDHJ6QUN.js} +2 -2
  26. package/dist/cli/chunks/{agent-handler-MGZCWHIY.js → agent-handler-MPYYQ2RZ.js} +2 -2
  27. package/dist/cli/chunks/{agent-memory-branch-JZ54MCSP.js → agent-memory-branch-QBSHKLA2.js} +2 -2
  28. package/dist/cli/chunks/aqe-learning-engine-G6TUFGHC.js +2 -0
  29. package/dist/cli/chunks/{arena-YSWTKBCL.js → arena-UJE2FROF.js} +4 -4
  30. package/dist/cli/chunks/{arena-CUVH3V7H.js → arena-WIGSL37B.js} +2 -2
  31. package/dist/cli/chunks/{audit-LVU76QGA.js → audit-VT7Y2Z7V.js} +3 -3
  32. package/dist/cli/chunks/base-B45BOC7E.js +2 -0
  33. package/dist/cli/chunks/{better-sqlite3-DB3LOJQU.js → better-sqlite3-DSL7LFRK.js} +2 -2
  34. package/dist/cli/chunks/{brain-handler-SD63KOQ6.js → brain-handler-N3C2MDMK.js} +4 -4
  35. package/dist/cli/chunks/{branch-enumerator-4MNOPUC7.js → branch-enumerator-B6NSQ3PZ.js} +2 -2
  36. package/dist/cli/chunks/{browser-OLPNTWQE.js → browser-KQ3YNRGW.js} +2 -2
  37. package/dist/cli/chunks/browser-workflow-MIBU4XMV.js +2 -0
  38. package/dist/cli/chunks/{chunk-ZWEKAEEV.js → chunk-2ORTL5WG.js} +1 -1
  39. package/dist/cli/chunks/{chunk-KD2BLA5Y.js → chunk-2ZEV3O24.js} +1 -1
  40. package/dist/cli/chunks/{chunk-25P6JA6V.js → chunk-32YSI6OT.js} +1 -1
  41. package/dist/cli/chunks/{chunk-A5MA7A23.js → chunk-3DKYBHNA.js} +6 -6
  42. package/dist/cli/chunks/{chunk-JOZ47MV6.js → chunk-3Y24VTZ3.js} +1 -1
  43. package/dist/cli/chunks/{chunk-2G63VIJE.js → chunk-4BWDCUZZ.js} +1 -1
  44. package/dist/cli/chunks/{chunk-36VKMAMN.js → chunk-4DCDIKBX.js} +2 -2
  45. package/dist/cli/chunks/chunk-4EEY23JS.js +4 -0
  46. package/dist/cli/chunks/{chunk-BD7FEUN3.js → chunk-4FOKHGP5.js} +3 -3
  47. package/dist/cli/chunks/{chunk-MQZ53OR3.js → chunk-4OQSAUKR.js} +2 -2
  48. package/dist/cli/chunks/{chunk-EYXE2XKP.js → chunk-4YPL3OXS.js} +2 -2
  49. package/dist/cli/chunks/{chunk-PCJQCEBA.js → chunk-5DJGP4TA.js} +2 -2
  50. package/dist/cli/chunks/{chunk-RC2A4JZ5.js → chunk-5KN4QL3G.js} +2 -2
  51. package/dist/cli/chunks/chunk-5LN7FQZI.js +2 -0
  52. package/dist/cli/chunks/{chunk-LU2EDWQK.js → chunk-5PNRUMRV.js} +2 -2
  53. package/dist/cli/chunks/{chunk-YRHTQZU4.js → chunk-62IEVKN3.js} +2 -2
  54. package/dist/cli/chunks/{chunk-DOBKEXMJ.js → chunk-6GTIJNRO.js} +1 -1
  55. package/dist/cli/chunks/{chunk-O5V7RHVG.js → chunk-6MN4L6BS.js} +2 -2
  56. package/dist/cli/chunks/{chunk-6PJPQGF4.js → chunk-7D6NVIGP.js} +6 -6
  57. package/dist/cli/chunks/{chunk-B2YGVSOP.js → chunk-7JABIXP3.js} +2 -2
  58. package/dist/cli/chunks/chunk-7JC3LHA6.js +742 -0
  59. package/dist/cli/chunks/{chunk-P7XSPP5D.js → chunk-7WUHVGGT.js} +2 -2
  60. package/dist/cli/chunks/{chunk-RKI3IQKQ.js → chunk-A37YYHUD.js} +3 -3
  61. package/dist/cli/chunks/{chunk-UBJG3IHT.js → chunk-AAQNRZKT.js} +2 -2
  62. package/dist/cli/chunks/{chunk-ND4QTZOL.js → chunk-AGYPPPXR.js} +2 -2
  63. package/dist/cli/chunks/chunk-AIE6OKCD.js +2 -0
  64. package/dist/cli/chunks/{chunk-JHJUSSAU.js → chunk-ANUZGOLQ.js} +2 -2
  65. package/dist/cli/chunks/{chunk-RLW25X66.js → chunk-AQZSF32Y.js} +2 -2
  66. package/dist/cli/chunks/{chunk-OIDWDGLG.js → chunk-ATXAMGVE.js} +2 -2
  67. package/dist/cli/chunks/{chunk-GLGKQX2V.js → chunk-AV3RX2L5.js} +2 -2
  68. package/dist/cli/chunks/{chunk-7QYOTUOX.js → chunk-AW5OWYQ4.js} +2 -2
  69. package/dist/cli/chunks/{chunk-B4I43GE2.js → chunk-B6QTNTCU.js} +2 -2
  70. package/dist/cli/chunks/{chunk-P2UPYSDJ.js → chunk-BAPMEDWC.js} +1 -1
  71. package/dist/cli/chunks/{chunk-Y6AKKQIQ.js → chunk-BH2SQQ2N.js} +1 -1
  72. package/dist/cli/chunks/{chunk-O6MO5KMR.js → chunk-C6M27NQE.js} +2 -2
  73. package/dist/cli/chunks/{chunk-XBYQ2BS4.js → chunk-CMYZWIXS.js} +2 -2
  74. package/dist/cli/chunks/{chunk-DYTQHRUS.js → chunk-CZWWC7GC.js} +1 -1
  75. package/dist/cli/chunks/{chunk-WF6UISKW.js → chunk-D7NOHASX.js} +4 -4
  76. package/dist/cli/chunks/{chunk-H5RQPO3X.js → chunk-DGRE6ZAA.js} +2 -2
  77. package/dist/cli/chunks/{chunk-53BXTTRO.js → chunk-DSGRXW6K.js} +3 -3
  78. package/dist/cli/chunks/{chunk-A2VUCUTT.js → chunk-DXA7RLYU.js} +2 -2
  79. package/dist/cli/chunks/{chunk-GVVFTFMB.js → chunk-DZHIE5UW.js} +2 -2
  80. package/dist/cli/chunks/{chunk-MZB2UV2O.js → chunk-EBK6CUBD.js} +1 -1
  81. package/dist/cli/chunks/{chunk-WIH522AP.js → chunk-EPEKEUCF.js} +1 -1
  82. package/dist/cli/chunks/{chunk-SRPLERER.js → chunk-EQ4SDE4L.js} +25 -25
  83. package/dist/cli/chunks/{chunk-EGOIIUBD.js → chunk-EZPWSS3B.js} +2 -2
  84. package/dist/cli/chunks/{chunk-EADSQN5T.js → chunk-F76SYOBT.js} +1 -1
  85. package/dist/cli/chunks/{chunk-XL5KIYE3.js → chunk-F7JVDLOI.js} +2 -2
  86. package/dist/cli/chunks/{chunk-QGOWNVVG.js → chunk-FCSETOWZ.js} +4 -4
  87. package/dist/cli/chunks/{chunk-A3DK3XNZ.js → chunk-FFE4XAQA.js} +1 -1
  88. package/dist/cli/chunks/{chunk-7EZ2Z2CK.js → chunk-FPTZP7W5.js} +1 -1
  89. package/dist/cli/chunks/{chunk-GV4DYPJP.js → chunk-FTFIA4I5.js} +2 -2
  90. package/dist/cli/chunks/{chunk-SM2YJ2AL.js → chunk-FTS6NGBP.js} +2 -2
  91. package/dist/cli/chunks/{chunk-XWYELBZS.js → chunk-FZ3TQAPW.js} +1 -1
  92. package/dist/cli/chunks/{chunk-HPWWYT67.js → chunk-G35KP72N.js} +2 -2
  93. package/dist/cli/chunks/{chunk-HZY42OVU.js → chunk-GCHDMO5V.js} +2 -2
  94. package/dist/cli/chunks/{chunk-23CX7JNL.js → chunk-GRN47ANK.js} +2 -2
  95. package/dist/cli/chunks/{chunk-HYFQUWNB.js → chunk-GV7P5JYF.js} +2 -2
  96. package/dist/cli/chunks/{chunk-YO4ESCB4.js → chunk-GX5RFGW2.js} +1 -1
  97. package/dist/cli/chunks/{chunk-TFK2AYIN.js → chunk-H77AUJNW.js} +2 -2
  98. package/dist/cli/chunks/{chunk-NBLDBVAW.js → chunk-HBIV7PQH.js} +1 -1
  99. package/dist/cli/chunks/{chunk-VYDVI6FZ.js → chunk-HOPXHZA3.js} +2 -2
  100. package/dist/cli/chunks/{chunk-HYOPJHHW.js → chunk-I3BH3KIF.js} +1 -1
  101. package/dist/cli/chunks/{chunk-ZELWDJXT.js → chunk-ILKMNDUM.js} +2 -2
  102. package/dist/cli/chunks/{chunk-C3FXFU2T.js → chunk-IRHBR56R.js} +1 -1
  103. package/dist/cli/chunks/{chunk-FYPX5WBJ.js → chunk-ISAMM7QA.js} +1 -1
  104. package/dist/cli/chunks/{chunk-V5AK56DA.js → chunk-ISGFAMHZ.js} +2 -2
  105. package/dist/cli/chunks/{chunk-KUHLTVWC.js → chunk-J46XGXPS.js} +1 -1
  106. package/dist/cli/chunks/{chunk-ZS4XVJGV.js → chunk-J4XCBOPA.js} +2 -2
  107. package/dist/cli/chunks/{chunk-BEFTQVEW.js → chunk-JIWMFLHV.js} +2 -2
  108. package/dist/cli/chunks/{chunk-UFSVUBTR.js → chunk-JJ7WAU4I.js} +2 -2
  109. package/dist/cli/chunks/{chunk-WOV6XI3A.js → chunk-JLPNYHJJ.js} +1 -1
  110. package/dist/cli/chunks/{chunk-77QZHIVX.js → chunk-JO2YLIZH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-J7AQZLIH.js → chunk-JSYNSJDQ.js} +4 -4
  112. package/dist/cli/chunks/{chunk-OAZX6WFU.js → chunk-JYRBOSOF.js} +2 -2
  113. package/dist/cli/chunks/{chunk-EJ6MMYLK.js → chunk-KEZ4PXVF.js} +1 -1
  114. package/dist/cli/chunks/{chunk-N5XOXPHZ.js → chunk-KLGFEHEN.js} +2 -2
  115. package/dist/cli/chunks/{chunk-7MIOK72I.js → chunk-KU4WLKDK.js} +7 -7
  116. package/dist/cli/chunks/{chunk-Z4Q5PCRZ.js → chunk-KUTMQBV4.js} +4 -4
  117. package/dist/cli/chunks/{chunk-VW6FRMLW.js → chunk-L6PUBB6L.js} +2 -2
  118. package/dist/cli/chunks/{chunk-OEPNNLR4.js → chunk-LDJ5DZT5.js} +1 -1
  119. package/dist/cli/chunks/{chunk-QQFQDEUE.js → chunk-LLS6JYPN.js} +2 -2
  120. package/dist/cli/chunks/{chunk-UOI6ULCH.js → chunk-LPCFIFZF.js} +2 -2
  121. package/dist/cli/chunks/{chunk-6RD44SCE.js → chunk-M5EKZA7Q.js} +1 -1
  122. package/dist/cli/chunks/chunk-MEYSIVMP.js +2 -0
  123. package/dist/cli/chunks/{chunk-YMW57PEL.js → chunk-MFGLRMO4.js} +1 -1
  124. package/dist/cli/chunks/{chunk-BE4KALTE.js → chunk-MM57SD2F.js} +1 -1
  125. package/dist/cli/chunks/{chunk-FW4DJ4FJ.js → chunk-MO3QXLF2.js} +1 -1
  126. package/dist/cli/chunks/{chunk-QFETNCNN.js → chunk-MRIZY6HB.js} +2 -2
  127. package/dist/cli/chunks/{chunk-RT6O2HW2.js → chunk-N2MDNEF7.js} +2 -2
  128. package/dist/cli/chunks/{chunk-UA7TDVL7.js → chunk-N5ZHIQAV.js} +4 -4
  129. package/dist/cli/chunks/{chunk-Q6NTEICT.js → chunk-NZ556KZN.js} +2 -2
  130. package/dist/cli/chunks/{chunk-CVOQ6ESD.js → chunk-O5AUOBGU.js} +2 -2
  131. package/dist/cli/chunks/{chunk-5D7ZFWDS.js → chunk-OBSX3I4Y.js} +2 -2
  132. package/dist/cli/chunks/{chunk-NOHWJOBS.js → chunk-OLD2CIDI.js} +1 -1
  133. package/dist/cli/chunks/{chunk-5U6N4V5M.js → chunk-OTJ22IO2.js} +4 -4
  134. package/dist/cli/chunks/{chunk-5GFKTJ65.js → chunk-OYVDTD3A.js} +2 -2
  135. package/dist/cli/chunks/{chunk-LY7MFGBD.js → chunk-P2PPJUGD.js} +147 -150
  136. package/dist/cli/chunks/{chunk-OZGIOKEA.js → chunk-P4FRYNHL.js} +1 -1
  137. package/dist/cli/chunks/{chunk-X7ADKL7T.js → chunk-P4WE6VRR.js} +2 -2
  138. package/dist/cli/chunks/{chunk-ZUB5YOCM.js → chunk-P725KXHX.js} +2 -2
  139. package/dist/cli/chunks/{chunk-74IOEOMH.js → chunk-P7MNF2SK.js} +2 -2
  140. package/dist/cli/chunks/{chunk-TXSPBLBT.js → chunk-PJU5HVWV.js} +2 -2
  141. package/dist/cli/chunks/{chunk-MT7UNBZ7.js → chunk-PN3FYSQ6.js} +2 -2
  142. package/dist/cli/chunks/{chunk-F2OPFVQH.js → chunk-PPFW3H7E.js} +1 -1
  143. package/dist/cli/chunks/{chunk-IEJ7ZV3M.js → chunk-Q4RCUCHD.js} +1 -1
  144. package/dist/cli/chunks/{chunk-IAENZ2DR.js → chunk-QRALXNNX.js} +2 -2
  145. package/dist/cli/chunks/{chunk-AJUBT4NP.js → chunk-QVX22EIM.js} +3 -3
  146. package/dist/cli/chunks/chunk-R6CZCMKD.js +2 -0
  147. package/dist/cli/chunks/chunk-ROK5YQ5P.js +3 -0
  148. package/dist/cli/chunks/{chunk-ON2UTP2U.js → chunk-S2GNFAOC.js} +2 -2
  149. package/dist/cli/chunks/{chunk-HXXHMLJ5.js → chunk-S644OORE.js} +1 -1
  150. package/dist/cli/chunks/{chunk-XYLQZWF6.js → chunk-S7CROKX4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-T77GZF4B.js → chunk-S7QUHLXV.js} +1 -1
  152. package/dist/cli/chunks/{chunk-RDGPXENG.js → chunk-UGYXUPGN.js} +2 -2
  153. package/dist/cli/chunks/{chunk-QVH5Y7AP.js → chunk-URRPJ3M7.js} +1 -1
  154. package/dist/cli/chunks/{chunk-AEUEMVJK.js → chunk-URUOTHPO.js} +2 -2
  155. package/dist/cli/chunks/{chunk-VXKWNRGA.js → chunk-VCYOFWMG.js} +2 -2
  156. package/dist/cli/chunks/{chunk-6EGS77BB.js → chunk-VQVFGFYK.js} +1 -1
  157. package/dist/cli/chunks/{chunk-NHUGHAY6.js → chunk-VT5SMBEM.js} +1 -1
  158. package/dist/cli/chunks/{chunk-ROVZSZCS.js → chunk-VTGRGYY4.js} +3 -3
  159. package/dist/cli/chunks/{chunk-QPLSYEWJ.js → chunk-VWCFXCSV.js} +2 -2
  160. package/dist/cli/chunks/{chunk-ENK44A6Q.js → chunk-VY4557VF.js} +2 -2
  161. package/dist/cli/chunks/{chunk-5FSLMYAC.js → chunk-VYERAOQL.js} +2 -2
  162. package/dist/cli/chunks/{chunk-EIGRV3J6.js → chunk-W6H2SOIK.js} +2 -2
  163. package/dist/cli/chunks/{chunk-CBONQM5D.js → chunk-WBR4VRQE.js} +2 -2
  164. package/dist/cli/chunks/{chunk-JZT7BU44.js → chunk-WDV6CBED.js} +2 -2
  165. package/dist/cli/chunks/{chunk-G367W7XR.js → chunk-WO7NPGUD.js} +19 -19
  166. package/dist/cli/chunks/{chunk-4INST4ZL.js → chunk-WPOYFV4X.js} +1 -1
  167. package/dist/cli/chunks/{chunk-3M7J4U74.js → chunk-WPSGMTI4.js} +4 -4
  168. package/dist/cli/chunks/{chunk-RKUAWQOF.js → chunk-WQMXQO3O.js} +2 -2
  169. package/dist/cli/chunks/{chunk-Q3NSU24F.js → chunk-WR54SKKL.js} +2 -2
  170. package/dist/cli/chunks/{chunk-UYUJT6QO.js → chunk-X4OESN7M.js} +2 -2
  171. package/dist/cli/chunks/{chunk-ZUOVNFXK.js → chunk-X5RELRY7.js} +2 -2
  172. package/dist/cli/chunks/{chunk-BLG7SH4A.js → chunk-X7JEBPEW.js} +1 -1
  173. package/dist/cli/chunks/{chunk-FSSR6WBE.js → chunk-XEABMIUH.js} +2 -2
  174. package/dist/cli/chunks/{chunk-ONR2NXXD.js → chunk-XELFJC77.js} +3 -3
  175. package/dist/cli/chunks/{chunk-MM56VPNE.js → chunk-XPUY3ZKD.js} +3 -3
  176. package/dist/cli/chunks/{chunk-QUORH2MG.js → chunk-XZDPR6I2.js} +8 -8
  177. package/dist/cli/chunks/{chunk-MZMG6CUJ.js → chunk-Y63DADOR.js} +2 -2
  178. package/dist/cli/chunks/{chunk-CQNMGK6Y.js → chunk-YFRZVNE4.js} +2 -2
  179. package/dist/cli/chunks/{chunk-3QJU4Q4R.js → chunk-YIDZ3TEN.js} +2 -2
  180. package/dist/cli/chunks/{chunk-4EKV7PHB.js → chunk-Z6CRROLU.js} +2 -2
  181. package/dist/cli/chunks/{chunk-IWFFO6VT.js → chunk-ZPH2YT3J.js} +2 -2
  182. package/dist/cli/chunks/{chunk-PYKY22GC.js → chunk-ZV7LJPSI.js} +5 -5
  183. package/dist/cli/chunks/chunk-ZXIIB3QE.js +2 -0
  184. package/dist/cli/chunks/ci-63JINRNB.js +82 -0
  185. package/dist/cli/chunks/{ci-output-RLS32FUY.js → ci-output-CRFWLUAA.js} +2 -2
  186. package/dist/cli/chunks/{circuit-breaker-MRCC7WCM.js → circuit-breaker-PJLG3WYL.js} +2 -2
  187. package/dist/cli/chunks/{claude-flow-setup-LIZCEKDF.js → claude-flow-setup-UKHSQMJU.js} +2 -2
  188. package/dist/cli/chunks/client-A4FTITK3.js +2 -0
  189. package/dist/cli/chunks/{cline-installer-T7H6R2RC.js → cline-installer-PYQ27AS3.js} +2 -2
  190. package/dist/cli/chunks/{code-XMBLI7OF.js → code-K7VGLZ3W.js} +3 -3
  191. package/dist/cli/chunks/{code-index-extractor-QS7BYLEX.js → code-index-extractor-NNWAVWSL.js} +2 -2
  192. package/dist/cli/chunks/{codex-installer-6PGT5FM6.js → codex-installer-U4VJIKRN.js} +2 -2
  193. package/dist/cli/chunks/{completions-2A3WRXY2.js → completions-DOCI3P4W.js} +2 -2
  194. package/dist/cli/chunks/{complexity-analyzer-23HOOGJ7.js → complexity-analyzer-RFW2QRFR.js} +2 -2
  195. package/dist/cli/chunks/{continuedev-installer-4FSF7B3N.js → continuedev-installer-S5WXXOBU.js} +2 -2
  196. package/dist/cli/chunks/{copilot-installer-A5GRQQUU.js → copilot-installer-AAQ6YLVJ.js} +2 -2
  197. package/dist/cli/chunks/core-handlers-FO3QTNWI.js +2 -0
  198. package/dist/cli/chunks/{cost-tracker-Z4STQ5VB.js → cost-tracker-R4VOHTWQ.js} +2 -2
  199. package/dist/cli/chunks/{coverage-NUPP6KZZ.js → coverage-P54HPCLV.js} +3 -3
  200. package/dist/cli/chunks/cross-domain-router-LIV6SRWF.js +2 -0
  201. package/dist/cli/chunks/{cursor-installer-FVJ7ROPJ.js → cursor-installer-VHBWZE5A.js} +2 -2
  202. package/dist/cli/chunks/{daemon-D662EX5N.js → daemon-BTRSWNB4.js} +4 -4
  203. package/dist/cli/chunks/{daemon-7ZZA2MMN.js → daemon-JLH5TTWZ.js} +4 -4
  204. package/dist/cli/chunks/{dag-attention-scheduler-IB4TQ2KA.js → dag-attention-scheduler-5Z6DCRFK.js} +2 -2
  205. package/dist/cli/chunks/{detect-LGLBZN4I.js → detect-NWGASRJJ.js} +2 -2
  206. package/dist/cli/chunks/{dist-node-Z3OL42YE.js → dist-node-XMNNSEFJ.js} +2 -2
  207. package/dist/cli/chunks/{domain-handler-L3CLNL7U.js → domain-handler-BWVBZTNR.js} +2 -2
  208. package/dist/cli/chunks/{domain-plugins-GQ3V5X6L.js → domain-plugins-YAD4USA4.js} +2 -2
  209. package/dist/cli/chunks/domain-transfer-Z3MRPZEZ.js +2 -0
  210. package/dist/cli/chunks/dream-DNLGHYXY.js +2 -0
  211. package/dist/cli/chunks/{embed-and-insert-pattern-UGD6USYH.js → embed-and-insert-pattern-5CCO45WC.js} +2 -2
  212. package/dist/cli/chunks/{eval-3B7UIYGY.js → eval-JEMLTGY4.js} +2 -2
  213. package/dist/cli/chunks/{experience-capture-middleware-3RQ4NYY3.js → experience-capture-middleware-FKVYBBAN.js} +4 -4
  214. package/dist/cli/chunks/{fast-paths-QOSAEPYD.js → fast-paths-TFL32H3C.js} +2 -2
  215. package/dist/cli/chunks/{feature-flags-3S5TH6P4.js → feature-flags-CNGAUUMT.js} +2 -2
  216. package/dist/cli/chunks/{feature-flags-TLF4NKOH.js → feature-flags-OHGD2NCW.js} +2 -2
  217. package/dist/cli/chunks/{file-discovery-AEVMJRNB.js → file-discovery-IHGDYW34.js} +2 -2
  218. package/dist/cli/chunks/{fleet-E6WTXWFL.js → fleet-OGTSDGJ2.js} +4 -4
  219. package/dist/cli/chunks/{gnn-wrapper-MCKH3AUU.js → gnn-wrapper-QYTTKNCE.js} +2 -2
  220. package/dist/cli/chunks/{heartbeat-handler-U7XENHRR.js → heartbeat-handler-R5OD2SKN.js} +4 -4
  221. package/dist/cli/chunks/heartbeat-scheduler-DL4LXXJF.js +2 -0
  222. package/dist/cli/chunks/hnsw-adapter-Y64M43J4.js +2 -0
  223. package/dist/cli/chunks/hnsw-index-5V6DDMTA.js +2 -0
  224. package/dist/cli/chunks/{hnsw-legacy-bridge-5GW4SAEI.js → hnsw-legacy-bridge-ULJWYXBQ.js} +2 -2
  225. package/dist/cli/chunks/{hnswlib-node-7BLZBK5T.js → hnswlib-node-SYKJXGE2.js} +2 -2
  226. package/dist/cli/chunks/{hooks-F3O2SB6H.js → hooks-XAJXPXTU.js} +10 -10
  227. package/dist/cli/chunks/hybrid-backend-JWT2V4FQ.js +2 -0
  228. package/dist/cli/chunks/{hypergraph-engine-PV4EKXHB.js → hypergraph-engine-GIBPGW4N.js} +2 -2
  229. package/dist/cli/chunks/{hypergraph-handler-VOWO5ZTW.js → hypergraph-handler-ENFK6IDN.js} +3 -3
  230. package/dist/cli/chunks/impact-analyzer-XUZQSZZC.js +2 -0
  231. package/dist/cli/chunks/{init-handler-ENJ5ONJX.js → init-handler-CSA62LGT.js} +6 -6
  232. package/dist/cli/chunks/init-wizard-KDJKHEPN.js +2 -0
  233. package/dist/cli/chunks/kernel-MUDYPGFR.js +2 -0
  234. package/dist/cli/chunks/{kilocode-installer-HNNJOOPE.js → kilocode-installer-YXFIRTSA.js} +2 -2
  235. package/dist/cli/chunks/{kiro-installer-UZBIQ3IC.js → kiro-installer-JW3BG2MQ.js} +2 -2
  236. package/dist/cli/chunks/knowledge-graph-GR52N7PU.js +2 -0
  237. package/dist/cli/chunks/{learning-YMLCVFUT.js → learning-BDBZ7ZVG.js} +4 -4
  238. package/dist/cli/chunks/{llm-router-YWTARCCT.js → llm-router-CCX2DYTC.js} +4 -4
  239. package/dist/cli/chunks/llm-router-service-QL6LVKZ4.js +2 -0
  240. package/dist/cli/chunks/{load-DKE3F3IP.js → load-UJTTEOOK.js} +2 -2
  241. package/dist/cli/chunks/load-test-76V75WZ5.js +2 -0
  242. package/dist/cli/chunks/{mcp-5PSGIUCW.js → mcp-2NAJYREC.js} +2 -2
  243. package/dist/cli/chunks/{memory-3L3O6JMM.js → memory-C3UQSN5F.js} +5 -5
  244. package/dist/cli/chunks/memory-backend-SMQRS5QN.js +2 -0
  245. package/dist/cli/chunks/memory-handlers-ESFIJENU.js +2 -0
  246. package/dist/cli/chunks/{multi-model-executor-AEEO7IA4.js → multi-model-executor-SIHSHAD7.js} +2 -2
  247. package/dist/cli/chunks/{opencode-installer-ABBO355U.js → opencode-installer-KDYHUGPG.js} +2 -2
  248. package/dist/cli/chunks/{orchestrator-E36Q7MKE.js → orchestrator-MJHIQEHD.js} +6 -6
  249. package/dist/cli/chunks/pattern-null-store-MWAJMOYU.js +2 -0
  250. package/dist/cli/chunks/{pattern-usage-recorder-H4XKSID4.js → pattern-usage-recorder-OLBE4UIF.js} +2 -2
  251. package/dist/cli/chunks/{pipeline-BGFEHXIN.js → pipeline-IOK2CV3U.js} +2 -2
  252. package/dist/cli/chunks/{platform-GK7ZVDJI.js → platform-53JQ7JXN.js} +2 -2
  253. package/dist/cli/chunks/{plugin-CAH2CKI6.js → plugin-L5SDIWDI.js} +2 -2
  254. package/dist/cli/chunks/{prime-radiant-advanced-wasm-M5EYRONA.js → prime-radiant-advanced-wasm-2DS67JFS.js} +2 -2
  255. package/dist/cli/chunks/{project-root-BSNZC243.js → project-root-LQMOFO2Z.js} +2 -2
  256. package/dist/cli/chunks/protocol-executor-32X3GAJT.js +2 -0
  257. package/dist/cli/chunks/{protocol-handler-JDSSC2SF.js → protocol-handler-NXG2M43B.js} +2 -2
  258. package/dist/cli/chunks/{prove-ANPTOZJE.js → prove-7K7PFSSX.js} +2 -2
  259. package/dist/cli/chunks/qe-reasoning-bank-KAFV3TGI.js +2 -0
  260. package/dist/cli/chunks/{quality-SXWGYRQR.js → quality-ATILUGMJ.js} +2 -2
  261. package/dist/cli/chunks/quality-gate-MPZMDPIZ.js +7 -0
  262. package/dist/cli/chunks/queen-coordinator-L3SODGRX.js +2 -0
  263. package/dist/cli/chunks/{real-embeddings-WSRYAOZM.js → real-embeddings-VZN3KIAI.js} +2 -2
  264. package/dist/cli/chunks/{ref-validation-AZ3LRWEK.js → ref-validation-EUATPVXX.js} +2 -2
  265. package/dist/cli/chunks/{roocode-installer-2QKGFIEU.js → roocode-installer-7M2GOUNZ.js} +2 -2
  266. package/dist/cli/chunks/router-DDCSSXYQ.js +2 -0
  267. package/dist/cli/chunks/routing-feedback-RFASKYCD.js +2 -0
  268. package/dist/cli/chunks/{routing-handler-UYDC5MMD.js → routing-handler-VWANE652.js} +2 -2
  269. package/dist/cli/chunks/{ruvector-commands-QXADPVEY.js → ruvector-commands-B2YIPGOV.js} +2 -2
  270. package/dist/cli/chunks/rvf-dual-writer-HCIF2G56.js +2 -0
  271. package/dist/cli/chunks/rvf-migration-adapter-UVAHQ7SV.js +2 -0
  272. package/dist/cli/chunks/{rvf-migration-coordinator-GD4NBFKT.js → rvf-migration-coordinator-RQXOQJ5T.js} +2 -2
  273. package/dist/cli/chunks/rvf-native-adapter-F2I5FFHK.js +2 -0
  274. package/dist/cli/chunks/{rvf-store-integrity-7SXG66IL.js → rvf-store-integrity-7P5YDXRH.js} +2 -2
  275. package/dist/cli/chunks/safe-db-6ZAA4S23.js +2 -0
  276. package/dist/cli/chunks/schedule-SM5Q6UVP.js +2 -0
  277. package/dist/cli/chunks/scheduler-4EYP4EZ6.js +2 -0
  278. package/dist/cli/chunks/{security-YKB622PK.js → security-VJ7TVSQF.js} +3 -3
  279. package/dist/cli/chunks/{shared-rvf-adapter-KMLAV7JK.js → shared-rvf-adapter-63NXQFBX.js} +2 -2
  280. package/dist/cli/chunks/{shared-rvf-dual-writer-OYY27DFV.js → shared-rvf-dual-writer-JQRP7P5A.js} +2 -2
  281. package/dist/cli/chunks/sqlite-persistence-KLN2K266.js +2 -0
  282. package/dist/cli/chunks/{standalone-memory-2DOABVLC.js → standalone-memory-WJ72PH5P.js} +2 -2
  283. package/dist/cli/chunks/{status-handler-EXRKETV7.js → status-handler-G72ZSLAX.js} +2 -2
  284. package/dist/cli/chunks/{structural-health-2SKK6DU6.js → structural-health-HYBGP4BD.js} +2 -2
  285. package/dist/cli/chunks/{sync-DQ2YUNI6.js → sync-5YMZZIF4.js} +2 -2
  286. package/dist/cli/chunks/{sync-UW7SX7GO.js → sync-O5FQAHT7.js} +2 -2
  287. package/dist/cli/chunks/{task-handler-LYQ6WYUY.js → task-handler-E6IFNHZG.js} +2 -2
  288. package/dist/cli/chunks/{task-handlers-DIJO232S.js → task-handlers-P3GC2L5L.js} +3 -3
  289. package/dist/cli/chunks/{test-WRHZMUCW.js → test-OU6ERW67.js} +6 -6
  290. package/dist/cli/chunks/{test-scheduling-HI23RXFK.js → test-scheduling-3HY4I3HY.js} +7 -7
  291. package/dist/cli/chunks/{token-bootstrap-23SA6SWZ.js → token-bootstrap-A5QA4CWK.js} +2 -2
  292. package/dist/cli/chunks/{token-usage-M7RRDPXO.js → token-usage-MUNQVPFT.js} +2 -2
  293. package/dist/cli/chunks/{transformers-4TC35KKS.js → transformers-IEO25W5V.js} +2 -2
  294. package/dist/cli/chunks/{tree-sitter-wasm-parser-F4LTKAWD.js → tree-sitter-wasm-parser-T2EQHEAY.js} +2 -2
  295. package/dist/cli/chunks/{types-NBXV6LXQ.js → types-ODCPGCID.js} +2 -2
  296. package/dist/cli/chunks/unified-memory-B5IA2KKQ.js +2 -0
  297. package/dist/cli/chunks/unified-memory-hnsw-YF74LL3Z.js +2 -0
  298. package/dist/cli/chunks/unified-persistence-VZMGNGWY.js +2 -0
  299. package/dist/cli/chunks/{upgrade-4BGOU5RM.js → upgrade-4DN6EIW2.js} +2 -2
  300. package/dist/cli/chunks/{validate-EDWAR63H.js → validate-TBNAPDE3.js} +2 -2
  301. package/dist/cli/chunks/{validate-swarm-VI72CPR7.js → validate-swarm-ZN7XXUY4.js} +2 -2
  302. package/dist/cli/chunks/visual-security-ZV3BLLSH.js +2 -0
  303. package/dist/cli/chunks/{web-tree-sitter-Y5XBRQXF.js → web-tree-sitter-DWAWVD2X.js} +2 -2
  304. package/dist/cli/chunks/{windsurf-installer-VEX23WAF.js → windsurf-installer-U6EROS5S.js} +2 -2
  305. package/dist/cli/chunks/{witness-chain-3YNL6YGY.js → witness-chain-EQEJS2P4.js} +2 -2
  306. package/dist/cli/chunks/witness-chain-OA24MQWX.js +2 -0
  307. package/dist/cli/chunks/{witness-chain-repair-MJZGZRWT.js → witness-chain-repair-KBXDRXS3.js} +2 -2
  308. package/dist/cli/chunks/{witness-chain-verifier-TTJYXTBE.js → witness-chain-verifier-HSQGZ4R4.js} +2 -2
  309. package/dist/cli/chunks/{witness-key-manager-EM6YXYOY.js → witness-key-manager-RAODG73T.js} +2 -2
  310. package/dist/cli/chunks/{workflow-2RBDOM7V.js → workflow-KNFJNNKG.js} +4 -4
  311. package/dist/cli/chunks/workflow-orchestrator-IMX2LSVE.js +2 -0
  312. package/dist/cli/chunks/{wrappers-5OTAVVOV.js → wrappers-NIJBA22T.js} +2 -2
  313. package/dist/cli/commands/ci.js +17 -6
  314. package/dist/cli/commands/quality-gate.js +6 -1
  315. package/dist/cli/index.js +7 -2
  316. package/dist/cli/process-store-cleanup.d.ts +7 -0
  317. package/dist/cli/process-store-cleanup.js +27 -0
  318. package/dist/cli/utils/ci-config.d.ts +3 -3
  319. package/dist/cli/utils/ci-config.js +202 -68
  320. package/dist/cli/utils/workflow-parser.js +73 -57
  321. package/dist/domains/code-intelligence/services/metric-collector/test-counter.d.ts +1 -1
  322. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +17 -15
  323. package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
  324. package/dist/domains/quality-assessment/quality-evidence.js +7 -2
  325. package/dist/domains/test-execution/services/retry-handler.js +38 -16
  326. package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
  327. package/dist/domains/test-execution/services/test-executor.js +66 -22
  328. package/dist/governance/ab-benchmarking.d.ts +5 -1
  329. package/dist/governance/ab-benchmarking.js +64 -29
  330. package/dist/init/fleet-integration.js +3 -2
  331. package/dist/init/init-wizard-steps.js +3 -2
  332. package/dist/init/phases/06-code-intelligence.js +6 -4
  333. package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
  334. package/dist/integrations/ruvector/sona-persistence.js +74 -20
  335. package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
  336. package/dist/integrations/ruvector/sona-wrapper.js +13 -0
  337. package/dist/kernel/memory-backend.js +5 -4
  338. package/dist/kernel/unified-memory.js +3 -2
  339. package/dist/learning/aqe-learning-engine.js +3 -2
  340. package/dist/mcp/bundle.js +474 -471
  341. package/dist/mcp/connection-pool.d.ts +2 -0
  342. package/dist/mcp/connection-pool.js +13 -2
  343. package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
  344. package/dist/mcp/handlers/memory-handlers.js +16 -6
  345. package/dist/mcp/protocol-server.js +29 -8
  346. package/dist/mcp/security/rate-limiter.d.ts +1 -0
  347. package/dist/mcp/security/rate-limiter.js +22 -5
  348. package/dist/mcp/services/session-store.js +17 -17
  349. package/dist/mcp/tools/planning/goap-status.d.ts +2 -0
  350. package/dist/mcp/tools/planning/goap-status.js +8 -2
  351. package/dist/mcp/types.d.ts +2 -0
  352. package/dist/optimization/session-cache.js +13 -11
  353. package/dist/planning/goap-planner.d.ts +3 -0
  354. package/dist/planning/goap-planner.js +80 -37
  355. package/dist/plugins/cache.js +10 -3
  356. package/dist/shared/embeddings/embedding-cache.js +5 -5
  357. package/dist/shared/embeddings/nomic-embedder.js +17 -7
  358. package/dist/shared/embeddings/ollama-client.js +5 -3
  359. package/dist/shared/git/git-analyzer.js +31 -30
  360. package/dist/shared/http/http-client.js +20 -13
  361. package/dist/shared/io/file-reader.js +11 -8
  362. package/dist/shared/llm/cache.d.ts +8 -29
  363. package/dist/shared/llm/cache.js +12 -11
  364. package/dist/shared/llm/cost-tracker.js +2 -1
  365. package/dist/shared/llm/provider-manager.js +4 -22
  366. package/dist/shared/llm/providers/gemini.d.ts +1 -0
  367. package/dist/shared/llm/providers/gemini.js +14 -5
  368. package/dist/shared/llm/providers/openrouter.js +6 -3
  369. package/dist/shared/metrics/code-metrics.js +1 -1
  370. package/dist/shared/metrics/system-metrics.js +8 -2
  371. package/dist/shared/retry-engine.js +6 -12
  372. package/dist/shared/test-runner-process.d.ts +10 -0
  373. package/dist/shared/test-runner-process.js +210 -0
  374. package/dist/test-scheduling/executors/vitest-executor.js +26 -17
  375. package/dist/validation/quality-verdict.js +3 -2
  376. package/dist/workers/quality-daemon/priority-queue.js +4 -1
  377. package/package.json +6 -4
  378. package/dist/cli/chunks/adapter-TVQKH65T.js +0 -2
  379. package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +0 -2
  380. package/dist/cli/chunks/base-W42BURDL.js +0 -2
  381. package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +0 -2
  382. package/dist/cli/chunks/chunk-2IMSJ7IO.js +0 -2
  383. package/dist/cli/chunks/chunk-FBZC4IGB.js +0 -2
  384. package/dist/cli/chunks/chunk-LXZMP3VX.js +0 -736
  385. package/dist/cli/chunks/chunk-MNQN7UZX.js +0 -4
  386. package/dist/cli/chunks/chunk-OXHF3L2T.js +0 -2
  387. package/dist/cli/chunks/chunk-PELENDDQ.js +0 -2
  388. package/dist/cli/chunks/chunk-TW3SR4TS.js +0 -2
  389. package/dist/cli/chunks/chunk-V6RE4YRQ.js +0 -2
  390. package/dist/cli/chunks/chunk-ZQZD55MN.js +0 -3
  391. package/dist/cli/chunks/ci-J3TDK5RA.js +0 -81
  392. package/dist/cli/chunks/client-3BD2DI4N.js +0 -2
  393. package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +0 -2
  394. package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +0 -2
  395. package/dist/cli/chunks/domain-transfer-MFCI76IY.js +0 -2
  396. package/dist/cli/chunks/dream-FTP33IJB.js +0 -2
  397. package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +0 -2
  398. package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +0 -2
  399. package/dist/cli/chunks/hnsw-index-MS5KODD7.js +0 -2
  400. package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +0 -2
  401. package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +0 -2
  402. package/dist/cli/chunks/init-wizard-I5DFZUQL.js +0 -2
  403. package/dist/cli/chunks/kernel-MISPSPPA.js +0 -2
  404. package/dist/cli/chunks/knowledge-graph-L26JESGE.js +0 -2
  405. package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +0 -2
  406. package/dist/cli/chunks/load-test-H5ISNNM5.js +0 -2
  407. package/dist/cli/chunks/memory-backend-HWDNOBKW.js +0 -2
  408. package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +0 -2
  409. package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +0 -2
  410. package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +0 -2
  411. package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +0 -2
  412. package/dist/cli/chunks/quality-gate-GYNCA4ZY.js +0 -7
  413. package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +0 -2
  414. package/dist/cli/chunks/router-MTP5LH4H.js +0 -2
  415. package/dist/cli/chunks/routing-feedback-GWETVB4L.js +0 -2
  416. package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +0 -2
  417. package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +0 -2
  418. package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +0 -2
  419. package/dist/cli/chunks/safe-db-FWWGAPVE.js +0 -2
  420. package/dist/cli/chunks/schedule-TPA4V4D5.js +0 -2
  421. package/dist/cli/chunks/scheduler-5ZTEPNDD.js +0 -2
  422. package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +0 -2
  423. package/dist/cli/chunks/unified-memory-OVFEPRPS.js +0 -2
  424. package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +0 -2
  425. package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +0 -2
  426. package/dist/cli/chunks/visual-security-2FUM5GLI.js +0 -2
  427. package/dist/cli/chunks/witness-chain-MH6GA5L6.js +0 -2
  428. package/dist/cli/chunks/workflow-orchestrator-H6G65YKU.js +0 -2
@@ -1,5 +1,5 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.14.7");process.exit(0)}
2
- import{b as v}from"./chunk-4EKV7PHB.js";import{a as Ce,c as _e}from"./chunk-FSSR6WBE.js";import{b as a,g as Ee}from"./chunk-BEFTQVEW.js";import{a as le,b as Ke}from"./chunk-UBJG3IHT.js";import{b as Te,c as _,d as ke,f as S}from"./chunk-XL5KIYE3.js";import{e as G,h as ve,i as ce,n as $}from"./chunk-TFK2AYIN.js";import{b as B,d as ye}from"./chunk-OIDWDGLG.js";import{b as E,e as L}from"./chunk-ZUOVNFXK.js";import{b as be,d as De}from"./chunk-RDGPXENG.js";import{b as ae}from"./chunk-YO4ESCB4.js";import{readFileSync as $e}from"fs";import*as Me from"path";function j(g){return typeof g=="string"&&Fe.includes(g)}function ze(g){try{let e=$e(g,"utf8").match(/^\s*effort_level\s*:\s*['"]?([a-z]+)['"]?\s*$/m);return e&&j(e[1])?e[1]:null}catch{return null}}function Le(g={}){if(g.override&&j(g.override))return g.override;if(g.agentEffort&&j(g.agentEffort))return g.agentEffort;let e=(g.env??process.env).QE_EFFORT_LEVEL;if(e&&j(e))return e;let r=g.fleetDefaultsPath??Me.join(process.cwd(),"config","fleet-defaults.yaml");return z===void 0&&(z=ze(r)),z||We}var Fe,We,z,Pe=ae(()=>{"use strict";Fe=["low","medium","high","xhigh","max"],We="xhigh"});function je(g){try{let t=G(g);return{sendSampling:t.supportsSamplingParams!==!1,supportsEffort:t.supportsEffortXHigh===!0}}catch{return{sendSampling:!1,supportsEffort:!1}}}function H(g,t,e){let r=je(t);if(r.sendSampling&&e.temperature!==void 0&&(g.temperature=e.temperature),r.supportsEffort){let o=e.effort??(He(t)?Le():void 0);o!==void 0&&(g.output_config={effort:o})}return g}function He(g){return ve(g)?.tier==="flagship"}var he=ae(()=>{"use strict";$();Pe()});function lt(g){try{let t=G(g);return{sendSampling:t.supportsSamplingParams!==!1,maxTokensField:t.usesMaxCompletionTokens===!0?"max_completion_tokens":"max_tokens"}}catch{return it.test(g)?{...ct}:{...at}}}function U(g,t,e){let r=lt(t),o=g;return e.maxTokens!==void 0&&(o[r.maxTokensField]=e.maxTokens),r.sendSampling&&e.temperature!==void 0&&(o.temperature=e.temperature),g}var it,at,ct,ge=ae(()=>{"use strict";$();it=/^(openai\/)?(gpt-5|gpt-6|o\d)/i,at={sendSampling:!0,maxTokensField:"max_tokens"},ct={sendSampling:!1,maxTokensField:"max_completion_tokens"}});De();L();var Re={failureThreshold:5,resetTimeoutMs:3e4,halfOpenSuccessThreshold:2,failureWindowMs:6e4,includeTimeouts:!0},ue=class{state="closed";failures=[];successCount=0;totalRequests=0;totalSuccesses=0;totalFailures=0;rejectedCount=0;lastFailureTime;lastSuccessTime;openedAt;halfOpenSuccesses=0;config;providerType;constructor(t,e={}){this.providerType=t,this.config={...Re,...e}}getState(){return this.state==="open"&&this.openedAt&&Date.now()-this.openedAt.getTime()>=this.config.resetTimeoutMs&&this.transitionTo("half-open"),this.state}canExecute(){let t=this.getState();return t==="closed"?!0:t!=="open"}async execute(t){if(this.totalRequests++,this.getState()==="open")throw this.rejectedCount++,a(`Circuit breaker is open for provider ${this.providerType}`,"CIRCUIT_OPEN",{provider:this.providerType,retryable:!0,retryAfterMs:this.getTimeUntilTransition()});try{let r=await t();return this.recordSuccess(),r}catch(r){throw this.recordFailure(E(r)),r}}recordSuccess(){this.successCount++,this.totalSuccesses++,this.lastSuccessTime=new Date,this.getState()==="half-open"&&(this.halfOpenSuccesses++,this.halfOpenSuccesses>=this.config.halfOpenSuccessThreshold&&this.transitionTo("closed"))}recordFailure(t){if(this.totalFailures++,this.lastFailureTime=new Date,(t.message.toLowerCase().includes("timeout")||t.name==="TimeoutError"||t.name==="AbortError")&&!this.config.includeTimeouts)return;this.failures.push({timestamp:new Date,error:t}),this.cleanOldFailures();let r=this.getState();if(r==="half-open"){this.transitionTo("open");return}r==="closed"&&this.failures.length>=this.config.failureThreshold&&this.transitionTo("open")}getStats(){return{state:this.getState(),totalRequests:this.totalRequests,successCount:this.totalSuccesses,failureCount:this.totalFailures,rejectedCount:this.rejectedCount,lastFailureTime:this.lastFailureTime,lastSuccessTime:this.lastSuccessTime,timeUntilTransitionMs:this.getTimeUntilTransition()}}reset(){this.state="closed",this.failures=[],this.successCount=0,this.halfOpenSuccesses=0,this.openedAt=void 0}forceOpen(){this.transitionTo("open")}forceHalfOpen(){this.transitionTo("half-open")}getRecentFailures(t=5){return this.failures.slice(-t).map(e=>`[${e.timestamp.toISOString()}] ${e.error.message}`)}transitionTo(t){if(this.state!==t)switch(this.state=t,t){case"open":this.openedAt=new Date,this.halfOpenSuccesses=0;break;case"half-open":this.halfOpenSuccesses=0;break;case"closed":this.failures=[],this.openedAt=void 0,this.halfOpenSuccesses=0;break}}cleanOldFailures(){let t=Date.now()-this.config.failureWindowMs;this.failures=this.failures.filter(e=>e.timestamp.getTime()>t)}getTimeUntilTransition(){if(this.state==="open"&&this.openedAt){let t=Date.now()-this.openedAt.getTime(),e=this.config.resetTimeoutMs-t;return Math.max(0,e)}}},F=class{breakers=new Map;defaultConfig;constructor(t={}){this.defaultConfig={...Re,...t}}getBreaker(t,e){let r=this.breakers.get(t);return r||(r=new ue(t,{...this.defaultConfig,...e}),this.breakers.set(t,r)),r}getAllStats(){let t={};for(let[e,r]of this.breakers)t[e]=r.getStats();return t}getAvailableProviders(){let t=[];for(let[e,r]of this.breakers)r.canExecute()&&t.push(e);return t}resetAll(){for(let t of this.breakers.values())t.reset()}reset(t){let e=this.breakers.get(t);e&&e.reset()}};var we={maxSize:1e3,defaultTtlMs:36e5,enableLRU:!0,cacheGenerations:!0,cacheEmbeddings:!0,cacheCompletions:!0},A=class{cache=new Map;accessOrder=[];config;hits=0;misses=0;evictions=0;constructor(t={}){this.config={...we,...t}}static generateKey(t,e,r){let s=[t,r?.model??"default",String(r?.temperature??.7),String(r?.maxTokens??0),r?.systemPrompt??"",e].join("|"),n=0;for(let i=0;i<s.length;i++){let l=s.charCodeAt(i);n=(n<<5)-n+l,n=n&n}return`${t}:${Math.abs(n).toString(36)}`}get(t){let e=this.cache.get(t);if(!e){this.misses++;return}if(e.ttlMs>0&&Date.now()-e.createdAt.getTime()>e.ttlMs){this.delete(t),this.misses++;return}return this.hits++,e.lastAccessedAt=new Date,e.accessCount++,this.config.enableLRU&&this.updateAccessOrder(t),e.value}set(t,e,r){this.cache.size>=this.config.maxSize&&!this.cache.has(t)&&this.evictLRU();let o={value:e,createdAt:new Date,lastAccessedAt:new Date,accessCount:1,ttlMs:r??this.config.defaultTtlMs,keyHash:t};this.cache.set(t,o),this.config.enableLRU&&this.updateAccessOrder(t)}has(t){let e=this.cache.get(t);return e?e.ttlMs>0&&Date.now()-e.createdAt.getTime()>e.ttlMs?(this.delete(t),!1):!0:!1}delete(t){let e=this.cache.delete(t);if(e){let r=this.accessOrder.indexOf(t);r!==-1&&this.accessOrder.splice(r,1)}return e}clear(){this.cache.clear(),this.accessOrder=[],this.hits=0,this.misses=0,this.evictions=0}getStats(){let t=this.hits+this.misses,e=t>0?this.hits/t:0,r=0;for(let o of this.cache.values())r+=this.estimateSize(o.value);return{size:this.cache.size,maxSize:this.config.maxSize,hits:this.hits,misses:this.misses,hitRate:e,evictions:this.evictions,memoryUsageBytes:r}}keys(){return Array.from(this.cache.keys())}entries(){return Array.from(this.cache.entries())}import(t){for(let[e,r]of t)r.createdAt=new Date(r.createdAt),r.lastAccessedAt=new Date(r.lastAccessedAt),this.cache.set(e,r),this.accessOrder.push(e);for(;this.cache.size>this.config.maxSize;)this.evictLRU()}pruneExpired(){let t=Date.now(),e=0;for(let[r,o]of this.cache.entries())o.ttlMs>0&&t-o.createdAt.getTime()>o.ttlMs&&(this.delete(r),e++);return e}updateAccessOrder(t){let e=this.accessOrder.indexOf(t);e!==-1&&this.accessOrder.splice(e,1),this.accessOrder.push(t)}evictLRU(){if(this.accessOrder.length===0){let e=this.cache.keys().next().value;e&&(this.cache.delete(e),this.evictions++);return}let t=this.accessOrder.shift();t&&(this.cache.delete(t),this.evictions++)}estimateSize(t){return t==null?0:JSON.stringify(t).length*2}},W=class{generationCache;embeddingCache;completionCache;config;constructor(t={}){this.config={...we,...t},this.generationCache=new A(t),this.embeddingCache=new A(t),this.completionCache=new A(t)}getGeneration(t,e){if(!this.config.cacheGenerations)return;let r=A.generateKey("generation",t,e);return this.generationCache.get(r)}setGeneration(t,e,r,o){if(!this.config.cacheGenerations)return;let s=A.generateKey("generation",t,r);this.generationCache.set(s,e,o)}getEmbedding(t,e){if(!this.config.cacheEmbeddings)return;let r=A.generateKey("embedding",t,e);return this.embeddingCache.get(r)}setEmbedding(t,e,r,o){if(!this.config.cacheEmbeddings)return;let s=A.generateKey("embedding",t,r);this.embeddingCache.set(s,e,o)}getCompletion(t,e){if(!this.config.cacheCompletions)return;let r=A.generateKey("completion",t,e);return this.completionCache.get(r)}setCompletion(t,e,r,o){if(!this.config.cacheCompletions)return;let s=A.generateKey("completion",t,r);this.completionCache.set(s,e,o)}getStats(){let t=this.generationCache.getStats(),e=this.embeddingCache.getStats(),r=this.completionCache.getStats(),o=t.hits+e.hits+r.hits,s=t.misses+e.misses+r.misses,n=o+s;return{generation:t,embedding:e,completion:r,total:{size:t.size+e.size+r.size,maxSize:this.config.maxSize*3,hits:o,misses:s,hitRate:n>0?o/n:0,evictions:t.evictions+e.evictions+r.evictions,memoryUsageBytes:t.memoryUsageBytes+e.memoryUsageBytes+r.memoryUsageBytes}}}clear(){this.generationCache.clear(),this.embeddingCache.clear(),this.completionCache.clear()}pruneExpired(){return this.generationCache.pruneExpired()+this.embeddingCache.pruneExpired()+this.completionCache.pruneExpired()}};S();var pe="(unattributed)",qe=`
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.0");process.exit(0)}
2
+ import{b as T}from"./chunk-Z6CRROLU.js";import{a as _e,c as Re}from"./chunk-XEABMIUH.js";import{b as a,g as Ce}from"./chunk-JIWMFLHV.js";import{a as ue,b as qe}from"./chunk-AAQNRZKT.js";import{b as ke,c as _,d as Ee,f as I}from"./chunk-F7JVDLOI.js";import{e as G,h as Te,i as le,n as $}from"./chunk-H77AUJNW.js";import{b as F,d as be}from"./chunk-ATXAMGVE.js";import{b as ve,d as Ke}from"./chunk-UGYXUPGN.js";import{b as E,e as L}from"./chunk-X5RELRY7.js";import{b as ce}from"./chunk-GX5RFGW2.js";import{readFileSync as We}from"fs";import*as Le from"path";function j(g){return typeof g=="string"&&ze.includes(g)}function je(g){try{let e=We(g,"utf8").match(/^\s*effort_level\s*:\s*['"]?([a-z]+)['"]?\s*$/m);return e&&j(e[1])?e[1]:null}catch{return null}}function Pe(g={}){if(g.override&&j(g.override))return g.override;if(g.agentEffort&&j(g.agentEffort))return g.agentEffort;let e=(g.env??process.env).QE_EFFORT_LEVEL;if(e&&j(e))return e;let r=g.fleetDefaultsPath??Le.join(process.cwd(),"config","fleet-defaults.yaml");return H===void 0&&(H=je(r)),H||He}var ze,He,H,Oe=ce(()=>{"use strict";ze=["low","medium","high","xhigh","max"],He="xhigh"});function Ve(g){try{let t=G(g);return{sendSampling:t.supportsSamplingParams!==!1,supportsEffort:t.supportsEffortXHigh===!0}}catch{return{sendSampling:!1,supportsEffort:!1}}}function V(g,t,e){let r=Ve(t);if(r.sendSampling&&e.temperature!==void 0&&(g.temperature=e.temperature),r.supportsEffort){let o=e.effort??(Ye(t)?Pe():void 0);o!==void 0&&(g.output_config={effort:o})}return g}function Ye(g){return Te(g)?.tier==="flagship"}var ge=ce(()=>{"use strict";$();Oe()});function pt(g){try{let t=G(g);return{sendSampling:t.supportsSamplingParams!==!1,maxTokensField:t.usesMaxCompletionTokens===!0?"max_completion_tokens":"max_tokens"}}catch{return ct.test(g)?{...ut}:{...lt}}}function N(g,t,e){let r=pt(t),o=g;return e.maxTokens!==void 0&&(o[r.maxTokensField]=e.maxTokens),r.sendSampling&&e.temperature!==void 0&&(o.temperature=e.temperature),g}var ct,lt,ut,fe=ce(()=>{"use strict";$();ct=/^(openai\/)?(gpt-5|gpt-6|o\d)/i,lt={sendSampling:!0,maxTokensField:"max_tokens"},ut={sendSampling:!1,maxTokensField:"max_completion_tokens"}});Ke();L();var we={failureThreshold:5,resetTimeoutMs:3e4,halfOpenSuccessThreshold:2,failureWindowMs:6e4,includeTimeouts:!0},pe=class{state="closed";failures=[];successCount=0;totalRequests=0;totalSuccesses=0;totalFailures=0;rejectedCount=0;lastFailureTime;lastSuccessTime;openedAt;halfOpenSuccesses=0;config;providerType;constructor(t,e={}){this.providerType=t,this.config={...we,...e}}getState(){return this.state==="open"&&this.openedAt&&Date.now()-this.openedAt.getTime()>=this.config.resetTimeoutMs&&this.transitionTo("half-open"),this.state}canExecute(){let t=this.getState();return t==="closed"?!0:t!=="open"}async execute(t){if(this.totalRequests++,this.getState()==="open")throw this.rejectedCount++,a(`Circuit breaker is open for provider ${this.providerType}`,"CIRCUIT_OPEN",{provider:this.providerType,retryable:!0,retryAfterMs:this.getTimeUntilTransition()});try{let r=await t();return this.recordSuccess(),r}catch(r){throw this.recordFailure(E(r)),r}}recordSuccess(){this.successCount++,this.totalSuccesses++,this.lastSuccessTime=new Date,this.getState()==="half-open"&&(this.halfOpenSuccesses++,this.halfOpenSuccesses>=this.config.halfOpenSuccessThreshold&&this.transitionTo("closed"))}recordFailure(t){if(this.totalFailures++,this.lastFailureTime=new Date,(t.message.toLowerCase().includes("timeout")||t.name==="TimeoutError"||t.name==="AbortError")&&!this.config.includeTimeouts)return;this.failures.push({timestamp:new Date,error:t}),this.cleanOldFailures();let r=this.getState();if(r==="half-open"){this.transitionTo("open");return}r==="closed"&&this.failures.length>=this.config.failureThreshold&&this.transitionTo("open")}getStats(){return{state:this.getState(),totalRequests:this.totalRequests,successCount:this.totalSuccesses,failureCount:this.totalFailures,rejectedCount:this.rejectedCount,lastFailureTime:this.lastFailureTime,lastSuccessTime:this.lastSuccessTime,timeUntilTransitionMs:this.getTimeUntilTransition()}}reset(){this.state="closed",this.failures=[],this.successCount=0,this.halfOpenSuccesses=0,this.openedAt=void 0}forceOpen(){this.transitionTo("open")}forceHalfOpen(){this.transitionTo("half-open")}getRecentFailures(t=5){return this.failures.slice(-t).map(e=>`[${e.timestamp.toISOString()}] ${e.error.message}`)}transitionTo(t){if(this.state!==t)switch(this.state=t,t){case"open":this.openedAt=new Date,this.halfOpenSuccesses=0;break;case"half-open":this.halfOpenSuccesses=0;break;case"closed":this.failures=[],this.openedAt=void 0,this.halfOpenSuccesses=0;break}}cleanOldFailures(){let t=Date.now()-this.config.failureWindowMs;this.failures=this.failures.filter(e=>e.timestamp.getTime()>t)}getTimeUntilTransition(){if(this.state==="open"&&this.openedAt){let t=Date.now()-this.openedAt.getTime(),e=this.config.resetTimeoutMs-t;return Math.max(0,e)}}},W=class{breakers=new Map;defaultConfig;constructor(t={}){this.defaultConfig={...we,...t}}getBreaker(t,e){let r=this.breakers.get(t);return r||(r=new pe(t,{...this.defaultConfig,...e}),this.breakers.set(t,r)),r}getAllStats(){let t={};for(let[e,r]of this.breakers)t[e]=r.getStats();return t}getAvailableProviders(){let t=[];for(let[e,r]of this.breakers)r.canExecute()&&t.push(e);return t}resetAll(){for(let t of this.breakers.values())t.reset()}reset(t){let e=this.breakers.get(t);e&&e.reset()}};import{createHash as Be}from"node:crypto";var Ae={maxSize:1e3,defaultTtlMs:36e5,enableLRU:!0,cacheGenerations:!0,cacheEmbeddings:!0,cacheCompletions:!0},A=class{cache=new Map;accessOrder=[];config;hits=0;misses=0;evictions=0;constructor(t={}){this.config={...Ae,...t}}static generateKey(t,e,r){let o=[t,r?.model??"default",String(r?.temperature??.7),String(r?.maxTokens??0),r?.systemPrompt??"",e],s=[r?.stopSequences,r?.effort,r?.preferredProvider];s.some(i=>i!==void 0)&&o.push(JSON.stringify(s));let n=Be("sha256").update(JSON.stringify(o)).digest("hex");return`${t}:${n}`}get(t){let e=this.cache.get(t);if(!e){this.misses++;return}if(e.ttlMs>0&&Date.now()-e.createdAt.getTime()>e.ttlMs){this.delete(t),this.misses++;return}return this.hits++,e.lastAccessedAt=new Date,e.accessCount++,this.config.enableLRU&&this.updateAccessOrder(t),e.value}set(t,e,r){this.cache.size>=this.config.maxSize&&!this.cache.has(t)&&this.evictLRU();let o={value:e,createdAt:new Date,lastAccessedAt:new Date,accessCount:1,ttlMs:r??this.config.defaultTtlMs,keyHash:t};this.cache.set(t,o),this.config.enableLRU&&this.updateAccessOrder(t)}has(t){let e=this.cache.get(t);return e?e.ttlMs>0&&Date.now()-e.createdAt.getTime()>e.ttlMs?(this.delete(t),!1):!0:!1}delete(t){let e=this.cache.delete(t);if(e){let r=this.accessOrder.indexOf(t);r!==-1&&this.accessOrder.splice(r,1)}return e}clear(){this.cache.clear(),this.accessOrder=[],this.hits=0,this.misses=0,this.evictions=0}getStats(){let t=this.hits+this.misses,e=t>0?this.hits/t:0,r=0;for(let o of this.cache.values())r+=this.estimateSize(o.value);return{size:this.cache.size,maxSize:this.config.maxSize,hits:this.hits,misses:this.misses,hitRate:e,evictions:this.evictions,memoryUsageBytes:r}}keys(){return Array.from(this.cache.keys())}entries(){return Array.from(this.cache.entries())}import(t){for(let[e,r]of t)r.createdAt=new Date(r.createdAt),r.lastAccessedAt=new Date(r.lastAccessedAt),this.cache.set(e,r),this.config.enableLRU&&this.updateAccessOrder(e);for(;this.cache.size>this.config.maxSize;)this.evictLRU()}pruneExpired(){let t=Date.now(),e=0;for(let[r,o]of this.cache.entries())o.ttlMs>0&&t-o.createdAt.getTime()>o.ttlMs&&(this.delete(r),e++);return e}updateAccessOrder(t){let e=this.accessOrder.indexOf(t);e!==-1&&this.accessOrder.splice(e,1),this.accessOrder.push(t)}evictLRU(){if(this.accessOrder.length===0){let e=this.cache.keys().next().value;e!==void 0&&(this.cache.delete(e),this.evictions++);return}let t=this.accessOrder.shift();t!==void 0&&(this.cache.delete(t),this.evictions++)}estimateSize(t){return t==null?0:JSON.stringify(t).length*2}},z=class{generationCache;embeddingCache;completionCache;config;constructor(t={}){this.config={...Ae,...t},this.generationCache=new A(t),this.embeddingCache=new A(t),this.completionCache=new A(t)}getGeneration(t,e){if(!this.config.cacheGenerations)return;let r=A.generateKey("generation",t,e);return this.generationCache.get(r)}setGeneration(t,e,r,o){if(!this.config.cacheGenerations)return;let s=A.generateKey("generation",t,r);this.generationCache.set(s,e,o)}getEmbedding(t,e){if(!this.config.cacheEmbeddings)return;let r=A.generateKey("embedding",t,e);return this.embeddingCache.get(r)}setEmbedding(t,e,r,o){if(!this.config.cacheEmbeddings)return;let s=A.generateKey("embedding",t,r);this.embeddingCache.set(s,e,o)}getCompletion(t,e){if(!this.config.cacheCompletions)return;let r=A.generateKey("completion",t,e);return this.completionCache.get(r)}setCompletion(t,e,r,o){if(!this.config.cacheCompletions)return;let s=A.generateKey("completion",t,r);this.completionCache.set(s,e,o)}getStats(){let t=this.generationCache.getStats(),e=this.embeddingCache.getStats(),r=this.completionCache.getStats(),o=t.hits+e.hits+r.hits,s=t.misses+e.misses+r.misses,n=o+s;return{generation:t,embedding:e,completion:r,total:{size:t.size+e.size+r.size,maxSize:this.config.maxSize*3,hits:o,misses:s,hitRate:n>0?o/n:0,evictions:t.evictions+e.evictions+r.evictions,memoryUsageBytes:t.memoryUsageBytes+e.memoryUsageBytes+r.memoryUsageBytes}}}clear(){this.generationCache.clear(),this.embeddingCache.clear(),this.completionCache.clear()}pruneExpired(){return this.generationCache.pruneExpired()+this.embeddingCache.pruneExpired()+this.completionCache.pruneExpired()}};I();var de="(unattributed)",Fe=`
3
3
  CREATE TABLE IF NOT EXISTS llm_spend (
4
4
  id INTEGER PRIMARY KEY AUTOINCREMENT,
5
5
  ts INTEGER NOT NULL,
@@ -12,18 +12,18 @@ CREATE TABLE IF NOT EXISTS llm_spend (
12
12
  request_id TEXT
13
13
  );
14
14
  CREATE INDEX IF NOT EXISTS idx_llm_spend_ts ON llm_spend(ts);
15
- `,de=class{db;hasAgentColumn=!1;constructor(t){this.db=t,this.db.exec(qe);try{this.db.prepare("PRAGMA table_info(llm_spend)").all().some(r=>r.name==="agent_type")||this.db.exec("ALTER TABLE llm_spend ADD COLUMN agent_type TEXT"),this.db.exec("CREATE INDEX IF NOT EXISTS idx_llm_spend_agent ON llm_spend(agent_type)"),this.hasAgentColumn=!0}catch{}}record(t){try{this.hasAgentColumn?this.db.prepare(`INSERT INTO llm_spend
15
+ `,me=class{db;hasAgentColumn=!1;constructor(t){this.db=t,this.db.exec(Fe);try{this.db.prepare("PRAGMA table_info(llm_spend)").all().some(r=>r.name==="agent_type")||this.db.exec("ALTER TABLE llm_spend ADD COLUMN agent_type TEXT"),this.db.exec("CREATE INDEX IF NOT EXISTS idx_llm_spend_agent ON llm_spend(agent_type)"),this.hasAgentColumn=!0}catch{}}record(t){try{this.hasAgentColumn?this.db.prepare(`INSERT INTO llm_spend
16
16
  (ts, provider, model, cost_usd, cost_source, prompt_tokens, completion_tokens, request_id, agent_type)
17
17
  VALUES (@ts, @provider, @model, @cost_usd, @cost_source, @prompt_tokens, @completion_tokens, @request_id, @agent_type)`).run({ts:Date.now(),provider:t.provider,model:t.model,cost_usd:t.costUsd,cost_source:t.costSource,prompt_tokens:t.promptTokens,completion_tokens:t.completionTokens,request_id:t.requestId,agent_type:t.agent??null}):this.db.prepare(`INSERT INTO llm_spend
18
18
  (ts, provider, model, cost_usd, cost_source, prompt_tokens, completion_tokens, request_id)
19
19
  VALUES (@ts, @provider, @model, @cost_usd, @cost_source, @prompt_tokens, @completion_tokens, @request_id)`).run({ts:Date.now(),provider:t.provider,model:t.model,cost_usd:t.costUsd,cost_source:t.costSource,prompt_tokens:t.promptTokens,completion_tokens:t.completionTokens,request_id:t.requestId})}catch{}}spentSince(t,e=Date.now()){try{return this.db.prepare("SELECT COALESCE(SUM(cost_usd), 0) AS total FROM llm_spend WHERE ts >= ?").get(e-t)?.total??0}catch{return 0}}spentByAgentSince(t,e=Date.now()){try{let r=this.db.prepare(`SELECT COALESCE(agent_type, ?) AS agent, COALESCE(SUM(cost_usd), 0) AS total
20
- FROM llm_spend WHERE ts >= ? GROUP BY COALESCE(agent_type, ?)`).all(pe,e-t,pe),o={};for(let s of r)o[s.agent]=s.total;return o}catch{return{}}}},K=class{entries=[];record(t){this.entries.push({ts:Date.now(),costUsd:t.costUsd,agent:t.agent??pe})}spentSince(t,e=Date.now()){let r=e-t,o=0;for(let s of this.entries)s.ts>=r&&(o+=s.costUsd);return o}spentByAgentSince(t,e=Date.now()){let r=e-t,o={};for(let s of this.entries)s.ts>=r&&(o[s.agent]=(o[s.agent]??0)+s.costUsd);return o}};async function Ae(){try{let t=(await import("./unified-memory-OVFEPRPS.js")).getUnifiedMemory();return t.isInitialized()||await t.initialize(),new de(t.getDatabase())}catch{return new K}}S();L();function me(g,t,e,r){let o=Math.min(t*Math.pow(2,g),e),s=Math.random()*r*o;return o+s}var Be=1e3,Ge=3e4;function T(g,t=Be,e=Ge){return me(g,t,e,0)}he();$();var Ve={model:ce,maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,anthropicVersion:"2023-06-01",enableCache:!0,enableCircuitBreaker:!0},V=class{type="claude";name="Anthropic Claude";config;requestId=0;constructor(t={}){this.config={...Ve,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set ANTHROPIC_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/messages`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:this.config.model,max_tokens:1,messages:[{role:"user",content:"Hi"}]})},5e3),o=Date.now()-e;if(!r.ok){let s=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${s}`}}return{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{apiVersion:this.config.anthropicVersion,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("Anthropic API key not configured","API_KEY_MISSING",{provider:"claude",retryable:!1});let o=this.formatMessages(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`claude-${++this.requestId}-${Date.now()}`,p=Date.now(),m={model:s,max_tokens:n,messages:o};H(m,s,{temperature:i,effort:e?.effort}),e?.systemPrompt&&(m.system=this.config.enableCache!==!1?[{type:"text",text:e.systemPrompt,cache_control:{type:"ephemeral"}}]:e.systemPrompt),e?.stopSequences&&e.stopSequences.length>0&&(m.stop_sequences=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/messages`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-p;if(!c.ok){let k=await c.json().catch(()=>({error:{message:"Unknown error"}}));throw this.handleApiError(c.status,k,s)}let d=await c.json(),h=d.usage.cache_creation_input_tokens??0,f=d.usage.cache_read_input_tokens??0,b={promptTokens:d.usage.input_tokens,completionTokens:d.usage.output_tokens,totalTokens:d.usage.input_tokens+h+f+d.usage.output_tokens,cacheCreationTokens:h,cacheReadTokens:f},y=_.calculateCost(s,b);return v.recordTokenUsage(l,"claude-provider","llm","generate",{inputTokens:d.usage.input_tokens,outputTokens:d.usage.output_tokens,totalTokens:d.usage.input_tokens+d.usage.output_tokens,estimatedCostUsd:y.totalCost}),{content:d.content.filter(k=>k.type==="text").map(k=>k.text).join(""),model:d.model,provider:"claude",usage:b,cost:y,latencyMs:u,finishReason:this.mapFinishReason(d.stop_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"claude",model:s,retryable:!0,cause:c})}}async embed(t,e){throw a("Claude does not support native embeddings. Use OpenAI or Ollama for embeddings.","MODEL_NOT_FOUND",{provider:"claude",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
20
+ FROM llm_spend WHERE ts >= ? GROUP BY COALESCE(agent_type, ?)`).all(de,e-t,de),o={};for(let s of r)o[s.agent]=s.total;return o}catch{return{}}}},K=class{entries=[];record(t){this.entries.push({ts:Date.now(),costUsd:t.costUsd,agent:t.agent??de})}spentSince(t,e=Date.now()){let r=e-t,o=0;for(let s of this.entries)s.ts>=r&&(o+=s.costUsd);return o}spentByAgentSince(t,e=Date.now()){let r=e-t,o={};for(let s of this.entries)s.ts>=r&&(o[s.agent]=(o[s.agent]??0)+s.costUsd);return o}};async function Me(){try{let t=(await import("./unified-memory-B5IA2KKQ.js")).getUnifiedMemory();return t.isInitialized()||await t.initialize(),new me(t.getDatabase())}catch{return new K}}I();L();L();function he(g,t,e,r){let o=Math.min(t*Math.pow(2,g),e),s=Math.random()*r*o;return o+s}var Ge=1e3,$e=3e4;function k(g,t=Ge,e=$e){return he(g,t,e,0)}ge();$();var Je={model:le,maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,anthropicVersion:"2023-06-01",enableCache:!0,enableCircuitBreaker:!0},Y=class{type="claude";name="Anthropic Claude";config;requestId=0;constructor(t={}){this.config={...Je,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set ANTHROPIC_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/messages`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:this.config.model,max_tokens:1,messages:[{role:"user",content:"Hi"}]})},5e3),o=Date.now()-e;if(!r.ok){let s=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${s}`}}return{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{apiVersion:this.config.anthropicVersion,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("Anthropic API key not configured","API_KEY_MISSING",{provider:"claude",retryable:!1});let o=this.formatMessages(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`claude-${++this.requestId}-${Date.now()}`,d=Date.now(),m={model:s,max_tokens:n,messages:o};V(m,s,{temperature:i,effort:e?.effort}),e?.systemPrompt&&(m.system=this.config.enableCache!==!1?[{type:"text",text:e.systemPrompt,cache_control:{type:"ephemeral"}}]:e.systemPrompt),e?.stopSequences&&e.stopSequences.length>0&&(m.stop_sequences=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/messages`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-d;if(!c.ok){let v=await c.json().catch(()=>({error:{message:"Unknown error"}}));throw this.handleApiError(c.status,v,s)}let p=await c.json(),h=p.usage.cache_creation_input_tokens??0,f=p.usage.cache_read_input_tokens??0,b={promptTokens:p.usage.input_tokens,completionTokens:p.usage.output_tokens,totalTokens:p.usage.input_tokens+h+f+p.usage.output_tokens,cacheCreationTokens:h,cacheReadTokens:f},y=_.calculateCost(s,b);return T.recordTokenUsage(l,"claude-provider","llm","generate",{inputTokens:p.usage.input_tokens,outputTokens:p.usage.output_tokens,totalTokens:p.usage.input_tokens+p.usage.output_tokens,estimatedCostUsd:y.totalCost}),{content:p.content.filter(v=>v.type==="text").map(v=>v.text).join(""),model:p.model,provider:"claude",usage:b,cost:y,latencyMs:u,finishReason:this.mapFinishReason(p.stop_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"claude",model:s,retryable:!0,cause:c})}}async embed(t,e){throw a("Claude does not support native embeddings. Use OpenAI or Ollama for embeddings.","MODEL_NOT_FOUND",{provider:"claude",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
21
21
 
22
- `,"```"]});return{completion:r.content,model:r.model,provider:"claude",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["claude-opus-4-7","claude-sonnet-4-6","claude-haiku-4-5-20251001","claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307"]}getCostPerToken(){return _.getCostPerToken(this.config.model)}async dispose(){}getApiKey(){return this.config.apiKey??process.env.ANTHROPIC_API_KEY}getBaseUrl(){return(this.config.baseUrl??process.env.ANTHROPIC_BASE_URL??"https://api.anthropic.com").replace(/\/$/,"")}getHeaders(){return{"Content-Type":"application/json","x-api-key":this.getApiKey(),"anthropic-version":this.config.anthropicVersion??"2023-06-01"}}formatMessages(t){return typeof t=="string"?[{role:"user",content:t}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role,content:e.content}))}mapFinishReason(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"stop_sequence":return"stop";default:return"stop"}}handleApiError(t,e,r){let o="error"in e?e.error?.message??"Unknown API error":"Unknown API error",s="error"in e&&"type"in e.error?e.error.type:"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"claude",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"claude",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s==="invalid_request_error"&&o.includes("context")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"claude",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"claude",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"claude",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"claude",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"claude",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};import{spawn as Ye}from"node:child_process";var Je=["ANTHROPIC_API_KEY","CLAUDE_API_KEY","ANTHROPIC_AUTH_TOKEN"],Xe={model:"sonnet",maxTokens:4096,temperature:.7,timeoutMs:12e4,maxRetries:1,binaryPath:"claude",maxConcurrency:2,disallowedTools:["Bash","Edit","Write","NotebookEdit","WebFetch","WebSearch","Task"]},Y=class g{type="claude-code";name="Claude Code (subscription)";billingMode="subscription";config;requestId=0;availabilityCache;active=0;queue=[];constructor(t={}){this.config={...Xe,...t};let e=Number.parseInt(process.env.AQE_CLAUDE_CODE_CONCURRENCY??"",10);Number.isFinite(e)&&e>0&&(this.config.maxConcurrency=e)}async isAvailable(){let t=Date.now();if(this.availabilityCache&&t-this.availabilityCache.at<6e4)return this.availabilityCache.available;let e=!1;try{let{code:r}=await this.runProcess(["--version"],void 0,5e3);e=r===0}catch{e=!1}return this.availabilityCache={at:t,available:e},e}async healthCheck(){let t=Date.now(),e=await this.isAvailable(),r=Date.now()-t;return e?{healthy:!0,latencyMs:r,models:this.getSupportedModels(),details:{binaryPath:this.config.binaryPath,billing:"subscription"}}:{healthy:!1,latencyMs:r,error:`Claude Code CLI ("${this.config.binaryPath}") not found or not runnable. Install Claude Code and log in with your Pro/Max account.`}}async generate(t,e){let r=this.toCliModel(e?.model??this.config.model),o=`claude-code-${++this.requestId}-${Date.now()}`,{prompt:s,systemPrompt:n}=this.flatten(t,e?.systemPrompt),i=["-p","--output-format","json","--model",r];n&&i.push("--append-system-prompt",n);let l=this.config.disallowedTools??[];l.length>0&&i.push("--disallowedTools",...l);let p=Date.now(),m=e?.timeoutMs??this.config.timeoutMs??12e4,{code:c,stdout:u,stderr:d}=await this.withConcurrency(()=>this.runProcess(i,s,m)),h=Date.now()-p;if(c!==0&&!u.trim())throw this.classifyError(d||`claude exited with code ${c}`,r);let f;try{f=JSON.parse(u)}catch{throw a(`Could not parse claude -p JSON output: ${u.slice(0,200)}`,"PROVIDER_UNAVAILABLE",{provider:"claude-code",model:r,retryable:!0})}if(f.is_error)throw this.classifyError(f.result??f.api_error_status??"claude error",r);let b=f.usage??{},y={promptTokens:b.input_tokens??0,completionTokens:b.output_tokens??0,totalTokens:(b.input_tokens??0)+(b.output_tokens??0),cacheCreationTokens:b.cache_creation_input_tokens??0,cacheReadTokens:b.cache_read_input_tokens??0},C=f.modelUsage&&Object.keys(f.modelUsage)[0]||r;return v.recordTokenUsage(o,"claude-code-provider","llm","generate",{inputTokens:y.promptTokens,outputTokens:y.completionTokens,totalTokens:y.totalTokens,estimatedCostUsd:0}),{content:f.result??"",model:C,provider:"claude-code",usage:y,cost:{inputCost:0,outputCost:0,totalCost:0,currency:"USD",source:"provider-receipt"},latencyMs:h,finishReason:this.mapFinishReason(f.stop_reason),cached:!1,requestId:o}}async embed(t,e){throw a("Claude Code provider does not support embeddings. Use openai, ollama, or cognitum.","MODEL_NOT_FOUND",{provider:"claude-code",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256});return{completion:r.content,model:r.model,provider:"claude-code",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["opus","sonnet","haiku"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}toCliModel(t){let e=t.toLowerCase();return e.includes("opus")?"opus":e.includes("haiku")?"haiku":e.includes("sonnet")?"sonnet":t}flatten(t,e){if(typeof t=="string")return{prompt:t,systemPrompt:e};let r=t.filter(s=>s.role==="system").map(s=>s.content);return e&&r.unshift(e),{prompt:t.filter(s=>s.role!=="system").map(s=>`${s.role==="assistant"?"Assistant":"User"}: ${s.content}`).join(`
22
+ `,"```"]});return{completion:r.content,model:r.model,provider:"claude",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["claude-opus-4-7","claude-sonnet-4-6","claude-haiku-4-5-20251001","claude-3-opus-20240229","claude-3-sonnet-20240229","claude-3-haiku-20240307"]}getCostPerToken(){return _.getCostPerToken(this.config.model)}async dispose(){}getApiKey(){return this.config.apiKey??process.env.ANTHROPIC_API_KEY}getBaseUrl(){return(this.config.baseUrl??process.env.ANTHROPIC_BASE_URL??"https://api.anthropic.com").replace(/\/$/,"")}getHeaders(){return{"Content-Type":"application/json","x-api-key":this.getApiKey(),"anthropic-version":this.config.anthropicVersion??"2023-06-01"}}formatMessages(t){return typeof t=="string"?[{role:"user",content:t}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role,content:e.content}))}mapFinishReason(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"stop_sequence":return"stop";default:return"stop"}}handleApiError(t,e,r){let o="error"in e?e.error?.message??"Unknown API error":"Unknown API error",s="error"in e&&"type"in e.error?e.error.type:"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"claude",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"claude",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s==="invalid_request_error"&&o.includes("context")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"claude",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"claude",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"claude",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"claude",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"claude",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};import{spawn as Xe}from"node:child_process";var Qe=["ANTHROPIC_API_KEY","CLAUDE_API_KEY","ANTHROPIC_AUTH_TOKEN"],Ze={model:"sonnet",maxTokens:4096,temperature:.7,timeoutMs:12e4,maxRetries:1,binaryPath:"claude",maxConcurrency:2,disallowedTools:["Bash","Edit","Write","NotebookEdit","WebFetch","WebSearch","Task"]},J=class g{type="claude-code";name="Claude Code (subscription)";billingMode="subscription";config;requestId=0;availabilityCache;active=0;queue=[];constructor(t={}){this.config={...Ze,...t};let e=Number.parseInt(process.env.AQE_CLAUDE_CODE_CONCURRENCY??"",10);Number.isFinite(e)&&e>0&&(this.config.maxConcurrency=e)}async isAvailable(){let t=Date.now();if(this.availabilityCache&&t-this.availabilityCache.at<6e4)return this.availabilityCache.available;let e=!1;try{let{code:r}=await this.runProcess(["--version"],void 0,5e3);e=r===0}catch{e=!1}return this.availabilityCache={at:t,available:e},e}async healthCheck(){let t=Date.now(),e=await this.isAvailable(),r=Date.now()-t;return e?{healthy:!0,latencyMs:r,models:this.getSupportedModels(),details:{binaryPath:this.config.binaryPath,billing:"subscription"}}:{healthy:!1,latencyMs:r,error:`Claude Code CLI ("${this.config.binaryPath}") not found or not runnable. Install Claude Code and log in with your Pro/Max account.`}}async generate(t,e){let r=this.toCliModel(e?.model??this.config.model),o=`claude-code-${++this.requestId}-${Date.now()}`,{prompt:s,systemPrompt:n}=this.flatten(t,e?.systemPrompt),i=["-p","--output-format","json","--model",r];n&&i.push("--append-system-prompt",n);let l=this.config.disallowedTools??[];l.length>0&&i.push("--disallowedTools",...l);let d=Date.now(),m=e?.timeoutMs??this.config.timeoutMs??12e4,{code:c,stdout:u,stderr:p}=await this.withConcurrency(()=>this.runProcess(i,s,m)),h=Date.now()-d;if(c!==0&&!u.trim())throw this.classifyError(p||`claude exited with code ${c}`,r);let f;try{f=JSON.parse(u)}catch{throw a(`Could not parse claude -p JSON output: ${u.slice(0,200)}`,"PROVIDER_UNAVAILABLE",{provider:"claude-code",model:r,retryable:!0})}if(f.is_error)throw this.classifyError(f.result??f.api_error_status??"claude error",r);let b=f.usage??{},y={promptTokens:b.input_tokens??0,completionTokens:b.output_tokens??0,totalTokens:(b.input_tokens??0)+(b.output_tokens??0),cacheCreationTokens:b.cache_creation_input_tokens??0,cacheReadTokens:b.cache_read_input_tokens??0},C=f.modelUsage&&Object.keys(f.modelUsage)[0]||r;return T.recordTokenUsage(o,"claude-code-provider","llm","generate",{inputTokens:y.promptTokens,outputTokens:y.completionTokens,totalTokens:y.totalTokens,estimatedCostUsd:0}),{content:f.result??"",model:C,provider:"claude-code",usage:y,cost:{inputCost:0,outputCost:0,totalCost:0,currency:"USD",source:"provider-receipt"},latencyMs:h,finishReason:this.mapFinishReason(f.stop_reason),cached:!1,requestId:o}}async embed(t,e){throw a("Claude Code provider does not support embeddings. Use openai, ollama, or cognitum.","MODEL_NOT_FOUND",{provider:"claude-code",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256});return{completion:r.content,model:r.model,provider:"claude-code",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["opus","sonnet","haiku"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}toCliModel(t){let e=t.toLowerCase();return e.includes("opus")?"opus":e.includes("haiku")?"haiku":e.includes("sonnet")?"sonnet":t}flatten(t,e){if(typeof t=="string")return{prompt:t,systemPrompt:e};let r=t.filter(s=>s.role==="system").map(s=>s.content);return e&&r.unshift(e),{prompt:t.filter(s=>s.role!=="system").map(s=>`${s.role==="assistant"?"Assistant":"User"}: ${s.content}`).join(`
23
23
 
24
24
  `),systemPrompt:r.length>0?r.join(`
25
25
 
26
- `):void 0}}mapFinishReason(t){return t==="max_tokens"?"length":"stop"}classifyError(t,e){let r=t.toLowerCase();return r.includes("rate limit")||r.includes("usage limit")||r.includes("429")||r.includes("quota")?a(t,"RATE_LIMITED",{provider:"claude-code",model:e,retryable:!0,retryAfterMs:6e4}):a(t,"PROVIDER_UNAVAILABLE",{provider:"claude-code",model:e,retryable:!0})}static childEnv(t=process.env){let e={...t};for(let r of Je)delete e[r];return e}runProcess(t,e,r){return new Promise((o,s)=>{let n=Ye(this.config.binaryPath??"claude",t,{env:g.childEnv(),stdio:["pipe","pipe","pipe"]}),i="",l="",p=!1,m=setTimeout(()=>{p||(p=!0,n.kill("SIGKILL"),s(a("claude -p timed out","TIMEOUT",{provider:"claude-code",retryable:!0})))},r);n.stdout.on("data",c=>i+=c.toString()),n.stderr.on("data",c=>l+=c.toString()),n.on("error",c=>{p||(p=!0,clearTimeout(m),s(a(`Failed to spawn claude: ${c.message}`,"PROVIDER_UNAVAILABLE",{provider:"claude-code",retryable:!1,cause:c})))}),n.on("close",c=>{p||(p=!0,clearTimeout(m),o({code:c??0,stdout:i,stderr:l}))}),n.stdin.on("error",()=>{});try{e!==void 0&&n.stdin.write(e),n.stdin.end()}catch{}})}async withConcurrency(t){let e=this.config.maxConcurrency??2;this.active>=e&&await new Promise(r=>this.queue.push(r)),this.active++;try{return await t()}finally{this.active--;let r=this.queue.shift();r&&r()}}};import{spawn as Qe}from"node:child_process";import{mkdtempSync as Ze,readFileSync as et,rmSync as tt}from"node:fs";import{tmpdir as rt}from"node:os";import{join as Oe}from"node:path";var ot=["OPENAI_API_KEY","CODEX_API_KEY"],q="default",st={model:q,maxTokens:4096,temperature:.7,timeoutMs:18e4,maxRetries:1,binaryPath:"codex",maxConcurrency:2},J=class g{type="codex";name="Codex CLI (subscription)";billingMode="subscription";config;requestId=0;availabilityCache;active=0;queue=[];constructor(t={}){this.config={...st,...t};let e=Number.parseInt(process.env.AQE_CODEX_CONCURRENCY??"",10);Number.isFinite(e)&&e>0&&(this.config.maxConcurrency=e)}async isAvailable(){let t=Date.now();if(this.availabilityCache&&t-this.availabilityCache.at<6e4)return this.availabilityCache.available;let e=!1;try{let{code:r}=await this.runProcess(["--version"],void 0,void 0,5e3);e=r===0}catch{e=!1}return this.availabilityCache={at:t,available:e},e}async healthCheck(){let t=Date.now(),e=await this.isAvailable(),r=Date.now()-t;return e?{healthy:!0,latencyMs:r,models:this.getSupportedModels(),details:{binaryPath:this.config.binaryPath,billing:"subscription"}}:{healthy:!1,latencyMs:r,error:`Codex CLI ("${this.config.binaryPath}") not found or not runnable. Install Codex and log in with your ChatGPT account (\`codex login\`).`}}async generate(t,e){let r=e?.model??this.config.model??q,o=`codex-${++this.requestId}-${Date.now()}`,{prompt:s}=this.flatten(t,e?.systemPrompt),n=Ze(Oe(rt(),"aqe-codex-")),i=Oe(n,"last-message.txt"),l=["exec","--skip-git-repo-check","--sandbox","read-only","-o",i];r&&r!==q&&l.push("-m",r);let p=Date.now(),m=e?.timeoutMs??this.config.timeoutMs??18e4;try{let{code:c,stderr:u}=await this.withConcurrency(()=>this.runProcess(l,s,void 0,m)),d=Date.now()-p,h="";try{h=et(i,"utf8").trim()}catch{h=""}if(c!==0&&!h)throw this.classifyError(u||`codex exited with code ${c}`,r);let f=Math.ceil(s.length/4),b=Math.ceil(h.length/4),y={promptTokens:f,completionTokens:b,totalTokens:f+b,cacheCreationTokens:0,cacheReadTokens:0};return v.recordTokenUsage(o,"codex-provider","llm","generate",{inputTokens:y.promptTokens,outputTokens:y.completionTokens,totalTokens:y.totalTokens,estimatedCostUsd:0}),{content:h,model:r===q?"codex-default":r,provider:"codex",usage:y,cost:{inputCost:0,outputCost:0,totalCost:0,currency:"USD",source:"provider-receipt"},latencyMs:d,finishReason:"stop",cached:!1,requestId:o}}finally{tt(n,{recursive:!0,force:!0})}}async embed(t,e){throw a("Codex provider does not support embeddings. Use openai, ollama, or cognitum.","MODEL_NOT_FOUND",{provider:"codex",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256});return{completion:r.content,model:r.model,provider:"codex",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return[q,"gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.6-sol","gpt-5.3-codex"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}flatten(t,e){if(typeof t=="string")return{prompt:e?`${e}
26
+ `):void 0}}mapFinishReason(t){return t==="max_tokens"?"length":"stop"}classifyError(t,e){let r=t.toLowerCase();return r.includes("rate limit")||r.includes("usage limit")||r.includes("429")||r.includes("quota")?a(t,"RATE_LIMITED",{provider:"claude-code",model:e,retryable:!0,retryAfterMs:6e4}):a(t,"PROVIDER_UNAVAILABLE",{provider:"claude-code",model:e,retryable:!0})}static childEnv(t=process.env){let e={...t};for(let r of Qe)delete e[r];return e}runProcess(t,e,r){return new Promise((o,s)=>{let n=Xe(this.config.binaryPath??"claude",t,{env:g.childEnv(),stdio:["pipe","pipe","pipe"]}),i="",l="",d=!1,m=setTimeout(()=>{d||(d=!0,n.kill("SIGKILL"),s(a("claude -p timed out","TIMEOUT",{provider:"claude-code",retryable:!0})))},r);n.stdout.on("data",c=>i+=c.toString()),n.stderr.on("data",c=>l+=c.toString()),n.on("error",c=>{d||(d=!0,clearTimeout(m),s(a(`Failed to spawn claude: ${c.message}`,"PROVIDER_UNAVAILABLE",{provider:"claude-code",retryable:!1,cause:c})))}),n.on("close",c=>{d||(d=!0,clearTimeout(m),o({code:c??0,stdout:i,stderr:l}))}),n.stdin.on("error",()=>{});try{e!==void 0&&n.stdin.write(e),n.stdin.end()}catch{}})}async withConcurrency(t){let e=this.config.maxConcurrency??2;this.active>=e&&await new Promise(r=>this.queue.push(r)),this.active++;try{return await t()}finally{this.active--;let r=this.queue.shift();r&&r()}}};import{spawn as et}from"node:child_process";import{mkdtempSync as tt,readFileSync as rt,rmSync as ot}from"node:fs";import{tmpdir as st}from"node:os";import{join as Ie}from"node:path";var nt=["OPENAI_API_KEY","CODEX_API_KEY"],q="default",it={model:q,maxTokens:4096,temperature:.7,timeoutMs:18e4,maxRetries:1,binaryPath:"codex",maxConcurrency:2},X=class g{type="codex";name="Codex CLI (subscription)";billingMode="subscription";config;requestId=0;availabilityCache;active=0;queue=[];constructor(t={}){this.config={...it,...t};let e=Number.parseInt(process.env.AQE_CODEX_CONCURRENCY??"",10);Number.isFinite(e)&&e>0&&(this.config.maxConcurrency=e)}async isAvailable(){let t=Date.now();if(this.availabilityCache&&t-this.availabilityCache.at<6e4)return this.availabilityCache.available;let e=!1;try{let{code:r}=await this.runProcess(["--version"],void 0,void 0,5e3);e=r===0}catch{e=!1}return this.availabilityCache={at:t,available:e},e}async healthCheck(){let t=Date.now(),e=await this.isAvailable(),r=Date.now()-t;return e?{healthy:!0,latencyMs:r,models:this.getSupportedModels(),details:{binaryPath:this.config.binaryPath,billing:"subscription"}}:{healthy:!1,latencyMs:r,error:`Codex CLI ("${this.config.binaryPath}") not found or not runnable. Install Codex and log in with your ChatGPT account (\`codex login\`).`}}async generate(t,e){let r=e?.model??this.config.model??q,o=`codex-${++this.requestId}-${Date.now()}`,{prompt:s}=this.flatten(t,e?.systemPrompt),n=tt(Ie(st(),"aqe-codex-")),i=Ie(n,"last-message.txt"),l=["exec","--skip-git-repo-check","--sandbox","read-only","-o",i];r&&r!==q&&l.push("-m",r);let d=Date.now(),m=e?.timeoutMs??this.config.timeoutMs??18e4;try{let{code:c,stderr:u}=await this.withConcurrency(()=>this.runProcess(l,s,void 0,m)),p=Date.now()-d,h="";try{h=rt(i,"utf8").trim()}catch{h=""}if(c!==0&&!h)throw this.classifyError(u||`codex exited with code ${c}`,r);let f=Math.ceil(s.length/4),b=Math.ceil(h.length/4),y={promptTokens:f,completionTokens:b,totalTokens:f+b,cacheCreationTokens:0,cacheReadTokens:0};return T.recordTokenUsage(o,"codex-provider","llm","generate",{inputTokens:y.promptTokens,outputTokens:y.completionTokens,totalTokens:y.totalTokens,estimatedCostUsd:0}),{content:h,model:r===q?"codex-default":r,provider:"codex",usage:y,cost:{inputCost:0,outputCost:0,totalCost:0,currency:"USD",source:"provider-receipt"},latencyMs:p,finishReason:"stop",cached:!1,requestId:o}}finally{ot(n,{recursive:!0,force:!0})}}async embed(t,e){throw a("Codex provider does not support embeddings. Use openai, ollama, or cognitum.","MODEL_NOT_FOUND",{provider:"codex",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256});return{completion:r.content,model:r.model,provider:"codex",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return[q,"gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.6-sol","gpt-5.3-codex"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}flatten(t,e){if(typeof t=="string")return{prompt:e?`${e}
27
27
 
28
28
  ${t}`:t};let r=t.filter(n=>n.role==="system").map(n=>n.content);e&&r.unshift(e);let o=t.filter(n=>n.role!=="system").map(n=>`${n.role==="assistant"?"Assistant":"User"}: ${n.content}`).join(`
29
29
 
@@ -31,24 +31,24 @@ ${t}`:t};let r=t.filter(n=>n.role==="system").map(n=>n.content);e&&r.unshift(e);
31
31
 
32
32
  `)}
33
33
 
34
- `:""}${o}`}}classifyError(t,e){let r=t.toLowerCase();return r.includes("rate limit")||r.includes("usage limit")||r.includes("429")||r.includes("quota")?a(t,"RATE_LIMITED",{provider:"codex",model:e,retryable:!0,retryAfterMs:6e4}):a(t,"PROVIDER_UNAVAILABLE",{provider:"codex",model:e,retryable:!0})}static childEnv(t=process.env){let e={...t};for(let r of ot)delete e[r];return e}runProcess(t,e,r,o){return new Promise((s,n)=>{let i=Qe(this.config.binaryPath??"codex",t,{env:g.childEnv(),stdio:["pipe","pipe","pipe"]}),l="",p="",m=!1,c=setTimeout(()=>{m||(m=!0,i.kill("SIGKILL"),n(a("codex exec timed out","TIMEOUT",{provider:"codex",retryable:!0})))},o);i.stdout.on("data",u=>l+=u.toString()),i.stderr.on("data",u=>p+=u.toString()),i.on("error",u=>{m||(m=!0,clearTimeout(c),n(a(`Failed to spawn codex: ${u.message}`,"PROVIDER_UNAVAILABLE",{provider:"codex",retryable:!1,cause:u})))}),i.on("close",u=>{m||(m=!0,clearTimeout(c),s({code:u??0,stdout:l,stderr:p}))}),i.stdin.on("error",()=>{});try{e!==void 0&&i.stdin.write(e),i.stdin.end()}catch{}})}async withConcurrency(t){let e=this.config.maxConcurrency??2;this.active>=e&&await new Promise(r=>this.queue.push(r)),this.active++;try{return await t()}finally{this.active--;let r=this.queue.shift();r&&r()}}};L();var nt={model:"cognitum-auto",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},X=class{type="cognitum";name="Cognitum";billingMode="metered-capped";config;requestId=0;constructor(t={}){this.config={...nt,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set COGNITUM_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/models`,{method:"GET",headers:this.getHeaders()},5e3),o=Date.now()-e;return r.ok?{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{billing:"metered-capped",baseUrl:this.getBaseUrl()}}:{healthy:!1,latencyMs:o,error:`API error: ${r.status}`}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("Cognitum API key not configured","API_KEY_MISSING",{provider:"cognitum",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`cognitum-${++this.requestId}-${Date.now()}`,p=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o};e?.stopSequences?.length&&(m.stop=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-p;if(!c.ok)throw await this.toApiError(c,s);let d=await c.json(),h=d.x_cognitum,f={promptTokens:d.usage.prompt_tokens,completionTokens:d.usage.completion_tokens,totalTokens:d.usage.total_tokens,cacheReadTokens:d.usage.cache_read_tokens??0},b=this.receiptCost(h);return v.recordTokenUsage(l,"cognitum-provider","llm","generate",{inputTokens:f.promptTokens,outputTokens:f.completionTokens,totalTokens:f.totalTokens,estimatedCostUsd:b.totalCost}),{content:d.choices[0]?.message?.content??"",model:h?.resolved_model??d.model,provider:"cognitum",usage:f,cost:b,latencyMs:u,finishReason:this.mapFinishReason(d.choices[0]?.finish_reason),cached:h?.cache==="hit",requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"cognitum",model:s,retryable:!0,cause:c})}}async embed(t,e){if(!this.getApiKey())throw a("Cognitum API key not configured","API_KEY_MISSING",{provider:"cognitum",retryable:!1});let o=e?.model??"cognitum-embed",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok)throw await this.toApiError(n,o);let l=await n.json();return{embedding:l.data[0].embedding,model:l.x_cognitum?.resolved_model??l.model,provider:"cognitum",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"cognitum",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences});return{completion:r.content,model:r.model,provider:"cognitum",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["cognitum-auto","cognitum-low","cognitum-mid","cognitum-high"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}async getRemoteBudget(){try{let t=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/usage`,{method:"GET",headers:this.getHeaders()},5e3);if(!t.ok)return;let r=(await t.json()).budget;return r?{servingBudgetUsd:r.servingBudgetUsd??0,hardCapUsd:r.hardCapUsd??0,committedUsd:r.committedUsd??0,headroomUsd:r.headroomUsd??0,status:r.status??"unknown",headroomExhausted:r.headroomExhausted??!1}:void 0}catch{return}}receiptCost(t){return{inputCost:0,outputCost:0,totalCost:t?.price_usd??0,currency:"USD",source:t?.price_usd!==void 0?"provider-receipt":"local-estimate"}}getApiKey(){return this.config.apiKey??process.env.COGNITUM_API_KEY}getBaseUrl(){return(this.config.baseUrl??process.env.COGNITUM_BASE_URL??"https://api.cognitum.one").replace(/\/$/,"")}getHeaders(){return{"Content-Type":"application/json","X-API-Key":this.getApiKey()}}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}async toApiError(t,e){let r=await t.text().catch(()=>""),o=r;try{o=JSON.parse(r).error??r}catch{}switch(t.status){case 401:case 403:return a(o||"Unauthorized","API_KEY_INVALID",{provider:"cognitum",model:e,retryable:!1});case 402:return a(o||"Budget cap reached","COST_LIMIT_EXCEEDED",{provider:"cognitum",model:e,retryable:!1});case 429:return a(o||"Rate limited","RATE_LIMITED",{provider:"cognitum",model:e,retryable:!0,retryAfterMs:6e4});case 500:case 502:case 503:return a(o||"Provider unavailable","PROVIDER_UNAVAILABLE",{provider:"cognitum",model:e,retryable:!0,retryAfterMs:5e3});default:return a(o||`HTTP ${t.status}`,"UNKNOWN",{provider:"cognitum",model:e,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"cognitum",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){await this.sleep(T(n));continue}return i}catch(i){s=E(i),n<o-1&&await this.sleep(T(n))}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};S();ge();L();var ut={model:"gpt-6-sol",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},Q=class{type="openai";name="OpenAI";config;requestId=0;constructor(t={}){this.config={...ut,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set OPENAI_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(U({model:this.config.model,messages:[{role:"user",content:"Hi"}]},this.config.model,{maxTokens:1}))},5e3),o=Date.now()-e;if(!r.ok){let s=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${s}`}}return{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{defaultModel:this.config.model,organization:this.config.organization}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("OpenAI API key not configured","API_KEY_MISSING",{provider:"openai",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openai-${++this.requestId}-${Date.now()}`,p=Date.now(),m=U({model:s,messages:o},s,{maxTokens:n,temperature:i});e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences),this.config.presencePenalty!==void 0&&(m.presence_penalty=this.config.presencePenalty),this.config.frequencyPenalty!==void 0&&(m.frequency_penalty=this.config.frequencyPenalty);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-p;if(!c.ok){let y=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,y,s)}let d=await c.json(),h={promptTokens:d.usage.prompt_tokens,completionTokens:d.usage.completion_tokens,totalTokens:d.usage.total_tokens},f=_.calculateCost(s,h);return v.recordTokenUsage(l,"openai-provider","llm","generate",{inputTokens:d.usage.prompt_tokens,outputTokens:d.usage.completion_tokens,totalTokens:d.usage.total_tokens,estimatedCostUsd:f.totalCost}),{content:d.choices[0]?.message?.content??"",model:d.model,provider:"openai",usage:h,cost:f,latencyMs:u,finishReason:this.mapFinishReason(d.choices[0]?.finish_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"openai",model:s,retryable:!0,cause:c})}}async embed(t,e){if(!this.getApiKey())throw a("OpenAI API key not configured","API_KEY_MISSING",{provider:"openai",retryable:!1});let o=e?.model??"text-embedding-3-small",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let p=await n.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(n.status,p,o)}let l=await n.json();return{embedding:l.data[0].embedding,model:l.model,provider:"openai",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"openai",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
34
+ `:""}${o}`}}classifyError(t,e){let r=t.toLowerCase();return r.includes("rate limit")||r.includes("usage limit")||r.includes("429")||r.includes("quota")?a(t,"RATE_LIMITED",{provider:"codex",model:e,retryable:!0,retryAfterMs:6e4}):a(t,"PROVIDER_UNAVAILABLE",{provider:"codex",model:e,retryable:!0})}static childEnv(t=process.env){let e={...t};for(let r of nt)delete e[r];return e}runProcess(t,e,r,o){return new Promise((s,n)=>{let i=et(this.config.binaryPath??"codex",t,{env:g.childEnv(),stdio:["pipe","pipe","pipe"]}),l="",d="",m=!1,c=setTimeout(()=>{m||(m=!0,i.kill("SIGKILL"),n(a("codex exec timed out","TIMEOUT",{provider:"codex",retryable:!0})))},o);i.stdout.on("data",u=>l+=u.toString()),i.stderr.on("data",u=>d+=u.toString()),i.on("error",u=>{m||(m=!0,clearTimeout(c),n(a(`Failed to spawn codex: ${u.message}`,"PROVIDER_UNAVAILABLE",{provider:"codex",retryable:!1,cause:u})))}),i.on("close",u=>{m||(m=!0,clearTimeout(c),s({code:u??0,stdout:l,stderr:d}))}),i.stdin.on("error",()=>{});try{e!==void 0&&i.stdin.write(e),i.stdin.end()}catch{}})}async withConcurrency(t){let e=this.config.maxConcurrency??2;this.active>=e&&await new Promise(r=>this.queue.push(r)),this.active++;try{return await t()}finally{this.active--;let r=this.queue.shift();r&&r()}}};L();var at={model:"cognitum-auto",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},Q=class{type="cognitum";name="Cognitum";billingMode="metered-capped";config;requestId=0;constructor(t={}){this.config={...at,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set COGNITUM_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/models`,{method:"GET",headers:this.getHeaders()},5e3),o=Date.now()-e;return r.ok?{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{billing:"metered-capped",baseUrl:this.getBaseUrl()}}:{healthy:!1,latencyMs:o,error:`API error: ${r.status}`}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("Cognitum API key not configured","API_KEY_MISSING",{provider:"cognitum",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`cognitum-${++this.requestId}-${Date.now()}`,d=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o};e?.stopSequences?.length&&(m.stop=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-d;if(!c.ok)throw await this.toApiError(c,s);let p=await c.json(),h=p.x_cognitum,f={promptTokens:p.usage.prompt_tokens,completionTokens:p.usage.completion_tokens,totalTokens:p.usage.total_tokens,cacheReadTokens:p.usage.cache_read_tokens??0},b=this.receiptCost(h);return T.recordTokenUsage(l,"cognitum-provider","llm","generate",{inputTokens:f.promptTokens,outputTokens:f.completionTokens,totalTokens:f.totalTokens,estimatedCostUsd:b.totalCost}),{content:p.choices[0]?.message?.content??"",model:h?.resolved_model??p.model,provider:"cognitum",usage:f,cost:b,latencyMs:u,finishReason:this.mapFinishReason(p.choices[0]?.finish_reason),cached:h?.cache==="hit",requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"cognitum",model:s,retryable:!0,cause:c})}}async embed(t,e){if(!this.getApiKey())throw a("Cognitum API key not configured","API_KEY_MISSING",{provider:"cognitum",retryable:!1});let o=e?.model??"cognitum-embed",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok)throw await this.toApiError(n,o);let l=await n.json();return{embedding:l.data[0].embedding,model:l.x_cognitum?.resolved_model??l.model,provider:"cognitum",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"cognitum",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences});return{completion:r.content,model:r.model,provider:"cognitum",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["cognitum-auto","cognitum-low","cognitum-mid","cognitum-high"]}getCostPerToken(){return{input:0,output:0}}async dispose(){}async getRemoteBudget(){try{let t=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/usage`,{method:"GET",headers:this.getHeaders()},5e3);if(!t.ok)return;let r=(await t.json()).budget;return r?{servingBudgetUsd:r.servingBudgetUsd??0,hardCapUsd:r.hardCapUsd??0,committedUsd:r.committedUsd??0,headroomUsd:r.headroomUsd??0,status:r.status??"unknown",headroomExhausted:r.headroomExhausted??!1}:void 0}catch{return}}receiptCost(t){return{inputCost:0,outputCost:0,totalCost:t?.price_usd??0,currency:"USD",source:t?.price_usd!==void 0?"provider-receipt":"local-estimate"}}getApiKey(){return this.config.apiKey??process.env.COGNITUM_API_KEY}getBaseUrl(){return(this.config.baseUrl??process.env.COGNITUM_BASE_URL??"https://api.cognitum.one").replace(/\/$/,"")}getHeaders(){return{"Content-Type":"application/json","X-API-Key":this.getApiKey()}}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}async toApiError(t,e){let r=await t.text().catch(()=>""),o=r;try{o=JSON.parse(r).error??r}catch{}switch(t.status){case 401:case 403:return a(o||"Unauthorized","API_KEY_INVALID",{provider:"cognitum",model:e,retryable:!1});case 402:return a(o||"Budget cap reached","COST_LIMIT_EXCEEDED",{provider:"cognitum",model:e,retryable:!1});case 429:return a(o||"Rate limited","RATE_LIMITED",{provider:"cognitum",model:e,retryable:!0,retryAfterMs:6e4});case 500:case 502:case 503:return a(o||"Provider unavailable","PROVIDER_UNAVAILABLE",{provider:"cognitum",model:e,retryable:!0,retryAfterMs:5e3});default:return a(o||`HTTP ${t.status}`,"UNKNOWN",{provider:"cognitum",model:e,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"cognitum",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){await this.sleep(k(n));continue}return i}catch(i){s=E(i),n<o-1&&await this.sleep(k(n))}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};I();fe();L();var dt={model:"gpt-6-sol",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},Z=class{type="openai";name="OpenAI";config;requestId=0;constructor(t={}){this.config={...dt,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set OPENAI_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(N({model:this.config.model,messages:[{role:"user",content:"Hi"}]},this.config.model,{maxTokens:1}))},5e3),o=Date.now()-e;if(!r.ok){let s=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${s}`}}return{healthy:!0,latencyMs:o,models:this.getSupportedModels(),details:{defaultModel:this.config.model,organization:this.config.organization}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("OpenAI API key not configured","API_KEY_MISSING",{provider:"openai",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openai-${++this.requestId}-${Date.now()}`,d=Date.now(),m=N({model:s,messages:o},s,{maxTokens:n,temperature:i});e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences),this.config.presencePenalty!==void 0&&(m.presence_penalty=this.config.presencePenalty),this.config.frequencyPenalty!==void 0&&(m.frequency_penalty=this.config.frequencyPenalty);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/v1/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-d;if(!c.ok){let y=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,y,s)}let p=await c.json(),h={promptTokens:p.usage.prompt_tokens,completionTokens:p.usage.completion_tokens,totalTokens:p.usage.total_tokens},f=_.calculateCost(s,h);return T.recordTokenUsage(l,"openai-provider","llm","generate",{inputTokens:p.usage.prompt_tokens,outputTokens:p.usage.completion_tokens,totalTokens:p.usage.total_tokens,estimatedCostUsd:f.totalCost}),{content:p.choices[0]?.message?.content??"",model:p.model,provider:"openai",usage:h,cost:f,latencyMs:u,finishReason:this.mapFinishReason(p.choices[0]?.finish_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"openai",model:s,retryable:!0,cause:c})}}async embed(t,e){if(!this.getApiKey())throw a("OpenAI API key not configured","API_KEY_MISSING",{provider:"openai",retryable:!1});let o=e?.model??"text-embedding-3-small",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/v1/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let d=await n.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(n.status,d,o)}let l=await n.json();return{embedding:l.data[0].embedding,model:l.model,provider:"openai",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"openai",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
35
35
 
36
- `]});return{completion:r.content,model:r.model,provider:"openai",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.6-sol","gpt-5.6-luna","gpt-5.4-mini"]}getCostPerToken(){return _.getCostPerToken(this.config.model)}async dispose(){}getApiKey(){return this.config.apiKey??process.env.OPENAI_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://api.openai.com").replace(/\/$/,"")}getHeaders(){let t={"Content-Type":"application/json",Authorization:`Bearer ${this.getApiKey()}`};return this.config.organization&&(t["OpenAI-Organization"]=this.config.organization),t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.type??"",n=e.error?.code??"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"openai",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"openai",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw n==="context_length_exceeded"||s==="invalid_request_error"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"openai",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"openai",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"openai",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"openai",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"openai",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};S();Ke();var D={DEFAULT_TOK_PER_SEC:15,SAFETY_FACTOR:2.5,LOAD_OVERHEAD_MS:15e3,FLOOR_MS:3e4,CEIL_MS:6e5};function Ie(g,t=D.DEFAULT_TOK_PER_SEC){let e=t>0?t:D.DEFAULT_TOK_PER_SEC,o=Math.max(0,g)/e*1e3*D.SAFETY_FACTOR+D.LOAD_OVERHEAD_MS;return Math.min(D.CEIL_MS,Math.max(D.FLOOR_MS,Math.round(o)))}var Se={model:"qwen3-coder:30b",baseUrl:le("http://localhost:11434"),maxTokens:4096,temperature:.7,timeoutMs:12e4,maxRetries:2,contextLength:4096,keepAlive:"5m",enableCache:!0,enableCircuitBreaker:!0},Z=class{type="ollama";name="Ollama (Local)";config;requestId=0;availableModels=[];installedTags=[];observedTokPerSec=new Map;constructor(t={}){this.config={...Se,...t}}timeoutFor(t,e){let r=this.config.timeoutMs;return r&&r!==Se.timeoutMs?r:Ie(e,this.observedTokPerSec.get(t))}recordThroughput(t,e,r){if(!e||!r||r<=0)return;let o=e/(r/1e9);if(!Number.isFinite(o)||o<=0)return;let s=this.observedTokPerSec.get(t);this.observedTokPerSec.set(t,s?s*.5+o*.5:o)}async isAvailable(){try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=Date.now();try{let e=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}},5e3),r=Date.now()-t;if(!e.ok)return{healthy:!1,latencyMs:r,error:`Ollama server returned ${e.status}`};let o=await e.json();this.installedTags=o.models?.map(i=>i.name)??[],this.availableModels=this.installedTags.map(i=>i.split(":")[0]);let s=this.config.model;return!(s.includes(":")?this.installedTags.includes(s):this.availableModels.includes(s))&&this.availableModels.length>0?{healthy:!0,latencyMs:r,models:this.availableModels,details:{warning:`Configured model '${this.config.model}' not found. Available: ${this.availableModels.join(", ")}`,defaultModel:this.config.model}}:{healthy:!0,latencyMs:r,models:this.availableModels,details:{defaultModel:this.config.model,modelCount:this.availableModels.length}}}catch(e){return{healthy:!1,error:`Ollama not running. Start with: ollama serve. Error: ${e instanceof Error?e.message:"Unknown"}`}}}async generate(t,e){let r=e?.model??this.config.model,o=e?.maxTokens??this.config.maxTokens??4096,s=e?.temperature??this.config.temperature??.7,n=`ollama-${++this.requestId}-${Date.now()}`,i=Date.now(),l=Array.isArray(t);try{let p,m,c,u;if(l){let b=this.formatMessages(t,e?.systemPrompt);if(p=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,messages:b,stream:!1,options:{temperature:s,num_predict:o,stop:e?.stopSequences}})},e?.timeoutMs??this.timeoutFor(r,o)),!p.ok)throw await this.handleApiError(p,r);let y=await p.json();m=y.message.content,this.recordThroughput(r,y.eval_count,y.eval_duration),c=y.prompt_eval_count??this.estimateTokens(JSON.stringify(b)),u=y.eval_count??this.estimateTokens(m)}else{let b=e?.systemPrompt?`${e.systemPrompt}
36
+ `]});return{completion:r.content,model:r.model,provider:"openai",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.6-sol","gpt-5.6-luna","gpt-5.4-mini"]}getCostPerToken(){return _.getCostPerToken(this.config.model)}async dispose(){}getApiKey(){return this.config.apiKey??process.env.OPENAI_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://api.openai.com").replace(/\/$/,"")}getHeaders(){let t={"Content-Type":"application/json",Authorization:`Bearer ${this.getApiKey()}`};return this.config.organization&&(t["OpenAI-Organization"]=this.config.organization),t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.type??"",n=e.error?.code??"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"openai",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"openai",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw n==="context_length_exceeded"||s==="invalid_request_error"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"openai",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"openai",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"openai",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"openai",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"openai",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};I();qe();var U={DEFAULT_TOK_PER_SEC:15,SAFETY_FACTOR:2.5,LOAD_OVERHEAD_MS:15e3,FLOOR_MS:3e4,CEIL_MS:6e5};function Se(g,t=U.DEFAULT_TOK_PER_SEC){let e=t>0?t:U.DEFAULT_TOK_PER_SEC,o=Math.max(0,g)/e*1e3*U.SAFETY_FACTOR+U.LOAD_OVERHEAD_MS;return Math.min(U.CEIL_MS,Math.max(U.FLOOR_MS,Math.round(o)))}var xe={model:"qwen3-coder:30b",baseUrl:ue("http://localhost:11434"),maxTokens:4096,temperature:.7,timeoutMs:12e4,maxRetries:2,contextLength:4096,keepAlive:"5m",enableCache:!0,enableCircuitBreaker:!0},ee=class{type="ollama";name="Ollama (Local)";config;requestId=0;availableModels=[];installedTags=[];observedTokPerSec=new Map;constructor(t={}){this.config={...xe,...t}}timeoutFor(t,e){let r=this.config.timeoutMs;return r&&r!==xe.timeoutMs?r:Se(e,this.observedTokPerSec.get(t))}recordThroughput(t,e,r){if(!e||!r||r<=0)return;let o=e/(r/1e9);if(!Number.isFinite(o)||o<=0)return;let s=this.observedTokPerSec.get(t);this.observedTokPerSec.set(t,s?s*.5+o*.5:o)}async isAvailable(){try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=Date.now();try{let e=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}},5e3),r=Date.now()-t;if(!e.ok)return{healthy:!1,latencyMs:r,error:`Ollama server returned ${e.status}`};let o=await e.json();this.installedTags=o.models?.map(i=>i.name)??[],this.availableModels=this.installedTags.map(i=>i.split(":")[0]);let s=this.config.model;return!(s.includes(":")?this.installedTags.includes(s):this.availableModels.includes(s))&&this.availableModels.length>0?{healthy:!0,latencyMs:r,models:this.availableModels,details:{warning:`Configured model '${this.config.model}' not found. Available: ${this.availableModels.join(", ")}`,defaultModel:this.config.model}}:{healthy:!0,latencyMs:r,models:this.availableModels,details:{defaultModel:this.config.model,modelCount:this.availableModels.length}}}catch(e){return{healthy:!1,error:`Ollama not running. Start with: ollama serve. Error: ${e instanceof Error?e.message:"Unknown"}`}}}async generate(t,e){let r=e?.model??this.config.model,o=e?.maxTokens??this.config.maxTokens??4096,s=e?.temperature??this.config.temperature??.7,n=`ollama-${++this.requestId}-${Date.now()}`,i=Date.now(),l=Array.isArray(t);try{let d,m,c,u;if(l){let b=this.formatMessages(t,e?.systemPrompt);if(d=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/chat`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,messages:b,stream:!1,options:{temperature:s,num_predict:o,stop:e?.stopSequences}})},e?.timeoutMs??this.timeoutFor(r,o)),!d.ok)throw await this.handleApiError(d,r);let y=await d.json();m=y.message.content,this.recordThroughput(r,y.eval_count,y.eval_duration),c=y.prompt_eval_count??this.estimateTokens(JSON.stringify(b)),u=y.eval_count??this.estimateTokens(m)}else{let b=e?.systemPrompt?`${e.systemPrompt}
37
37
 
38
- ${t}`:t;if(p=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:b,stream:!1,options:{temperature:s,num_predict:o,stop:e?.stopSequences}})},e?.timeoutMs??this.timeoutFor(r,o)),!p.ok)throw await this.handleApiError(p,r);let y=await p.json();m=y.response,this.recordThroughput(r,y.eval_count,y.eval_duration),c=y.prompt_eval_count??this.estimateTokens(b),u=y.eval_count??this.estimateTokens(m)}let d=Date.now()-i,h={promptTokens:c,completionTokens:u,totalTokens:c+u},f=_.calculateCost(r,h);return v.recordTokenUsage(n,"ollama-provider","llm","generate",{inputTokens:c,outputTokens:u,totalTokens:c+u,estimatedCostUsd:f.totalCost}),{content:m,model:r,provider:"ollama",usage:h,cost:f,latencyMs:d,finishReason:"stop",cached:!1,requestId:n}}catch(p){throw p instanceof Error&&"code"in p?p:a(p instanceof Error?p.message:"Request failed","NETWORK_ERROR",{provider:"ollama",model:r,retryable:!0,cause:p})}}async embed(t,e){let r=e?.model??"all-MiniLM-L6-v2",o=Date.now();try{let s=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/embeddings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:t})},e?.timeoutMs??3e4),n=Date.now()-o;if(!s.ok)throw await this.handleApiError(s,r);return{embedding:(await s.json()).embedding,model:r,provider:"ollama",tokenCount:this.estimateTokens(t),latencyMs:n,cached:!1}}catch(s){throw s instanceof Error&&"code"in s?s:a(s instanceof Error?s.message:"Embedding request failed","NETWORK_ERROR",{provider:"ollama",model:r,retryable:!0,cause:s})}}async complete(t,e){let r=e?.model??this.selectCodeModel(),o=await this.generate(t,{model:r,temperature:e?.temperature??.1,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
38
+ ${t}`:t;if(d=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:b,stream:!1,options:{temperature:s,num_predict:o,stop:e?.stopSequences}})},e?.timeoutMs??this.timeoutFor(r,o)),!d.ok)throw await this.handleApiError(d,r);let y=await d.json();m=y.response,this.recordThroughput(r,y.eval_count,y.eval_duration),c=y.prompt_eval_count??this.estimateTokens(b),u=y.eval_count??this.estimateTokens(m)}let p=Date.now()-i,h={promptTokens:c,completionTokens:u,totalTokens:c+u},f=_.calculateCost(r,h);return T.recordTokenUsage(n,"ollama-provider","llm","generate",{inputTokens:c,outputTokens:u,totalTokens:c+u,estimatedCostUsd:f.totalCost}),{content:m,model:r,provider:"ollama",usage:h,cost:f,latencyMs:p,finishReason:"stop",cached:!1,requestId:n}}catch(d){throw d instanceof Error&&"code"in d?d:a(d instanceof Error?d.message:"Request failed","NETWORK_ERROR",{provider:"ollama",model:r,retryable:!0,cause:d})}}async embed(t,e){let r=e?.model??"all-MiniLM-L6-v2",o=Date.now();try{let s=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/embeddings`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:r,prompt:t})},e?.timeoutMs??3e4),n=Date.now()-o;if(!s.ok)throw await this.handleApiError(s,r);return{embedding:(await s.json()).embedding,model:r,provider:"ollama",tokenCount:this.estimateTokens(t),latencyMs:n,cached:!1}}catch(s){throw s instanceof Error&&"code"in s?s:a(s instanceof Error?s.message:"Embedding request failed","NETWORK_ERROR",{provider:"ollama",model:r,retryable:!0,cause:s})}}async complete(t,e){let r=e?.model??this.selectCodeModel(),o=await this.generate(t,{model:r,temperature:e?.temperature??.1,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
39
39
 
40
- `,"```","// ","# "]});return{completion:o.content,model:o.model,provider:"ollama",usage:o.usage,latencyMs:o.latencyMs,cached:o.cached}}getConfig(){return{...this.config}}getSupportedModels(){let t=["qwen3-coder:30b","qwen3:30b-a3b","gpt-oss:20b","gpt-oss:120b","llama4:scout","gemma4","nomic-embed-text"],e=new Set([...t,...this.availableModels]);return Array.from(e)}getCostPerToken(){return{input:0,output:0}}async dispose(){}async pullModel(t){try{let e=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/pull`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,stream:!1})},6e5);if(!e.ok){let r=await e.text();throw new Error(`Failed to pull model: ${r}`)}}catch(e){throw a(`Failed to pull model ${t}: ${e instanceof Error?e.message:"Unknown"}`,"MODEL_NOT_FOUND",{provider:"ollama",model:t,retryable:!0})}}getBaseUrl(){return(this.config.baseUrl??le()).replace(/\/$/,"")}formatMessages(t,e){let r=[];e&&r.push({role:"system",content:e});for(let o of t)r.push({role:o.role,content:o.content});return r}selectCodeModel(){let t=["qwen3-coder","gpt-oss","qwen3:30b-a3b","codellama"];for(let e of t){let r=this.installedTags.find(o=>o===e||o.startsWith(e));if(r)return r}return this.config.model}estimateTokens(t){return Math.ceil(t.length/4)}async handleApiError(t,e){let r=await t.text().catch(()=>"Unknown error");throw t.status===404?a(`Model '${e}' not found. Pull it with: ollama pull ${e}`,"MODEL_NOT_FOUND",{provider:"ollama",model:e,retryable:!1}):t.status===500?a(`Ollama server error: ${r}`,"PROVIDER_UNAVAILABLE",{provider:"ollama",model:e,retryable:!0,retryAfterMs:1e3}):a(`Ollama API error (${t.status}): ${r}`,"UNKNOWN",{provider:"ollama",model:e,retryable:!1})}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"ollama",retryable:!0}):n}finally{clearTimeout(s)}}};L();ye();S();var pt={model:"anthropic/claude-sonnet-5",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,baseUrl:"https://openrouter.ai/api/v1",allowFallback:!1},xe={"anthropic/claude-sonnet-5":{input:2,output:10},"anthropic/claude-opus-5":{input:5,output:25},"anthropic/claude-opus-5.5":{input:4,output:20},"anthropic/claude-haiku-4.5":{input:1,output:5},"openai/gpt-6-astra":{input:10,output:50},"openai/gpt-6-sol":{input:2,output:10},"openai/gpt-6-luna":{input:.1,output:.5},"openai/gpt-oss-120b":{input:.15,output:.6},"google/gemini-3.8-flash":{input:.75,output:3.75},"google/gemini-3.5-flash":{input:1.5,output:9},"google/gemini-3.5-flash-lite":{input:.3,output:2.5},"google/gemini-3.1-pro-preview":{input:2,output:12},"google/gemini-2.5-pro":{input:1.25,output:10},"google/gemini-2.5-flash":{input:.3,output:2.5},"meta-llama/llama-4-maverick":{input:.1875,output:.6525},"meta-llama/llama-4-scout":{input:.1,output:.3},"mistralai/mistral-large-2512":{input:.5,output:1.5},"deepseek/deepseek-v4-pro":{input:.348,output:.696},"deepseek/deepseek-v4.1-flash":{input:.035,output:.29},"qwen/qwen3-coder":{input:.3,output:1},"openai/gpt-oss-20b":{input:.018,output:.09},"anthropic/claude-3.5-sonnet":{input:3,output:15},"anthropic/claude-3.5-sonnet:beta":{input:3,output:15},"anthropic/claude-3-opus":{input:15,output:75},"anthropic/claude-3-sonnet":{input:3,output:15},"anthropic/claude-3-haiku":{input:.25,output:1.25},"openai/gpt-4o":{input:5,output:15},"openai/gpt-4o-mini":{input:.15,output:.6},"openai/gpt-4-turbo":{input:10,output:30},"openai/gpt-3.5-turbo":{input:.5,output:1.5},"google/gemini-pro":{input:.125,output:.375},"google/gemini-pro-1.5":{input:3.5,output:10.5},"meta-llama/llama-3.1-70b-instruct":{input:.59,output:.79},"meta-llama/llama-3.1-8b-instruct":{input:.06,output:.06},"mistralai/mistral-large":{input:2,output:6},"mistralai/mixtral-8x7b-instruct":{input:.24,output:.24},"mistralai/mistral-7b-instruct":{input:.06,output:.06},default:{input:1,output:3}};function Ne(g){return xe[g]??Te(g)??xe.default}var ee=class{type="openrouter";name="OpenRouter";config;requestId=0;cachedModels=null;constructor(t={}){this.config={...pt,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set OPENROUTER_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/models`,{method:"GET",headers:this.getHeaders()},5e3),o=Date.now()-e;if(!r.ok){let i=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${i}`}}let n=(await r.json()).data?.map(i=>i.id)||[];return this.cachedModels=n,{healthy:!0,latencyMs:o,models:n.slice(0,20),details:{totalModels:n.length,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openrouter-${++this.requestId}-${Date.now()}`,p=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o};e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences),this.config.allowFallback!==void 0&&(m.route=this.config.allowFallback?"fallback":void 0),this.config.forceProvider&&(m.provider={order:[this.config.forceProvider]});try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-p;if(!c.ok){let y=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,y,s)}let d=await c.json(),h={promptTokens:d.usage?.prompt_tokens??0,completionTokens:d.usage?.completion_tokens??0,totalTokens:d.usage?.total_tokens??0},f=this.calculateCost(s,h);return v.recordTokenUsage(l,"openrouter-provider","llm","generate",{inputTokens:h.promptTokens,outputTokens:h.completionTokens,totalTokens:h.totalTokens,estimatedCostUsd:f.totalCost}),{content:d.choices[0]?.message?.content??"",model:d.model,provider:"openrouter",usage:h,cost:f,latencyMs:u,finishReason:this.mapFinishReason(d.choices[0]?.finish_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"openrouter",model:s,retryable:!0,cause:c})}}async*generateStream(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openrouter-stream-${++this.requestId}-${Date.now()}`,p=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o,stream:!0};e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences);let c=await this.fetchWithTimeout(`${this.getBaseUrl()}/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4);if(!c.ok){let w=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,w,s)}if(!c.body)throw a("No response body for streaming","NETWORK_ERROR",{provider:"openrouter",model:s,retryable:!0});let u="",d="stop",h=s,f=c.body.getReader(),b=new TextDecoder,y="";try{for(;;){let{done:w,value:ne}=await f.read();if(w)break;y+=b.decode(ne,{stream:!0});let N=y.split(`
41
- `);y=N.pop()||"";for(let M of N){let P=M.trim();if(!(!P||P==="data: [DONE]")&&P.startsWith("data: "))try{let I=B(P.slice(6)),ie=I.choices[0]?.delta;ie?.content&&(u+=ie.content,yield ie.content),I.choices[0]?.finish_reason&&(d=this.mapFinishReason(I.choices[0].finish_reason)),I.model&&(h=I.model)}catch{}}}}finally{f.releaseLock()}let C=Date.now()-p,k=Math.ceil(JSON.stringify(o).length/4),O=Math.ceil(u.length/4),R={promptTokens:k,completionTokens:O,totalTokens:k+O},x=this.calculateCost(s,R);return v.recordTokenUsage(l,"openrouter-provider","llm","generate-stream",{inputTokens:R.promptTokens,outputTokens:R.completionTokens,totalTokens:R.totalTokens,estimatedCostUsd:x.totalCost}),{content:u,model:h,provider:"openrouter",usage:R,cost:x,latencyMs:C,finishReason:d,cached:!1,requestId:l}}async embed(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=e?.model??"openai/text-embedding-3-small",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let p=await n.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(n.status,p,o)}let l=await n.json();return{embedding:l.data[0].embedding,model:l.model,provider:"openrouter",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"openrouter",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
40
+ `,"```","// ","# "]});return{completion:o.content,model:o.model,provider:"ollama",usage:o.usage,latencyMs:o.latencyMs,cached:o.cached}}getConfig(){return{...this.config}}getSupportedModels(){let t=["qwen3-coder:30b","qwen3:30b-a3b","gpt-oss:20b","gpt-oss:120b","llama4:scout","gemma4","nomic-embed-text"],e=new Set([...t,...this.availableModels]);return Array.from(e)}getCostPerToken(){return{input:0,output:0}}async dispose(){}async pullModel(t){try{let e=await this.fetchWithTimeout(`${this.getBaseUrl()}/api/pull`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,stream:!1})},6e5);if(!e.ok){let r=await e.text();throw new Error(`Failed to pull model: ${r}`)}}catch(e){throw a(`Failed to pull model ${t}: ${e instanceof Error?e.message:"Unknown"}`,"MODEL_NOT_FOUND",{provider:"ollama",model:t,retryable:!0})}}getBaseUrl(){return(this.config.baseUrl??ue()).replace(/\/$/,"")}formatMessages(t,e){let r=[];e&&r.push({role:"system",content:e});for(let o of t)r.push({role:o.role,content:o.content});return r}selectCodeModel(){let t=["qwen3-coder","gpt-oss","qwen3:30b-a3b","codellama"];for(let e of t){let r=this.installedTags.find(o=>o===e||o.startsWith(e));if(r)return r}return this.config.model}estimateTokens(t){return Math.ceil(t.length/4)}async handleApiError(t,e){let r=await t.text().catch(()=>"Unknown error");throw t.status===404?a(`Model '${e}' not found. Pull it with: ollama pull ${e}`,"MODEL_NOT_FOUND",{provider:"ollama",model:e,retryable:!1}):t.status===500?a(`Ollama server error: ${r}`,"PROVIDER_UNAVAILABLE",{provider:"ollama",model:e,retryable:!0,retryAfterMs:1e3}):a(`Ollama API error (${t.status}): ${r}`,"UNKNOWN",{provider:"ollama",model:e,retryable:!1})}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"ollama",retryable:!0}):n}finally{clearTimeout(s)}}};L();be();I();var mt={model:"anthropic/claude-sonnet-5",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,baseUrl:"https://openrouter.ai/api/v1",allowFallback:!1},Ne={"anthropic/claude-sonnet-5":{input:2,output:10},"anthropic/claude-opus-5":{input:5,output:25},"anthropic/claude-opus-5.5":{input:4,output:20},"anthropic/claude-haiku-4.5":{input:1,output:5},"openai/gpt-6-astra":{input:10,output:50},"openai/gpt-6-sol":{input:2,output:10},"openai/gpt-6-luna":{input:.1,output:.5},"openai/gpt-oss-120b":{input:.15,output:.6},"google/gemini-3.8-flash":{input:.75,output:3.75},"google/gemini-3.5-flash":{input:1.5,output:9},"google/gemini-3.5-flash-lite":{input:.3,output:2.5},"google/gemini-3.1-pro-preview":{input:2,output:12},"google/gemini-2.5-pro":{input:1.25,output:10},"google/gemini-2.5-flash":{input:.3,output:2.5},"meta-llama/llama-4-maverick":{input:.1875,output:.6525},"meta-llama/llama-4-scout":{input:.1,output:.3},"mistralai/mistral-large-2512":{input:.5,output:1.5},"deepseek/deepseek-v4-pro":{input:.348,output:.696},"deepseek/deepseek-v4.1-flash":{input:.035,output:.29},"qwen/qwen3-coder":{input:.3,output:1},"openai/gpt-oss-20b":{input:.018,output:.09},"anthropic/claude-3.5-sonnet":{input:3,output:15},"anthropic/claude-3.5-sonnet:beta":{input:3,output:15},"anthropic/claude-3-opus":{input:15,output:75},"anthropic/claude-3-sonnet":{input:3,output:15},"anthropic/claude-3-haiku":{input:.25,output:1.25},"openai/gpt-4o":{input:5,output:15},"openai/gpt-4o-mini":{input:.15,output:.6},"openai/gpt-4-turbo":{input:10,output:30},"openai/gpt-3.5-turbo":{input:.5,output:1.5},"google/gemini-pro":{input:.125,output:.375},"google/gemini-pro-1.5":{input:3.5,output:10.5},"meta-llama/llama-3.1-70b-instruct":{input:.59,output:.79},"meta-llama/llama-3.1-8b-instruct":{input:.06,output:.06},"mistralai/mistral-large":{input:2,output:6},"mistralai/mixtral-8x7b-instruct":{input:.24,output:.24},"mistralai/mistral-7b-instruct":{input:.06,output:.06},default:{input:1,output:3}};function Ue(g){return Ne[g]??ke(g)??Ne.default}var te=class{type="openrouter";name="OpenRouter";config;requestId=0;cachedModels=null;constructor(t={}){this.config={...mt,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getApiKey())return{healthy:!1,error:"API key not configured. Set OPENROUTER_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/models`,{method:"GET",headers:this.getHeaders()},5e3),o=Date.now()-e;if(!r.ok){let i=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${i}`}}let n=(await r.json()).data?.map(i=>i.id)||[];return this.cachedModels=n,{healthy:!0,latencyMs:o,models:n.slice(0,20),details:{totalModels:n.length,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openrouter-${++this.requestId}-${Date.now()}`,d=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o};e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences),this.config.allowFallback!==void 0&&(m.route=this.config.allowFallback?"fallback":void 0),this.config.forceProvider&&(m.provider={order:[this.config.forceProvider]});try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-d;if(!c.ok){let y=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,y,s)}let p=await c.json(),h={promptTokens:p.usage?.prompt_tokens??0,completionTokens:p.usage?.completion_tokens??0,totalTokens:p.usage?.total_tokens??0},f=this.calculateCost(s,h);return T.recordTokenUsage(l,"openrouter-provider","llm","generate",{inputTokens:h.promptTokens,outputTokens:h.completionTokens,totalTokens:h.totalTokens,estimatedCostUsd:f.totalCost}),{content:p.choices[0]?.message?.content??"",model:p.model,provider:"openrouter",usage:h,cost:f,latencyMs:u,finishReason:this.mapFinishReason(p.choices[0]?.finish_reason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"openrouter",model:s,retryable:!0,cause:c})}}async*generateStream(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=this.formatMessages(t,e?.systemPrompt),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??4096,i=e?.temperature??this.config.temperature??.7,l=`openrouter-stream-${++this.requestId}-${Date.now()}`,d=Date.now(),m={model:s,max_tokens:n,temperature:i,messages:o,stream:!0};e?.stopSequences&&e.stopSequences.length>0&&(m.stop=e.stopSequences);let c=await this.fetchWithTimeout(`${this.getBaseUrl()}/chat/completions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4);if(!c.ok){let w=await c.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(c.status,w,s)}if(!c.body)throw a("No response body for streaming","NETWORK_ERROR",{provider:"openrouter",model:s,retryable:!0});let u="",p="stop",h=s,f=c.body.getReader(),b=new TextDecoder,y="";try{for(;;){let{done:w,value:ie}=await f.read();if(w)break;y+=b.decode(ie,{stream:!0});let x=y.split(`
41
+ `);y=x.pop()||"";for(let M of x){let P=M.trim();if(!P||!P.startsWith("data:"))continue;let B=P.slice(5).trimStart();if(B!=="[DONE]"&&P.startsWith("data:"))try{let D=F(B),ae=D.choices[0]?.delta;ae?.content&&(u+=ae.content,yield ae.content),D.choices[0]?.finish_reason&&(p=this.mapFinishReason(D.choices[0].finish_reason)),D.model&&(h=D.model)}catch{}}}}finally{f.releaseLock()}let C=Date.now()-d,v=Math.ceil(JSON.stringify(o).length/4),O=Math.ceil(u.length/4),R={promptTokens:v,completionTokens:O,totalTokens:v+O},S=this.calculateCost(s,R);return T.recordTokenUsage(l,"openrouter-provider","llm","generate-stream",{inputTokens:R.promptTokens,outputTokens:R.completionTokens,totalTokens:R.totalTokens,estimatedCostUsd:S.totalCost}),{content:u,model:h,provider:"openrouter",usage:R,cost:S,latencyMs:C,finishReason:p,cached:!1,requestId:l}}async embed(t,e){if(!this.getApiKey())throw a("OpenRouter API key not configured","API_KEY_MISSING",{provider:"openrouter",retryable:!1});let o=e?.model??"openai/text-embedding-3-small",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/embeddings`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:o,input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let d=await n.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(n.status,d,o)}let l=await n.json();return{embedding:l.data[0].embedding,model:l.model,provider:"openrouter",tokenCount:l.usage.total_tokens,latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"openrouter",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
42
42
 
43
- `]});return{completion:r.content,model:r.model,provider:"openrouter",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return this.cachedModels?this.cachedModels:["anthropic/claude-sonnet-5","anthropic/claude-opus-5.5","anthropic/claude-opus-5","anthropic/claude-haiku-4.5","openai/gpt-6-sol","openai/gpt-6-luna","openai/gpt-6-astra","google/gemini-3.8-flash","google/gemini-3.1-pro-preview","google/gemini-2.5-flash","meta-llama/llama-4-maverick","deepseek/deepseek-v4-pro","qwen/qwen3-coder","mistralai/mistral-large-2512","openai/gpt-oss-120b"]}getCostPerToken(){let t=Ne(this.config.model);return{input:t.input/1e6,output:t.output/1e6}}async dispose(){this.cachedModels=null}calculateCost(t,e){let r=Ne(t),o=e.promptTokens/1e6*r.input,s=e.completionTokens/1e6*r.output;return{inputCost:o,outputCost:s,totalCost:o+s,currency:"USD"}}getApiKey(){return this.config.apiKey??process.env.OPENROUTER_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://openrouter.ai/api/v1").replace(/\/$/,"")}getHeaders(){let t={"Content-Type":"application/json",Authorization:`Bearer ${this.getApiKey()}`};return this.config.siteUrl&&(t["HTTP-Referer"]=this.config.siteUrl),this.config.siteName&&(t["X-Title"]=this.config.siteName),t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";case"tool_calls":return"stop";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.type??"",n=e.error?.code;switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"openrouter",model:r,retryable:!1});case 402:throw a(o,"COST_LIMIT_EXCEEDED",{provider:"openrouter",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"openrouter",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw n==="context_length_exceeded"||s==="invalid_request_error"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"openrouter",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"openrouter",model:r,retryable:!1});case 404:throw a(o,"MODEL_NOT_FOUND",{provider:"openrouter",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"openrouter",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"openrouter",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"openrouter",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};L();ye();var dt={model:"gemini-2.5-flash",maxTokens:8192,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,baseUrl:"https://generativelanguage.googleapis.com/v1beta",safetyThreshold:"BLOCK_MEDIUM_AND_ABOVE"},te={"gemini-3.8-flash":{input:.75,output:3.75},"gemini-3.5-flash":{input:1.5,output:9},"gemini-3.5-flash-lite":{input:.3,output:2.5},"gemini-3.1-pro-preview":{input:2,output:12},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:.3,output:2.5},"gemini-flash-latest":{input:.3,output:2.5},"gemini-pro":{input:.5,output:1.5},"gemini-1.0-pro":{input:.5,output:1.5},"gemini-1.5-pro":{input:3.5,output:10.5},"gemini-1.5-pro-latest":{input:3.5,output:10.5},"gemini-1.5-flash":{input:.075,output:.3},"gemini-1.5-flash-latest":{input:.075,output:.3},"gemini-2.0-flash-exp":{input:.075,output:.3},"gemini-ultra":{input:7,output:21},"gemini-1.0-ultra":{input:7,output:21},default:{input:1,output:3}},re=class{type="gemini";name="Google Gemini";config;requestId=0;cachedModels=null;constructor(t={}){this.config={...dt,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=this.getApiKey();if(!t)return{healthy:!1,error:"API key not configured. Set GOOGLE_AI_API_KEY, GEMINI_API_KEY, or GOOGLE_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/models?key=${t}`,{method:"GET",headers:{"Content-Type":"application/json"}},5e3),o=Date.now()-e;if(!r.ok){let i=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${i}`}}let n=(await r.json()).models?.filter(i=>i.supportedGenerationMethods?.includes("generateContent")).map(i=>i.name.replace("models/",""))||[];return this.cachedModels=n,{healthy:!0,latencyMs:o,models:n.slice(0,20),details:{totalModels:n.length,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=this.formatContents(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??8192,i=e?.temperature??this.config.temperature??.7,l=`gemini-${++this.requestId}-${Date.now()}`,p=Date.now(),m={contents:o,generationConfig:{maxOutputTokens:n,temperature:i,topP:this.config.topP}};e?.systemPrompt&&(m.systemInstruction={parts:[{text:e.systemPrompt}]}),e?.stopSequences&&e.stopSequences.length>0&&(m.generationConfig.stopSequences=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/models/${s}:generateContent?key=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-p;if(!c.ok){let y=await c.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(c.status,y,s)}let d=await c.json(),h={promptTokens:d.usageMetadata?.promptTokenCount??0,completionTokens:d.usageMetadata?.candidatesTokenCount??0,totalTokens:d.usageMetadata?.totalTokenCount??0},f=this.calculateCost(s,h);return v.recordTokenUsage(l,"gemini-provider","llm","generate",{inputTokens:h.promptTokens,outputTokens:h.completionTokens,totalTokens:h.totalTokens,estimatedCostUsd:f.totalCost}),{content:d.candidates[0]?.content?.parts?.map(y=>y.text??"").join("")??"",model:d.modelVersion??s,provider:"gemini",usage:h,cost:f,latencyMs:u,finishReason:this.mapFinishReason(d.candidates[0]?.finishReason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"gemini",model:s,retryable:!0,cause:c})}}async*generateStream(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=this.formatContents(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??8192,i=e?.temperature??this.config.temperature??.7,l=`gemini-stream-${++this.requestId}-${Date.now()}`,p=Date.now(),m={contents:o,generationConfig:{maxOutputTokens:n,temperature:i}};e?.systemPrompt&&(m.systemInstruction={parts:[{text:e.systemPrompt}]});let c=await this.fetchWithTimeout(`${this.getBaseUrl()}/models/${s}:streamGenerateContent?key=${r}&alt=sse`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4);if(!c.ok){let R=await c.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(c.status,R,s)}if(!c.body)throw a("No response body for streaming","NETWORK_ERROR",{provider:"gemini",model:s,retryable:!0});let u="",d="stop",h={promptTokens:0,completionTokens:0,totalTokens:0},f=c.body.getReader(),b=new TextDecoder,y="";try{for(;;){let{done:R,value:x}=await f.read();if(R)break;y+=b.decode(x,{stream:!0});let w=y.split(`
44
- `);y=w.pop()||"";for(let ne of w){let N=ne.trim();if(!(!N||!N.startsWith("data: ")))try{let M=B(N.slice(6)),P=M.candidates?.[0]?.content?.parts?.map(I=>I.text??"").join("")??"";P&&(u+=P,yield P),M.candidates?.[0]?.finishReason&&(d=this.mapFinishReason(M.candidates[0].finishReason)),M.usageMetadata&&(h={promptTokens:M.usageMetadata.promptTokenCount,completionTokens:M.usageMetadata.candidatesTokenCount,totalTokens:M.usageMetadata.totalTokenCount})}catch{}}}}finally{f.releaseLock()}let C=Date.now()-p,k=h.totalTokens>0?h:{promptTokens:Math.ceil(JSON.stringify(o).length/4),completionTokens:Math.ceil(u.length/4),totalTokens:0};k.totalTokens=k.promptTokens+k.completionTokens;let O=this.calculateCost(s,k);return v.recordTokenUsage(l,"gemini-provider","llm","generate-stream",{inputTokens:k.promptTokens,outputTokens:k.completionTokens,totalTokens:k.totalTokens,estimatedCostUsd:O.totalCost}),{content:u,model:s,provider:"gemini",usage:k,cost:O,latencyMs:C,finishReason:d,cached:!1,requestId:l}}async embed(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=e?.model??"text-embedding-004",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/models/${o}:embedContent?key=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:{parts:[{text:t}]}})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let p=await n.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(n.status,p,o)}return{embedding:(await n.json()).embedding.values,model:o,provider:"gemini",tokenCount:Math.ceil(t.length/4),latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"gemini",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
43
+ `]});return{completion:r.content,model:r.model,provider:"openrouter",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return this.cachedModels?this.cachedModels:["anthropic/claude-sonnet-5","anthropic/claude-opus-5.5","anthropic/claude-opus-5","anthropic/claude-haiku-4.5","openai/gpt-6-sol","openai/gpt-6-luna","openai/gpt-6-astra","google/gemini-3.8-flash","google/gemini-3.1-pro-preview","google/gemini-2.5-flash","meta-llama/llama-4-maverick","deepseek/deepseek-v4-pro","qwen/qwen3-coder","mistralai/mistral-large-2512","openai/gpt-oss-120b"]}getCostPerToken(){let t=Ue(this.config.model);return{input:t.input/1e6,output:t.output/1e6}}async dispose(){this.cachedModels=null}calculateCost(t,e){let r=Ue(t),o=e.promptTokens/1e6*r.input,s=e.completionTokens/1e6*r.output;return{inputCost:o,outputCost:s,totalCost:o+s,currency:"USD"}}getApiKey(){return this.config.apiKey??process.env.OPENROUTER_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://openrouter.ai/api/v1").replace(/\/$/,"")}getHeaders(){let t={"Content-Type":"application/json",Authorization:`Bearer ${this.getApiKey()}`};return this.config.siteUrl&&(t["HTTP-Referer"]=this.config.siteUrl),this.config.siteName&&(t["X-Title"]=this.config.siteName),t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";case"tool_calls":return"stop";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.type??"",n=e.error?.code;switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"openrouter",model:r,retryable:!1});case 402:throw a(o,"COST_LIMIT_EXCEEDED",{provider:"openrouter",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"openrouter",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw n==="context_length_exceeded"||s==="invalid_request_error"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"openrouter",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"openrouter",model:r,retryable:!1});case 404:throw a(o,"MODEL_NOT_FOUND",{provider:"openrouter",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"openrouter",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"openrouter",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"openrouter",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};L();be();var ht={model:"gemini-2.5-flash",maxTokens:8192,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,baseUrl:"https://generativelanguage.googleapis.com/v1beta",safetyThreshold:"BLOCK_MEDIUM_AND_ABOVE"},re={"gemini-3.8-flash":{input:.75,output:3.75},"gemini-3.5-flash":{input:1.5,output:9},"gemini-3.5-flash-lite":{input:.3,output:2.5},"gemini-3.1-pro-preview":{input:2,output:12},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:.3,output:2.5},"gemini-flash-latest":{input:.3,output:2.5},"gemini-pro":{input:.5,output:1.5},"gemini-1.0-pro":{input:.5,output:1.5},"gemini-1.5-pro":{input:3.5,output:10.5},"gemini-1.5-pro-latest":{input:3.5,output:10.5},"gemini-1.5-flash":{input:.075,output:.3},"gemini-1.5-flash-latest":{input:.075,output:.3},"gemini-2.0-flash-exp":{input:.075,output:.3},"gemini-ultra":{input:7,output:21},"gemini-1.0-ultra":{input:7,output:21},default:{input:1,output:3}},oe=class{type="gemini";name="Google Gemini";config;requestId=0;cachedModels=null;constructor(t={}){this.config={...ht,...t}}async isAvailable(){if(!this.getApiKey())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=this.getApiKey();if(!t)return{healthy:!1,error:"API key not configured. Set GOOGLE_AI_API_KEY, GEMINI_API_KEY, or GOOGLE_API_KEY environment variable."};let e=Date.now();try{let r=await this.fetchWithTimeout(`${this.getBaseUrl()}/models?key=${t}`,{method:"GET",headers:{"Content-Type":"application/json"}},5e3),o=Date.now()-e;if(!r.ok){let i=await r.text();return{healthy:!1,latencyMs:o,error:`API error: ${r.status} - ${i}`}}let n=(await r.json()).models?.filter(i=>i.supportedGenerationMethods?.includes("generateContent")).map(i=>i.name.replace("models/",""))||[];return this.cachedModels=n,{healthy:!0,latencyMs:o,models:n.slice(0,20),details:{totalModels:n.length,defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=this.formatContents(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??8192,i=e?.temperature??this.config.temperature??.7,l=`gemini-${++this.requestId}-${Date.now()}`,d=Date.now(),m={contents:o,generationConfig:{maxOutputTokens:n,temperature:i,topP:this.config.topP}};e?.systemPrompt&&(m.systemInstruction={parts:[{text:e.systemPrompt}]}),e?.stopSequences&&e.stopSequences.length>0&&(m.generationConfig.stopSequences=e.stopSequences);try{let c=await this.fetchWithRetry(`${this.getBaseUrl()}/models/${s}:generateContent?key=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),u=Date.now()-d;if(!c.ok){let v=await c.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(c.status,v,s)}let p=await c.json(),h={promptTokens:p.usageMetadata?.promptTokenCount??0,completionTokens:p.usageMetadata?.candidatesTokenCount??0,totalTokens:p.usageMetadata?.totalTokenCount??0},f=this.calculateCost(s,h);T.recordTokenUsage(l,"gemini-provider","llm","generate",{inputTokens:h.promptTokens,outputTokens:h.completionTokens,totalTokens:h.totalTokens,estimatedCostUsd:f.totalCost});let b=this.isPromptBlocked(p.promptFeedback),y=b?void 0:p.candidates[0];return{content:y?.content?.parts?.map(v=>v.text??"").join("")??"",model:p.modelVersion??s,provider:"gemini",usage:h,cost:f,latencyMs:u,finishReason:b?"content_filter":this.mapFinishReason(y?.finishReason),cached:!1,requestId:l}}catch(c){throw c instanceof Error&&"code"in c?c:a(c instanceof Error?c.message:"Request failed","NETWORK_ERROR",{provider:"gemini",model:s,retryable:!0,cause:c})}}async*generateStream(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=this.formatContents(t),s=e?.model??this.config.model,n=e?.maxTokens??this.config.maxTokens??8192,i=e?.temperature??this.config.temperature??.7,l=`gemini-stream-${++this.requestId}-${Date.now()}`,d=Date.now(),m={contents:o,generationConfig:{maxOutputTokens:n,temperature:i}};e?.systemPrompt&&(m.systemInstruction={parts:[{text:e.systemPrompt}]});let c=await this.fetchWithTimeout(`${this.getBaseUrl()}/models/${s}:streamGenerateContent?key=${r}&alt=sse`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)},e?.timeoutMs??this.config.timeoutMs??6e4);if(!c.ok){let R=await c.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(c.status,R,s)}if(!c.body)throw a("No response body for streaming","NETWORK_ERROR",{provider:"gemini",model:s,retryable:!0});let u="",p="stop",h={promptTokens:0,completionTokens:0,totalTokens:0},f=c.body.getReader(),b=new TextDecoder,y="";try{for(;;){let{done:R,value:S}=await f.read();if(R)break;y+=b.decode(S,{stream:!0});let w=y.split(`
44
+ `);y=w.pop()||"";for(let ie of w){let x=ie.trim();if(!(!x||!x.startsWith("data:")))try{let M=F(x.slice(5).trimStart()),P=M.candidates?.[0]?.content?.parts?.map(B=>B.text??"").join("")??"";P&&(u+=P,yield P),this.isPromptBlocked(M.promptFeedback)?p="content_filter":M.candidates?.[0]?.finishReason&&(p=this.mapFinishReason(M.candidates[0].finishReason)),M.usageMetadata&&(h={promptTokens:M.usageMetadata.promptTokenCount,completionTokens:M.usageMetadata.candidatesTokenCount,totalTokens:M.usageMetadata.totalTokenCount})}catch{}}}}finally{f.releaseLock()}let C=Date.now()-d,v=h.totalTokens>0?h:{promptTokens:Math.ceil(JSON.stringify(o).length/4),completionTokens:Math.ceil(u.length/4),totalTokens:0};v.totalTokens=v.promptTokens+v.completionTokens;let O=this.calculateCost(s,v);return T.recordTokenUsage(l,"gemini-provider","llm","generate-stream",{inputTokens:v.promptTokens,outputTokens:v.completionTokens,totalTokens:v.totalTokens,estimatedCostUsd:O.totalCost}),{content:u,model:s,provider:"gemini",usage:v,cost:O,latencyMs:C,finishReason:p,cached:!1,requestId:l}}async embed(t,e){let r=this.getApiKey();if(!r)throw a("Gemini API key not configured","API_KEY_MISSING",{provider:"gemini",retryable:!1});let o=e?.model??"text-embedding-004",s=Date.now();try{let n=await this.fetchWithTimeout(`${this.getBaseUrl()}/models/${o}:embedContent?key=${r}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:{parts:[{text:t}]}})},e?.timeoutMs??this.config.timeoutMs??3e4),i=Date.now()-s;if(!n.ok){let d=await n.json().catch(()=>({error:{message:"Unknown error",code:0,status:"UNKNOWN"}}));throw this.handleApiError(n.status,d,o)}return{embedding:(await n.json()).embedding.values,model:o,provider:"gemini",tokenCount:Math.ceil(t.length/4),latencyMs:i,cached:!1}}catch(n){throw n instanceof Error&&"code"in n?n:a(n instanceof Error?n.message:"Embedding request failed","NETWORK_ERROR",{provider:"gemini",model:o,retryable:!0,cause:n})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
45
45
 
46
- `]});return{completion:r.content,model:r.model,provider:"gemini",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return this.cachedModels?this.cachedModels:["gemini-flash-latest","gemini-pro-latest","gemini-flash-lite-latest","gemini-3.8-flash","gemini-3.5-flash","gemini-3.5-flash-lite","gemini-3.1-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash","gemini-2.0-flash-lite"]}getCostPerToken(){let t=te[this.config.model]||te.default;return{input:t.input/1e6,output:t.output/1e6}}async dispose(){this.cachedModels=null}calculateCost(t,e){let r=te[t]||te.default,o=e.promptTokens/1e6*r.input,s=e.completionTokens/1e6*r.output;return{inputCost:o,outputCost:s,totalCost:o+s,currency:"USD"}}getApiKey(){return this.config.apiKey??process.env.GOOGLE_AI_API_KEY??process.env.GEMINI_API_KEY??process.env.GOOGLE_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://generativelanguage.googleapis.com/v1beta").replace(/\/$/,"")}formatContents(t){return typeof t=="string"?[{role:"user",parts:[{text:t}]}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role==="assistant"?"model":"user",parts:[{text:e.content}]}))}mapFinishReason(t){switch(t){case"STOP":return"stop";case"MAX_TOKENS":return"length";case"SAFETY":return"content_filter";case"RECITATION":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error";switch(t){case 400:throw o.includes("token")||o.includes("length")||o.includes("exceeds")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"gemini",model:r,retryable:!1}):o.includes("API key")?a(o,"API_KEY_INVALID",{provider:"gemini",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"gemini",model:r,retryable:!1});case 401:case 403:throw a(o,"API_KEY_INVALID",{provider:"gemini",model:r,retryable:!1});case 404:throw a(o,"MODEL_NOT_FOUND",{provider:"gemini",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"gemini",model:r,retryable:!0,retryAfterMs:6e4});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"gemini",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"gemini",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"gemini",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};S();ge();L();var mt={model:"gpt-4o",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,apiVersion:"2024-02-15-preview"},oe=class{type="azure-openai";name="Azure OpenAI";config;requestId=0;explicitModel;constructor(t){this.config={...mt,...t},this.explicitModel=t.model}paramPolicyModel(t){return t??this.explicitModel??this.config.deploymentId}async isAvailable(){let t=this.getEndpoint(),e=this.getApiKey()||this.getAzureAdToken();if(!t||!e||!this.config.deploymentId)return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=this.getEndpoint(),e=this.getApiKey()||this.getAzureAdToken();if(!t)return{healthy:!1,error:"Azure endpoint not configured. Set AZURE_OPENAI_ENDPOINT environment variable."};if(!e)return{healthy:!1,error:"Azure authentication not configured. Set AZURE_OPENAI_API_KEY or provide azureAdToken."};if(!this.config.deploymentId)return{healthy:!1,error:"Deployment ID not configured. Set AZURE_OPENAI_DEPLOYMENT or provide deploymentId."};let r=Date.now();try{let o=await this.fetchWithTimeout(this.buildUrl("chat/completions"),{method:"POST",headers:this.getHeaders(),body:JSON.stringify(U({messages:[{role:"user",content:"Hi"}]},this.paramPolicyModel(),{maxTokens:1}))},5e3),s=Date.now()-r;if(!o.ok){let n=await o.text();return{healthy:!1,latencyMs:s,error:`API error: ${o.status} - ${n}`}}return{healthy:!0,latencyMs:s,models:this.getSupportedModels(),details:{endpoint:this.getEndpoint(),deploymentId:this.config.deploymentId,apiVersion:this.config.apiVersion,authType:this.getAzureAdToken()?"Azure AD":"API Key"}}}catch(o){return{healthy:!1,error:o instanceof Error?o.message:"Unknown error"}}}async generate(t,e){let r=this.getEndpoint(),o=this.getApiKey()||this.getAzureAdToken();if(!r||!o)throw a("Azure OpenAI not configured","API_KEY_MISSING",{provider:"azure-openai",retryable:!1});let s=this.formatMessages(t,e?.systemPrompt),n=e?.model??this.config.model??"gpt-4o",i=e?.maxTokens??this.config.maxTokens??4096,l=e?.temperature??this.config.temperature??.7,p=`azure-openai-${++this.requestId}-${Date.now()}`,m=Date.now(),c=U({messages:s},this.paramPolicyModel(e?.model),{maxTokens:i,temperature:l});e?.stopSequences&&e.stopSequences.length>0&&(c.stop=e.stopSequences),this.config.presencePenalty!==void 0&&(c.presence_penalty=this.config.presencePenalty),this.config.frequencyPenalty!==void 0&&(c.frequency_penalty=this.config.frequencyPenalty);try{let u=await this.fetchWithRetry(this.buildUrl("chat/completions"),{method:"POST",headers:this.getHeaders(),body:JSON.stringify(c)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),d=Date.now()-m;if(!u.ok){let C=await u.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(u.status,C,n)}let h=await u.json(),f={promptTokens:h.usage.prompt_tokens,completionTokens:h.usage.completion_tokens,totalTokens:h.usage.total_tokens},b=_.calculateCost(n,f);return v.recordTokenUsage(p,"azure-openai-provider","llm","generate",{inputTokens:h.usage.prompt_tokens,outputTokens:h.usage.completion_tokens,totalTokens:h.usage.total_tokens,estimatedCostUsd:b.totalCost}),{content:h.choices[0]?.message?.content??"",model:h.model,provider:"azure-openai",usage:f,cost:b,latencyMs:d,finishReason:this.mapFinishReason(h.choices[0]?.finish_reason),cached:!1,requestId:p}}catch(u){throw u instanceof Error&&"code"in u?u:a(u instanceof Error?u.message:"Request failed","NETWORK_ERROR",{provider:"azure-openai",model:n,retryable:!0,cause:u})}}async embed(t,e){let r=this.getEndpoint(),o=this.getApiKey()||this.getAzureAdToken();if(!r||!o)throw a("Azure OpenAI not configured","API_KEY_MISSING",{provider:"azure-openai",retryable:!1});let s=e?.model??this.config.deploymentId,n=Date.now();try{let i=await this.fetchWithTimeout(this.buildUrl("embeddings",s),{method:"POST",headers:this.getHeaders(),body:JSON.stringify({input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),l=Date.now()-n;if(!i.ok){let m=await i.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(i.status,m,s)}let p=await i.json();return{embedding:p.data[0].embedding,model:p.model,provider:"azure-openai",tokenCount:p.usage.total_tokens,latencyMs:l,cached:!1}}catch(i){throw i instanceof Error&&"code"in i?i:a(i instanceof Error?i.message:"Embedding request failed","NETWORK_ERROR",{provider:"azure-openai",model:s,retryable:!0,cause:i})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
46
+ `]});return{completion:r.content,model:r.model,provider:"gemini",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return this.cachedModels?this.cachedModels:["gemini-flash-latest","gemini-pro-latest","gemini-flash-lite-latest","gemini-3.8-flash","gemini-3.5-flash","gemini-3.5-flash-lite","gemini-3.1-pro-preview","gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash","gemini-2.0-flash-lite"]}getCostPerToken(){let t=re[this.config.model]||re.default;return{input:t.input/1e6,output:t.output/1e6}}async dispose(){this.cachedModels=null}calculateCost(t,e){let r=re[t]||re.default,o=e.promptTokens/1e6*r.input,s=e.completionTokens/1e6*r.output;return{inputCost:o,outputCost:s,totalCost:o+s,currency:"USD"}}getApiKey(){return this.config.apiKey??process.env.GOOGLE_AI_API_KEY??process.env.GEMINI_API_KEY??process.env.GOOGLE_API_KEY}getBaseUrl(){return(this.config.baseUrl??"https://generativelanguage.googleapis.com/v1beta").replace(/\/$/,"")}formatContents(t){return typeof t=="string"?[{role:"user",parts:[{text:t}]}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role==="assistant"?"model":"user",parts:[{text:e.content}]}))}isPromptBlocked(t){return!!t?.blockReason&&t.blockReason!=="BLOCK_REASON_UNSPECIFIED"}mapFinishReason(t){switch(t){case"STOP":return"stop";case"MAX_TOKENS":return"length";case"SAFETY":return"content_filter";case"RECITATION":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error";switch(t){case 400:throw o.includes("token")||o.includes("length")||o.includes("exceeds")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"gemini",model:r,retryable:!1}):o.includes("API key")?a(o,"API_KEY_INVALID",{provider:"gemini",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"gemini",model:r,retryable:!1});case 401:case 403:throw a(o,"API_KEY_INVALID",{provider:"gemini",model:r,retryable:!1});case 404:throw a(o,"MODEL_NOT_FOUND",{provider:"gemini",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"gemini",model:r,retryable:!0,retryAfterMs:6e4});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"gemini",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"gemini",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"gemini",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};I();fe();L();var gt={model:"gpt-4o",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0,apiVersion:"2024-02-15-preview"},se=class{type="azure-openai";name="Azure OpenAI";config;requestId=0;explicitModel;constructor(t){this.config={...gt,...t},this.explicitModel=t.model}paramPolicyModel(t){return t??this.explicitModel??this.config.deploymentId}async isAvailable(){let t=this.getEndpoint(),e=this.getApiKey()||this.getAzureAdToken();if(!t||!e||!this.config.deploymentId)return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){let t=this.getEndpoint(),e=this.getApiKey()||this.getAzureAdToken();if(!t)return{healthy:!1,error:"Azure endpoint not configured. Set AZURE_OPENAI_ENDPOINT environment variable."};if(!e)return{healthy:!1,error:"Azure authentication not configured. Set AZURE_OPENAI_API_KEY or provide azureAdToken."};if(!this.config.deploymentId)return{healthy:!1,error:"Deployment ID not configured. Set AZURE_OPENAI_DEPLOYMENT or provide deploymentId."};let r=Date.now();try{let o=await this.fetchWithTimeout(this.buildUrl("chat/completions"),{method:"POST",headers:this.getHeaders(),body:JSON.stringify(N({messages:[{role:"user",content:"Hi"}]},this.paramPolicyModel(),{maxTokens:1}))},5e3),s=Date.now()-r;if(!o.ok){let n=await o.text();return{healthy:!1,latencyMs:s,error:`API error: ${o.status} - ${n}`}}return{healthy:!0,latencyMs:s,models:this.getSupportedModels(),details:{endpoint:this.getEndpoint(),deploymentId:this.config.deploymentId,apiVersion:this.config.apiVersion,authType:this.getAzureAdToken()?"Azure AD":"API Key"}}}catch(o){return{healthy:!1,error:o instanceof Error?o.message:"Unknown error"}}}async generate(t,e){let r=this.getEndpoint(),o=this.getApiKey()||this.getAzureAdToken();if(!r||!o)throw a("Azure OpenAI not configured","API_KEY_MISSING",{provider:"azure-openai",retryable:!1});let s=this.formatMessages(t,e?.systemPrompt),n=e?.model??this.config.model??"gpt-4o",i=e?.maxTokens??this.config.maxTokens??4096,l=e?.temperature??this.config.temperature??.7,d=`azure-openai-${++this.requestId}-${Date.now()}`,m=Date.now(),c=N({messages:s},this.paramPolicyModel(e?.model),{maxTokens:i,temperature:l});e?.stopSequences&&e.stopSequences.length>0&&(c.stop=e.stopSequences),this.config.presencePenalty!==void 0&&(c.presence_penalty=this.config.presencePenalty),this.config.frequencyPenalty!==void 0&&(c.frequency_penalty=this.config.frequencyPenalty);try{let u=await this.fetchWithRetry(this.buildUrl("chat/completions"),{method:"POST",headers:this.getHeaders(),body:JSON.stringify(c)},e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),p=Date.now()-m;if(!u.ok){let C=await u.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(u.status,C,n)}let h=await u.json(),f={promptTokens:h.usage.prompt_tokens,completionTokens:h.usage.completion_tokens,totalTokens:h.usage.total_tokens},b=_.calculateCost(n,f);return T.recordTokenUsage(d,"azure-openai-provider","llm","generate",{inputTokens:h.usage.prompt_tokens,outputTokens:h.usage.completion_tokens,totalTokens:h.usage.total_tokens,estimatedCostUsd:b.totalCost}),{content:h.choices[0]?.message?.content??"",model:h.model,provider:"azure-openai",usage:f,cost:b,latencyMs:p,finishReason:this.mapFinishReason(h.choices[0]?.finish_reason),cached:!1,requestId:d}}catch(u){throw u instanceof Error&&"code"in u?u:a(u instanceof Error?u.message:"Request failed","NETWORK_ERROR",{provider:"azure-openai",model:n,retryable:!0,cause:u})}}async embed(t,e){let r=this.getEndpoint(),o=this.getApiKey()||this.getAzureAdToken();if(!r||!o)throw a("Azure OpenAI not configured","API_KEY_MISSING",{provider:"azure-openai",retryable:!1});let s=e?.model??this.config.deploymentId,n=Date.now();try{let i=await this.fetchWithTimeout(this.buildUrl("embeddings",s),{method:"POST",headers:this.getHeaders(),body:JSON.stringify({input:t})},e?.timeoutMs??this.config.timeoutMs??3e4),l=Date.now()-n;if(!i.ok){let m=await i.json().catch(()=>({error:{message:"Unknown error",type:"unknown",code:null}}));throw this.handleApiError(i.status,m,s)}let d=await i.json();return{embedding:d.data[0].embedding,model:d.model,provider:"azure-openai",tokenCount:d.usage.total_tokens,latencyMs:l,cached:!1}}catch(i){throw i instanceof Error&&"code"in i?i:a(i instanceof Error?i.message:"Embedding request failed","NETWORK_ERROR",{provider:"azure-openai",model:s,retryable:!0,cause:i})}}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
47
47
 
48
- `]});return{completion:r.content,model:r.model,provider:"azure-openai",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.4-mini","text-embedding-ada-002","text-embedding-3-small","text-embedding-3-large"]}getCostPerToken(){return _.getCostPerToken(this.config.model??"gpt-4o")}async dispose(){}getApiKey(){return this.config.apiKey??process.env.AZURE_OPENAI_API_KEY}getAzureAdToken(){return this.config.azureAdToken}getEndpoint(){return(this.config.endpoint??process.env.AZURE_OPENAI_ENDPOINT)?.replace(/\/$/,"")}getApiVersion(){return this.config.apiVersion??process.env.AZURE_OPENAI_API_VERSION??"2024-02-15-preview"}buildUrl(t,e){let r=this.getEndpoint(),o=e??this.config.deploymentId,s=this.getApiVersion();return`${r}/openai/deployments/${o}/${t}?api-version=${s}`}getHeaders(){let t={"Content-Type":"application/json"},e=this.getAzureAdToken();if(e)t.Authorization=`Bearer ${e}`;else{let r=this.getApiKey();r&&(t["api-key"]=r)}return t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.code??"",n=e.error?.innererror?.code??"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"azure-openai",model:r,retryable:!1});case 403:throw a(o,"API_KEY_INVALID",{provider:"azure-openai",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"azure-openai",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s==="context_length_exceeded"||n==="context_length_exceeded"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"azure-openai",model:r,retryable:!1}):n==="content_filter"?a(o,"CONTENT_FILTERED",{provider:"azure-openai",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"azure-openai",model:r,retryable:!1});case 404:throw a(`Deployment not found: ${r}`,"MODEL_NOT_FOUND",{provider:"azure-openai",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"azure-openai",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"azure-openai",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"azure-openai",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};S();L();he();var ht={model:"anthropic.claude-sonnet-4-6-v1:0",region:"us-east-1",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},fe={"claude-opus-4-7":"anthropic.claude-opus-4-7-v1:0","claude-sonnet-4-6":"anthropic.claude-sonnet-4-6-v1:0","claude-haiku-4-5-20251001":"anthropic.claude-haiku-4-5-v1:0","claude-haiku-4-5":"anthropic.claude-haiku-4-5-v1:0","claude-opus-4-5-20251101":"anthropic.claude-opus-4-5-v1:0","claude-opus-4-5":"anthropic.claude-opus-4-5-v1:0","claude-sonnet-4-5-20250929":"anthropic.claude-sonnet-4-5-v2:0","claude-sonnet-4-5":"anthropic.claude-sonnet-4-5-v2:0"},hn=Object.fromEntries(Object.entries(fe).map(([g,t])=>[t,g])),se=class{type="bedrock";name="AWS Bedrock";config;requestId=0;constructor(t={}){this.config={...ht,...t}}async isAvailable(){if(!this.getCredentials())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getCredentials())return{healthy:!1,error:"AWS credentials not configured. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables, or use IAM role."};let e=Date.now();try{let r=this.mapToBedrockModel(this.config.model),o=await this.invokeModel(r,{anthropic_version:"bedrock-2023-05-31",max_tokens:1,messages:[{role:"user",content:"Hi"}]},5e3),s=Date.now()-e;if(!o.ok){let n=await o.text();return{healthy:!1,latencyMs:s,error:`API error: ${o.status} - ${n}`}}return{healthy:!0,latencyMs:s,models:this.getSupportedModels(),details:{region:this.getRegion(),defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getCredentials())throw a("AWS credentials not configured","API_KEY_MISSING",{provider:"bedrock",retryable:!1});let o=this.formatMessages(t),s=e?.model??this.config.model,n=this.mapToBedrockModel(s),i=e?.maxTokens??this.config.maxTokens??4096,l=e?.temperature??this.config.temperature??.7,p=`bedrock-${++this.requestId}-${Date.now()}`,m=Date.now(),c={anthropic_version:"bedrock-2023-05-31",max_tokens:i,messages:o};H(c,n,{temperature:l!==void 0?Math.min(Math.max(l,0),1):void 0}),e?.systemPrompt&&(c.system=e.systemPrompt),e?.stopSequences&&e.stopSequences.length>0&&(c.stop_sequences=e.stopSequences);try{let u=await this.invokeModelWithRetry(n,c,e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),d=Date.now()-m;if(!u.ok){let C=await u.json().catch(()=>({message:"Unknown error"}));throw this.handleApiError(u.status,C,s)}let h=await u.json(),f={promptTokens:h.usage.input_tokens,completionTokens:h.usage.output_tokens,totalTokens:h.usage.input_tokens+h.usage.output_tokens},b=_.calculateCost(n,f);return v.recordTokenUsage(p,"bedrock-provider","llm","generate",{inputTokens:h.usage.input_tokens,outputTokens:h.usage.output_tokens,totalTokens:h.usage.input_tokens+h.usage.output_tokens,estimatedCostUsd:b.totalCost}),{content:h.content.filter(C=>C.type==="text").map(C=>C.text).join(""),model:n,provider:"bedrock",usage:f,cost:b,latencyMs:d,finishReason:this.mapFinishReason(h.stop_reason),cached:!1,requestId:p}}catch(u){throw u instanceof Error&&"code"in u?u:a(u instanceof Error?u.message:"Request failed","NETWORK_ERROR",{provider:"bedrock",model:s,retryable:!0,cause:u})}}async embed(t,e){throw a("Bedrock Claude models do not support native embeddings. Use Bedrock Titan or Cohere for embeddings.","MODEL_NOT_FOUND",{provider:"bedrock",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
48
+ `]});return{completion:r.content,model:r.model,provider:"azure-openai",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return["gpt-6-sol","gpt-6-luna","gpt-6-astra","gpt-5.4-mini","text-embedding-ada-002","text-embedding-3-small","text-embedding-3-large"]}getCostPerToken(){return _.getCostPerToken(this.config.model??"gpt-4o")}async dispose(){}getApiKey(){return this.config.apiKey??process.env.AZURE_OPENAI_API_KEY}getAzureAdToken(){return this.config.azureAdToken}getEndpoint(){return(this.config.endpoint??process.env.AZURE_OPENAI_ENDPOINT)?.replace(/\/$/,"")}getApiVersion(){return this.config.apiVersion??process.env.AZURE_OPENAI_API_VERSION??"2024-02-15-preview"}buildUrl(t,e){let r=this.getEndpoint(),o=e??this.config.deploymentId,s=this.getApiVersion();return`${r}/openai/deployments/${o}/${t}?api-version=${s}`}getHeaders(){let t={"Content-Type":"application/json"},e=this.getAzureAdToken();if(e)t.Authorization=`Bearer ${e}`;else{let r=this.getApiKey();r&&(t["api-key"]=r)}return t}formatMessages(t,e){let r=[];if(typeof t=="string")e&&r.push({role:"system",content:e}),r.push({role:"user",content:t});else{let o=t.some(s=>s.role==="system");e&&!o&&r.push({role:"system",content:e});for(let s of t)r.push({role:s.role,content:s.content})}return r}mapFinishReason(t){switch(t){case"stop":return"stop";case"length":return"length";case"content_filter":return"content_filter";default:return"stop"}}handleApiError(t,e,r){let o=e.error?.message??"Unknown API error",s=e.error?.code??"",n=e.error?.innererror?.code??"";switch(t){case 401:throw a(o,"API_KEY_INVALID",{provider:"azure-openai",model:r,retryable:!1});case 403:throw a(o,"API_KEY_INVALID",{provider:"azure-openai",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"azure-openai",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s==="context_length_exceeded"||n==="context_length_exceeded"?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"azure-openai",model:r,retryable:!1}):n==="content_filter"?a(o,"CONTENT_FILTERED",{provider:"azure-openai",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"azure-openai",model:r,retryable:!1});case 404:throw a(`Deployment not found: ${r}`,"MODEL_NOT_FOUND",{provider:"azure-openai",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"azure-openai",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"azure-openai",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"azure-openai",retryable:!0}):n}finally{clearTimeout(s)}}async fetchWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.fetchWithTimeout(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}sleep(t){return new Promise(e=>setTimeout(e,t))}};I();L();ge();var ft={model:"anthropic.claude-sonnet-4-6-v1:0",region:"us-east-1",maxTokens:4096,temperature:.7,timeoutMs:6e4,maxRetries:3,enableCache:!0,enableCircuitBreaker:!0},ye={"claude-opus-4-7":"anthropic.claude-opus-4-7-v1:0","claude-sonnet-4-6":"anthropic.claude-sonnet-4-6-v1:0","claude-haiku-4-5-20251001":"anthropic.claude-haiku-4-5-v1:0","claude-haiku-4-5":"anthropic.claude-haiku-4-5-v1:0","claude-opus-4-5-20251101":"anthropic.claude-opus-4-5-v1:0","claude-opus-4-5":"anthropic.claude-opus-4-5-v1:0","claude-sonnet-4-5-20250929":"anthropic.claude-sonnet-4-5-v2:0","claude-sonnet-4-5":"anthropic.claude-sonnet-4-5-v2:0"},vn=Object.fromEntries(Object.entries(ye).map(([g,t])=>[t,g])),ne=class{type="bedrock";name="AWS Bedrock";config;requestId=0;constructor(t={}){this.config={...ft,...t}}async isAvailable(){if(!this.getCredentials())return!1;try{return(await this.healthCheck()).healthy}catch{return!1}}async healthCheck(){if(!this.getCredentials())return{healthy:!1,error:"AWS credentials not configured. Set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables, or use IAM role."};let e=Date.now();try{let r=this.mapToBedrockModel(this.config.model),o=await this.invokeModel(r,{anthropic_version:"bedrock-2023-05-31",max_tokens:1,messages:[{role:"user",content:"Hi"}]},5e3),s=Date.now()-e;if(!o.ok){let n=await o.text();return{healthy:!1,latencyMs:s,error:`API error: ${o.status} - ${n}`}}return{healthy:!0,latencyMs:s,models:this.getSupportedModels(),details:{region:this.getRegion(),defaultModel:this.config.model}}}catch(r){return{healthy:!1,error:r instanceof Error?r.message:"Unknown error"}}}async generate(t,e){if(!this.getCredentials())throw a("AWS credentials not configured","API_KEY_MISSING",{provider:"bedrock",retryable:!1});let o=this.formatMessages(t),s=e?.model??this.config.model,n=this.mapToBedrockModel(s),i=e?.maxTokens??this.config.maxTokens??4096,l=e?.temperature??this.config.temperature??.7,d=`bedrock-${++this.requestId}-${Date.now()}`,m=Date.now(),c={anthropic_version:"bedrock-2023-05-31",max_tokens:i,messages:o};V(c,n,{temperature:l!==void 0?Math.min(Math.max(l,0),1):void 0}),e?.systemPrompt&&(c.system=e.systemPrompt),e?.stopSequences&&e.stopSequences.length>0&&(c.stop_sequences=e.stopSequences);try{let u=await this.invokeModelWithRetry(n,c,e?.timeoutMs??this.config.timeoutMs??6e4,this.config.maxRetries??3),p=Date.now()-m;if(!u.ok){let C=await u.json().catch(()=>({message:"Unknown error"}));throw this.handleApiError(u.status,C,s)}let h=await u.json(),f={promptTokens:h.usage.input_tokens,completionTokens:h.usage.output_tokens,totalTokens:h.usage.input_tokens+h.usage.output_tokens},b=_.calculateCost(n,f);return T.recordTokenUsage(d,"bedrock-provider","llm","generate",{inputTokens:h.usage.input_tokens,outputTokens:h.usage.output_tokens,totalTokens:h.usage.input_tokens+h.usage.output_tokens,estimatedCostUsd:b.totalCost}),{content:h.content.filter(C=>C.type==="text").map(C=>C.text).join(""),model:n,provider:"bedrock",usage:f,cost:b,latencyMs:p,finishReason:this.mapFinishReason(h.stop_reason),cached:!1,requestId:d}}catch(u){throw u instanceof Error&&"code"in u?u:a(u instanceof Error?u.message:"Request failed","NETWORK_ERROR",{provider:"bedrock",model:s,retryable:!0,cause:u})}}async embed(t,e){throw a("Bedrock Claude models do not support native embeddings. Use Bedrock Titan or Cohere for embeddings.","MODEL_NOT_FOUND",{provider:"bedrock",retryable:!1})}async complete(t,e){let r=await this.generate(t,{model:e?.model,temperature:e?.temperature??.2,maxTokens:e?.maxTokens??256,stopSequences:e?.stopSequences??[`
49
49
 
50
- `,"```"]});return{completion:r.content,model:r.model,provider:"bedrock",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return Object.keys(fe)}getCostPerToken(){let t=this.mapToBedrockModel(this.config.model);return _.getCostPerToken(t)}async dispose(){}getCredentials(){let t=this.config.accessKeyId??process.env.AWS_ACCESS_KEY_ID,e=this.config.secretAccessKey??process.env.AWS_SECRET_ACCESS_KEY,r=this.config.sessionToken??process.env.AWS_SESSION_TOKEN;return!t||!e?null:{region:this.getRegion(),service:"bedrock",accessKeyId:t,secretAccessKey:e,sessionToken:r}}getRegion(){return this.config.region??process.env.AWS_REGION??process.env.AWS_DEFAULT_REGION??"us-east-1"}mapToBedrockModel(t){if(t.startsWith("anthropic."))return t;let e=fe[t];return e||t}getEndpointUrl(t){let e=this.getRegion();return`${this.config.baseUrl??`https://bedrock-runtime.${e}.amazonaws.com`}/model/${t}/invoke`}async invokeModel(t,e,r){let o=this.getCredentials();if(!o)throw a("AWS credentials not configured","API_KEY_MISSING",{provider:"bedrock",retryable:!1});let s=this.getEndpointUrl(t),n=JSON.stringify(e),i=await this.signRequest(s,n,o);return this.fetchWithTimeout(s,{method:"POST",headers:i,body:n},r)}async invokeModelWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.invokeModel(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=T(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=T(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}async signRequest(t,e,r){let o=new URL(t),n=new Date().toISOString().replace(/[:-]|\.\d{3}/g,""),i=n.substring(0,8),l={"Content-Type":"application/json",Host:o.host,"X-Amz-Date":n};r.sessionToken&&(l["X-Amz-Security-Token"]=r.sessionToken);let p="POST",m=o.pathname,c="",u=Object.keys(l).map(w=>w.toLowerCase()).sort().join(";"),d=Object.keys(l).map(w=>`${w.toLowerCase()}:${l[w].trim()}`).sort().join(`
50
+ `,"```"]});return{completion:r.content,model:r.model,provider:"bedrock",usage:r.usage,latencyMs:r.latencyMs,cached:r.cached}}getConfig(){return{...this.config}}getSupportedModels(){return Object.keys(ye)}getCostPerToken(){let t=this.mapToBedrockModel(this.config.model);return _.getCostPerToken(t)}async dispose(){}getCredentials(){let t=this.config.accessKeyId??process.env.AWS_ACCESS_KEY_ID,e=this.config.secretAccessKey??process.env.AWS_SECRET_ACCESS_KEY,r=this.config.sessionToken??process.env.AWS_SESSION_TOKEN;return!t||!e?null:{region:this.getRegion(),service:"bedrock",accessKeyId:t,secretAccessKey:e,sessionToken:r}}getRegion(){return this.config.region??process.env.AWS_REGION??process.env.AWS_DEFAULT_REGION??"us-east-1"}mapToBedrockModel(t){if(t.startsWith("anthropic."))return t;let e=ye[t];return e||t}getEndpointUrl(t){let e=this.getRegion();return`${this.config.baseUrl??`https://bedrock-runtime.${e}.amazonaws.com`}/model/${t}/invoke`}async invokeModel(t,e,r){let o=this.getCredentials();if(!o)throw a("AWS credentials not configured","API_KEY_MISSING",{provider:"bedrock",retryable:!1});let s=this.getEndpointUrl(t),n=JSON.stringify(e),i=await this.signRequest(s,n,o);return this.fetchWithTimeout(s,{method:"POST",headers:i,body:n},r)}async invokeModelWithRetry(t,e,r,o){let s;for(let n=0;n<o;n++)try{let i=await this.invokeModel(t,e,r);if(i.status>=400&&i.status<500&&i.status!==429)return i;if((i.status>=500||i.status===429)&&n<o-1){let l=k(n);await this.sleep(l);continue}return i}catch(i){if(s=E(i),n<o-1){let l=k(n);await this.sleep(l)}}throw s??new Error("Request failed after retries")}async signRequest(t,e,r){let o=new URL(t),n=new Date().toISOString().replace(/[:-]|\.\d{3}/g,""),i=n.substring(0,8),l={"Content-Type":"application/json",Host:o.host,"X-Amz-Date":n};r.sessionToken&&(l["X-Amz-Security-Token"]=r.sessionToken);let d="POST",m=o.pathname,c="",u=Object.keys(l).map(w=>w.toLowerCase()).sort().join(";"),p=Object.keys(l).map(w=>`${w.toLowerCase()}:${l[w].trim()}`).sort().join(`
51
51
  `)+`
52
- `,h=await this.sha256(e),f=[p,m,c,d,u,h].join(`
53
- `),b="AWS4-HMAC-SHA256",y=`${i}/${r.region}/${r.service}/aws4_request`,C=await this.sha256(f),k=[b,n,y,C].join(`
54
- `),O=await this.getSignatureKey(r.secretAccessKey,i,r.region,r.service),R=await this.hmacHex(O,k),x=`${b} Credential=${r.accessKeyId}/${y}, SignedHeaders=${u}, Signature=${R}`;return{...l,Authorization:x}}async sha256(t){let r=new TextEncoder().encode(t),o=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(o)).map(s=>s.toString(16).padStart(2,"0")).join("")}async hmac(t,e){let r=new TextEncoder,o=t instanceof Uint8Array?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength):t,s=await crypto.subtle.importKey("raw",o,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return crypto.subtle.sign("HMAC",s,r.encode(e))}async hmacHex(t,e){let r=await this.hmac(t,e);return Array.from(new Uint8Array(r)).map(o=>o.toString(16).padStart(2,"0")).join("")}async getSignatureKey(t,e,r,o){let s=new TextEncoder,n=await this.hmac(s.encode(`AWS4${t}`),e),i=await this.hmac(n,r),l=await this.hmac(i,o);return this.hmac(l,"aws4_request")}formatMessages(t){return typeof t=="string"?[{role:"user",content:t}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role,content:e.content}))}mapFinishReason(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"stop_sequence":return"stop";default:return"stop"}}handleApiError(t,e,r){let o=e.message??"Unknown API error",s=e.__type??"";switch(t){case 401:case 403:throw a(o,"API_KEY_INVALID",{provider:"bedrock",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"bedrock",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s.includes("ValidationException")&&o.includes("token")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"bedrock",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"bedrock",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"bedrock",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"bedrock",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"bedrock",retryable:!0}):n}finally{clearTimeout(s)}}sleep(t){return new Promise(e=>setTimeout(e,t))}};L();$();var gt={primary:"claude",fallbacks:["openai","ollama"],loadBalancing:"round-robin",providers:{},global:{enableCostTracking:!0,enableMetrics:!0}},Ue=class{providers=new Map;circuitBreakers;cache;costTracker;config;metrics=new Map;roundRobinIndex=0;initialized=!1;spendLedger;injectedLedger;maxCostPerRun;billingNoticeShown=!1;constructor(t={},e){this.config={...gt,...t},this.circuitBreakers=new F(e?.circuitBreakerConfig),this.cache=new W(e?.cacheConfig),this.costTracker=e?.costTracker??ke(),this.injectedLedger=e?.spendLedger;let r=Number.parseFloat(process.env.AQE_MAX_BUDGET_USD??"");this.maxCostPerRun=this.config.global?.maxCostPerRun??(Number.isFinite(r)&&r>0?r:void 0)}async initialize(){if(!this.initialized){await this.createProviders();for(let t of this.providers.keys())this.initializeMetrics(t);this.budgetConfigured()&&(this.spendLedger=this.injectedLedger??await Ae().catch(()=>new K)),this.emitBillingNotice(),this.initialized=!0}}budgetConfigured(){let t=this.config.global;return!!(this.maxCostPerRun||t?.maxCostPerHour&&t.maxCostPerHour>0||t?.maxCostPerDay&&t.maxCostPerDay>0)}emitBillingNotice(){if(this.billingNoticeShown||(process.env.AQE_LLM_NO_BILLING_NOTICE??"")==="1")return;let t=this.providers.get(this.config.primary);if(!t)return;let e=Ce(t),r=_e(t.type,e);r&&console.error(r),this.billingNoticeShown=!0}enforceBudget(t,e){if(!this.budgetConfigured()||!this.spendLedger)return;let r=e?.model??this.providers.get(this.config.primary)?.getConfig().model??this.config.primary,o=typeof t=="string"?t:JSON.stringify(t),s=Math.ceil(o.length/4),n=e?.maxTokens??4096,i=this.costTracker.estimateCost(r,s,n).totalCost;if(i===0)return;let l=this.config.global,p=[{limit:this.maxCostPerRun,spent:this.costTracker.getCurrentCost("all"),label:"per-run"},{limit:l?.maxCostPerHour,spent:this.spendLedger.spentSince(36e5),label:"hourly"},{limit:l?.maxCostPerDay,spent:this.spendLedger.spentSince(864e5),label:"daily"}];for(let{limit:m,spent:c,label:u}of p)if(m&&m>0&&c+i>m)throw a(`LLM ${u} budget exceeded: $${c.toFixed(4)} spent + $${i.toFixed(4)} estimated > $${m.toFixed(2)} cap. Raise --max-budget-usd / maxCost* or switch to a local/subscription provider.`,"COST_LIMIT_EXCEEDED",{retryable:!1})}recordSpend(t,e){this.spendLedger&&this.spendLedger.record({provider:t.provider,model:t.model,costUsd:t.cost.totalCost,costSource:t.cost.source??"local-estimate",promptTokens:t.usage.promptTokens,completionTokens:t.usage.completionTokens,requestId:t.requestId,agent:e})}assertWithinBudget(t,e){this.enforceBudget(t,e)}recordResponseSpend(t,e){this.recordSpend(t,e)}async generate(t,e){if(await this.ensureInitialized(),!e?.skipCache){let o=typeof t=="string"?t:JSON.stringify(t),s=this.cache.getGeneration(o,{model:e?.model,temperature:e?.temperature,maxTokens:e?.maxTokens,systemPrompt:e?.systemPrompt});if(s)return{...s,cached:!0}}this.enforceBudget(t,e);let r=await this.executeWithFailover("generate",async o=>o.generate(t,e),e?.preferredProvider);if(!e?.skipCache){let o=typeof t=="string"?t:JSON.stringify(t);this.cache.setGeneration(o,r,{model:e?.model,temperature:e?.temperature,maxTokens:e?.maxTokens,systemPrompt:e?.systemPrompt})}return this.costTracker.recordUsage(r.provider,r.model,r.usage,r.requestId),this.recordSpend(r),r}async embed(t,e){if(await this.ensureInitialized(),!e?.skipCache){let s=this.cache.getEmbedding(t,{model:e?.model});if(s)return{...s,cached:!0}}let r=["openai","ollama","cognitum"],o=await this.executeWithFailover("embed",async s=>s.embed(t,e),r.find(s=>this.providers.has(s)));return e?.skipCache||this.cache.setEmbedding(t,o,{model:e?.model}),o}async complete(t,e){if(await this.ensureInitialized(),!e?.skipCache){let o=this.cache.getCompletion(t,{model:e?.model,temperature:e?.temperature,maxTokens:e?.maxTokens});if(o)return{...o,cached:!0}}this.enforceBudget(t,e);let r=await this.executeWithFailover("complete",async o=>o.complete(t,e));return e?.skipCache||this.cache.setCompletion(t,r,{model:e?.model,temperature:e?.temperature,maxTokens:e?.maxTokens}),this.costTracker.recordUsage(r.provider,r.model,r.usage,`complete-${r.model}-${Date.now()}`),this.recordSpend({content:r.completion,model:r.model,provider:r.provider,usage:r.usage,cost:_.calculateCost(r.model,r.usage),latencyMs:r.latencyMs,finishReason:"stop",cached:r.cached,requestId:`complete-${r.model}-${Date.now()}`}),r}async healthCheck(){await this.ensureInitialized();let t={};for(let[e,r]of this.providers)t[e]=await r.healthCheck();return t}getProvider(t){return this.providers.get(t)}getAvailableProviders(){let t=[];for(let[e,r]of this.providers)this.circuitBreakers.getBreaker(e).canExecute()&&t.push(e);return t}getMetrics(){let t={};for(let[e,r]of this.metrics){let o=this.circuitBreakers.getBreaker(e),s=r.latencies.slice(-100);t[e]={provider:e,totalRequests:r.totalRequests,successCount:r.successCount,failureCount:r.failureCount,avgLatencyMs:this.calculateAverage(s),p95LatencyMs:this.calculatePercentile(s,95),p99LatencyMs:this.calculatePercentile(s,99),totalCost:r.totalCost,totalTokens:r.totalTokens,circuitState:o.getState()}}return t}getCacheStats(){return this.cache.getStats()}getCostSummary(t="day"){return this.costTracker.getSummary(t)}clearCache(){this.cache.clear()}resetCircuitBreakers(){this.circuitBreakers.resetAll()}async dispose(){for(let t of this.providers.values())await t.dispose();this.providers.clear(),this.metrics.clear(),this.cache.clear(),this.initialized=!1}async createProviders(){let t=new Set([this.config.primary,...this.config.fallbacks]);for(let e of t)try{let r=this.createProvider(e);this.providers.set(e,r)}catch(r){console.warn(`Failed to create ${e} provider: ${r instanceof Error?r.message:"Unknown"}`)}if(this.providers.size===0)throw a("No LLM providers could be initialized","PROVIDER_UNAVAILABLE",{retryable:!1})}createProvider(t){switch(t){case"claude":return new V(this.config.providers.claude);case"claude-code":return new Y(this.config.providers["claude-code"]);case"codex":return new J(this.config.providers.codex);case"cognitum":return new X(this.config.providers.cognitum);case"openai":return new Q(this.config.providers.openai);case"ollama":return new Z(this.config.providers.ollama);case"openrouter":return new ee(this.config.providers.openrouter);case"gemini":return new re(this.config.providers.gemini);case"azure-openai":{let e=this.config.providers["azure-openai"];if(!e)throw new Error("Azure OpenAI provider requires configuration with deploymentId");return new oe(e)}case"bedrock":return new se(this.config.providers.bedrock);default:return Ee(t)}}initializeMetrics(t){this.metrics.set(t,{totalRequests:0,successCount:0,failureCount:0,latencies:[],totalCost:0,totalTokens:0})}async executeWithFailover(t,e,r){let o=this.selectProvider(r),s=new Set,n,i=[o.provider.type,...this.config.fallbacks.filter(l=>l!==o.provider.type)];for(let l of i){if(s.has(l))continue;s.add(l);let p=this.providers.get(l);if(!p)continue;let m=this.circuitBreakers.getBreaker(l);if(m.canExecute())try{let c=Date.now(),u=await m.execute(()=>e(p)),d=Date.now()-c;return this.recordSuccess(l,d,u),u}catch(c){if(n=E(c),this.recordFailure(l,n),"retryable"in n&&!n.retryable)throw n}}throw a(`All providers failed for ${t}: ${n?.message??"Unknown error"}`,"PROVIDER_UNAVAILABLE",{retryable:!1,cause:n})}selectProvider(t){if(t){let r=this.providers.get(t),o=this.circuitBreakers.getBreaker(t);if(r&&o.canExecute())return{provider:r,reason:"primary"}}let e=this.getAvailableProviders();if(e.length===0){let r=this.providers.get(this.config.primary);if(r)return{provider:r,reason:"fallback"};throw a("No providers available","PROVIDER_UNAVAILABLE",{retryable:!1})}switch(this.config.loadBalancing){case"round-robin":return this.selectRoundRobin(e);case"least-cost":return this.selectLeastCost(e);case"least-latency":return this.selectLeastLatency(e);case"random":return this.selectRandom(e);default:return this.selectRoundRobin(e)}}selectRoundRobin(t){this.roundRobinIndex=(this.roundRobinIndex+1)%t.length;let e=t[this.roundRobinIndex];return{provider:this.providers.get(e),reason:"load-balance"}}selectLeastCost(t){let e=1/0,r=t[0];for(let o of t){let s=this.providers.get(o),{input:n,output:i}=s.getCostPerToken(),l=n+i;l<e&&(e=l,r=o)}return{provider:this.providers.get(r),reason:"cost-optimization",metadata:{estimatedCost:e}}}selectLeastLatency(t){let e=1/0,r=t[0];for(let o of t){let s=this.metrics.get(o);if(s&&s.latencies.length>0){let n=this.calculateAverage(s.latencies);n<e&&(e=n,r=o)}}return{provider:this.providers.get(r),reason:"latency-optimization",metadata:{avgLatency:e}}}selectRandom(t){let e=be(0,t.length),r=t[e];return{provider:this.providers.get(r),reason:"load-balance"}}recordSuccess(t,e,r){let o=this.metrics.get(t);if(o&&(o.totalRequests++,o.successCount++,o.latencies.push(e),o.latencies.length>1e3&&(o.latencies=o.latencies.slice(-1e3)),r&&typeof r=="object")){let s=r;s.cost?.totalCost&&(o.totalCost+=s.cost.totalCost),s.usage?.totalTokens&&(o.totalTokens+=s.usage.totalTokens)}}recordFailure(t,e){let r=this.metrics.get(t);r&&(r.totalRequests++,r.failureCount++)}async ensureInitialized(){this.initialized||await this.initialize()}calculateAverage(t){return t.length===0?0:t.reduce((e,r)=>e+r,0)/t.length}calculatePercentile(t,e){if(t.length===0)return 0;let r=[...t].sort((s,n)=>s-n),o=Math.ceil(e/100*r.length)-1;return r[Math.max(0,o)]}};export{je as a,he as b,Y as c,U as d,ge as e,Z as f,Ue as g};
52
+ `,h=await this.sha256(e),f=[d,m,c,p,u,h].join(`
53
+ `),b="AWS4-HMAC-SHA256",y=`${i}/${r.region}/${r.service}/aws4_request`,C=await this.sha256(f),v=[b,n,y,C].join(`
54
+ `),O=await this.getSignatureKey(r.secretAccessKey,i,r.region,r.service),R=await this.hmacHex(O,v),S=`${b} Credential=${r.accessKeyId}/${y}, SignedHeaders=${u}, Signature=${R}`;return{...l,Authorization:S}}async sha256(t){let r=new TextEncoder().encode(t),o=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(o)).map(s=>s.toString(16).padStart(2,"0")).join("")}async hmac(t,e){let r=new TextEncoder,o=t instanceof Uint8Array?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength):t,s=await crypto.subtle.importKey("raw",o,{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return crypto.subtle.sign("HMAC",s,r.encode(e))}async hmacHex(t,e){let r=await this.hmac(t,e);return Array.from(new Uint8Array(r)).map(o=>o.toString(16).padStart(2,"0")).join("")}async getSignatureKey(t,e,r,o){let s=new TextEncoder,n=await this.hmac(s.encode(`AWS4${t}`),e),i=await this.hmac(n,r),l=await this.hmac(i,o);return this.hmac(l,"aws4_request")}formatMessages(t){return typeof t=="string"?[{role:"user",content:t}]:t.filter(e=>e.role!=="system").map(e=>({role:e.role,content:e.content}))}mapFinishReason(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"stop_sequence":return"stop";default:return"stop"}}handleApiError(t,e,r){let o=e.message??"Unknown API error",s=e.__type??"";switch(t){case 401:case 403:throw a(o,"API_KEY_INVALID",{provider:"bedrock",model:r,retryable:!1});case 429:throw a(o,"RATE_LIMITED",{provider:"bedrock",model:r,retryable:!0,retryAfterMs:6e4});case 400:throw s.includes("ValidationException")&&o.includes("token")?a(o,"CONTEXT_LENGTH_EXCEEDED",{provider:"bedrock",model:r,retryable:!1}):a(o,"UNKNOWN",{provider:"bedrock",model:r,retryable:!1});case 500:case 502:case 503:throw a(o,"PROVIDER_UNAVAILABLE",{provider:"bedrock",model:r,retryable:!0,retryAfterMs:5e3});default:throw a(o,"UNKNOWN",{provider:"bedrock",model:r,retryable:!1})}}async fetchWithTimeout(t,e,r){let o=new AbortController,s=setTimeout(()=>o.abort(),r);try{return await fetch(t,{...e,signal:o.signal})}catch(n){throw n instanceof Error&&n.name==="AbortError"?a("Request timed out","TIMEOUT",{provider:"bedrock",retryable:!0}):n}finally{clearTimeout(s)}}sleep(t){return new Promise(e=>setTimeout(e,t))}};L();$();var yt={primary:"claude",fallbacks:["openai","ollama"],loadBalancing:"round-robin",providers:{},global:{enableCostTracking:!0,enableMetrics:!0}},De=class{providers=new Map;circuitBreakers;cache;costTracker;config;metrics=new Map;roundRobinIndex=0;initialized=!1;spendLedger;injectedLedger;maxCostPerRun;billingNoticeShown=!1;constructor(t={},e){this.config={...yt,...t},this.circuitBreakers=new W(e?.circuitBreakerConfig),this.cache=new z(e?.cacheConfig),this.costTracker=e?.costTracker??Ee(),this.injectedLedger=e?.spendLedger;let r=Number.parseFloat(process.env.AQE_MAX_BUDGET_USD??"");this.maxCostPerRun=this.config.global?.maxCostPerRun??(Number.isFinite(r)&&r>0?r:void 0)}async initialize(){if(!this.initialized){await this.createProviders();for(let t of this.providers.keys())this.initializeMetrics(t);this.budgetConfigured()&&(this.spendLedger=this.injectedLedger??await Me().catch(()=>new K)),this.emitBillingNotice(),this.initialized=!0}}budgetConfigured(){let t=this.config.global;return!!(this.maxCostPerRun||t?.maxCostPerHour&&t.maxCostPerHour>0||t?.maxCostPerDay&&t.maxCostPerDay>0)}emitBillingNotice(){if(this.billingNoticeShown||(process.env.AQE_LLM_NO_BILLING_NOTICE??"")==="1")return;let t=this.providers.get(this.config.primary);if(!t)return;let e=_e(t),r=Re(t.type,e);r&&console.error(r),this.billingNoticeShown=!0}enforceBudget(t,e){if(!this.budgetConfigured()||!this.spendLedger)return;let r=e?.model??this.providers.get(this.config.primary)?.getConfig().model??this.config.primary,o=typeof t=="string"?t:JSON.stringify(t),s=Math.ceil(o.length/4),n=e?.maxTokens??4096,i=this.costTracker.estimateCost(r,s,n).totalCost;if(i===0)return;let l=this.config.global,d=[{limit:this.maxCostPerRun,spent:this.costTracker.getCurrentCost("all"),label:"per-run"},{limit:l?.maxCostPerHour,spent:this.spendLedger.spentSince(36e5),label:"hourly"},{limit:l?.maxCostPerDay,spent:this.spendLedger.spentSince(864e5),label:"daily"}];for(let{limit:m,spent:c,label:u}of d)if(m&&m>0&&c+i>m)throw a(`LLM ${u} budget exceeded: $${c.toFixed(4)} spent + $${i.toFixed(4)} estimated > $${m.toFixed(2)} cap. Raise --max-budget-usd / maxCost* or switch to a local/subscription provider.`,"COST_LIMIT_EXCEEDED",{retryable:!1})}recordSpend(t,e){this.spendLedger&&this.spendLedger.record({provider:t.provider,model:t.model,costUsd:t.cost.totalCost,costSource:t.cost.source??"local-estimate",promptTokens:t.usage.promptTokens,completionTokens:t.usage.completionTokens,requestId:t.requestId,agent:e})}assertWithinBudget(t,e){this.enforceBudget(t,e)}recordResponseSpend(t,e){this.recordSpend(t,e)}async generate(t,e){if(await this.ensureInitialized(),!e?.skipCache){let o=typeof t=="string"?t:JSON.stringify(t),s=this.cache.getGeneration(o,e);if(s)return{...s,cached:!0}}this.enforceBudget(t,e);let r=await this.executeWithFailover("generate",async o=>o.generate(t,e),e?.preferredProvider);if(!e?.skipCache){let o=typeof t=="string"?t:JSON.stringify(t);this.cache.setGeneration(o,r,e)}return this.costTracker.recordUsage(r.provider,r.model,r.usage,r.requestId),this.recordSpend(r),r}async embed(t,e){if(await this.ensureInitialized(),!e?.skipCache){let s=this.cache.getEmbedding(t,{model:e?.model});if(s)return{...s,cached:!0}}let r=["openai","ollama","cognitum"],o=await this.executeWithFailover("embed",async s=>s.embed(t,e),r.find(s=>this.providers.has(s)));return e?.skipCache||this.cache.setEmbedding(t,o,{model:e?.model}),o}async complete(t,e){if(await this.ensureInitialized(),!e?.skipCache){let o=this.cache.getCompletion(t,e);if(o)return{...o,cached:!0}}this.enforceBudget(t,e);let r=await this.executeWithFailover("complete",async o=>o.complete(t,e));return e?.skipCache||this.cache.setCompletion(t,r,e),this.costTracker.recordUsage(r.provider,r.model,r.usage,`complete-${r.model}-${Date.now()}`),this.recordSpend({content:r.completion,model:r.model,provider:r.provider,usage:r.usage,cost:_.calculateCost(r.model,r.usage),latencyMs:r.latencyMs,finishReason:"stop",cached:r.cached,requestId:`complete-${r.model}-${Date.now()}`}),r}async healthCheck(){await this.ensureInitialized();let t={};for(let[e,r]of this.providers)t[e]=await r.healthCheck();return t}getProvider(t){return this.providers.get(t)}getAvailableProviders(){let t=[];for(let[e,r]of this.providers)this.circuitBreakers.getBreaker(e).canExecute()&&t.push(e);return t}getMetrics(){let t={};for(let[e,r]of this.metrics){let o=this.circuitBreakers.getBreaker(e),s=r.latencies.slice(-100);t[e]={provider:e,totalRequests:r.totalRequests,successCount:r.successCount,failureCount:r.failureCount,avgLatencyMs:this.calculateAverage(s),p95LatencyMs:this.calculatePercentile(s,95),p99LatencyMs:this.calculatePercentile(s,99),totalCost:r.totalCost,totalTokens:r.totalTokens,circuitState:o.getState()}}return t}getCacheStats(){return this.cache.getStats()}getCostSummary(t="day"){return this.costTracker.getSummary(t)}clearCache(){this.cache.clear()}resetCircuitBreakers(){this.circuitBreakers.resetAll()}async dispose(){for(let t of this.providers.values())await t.dispose();this.providers.clear(),this.metrics.clear(),this.cache.clear(),this.initialized=!1}async createProviders(){let t=new Set([this.config.primary,...this.config.fallbacks]);for(let e of t)try{let r=this.createProvider(e);this.providers.set(e,r)}catch(r){console.warn(`Failed to create ${e} provider: ${r instanceof Error?r.message:"Unknown"}`)}if(this.providers.size===0)throw a("No LLM providers could be initialized","PROVIDER_UNAVAILABLE",{retryable:!1})}createProvider(t){switch(t){case"claude":return new Y(this.config.providers.claude);case"claude-code":return new J(this.config.providers["claude-code"]);case"codex":return new X(this.config.providers.codex);case"cognitum":return new Q(this.config.providers.cognitum);case"openai":return new Z(this.config.providers.openai);case"ollama":return new ee(this.config.providers.ollama);case"openrouter":return new te(this.config.providers.openrouter);case"gemini":return new oe(this.config.providers.gemini);case"azure-openai":{let e=this.config.providers["azure-openai"];if(!e)throw new Error("Azure OpenAI provider requires configuration with deploymentId");return new se(e)}case"bedrock":return new ne(this.config.providers.bedrock);default:return Ce(t)}}initializeMetrics(t){this.metrics.set(t,{totalRequests:0,successCount:0,failureCount:0,latencies:[],totalCost:0,totalTokens:0})}async executeWithFailover(t,e,r){let o=this.selectProvider(r),s=new Set,n,i=[o.provider.type,...this.config.fallbacks.filter(l=>l!==o.provider.type)];for(let l of i){if(s.has(l))continue;s.add(l);let d=this.providers.get(l);if(!d)continue;let m=this.circuitBreakers.getBreaker(l);if(m.canExecute())try{let c=Date.now(),u=await m.execute(()=>e(d)),p=Date.now()-c;return this.recordSuccess(l,p,u),u}catch(c){if(n=E(c),this.recordFailure(l,n),"retryable"in n&&!n.retryable)throw n}}throw a(`All providers failed for ${t}: ${n?.message??"Unknown error"}`,"PROVIDER_UNAVAILABLE",{retryable:!1,cause:n})}selectProvider(t){if(t){let r=this.providers.get(t),o=this.circuitBreakers.getBreaker(t);if(r&&o.canExecute())return{provider:r,reason:"primary"}}let e=this.getAvailableProviders();if(e.length===0){let r=this.providers.get(this.config.primary);if(r)return{provider:r,reason:"fallback"};throw a("No providers available","PROVIDER_UNAVAILABLE",{retryable:!1})}switch(this.config.loadBalancing){case"round-robin":return this.selectRoundRobin(e);case"least-cost":return this.selectLeastCost(e);case"least-latency":return this.selectLeastLatency(e);case"random":return this.selectRandom(e);default:return this.selectRoundRobin(e)}}selectRoundRobin(t){this.roundRobinIndex=(this.roundRobinIndex+1)%t.length;let e=t[this.roundRobinIndex];return{provider:this.providers.get(e),reason:"load-balance"}}selectLeastCost(t){let e=1/0,r=t[0];for(let o of t){let s=this.providers.get(o),{input:n,output:i}=s.getCostPerToken(),l=n+i;l<e&&(e=l,r=o)}return{provider:this.providers.get(r),reason:"cost-optimization",metadata:{estimatedCost:e}}}selectLeastLatency(t){let e=1/0,r=t[0];for(let o of t){let s=this.metrics.get(o);if(s&&s.latencies.length>0){let n=this.calculateAverage(s.latencies);n<e&&(e=n,r=o)}}return{provider:this.providers.get(r),reason:"latency-optimization",metadata:{avgLatency:e}}}selectRandom(t){let e=ve(0,t.length),r=t[e];return{provider:this.providers.get(r),reason:"load-balance"}}recordSuccess(t,e,r){let o=this.metrics.get(t);if(o&&(o.totalRequests++,o.successCount++,o.latencies.push(e),o.latencies.length>1e3&&(o.latencies=o.latencies.slice(-1e3)),r&&typeof r=="object")){let s=r;s.cost?.totalCost&&(o.totalCost+=s.cost.totalCost),s.usage?.totalTokens&&(o.totalTokens+=s.usage.totalTokens)}}recordFailure(t,e){let r=this.metrics.get(t);r&&(r.totalRequests++,r.failureCount++)}async ensureInitialized(){this.initialized||await this.initialize()}calculateAverage(t){return t.length===0?0:t.reduce((e,r)=>e+r,0)/t.length}calculatePercentile(t,e){if(t.length===0)return 0;let r=[...t].sort((s,n)=>s-n),o=Math.ceil(e/100*r.length)-1;return r[Math.max(0,o)]}};export{Ve as a,ge as b,J as c,N as d,fe as e,ee as f,De as g};
@@ -1,4 +1,4 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.14.7");process.exit(0)}
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.0");process.exit(0)}
2
2
  import{createHash as l}from"crypto";var u="0".repeat(64);function k(t){return l("sha256").update(t,"utf-8").digest("hex")}function v(t){try{return l("shake256",{outputLength:32}).update(t,"utf-8").digest("hex")}catch{return k(t)}}function o(t,e){return t==="shake256"?v(e):k(e)}function h(t){return JSON.stringify({id:t.id,prev_hash:t.prev_hash,action_hash:t.action_hash,action_type:t.action_type,action_data:t.action_data,timestamp:t.timestamp,actor:t.actor})}function c(t){return Buffer.from(t.prev_hash+t.action_hash+t.action_type+t.timestamp+t.actor,"utf-8")}var m="CHAIN_REANCHOR";function y(t){return o(t.hash_algo||"sha256",h(t))}var f=class{constructor(e,n,i={}){this.db=e;this.keyManager=n;this.options=i}db;keyManager;options;archiveRows=null;parentIndex=new Map;acks=new Map;pins=[];forks=[];tamper;signatureFailures=0;firstSignatureFailure;entriesChecked=0;archiveExists;run(){let e=g(this.db,"witness_chain")?this.db.prepare("SELECT * FROM witness_chain ORDER BY id ASC").all():[];return e.length===0?this.getArchive().length>0?(this.tamper={id:1,reason:"live-chain-missing"},this.result(1)):{valid:!0,entriesChecked:0,status:"valid",tampered:!1,forks:[],acknowledgedForks:[],forkDetails:[]}:(this.walk(e,"live")&&this.options.includeArchive&&this.walk(this.getArchive(),"archive"),this.tamper||this.checkPins(),this.result(e[0].id))}walk(e,n){for(let i=0;i<e.length;i++){let r=e[i];this.entriesChecked++;let s=this.classify(r,i>0?e[i-1]:void 0);if(s.kind==="tamper")return this.tamper={id:r.id,reason:s.reason},!1;if(s.kind==="fork")this.forks.push({id:r.id,parentId:s.parentId,prevHash:r.prev_hash,actionHash:r.action_hash,table:n,acknowledged:!1});else if(r.action_type===m){if(this.checkSignature(r)==="invalid")return this.tamper={id:r.id,reason:"reanchor-signature-invalid"},!1;this.registerReanchor(r)}this.checkAllSignatures(r)}return!0}classify(e,n){let i=e.hash_algo||"sha256";if(e.action_hash!==o(i,e.action_data))return{kind:"tamper",reason:"action-hash-mismatch"};if(e.id===1)return e.prev_hash===u?{kind:"linked"}:{kind:"tamper",reason:"genesis-link-mismatch"};if(n&&e.prev_hash===o(i,h(n)))return this.idsContiguous(n.id,e.id)?{kind:"linked"}:{kind:"tamper",reason:"id-gap"};let r=this.findEntryById(e.id-1);if(r&&e.prev_hash===o(i,h(r)))return{kind:"linked"};let s=this.lookupParent(i,e.prev_hash);return s!==void 0&&s<e.id?this.idsContiguous(s,e.id)?this.checkSignature(e)==="invalid"?{kind:"tamper",reason:"fork-signature-invalid"}:{kind:"fork",parentId:s}:{kind:"tamper",reason:"id-gap"}:{kind:"tamper",reason:e.prev_hash===u?"unlinked-genesis-prev-hash":"unlinked-prev-hash"}}findEntryById(e){return this.db.prepare("SELECT * FROM witness_chain WHERE id = ?").get(e)??(this.hasArchive()?this.db.prepare("SELECT * FROM witness_chain_archive WHERE id = ?").get(e):void 0)}getArchive(){return this.archiveRows||(this.archiveRows=this.hasArchive()?this.db.prepare("SELECT * FROM witness_chain_archive ORDER BY id ASC").all():[]),this.archiveRows}hasArchive(){return this.archiveExists===void 0&&(this.archiveExists=g(this.db,"witness_chain_archive")),this.archiveExists}lookupParent(e,n){let i=this.parentIndex.get(e);if(!i){i=new Map;let r=this.db.prepare("SELECT * FROM witness_chain").iterate();for(let s of r)i.set(o(e,h(s)),s.id);for(let s of this.getArchive()){let d=o(e,h(s));i.has(d)||i.set(d,s.id)}this.parentIndex.set(e,i)}return i.get(n)}idsContiguous(e,n){let i=n-e-1;return i<=0?!0:(this.hasArchive()?this.db.prepare(`SELECT COUNT(*) AS n FROM (
3
3
  SELECT id FROM witness_chain WHERE id > ? AND id < ?
4
4
  UNION SELECT id FROM witness_chain_archive WHERE id > ? AND id < ?)`).get(e,n,e,n):this.db.prepare("SELECT COUNT(*) AS n FROM witness_chain WHERE id > ? AND id < ?").get(e,n)).n===i}checkSignature(e){return!e.signature||!e.signer_key_id?"unsigned":!this.keyManager||!this.keyManager.hasKey(e.signer_key_id)?"unverifiable":this.keyManager.verify(c(e),Buffer.from(e.signature,"hex"),e.signer_key_id)?"ok":"invalid"}checkAllSignatures(e){if(this.options.checkSignatures!==!0||!this.keyManager||!e.signature||!e.signer_key_id)return;this.keyManager.verify(c(e),Buffer.from(e.signature,"hex"),e.signer_key_id)||(this.signatureFailures++,this.firstSignatureFailure??=e.id)}registerReanchor(e){let n;try{n=JSON.parse(e.action_data)??{}}catch{return}if(Array.isArray(n.forks))for(let i of n.forks){if(typeof i?.id!="number"||i.id>=e.id||typeof i.parentId!="number"||typeof i.prevHash!="string"||typeof i.actionHash!="string")continue;let r=this.acks.get(i.id)??[];r.push({id:i.id,parentId:i.parentId,prevHash:i.prevHash,actionHash:i.actionHash}),this.acks.set(i.id,r)}if(Array.isArray(n.pins))for(let i of n.pins)typeof i?.id=="number"&&typeof i.hash=="string"&&this.pins.push({id:i.id,hash:i.hash})}checkPins(){for(let e of this.pins){let n=this.findEntryById(e.id);if(!n||y(n)!==e.hash){this.tamper={id:e.id,reason:"reanchored-row-changed"};return}}}result(e){for(let a of this.forks)a.acknowledged=(this.acks.get(a.id)??[]).some(p=>p.parentId===a.parentId&&p.prevHash===a.prevHash&&p.actionHash===a.actionHash);let n=this.forks.filter(a=>!a.acknowledged),i=this.tamper!==void 0||this.signatureFailures>0,r=i?"tampered":n.length>0?"forked":this.forks.length>0?"valid-with-forks":"valid",s=r==="valid"||r==="valid-with-forks",d=n[0]?.id??this.tamper?.id??(this.signatureFailures>0?e:void 0);return{valid:s,entriesChecked:this.entriesChecked,signatureFailures:this.signatureFailures,status:r,tampered:i,forks:this.forks.map(a=>a.id),acknowledgedForks:this.forks.filter(a=>a.acknowledged).map(a=>a.id),forkDetails:this.forks,...d!==void 0&&!s?{brokenAt:d}:{},...i?{tamperedAt:this.tamper?.id??this.firstSignatureFailure,tamperReason:this.tamper?.reason??"signature-invalid"}:{}}}};function R(t,e,n){return new f(t,e,n).run()}function g(t,e){return t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(e)!==void 0}export{u as a,k as b,v as c,o as d,h as e,c as f,m as g,y as h,f as i,R as j,g as k};