@substrate-ai/core 0.19.54

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 (486) hide show
  1. package/README.md +55 -0
  2. package/dist/__tests__/adapter.test.d.ts +12 -0
  3. package/dist/__tests__/adapter.test.d.ts.map +1 -0
  4. package/dist/__tests__/adapter.test.js +259 -0
  5. package/dist/__tests__/adapter.test.js.map +1 -0
  6. package/dist/__tests__/event-bus.test.d.ts +14 -0
  7. package/dist/__tests__/event-bus.test.d.ts.map +1 -0
  8. package/dist/__tests__/event-bus.test.js +199 -0
  9. package/dist/__tests__/event-bus.test.js.map +1 -0
  10. package/dist/__tests__/output-quality.test.d.ts +8 -0
  11. package/dist/__tests__/output-quality.test.d.ts.map +1 -0
  12. package/dist/__tests__/output-quality.test.js +166 -0
  13. package/dist/__tests__/output-quality.test.js.map +1 -0
  14. package/dist/__tests__/schema-suffix.test.d.ts +9 -0
  15. package/dist/__tests__/schema-suffix.test.d.ts.map +1 -0
  16. package/dist/__tests__/schema-suffix.test.js +126 -0
  17. package/dist/__tests__/schema-suffix.test.js.map +1 -0
  18. package/dist/__tests__/yaml-parser.test.d.ts +18 -0
  19. package/dist/__tests__/yaml-parser.test.d.ts.map +1 -0
  20. package/dist/__tests__/yaml-parser.test.js +475 -0
  21. package/dist/__tests__/yaml-parser.test.js.map +1 -0
  22. package/dist/__type-checks__.d.ts +11 -0
  23. package/dist/__type-checks__.d.ts.map +1 -0
  24. package/dist/__type-checks__.js +19 -0
  25. package/dist/__type-checks__.js.map +1 -0
  26. package/dist/adapters/__tests__/adapter-output-normalizer.test.d.ts +12 -0
  27. package/dist/adapters/__tests__/adapter-output-normalizer.test.d.ts.map +1 -0
  28. package/dist/adapters/__tests__/adapter-output-normalizer.test.js +193 -0
  29. package/dist/adapters/__tests__/adapter-output-normalizer.test.js.map +1 -0
  30. package/dist/adapters/adapter-format-error.d.ts +35 -0
  31. package/dist/adapters/adapter-format-error.d.ts.map +1 -0
  32. package/dist/adapters/adapter-format-error.js +38 -0
  33. package/dist/adapters/adapter-format-error.js.map +1 -0
  34. package/dist/adapters/adapter-output-normalizer.d.ts +50 -0
  35. package/dist/adapters/adapter-output-normalizer.d.ts.map +1 -0
  36. package/dist/adapters/adapter-output-normalizer.js +233 -0
  37. package/dist/adapters/adapter-output-normalizer.js.map +1 -0
  38. package/dist/adapters/adapter-registry.d.ts +50 -0
  39. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  40. package/dist/adapters/adapter-registry.js +101 -0
  41. package/dist/adapters/adapter-registry.js.map +1 -0
  42. package/dist/adapters/claude-adapter.d.ts +59 -0
  43. package/dist/adapters/claude-adapter.d.ts.map +1 -0
  44. package/dist/adapters/claude-adapter.js +367 -0
  45. package/dist/adapters/claude-adapter.js.map +1 -0
  46. package/dist/adapters/codex-adapter.d.ts +64 -0
  47. package/dist/adapters/codex-adapter.d.ts.map +1 -0
  48. package/dist/adapters/codex-adapter.js +263 -0
  49. package/dist/adapters/codex-adapter.js.map +1 -0
  50. package/dist/adapters/gemini-adapter.d.ts +57 -0
  51. package/dist/adapters/gemini-adapter.d.ts.map +1 -0
  52. package/dist/adapters/gemini-adapter.js +311 -0
  53. package/dist/adapters/gemini-adapter.js.map +1 -0
  54. package/dist/adapters/index.d.ts +10 -0
  55. package/dist/adapters/index.d.ts.map +1 -0
  56. package/dist/adapters/index.js +14 -0
  57. package/dist/adapters/index.js.map +1 -0
  58. package/dist/adapters/schemas.d.ts +137 -0
  59. package/dist/adapters/schemas.d.ts.map +1 -0
  60. package/dist/adapters/schemas.js +140 -0
  61. package/dist/adapters/schemas.js.map +1 -0
  62. package/dist/adapters/types.d.ts +245 -0
  63. package/dist/adapters/types.d.ts.map +1 -0
  64. package/dist/adapters/types.js +6 -0
  65. package/dist/adapters/types.js.map +1 -0
  66. package/dist/adapters/worker-adapter.d.ts +188 -0
  67. package/dist/adapters/worker-adapter.d.ts.map +1 -0
  68. package/dist/adapters/worker-adapter.js +19 -0
  69. package/dist/adapters/worker-adapter.js.map +1 -0
  70. package/dist/budget/budget-tracker.d.ts +22 -0
  71. package/dist/budget/budget-tracker.d.ts.map +1 -0
  72. package/dist/budget/budget-tracker.js +39 -0
  73. package/dist/budget/budget-tracker.js.map +1 -0
  74. package/dist/budget/index.d.ts +6 -0
  75. package/dist/budget/index.d.ts.map +1 -0
  76. package/dist/budget/index.js +5 -0
  77. package/dist/budget/index.js.map +1 -0
  78. package/dist/config/config-migrator.d.ts +58 -0
  79. package/dist/config/config-migrator.d.ts.map +1 -0
  80. package/dist/config/config-migrator.js +158 -0
  81. package/dist/config/config-migrator.js.map +1 -0
  82. package/dist/config/config-system-impl.d.ts +63 -0
  83. package/dist/config/config-system-impl.d.ts.map +1 -0
  84. package/dist/config/config-system-impl.js +364 -0
  85. package/dist/config/config-system-impl.js.map +1 -0
  86. package/dist/config/config-watcher.d.ts +59 -0
  87. package/dist/config/config-watcher.d.ts.map +1 -0
  88. package/dist/config/config-watcher.js +137 -0
  89. package/dist/config/config-watcher.js.map +1 -0
  90. package/dist/config/defaults.d.ts +13 -0
  91. package/dist/config/defaults.d.ts.map +1 -0
  92. package/dist/config/defaults.js +62 -0
  93. package/dist/config/defaults.js.map +1 -0
  94. package/dist/config/errors.d.ts +25 -0
  95. package/dist/config/errors.d.ts.map +1 -0
  96. package/dist/config/errors.js +49 -0
  97. package/dist/config/errors.js.map +1 -0
  98. package/dist/config/index.d.ts +19 -0
  99. package/dist/config/index.d.ts.map +1 -0
  100. package/dist/config/index.js +39 -0
  101. package/dist/config/index.js.map +1 -0
  102. package/dist/config/types.d.ts +456 -0
  103. package/dist/config/types.d.ts.map +1 -0
  104. package/dist/config/types.js +174 -0
  105. package/dist/config/types.js.map +1 -0
  106. package/dist/config/version-utils.d.ts +39 -0
  107. package/dist/config/version-utils.d.ts.map +1 -0
  108. package/dist/config/version-utils.js +66 -0
  109. package/dist/config/version-utils.js.map +1 -0
  110. package/dist/context/index.d.ts +2 -0
  111. package/dist/context/index.d.ts.map +1 -0
  112. package/dist/context/index.js +2 -0
  113. package/dist/context/index.js.map +1 -0
  114. package/dist/context/types.d.ts +113 -0
  115. package/dist/context/types.d.ts.map +1 -0
  116. package/dist/context/types.js +59 -0
  117. package/dist/context/types.js.map +1 -0
  118. package/dist/cost-tracker/cost-tracker-impl.d.ts +51 -0
  119. package/dist/cost-tracker/cost-tracker-impl.d.ts.map +1 -0
  120. package/dist/cost-tracker/cost-tracker-impl.js +85 -0
  121. package/dist/cost-tracker/cost-tracker-impl.js.map +1 -0
  122. package/dist/cost-tracker/cost-tracker-subscriber.d.ts +31 -0
  123. package/dist/cost-tracker/cost-tracker-subscriber.d.ts.map +1 -0
  124. package/dist/cost-tracker/cost-tracker-subscriber.js +116 -0
  125. package/dist/cost-tracker/cost-tracker-subscriber.js.map +1 -0
  126. package/dist/cost-tracker/index.d.ts +11 -0
  127. package/dist/cost-tracker/index.d.ts.map +1 -0
  128. package/dist/cost-tracker/index.js +7 -0
  129. package/dist/cost-tracker/index.js.map +1 -0
  130. package/dist/cost-tracker/token-rates.d.ts +25 -0
  131. package/dist/cost-tracker/token-rates.d.ts.map +1 -0
  132. package/dist/cost-tracker/token-rates.js +99 -0
  133. package/dist/cost-tracker/token-rates.js.map +1 -0
  134. package/dist/cost-tracker/types.d.ts +6 -0
  135. package/dist/cost-tracker/types.d.ts.map +1 -0
  136. package/dist/cost-tracker/types.js +2 -0
  137. package/dist/cost-tracker/types.js.map +1 -0
  138. package/dist/dispatch/dispatcher-impl.d.ts +92 -0
  139. package/dist/dispatch/dispatcher-impl.d.ts.map +1 -0
  140. package/dist/dispatch/dispatcher-impl.js +847 -0
  141. package/dist/dispatch/dispatcher-impl.js.map +1 -0
  142. package/dist/dispatch/index.d.ts +15 -0
  143. package/dist/dispatch/index.d.ts.map +1 -0
  144. package/dist/dispatch/index.js +14 -0
  145. package/dist/dispatch/index.js.map +1 -0
  146. package/dist/dispatch/interface-change-detector.d.ts +46 -0
  147. package/dist/dispatch/interface-change-detector.d.ts.map +1 -0
  148. package/dist/dispatch/interface-change-detector.js +135 -0
  149. package/dist/dispatch/interface-change-detector.js.map +1 -0
  150. package/dist/dispatch/output-quality.d.ts +43 -0
  151. package/dist/dispatch/output-quality.d.ts.map +1 -0
  152. package/dist/dispatch/output-quality.js +148 -0
  153. package/dist/dispatch/output-quality.js.map +1 -0
  154. package/dist/dispatch/types.d.ts +271 -0
  155. package/dist/dispatch/types.d.ts.map +1 -0
  156. package/dist/dispatch/types.js +76 -0
  157. package/dist/dispatch/types.js.map +1 -0
  158. package/dist/dispatch/yaml-parser.d.ts +40 -0
  159. package/dist/dispatch/yaml-parser.d.ts.map +1 -0
  160. package/dist/dispatch/yaml-parser.js +323 -0
  161. package/dist/dispatch/yaml-parser.js.map +1 -0
  162. package/dist/events/core-events.d.ts +288 -0
  163. package/dist/events/core-events.d.ts.map +1 -0
  164. package/dist/events/core-events.js +10 -0
  165. package/dist/events/core-events.js.map +1 -0
  166. package/dist/events/event-bus.d.ts +55 -0
  167. package/dist/events/event-bus.d.ts.map +1 -0
  168. package/dist/events/event-bus.js +52 -0
  169. package/dist/events/event-bus.js.map +1 -0
  170. package/dist/events/index.d.ts +9 -0
  171. package/dist/events/index.d.ts.map +1 -0
  172. package/dist/events/index.js +6 -0
  173. package/dist/events/index.js.map +1 -0
  174. package/dist/events/types.d.ts +21 -0
  175. package/dist/events/types.d.ts.map +1 -0
  176. package/dist/events/types.js +8 -0
  177. package/dist/events/types.js.map +1 -0
  178. package/dist/git/git-manager.d.ts +31 -0
  179. package/dist/git/git-manager.d.ts.map +1 -0
  180. package/dist/git/git-manager.js +46 -0
  181. package/dist/git/git-manager.js.map +1 -0
  182. package/dist/git/git-utils.d.ts +166 -0
  183. package/dist/git/git-utils.d.ts.map +1 -0
  184. package/dist/git/git-utils.js +347 -0
  185. package/dist/git/git-utils.js.map +1 -0
  186. package/dist/git/git-worktree-manager-impl.d.ts +58 -0
  187. package/dist/git/git-worktree-manager-impl.d.ts.map +1 -0
  188. package/dist/git/git-worktree-manager-impl.js +336 -0
  189. package/dist/git/git-worktree-manager-impl.js.map +1 -0
  190. package/dist/git/git-worktree-manager.d.ts +122 -0
  191. package/dist/git/git-worktree-manager.d.ts.map +1 -0
  192. package/dist/git/git-worktree-manager.js +14 -0
  193. package/dist/git/git-worktree-manager.js.map +1 -0
  194. package/dist/git/index.d.ts +11 -0
  195. package/dist/git/index.d.ts.map +1 -0
  196. package/dist/git/index.js +8 -0
  197. package/dist/git/index.js.map +1 -0
  198. package/dist/index.d.ts +33 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +47 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/llm/client.d.ts +42 -0
  203. package/dist/llm/client.d.ts.map +1 -0
  204. package/dist/llm/client.js +27 -0
  205. package/dist/llm/client.js.map +1 -0
  206. package/dist/monitor/index.d.ts +15 -0
  207. package/dist/monitor/index.d.ts.map +1 -0
  208. package/dist/monitor/index.js +9 -0
  209. package/dist/monitor/index.js.map +1 -0
  210. package/dist/monitor/monitor-agent-impl.d.ts +56 -0
  211. package/dist/monitor/monitor-agent-impl.d.ts.map +1 -0
  212. package/dist/monitor/monitor-agent-impl.js +178 -0
  213. package/dist/monitor/monitor-agent-impl.js.map +1 -0
  214. package/dist/monitor/monitor-agent.d.ts +36 -0
  215. package/dist/monitor/monitor-agent.d.ts.map +1 -0
  216. package/dist/monitor/monitor-agent.js +6 -0
  217. package/dist/monitor/monitor-agent.js.map +1 -0
  218. package/dist/monitor/performance-aggregates.d.ts +41 -0
  219. package/dist/monitor/performance-aggregates.d.ts.map +1 -0
  220. package/dist/monitor/performance-aggregates.js +6 -0
  221. package/dist/monitor/performance-aggregates.js.map +1 -0
  222. package/dist/monitor/recommendation-engine.d.ts +27 -0
  223. package/dist/monitor/recommendation-engine.d.ts.map +1 -0
  224. package/dist/monitor/recommendation-engine.js +140 -0
  225. package/dist/monitor/recommendation-engine.js.map +1 -0
  226. package/dist/monitor/recommendation-types.d.ts +30 -0
  227. package/dist/monitor/recommendation-types.d.ts.map +1 -0
  228. package/dist/monitor/recommendation-types.js +43 -0
  229. package/dist/monitor/recommendation-types.js.map +1 -0
  230. package/dist/monitor/report-generator.d.ts +48 -0
  231. package/dist/monitor/report-generator.d.ts.map +1 -0
  232. package/dist/monitor/report-generator.js +123 -0
  233. package/dist/monitor/report-generator.js.map +1 -0
  234. package/dist/monitor/task-type-classifier.d.ts +19 -0
  235. package/dist/monitor/task-type-classifier.d.ts.map +1 -0
  236. package/dist/monitor/task-type-classifier.js +68 -0
  237. package/dist/monitor/task-type-classifier.js.map +1 -0
  238. package/dist/persistence/adapter.d.ts +4 -0
  239. package/dist/persistence/adapter.d.ts.map +1 -0
  240. package/dist/persistence/adapter.js +56 -0
  241. package/dist/persistence/adapter.js.map +1 -0
  242. package/dist/persistence/cost-types.d.ts +87 -0
  243. package/dist/persistence/cost-types.d.ts.map +1 -0
  244. package/dist/persistence/cost-types.js +14 -0
  245. package/dist/persistence/cost-types.js.map +1 -0
  246. package/dist/persistence/dolt-adapter-transaction.test.d.ts +10 -0
  247. package/dist/persistence/dolt-adapter-transaction.test.d.ts.map +1 -0
  248. package/dist/persistence/dolt-adapter-transaction.test.js +359 -0
  249. package/dist/persistence/dolt-adapter-transaction.test.js.map +1 -0
  250. package/dist/persistence/dolt-adapter.d.ts +77 -0
  251. package/dist/persistence/dolt-adapter.d.ts.map +1 -0
  252. package/dist/persistence/dolt-adapter.js +98 -0
  253. package/dist/persistence/dolt-adapter.js.map +1 -0
  254. package/dist/persistence/dolt-client.d.ts +69 -0
  255. package/dist/persistence/dolt-client.d.ts.map +1 -0
  256. package/dist/persistence/dolt-client.js +278 -0
  257. package/dist/persistence/dolt-client.js.map +1 -0
  258. package/dist/persistence/dolt-errors.d.ts +10 -0
  259. package/dist/persistence/dolt-errors.d.ts.map +1 -0
  260. package/dist/persistence/dolt-errors.js +15 -0
  261. package/dist/persistence/dolt-errors.js.map +1 -0
  262. package/dist/persistence/dolt-init.d.ts +64 -0
  263. package/dist/persistence/dolt-init.d.ts.map +1 -0
  264. package/dist/persistence/dolt-init.js +233 -0
  265. package/dist/persistence/dolt-init.js.map +1 -0
  266. package/dist/persistence/index.d.ts +23 -0
  267. package/dist/persistence/index.d.ts.map +1 -0
  268. package/dist/persistence/index.js +23 -0
  269. package/dist/persistence/index.js.map +1 -0
  270. package/dist/persistence/memory-adapter.d.ts +156 -0
  271. package/dist/persistence/memory-adapter.d.ts.map +1 -0
  272. package/dist/persistence/memory-adapter.js +1167 -0
  273. package/dist/persistence/memory-adapter.js.map +1 -0
  274. package/dist/persistence/monitor-database.d.ts +113 -0
  275. package/dist/persistence/monitor-database.d.ts.map +1 -0
  276. package/dist/persistence/monitor-database.js +345 -0
  277. package/dist/persistence/monitor-database.js.map +1 -0
  278. package/dist/persistence/queries/amendments.d.ts +91 -0
  279. package/dist/persistence/queries/amendments.d.ts.map +1 -0
  280. package/dist/persistence/queries/amendments.js +185 -0
  281. package/dist/persistence/queries/amendments.js.map +1 -0
  282. package/dist/persistence/queries/cost.d.ts +130 -0
  283. package/dist/persistence/queries/cost.d.ts.map +1 -0
  284. package/dist/persistence/queries/cost.js +384 -0
  285. package/dist/persistence/queries/cost.js.map +1 -0
  286. package/dist/persistence/queries/decisions.d.ts +131 -0
  287. package/dist/persistence/queries/decisions.d.ts.map +1 -0
  288. package/dist/persistence/queries/decisions.js +339 -0
  289. package/dist/persistence/queries/decisions.js.map +1 -0
  290. package/dist/persistence/queries/metrics.d.ts +155 -0
  291. package/dist/persistence/queries/metrics.d.ts.map +1 -0
  292. package/dist/persistence/queries/metrics.js +237 -0
  293. package/dist/persistence/queries/metrics.js.map +1 -0
  294. package/dist/persistence/queries/retry-escalated.d.ts +35 -0
  295. package/dist/persistence/queries/retry-escalated.d.ts.map +1 -0
  296. package/dist/persistence/queries/retry-escalated.js +83 -0
  297. package/dist/persistence/queries/retry-escalated.js.map +1 -0
  298. package/dist/persistence/schema-version.d.ts +89 -0
  299. package/dist/persistence/schema-version.d.ts.map +1 -0
  300. package/dist/persistence/schema-version.js +67 -0
  301. package/dist/persistence/schema-version.js.map +1 -0
  302. package/dist/persistence/schema.d.ts +26 -0
  303. package/dist/persistence/schema.d.ts.map +1 -0
  304. package/dist/persistence/schema.js +509 -0
  305. package/dist/persistence/schema.js.map +1 -0
  306. package/dist/persistence/schemas/decisions.d.ts +176 -0
  307. package/dist/persistence/schemas/decisions.d.ts.map +1 -0
  308. package/dist/persistence/schemas/decisions.js +139 -0
  309. package/dist/persistence/schemas/decisions.js.map +1 -0
  310. package/dist/persistence/schemas/operational.d.ts +194 -0
  311. package/dist/persistence/schemas/operational.d.ts.map +1 -0
  312. package/dist/persistence/schemas/operational.js +197 -0
  313. package/dist/persistence/schemas/operational.js.map +1 -0
  314. package/dist/persistence/types.d.ts +98 -0
  315. package/dist/persistence/types.d.ts.map +1 -0
  316. package/dist/persistence/types.js +22 -0
  317. package/dist/persistence/types.js.map +1 -0
  318. package/dist/quality-gates/index.d.ts +2 -0
  319. package/dist/quality-gates/index.d.ts.map +1 -0
  320. package/dist/quality-gates/index.js +2 -0
  321. package/dist/quality-gates/index.js.map +1 -0
  322. package/dist/quality-gates/types.d.ts +106 -0
  323. package/dist/quality-gates/types.d.ts.map +1 -0
  324. package/dist/quality-gates/types.js +5 -0
  325. package/dist/quality-gates/types.js.map +1 -0
  326. package/dist/routing/index.d.ts +19 -0
  327. package/dist/routing/index.d.ts.map +1 -0
  328. package/dist/routing/index.js +32 -0
  329. package/dist/routing/index.js.map +1 -0
  330. package/dist/routing/model-routing-config.d.ts +75 -0
  331. package/dist/routing/model-routing-config.d.ts.map +1 -0
  332. package/dist/routing/model-routing-config.js +110 -0
  333. package/dist/routing/model-routing-config.js.map +1 -0
  334. package/dist/routing/model-routing-resolver.d.ts +48 -0
  335. package/dist/routing/model-routing-resolver.d.ts.map +1 -0
  336. package/dist/routing/model-routing-resolver.js +105 -0
  337. package/dist/routing/model-routing-resolver.js.map +1 -0
  338. package/dist/routing/model-tier.d.ts +21 -0
  339. package/dist/routing/model-tier.d.ts.map +1 -0
  340. package/dist/routing/model-tier.js +34 -0
  341. package/dist/routing/model-tier.js.map +1 -0
  342. package/dist/routing/provider-status.d.ts +99 -0
  343. package/dist/routing/provider-status.d.ts.map +1 -0
  344. package/dist/routing/provider-status.js +163 -0
  345. package/dist/routing/provider-status.js.map +1 -0
  346. package/dist/routing/routing-decision.d.ts +127 -0
  347. package/dist/routing/routing-decision.d.ts.map +1 -0
  348. package/dist/routing/routing-decision.js +111 -0
  349. package/dist/routing/routing-decision.js.map +1 -0
  350. package/dist/routing/routing-engine-impl.d.ts +132 -0
  351. package/dist/routing/routing-engine-impl.d.ts.map +1 -0
  352. package/dist/routing/routing-engine-impl.js +450 -0
  353. package/dist/routing/routing-engine-impl.js.map +1 -0
  354. package/dist/routing/routing-engine.d.ts +83 -0
  355. package/dist/routing/routing-engine.d.ts.map +1 -0
  356. package/dist/routing/routing-engine.js +24 -0
  357. package/dist/routing/routing-engine.js.map +1 -0
  358. package/dist/routing/routing-policy.d.ts +138 -0
  359. package/dist/routing/routing-policy.d.ts.map +1 -0
  360. package/dist/routing/routing-policy.js +159 -0
  361. package/dist/routing/routing-policy.js.map +1 -0
  362. package/dist/routing/routing-recommender.d.ts +60 -0
  363. package/dist/routing/routing-recommender.d.ts.map +1 -0
  364. package/dist/routing/routing-recommender.js +209 -0
  365. package/dist/routing/routing-recommender.js.map +1 -0
  366. package/dist/routing/routing-telemetry.d.ts +36 -0
  367. package/dist/routing/routing-telemetry.d.ts.map +1 -0
  368. package/dist/routing/routing-telemetry.js +39 -0
  369. package/dist/routing/routing-telemetry.js.map +1 -0
  370. package/dist/routing/routing-token-accumulator.d.ts +68 -0
  371. package/dist/routing/routing-token-accumulator.d.ts.map +1 -0
  372. package/dist/routing/routing-token-accumulator.js +111 -0
  373. package/dist/routing/routing-token-accumulator.js.map +1 -0
  374. package/dist/routing/routing-tuner.d.ts +69 -0
  375. package/dist/routing/routing-tuner.d.ts.map +1 -0
  376. package/dist/routing/routing-tuner.js +217 -0
  377. package/dist/routing/routing-tuner.js.map +1 -0
  378. package/dist/routing/types.d.ts +152 -0
  379. package/dist/routing/types.d.ts.map +1 -0
  380. package/dist/routing/types.js +13 -0
  381. package/dist/routing/types.js.map +1 -0
  382. package/dist/supervisor/analysis.d.ts +178 -0
  383. package/dist/supervisor/analysis.d.ts.map +1 -0
  384. package/dist/supervisor/analysis.js +420 -0
  385. package/dist/supervisor/analysis.js.map +1 -0
  386. package/dist/supervisor/experimenter.d.ts +118 -0
  387. package/dist/supervisor/experimenter.d.ts.map +1 -0
  388. package/dist/supervisor/experimenter.js +493 -0
  389. package/dist/supervisor/experimenter.js.map +1 -0
  390. package/dist/supervisor/index.d.ts +13 -0
  391. package/dist/supervisor/index.d.ts.map +1 -0
  392. package/dist/supervisor/index.js +11 -0
  393. package/dist/supervisor/index.js.map +1 -0
  394. package/dist/telemetry/batch-buffer.d.ts +53 -0
  395. package/dist/telemetry/batch-buffer.d.ts.map +1 -0
  396. package/dist/telemetry/batch-buffer.js +83 -0
  397. package/dist/telemetry/batch-buffer.js.map +1 -0
  398. package/dist/telemetry/categorizer.d.ts +65 -0
  399. package/dist/telemetry/categorizer.d.ts.map +1 -0
  400. package/dist/telemetry/categorizer.js +338 -0
  401. package/dist/telemetry/categorizer.js.map +1 -0
  402. package/dist/telemetry/consumer-analyzer.d.ts +53 -0
  403. package/dist/telemetry/consumer-analyzer.d.ts.map +1 -0
  404. package/dist/telemetry/consumer-analyzer.js +182 -0
  405. package/dist/telemetry/consumer-analyzer.js.map +1 -0
  406. package/dist/telemetry/cost-table.d.ts +36 -0
  407. package/dist/telemetry/cost-table.d.ts.map +1 -0
  408. package/dist/telemetry/cost-table.js +127 -0
  409. package/dist/telemetry/cost-table.js.map +1 -0
  410. package/dist/telemetry/efficiency-scorer.d.ts +103 -0
  411. package/dist/telemetry/efficiency-scorer.d.ts.map +1 -0
  412. package/dist/telemetry/efficiency-scorer.js +311 -0
  413. package/dist/telemetry/efficiency-scorer.js.map +1 -0
  414. package/dist/telemetry/index.d.ts +28 -0
  415. package/dist/telemetry/index.d.ts.map +1 -0
  416. package/dist/telemetry/index.js +37 -0
  417. package/dist/telemetry/index.js.map +1 -0
  418. package/dist/telemetry/ingestion-server.d.ts +99 -0
  419. package/dist/telemetry/ingestion-server.d.ts.map +1 -0
  420. package/dist/telemetry/ingestion-server.js +315 -0
  421. package/dist/telemetry/ingestion-server.js.map +1 -0
  422. package/dist/telemetry/log-turn-analyzer.d.ts +35 -0
  423. package/dist/telemetry/log-turn-analyzer.d.ts.map +1 -0
  424. package/dist/telemetry/log-turn-analyzer.js +132 -0
  425. package/dist/telemetry/log-turn-analyzer.js.map +1 -0
  426. package/dist/telemetry/normalizer.d.ts +43 -0
  427. package/dist/telemetry/normalizer.d.ts.map +1 -0
  428. package/dist/telemetry/normalizer.js +320 -0
  429. package/dist/telemetry/normalizer.js.map +1 -0
  430. package/dist/telemetry/recommender.d.ts +116 -0
  431. package/dist/telemetry/recommender.d.ts.map +1 -0
  432. package/dist/telemetry/recommender.js +532 -0
  433. package/dist/telemetry/recommender.js.map +1 -0
  434. package/dist/telemetry/source-detector.d.ts +19 -0
  435. package/dist/telemetry/source-detector.d.ts.map +1 -0
  436. package/dist/telemetry/source-detector.js +73 -0
  437. package/dist/telemetry/source-detector.js.map +1 -0
  438. package/dist/telemetry/task-baselines.d.ts +30 -0
  439. package/dist/telemetry/task-baselines.d.ts.map +1 -0
  440. package/dist/telemetry/task-baselines.js +44 -0
  441. package/dist/telemetry/task-baselines.js.map +1 -0
  442. package/dist/telemetry/telemetry-pipeline.d.ts +122 -0
  443. package/dist/telemetry/telemetry-pipeline.d.ts.map +1 -0
  444. package/dist/telemetry/telemetry-pipeline.js +349 -0
  445. package/dist/telemetry/telemetry-pipeline.js.map +1 -0
  446. package/dist/telemetry/timestamp-normalizer.d.ts +32 -0
  447. package/dist/telemetry/timestamp-normalizer.d.ts.map +1 -0
  448. package/dist/telemetry/timestamp-normalizer.js +133 -0
  449. package/dist/telemetry/timestamp-normalizer.js.map +1 -0
  450. package/dist/telemetry/token-extractor.d.ts +57 -0
  451. package/dist/telemetry/token-extractor.d.ts.map +1 -0
  452. package/dist/telemetry/token-extractor.js +200 -0
  453. package/dist/telemetry/token-extractor.js.map +1 -0
  454. package/dist/telemetry/turn-analyzer.d.ts +34 -0
  455. package/dist/telemetry/turn-analyzer.d.ts.map +1 -0
  456. package/dist/telemetry/turn-analyzer.js +101 -0
  457. package/dist/telemetry/turn-analyzer.js.map +1 -0
  458. package/dist/telemetry/types.d.ts +456 -0
  459. package/dist/telemetry/types.d.ts.map +1 -0
  460. package/dist/telemetry/types.js +186 -0
  461. package/dist/telemetry/types.js.map +1 -0
  462. package/dist/types.d.ts +80 -0
  463. package/dist/types.d.ts.map +1 -0
  464. package/dist/types.js +6 -0
  465. package/dist/types.js.map +1 -0
  466. package/dist/version-manager/index.d.ts +11 -0
  467. package/dist/version-manager/index.d.ts.map +1 -0
  468. package/dist/version-manager/index.js +8 -0
  469. package/dist/version-manager/index.js.map +1 -0
  470. package/dist/version-manager/update-checker.d.ts +44 -0
  471. package/dist/version-manager/update-checker.d.ts.map +1 -0
  472. package/dist/version-manager/update-checker.js +171 -0
  473. package/dist/version-manager/update-checker.js.map +1 -0
  474. package/dist/version-manager/version-cache.d.ts +42 -0
  475. package/dist/version-manager/version-cache.d.ts.map +1 -0
  476. package/dist/version-manager/version-cache.js +69 -0
  477. package/dist/version-manager/version-cache.js.map +1 -0
  478. package/dist/version-manager/version-manager-impl.d.ts +81 -0
  479. package/dist/version-manager/version-manager-impl.d.ts.map +1 -0
  480. package/dist/version-manager/version-manager-impl.js +223 -0
  481. package/dist/version-manager/version-manager-impl.js.map +1 -0
  482. package/dist/version-manager/version-manager.d.ts +70 -0
  483. package/dist/version-manager/version-manager.d.ts.map +1 -0
  484. package/dist/version-manager/version-manager.js +8 -0
  485. package/dist/version-manager/version-manager.js.map +1 -0
  486. package/package.json +27 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * ModelRoutingConfig — Zod schema, types, error, and loader for substrate.routing.yml.
