@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,138 @@
1
+ /**
2
+ * RoutingPolicy — Zod schema, types, and loader for the routing policy YAML file.
3
+ *
4
+ * The routing policy YAML (default: .substrate/routing-policy.yaml) controls:
5
+ * - Which agents are preferred for which task types
6
+ * - Subscription-first vs. API billing preference
7
+ * - Per-provider rate limits
8
+ * - Fallback chains when preferred agents are unavailable
9
+ *
10
+ * References:
11
+ * - Architecture Section 8: Subscription-first algorithm
12
+ * - FR22, FR23, FR25: Subscription routing toggles
13
+ * - NFR13: Schema validation with Zod
14
+ */
15
+ import { z } from 'zod';
16
+ /**
17
+ * API billing configuration for a provider.
18
+ */
19
+ export declare const ApiBillingConfigSchema: z.ZodObject<{
20
+ enabled: z.ZodDefault<z.ZodBoolean>;
21
+ api_key_env: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strip>;
23
+ export type ApiBillingConfig = z.infer<typeof ApiBillingConfigSchema>;
24
+ /**
25
+ * Rate limit configuration for a provider.
26
+ */
27
+ export declare const RateLimitConfigSchema: z.ZodObject<{
28
+ tokens_per_window: z.ZodNumber;
29
+ window_seconds: z.ZodNumber;
30
+ }, z.core.$strip>;
31
+ export type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>;
32
+ /**
33
+ * Per-provider configuration.
34
+ */
35
+ export declare const ProviderPolicySchema: z.ZodObject<{
36
+ enabled: z.ZodDefault<z.ZodBoolean>;
37
+ cli_path: z.ZodDefault<z.ZodString>;
38
+ subscription_routing: z.ZodDefault<z.ZodBoolean>;
39
+ max_concurrent: z.ZodDefault<z.ZodNumber>;
40
+ rate_limit: z.ZodOptional<z.ZodObject<{
41
+ tokens_per_window: z.ZodNumber;
42
+ window_seconds: z.ZodNumber;
43
+ }, z.core.$strip>>;
44
+ api_billing: z.ZodOptional<z.ZodObject<{
45
+ enabled: z.ZodDefault<z.ZodBoolean>;
46
+ api_key_env: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>;
49
+ export type ProviderPolicy = z.infer<typeof ProviderPolicySchema>;
50
+ /**
51
+ * Per-task-type routing configuration.
52
+ * Specifies which agents are preferred for a given task type and optional model preferences.
53
+ */
54
+ export declare const TaskTypePolicySchema: z.ZodObject<{
55
+ preferred_agents: z.ZodArray<z.ZodString>;
56
+ model_preferences: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
57
+ }, z.core.$strip>;
58
+ export type TaskTypePolicy = z.infer<typeof TaskTypePolicySchema>;
59
+ /**
60
+ * Default routing configuration (used when no task-type-specific policy applies).
61
+ */
62
+ export declare const DefaultRoutingPolicySchema: z.ZodObject<{
63
+ preferred_agents: z.ZodArray<z.ZodString>;
64
+ billing_preference: z.ZodDefault<z.ZodEnum<{
65
+ subscription_first: "subscription_first";
66
+ api_only: "api_only";
67
+ subscription_only: "subscription_only";
68
+ }>>;
69
+ use_monitor_recommendations: z.ZodDefault<z.ZodBoolean>;
70
+ }, z.core.$strip>;
71
+ export type DefaultRoutingPolicy = z.infer<typeof DefaultRoutingPolicySchema>;
72
+ /**
73
+ * Global routing settings.
74
+ */
75
+ export declare const GlobalRoutingSettingsSchema: z.ZodObject<{
76
+ max_concurrent_workers: z.ZodDefault<z.ZodNumber>;
77
+ fallback_enabled: z.ZodDefault<z.ZodBoolean>;
78
+ }, z.core.$strip>;
79
+ export type GlobalRoutingSettings = z.infer<typeof GlobalRoutingSettingsSchema>;
80
+ /**
81
+ * Complete routing policy document schema.
82
+ * Supports optional fields gracefully (AC6 — extensibility).
83
+ */
84
+ export declare const RoutingPolicySchema: z.ZodObject<{
85
+ default: z.ZodObject<{
86
+ preferred_agents: z.ZodArray<z.ZodString>;
87
+ billing_preference: z.ZodDefault<z.ZodEnum<{
88
+ subscription_first: "subscription_first";
89
+ api_only: "api_only";
90
+ subscription_only: "subscription_only";
91
+ }>>;
92
+ use_monitor_recommendations: z.ZodDefault<z.ZodBoolean>;
93
+ }, z.core.$strip>;
94
+ task_types: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
95
+ preferred_agents: z.ZodArray<z.ZodString>;
96
+ model_preferences: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
97
+ }, z.core.$strip>>>>;
98
+ providers: z.ZodRecord<z.ZodString, z.ZodObject<{
99
+ enabled: z.ZodDefault<z.ZodBoolean>;
100
+ cli_path: z.ZodDefault<z.ZodString>;
101
+ subscription_routing: z.ZodDefault<z.ZodBoolean>;
102
+ max_concurrent: z.ZodDefault<z.ZodNumber>;
103
+ rate_limit: z.ZodOptional<z.ZodObject<{
104
+ tokens_per_window: z.ZodNumber;
105
+ window_seconds: z.ZodNumber;
106
+ }, z.core.$strip>>;
107
+ api_billing: z.ZodOptional<z.ZodObject<{
108
+ enabled: z.ZodDefault<z.ZodBoolean>;
109
+ api_key_env: z.ZodOptional<z.ZodString>;
110
+ }, z.core.$strip>>;
111
+ }, z.core.$strip>>;
112
+ global: z.ZodDefault<z.ZodOptional<z.ZodObject<{
113
+ max_concurrent_workers: z.ZodDefault<z.ZodNumber>;
114
+ fallback_enabled: z.ZodDefault<z.ZodBoolean>;
115
+ }, z.core.$strip>>>;
116
+ }, z.core.$strip>;
117
+ export type RoutingPolicy = z.infer<typeof RoutingPolicySchema>;
118
+ /**
119
+ * Error thrown when routing policy validation fails.
120
+ *
121
+ * Extends plain Error (not SubstrateError) to keep core package free of monolith imports.
122
+ */
123
+ export declare class RoutingPolicyValidationError extends Error {
124
+ readonly details?: string | undefined;
125
+ constructor(message: string, details?: string | undefined);
126
+ }
127
+ /**
128
+ * Load and validate a routing policy YAML file.
129
+ *
130
+ * @param filePath - Absolute or relative path to the routing policy YAML
131
+ * @returns Parsed and validated RoutingPolicy object
132
+ * @throws {RoutingPolicyValidationError} if the file cannot be parsed or the schema is invalid
133
+ *
134
+ * @example
135
+ * const policy = loadRoutingPolicy('.substrate/routing-policy.yaml')
136
+ */
137
+ export declare function loadRoutingPolicy(filePath: string): RoutingPolicy;
138
+ //# sourceMappingURL=routing-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-policy.d.ts","sourceRoot":"","sources":["../../src/routing/routing-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAA;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAO/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;iBAIrC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAE7E;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAE/E;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAM/D;;;;GAIG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;aACR,OAAO,CAAC,EAAE,MAAM;gBAAjD,OAAO,EAAE,MAAM,EAAkB,OAAO,CAAC,EAAE,MAAM,YAAA;CAK9D;AAMD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAmEjE"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * RoutingPolicy — Zod schema, types, and loader for the routing policy YAML file.
3
+ *
4
+ * The routing policy YAML (default: .substrate/routing-policy.yaml) controls:
5
+ * - Which agents are preferred for which task types
6
+ * - Subscription-first vs. API billing preference
7
+ * - Per-provider rate limits
8
+ * - Fallback chains when preferred agents are unavailable
9
+ *
10
+ * References:
11
+ * - Architecture Section 8: Subscription-first algorithm
12
+ * - FR22, FR23, FR25: Subscription routing toggles
13
+ * - NFR13: Schema validation with Zod
14
+ */
15
+ import { readFileSync } from 'node:fs';
16
+ import { load as yamlLoad } from 'js-yaml';
17
+ import { z } from 'zod';
18
+ // ---------------------------------------------------------------------------
19
+ // Zod Schemas
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * API billing configuration for a provider.
23
+ */
24
+ export const ApiBillingConfigSchema = z.object({
25
+ enabled: z.boolean().default(false),
26
+ api_key_env: z.string().optional(),
27
+ });
28
+ /**
29
+ * Rate limit configuration for a provider.
30
+ */
31
+ export const RateLimitConfigSchema = z.object({
32
+ tokens_per_window: z.number().int().positive(),
33
+ window_seconds: z.number().int().positive(),
34
+ });
35
+ /**
36
+ * Per-provider configuration.
37
+ */
38
+ export const ProviderPolicySchema = z.object({
39
+ enabled: z.boolean().default(true),
40
+ cli_path: z.string().default(''),
41
+ subscription_routing: z.boolean().default(false),
42
+ max_concurrent: z.number().int().min(1).max(32).default(1),
43
+ rate_limit: RateLimitConfigSchema.optional(),
44
+ api_billing: ApiBillingConfigSchema.optional(),
45
+ });
46
+ /**
47
+ * Per-task-type routing configuration.
48
+ * Specifies which agents are preferred for a given task type and optional model preferences.
49
+ */
50
+ export const TaskTypePolicySchema = z.object({
51
+ preferred_agents: z.array(z.string()).min(1),
52
+ model_preferences: z.record(z.string(), z.string()).optional(),
53
+ });
54
+ /**
55
+ * Default routing configuration (used when no task-type-specific policy applies).
56
+ */
57
+ export const DefaultRoutingPolicySchema = z.object({
58
+ preferred_agents: z.array(z.string()).min(1),
59
+ billing_preference: z.enum(['subscription_first', 'api_only', 'subscription_only']).default('subscription_first'),
60
+ use_monitor_recommendations: z.boolean().default(false),
61
+ });
62
+ /**
63
+ * Global routing settings.
64
+ */
65
+ export const GlobalRoutingSettingsSchema = z.object({
66
+ max_concurrent_workers: z.number().int().min(1).max(100).default(5),
67
+ fallback_enabled: z.boolean().default(true),
68
+ });
69
+ /**
70
+ * Complete routing policy document schema.
71
+ * Supports optional fields gracefully (AC6 — extensibility).
72
+ */
73
+ export const RoutingPolicySchema = z.object({
74
+ default: DefaultRoutingPolicySchema,
75
+ task_types: z.record(z.string(), TaskTypePolicySchema).optional().default({}),
76
+ providers: z.record(z.string(), ProviderPolicySchema).refine((providers) => Object.keys(providers).length > 0, { message: 'Routing policy must have at least one provider configured' }),
77
+ global: GlobalRoutingSettingsSchema.optional().default({ max_concurrent_workers: 5, fallback_enabled: true }),
78
+ });
79
+ // ---------------------------------------------------------------------------
80
+ // Validation errors
81
+ // ---------------------------------------------------------------------------
82
+ /**
83
+ * Error thrown when routing policy validation fails.
84
+ *
85
+ * Extends plain Error (not SubstrateError) to keep core package free of monolith imports.
86
+ */
87
+ export class RoutingPolicyValidationError extends Error {
88
+ details;
89
+ constructor(message, details) {
90
+ super(message);
91
+ this.details = details;
92
+ this.name = 'RoutingPolicyValidationError';
93
+ Object.setPrototypeOf(this, new.target.prototype);
94
+ }
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // loadRoutingPolicy
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Load and validate a routing policy YAML file.
101
+ *
102
+ * @param filePath - Absolute or relative path to the routing policy YAML
103
+ * @returns Parsed and validated RoutingPolicy object
104
+ * @throws {RoutingPolicyValidationError} if the file cannot be parsed or the schema is invalid
105
+ *
106
+ * @example
107
+ * const policy = loadRoutingPolicy('.substrate/routing-policy.yaml')
108
+ */
109
+ export function loadRoutingPolicy(filePath) {
110
+ // Read the file
111
+ let rawContent;
112
+ try {
113
+ rawContent = readFileSync(filePath, 'utf-8');
114
+ }
115
+ catch (err) {
116
+ const message = err instanceof Error ? err.message : String(err);
117
+ throw new RoutingPolicyValidationError(`Cannot read routing policy file at "${filePath}": ${message}`);
118
+ }
119
+ // Parse YAML
120
+ let rawObject;
121
+ try {
122
+ rawObject = yamlLoad(rawContent);
123
+ }
124
+ catch (err) {
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ throw new RoutingPolicyValidationError(`Invalid YAML in routing policy file at "${filePath}": ${message}`);
127
+ }
128
+ if (rawObject === null || typeof rawObject !== 'object') {
129
+ throw new RoutingPolicyValidationError(`Routing policy file at "${filePath}" must contain a YAML object`);
130
+ }
131
+ // Validate with Zod
132
+ const result = RoutingPolicySchema.safeParse(rawObject);
133
+ if (!result.success) {
134
+ // Zod v4 uses `.issues` instead of deprecated `.errors`
135
+ const issues = result.error.issues ?? result.error.errors ?? [];
136
+ const details = issues
137
+ .map((e) => ` - ${e.path.join('.')}: ${e.message}`)
138
+ .join('\n');
139
+ throw new RoutingPolicyValidationError(`Routing policy validation failed for "${filePath}":\n${details}`, details);
140
+ }
141
+ // Validate that all task_type agents exist in providers
142
+ const policy = result.data;
143
+ const providerNames = new Set(Object.keys(policy.providers));
144
+ for (const [taskType, taskPolicy] of Object.entries(policy.task_types ?? {})) {
145
+ for (const agent of taskPolicy.preferred_agents) {
146
+ if (!providerNames.has(agent)) {
147
+ throw new RoutingPolicyValidationError(`Task type "${taskType}" references agent "${agent}" which is not defined in the providers section`);
148
+ }
149
+ }
150
+ }
151
+ // Validate default agents
152
+ for (const agent of policy.default.preferred_agents) {
153
+ if (!providerNames.has(agent)) {
154
+ throw new RoutingPolicyValidationError(`Default routing references agent "${agent}" which is not defined in the providers section`);
155
+ }
156
+ }
157
+ return policy;
158
+ }
159
+ //# sourceMappingURL=routing-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-policy.js","sourceRoot":"","sources":["../../src/routing/routing-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC9C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,UAAU,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,sBAAsB,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAA;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/D,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACjH,2BAA2B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACxD,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC5C,CAAC,CAAA;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,0BAA0B;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7E,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,MAAM,CAC1D,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAChD,EAAE,OAAO,EAAE,2DAA2D,EAAE,CACzE;IACD,MAAM,EAAE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,sBAAsB,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;CAC9G,CAAC,CAAA;AAIF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACR;IAA7C,YAAY,OAAe,EAAkB,OAAgB;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAA;QAD6B,YAAO,GAAP,OAAO,CAAS;QAE3D,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;CACF;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,gBAAgB;IAChB,IAAI,UAAkB,CAAA;IACtB,IAAI,CAAC;QACH,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,IAAI,4BAA4B,CACpC,uCAAuC,QAAQ,MAAM,OAAO,EAAE,CAC/D,CAAA;IACH,CAAC;IAED,aAAa;IACb,IAAI,SAAkB,CAAA;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,IAAI,4BAA4B,CACpC,2CAA2C,QAAQ,MAAM,OAAO,EAAE,CACnE,CAAA;IACH,CAAC;IAED,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,IAAI,4BAA4B,CACpC,2BAA2B,QAAQ,8BAA8B,CAClE,CAAA;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAK,MAAM,CAAC,KAA4E,CAAC,MAAM,IAAI,EAAE,CAAA;QACvI,MAAM,OAAO,GAAG,MAAM;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,MAAM,IAAI,4BAA4B,CACpC,yCAAyC,QAAQ,OAAO,OAAO,EAAE,EACjE,OAAO,CACR,CAAA;IACH,CAAC;IAED,wDAAwD;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAA;IAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAE5D,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,4BAA4B,CACpC,cAAc,QAAQ,uBAAuB,KAAK,iDAAiD,CACpG,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,4BAA4B,CACpC,qCAAqC,KAAK,iDAAiD,CAC5F,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * RoutingRecommender — analyzes per-phase token breakdown history and generates
3
+ * model routing recommendations.
4
+ *
5
+ * High output ratios (output / (input + output) > 0.40) indicate the model is
6
+ * doing more generation work than context consumption, suggesting an upgrade may
7
+ * be justified. Low output ratios (< 0.15) indicate mostly context-reading work
8
+ * where a cheaper model should suffice, triggering a downgrade recommendation.
9
+ *
10
+ * References:
11
+ * - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
12
+ */
13
+ import type { ILogger } from '../dispatch/types.js';
14
+ import type { ModelRoutingConfig } from './model-routing-config.js';
15
+ import type { PhaseTokenBreakdown, RoutingAnalysis } from './types.js';
16
+ /**
17
+ * Analyzes phase-level token breakdown history and produces routing
18
+ * recommendations based on observed output ratios.
19
+ *
20
+ * This class is stateless: call `analyze()` with historical breakdowns to
21
+ * get fresh recommendations each time.
22
+ */
23
+ export declare class RoutingRecommender {
24
+ private readonly _logger;
25
+ constructor(logger: ILogger);
26
+ /**
27
+ * Determine the model tier (1=haiku, 2=sonnet, 3=opus) for a given model name.
28
+ * Defaults to tier 2 (sonnet) when no keyword matches.
29
+ */
30
+ private _getTier;
31
+ /**
32
+ * Get the canonical model keyword fragment for a given tier.
33
+ */
34
+ private _getTierKeyword;
35
+ /**
36
+ * Compute the output ratio for a set of phase token entries:
37
+ * outputRatio = sum(outputTokens) / (sum(inputTokens) + sum(outputTokens))
38
+ *
39
+ * Returns 0.5 when the total token count is zero to avoid division by zero.
40
+ */
41
+ private _computeOutputRatio;
42
+ /**
43
+ * Analyze historical phase token breakdowns and produce routing recommendations.
44
+ *
45
+ * @param breakdowns - Historical PhaseTokenBreakdown records (one per pipeline run)
46
+ * @param config - Current model routing configuration
47
+ * @returns RoutingAnalysis with recommendations and per-phase output ratios
48
+ */
49
+ analyze(breakdowns: PhaseTokenBreakdown[], config: ModelRoutingConfig): RoutingAnalysis;
50
+ /**
51
+ * Replace the tier keyword in a model name string with a new keyword.
52
+ *
53
+ * e.g. ('claude-haiku-4-5', 1, 'sonnet') → 'claude-sonnet-4-5'
54
+ *
55
+ * If the current tier keyword is not found in the model name, returns
56
+ * a synthesised name like 'claude-sonnet' using the new keyword.
57
+ */
58
+ private _substituteTierKeyword;
59
+ }
60
+ //# sourceMappingURL=routing-recommender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-recommender.d.ts","sourceRoot":"","sources":["../../src/routing/routing-recommender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EACV,mBAAmB,EAEnB,eAAe,EAEhB,MAAM,YAAY,CAAA;AAoCnB;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,OAAO;IAQ3B;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,kBAAkB,GAAG,eAAe;IA4GvF;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;CAe/B"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * RoutingRecommender — analyzes per-phase token breakdown history and generates
3
+ * model routing recommendations.
4
+ *
5
+ * High output ratios (output / (input + output) > 0.40) indicate the model is
6
+ * doing more generation work than context consumption, suggesting an upgrade may
7
+ * be justified. Low output ratios (< 0.15) indicate mostly context-reading work
8
+ * where a cheaper model should suffice, triggering a downgrade recommendation.
9
+ *
10
+ * References:
11
+ * - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // Constants
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Ordered tier list: index 0 = cheapest / smallest, index N = most expensive / largest.
18
+ * Tiers are determined by substring matching — e.g. 'claude-haiku-4-5' → tier 1.
19
+ */
20
+ const TIER_KEYWORDS = [
21
+ { keyword: 'haiku', tier: 1 },
22
+ { keyword: 'sonnet', tier: 2 },
23
+ { keyword: 'opus', tier: 3 },
24
+ ];
25
+ /** Minimum historical breakdowns required before any recommendations are generated. */
26
+ const MIN_BREAKDOWNS = 3;
27
+ /** Output ratio below this threshold triggers a downgrade recommendation. */
28
+ const DOWNGRADE_THRESHOLD = 0.15;
29
+ /** Output ratio above this threshold triggers an upgrade recommendation. */
30
+ const UPGRADE_THRESHOLD = 0.40;
31
+ /** Ordered list of model name fragments by tier (cheapest → most expensive). */
32
+ const TIER_TO_MODEL_FRAGMENT = {
33
+ 1: 'haiku',
34
+ 2: 'sonnet',
35
+ 3: 'opus',
36
+ };
37
+ // ---------------------------------------------------------------------------
38
+ // RoutingRecommender
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Analyzes phase-level token breakdown history and produces routing
42
+ * recommendations based on observed output ratios.
43
+ *
44
+ * This class is stateless: call `analyze()` with historical breakdowns to
45
+ * get fresh recommendations each time.
46
+ */
47
+ export class RoutingRecommender {
48
+ _logger;
49
+ constructor(logger) {
50
+ this._logger = logger;
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Private helpers
54
+ // ---------------------------------------------------------------------------
55
+ /**
56
+ * Determine the model tier (1=haiku, 2=sonnet, 3=opus) for a given model name.
57
+ * Defaults to tier 2 (sonnet) when no keyword matches.
58
+ */
59
+ _getTier(model) {
60
+ const lower = model.toLowerCase();
61
+ for (const { keyword, tier } of TIER_KEYWORDS) {
62
+ if (lower.includes(keyword))
63
+ return tier;
64
+ }
65
+ return 2; // default: sonnet tier
66
+ }
67
+ /**
68
+ * Get the canonical model keyword fragment for a given tier.
69
+ */
70
+ _getTierKeyword(tier) {
71
+ return TIER_TO_MODEL_FRAGMENT[tier] ?? 'sonnet';
72
+ }
73
+ /**
74
+ * Compute the output ratio for a set of phase token entries:
75
+ * outputRatio = sum(outputTokens) / (sum(inputTokens) + sum(outputTokens))
76
+ *
77
+ * Returns 0.5 when the total token count is zero to avoid division by zero.
78
+ */
79
+ _computeOutputRatio(entries) {
80
+ let totalInput = 0;
81
+ let totalOutput = 0;
82
+ for (const entry of entries) {
83
+ totalInput += entry.inputTokens;
84
+ totalOutput += entry.outputTokens;
85
+ }
86
+ const total = totalInput + totalOutput;
87
+ if (total === 0)
88
+ return 0.5;
89
+ return totalOutput / total;
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Public API
93
+ // ---------------------------------------------------------------------------
94
+ /**
95
+ * Analyze historical phase token breakdowns and produce routing recommendations.
96
+ *
97
+ * @param breakdowns - Historical PhaseTokenBreakdown records (one per pipeline run)
98
+ * @param config - Current model routing configuration
99
+ * @returns RoutingAnalysis with recommendations and per-phase output ratios
100
+ */
101
+ analyze(breakdowns, config) {
102
+ if (breakdowns.length < MIN_BREAKDOWNS) {
103
+ this._logger.debug({ dataPoints: breakdowns.length, threshold: MIN_BREAKDOWNS, reason: 'insufficient_data' }, 'Insufficient data for routing analysis');
104
+ return {
105
+ recommendations: [],
106
+ analysisRuns: breakdowns.length,
107
+ insufficientData: true,
108
+ phaseOutputRatios: {},
109
+ };
110
+ }
111
+ // Group all entries by phase across all breakdowns
112
+ const phaseEntries = {};
113
+ for (const breakdown of breakdowns) {
114
+ for (const entry of breakdown.entries) {
115
+ const phase = entry.phase;
116
+ if (phaseEntries[phase] === undefined) {
117
+ phaseEntries[phase] = [];
118
+ }
119
+ phaseEntries[phase].push(entry);
120
+ }
121
+ }
122
+ // Compute output ratio per phase
123
+ const phaseOutputRatios = {};
124
+ for (const [phase, entries] of Object.entries(phaseEntries)) {
125
+ phaseOutputRatios[phase] = this._computeOutputRatio(entries);
126
+ }
127
+ // Generate recommendations per phase
128
+ const recommendations = [];
129
+ const confidence = Math.min(breakdowns.length / 10, 1);
130
+ for (const [phase, outputRatio] of Object.entries(phaseOutputRatios)) {
131
+ const currentModel = config.phases[phase]?.model ?? config.baseline_model;
132
+ const currentTier = this._getTier(currentModel);
133
+ if (outputRatio < DOWNGRADE_THRESHOLD) {
134
+ // Candidate for downgrade
135
+ const suggestedTier = currentTier - 1;
136
+ if (suggestedTier < 1) {
137
+ this._logger.debug({ phase, currentTier }, 'Already at minimum tier — skipping downgrade');
138
+ continue;
139
+ }
140
+ const suggestedKeyword = this._getTierKeyword(suggestedTier);
141
+ // Build suggested model name by replacing the tier keyword in the current model name.
142
+ // Falls back to just the keyword fragment if no keyword found in current model.
143
+ const suggestedModel = this._substituteTierKeyword(currentModel, currentTier, suggestedKeyword);
144
+ const estimatedSavingsPct = ((currentTier - suggestedTier) / currentTier) * 50;
145
+ recommendations.push({
146
+ phase,
147
+ currentModel,
148
+ suggestedModel,
149
+ estimatedSavingsPct,
150
+ confidence,
151
+ dataPoints: breakdowns.length,
152
+ direction: 'downgrade',
153
+ });
154
+ this._logger.debug({ phase, currentModel, suggestedModel, outputRatio, estimatedSavingsPct }, 'Downgrade recommendation generated');
155
+ }
156
+ else if (outputRatio > UPGRADE_THRESHOLD) {
157
+ // Candidate for upgrade
158
+ const suggestedTier = currentTier + 1;
159
+ if (suggestedTier > 3) {
160
+ this._logger.debug({ phase, currentTier }, 'Already at maximum tier — skipping upgrade');
161
+ continue;
162
+ }
163
+ const suggestedKeyword = this._getTierKeyword(suggestedTier);
164
+ const suggestedModel = this._substituteTierKeyword(currentModel, currentTier, suggestedKeyword);
165
+ const estimatedSavingsPct = ((currentTier - suggestedTier) / currentTier) * 50;
166
+ recommendations.push({
167
+ phase,
168
+ currentModel,
169
+ suggestedModel,
170
+ estimatedSavingsPct,
171
+ confidence,
172
+ dataPoints: breakdowns.length,
173
+ direction: 'upgrade',
174
+ });
175
+ this._logger.debug({ phase, currentModel, suggestedModel, outputRatio, estimatedSavingsPct }, 'Upgrade recommendation generated');
176
+ }
177
+ // Neutral zone (0.15..0.40): no recommendation
178
+ }
179
+ return {
180
+ recommendations,
181
+ analysisRuns: breakdowns.length,
182
+ insufficientData: false,
183
+ phaseOutputRatios,
184
+ };
185
+ }
186
+ // ---------------------------------------------------------------------------
187
+ // Private helpers
188
+ // ---------------------------------------------------------------------------
189
+ /**
190
+ * Replace the tier keyword in a model name string with a new keyword.
191
+ *
192
+ * e.g. ('claude-haiku-4-5', 1, 'sonnet') → 'claude-sonnet-4-5'
193
+ *
194
+ * If the current tier keyword is not found in the model name, returns
195
+ * a synthesised name like 'claude-sonnet' using the new keyword.
196
+ */
197
+ _substituteTierKeyword(currentModel, currentTier, newKeyword) {
198
+ const currentKeyword = this._getTierKeyword(currentTier);
199
+ if (currentModel.toLowerCase().includes(currentKeyword)) {
200
+ // Case-insensitive replacement
201
+ return currentModel.replace(new RegExp(currentKeyword, 'i'), newKeyword);
202
+ }
203
+ // Fallback: synthesize from prefix
204
+ const dashIdx = currentModel.indexOf('-');
205
+ const prefix = dashIdx !== -1 ? currentModel.slice(0, dashIdx) : currentModel;
206
+ return `${prefix}-${newKeyword}`;
207
+ }
208
+ }
209
+ //# sourceMappingURL=routing-recommender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-recommender.js","sourceRoot":"","sources":["../../src/routing/routing-recommender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * RoutingTelemetry — emits OTEL spans for model routing decisions.
3
+ *
4
+ * Call `recordModelResolved()` immediately after `RoutingResolver.resolveModel()`
5
+ * returns a non-null result to capture per-dispatch routing latency and metadata.
6
+ *
7
+ * References:
8
+ * - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
9
+ */
10
+ import type { ILogger } from '../dispatch/types.js';
11
+ import type { IRoutingTelemetryPersistence } from './types.js';
12
+ /**
13
+ * Emits `routing.model_resolved` OTEL spans via an IRoutingTelemetryPersistence instance.
14
+ *
15
+ * Injected into the run command alongside RoutingResolver. When telemetry is
16
+ * not configured, pass null to the run command; no spans are emitted.
17
+ */
18
+ export declare class RoutingTelemetry {
19
+ private readonly _telemetry;
20
+ private readonly _logger;
21
+ constructor(telemetry: IRoutingTelemetryPersistence, logger: ILogger);
22
+ /**
23
+ * Emit a `routing.model_resolved` span for a single routing decision.
24
+ *
25
+ * @param attrs - span attributes including dispatchId, taskType, phase, model, source, latencyMs
26
+ */
27
+ recordModelResolved(attrs: {
28
+ dispatchId: string;
29
+ taskType: string;
30
+ phase: string;
31
+ model: string;
32
+ source: string;
33
+ latencyMs: number;
34
+ }): void;
35
+ }
36
+ //# sourceMappingURL=routing-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-telemetry.d.ts","sourceRoot":"","sources":["../../src/routing/routing-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAM9D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,SAAS,EAAE,4BAA4B,EAAE,MAAM,EAAE,OAAO;IAKpE;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE;QACzB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI;CAOT"}