@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,450 @@
1
+ /**
2
+ * RoutingEngineImpl — full implementation of the RoutingEngine.
3
+ *
4
+ * Responsibilities:
5
+ * 1. Load and validate routing policy on initialization
6
+ * 2. Subscribe to task:ready events and make routing decisions
7
+ * 3. Emit task:routed events with full RoutingDecision
8
+ * 4. Subscribe to task:complete events to update rate limit tracking
9
+ * 5. Emit provider:unavailable when rate limits are exhausted
10
+ * 6. Support hot-reload via reloadPolicy()
11
+ *
12
+ * Architecture constraints:
13
+ * - ADR-004: Stateless except for rate limit tracking in-memory
14
+ * - ADR-008: Subscription-first policy is mandatory
15
+ * - FR22, FR23, FR25: Subscription routing toggles per provider
16
+ * - FR29: Rate limit management
17
+ * - FR38: Hot-reload without daemon restart
18
+ * - NFR7: Routing decision rationale in all decisions
19
+ */
20
+ import { loadRoutingPolicy } from './routing-policy.js';
21
+ import { ProviderStatusTracker } from './provider-status.js';
22
+ import { makeRoutingDecision } from './routing-decision.js';
23
+ /** Default path to the routing policy YAML */
24
+ const DEFAULT_ROUTING_POLICY_PATH = '.substrate/routing-policy.yaml';
25
+ // ---------------------------------------------------------------------------
26
+ // RoutingEngineImpl
27
+ // ---------------------------------------------------------------------------
28
+ export class RoutingEngineImpl {
29
+ _eventBus;
30
+ _configSystem;
31
+ _adapterRegistry;
32
+ _logger;
33
+ _policy = null;
34
+ _policyPath = DEFAULT_ROUTING_POLICY_PATH;
35
+ _statusTracker = new ProviderStatusTracker();
36
+ /** Optional monitor agent for advisory recommendations (AC5) */
37
+ _monitorAgent = null;
38
+ /** Whether to consult monitor for recommendations (AC6) */
39
+ _useMonitorRecommendations = false;
40
+ /** Bound references for event listener management */
41
+ _onTaskReady;
42
+ _onTaskComplete;
43
+ _onConfigReloaded;
44
+ constructor(eventBus, configSystem, adapterRegistry, logger) {
45
+ this._eventBus = eventBus;
46
+ this._configSystem = configSystem ?? null;
47
+ this._adapterRegistry = adapterRegistry ?? null;
48
+ this._logger = logger ?? console;
49
+ this._onTaskReady = ({ taskId, taskType }) => {
50
+ this._handleTaskReady(taskId, taskType);
51
+ };
52
+ this._onTaskComplete = ({ taskId, result }) => {
53
+ this._handleTaskComplete(taskId, result);
54
+ };
55
+ this._onConfigReloaded = (payload) => {
56
+ this._handleConfigReloaded(payload.changedKeys, payload.newConfig);
57
+ };
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // BaseService lifecycle
61
+ // ---------------------------------------------------------------------------
62
+ async initialize() {
63
+ this._logger.info('RoutingEngine.initialize()');
64
+ // Resolve routing policy path from config
65
+ if (this._configSystem !== null) {
66
+ const configuredPath = this._configSystem.get('routing_policy_path');
67
+ if (typeof configuredPath === 'string' && configuredPath.length > 0) {
68
+ this._policyPath = configuredPath;
69
+ }
70
+ }
71
+ // Load routing policy (gracefully handle missing file — policy is optional)
72
+ try {
73
+ this._policy = loadRoutingPolicy(this._policyPath);
74
+ this._initializeProviderTracking();
75
+ this._logger.info({ policyPath: this._policyPath }, 'Routing policy loaded successfully');
76
+ }
77
+ catch (err) {
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ this._logger.debug({ policyPath: this._policyPath, err: message }, 'Routing policy not loaded — routing will use fallback behavior');
80
+ this._policy = null;
81
+ }
82
+ // Subscribe to events
83
+ this._eventBus.on('task:ready', this._onTaskReady);
84
+ this._eventBus.on('task:complete', this._onTaskComplete);
85
+ this._eventBus.on('config:reloaded', this._onConfigReloaded);
86
+ }
87
+ async shutdown() {
88
+ this._logger.info('RoutingEngine.shutdown()');
89
+ this._eventBus.off('task:ready', this._onTaskReady);
90
+ this._eventBus.off('task:complete', this._onTaskComplete);
91
+ this._eventBus.off('config:reloaded', this._onConfigReloaded);
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // RoutingEngine interface
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Set the monitor agent for advisory recommendations (AC5).
98
+ * Called externally when use_monitor_recommendations=true.
99
+ */
100
+ setMonitorAgent(monitorAgent, useRecommendations = true) {
101
+ this._monitorAgent = monitorAgent;
102
+ this._useMonitorRecommendations = useRecommendations;
103
+ this._logger.debug({ useRecommendations }, 'Monitor agent registered with routing engine');
104
+ }
105
+ /**
106
+ * Make a routing decision for a task.
107
+ *
108
+ * Implements the subscription-first algorithm from Architecture Section 8:
109
+ * 1. Check if task has explicit agent assignment
110
+ * 2. Determine preferred agents from routing policy (task type → preferred_agents)
111
+ * 3. For each preferred agent, evaluate subscription-first logic:
112
+ * a. If subscription_routing=true AND capacity available AND rate limit OK → subscription
113
+ * b. Else if API billing enabled AND API key configured → API
114
+ * c. Else try next fallback agent
115
+ * 4. If no agent available → return unavailable decision
116
+ * 5. (Advisory) If monitor agent available, attach recommendation (AC5)
117
+ */
118
+ routeTask(task) {
119
+ const taskId = task.id;
120
+ // Support both task.type (new RoutingTask style) and task.metadata?.taskType (TaskNode style)
121
+ const taskType = task.type ?? task.metadata?.['taskType'] ?? '';
122
+ this._logger.debug({ taskId, taskType }, 'routeTask called');
123
+ // No policy loaded — emit basic decision with first available adapter
124
+ if (this._policy === null) {
125
+ return this._routeWithoutPolicy(task);
126
+ }
127
+ // Get preferred agents based on task type (falls back to default)
128
+ const taskTypePolicy = taskType.length > 0 ? this._policy.task_types?.[taskType] : undefined;
129
+ const preferredAgents = taskTypePolicy?.preferred_agents ?? this._policy.default.preferred_agents;
130
+ const modelPreferences = taskTypePolicy?.model_preferences ?? {};
131
+ // Collect the fallback chain for auditing
132
+ const fallbackChain = [...preferredAgents];
133
+ // Check explicit agent assignment
134
+ if (task.agentId !== undefined && task.agentId.length > 0) {
135
+ const explicitAgent = task.agentId;
136
+ const provider = this._policy.providers[explicitAgent];
137
+ if (provider !== undefined && provider.enabled) {
138
+ const decision = this._evaluateAgent(taskId, explicitAgent, provider, modelPreferences);
139
+ if (decision !== null) {
140
+ const builder = makeRoutingDecision(taskId)
141
+ .withAgent(decision.agent, decision.billingMode)
142
+ .withModel(decision.model ?? '')
143
+ .withRationale(`Explicit agent assignment: ${explicitAgent} via ${decision.billingMode}`)
144
+ .withFallbackChain([explicitAgent]);
145
+ this._attachMonitorRecommendation(builder, taskType, decision.agent);
146
+ return builder.build();
147
+ }
148
+ }
149
+ // Explicit agent unavailable — fall through to policy routing
150
+ this._logger.debug({ taskId, explicitAgent }, 'Explicit agent unavailable, falling back to policy');
151
+ }
152
+ // Evaluate each preferred agent in order
153
+ for (const agentName of preferredAgents) {
154
+ const provider = this._policy.providers[agentName];
155
+ if (provider === undefined || !provider.enabled) {
156
+ this._logger.debug({ taskId, agentName }, 'Agent not in providers or disabled, skipping');
157
+ continue;
158
+ }
159
+ const decision = this._evaluateAgent(taskId, agentName, provider, modelPreferences);
160
+ if (decision !== null) {
161
+ // Determine rationale
162
+ const rationale = this._buildRationale(taskId, agentName, decision.billingMode, taskType);
163
+ const builder = makeRoutingDecision(taskId)
164
+ .withAgent(decision.agent, decision.billingMode)
165
+ .withModel(decision.model ?? '')
166
+ .withRationale(rationale)
167
+ .withFallbackChain(fallbackChain);
168
+ this._attachMonitorRecommendation(builder, taskType, decision.agent);
169
+ return builder.build();
170
+ }
171
+ }
172
+ // All preferred agents unavailable
173
+ const rationale = `All preferred agents unavailable for task type "${taskType || 'default'}": [${preferredAgents.join(', ')}]`;
174
+ this._logger.warn({ taskId, preferredAgents }, rationale);
175
+ // Emit provider:unavailable for the primary agent
176
+ if (preferredAgents.length > 0) {
177
+ this._eventBus.emit('provider:unavailable', {
178
+ provider: preferredAgents[0],
179
+ reason: 'rate_limit',
180
+ resetAtMs: this._statusTracker.getRateLimitResetTime(preferredAgents[0]).getTime(),
181
+ });
182
+ }
183
+ return makeRoutingDecision(taskId)
184
+ .unavailable(rationale)
185
+ .withFallbackChain(fallbackChain)
186
+ .build();
187
+ }
188
+ /**
189
+ * Get the current status of a provider.
190
+ */
191
+ getProviderStatus(providerName) {
192
+ return this._statusTracker.getStatus(providerName);
193
+ }
194
+ /**
195
+ * Record token usage for rate limit tracking after task completion.
196
+ */
197
+ updateRateLimit(provider, tokensUsed) {
198
+ this._statusTracker.recordTokenUsage(provider, tokensUsed);
199
+ this._logger.debug({ provider, tokensUsed }, 'Rate limit updated');
200
+ }
201
+ /**
202
+ * Hot-reload the routing policy from disk without daemon restart (FR38).
203
+ */
204
+ async reloadPolicy() {
205
+ this._logger.info({ policyPath: this._policyPath }, 'Reloading routing policy');
206
+ const newPolicy = loadRoutingPolicy(this._policyPath);
207
+ this._policy = newPolicy;
208
+ this._initializeProviderTracking();
209
+ this._logger.info('Routing policy reloaded successfully');
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Event handlers
213
+ // ---------------------------------------------------------------------------
214
+ _handleTaskReady(taskId, taskType) {
215
+ this._logger.debug({ taskId, taskType }, 'task:ready — making routing decision');
216
+ if (this._policy === null) {
217
+ this._logger.debug({ taskId }, 'No routing policy — emitting minimal routing decision');
218
+ const decision = makeRoutingDecision(taskId)
219
+ .withAgent('', 'unavailable')
220
+ .withRationale('No routing policy configured')
221
+ .build();
222
+ this._eventBus.emit('task:routed', { taskId, decision });
223
+ return;
224
+ }
225
+ // Build task node with task type from the event payload
226
+ const minimalTask = {
227
+ id: taskId,
228
+ ...(taskType !== undefined ? { type: taskType } : {}),
229
+ metadata: taskType ? { taskType } : {},
230
+ };
231
+ const decision = this.routeTask(minimalTask);
232
+ this._eventBus.emit('task:routed', { taskId, decision });
233
+ }
234
+ _handleTaskComplete(taskId, result) {
235
+ // We need to know which provider was used — this requires tracking from task:routed
236
+ // For now, we can't easily reverse-map taskId→provider without additional state.
237
+ // The full integration with billing/cost tracking happens in Story 4.2.
238
+ this._logger.debug({ taskId, tokensUsed: result.tokensUsed }, 'task:complete received — rate limit tracking deferred to cost tracker');
239
+ }
240
+ _handleConfigReloaded(changedKeys, newConfig) {
241
+ // Use provider configuration from newConfig directly when available (AC4)
242
+ // Already-dispatched tasks are NOT re-routed; routing is determined at dispatch time.
243
+ const hasRoutingChanges = changedKeys.some((k) => k.startsWith('providers.') || k.startsWith('routing') || k === 'routing_policy_path');
244
+ if (!hasRoutingChanges) {
245
+ this._logger.debug({ changedKeys }, 'Config reloaded but no routing-relevant changes — skipping policy reload');
246
+ return;
247
+ }
248
+ // Update policy path from newConfig if provided
249
+ const configRoutingPolicyPath = newConfig['routing_policy_path'];
250
+ if (typeof configRoutingPolicyPath === 'string' && configRoutingPolicyPath.length > 0) {
251
+ this._policyPath = configRoutingPolicyPath;
252
+ }
253
+ // Reload routing policy from its dedicated file (routing policy is separate from main config)
254
+ this.reloadPolicy().then(() => {
255
+ this._logger.info({ changedKeys }, 'Routing policy updated from config reload');
256
+ }).catch((err) => {
257
+ const message = err instanceof Error ? err.message : String(err);
258
+ this._logger.warn({ err: message }, 'Failed to reload routing policy after config reload');
259
+ });
260
+ }
261
+ // ---------------------------------------------------------------------------
262
+ // Routing algorithm helpers
263
+ // ---------------------------------------------------------------------------
264
+ /**
265
+ * Evaluate a single agent using the subscription-first algorithm.
266
+ * Returns { agent, billingMode, model } if available, null if not.
267
+ */
268
+ _evaluateAgent(taskId, agentName, provider, modelPreferences) {
269
+ const model = modelPreferences[agentName];
270
+ const status = this._statusTracker.getStatus(agentName);
271
+ // Check subscription path first (ADR-008: subscription-first is mandatory)
272
+ if (provider.subscription_routing) {
273
+ const rateLimitOk = status !== null
274
+ ? this._statusTracker.checkRateLimit(agentName, 1) // pass 1 to detect fully-exhausted window
275
+ : true; // No tracking = assume available
276
+ if (rateLimitOk) {
277
+ this._logger.debug({ taskId, agentName }, 'Subscription routing selected');
278
+ return { agent: agentName, billingMode: 'subscription', ...(model !== undefined ? { model } : {}) };
279
+ }
280
+ // Rate limit exceeded — log and try API fallback
281
+ this._logger.debug({ taskId, agentName }, 'Subscription rate limit exceeded, trying API billing');
282
+ // Emit provider:unavailable for rate limit
283
+ const resetTime = this._statusTracker.getRateLimitResetTime(agentName);
284
+ this._eventBus.emit('provider:unavailable', {
285
+ provider: agentName,
286
+ reason: 'rate_limit',
287
+ resetAtMs: resetTime.getTime(),
288
+ });
289
+ }
290
+ // Check API billing path
291
+ const apiBillingConfig = provider.api_billing;
292
+ if (apiBillingConfig?.enabled === true) {
293
+ // Check if API key is configured in environment
294
+ const apiKeyEnv = apiBillingConfig.api_key_env;
295
+ if (apiKeyEnv !== undefined && process.env[apiKeyEnv] !== undefined) {
296
+ this._logger.debug({ taskId, agentName }, 'API billing selected');
297
+ return { agent: agentName, billingMode: 'api', ...(model !== undefined ? { model } : {}) };
298
+ }
299
+ else if (apiKeyEnv === undefined) {
300
+ // API key env not required — assume configured
301
+ this._logger.debug({ taskId, agentName }, 'API billing selected (no key env required)');
302
+ return { agent: agentName, billingMode: 'api', ...(model !== undefined ? { model } : {}) };
303
+ }
304
+ this._logger.debug({ taskId, agentName, apiKeyEnv }, 'API key not configured, skipping agent');
305
+ }
306
+ return null;
307
+ }
308
+ /**
309
+ * Build a human-readable rationale for the routing decision (NFR7).
310
+ */
311
+ _buildRationale(_taskId, agent, billingMode, taskType) {
312
+ const status = this._statusTracker.getStatus(agent);
313
+ const tokensInfo = status !== null && status.rateLimit.tokensPerWindow > 0
314
+ ? `, tokens ${status.tokensUsedInWindow}/${status.rateLimit.tokensPerWindow}`
315
+ : '';
316
+ if (billingMode === 'subscription') {
317
+ if (taskType.length > 0) {
318
+ return `Task type "${taskType}" → preferred agent ${agent} via subscription${tokensInfo}`;
319
+ }
320
+ return `Subscription-first: ${agent} subscription available${tokensInfo}`;
321
+ }
322
+ // API billing
323
+ if (taskType.length > 0) {
324
+ return `Task type "${taskType}" → ${agent} via API billing (subscription exhausted or disabled)`;
325
+ }
326
+ return `Subscription exhausted or disabled for ${agent}, falling back to API billing`;
327
+ }
328
+ /**
329
+ * Route a task without a loaded routing policy.
330
+ * Uses the first available adapter in the registry.
331
+ * Monitor recommendations are still consulted when use_monitor_recommendations=true (AC1, AC4).
332
+ */
333
+ _routeWithoutPolicy(task) {
334
+ const taskId = task.id;
335
+ const taskType = task.type ?? task.metadata?.['taskType'] ?? '';
336
+ // If there's an explicit agent, try to use it
337
+ if (task.agentId !== undefined && task.agentId.length > 0) {
338
+ if (this._adapterRegistry !== null) {
339
+ const adapter = this._adapterRegistry.get(task.agentId);
340
+ if (adapter !== undefined) {
341
+ const builder = makeRoutingDecision(taskId)
342
+ .withAgent(task.agentId, 'subscription')
343
+ .withRationale(`No routing policy: using explicit agent ${task.agentId}`);
344
+ this._attachMonitorRecommendation(builder, taskType, task.agentId);
345
+ return builder.build();
346
+ }
347
+ }
348
+ }
349
+ // Try first available adapter
350
+ if (this._adapterRegistry !== null) {
351
+ const adapters = this._adapterRegistry.getAll ? this._adapterRegistry.getAll() : [];
352
+ if (adapters.length > 0) {
353
+ const adapter = adapters[0];
354
+ const builder = makeRoutingDecision(taskId)
355
+ .withAgent(adapter.id, 'subscription')
356
+ .withRationale(`No routing policy: using first available adapter ${adapter.id}`);
357
+ this._attachMonitorRecommendation(builder, taskType, adapter.id);
358
+ return builder.build();
359
+ }
360
+ }
361
+ return makeRoutingDecision(taskId)
362
+ .unavailable('No routing policy configured and no adapters available')
363
+ .build();
364
+ }
365
+ // ---------------------------------------------------------------------------
366
+ // Monitor recommendation helper
367
+ // ---------------------------------------------------------------------------
368
+ /**
369
+ * Attach advisory monitor recommendation to a routing decision builder (AC5, AC7).
370
+ * Only attaches when use_monitor_recommendations=true and a recommendation
371
+ * is available for the task type with confidence >= "medium".
372
+ * Explicit routing policy always takes precedence (AC5).
373
+ *
374
+ * When the monitor recommends a different agent than the policy-selected agent,
375
+ * a debug log is emitted to record the override (AC7).
376
+ */
377
+ _attachMonitorRecommendation(builder, taskType, selectedAgent = '') {
378
+ if (!this._useMonitorRecommendations || this._monitorAgent === null)
379
+ return;
380
+ // Mark that monitor was consulted regardless of recommendation availability
381
+ builder.withMonitorInfluenced(true);
382
+ if (taskType.length === 0)
383
+ return;
384
+ try {
385
+ const recommendation = this._monitorAgent.getRecommendation(taskType);
386
+ if (recommendation !== null && recommendation.confidence !== 'low') {
387
+ builder.withMonitorRecommendation(recommendation);
388
+ this._logger.debug({ taskType, confidence: recommendation.confidence, improvement: recommendation.improvement_percentage }, 'Monitor recommendation attached to routing decision');
389
+ // AC7: Log when routing policy overrides the monitor recommendation
390
+ if (selectedAgent.length > 0 && recommendation.recommended_agent !== selectedAgent) {
391
+ this._logger.debug({
392
+ taskType,
393
+ selectedAgent,
394
+ recommendedAgent: recommendation.recommended_agent,
395
+ confidence: recommendation.confidence,
396
+ improvement: recommendation.improvement_percentage,
397
+ }, 'Routing policy overrides monitor recommendation');
398
+ }
399
+ }
400
+ }
401
+ catch (err) {
402
+ // Never let advisory monitor errors affect routing
403
+ this._logger.warn({ err, taskType }, 'Failed to get monitor recommendation — continuing without it');
404
+ // AC5: monitor consultation failed, so the monitor did not influence this decision.
405
+ // Set monitorInfluenced to false since no useful recommendation was obtained.
406
+ builder.withMonitorInfluenced(false);
407
+ }
408
+ }
409
+ // ---------------------------------------------------------------------------
410
+ // Initialization helpers
411
+ // ---------------------------------------------------------------------------
412
+ /**
413
+ * Initialize provider tracking from the loaded routing policy.
414
+ */
415
+ _initializeProviderTracking() {
416
+ if (this._policy === null)
417
+ return;
418
+ for (const [name, provider] of Object.entries(this._policy.providers)) {
419
+ const apiBillingEnabled = provider.api_billing?.enabled === true;
420
+ const rateLimit = provider.rate_limit !== undefined
421
+ ? { tokensPerWindow: provider.rate_limit.tokens_per_window, windowSeconds: provider.rate_limit.window_seconds }
422
+ : undefined;
423
+ this._statusTracker.initProvider(name, provider.subscription_routing, apiBillingEnabled, rateLimit);
424
+ this._logger.debug({ provider: name, subscriptionRouting: provider.subscription_routing, apiBillingEnabled }, 'Provider tracking initialized');
425
+ }
426
+ }
427
+ }
428
+ export function createRoutingEngineImpl(options) {
429
+ const engine = new RoutingEngineImpl(options.eventBus, options.configSystem ?? null, options.adapterRegistry ?? null, options.logger);
430
+ if (options.monitorAgent != null && options.useMonitorRecommendations === true) {
431
+ engine.setMonitorAgent(options.monitorAgent, true);
432
+ }
433
+ return engine;
434
+ }
435
+ // ---------------------------------------------------------------------------
436
+ // createRoutingEngine factory (thin wrapper)
437
+ // ---------------------------------------------------------------------------
438
+ /**
439
+ * Create a new RoutingEngine instance using the decoupled core types.
440
+ * This is the primary factory for external consumers of @substrate-ai/core.
441
+ *
442
+ * @example
443
+ * const engine = createRoutingEngine({ eventBus, adapterRegistry })
444
+ * await engine.initialize()
445
+ * const decision = engine.routeTask({ id: 'task-1', type: 'dev-story' })
446
+ */
447
+ export function createRoutingEngine(options) {
448
+ return createRoutingEngineImpl(options);
449
+ }
450
+ //# sourceMappingURL=routing-engine-impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-engine-impl.js","sourceRoot":"","sources":["../../src/routing/routing-engine-impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * RoutingEngine — interface definitions for task-to-agent routing.
3
+ *
4
+ * Defines the public contract for routing engines, resolvers, and related types.
5
+ * Concrete implementations live in Epic 41.
6
+ *
7
+ * References:
8
+ * - Architecture Section 8: Subscription-first routing algorithm
9
+ * - Epic 40, Story 40-6: Routing Interface Extraction
10
+ */
11
+ import type { RoutingDecision } from './routing-decision.js';
12
+ import type { ProviderStatus } from './provider-status.js';
13
+ /**
14
+ * Minimal task shape required for routing decisions.
15
+ * Structural subtype designed to accommodate both the core's simple RoutingTask usage
16
+ * and the monolith's TaskNode (which has agentId and metadata).
17
+ * All fields beyond `id` are optional to allow assignment from both sources.
18
+ */
19
+ export interface RoutingTask {
20
+ id: string;
21
+ /** Task type string. May also be provided via `metadata.taskType` for backward compat. */
22
+ type?: string;
23
+ /** Optional explicit agent assignment (from TaskNode.agentId) */
24
+ agentId?: string;
25
+ /** Arbitrary task metadata — RoutingEngineImpl reads `metadata.taskType` for routing */
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ /**
29
+ * The resolved model and routing metadata for a given task type.
30
+ */
31
+ export interface ModelResolution {
32
+ /** Resolved model identifier */
33
+ model: string;
34
+ /** Optional max_tokens from the phase or override config */
35
+ maxTokens?: number;
36
+ /** The pipeline phase that was resolved */
37
+ phase: string;
38
+ /** Whether the resolution came from a phase config or a task-type override */
39
+ source: 'phase' | 'override';
40
+ }
41
+ /**
42
+ * Interface for resolving the appropriate model for each pipeline task type.
43
+ */
44
+ export interface IRoutingResolver {
45
+ resolveModel(taskType: string): ModelResolution | null;
46
+ }
47
+ /**
48
+ * Full interface for the routing engine.
49
+ */
50
+ export interface RoutingEngine {
51
+ /**
52
+ * Make a routing decision for a task.
53
+ * Implements subscription-first algorithm per Architecture Section 8.
54
+ *
55
+ * @param task - RoutingTask to route
56
+ * @returns RoutingDecision with agent, billingMode, and rationale
57
+ */
58
+ routeTask(task: RoutingTask): RoutingDecision;
59
+ /**
60
+ * Get current status of a provider including rate limit state.
61
+ *
62
+ * @param provider - Provider name
63
+ * @returns ProviderStatus snapshot or null if provider is not tracked
64
+ */
65
+ getProviderStatus(provider: string): ProviderStatus | null;
66
+ /**
67
+ * Update rate limit tracking after task completion.
68
+ *
69
+ * @param provider - Provider name that executed the task
70
+ * @param tokensUsed - Actual tokens consumed
71
+ */
72
+ updateRateLimit(provider: string, tokensUsed: number): void;
73
+ /**
74
+ * Hot-reload the routing policy from disk without daemon restart (FR38).
75
+ */
76
+ reloadPolicy(): Promise<void>;
77
+ }
78
+ /**
79
+ * Maps known task types to their corresponding pipeline phase.
80
+ * Unknown task types fall through to the 'generate' default.
81
+ */
82
+ export declare const TASK_TYPE_PHASE_MAP: Record<string, 'explore' | 'generate' | 'review'>;
83
+ //# sourceMappingURL=routing-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-engine.d.ts","sourceRoot":"","sources":["../../src/routing/routing-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAM1D;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,MAAM,EAAE,OAAO,GAAG,UAAU,CAAA;CAC7B;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAA;CACvD;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAAA;IAE7C;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;IAE1D;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAE3D;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAMD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAKjF,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * RoutingEngine — interface definitions for task-to-agent routing.
3
+ *
4
+ * Defines the public contract for routing engines, resolvers, and related types.
5
+ * Concrete implementations live in Epic 41.
6
+ *
7
+ * References:
8
+ * - Architecture Section 8: Subscription-first routing algorithm
9
+ * - Epic 40, Story 40-6: Routing Interface Extraction
10
+ */
11
+ // ---------------------------------------------------------------------------
12
+ // Constants
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * Maps known task types to their corresponding pipeline phase.
16
+ * Unknown task types fall through to the 'generate' default.
17
+ */
18
+ export const TASK_TYPE_PHASE_MAP = {
19
+ 'create-story': 'generate',
20
+ 'dev-story': 'generate',
21
+ 'code-review': 'review',
22
+ 'explore': 'explore',
23
+ };
24
+ //# sourceMappingURL=routing-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-engine.js","sourceRoot":"","sources":["../../src/routing/routing-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6FH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAsD;IACpF,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,UAAU;IACvB,aAAa,EAAE,QAAQ;IACvB,SAAS,EAAE,SAAS;CACrB,CAAA"}