3
+ *
4
+ * The routing config YAML controls which model is used for each pipeline phase
5
+ * (explore / generate / review) and supports per-task-type overrides.
6
+ *
7
+ * References:
8
+ * - Epic 28, Story 28-4: Model Routing Configuration Schema
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ import { load as yamlLoad } from 'js-yaml';
12
+ import { z } from 'zod';
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ const MODEL_NAME_PATTERN = /^[a-zA-Z0-9._-]+$/;
17
+ // ---------------------------------------------------------------------------
18
+ // Zod Schemas
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Per-phase model configuration.
22
+ */
23
+ export const ModelPhaseConfigSchema = z.object({
24
+ model: z.string().regex(MODEL_NAME_PATTERN, 'Model name contains invalid characters (must match /^[a-zA-Z0-9._-]+$/)'),
25
+ max_tokens: z.number().int().positive().optional(),
26
+ });
27
+ /**
28
+ * Complete model routing configuration document.
29
+ *
30
+ * All three phase keys (explore, generate, review) are optional — an absent
31
+ * phase causes resolveModel() to return null, signalling callers to use their
32
+ * own default model.
33
+ */
34
+ export const ModelRoutingConfigSchema = z.object({
35
+ version: z.literal(1),
36
+ phases: z.object({
37
+ explore: ModelPhaseConfigSchema.optional(),
38
+ generate: ModelPhaseConfigSchema.optional(),
39
+ review: ModelPhaseConfigSchema.optional(),
40
+ }),
41
+ baseline_model: z.string().regex(MODEL_NAME_PATTERN, 'Baseline model name contains invalid characters (must match /^[a-zA-Z0-9._-]+$/)'),
42
+ overrides: z.record(z.string(), ModelPhaseConfigSchema).optional(),
43
+ /**
44
+ * When true, RoutingTuner will automatically apply conservative model downgrades
45
+ * at the end of each pipeline run based on historical phase token data.
46
+ */
47
+ auto_tune: z.boolean().optional(),
48
+ });
49
+ /**
50
+ * Error thrown by loadModelRoutingConfig() for all failure modes.
51
+ *
52
+ * Extends plain Error (not SubstrateError) to keep core package free of monolith imports.
53
+ */
54
+ export class RoutingConfigError extends Error {
55
+ context;
56
+ code;
57
+ constructor(message, code, context) {
58
+ super(message);
59
+ this.context = context;
60
+ this.name = 'RoutingConfigError';
61
+ this.code = code;
62
+ Object.setPrototypeOf(this, new.target.prototype);
63
+ }
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Loader
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Load and validate a model routing config YAML file.
70
+ *
71
+ * @param filePath - Absolute or relative path to substrate.routing.yml
72
+ * @returns Parsed and validated ModelRoutingConfig object
73
+ * @throws {RoutingConfigError} with code CONFIG_NOT_FOUND if the file cannot be read
74
+ * @throws {RoutingConfigError} with code INVALID_YAML if the file contains invalid YAML
75
+ * @throws {RoutingConfigError} with code SCHEMA_INVALID if validation fails
76
+ *
77
+ * @example
78
+ * const config = loadModelRoutingConfig('.substrate/routing.yml')
79
+ */
80
+ export function loadModelRoutingConfig(filePath) {
81
+ // Read the file
82
+ let rawContent;
83
+ try {
84
+ rawContent = readFileSync(filePath, 'utf-8');
85
+ }
86
+ catch (err) {
87
+ const message = err instanceof Error ? err.message : String(err);
88
+ throw new RoutingConfigError(`Cannot read routing config file at "${filePath}": ${message}`, 'CONFIG_NOT_FOUND', { filePath });
89
+ }
90
+ // Parse YAML
91
+ let rawObject;
92
+ try {
93
+ rawObject = yamlLoad(rawContent);
94
+ }
95
+ catch (err) {
96
+ const message = err instanceof Error ? err.message : String(err);
97
+ throw new RoutingConfigError(`Invalid YAML in routing config file at "${filePath}": ${message}`, 'INVALID_YAML', { filePath });
98
+ }
99
+ // Validate with Zod
100
+ const result = ModelRoutingConfigSchema.safeParse(rawObject);
101
+ if (!result.success) {
102
+ const issues = result.error.issues;
103
+ const details = issues
104
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
105
+ .join('\n');
106
+ throw new RoutingConfigError(`Routing config validation failed for "${filePath}":\n${details}`, 'SCHEMA_INVALID', { filePath });
107
+ }
108
+ return result.data;
109
+ }
110
+ //# sourceMappingURL=model-routing-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-routing-config.js","sourceRoot":"","sources":["../../src/routing/model-routing-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * RoutingResolver — resolves the appropriate model for each pipeline task type.
3
+ *
4
+ * Uses ModelRoutingConfig to map task types to pipeline phases and return
5
+ * the configured model (with optional per-task-type overrides).
6
+ *
7
+ * References:
8
+ * - Epic 28, Story 28-4: Model Routing Configuration Schema
9
+ */
10
+ import type { ILogger } from '../dispatch/types.js';
11
+ import type { ModelRoutingConfig } from './model-routing-config.js';
12
+ import type { ModelResolution } from './routing-engine.js';
13
+ /**
14
+ * Resolves which model to use for each pipeline task type.
15
+ *
16
+ * Constructed with a ModelRoutingConfig and a logger. Use the static
17
+ * createWithFallback() factory to construct from a file path with graceful
18
+ * handling of missing config files.
19
+ */
20
+ export declare class RoutingResolver {
21
+ private readonly config;
22
+ private readonly logger;
23
+ constructor(config: ModelRoutingConfig, logger: ILogger);
24
+ /**
25
+ * Resolve the model for a given task type.
26
+ *
27
+ * Resolution order:
28
+ * 1. config.overrides[taskType] (source: 'override')
29
+ * 2. config.phases[phase] via TASK_TYPE_PHASE_MAP (source: 'phase')
30
+ * 3. null if the phase key is absent in config.phases
31
+ *
32
+ * @returns ModelResolution if a model is configured, null if in fallback mode
33
+ */
34
+ resolveModel(taskType: string): ModelResolution | null;
35
+ /**
36
+ * Static factory that loads a routing config from a file with graceful fallback.
37
+ *
38
+ * If the config file does not exist (CONFIG_NOT_FOUND), emits a single debug
39
+ * log and returns a resolver in fallback mode where all resolveModel() calls
40
+ * return null. Other errors are rethrown.
41
+ *
42
+ * @param filePath - Path to the substrate.routing.yml file
43
+ * @param logger - Logger instance
44
+ */
45
+ static createWithFallback(filePath: string, logger: ILogger): RoutingResolver;
46
+ }
47
+ export declare const ROUTING_RESOLVER_LOGGER_NAME = "routing:model-resolver";
48
+ //# sourceMappingURL=model-routing-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-routing-resolver.d.ts","sourceRoot":"","sources":["../../src/routing/model-routing-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAc1D;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO;IAKvD;;;;;;;;;OASG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAuCtD;;;;;;;;;OASG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe;CAqB9E;AAGD,eAAO,MAAM,4BAA4B,2BAA2B,CAAA"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * RoutingResolver — resolves the appropriate model for each pipeline task type.
3
+ *
4
+ * Uses ModelRoutingConfig to map task types to pipeline phases and return
5
+ * the configured model (with optional per-task-type overrides).
6
+ *
7
+ * References:
8
+ * - Epic 28, Story 28-4: Model Routing Configuration Schema
9
+ */
10
+ import { loadModelRoutingConfig, RoutingConfigError } from './model-routing-config.js';
11
+ // TASK_TYPE_PHASE_MAP already defined in routing-engine.ts (story 40-6); import from there
12
+ import { TASK_TYPE_PHASE_MAP } from './routing-engine.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ const DEFAULT_PHASE = 'generate';
17
+ // ---------------------------------------------------------------------------
18
+ // RoutingResolver
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Resolves which model to use for each pipeline task type.
22
+ *
23
+ * Constructed with a ModelRoutingConfig and a logger. Use the static
24
+ * createWithFallback() factory to construct from a file path with graceful
25
+ * handling of missing config files.
26
+ */
27
+ export class RoutingResolver {
28
+ config;
29
+ logger;
30
+ constructor(config, logger) {
31
+ this.config = config;
32
+ this.logger = logger;
33
+ }
34
+ /**
35
+ * Resolve the model for a given task type.
36
+ *
37
+ * Resolution order:
38
+ * 1. config.overrides[taskType] (source: 'override')
39
+ * 2. config.phases[phase] via TASK_TYPE_PHASE_MAP (source: 'phase')
40
+ * 3. null if the phase key is absent in config.phases
41
+ *
42
+ * @returns ModelResolution if a model is configured, null if in fallback mode
43
+ */
44
+ resolveModel(taskType) {
45
+ // Check overrides first
46
+ const override = this.config.overrides?.[taskType];
47
+ if (override) {
48
+ const phase = TASK_TYPE_PHASE_MAP[taskType] ?? DEFAULT_PHASE;
49
+ const resolution = {
50
+ model: override.model,
51
+ phase,
52
+ source: 'override',
53
+ ...(override.max_tokens !== undefined ? { maxTokens: override.max_tokens } : {}),
54
+ };
55
+ this.logger.debug({ taskType, phase: resolution.phase, model: resolution.model, source: 'override' }, 'Resolved model');
56
+ return resolution;
57
+ }
58
+ // Look up phase
59
+ const phase = TASK_TYPE_PHASE_MAP[taskType] ?? DEFAULT_PHASE;
60
+ const phaseConfig = this.config.phases[phase];
61
+ if (!phaseConfig) {
62
+ return null;
63
+ }
64
+ const resolution = {
65
+ model: phaseConfig.model,
66
+ phase,
67
+ source: 'phase',
68
+ ...(phaseConfig.max_tokens !== undefined ? { maxTokens: phaseConfig.max_tokens } : {}),
69
+ };
70
+ this.logger.debug({ taskType, phase, model: resolution.model, source: 'phase' }, 'Resolved model');
71
+ return resolution;
72
+ }
73
+ /**
74
+ * Static factory that loads a routing config from a file with graceful fallback.
75
+ *
76
+ * If the config file does not exist (CONFIG_NOT_FOUND), emits a single debug
77
+ * log and returns a resolver in fallback mode where all resolveModel() calls
78
+ * return null. Other errors are rethrown.
79
+ *
80
+ * @param filePath - Path to the substrate.routing.yml file
81
+ * @param logger - Logger instance
82
+ */
83
+ static createWithFallback(filePath, logger) {
84
+ try {
85
+ const config = loadModelRoutingConfig(filePath);
86
+ return new RoutingResolver(config, logger);
87
+ }
88
+ catch (err) {
89
+ if (err instanceof RoutingConfigError && err.code === 'CONFIG_NOT_FOUND') {
90
+ logger.debug({ configPath: filePath, component: 'routing', reason: 'config not found' }, `Model routing config not found at "${filePath}"; using fallback mode (all resolveModel calls will return null)`);
91
+ // Construct a sentinel config with empty phases so resolveModel always returns null
92
+ const fallbackConfig = {
93
+ version: 1,
94
+ phases: {},
95
+ baseline_model: '',
96
+ };
97
+ return new RoutingResolver(fallbackConfig, logger);
98
+ }
99
+ throw err;
100
+ }
101
+ }
102
+ }
103
+ // Export the module-level logger name for external callers
104
+ export const ROUTING_RESOLVER_LOGGER_NAME = 'routing:model-resolver';
105
+ //# sourceMappingURL=model-routing-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-routing-resolver.js","sourceRoot":"","sources":["../../src/routing/model-routing-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared model tier resolution utility.
3
+ *
4
+ * Determines whether a model string belongs to the haiku (1), sonnet (2),
5
+ * or opus (3) tier based on substring matching against well-known keywords.
6
+ *
7
+ * Used by both RoutingRecommender and RoutingTuner to ensure consistent
8
+ * tier comparisons — in particular the one-step guard in RoutingTuner.
9
+ */
10
+ /**
11
+ * Get the model tier for a given model name string.
12
+ *
13
+ * Returns:
14
+ * - 1 for haiku-tier models
15
+ * - 2 for sonnet-tier models (also the default when unrecognized)
16
+ * - 3 for opus-tier models
17
+ *
18
+ * Matching is case-insensitive substring search.
19
+ */
20
+ export declare function getModelTier(model: string): number;
21
+ //# sourceMappingURL=model-tier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-tier.d.ts","sourceRoot":"","sources":["../../src/routing/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared model tier resolution utility.
3
+ *
4
+ * Determines whether a model string belongs to the haiku (1), sonnet (2),
5
+ * or opus (3) tier based on substring matching against well-known keywords.
6
+ *
7
+ * Used by both RoutingRecommender and RoutingTuner to ensure consistent
8
+ * tier comparisons — in particular the one-step guard in RoutingTuner.
9
+ */
10
+ /** Ordered tier keywords: index 0 = cheapest, index N = most expensive. */
11
+ const TIER_KEYWORDS = [
12
+ { keyword: 'haiku', tier: 1 },
13
+ { keyword: 'sonnet', tier: 2 },
14
+ { keyword: 'opus', tier: 3 },
15
+ ];
16
+ /**
17
+ * Get the model tier for a given model name string.
18
+ *
19
+ * Returns:
20
+ * - 1 for haiku-tier models
21
+ * - 2 for sonnet-tier models (also the default when unrecognized)
22
+ * - 3 for opus-tier models
23
+ *
24
+ * Matching is case-insensitive substring search.
25
+ */
26
+ export function getModelTier(model) {
27
+ const lower = model.toLowerCase();
28
+ for (const { keyword, tier } of TIER_KEYWORDS) {
29
+ if (lower.includes(keyword))
30
+ return tier;
31
+ }
32
+ return 2; // default: sonnet tier
33
+ }
34
+ //# sourceMappingURL=model-tier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-tier.js","sourceRoot":"","sources":["../../src/routing/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,MAAM,aAAa,GAA6C;IAC9D,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;IAC7B,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE;IAC9B,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE;CAC7B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IACjC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;IAC1C,CAAC;IACD,OAAO,CAAC,CAAA,CAAC,uBAAuB;AAClC,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * ProviderStatus — in-memory rate limit and status tracking per provider.
3
+ *
4
+ * Tracks:
5
+ * - Subscription routing enabled/disabled
6
+ * - API billing availability
7
+ * - Rate limit consumption within the current window
8
+ *
9
+ * References:
10
+ * - Architecture Section 8: Rate limit tracking per provider
11
+ * - FR29: Rate limit management
12
+ * - ADR-004: RoutingEngine is stateless except for rate limit tracking in-memory
13
+ */
14
+ /**
15
+ * Snapshot of a single provider's current status.
16
+ */
17
+ export interface ProviderStatus {
18
+ /** Provider name (e.g., 'claude', 'codex', 'gemini') */
19
+ provider: string;
20
+ /** Whether subscription routing is enabled for this provider */
21
+ subscriptionRoutingEnabled: boolean;
22
+ /** Whether API billing is available for this provider */
23
+ apiBillingEnabled: boolean;
24
+ /** Tokens consumed in the current rate limit window */
25
+ tokensUsedInWindow: number;
26
+ /** Millisecond timestamp when the current window resets (0 if no rate limit configured) */
27
+ windowResetAtMs: number;
28
+ /** Rate limit configuration */
29
+ rateLimit: {
30
+ tokensPerWindow: number;
31
+ windowSeconds: number;
32
+ };
33
+ }
34
+ /**
35
+ * Manages in-memory rate limit state and provider availability for all providers.
36
+ *
37
+ * This is a pure in-memory tracker — all state is reset when the daemon restarts.
38
+ * This is acceptable per ADR-004 (stateless except for rate limit tracking).
39
+ *
40
+ * @example
41
+ * const tracker = new ProviderStatusTracker()
42
+ * tracker.initProvider('claude', true, true, { tokensPerWindow: 220000, windowSeconds: 18000 })
43
+ * const ok = tracker.checkRateLimit('claude', 1000) // true if capacity available
44
+ * tracker.recordTokenUsage('claude', 1000)
45
+ */
46
+ export declare class ProviderStatusTracker {
47
+ private readonly _windows;
48
+ private readonly _subscriptionEnabled;
49
+ private readonly _apiBillingEnabled;
50
+ /**
51
+ * Initialize tracking for a provider.
52
+ * Called once during RoutingEngine initialization from the routing policy.
53
+ *
54
+ * @param provider - Provider name
55
+ * @param subscriptionEnabled - Whether subscription routing is on
56
+ * @param apiBillingEnabled - Whether API billing is available
57
+ * @param rateLimit - Rate limit configuration (optional)
58
+ */
59
+ initProvider(provider: string, subscriptionEnabled: boolean, apiBillingEnabled: boolean, rateLimit?: {
60
+ tokensPerWindow: number;
61
+ windowSeconds: number;
62
+ }): void;
63
+ /**
64
+ * Check whether a provider can accept the estimated token usage without exceeding its limit.
65
+ *
66
+ * @param provider - Provider name
67
+ * @param estimatedTokens - Tokens that would be consumed
68
+ * @returns true if tokens won't exceed limit (or no rate limit configured), false otherwise
69
+ */
70
+ checkRateLimit(provider: string, estimatedTokens: number): boolean;
71
+ /**
72
+ * Record token usage for a provider after task completion.
73
+ * Resets the window if it has expired before recording.
74
+ *
75
+ * @param provider - Provider name
76
+ * @param tokensUsed - Actual tokens consumed
77
+ */
78
+ recordTokenUsage(provider: string, tokensUsed: number): void;
79
+ /**
80
+ * Get the timestamp when the current rate limit window resets.
81
+ *
82
+ * @param provider - Provider name
83
+ * @returns Date when the window resets, or the current time if no rate limit configured
84
+ */
85
+ getRateLimitResetTime(provider: string): Date;
86
+ /**
87
+ * Return a snapshot of the current status for a provider.
88
+ *
89
+ * @param provider - Provider name
90
+ * @returns ProviderStatus snapshot, or null if provider is not tracked
91
+ */
92
+ getStatus(provider: string): ProviderStatus | null;
93
+ /**
94
+ * Return all tracked provider names.
95
+ */
96
+ getTrackedProviders(): string[];
97
+ private _resetWindowIfExpired;
98
+ }
99
+ //# sourceMappingURL=provider-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-status.d.ts","sourceRoot":"","sources":["../../src/routing/provider-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,0BAA0B,EAAE,OAAO,CAAA;IACnC,yDAAyD;IACzD,iBAAiB,EAAE,OAAO,CAAA;IAC1B,uDAAuD;IACvD,kBAAkB,EAAE,MAAM,CAAA;IAC1B,2FAA2F;IAC3F,eAAe,EAAE,MAAM,CAAA;IACvB,+BAA+B;IAC/B,SAAS,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9D;AAkBD;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAkC;IACvE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAkC;IAMrE;;;;;;;;OAQG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,OAAO,EAC5B,iBAAiB,EAAE,OAAO,EAC1B,SAAS,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAC7D,IAAI;IAmBP;;;;;;OAMG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAalE;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAY5D;;;;;OAKG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY7C;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAkClD;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAQ/B,OAAO,CAAC,qBAAqB;CAO9B"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * ProviderStatus — in-memory rate limit and status tracking per provider.
3
+ *
4
+ * Tracks:
5
+ * - Subscription routing enabled/disabled
6
+ * - API billing availability
7
+ * - Rate limit consumption within the current window
8
+ *
9
+ * References:
10
+ * - Architecture Section 8: Rate limit tracking per provider
11
+ * - FR29: Rate limit management
12
+ * - ADR-004: RoutingEngine is stateless except for rate limit tracking in-memory
13
+ */
14
+ // ---------------------------------------------------------------------------
15
+ // ProviderStatusTracker
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Manages in-memory rate limit state and provider availability for all providers.
19
+ *
20
+ * This is a pure in-memory tracker — all state is reset when the daemon restarts.
21
+ * This is acceptable per ADR-004 (stateless except for rate limit tracking).
22
+ *
23
+ * @example
24
+ * const tracker = new ProviderStatusTracker()
25
+ * tracker.initProvider('claude', true, true, { tokensPerWindow: 220000, windowSeconds: 18000 })
26
+ * const ok = tracker.checkRateLimit('claude', 1000) // true if capacity available
27
+ * tracker.recordTokenUsage('claude', 1000)
28
+ */
29
+ export class ProviderStatusTracker {
30
+ _windows = new Map();
31
+ _subscriptionEnabled = new Map();
32
+ _apiBillingEnabled = new Map();
33
+ // ---------------------------------------------------------------------------
34
+ // Initialization
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Initialize tracking for a provider.
38
+ * Called once during RoutingEngine initialization from the routing policy.
39
+ *
40
+ * @param provider - Provider name
41
+ * @param subscriptionEnabled - Whether subscription routing is on
42
+ * @param apiBillingEnabled - Whether API billing is available
43
+ * @param rateLimit - Rate limit configuration (optional)
44
+ */
45
+ initProvider(provider, subscriptionEnabled, apiBillingEnabled, rateLimit) {
46
+ this._subscriptionEnabled.set(provider, subscriptionEnabled);
47
+ this._apiBillingEnabled.set(provider, apiBillingEnabled);
48
+ if (rateLimit !== undefined) {
49
+ this._windows.set(provider, {
50
+ provider,
51
+ tokensUsedInWindow: 0,
52
+ windowStartAtMs: Date.now(),
53
+ windowDurationMs: rateLimit.windowSeconds * 1000,
54
+ tokensPerWindow: rateLimit.tokensPerWindow,
55
+ });
56
+ }
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Rate limit management
60
+ // ---------------------------------------------------------------------------
61
+ /**
62
+ * Check whether a provider can accept the estimated token usage without exceeding its limit.
63
+ *
64
+ * @param provider - Provider name
65
+ * @param estimatedTokens - Tokens that would be consumed
66
+ * @returns true if tokens won't exceed limit (or no rate limit configured), false otherwise
67
+ */
68
+ checkRateLimit(provider, estimatedTokens) {
69
+ const window = this._windows.get(provider);
70
+ if (window === undefined) {
71
+ // No rate limit configured — always available
72
+ return true;
73
+ }
74
+ // Check if window has expired and reset if needed
75
+ this._resetWindowIfExpired(window);
76
+ return window.tokensUsedInWindow + estimatedTokens <= window.tokensPerWindow;
77
+ }
78
+ /**
79
+ * Record token usage for a provider after task completion.
80
+ * Resets the window if it has expired before recording.
81
+ *
82
+ * @param provider - Provider name
83
+ * @param tokensUsed - Actual tokens consumed
84
+ */
85
+ recordTokenUsage(provider, tokensUsed) {
86
+ const window = this._windows.get(provider);
87
+ if (window === undefined) {
88
+ return;
89
+ }
90
+ // Reset if window expired
91
+ this._resetWindowIfExpired(window);
92
+ window.tokensUsedInWindow += tokensUsed;
93
+ }
94
+ /**
95
+ * Get the timestamp when the current rate limit window resets.
96
+ *
97
+ * @param provider - Provider name
98
+ * @returns Date when the window resets, or the current time if no rate limit configured
99
+ */
100
+ getRateLimitResetTime(provider) {
101
+ const window = this._windows.get(provider);
102
+ if (window === undefined) {
103
+ return new Date();
104
+ }
105
+ return new Date(window.windowStartAtMs + window.windowDurationMs);
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Status snapshot
109
+ // ---------------------------------------------------------------------------
110
+ /**
111
+ * Return a snapshot of the current status for a provider.
112
+ *
113
+ * @param provider - Provider name
114
+ * @returns ProviderStatus snapshot, or null if provider is not tracked
115
+ */
116
+ getStatus(provider) {
117
+ const subscriptionEnabled = this._subscriptionEnabled.get(provider);
118
+ if (subscriptionEnabled === undefined) {
119
+ return null;
120
+ }
121
+ const apiBillingEnabled = this._apiBillingEnabled.get(provider) ?? false;
122
+ const window = this._windows.get(provider);
123
+ if (window !== undefined) {
124
+ this._resetWindowIfExpired(window);
125
+ return {
126
+ provider,
127
+ subscriptionRoutingEnabled: subscriptionEnabled,
128
+ apiBillingEnabled,
129
+ tokensUsedInWindow: window.tokensUsedInWindow,
130
+ windowResetAtMs: window.windowStartAtMs + window.windowDurationMs,
131
+ rateLimit: {
132
+ tokensPerWindow: window.tokensPerWindow,
133
+ windowSeconds: window.windowDurationMs / 1000,
134
+ },
135
+ };
136
+ }
137
+ return {
138
+ provider,
139
+ subscriptionRoutingEnabled: subscriptionEnabled,
140
+ apiBillingEnabled,
141
+ tokensUsedInWindow: 0,
142
+ windowResetAtMs: 0,
143
+ rateLimit: { tokensPerWindow: 0, windowSeconds: 0 },
144
+ };
145
+ }
146
+ /**
147
+ * Return all tracked provider names.
148
+ */
149
+ getTrackedProviders() {
150
+ return Array.from(this._subscriptionEnabled.keys());
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Private helpers
154
+ // ---------------------------------------------------------------------------
155
+ _resetWindowIfExpired(window) {
156
+ const now = Date.now();
157
+ if (now > window.windowStartAtMs + window.windowDurationMs) {
158
+ window.tokensUsedInWindow = 0;
159
+ window.windowStartAtMs = now;
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=provider-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-status.js","sourceRoot":"","sources":["../../src/routing/provider-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoCH,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,qBAAqB;IACf,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAA;IAClD,oBAAoB,GAAyB,IAAI,GAAG,EAAE,CAAA;IACtD,kBAAkB,GAAyB,IAAI,GAAG,EAAE,CAAA;IAErE,8EAA8E;IAC9E,iBAAiB;IACjB,8EAA8E;IAE9E;;;;;;;;OAQG;IACH,YAAY,CACV,QAAgB,EAChB,mBAA4B,EAC5B,iBAA0B,EAC1B,SAA8D;QAE9D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;QAC5D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QAExD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAC1B,QAAQ;gBACR,kBAAkB,EAAE,CAAC;gBACrB,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC3B,gBAAgB,EAAE,SAAS,CAAC,aAAa,GAAG,IAAI;gBAChD,eAAe,EAAE,SAAS,CAAC,eAAe;aAC3C,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E;;;;;;OAMG;IACH,cAAc,CAAC,QAAgB,EAAE,eAAuB;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,8CAA8C;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAElC,OAAO,MAAM,CAAC,kBAAkB,GAAG,eAAe,IAAI,MAAM,CAAC,eAAe,CAAA;IAC9E,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAgB,EAAE,UAAkB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAElC,MAAM,CAAC,kBAAkB,IAAI,UAAU,CAAA;IACzC,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CAAC,QAAgB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,IAAI,EAAE,CAAA;QACnB,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACnE,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;;OAKG;IACH,SAAS,CAAC,QAAgB;QACxB,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnE,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAA;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAE1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;YAClC,OAAO;gBACL,QAAQ;gBACR,0BAA0B,EAAE,mBAAmB;gBAC/C,iBAAiB;gBACjB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,eAAe,EAAE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB;gBACjE,SAAS,EAAE;oBACT,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,aAAa,EAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI;iBAC9C;aACF,CAAA;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,0BAA0B,EAAE,mBAAmB;YAC/C,iBAAiB;YACjB,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;SACpD,CAAA;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,qBAAqB,CAAC,MAAuB;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC3D,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;YAC7B,MAAM,CAAC,eAAe,GAAG,GAAG,CAAA;QAC9B,CAAC;IACH,CAAC;CACF"}