@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,39 @@
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
+ // ---------------------------------------------------------------------------
11
+ // RoutingTelemetry
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Emits `routing.model_resolved` OTEL spans via an IRoutingTelemetryPersistence instance.
15
+ *
16
+ * Injected into the run command alongside RoutingResolver. When telemetry is
17
+ * not configured, pass null to the run command; no spans are emitted.
18
+ */
19
+ export class RoutingTelemetry {
20
+ _telemetry;
21
+ _logger;
22
+ constructor(telemetry, logger) {
23
+ this._telemetry = telemetry;
24
+ this._logger = logger;
25
+ }
26
+ /**
27
+ * Emit a `routing.model_resolved` span for a single routing decision.
28
+ *
29
+ * @param attrs - span attributes including dispatchId, taskType, phase, model, source, latencyMs
30
+ */
31
+ recordModelResolved(attrs) {
32
+ this._telemetry.recordSpan({
33
+ name: 'routing.model_resolved',
34
+ attributes: attrs,
35
+ });
36
+ this._logger.debug(attrs, 'routing.model_resolved span emitted');
37
+ }
38
+ }
39
+ //# sourceMappingURL=routing-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-telemetry.js","sourceRoot":"","sources":["../../src/routing/routing-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACV,UAAU,CAA8B;IACxC,OAAO,CAAS;IAEjC,YAAY,SAAuC,EAAE,MAAe;QAClE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,KAOnB;QACC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACzB,IAAI,EAAE,wBAAwB;YAC9B,UAAU,EAAE,KAAK;SAClB,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,qCAAqC,CAAC,CAAA;IAClE,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * RoutingTokenAccumulator — collects per-dispatch routing metadata and
3
+ * attributes agent token usage to pipeline phase buckets.
4
+ *
5
+ * Usage:
6
+ * 1. Subscribe `onRoutingSelected` to `routing:model-selected` events.
7
+ * 2. Subscribe `onAgentCompleted` to `agent:completed` events.
8
+ * 3. Call `flush(runId)` at pipeline completion to persist the breakdown.
9
+ *
10
+ * References:
11
+ * - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
12
+ */
13
+ import type { ILogger } from '../dispatch/types.js';
14
+ import type { ModelRoutingConfig } from './model-routing-config.js';
15
+ import type { IStateStore } from './types.js';
16
+ /**
17
+ * Accumulates per-dispatch routing decisions and agent token usage, then
18
+ * flushes an aggregated `PhaseTokenBreakdown` to the IStateStore at run end.
19
+ *
20
+ * Thread-safety: all methods are synchronous accumulators; `flush` is async
21
+ * but should only be called once per run after all dispatches settle.
22
+ */
23
+ export declare class RoutingTokenAccumulator {
24
+ private readonly _config;
25
+ private readonly _stateStore;
26
+ private readonly _logger;
27
+ /** Maps dispatchId → { phase, model } registered from routing:model-selected events */
28
+ private readonly _dispatchMap;
29
+ /**
30
+ * Bucket key = `"${phase}::${model}"`.
31
+ * Separate entries per (phase, model) combination so mixed-model runs
32
+ * produce distinct rows in the breakdown.
33
+ */
34
+ private readonly _buckets;
35
+ constructor(config: ModelRoutingConfig, stateStore: IStateStore, logger: ILogger);
36
+ /**
37
+ * Register the routing decision for a dispatch.
38
+ * A second event for the same `dispatchId` overwrites the prior entry (last-writer-wins).
39
+ *
40
+ * @param event - payload from `routing:model-selected`
41
+ */
42
+ onRoutingSelected(event: {
43
+ dispatchId: string;
44
+ phase: string;
45
+ model: string;
46
+ }): void;
47
+ /**
48
+ * Attribute token usage to the phase bucket for this dispatch.
49
+ * Unknown `dispatchId` values are attributed to `phase: 'default', model: 'unknown'`.
50
+ *
51
+ * @param event - payload from `agent:completed` (must include inputTokens / outputTokens)
52
+ */
53
+ onAgentCompleted(event: {
54
+ dispatchId: string;
55
+ inputTokens: number;
56
+ outputTokens: number;
57
+ }): void;
58
+ /**
59
+ * Construct the `PhaseTokenBreakdown` from the accumulated buckets and
60
+ * persist it to the IStateStore via `setMetric`.
61
+ * Clears all in-memory state afterwards so a second call writes an empty entry.
62
+ *
63
+ * @param runId - the pipeline run ID used to scope the metric key
64
+ */
65
+ flush(runId: string): Promise<void>;
66
+ private _upsertBucket;
67
+ }
68
+ //# sourceMappingURL=routing-token-accumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-token-accumulator.d.ts","sourceRoot":"","sources":["../../src/routing/routing-token-accumulator.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,EAAE,WAAW,EAAwC,MAAM,YAAY,CAAA;AAMnF;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2D;IAExF;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;gBAEvD,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO;IAUhF;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQpF;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;KACrB,GAAG,IAAI;IAeR;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBzC,OAAO,CAAC,aAAa;CAsBtB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * RoutingTokenAccumulator — collects per-dispatch routing metadata and
3
+ * attributes agent token usage to pipeline phase buckets.
4
+ *
5
+ * Usage:
6
+ * 1. Subscribe `onRoutingSelected` to `routing:model-selected` events.
7
+ * 2. Subscribe `onAgentCompleted` to `agent:completed` events.
8
+ * 3. Call `flush(runId)` at pipeline completion to persist the breakdown.
9
+ *
10
+ * References:
11
+ * - Epic 28, Story 28-6: Routing Telemetry — Per-Phase Token Tracking and OTEL Spans
12
+ */
13
+ // ---------------------------------------------------------------------------
14
+ // RoutingTokenAccumulator
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Accumulates per-dispatch routing decisions and agent token usage, then
18
+ * flushes an aggregated `PhaseTokenBreakdown` to the IStateStore at run end.
19
+ *
20
+ * Thread-safety: all methods are synchronous accumulators; `flush` is async
21
+ * but should only be called once per run after all dispatches settle.
22
+ */
23
+ export class RoutingTokenAccumulator {
24
+ _config;
25
+ _stateStore;
26
+ _logger;
27
+ /** Maps dispatchId → { phase, model } registered from routing:model-selected events */
28
+ _dispatchMap = new Map();
29
+ /**
30
+ * Bucket key = `"${phase}::${model}"`.
31
+ * Separate entries per (phase, model) combination so mixed-model runs
32
+ * produce distinct rows in the breakdown.
33
+ */
34
+ _buckets = new Map();
35
+ constructor(config, stateStore, logger) {
36
+ this._config = config;
37
+ this._stateStore = stateStore;
38
+ this._logger = logger;
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Event handlers
42
+ // ---------------------------------------------------------------------------
43
+ /**
44
+ * Register the routing decision for a dispatch.
45
+ * A second event for the same `dispatchId` overwrites the prior entry (last-writer-wins).
46
+ *
47
+ * @param event - payload from `routing:model-selected`
48
+ */
49
+ onRoutingSelected(event) {
50
+ this._dispatchMap.set(event.dispatchId, { phase: event.phase, model: event.model });
51
+ this._logger.debug({ dispatchId: event.dispatchId, phase: event.phase, model: event.model }, 'routing:model-selected registered');
52
+ }
53
+ /**
54
+ * Attribute token usage to the phase bucket for this dispatch.
55
+ * Unknown `dispatchId` values are attributed to `phase: 'default', model: 'unknown'`.
56
+ *
57
+ * @param event - payload from `agent:completed` (must include inputTokens / outputTokens)
58
+ */
59
+ onAgentCompleted(event) {
60
+ const mapping = this._dispatchMap.get(event.dispatchId);
61
+ const phase = mapping?.phase ?? 'default';
62
+ const model = mapping?.model ?? 'unknown';
63
+ this._upsertBucket(phase, model, event.inputTokens, event.outputTokens);
64
+ this._logger.debug({ dispatchId: event.dispatchId, phase, model, inputTokens: event.inputTokens }, 'agent:completed attributed');
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Flush
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Construct the `PhaseTokenBreakdown` from the accumulated buckets and
71
+ * persist it to the IStateStore via `setMetric`.
72
+ * Clears all in-memory state afterwards so a second call writes an empty entry.
73
+ *
74
+ * @param runId - the pipeline run ID used to scope the metric key
75
+ */
76
+ async flush(runId) {
77
+ const entries = Array.from(this._buckets.values());
78
+ const breakdown = {
79
+ entries,
80
+ baselineModel: this._config.baseline_model,
81
+ runId,
82
+ };
83
+ await this._stateStore.setMetric(runId, 'phase_token_breakdown', breakdown);
84
+ this._logger.debug({ runId, entryCount: entries.length }, 'Phase token breakdown flushed to StateStore');
85
+ // Clear in-memory state — a subsequent flush() will write an empty breakdown.
86
+ this._dispatchMap.clear();
87
+ this._buckets.clear();
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Private helpers
91
+ // ---------------------------------------------------------------------------
92
+ _upsertBucket(phase, model, inputTokens, outputTokens) {
93
+ const key = `${phase}::${model}`;
94
+ const existing = this._buckets.get(key);
95
+ if (existing) {
96
+ existing.inputTokens += inputTokens;
97
+ existing.outputTokens += outputTokens;
98
+ existing.dispatchCount += 1;
99
+ }
100
+ else {
101
+ this._buckets.set(key, {
102
+ phase: phase,
103
+ model,
104
+ inputTokens,
105
+ outputTokens,
106
+ dispatchCount: 1,
107
+ });
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=routing-token-accumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-token-accumulator.js","sourceRoot":"","sources":["../../src/routing/routing-token-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IACjB,OAAO,CAAoB;IAC3B,WAAW,CAAa;IACxB,OAAO,CAAS;IAEjC,uFAAuF;IACtE,YAAY,GAAkD,IAAI,GAAG,EAAE,CAAA;IAExF;;;;OAIG;IACc,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAA;IAEnE,YAAY,MAA0B,EAAE,UAAuB,EAAE,MAAe;QAC9E,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,8EAA8E;IAC9E,iBAAiB;IACjB,8EAA8E;IAE9E;;;;;OAKG;IACH,iBAAiB,CAAC,KAA2D;QAC3E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QACnF,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EACxE,mCAAmC,CACpC,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,KAIhB;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACvD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAA;QACzC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAA;QACzC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;QACvE,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAC9E,4BAA4B,CAC7B,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,QAAQ;IACR,8EAA8E;IAE9E;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAClD,MAAM,SAAS,GAAwB;YACrC,OAAO;YACP,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;YAC1C,KAAK;SACN,CAAA;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAA;QAE3E,IAAI,CAAC,OAAO,CAAC,KAAK,CAChB,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,EACrC,6CAA6C,CAC9C,CAAA;QAED,8EAA8E;QAC9E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,aAAa,CACnB,KAAa,EACb,KAAa,EACb,WAAmB,EACnB,YAAoB;QAEpB,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,KAAK,EAAE,CAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,WAAW,IAAI,WAAW,CAAA;YACnC,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAA;YACrC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrB,KAAK,EAAE,KAAiC;gBACxC,KAAK;gBACL,WAAW;gBACX,YAAY;gBACZ,aAAa,EAAE,CAAC;aACjB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * RoutingTuner — automatically applies conservative model downgrades based on
3
+ * historical phase token breakdown data.
4
+ *
5
+ * When `config.auto_tune` is true and enough historical data exists, RoutingTuner
6
+ * selects the highest-confidence downgrade recommendation, updates the YAML config
7
+ * file in place, and appends an audit log entry to the IStateStore.
8
+ *
9
+ * At most one phase is changed per invocation.
10
+ *
11
+ * References:
12
+ * - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
13
+ */
14
+ import type { ILogger } from '../dispatch/types.js';
15
+ import type { TypedEventBus } from '../events/event-bus.js';
16
+ import type { CoreEvents } from '../events/core-events.js';
17
+ import type { ModelRoutingConfig } from './model-routing-config.js';
18
+ import type { IStateStore } from './types.js';
19
+ import { RoutingRecommender } from './routing-recommender.js';
20
+ /**
21
+ * Auto-applies a single conservative model downgrade per invocation when
22
+ * `config.auto_tune` is `true` and sufficient historical data is available.
23
+ *
24
+ * The tuner reads the current routing YAML config, applies the change in memory,
25
+ * and writes it back to disk synchronously. It also appends a `TuneLogEntry`
26
+ * to the IStateStore for audit purposes, and emits a `routing:auto-tuned` event.
27
+ */
28
+ export declare class RoutingTuner {
29
+ private readonly _stateStore;
30
+ private readonly _recommender;
31
+ private readonly _eventEmitter;
32
+ private readonly _configPath;
33
+ private readonly _logger;
34
+ constructor(stateStore: IStateStore, recommender: RoutingRecommender, eventEmitter: TypedEventBus<CoreEvents>, configPath: string, logger: ILogger);
35
+ /**
36
+ * Called at the end of a pipeline run. When auto_tune is enabled and sufficient
37
+ * historical data exists, applies a single conservative model downgrade to the
38
+ * routing config YAML file.
39
+ *
40
+ * @param runId - ID of the just-completed pipeline run
41
+ * @param config - Current model routing config (already loaded from disk)
42
+ */
43
+ maybeAutoTune(runId: string, config: ModelRoutingConfig): Promise<void>;
44
+ /**
45
+ * Register a run ID in the stored run index so future calls can discover
46
+ * all historical breakdowns without a separate run listing endpoint.
47
+ */
48
+ private _registerRunId;
49
+ /**
50
+ * Load the most recent `lookback` PhaseTokenBreakdown records from the IStateStore.
51
+ *
52
+ * Each breakdown is stored by RoutingTokenAccumulator under the key
53
+ * `'phase_token_breakdown'` scoped to the run ID. The run IDs themselves are
54
+ * tracked in a global index stored under `('__global__', RUN_INDEX_KEY)`.
55
+ *
56
+ * @param lookback - Maximum number of recent runs to inspect
57
+ */
58
+ private _loadRecentBreakdowns;
59
+ /**
60
+ * Append a TuneLogEntry to the persisted tune log in the IStateStore.
61
+ *
62
+ * NOTE: This uses `'__global__'` as the scope key (codebase convention) rather
63
+ * than the literal `'global'` mentioned in AC6. The tune log is stored as a raw
64
+ * array (not a JSON-stringified string) for internal consistency with how other
65
+ * array values are stored in this IStateStore.
66
+ */
67
+ private _appendTuneLog;
68
+ }
69
+ //# sourceMappingURL=routing-tuner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-tuner.d.ts","sourceRoot":"","sources":["../../src/routing/routing-tuner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAqC,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAoB7D;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAG/B,UAAU,EAAE,WAAW,EACvB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC,EACvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO;IAajB;;;;;;;OAOG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsH7E;;;OAGG;YACW,cAAc;IAS5B;;;;;;;;OAQG;YACW,qBAAqB;IA0BnC;;;;;;;OAOG;YACW,cAAc;CAM7B"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * RoutingTuner — automatically applies conservative model downgrades based on
3
+ * historical phase token breakdown data.
4
+ *
5
+ * When `config.auto_tune` is true and enough historical data exists, RoutingTuner
6
+ * selects the highest-confidence downgrade recommendation, updates the YAML config
7
+ * file in place, and appends an audit log entry to the IStateStore.
8
+ *
9
+ * At most one phase is changed per invocation.
10
+ *
11
+ * References:
12
+ * - Epic 28, Story 28-8: Feedback Loop — Telemetry-Driven Routing Tuning
13
+ */
14
+ import { readFileSync, writeFileSync } from 'node:fs';
15
+ import { load as yamlLoad, dump as yamlDump } from 'js-yaml';
16
+ import { getModelTier } from './model-tier.js';
17
+ // ---------------------------------------------------------------------------
18
+ // Internal constants
19
+ // ---------------------------------------------------------------------------
20
+ /** Minimum number of breakdowns required before auto-tuning is attempted. */
21
+ const MIN_BREAKDOWNS_FOR_TUNING = 5;
22
+ /** Key used to store the list of known run IDs in the IStateStore. */
23
+ const RUN_INDEX_KEY = 'phase_token_breakdown_runs';
24
+ /** Key used to store the tune log in the IStateStore. */
25
+ const TUNE_LOG_KEY = 'routing_tune_log';
26
+ // ---------------------------------------------------------------------------
27
+ // RoutingTuner
28
+ // ---------------------------------------------------------------------------
29
+ /**
30
+ * Auto-applies a single conservative model downgrade per invocation when
31
+ * `config.auto_tune` is `true` and sufficient historical data is available.
32
+ *
33
+ * The tuner reads the current routing YAML config, applies the change in memory,
34
+ * and writes it back to disk synchronously. It also appends a `TuneLogEntry`
35
+ * to the IStateStore for audit purposes, and emits a `routing:auto-tuned` event.
36
+ */
37
+ export class RoutingTuner {
38
+ _stateStore;
39
+ _recommender;
40
+ _eventEmitter;
41
+ _configPath;
42
+ _logger;
43
+ constructor(stateStore, recommender, eventEmitter, configPath, logger) {
44
+ this._stateStore = stateStore;
45
+ this._recommender = recommender;
46
+ this._eventEmitter = eventEmitter;
47
+ this._configPath = configPath;
48
+ this._logger = logger;
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Public API
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Called at the end of a pipeline run. When auto_tune is enabled and sufficient
55
+ * historical data exists, applies a single conservative model downgrade to the
56
+ * routing config YAML file.
57
+ *
58
+ * @param runId - ID of the just-completed pipeline run
59
+ * @param config - Current model routing config (already loaded from disk)
60
+ */
61
+ async maybeAutoTune(runId, config) {
62
+ if (config.auto_tune !== true) {
63
+ this._logger.debug({ runId }, 'auto_tune_disabled — skipping RoutingTuner');
64
+ return;
65
+ }
66
+ // Register the current run in the run index
67
+ await this._registerRunId(runId);
68
+ // Load recent breakdowns
69
+ const breakdowns = await this._loadRecentBreakdowns(10);
70
+ if (breakdowns.length < MIN_BREAKDOWNS_FOR_TUNING) {
71
+ this._logger.debug({ runId, available: breakdowns.length, required: MIN_BREAKDOWNS_FOR_TUNING }, 'insufficient_data — not enough breakdowns for auto-tuning');
72
+ return;
73
+ }
74
+ // Compute recommendations
75
+ const analysis = this._recommender.analyze(breakdowns, config);
76
+ if (analysis.insufficientData) {
77
+ this._logger.debug({ runId }, 'Recommender returned insufficientData');
78
+ return;
79
+ }
80
+ // Filter to downgrade-only, one-step transitions (|currentTier - suggestedTier| === 1).
81
+ // The one-step check uses getModelTier() to prevent opus→haiku two-step jumps even
82
+ // if a recommender were to emit such a recommendation.
83
+ const downgradeCandidates = analysis.recommendations.filter((rec) => {
84
+ if (rec.direction !== 'downgrade')
85
+ return false;
86
+ const tierDiff = Math.abs(getModelTier(rec.currentModel) - getModelTier(rec.suggestedModel));
87
+ return tierDiff === 1;
88
+ });
89
+ if (downgradeCandidates.length === 0) {
90
+ this._logger.debug({ runId }, 'no_safe_recommendation');
91
+ return;
92
+ }
93
+ // Pick the highest-confidence candidate
94
+ const topRec = downgradeCandidates.sort((a, b) => b.confidence - a.confidence)[0];
95
+ // Apply the change to the YAML config
96
+ let rawContent;
97
+ try {
98
+ rawContent = readFileSync(this._configPath, 'utf-8');
99
+ }
100
+ catch (err) {
101
+ const msg = err instanceof Error ? err.message : String(err);
102
+ this._logger.warn({ err: msg, configPath: this._configPath }, 'Failed to read routing config for auto-tune');
103
+ return;
104
+ }
105
+ let rawObject;
106
+ try {
107
+ rawObject = yamlLoad(rawContent);
108
+ }
109
+ catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ this._logger.warn({ err: msg }, 'Failed to parse routing config YAML for auto-tune');
112
+ return;
113
+ }
114
+ // Mutate the phase model
115
+ const configObj = rawObject;
116
+ if (configObj.phases === undefined) {
117
+ configObj.phases = {};
118
+ }
119
+ const existingPhase = configObj.phases[topRec.phase];
120
+ if (existingPhase !== undefined) {
121
+ existingPhase.model = topRec.suggestedModel;
122
+ }
123
+ else {
124
+ configObj.phases[topRec.phase] = { model: topRec.suggestedModel };
125
+ }
126
+ // Write the updated config back to disk
127
+ try {
128
+ writeFileSync(this._configPath, yamlDump(rawObject, { lineWidth: 120 }), 'utf-8');
129
+ }
130
+ catch (err) {
131
+ const msg = err instanceof Error ? err.message : String(err);
132
+ this._logger.warn({ err: msg, configPath: this._configPath }, 'Failed to write updated routing config');
133
+ return;
134
+ }
135
+ // Append audit log entry
136
+ const tuneEntry = {
137
+ id: crypto.randomUUID(),
138
+ runId,
139
+ phase: topRec.phase,
140
+ oldModel: topRec.currentModel,
141
+ newModel: topRec.suggestedModel,
142
+ estimatedSavingsPct: topRec.estimatedSavingsPct,
143
+ appliedAt: new Date().toISOString(),
144
+ };
145
+ await this._appendTuneLog(tuneEntry);
146
+ // Emit event
147
+ this._eventEmitter.emit('routing:auto-tuned', {
148
+ runId,
149
+ phase: topRec.phase,
150
+ oldModel: topRec.currentModel,
151
+ newModel: topRec.suggestedModel,
152
+ estimatedSavingsPct: topRec.estimatedSavingsPct,
153
+ });
154
+ this._logger.info({ runId, phase: topRec.phase, oldModel: topRec.currentModel, newModel: topRec.suggestedModel }, 'Auto-tuned routing config — applied downgrade');
155
+ }
156
+ // ---------------------------------------------------------------------------
157
+ // Private helpers
158
+ // ---------------------------------------------------------------------------
159
+ /**
160
+ * Register a run ID in the stored run index so future calls can discover
161
+ * all historical breakdowns without a separate run listing endpoint.
162
+ */
163
+ async _registerRunId(runId) {
164
+ const existing = await this._stateStore.getMetric('__global__', RUN_INDEX_KEY);
165
+ const runIds = Array.isArray(existing) ? existing : [];
166
+ if (!runIds.includes(runId)) {
167
+ runIds.push(runId);
168
+ await this._stateStore.setMetric('__global__', RUN_INDEX_KEY, runIds);
169
+ }
170
+ }
171
+ /**
172
+ * Load the most recent `lookback` PhaseTokenBreakdown records from the IStateStore.
173
+ *
174
+ * Each breakdown is stored by RoutingTokenAccumulator under the key
175
+ * `'phase_token_breakdown'` scoped to the run ID. The run IDs themselves are
176
+ * tracked in a global index stored under `('__global__', RUN_INDEX_KEY)`.
177
+ *
178
+ * @param lookback - Maximum number of recent runs to inspect
179
+ */
180
+ async _loadRecentBreakdowns(lookback) {
181
+ const existing = await this._stateStore.getMetric('__global__', RUN_INDEX_KEY);
182
+ const allRunIds = Array.isArray(existing) ? existing : [];
183
+ // Take the most recent `lookback` run IDs
184
+ const recentRunIds = allRunIds.slice(-lookback);
185
+ const breakdowns = [];
186
+ for (const runId of recentRunIds) {
187
+ try {
188
+ const raw = await this._stateStore.getMetric(runId, 'phase_token_breakdown');
189
+ if (raw !== undefined && raw !== null) {
190
+ // The value may be stored as an object or as a JSON string
191
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
192
+ breakdowns.push(parsed);
193
+ }
194
+ }
195
+ catch (err) {
196
+ const msg = err instanceof Error ? err.message : String(err);
197
+ this._logger.debug({ runId, err: msg }, 'Failed to load breakdown for run — skipping');
198
+ }
199
+ }
200
+ return breakdowns;
201
+ }
202
+ /**
203
+ * Append a TuneLogEntry to the persisted tune log in the IStateStore.
204
+ *
205
+ * NOTE: This uses `'__global__'` as the scope key (codebase convention) rather
206
+ * than the literal `'global'` mentioned in AC6. The tune log is stored as a raw
207
+ * array (not a JSON-stringified string) for internal consistency with how other
208
+ * array values are stored in this IStateStore.
209
+ */
210
+ async _appendTuneLog(entry) {
211
+ const existing = await this._stateStore.getMetric('__global__', TUNE_LOG_KEY);
212
+ const log = Array.isArray(existing) ? existing : [];
213
+ log.push(entry);
214
+ await this._stateStore.setMetric('__global__', TUNE_LOG_KEY, log);
215
+ }
216
+ }
217
+ //# sourceMappingURL=routing-tuner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-tuner.js","sourceRoot":"","sources":["../../src/routing/routing-tuner.ts"],"names":[],"mappings":"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"}