@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,83 @@
1
+ /**
2
+ * BatchBuffer — generic buffering utility with size-triggered and timer-triggered flush.
3
+ *
4
+ * Emits a 'flush' event with the accumulated items whenever either:
5
+ * - The buffer reaches `batchSize` items, or
6
+ * - The `flushIntervalMs` timer fires
7
+ *
8
+ * Callers subscribe to the 'flush' event via `.on('flush', handler)`.
9
+ * Call `start()` to begin the interval timer and `stop()` to drain and clean up.
10
+ * Call `flush()` to force-flush immediately without stopping the interval timer.
11
+ *
12
+ * Design invariants:
13
+ * - Never throws; errors from flush handlers are the caller's responsibility
14
+ * - Items pushed after stop() are still emitted in the final drain flush
15
+ * - EventEmitter pattern — no internal queue management beyond the items array
16
+ */
17
+ import { EventEmitter } from 'node:events';
18
+ // ---------------------------------------------------------------------------
19
+ // BatchBuffer
20
+ // ---------------------------------------------------------------------------
21
+ export class BatchBuffer extends EventEmitter {
22
+ _items = [];
23
+ _timer = null;
24
+ _batchSize;
25
+ _flushIntervalMs;
26
+ constructor(options = {}) {
27
+ super();
28
+ this._batchSize = options.batchSize ?? 100;
29
+ this._flushIntervalMs = options.flushIntervalMs ?? 5000;
30
+ }
31
+ /**
32
+ * Add an item to the buffer.
33
+ * Triggers a flush immediately when the buffer reaches `batchSize`.
34
+ */
35
+ push(item) {
36
+ this._items.push(item);
37
+ if (this._items.length >= this._batchSize) {
38
+ this._flush();
39
+ }
40
+ }
41
+ /**
42
+ * Start the interval timer that flushes items on a schedule.
43
+ * Safe to call multiple times — subsequent calls are ignored.
44
+ */
45
+ start() {
46
+ if (this._timer !== null)
47
+ return;
48
+ this._timer = setInterval(() => this._flush(), this._flushIntervalMs);
49
+ // Allow the Node.js event loop to exit even if this timer is active.
50
+ if (typeof this._timer.unref === 'function') {
51
+ this._timer.unref();
52
+ }
53
+ }
54
+ /**
55
+ * Trigger an immediate flush of buffered items without stopping the interval timer.
56
+ * Use this to force-flush between pipeline phases while keeping the timer active.
57
+ * No-op when the buffer is empty.
58
+ */
59
+ flush() {
60
+ this._flush();
61
+ }
62
+ /**
63
+ * Stop the interval timer and flush any remaining items.
64
+ * Safe to call multiple times — subsequent calls are ignored.
65
+ */
66
+ stop() {
67
+ if (this._timer !== null) {
68
+ clearInterval(this._timer);
69
+ this._timer = null;
70
+ }
71
+ this._flush();
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Private
75
+ // ---------------------------------------------------------------------------
76
+ _flush() {
77
+ if (this._items.length === 0)
78
+ return;
79
+ const items = this._items.splice(0);
80
+ this.emit('flush', items);
81
+ }
82
+ }
83
+ //# sourceMappingURL=batch-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-buffer.js","sourceRoot":"","sources":["../../src/telemetry/batch-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAa1C,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,OAAO,WAAe,SAAQ,YAAY;IACtC,MAAM,GAAQ,EAAE,CAAA;IAChB,MAAM,GAA0C,IAAI,CAAA;IAC3C,UAAU,CAAQ;IAClB,gBAAgB,CAAQ;IAEzC,YAAY,UAA8B,EAAE;QAC1C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAA;QAC1C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAA;IACzD,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,IAAO;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAM;QAChC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACrE,qEAAqE;QACrE,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACf,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,MAAM;QACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC3B,CAAC;CACF"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Categorizer — classifies telemetry spans into semantic categories and
3
+ * computes per-category token statistics with trend detection.
4
+ *
5
+ * Classification proceeds through three tiers:
6
+ * 1. Exact match against a lookup table of known operation names
7
+ * 2. Prefix/regex pattern match
8
+ * 3. Fuzzy case-insensitive substring match
9
+ * 4. Fallback to 'other' (overridden to 'tool_outputs' when toolName present)
10
+ *
11
+ * Architecture constraints:
12
+ * - Constructor injection: accepts ILogger via constructor (defaults to console)
13
+ * - Module-scope lookup tables to avoid recreation on every classify() call
14
+ * - Zero external dependencies beyond types from this module
15
+ *
16
+ * Migrated to @substrate-ai/core in story 41-6b.
17
+ */
18
+ import type { ILogger } from '../dispatch/types.js';
19
+ import type { NormalizedSpan, TurnAnalysis, SemanticCategory, CategoryStats, Trend } from './types.js';
20
+ import type { ICategorizer } from './telemetry-pipeline.js';
21
+ export declare class Categorizer implements ICategorizer {
22
+ private readonly _logger;
23
+ constructor(logger?: ILogger);
24
+ /**
25
+ * Classify an operation into a SemanticCategory using tiered logic.
26
+ *
27
+ * @param operationName - Span operation name (e.g. 'read_file', 'bash')
28
+ * @param toolName - Optional tool name; non-empty value overrides fallback to tool_outputs
29
+ * @param taskType - Optional task type (e.g. 'dev-story', 'code-review'); acts as Tier 0 (highest priority)
30
+ */
31
+ classify(operationName: string, toolName?: string, taskType?: string): SemanticCategory;
32
+ /**
33
+ * Detect whether a category's token consumption is growing, stable, or shrinking
34
+ * by comparing first-half vs second-half turn attribution.
35
+ *
36
+ * @param categorySpans - Spans already classified into this category
37
+ * @param turns - Full turn sequence for the story
38
+ */
39
+ computeTrend(categorySpans: NormalizedSpan[], turns: TurnAnalysis[]): Trend;
40
+ /**
41
+ * Compute per-category token statistics from TurnAnalysis data (not raw spans).
42
+ *
43
+ * All six SemanticCategory values are always present in the result (zero-token
44
+ * categories are included with totalTokens: 0). Results are sorted by
45
+ * totalTokens descending.
46
+ *
47
+ * Trend is computed by comparing first-half vs second-half turn token attribution
48
+ * for each category, using the same 1.2×/0.8× thresholds as computeTrend().
49
+ *
50
+ * @param turns - TurnAnalysis[] for the story
51
+ */
52
+ computeCategoryStatsFromTurns(turns: TurnAnalysis[]): CategoryStats[];
53
+ /**
54
+ * Compute per-category token statistics for a complete set of spans.
55
+ *
56
+ * All six SemanticCategory values are always present in the result (zero-token
57
+ * categories are included with totalTokens: 0). Results are sorted by
58
+ * totalTokens descending.
59
+ *
60
+ * @param spans - All NormalizedSpans for the story
61
+ * @param turns - TurnAnalysis sequence (may be empty)
62
+ */
63
+ computeCategoryStats(spans: NormalizedSpan[], turns: TurnAnalysis[]): CategoryStats[];
64
+ }
65
+ //# sourceMappingURL=categorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categorizer.d.ts","sourceRoot":"","sources":["../../src/telemetry/categorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,KAAK,EACN,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAiE3D,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE,OAAO;IAQ5B;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB;IA8DvF;;;;;;OAMG;IACH,YAAY,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK;IA6C3E;;;;;;;;;;;OAWG;IACH,6BAA6B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;IA4ErE;;;;;;;;;OASG;IACH,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;CAgCtF"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Categorizer — classifies telemetry spans into semantic categories and
3
+ * computes per-category token statistics with trend detection.
4
+ *
5
+ * Classification proceeds through three tiers:
6
+ * 1. Exact match against a lookup table of known operation names
7
+ * 2. Prefix/regex pattern match
8
+ * 3. Fuzzy case-insensitive substring match
9
+ * 4. Fallback to 'other' (overridden to 'tool_outputs' when toolName present)
10
+ *
11
+ * Architecture constraints:
12
+ * - Constructor injection: accepts ILogger via constructor (defaults to console)
13
+ * - Module-scope lookup tables to avoid recreation on every classify() call
14
+ * - Zero external dependencies beyond types from this module
15
+ *
16
+ * Migrated to @substrate-ai/core in story 41-6b.
17
+ */
18
+ // ---------------------------------------------------------------------------
19
+ // Module-scope lookup tables (constructed once, shared across all instances)
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Tier 0: task-type to semantic category mapping.
23
+ *
24
+ * When a TurnAnalysis has a known taskType, the category is determined
25
+ * directly from this map without consulting lower tiers.
26
+ */
27
+ const TASK_TYPE_CATEGORY_MAP = new Map([
28
+ ['create-story', 'system_prompts'],
29
+ ['dev-story', 'tool_outputs'],
30
+ ['code-review', 'conversation_history'],
31
+ ['test-plan', 'system_prompts'],
32
+ ['minor-fixes', 'tool_outputs'],
33
+ ]);
34
+ const EXACT_CATEGORY_MAP = new Map([
35
+ ['read_file', 'file_reads'],
36
+ ['write_file', 'tool_outputs'],
37
+ ['bash', 'tool_outputs'],
38
+ ['tool_use', 'tool_outputs'],
39
+ ['tool_result', 'tool_outputs'],
40
+ ['system_prompt', 'system_prompts'],
41
+ ['human_turn', 'user_prompts'],
42
+ ['user_message', 'user_prompts'],
43
+ ['assistant_turn', 'conversation_history'],
44
+ ['assistant_message', 'conversation_history'],
45
+ ['search_files', 'file_reads'],
46
+ ['list_files', 'file_reads'],
47
+ ['run_command', 'tool_outputs'],
48
+ ['memory_read', 'system_prompts'],
49
+ ['web_fetch', 'tool_outputs'],
50
+ // Claude Code OTLP log event names
51
+ ['api_request', 'conversation_history'],
52
+ ['tool_decision', 'tool_outputs'],
53
+ ]);
54
+ const PREFIX_PATTERNS = [
55
+ { pattern: /^(bash|exec|run|spawn)/i, category: 'tool_outputs' },
56
+ { pattern: /^(read|open|cat|head|tail).*file/i, category: 'file_reads' },
57
+ { pattern: /^(list|glob|find).*file/i, category: 'file_reads' },
58
+ { pattern: /^tool/i, category: 'tool_outputs' },
59
+ { pattern: /^system/i, category: 'system_prompts' },
60
+ { pattern: /^(human|user)/i, category: 'user_prompts' },
61
+ { pattern: /^(assistant|ai|model)/i, category: 'conversation_history' },
62
+ ];
63
+ /** All six semantic categories in a stable order for zero-fill initialisation. */
64
+ const ALL_CATEGORIES = [
65
+ 'tool_outputs',
66
+ 'file_reads',
67
+ 'system_prompts',
68
+ 'conversation_history',
69
+ 'user_prompts',
70
+ 'other',
71
+ ];
72
+ // ---------------------------------------------------------------------------
73
+ // Categorizer
74
+ // ---------------------------------------------------------------------------
75
+ export class Categorizer {
76
+ _logger;
77
+ constructor(logger) {
78
+ this._logger = logger ?? console;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // classify
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Classify an operation into a SemanticCategory using tiered logic.
85
+ *
86
+ * @param operationName - Span operation name (e.g. 'read_file', 'bash')
87
+ * @param toolName - Optional tool name; non-empty value overrides fallback to tool_outputs
88
+ * @param taskType - Optional task type (e.g. 'dev-story', 'code-review'); acts as Tier 0 (highest priority)
89
+ */
90
+ classify(operationName, toolName, taskType) {
91
+ // Tier 0: taskType takes highest priority when defined and mapped
92
+ if (taskType !== undefined && taskType.length > 0) {
93
+ const taskCategory = TASK_TYPE_CATEGORY_MAP.get(taskType);
94
+ if (taskCategory !== undefined)
95
+ return taskCategory;
96
+ }
97
+ // Tier 1: exact match
98
+ const exact = EXACT_CATEGORY_MAP.get(operationName);
99
+ if (exact !== undefined)
100
+ return exact;
101
+ // Tier 2: prefix/regex pattern match
102
+ for (const { pattern, category } of PREFIX_PATTERNS) {
103
+ if (pattern.test(operationName))
104
+ return category;
105
+ }
106
+ // Tier 3: fuzzy case-insensitive substring match
107
+ const lower = operationName.toLowerCase();
108
+ // file_reads: contains 'file' AND ('read' or 'open')
109
+ if (lower.includes('file') && (lower.includes('read') || lower.includes('open'))) {
110
+ return 'file_reads';
111
+ }
112
+ // system_prompts: contains 'system' or 'prompt'
113
+ if (lower.includes('system') || lower.includes('prompt')) {
114
+ return 'system_prompts';
115
+ }
116
+ // tool_outputs: contains 'bash' or 'exec' or 'tool'
117
+ if (lower.includes('bash') || lower.includes('exec') || lower.includes('tool')) {
118
+ return 'tool_outputs';
119
+ }
120
+ // conversation_history: contains 'conversation' or 'history' or 'chat'
121
+ if (lower.includes('conversation') || lower.includes('history') || lower.includes('chat')) {
122
+ return 'conversation_history';
123
+ }
124
+ // user_prompts: contains 'user' or 'human'
125
+ if (lower.includes('user') || lower.includes('human')) {
126
+ return 'user_prompts';
127
+ }
128
+ // Tier 4: fallback — toolName presence overrides to tool_outputs
129
+ if (toolName !== undefined && toolName.length > 0) {
130
+ return 'tool_outputs';
131
+ }
132
+ // Tier 5: log-derived turns without explicit operation names default to
133
+ // conversation_history (they represent LLM turns, not unknown operations)
134
+ if (lower === 'log_turn') {
135
+ return 'conversation_history';
136
+ }
137
+ return 'other';
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // computeTrend
141
+ // ---------------------------------------------------------------------------
142
+ /**
143
+ * Detect whether a category's token consumption is growing, stable, or shrinking
144
+ * by comparing first-half vs second-half turn attribution.
145
+ *
146
+ * @param categorySpans - Spans already classified into this category
147
+ * @param turns - Full turn sequence for the story
148
+ */
149
+ computeTrend(categorySpans, turns) {
150
+ if (turns.length < 2)
151
+ return 'stable';
152
+ // Build spanId → turn-index map from direct spanId and childSpans
153
+ const spanTurnMap = new Map();
154
+ for (let i = 0; i < turns.length; i++) {
155
+ const turn = turns[i];
156
+ if (turn === undefined)
157
+ continue;
158
+ spanTurnMap.set(turn.spanId, i);
159
+ for (const child of turn.childSpans) {
160
+ spanTurnMap.set(child.spanId, i);
161
+ }
162
+ }
163
+ const half = Math.floor(turns.length / 2);
164
+ let firstHalfTokens = 0;
165
+ let secondHalfTokens = 0;
166
+ for (const span of categorySpans) {
167
+ const turnIdx = spanTurnMap.has(span.spanId)
168
+ ? spanTurnMap.get(span.spanId)
169
+ : attributeSpanToTurnIndex(span.startTime, turns);
170
+ const tokens = span.inputTokens + span.outputTokens;
171
+ if (turnIdx < half) {
172
+ firstHalfTokens += tokens;
173
+ }
174
+ else {
175
+ secondHalfTokens += tokens;
176
+ }
177
+ }
178
+ if (firstHalfTokens === 0 && secondHalfTokens === 0)
179
+ return 'stable';
180
+ // If first half is zero but second is non-zero, it is growing
181
+ if (firstHalfTokens === 0)
182
+ return 'growing';
183
+ if (secondHalfTokens > 1.2 * firstHalfTokens)
184
+ return 'growing';
185
+ if (secondHalfTokens < 0.8 * firstHalfTokens)
186
+ return 'shrinking';
187
+ return 'stable';
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // computeCategoryStatsFromTurns
191
+ // ---------------------------------------------------------------------------
192
+ /**
193
+ * Compute per-category token statistics from TurnAnalysis data (not raw spans).
194
+ *
195
+ * All six SemanticCategory values are always present in the result (zero-token
196
+ * categories are included with totalTokens: 0). Results are sorted by
197
+ * totalTokens descending.
198
+ *
199
+ * Trend is computed by comparing first-half vs second-half turn token attribution
200
+ * for each category, using the same 1.2×/0.8× thresholds as computeTrend().
201
+ *
202
+ * @param turns - TurnAnalysis[] for the story
203
+ */
204
+ computeCategoryStatsFromTurns(turns) {
205
+ if (turns.length === 0) {
206
+ return ALL_CATEGORIES.map((category) => ({
207
+ category,
208
+ totalTokens: 0,
209
+ percentage: 0,
210
+ eventCount: 0,
211
+ avgTokensPerEvent: 0,
212
+ trend: 'stable',
213
+ }));
214
+ }
215
+ const grandTotal = turns.reduce((sum, t) => sum + t.inputTokens + t.outputTokens, 0);
216
+ const buckets = new Map();
217
+ for (const cat of ALL_CATEGORIES) {
218
+ buckets.set(cat, { total: 0, count: 0, first: 0, second: 0 });
219
+ }
220
+ const half = Math.floor(turns.length / 2);
221
+ for (let i = 0; i < turns.length; i++) {
222
+ const turn = turns[i];
223
+ if (turn === undefined)
224
+ continue;
225
+ const cat = this.classify(turn.name, turn.toolName, turn.taskType);
226
+ const bucket = buckets.get(cat);
227
+ const tokens = turn.inputTokens + turn.outputTokens;
228
+ bucket.total += tokens;
229
+ bucket.count += 1;
230
+ if (i < half) {
231
+ bucket.first += tokens;
232
+ }
233
+ else {
234
+ bucket.second += tokens;
235
+ }
236
+ }
237
+ const results = ALL_CATEGORIES.map((category) => {
238
+ const bucket = buckets.get(category);
239
+ const totalTokens = bucket.total;
240
+ const eventCount = bucket.count;
241
+ const percentage = grandTotal > 0 ? Math.round((totalTokens / grandTotal) * 100 * 1000) / 1000 : 0;
242
+ const avgTokensPerEvent = eventCount > 0 ? totalTokens / eventCount : 0;
243
+ // Compute trend from first vs second half turn token counts for this category
244
+ let trend = 'stable';
245
+ if (turns.length >= 2) {
246
+ const { first, second } = bucket;
247
+ if (first === 0 && second === 0) {
248
+ trend = 'stable';
249
+ }
250
+ else if (first === 0) {
251
+ trend = 'growing';
252
+ }
253
+ else if (second > 1.2 * first) {
254
+ trend = 'growing';
255
+ }
256
+ else if (second < 0.8 * first) {
257
+ trend = 'shrinking';
258
+ }
259
+ }
260
+ return { category, totalTokens, percentage, eventCount, avgTokensPerEvent, trend };
261
+ });
262
+ this._logger.debug({ categories: results.length, grandTotal }, 'Computed category stats from turns');
263
+ return results.sort((a, b) => b.totalTokens - a.totalTokens);
264
+ }
265
+ // ---------------------------------------------------------------------------
266
+ // computeCategoryStats
267
+ // ---------------------------------------------------------------------------
268
+ /**
269
+ * Compute per-category token statistics for a complete set of spans.
270
+ *
271
+ * All six SemanticCategory values are always present in the result (zero-token
272
+ * categories are included with totalTokens: 0). Results are sorted by
273
+ * totalTokens descending.
274
+ *
275
+ * @param spans - All NormalizedSpans for the story
276
+ * @param turns - TurnAnalysis sequence (may be empty)
277
+ */
278
+ computeCategoryStats(spans, turns) {
279
+ const grandTotal = spans.reduce((sum, s) => sum + s.inputTokens + s.outputTokens, 0);
280
+ // Bucket spans by category
281
+ const buckets = new Map();
282
+ for (const cat of ALL_CATEGORIES)
283
+ buckets.set(cat, []);
284
+ for (const span of spans) {
285
+ const toolName = extractToolNameFromSpan(span);
286
+ const cat = this.classify(span.operationName ?? span.name, toolName);
287
+ buckets.get(cat).push(span);
288
+ }
289
+ const results = ALL_CATEGORIES.map((category) => {
290
+ const catSpans = buckets.get(category);
291
+ const totalTokens = catSpans.reduce((sum, s) => sum + s.inputTokens + s.outputTokens, 0);
292
+ const eventCount = catSpans.length;
293
+ const percentage = grandTotal > 0 ? Math.round((totalTokens / grandTotal) * 100 * 1000) / 1000 : 0;
294
+ const avgTokensPerEvent = eventCount > 0 ? totalTokens / eventCount : 0;
295
+ const trend = this.computeTrend(catSpans, turns);
296
+ return { category, totalTokens, percentage, eventCount, avgTokensPerEvent, trend };
297
+ });
298
+ this._logger.debug({ categories: results.length, grandTotal }, 'Computed category stats');
299
+ return results.sort((a, b) => b.totalTokens - a.totalTokens);
300
+ }
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Internal helpers
304
+ // ---------------------------------------------------------------------------
305
+ /**
306
+ * Binary search: find the index of the last turn whose timestamp ≤ spanStartTime.
307
+ * Returns 0 if no turn precedes the span.
308
+ */
309
+ function attributeSpanToTurnIndex(spanStartTime, turns) {
310
+ let lo = 0;
311
+ let hi = turns.length - 1;
312
+ let result = 0;
313
+ while (lo <= hi) {
314
+ const mid = (lo + hi) >> 1;
315
+ if ((turns[mid]?.timestamp ?? 0) <= spanStartTime) {
316
+ result = mid;
317
+ lo = mid + 1;
318
+ }
319
+ else {
320
+ hi = mid - 1;
321
+ }
322
+ }
323
+ return result;
324
+ }
325
+ /**
326
+ * Extract a tool name from a span's attributes, checking known attribute keys
327
+ * in priority order.
328
+ */
329
+ function extractToolNameFromSpan(span) {
330
+ if (!span.attributes)
331
+ return undefined;
332
+ const attrs = span.attributes;
333
+ const name = attrs['tool.name'] ||
334
+ attrs['llm.tool.name'] ||
335
+ attrs['claude.tool_name'];
336
+ return name || undefined;
337
+ }
338
+ //# sourceMappingURL=categorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categorizer.js","sourceRoot":"","sources":["../../src/telemetry/categorizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * ConsumerAnalyzer — groups telemetry spans by consumer key and ranks by token
3
+ * consumption, producing ConsumerStats for each unique operation+tool combination.
4
+ *
5
+ * A "consumer key" is `operationName|toolName`, stable across runs and safe to
6
+ * store as a VARCHAR(300) primary-key component in Dolt.
7
+ *
8
+ * Architecture constraints:
9
+ * - Constructor injection: accepts Categorizer and ILogger (logger defaults to console)
10
+ * - Delegates classification to the injected Categorizer
11
+ * - Zero external dependencies beyond types and Categorizer from this module
12
+ *
13
+ * Migrated to @substrate-ai/core in story 41-6b.
14
+ */
15
+ import type { ILogger } from '../dispatch/types.js';
16
+ import type { NormalizedSpan, ConsumerStats, TurnAnalysis } from './types.js';
17
+ import type { IConsumerAnalyzer } from './telemetry-pipeline.js';
18
+ import type { Categorizer } from './categorizer.js';
19
+ export declare class ConsumerAnalyzer implements IConsumerAnalyzer {
20
+ private readonly _categorizer;
21
+ private readonly _logger;
22
+ constructor(categorizer: Categorizer, logger?: ILogger);
23
+ /**
24
+ * Group spans by consumer key, rank by totalTokens descending, and return
25
+ * ConsumerStats for each non-zero-token group.
26
+ *
27
+ * @param spans - All NormalizedSpans for the story
28
+ */
29
+ analyze(spans: NormalizedSpan[]): ConsumerStats[];
30
+ /**
31
+ * Group turns by consumer key (model|toolName), rank by totalTokens descending,
32
+ * and return ConsumerStats for each non-zero-token group.
33
+ *
34
+ * @param turns - All TurnAnalysis records for the story
35
+ */
36
+ analyzeFromTurns(turns: TurnAnalysis[]): ConsumerStats[];
37
+ /**
38
+ * Build a stable, collision-resistant consumer key from a span.
39
+ * Format: `operationName|toolName` (tool part is empty string if absent).
40
+ */
41
+ private _buildConsumerKey;
42
+ /**
43
+ * Build a stable consumer key from a turn.
44
+ * Format: `model|toolName` (tool part is empty string if absent).
45
+ */
46
+ private _buildConsumerKeyFromTurn;
47
+ /**
48
+ * Extract a tool name from span attributes, checking three known attribute keys
49
+ * in priority order.
50
+ */
51
+ private _extractToolName;
52
+ }
53
+ //# sourceMappingURL=consumer-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-analyzer.d.ts","sourceRoot":"","sources":["../../src/telemetry/consumer-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAMnD,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO;IAStD;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,aAAa,EAAE;IAuEjD;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;IAqExD;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAMjC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CASzB"}