@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,315 @@
1
+ /**
2
+ * IngestionServer — local OTLP HTTP/JSON endpoint for Claude Code telemetry.
3
+ *
4
+ * Starts an HTTP server that accepts OTLP-formatted telemetry payloads from
5
+ * Claude Code sub-agents. The server binds to a configurable port (default 4318)
6
+ * and exposes `getOtlpEnvVars()` to retrieve the 5 environment variables that
7
+ * configure Claude Code to export telemetry to this endpoint.
8
+ *
9
+ * When a `TelemetryPipeline` is injected, received payloads are parsed and
10
+ * buffered via `BatchBuffer`, which flushes to the pipeline on size or time
11
+ * triggers. Without a pipeline, the server operates in stub mode (acknowledge
12
+ * and discard), preserving backwards-compatibility.
13
+ *
14
+ * Usage:
15
+ * const server = new IngestionServer({ port: 4318 })
16
+ * await server.start()
17
+ * const envVars = server.getOtlpEnvVars() // inject into sub-agents
18
+ * await server.stop()
19
+ */
20
+ import { createServer } from 'node:http';
21
+ import { createGunzip, createInflate } from 'node:zlib';
22
+ import { BatchBuffer } from './batch-buffer.js';
23
+ import { detectSource } from './source-detector.js';
24
+ // ---------------------------------------------------------------------------
25
+ // TelemetryError
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Error thrown by IngestionServer for server lifecycle violations.
29
+ * Extends Error with a machine-readable `code` property.
30
+ * (In the monolith, callers may import TelemetryError from the shim which
31
+ * re-exports this class from @substrate-ai/core.)
32
+ */
33
+ export class TelemetryError extends Error {
34
+ code;
35
+ constructor(code, message) {
36
+ super(message);
37
+ this.name = 'TelemetryError';
38
+ this.code = code;
39
+ }
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // IngestionServer
43
+ // ---------------------------------------------------------------------------
44
+ /**
45
+ * Local HTTP server that accepts OTLP payloads from Claude Code sub-agents.
46
+ *
47
+ * Binds to `port` (default 4318). Use port 0 in tests for an OS-assigned port.
48
+ */
49
+ export class IngestionServer {
50
+ _server = null;
51
+ _port;
52
+ _batchSize;
53
+ _flushIntervalMs;
54
+ _buffer;
55
+ _pendingBatches = new Set();
56
+ _logger;
57
+ constructor(options = {}) {
58
+ this._port = options.port ?? 4318;
59
+ this._batchSize = options.batchSize ?? 100;
60
+ this._flushIntervalMs = options.flushIntervalMs ?? 5000;
61
+ this._logger = options.logger ?? console;
62
+ if (options.pipeline !== undefined) {
63
+ this._initPipeline(options.pipeline);
64
+ }
65
+ }
66
+ /**
67
+ * Wire a TelemetryPipeline before the server is started.
68
+ * Must be called before start() — has no effect if called after start().
69
+ */
70
+ setPipeline(pipeline) {
71
+ if (this._server !== null) {
72
+ this._logger.warn('IngestionServer.setPipeline() called after start() — ignoring');
73
+ return;
74
+ }
75
+ this._initPipeline(pipeline);
76
+ }
77
+ _initPipeline(pipeline) {
78
+ this._buffer = new BatchBuffer({
79
+ batchSize: this._batchSize,
80
+ flushIntervalMs: this._flushIntervalMs,
81
+ });
82
+ // Wire: batch flush → pipeline processBatch
83
+ // Track each in-flight processBatch() promise so stop() can await them.
84
+ this._buffer.on('flush', (items) => {
85
+ const pending = pipeline.processBatch(items).catch((err) => {
86
+ this._logger.warn({ err }, 'TelemetryPipeline.processBatch failed (batch flush)');
87
+ });
88
+ this._pendingBatches.add(pending);
89
+ void pending.then(() => {
90
+ this._pendingBatches.delete(pending);
91
+ });
92
+ });
93
+ }
94
+ /**
95
+ * Force-flush buffered OTLP payloads and await all in-flight processBatch() calls.
96
+ * Call this between story dispatches to ensure story N's telemetry (including
97
+ * recommendations) is fully persisted before story N+1 begins.
98
+ *
99
+ * No-op when no TelemetryPipeline is wired.
100
+ */
101
+ async flushAndAwait() {
102
+ if (this._buffer === undefined)
103
+ return;
104
+ this._buffer.flush();
105
+ if (this._pendingBatches.size > 0) {
106
+ await Promise.all([...this._pendingBatches]);
107
+ }
108
+ }
109
+ /**
110
+ * Start the HTTP ingestion server.
111
+ * Resolves when the server is listening and ready to accept connections.
112
+ * On EADDRINUSE, retries up to 10 consecutive ports before failing.
113
+ */
114
+ async start() {
115
+ if (this._server !== null) {
116
+ this._logger.warn('IngestionServer.start() called while already started — ignoring');
117
+ return;
118
+ }
119
+ const maxRetries = 10;
120
+ let lastErr;
121
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
122
+ const port = this._port + attempt;
123
+ try {
124
+ await this._tryListen(port);
125
+ return;
126
+ }
127
+ catch (err) {
128
+ const nodeErr = err;
129
+ if (nodeErr.code === 'EADDRINUSE' && attempt < maxRetries) {
130
+ this._logger.warn({ port, attempt: attempt + 1 }, `Port ${port} in use — trying ${port + 1}`);
131
+ lastErr = nodeErr;
132
+ continue;
133
+ }
134
+ throw err;
135
+ }
136
+ }
137
+ throw lastErr ?? new Error('IngestionServer: exhausted port retry attempts');
138
+ }
139
+ _tryListen(port) {
140
+ return new Promise((resolve, reject) => {
141
+ const server = createServer(this._handleRequest.bind(this));
142
+ server.on('error', (err) => {
143
+ server.close();
144
+ reject(err);
145
+ });
146
+ server.listen(port, '127.0.0.1', () => {
147
+ this._server = server;
148
+ const addr = server.address();
149
+ this._logger.info({ port: addr.port, requestedPort: this._port }, 'IngestionServer listening');
150
+ // Start the batch buffer timer (if pipeline is wired)
151
+ this._buffer?.start();
152
+ resolve();
153
+ });
154
+ });
155
+ }
156
+ /**
157
+ * Stop the HTTP ingestion server.
158
+ * Drains the batch buffer before closing the HTTP server.
159
+ * Resolves when the server has closed all connections.
160
+ */
161
+ async stop() {
162
+ const server = this._server;
163
+ if (server === null) {
164
+ return;
165
+ }
166
+ this._server = null;
167
+ // Stop (and drain) the batch buffer first
168
+ this._buffer?.stop();
169
+ // Await any in-flight processBatch() calls
170
+ if (this._pendingBatches.size > 0) {
171
+ await Promise.all([...this._pendingBatches]);
172
+ }
173
+ return new Promise((resolve, reject) => {
174
+ server.close((err) => {
175
+ if (err !== undefined && err !== null) {
176
+ reject(err);
177
+ }
178
+ else {
179
+ this._logger.info('IngestionServer stopped');
180
+ resolve();
181
+ }
182
+ });
183
+ });
184
+ }
185
+ /**
186
+ * Return the 5 OTLP environment variables to inject into sub-agent processes.
187
+ *
188
+ * @throws {TelemetryError} ERR_TELEMETRY_NOT_STARTED if the server is not started.
189
+ */
190
+ getOtlpEnvVars() {
191
+ const addr = this._server?.address();
192
+ if (addr === null || addr === undefined || typeof addr === 'string') {
193
+ throw new TelemetryError('ERR_TELEMETRY_NOT_STARTED', 'IngestionServer is not started — call start() before getOtlpEnvVars()');
194
+ }
195
+ const endpoint = `http://localhost:${addr.port}`;
196
+ return {
197
+ CLAUDE_CODE_ENABLE_TELEMETRY: '1',
198
+ OTEL_LOGS_EXPORTER: 'otlp',
199
+ OTEL_METRICS_EXPORTER: 'otlp',
200
+ OTEL_EXPORTER_OTLP_PROTOCOL: 'http/json',
201
+ OTEL_EXPORTER_OTLP_ENDPOINT: endpoint,
202
+ };
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // Private helpers
206
+ // ---------------------------------------------------------------------------
207
+ /**
208
+ * Substrate resource attributes extracted from an OTLP payload.
209
+ * These are set by ClaudeCodeAdapter via OTEL_RESOURCE_ATTRIBUTES env var.
210
+ */
211
+ _extractSubstrateAttributes(body) {
212
+ if (!body || typeof body !== 'object')
213
+ return {};
214
+ const payload = body;
215
+ const extractFromResources = (resources) => {
216
+ const result = {};
217
+ if (!Array.isArray(resources))
218
+ return result;
219
+ for (const entry of resources) {
220
+ if (!entry || typeof entry !== 'object')
221
+ continue;
222
+ const resource = entry.resource;
223
+ if (!resource || typeof resource !== 'object')
224
+ continue;
225
+ const attrs = resource.attributes;
226
+ if (!Array.isArray(attrs))
227
+ continue;
228
+ for (const attr of attrs) {
229
+ if (!attr || typeof attr !== 'object')
230
+ continue;
231
+ const a = attr;
232
+ const key = a.key;
233
+ if (key !== undefined && key.startsWith('substrate.')) {
234
+ const val = a.value;
235
+ if (val && typeof val.stringValue === 'string') {
236
+ result[key] = val.stringValue;
237
+ }
238
+ }
239
+ }
240
+ }
241
+ return result;
242
+ };
243
+ const attrs = {
244
+ ...extractFromResources(payload.resourceSpans),
245
+ ...extractFromResources(payload.resourceLogs),
246
+ };
247
+ return {
248
+ ...(attrs['substrate.story_key'] !== undefined && {
249
+ storyKey: attrs['substrate.story_key'],
250
+ }),
251
+ ...(attrs['substrate.task_type'] !== undefined && {
252
+ taskType: attrs['substrate.task_type'],
253
+ }),
254
+ ...(attrs['substrate.dispatch_id'] !== undefined && {
255
+ dispatchId: attrs['substrate.dispatch_id'],
256
+ }),
257
+ };
258
+ }
259
+ _handleRequest(req, res) {
260
+ // Health check support
261
+ if (req.url === '/health' && req.method === 'GET') {
262
+ res.writeHead(200, { 'Content-Type': 'application/json' });
263
+ res.end(JSON.stringify({ status: 'ok' }));
264
+ return;
265
+ }
266
+ // Collect body, decompressing gzip/deflate if needed
267
+ const encoding = req.headers['content-encoding'];
268
+ let stream = req;
269
+ if (encoding === 'gzip' || encoding === 'deflate') {
270
+ stream = encoding === 'gzip' ? req.pipe(createGunzip()) : req.pipe(createInflate());
271
+ }
272
+ const chunks = [];
273
+ stream.on('data', (chunk) => {
274
+ chunks.push(chunk);
275
+ });
276
+ stream.on('end', () => {
277
+ const bodyStr = Buffer.concat(chunks).toString('utf-8');
278
+ this._logger.debug({ url: req.url, bodyLength: bodyStr.length }, 'OTLP payload received');
279
+ // If a pipeline is wired, parse and buffer the payload
280
+ if (this._buffer !== undefined) {
281
+ try {
282
+ const body = JSON.parse(bodyStr);
283
+ const source = detectSource(body);
284
+ const { storyKey, taskType, dispatchId } = this._extractSubstrateAttributes(body);
285
+ // Dispatch context is extracted directly from OTLP resource attributes
286
+ // (set by ClaudeCodeAdapter via OTEL_RESOURCE_ATTRIBUTES env var).
287
+ const dispatchContext = taskType !== undefined && dispatchId !== undefined
288
+ ? { taskType, phase: taskType, dispatchId }
289
+ : undefined;
290
+ const payload = {
291
+ body,
292
+ source,
293
+ receivedAt: Date.now(),
294
+ ...(storyKey !== undefined && { storyKey }),
295
+ ...(dispatchContext !== undefined && { dispatchContext }),
296
+ };
297
+ this._buffer.push(payload);
298
+ }
299
+ catch (err) {
300
+ this._logger.warn({ err, url: req.url }, 'Failed to parse OTLP payload JSON — discarding');
301
+ }
302
+ }
303
+ res.writeHead(200, { 'Content-Type': 'application/json' });
304
+ res.end('{}');
305
+ });
306
+ stream.on('error', (err) => {
307
+ this._logger.warn({ err }, 'Error reading OTLP request body');
308
+ if (!res.headersSent) {
309
+ res.writeHead(400);
310
+ res.end('Bad Request');
311
+ }
312
+ });
313
+ }
314
+ }
315
+ //# sourceMappingURL=ingestion-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion-server.js","sourceRoot":"","sources":["../../src/telemetry/ingestion-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * LogTurnAnalyzer — computes per-turn token breakdowns from normalized log records.
3
+ *
4
+ * Takes a list of NormalizedLog records and produces TurnAnalysis[], where
5
+ * each entry represents an LLM turn derived from log data with:
6
+ * - Chronological ordering (by timestamp)
7
+ * - Sequential turnNumber assignment (1-N)
8
+ * - freshTokens, cacheHitRate, contextSize, contextDelta metrics
9
+ * - isContextSpike detection (inputTokens > 2× average)
10
+ * - Deduplication by traceId+spanId combination
11
+ *
12
+ * Architecture constraints:
13
+ * - Constructor injection: accepts ILogger via constructor (defaults to console)
14
+ * - No external dependencies beyond types from this module
15
+ * - Zero LLM calls — pure statistical computation
16
+ * - Never throws from public methods
17
+ *
18
+ * Migrated to @substrate-ai/core in story 41-6b.
19
+ */
20
+ import type { ILogger } from '../dispatch/types.js';
21
+ import type { NormalizedLog, TurnAnalysis } from './types.js';
22
+ import type { ILogTurnAnalyzer } from './telemetry-pipeline.js';
23
+ export declare class LogTurnAnalyzer implements ILogTurnAnalyzer {
24
+ private readonly _logger;
25
+ constructor(logger?: ILogger);
26
+ /**
27
+ * Analyze a list of NormalizedLog records and produce TurnAnalysis[].
28
+ *
29
+ * Returns an empty array immediately when logs is empty or on any error.
30
+ *
31
+ * @param logs - All log records for a story
32
+ */
33
+ analyze(logs: NormalizedLog[]): TurnAnalysis[];
34
+ }
35
+ //# sourceMappingURL=log-turn-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-turn-analyzer.d.ts","sourceRoot":"","sources":["../../src/telemetry/log-turn-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAkB/D,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,CAAC,EAAE,OAAO;IAQ5B;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE;CA8G/C"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * LogTurnAnalyzer — computes per-turn token breakdowns from normalized log records.
3
+ *
4
+ * Takes a list of NormalizedLog records and produces TurnAnalysis[], where
5
+ * each entry represents an LLM turn derived from log data with:
6
+ * - Chronological ordering (by timestamp)
7
+ * - Sequential turnNumber assignment (1-N)
8
+ * - freshTokens, cacheHitRate, contextSize, contextDelta metrics
9
+ * - isContextSpike detection (inputTokens > 2× average)
10
+ * - Deduplication by traceId+spanId combination
11
+ *
12
+ * Architecture constraints:
13
+ * - Constructor injection: accepts ILogger via constructor (defaults to console)
14
+ * - No external dependencies beyond types from this module
15
+ * - Zero LLM calls — pure statistical computation
16
+ * - Never throws from public methods
17
+ *
18
+ * Migrated to @substrate-ai/core in story 41-6b.
19
+ */
20
+ // ---------------------------------------------------------------------------
21
+ // LogTurnAnalyzer
22
+ // ---------------------------------------------------------------------------
23
+ export class LogTurnAnalyzer {
24
+ _logger;
25
+ constructor(logger) {
26
+ this._logger = logger ?? console;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Public API
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Analyze a list of NormalizedLog records and produce TurnAnalysis[].
33
+ *
34
+ * Returns an empty array immediately when logs is empty or on any error.
35
+ *
36
+ * @param logs - All log records for a story
37
+ */
38
+ analyze(logs) {
39
+ try {
40
+ if (!Array.isArray(logs) || logs.length === 0) {
41
+ return [];
42
+ }
43
+ // Filter out invalid/malformed entries and non-LLM logs (zero tokens = noise)
44
+ const validLogs = logs.filter((log) => log != null &&
45
+ typeof log === 'object' &&
46
+ ((log.inputTokens ?? 0) > 0 || (log.outputTokens ?? 0) > 0));
47
+ if (validLogs.length === 0) {
48
+ this._logger.debug('LogTurnAnalyzer: no LLM logs with tokens to analyze');
49
+ return [];
50
+ }
51
+ // Group by traceId+spanId for deduplication.
52
+ // Key: `${traceId}:${spanId}` when both present; otherwise fallback to logId.
53
+ const grouped = new Map();
54
+ for (const log of validLogs) {
55
+ const key = log.traceId != null && log.spanId != null
56
+ ? `${log.traceId}:${log.spanId}`
57
+ : log.logId;
58
+ const group = grouped.get(key) ?? [];
59
+ group.push(log);
60
+ grouped.set(key, group);
61
+ }
62
+ // Merge each group: sum token counts, use earliest log as representative
63
+ const merged = [];
64
+ for (const group of grouped.values()) {
65
+ const sorted = [...group].sort((a, b) => a.timestamp - b.timestamp);
66
+ const representative = sorted[0];
67
+ let inputTokens = 0;
68
+ let outputTokens = 0;
69
+ let cacheReadTokens = 0;
70
+ let costUsd = 0;
71
+ for (const log of group) {
72
+ inputTokens += log.inputTokens ?? 0;
73
+ outputTokens += log.outputTokens ?? 0;
74
+ cacheReadTokens += log.cacheReadTokens ?? 0;
75
+ costUsd += log.costUsd ?? 0;
76
+ }
77
+ merged.push({ representative, inputTokens, outputTokens, cacheReadTokens, costUsd });
78
+ }
79
+ // Sort merged entries chronologically by representative timestamp
80
+ merged.sort((a, b) => a.representative.timestamp - b.representative.timestamp);
81
+ // First pass: build turns with context accumulation metrics
82
+ let runningContext = 0;
83
+ const turns = merged.map(({ representative: log, inputTokens, outputTokens, cacheReadTokens, costUsd }, idx) => {
84
+ const prevContext = runningContext;
85
+ // contextSize tracks total input (fresh + cached) to reflect actual context window usage
86
+ runningContext += inputTokens + cacheReadTokens;
87
+ // Claude API input_tokens IS the fresh (non-cached) count, so freshTokens = inputTokens
88
+ const freshTokens = inputTokens;
89
+ // cacheHitRate = fraction of total input that came from cache (0-1).
90
+ // Claude API reports input_tokens as fresh (non-cached) only, so
91
+ // total input = inputTokens + cacheReadTokens.
92
+ const totalInput = inputTokens + cacheReadTokens;
93
+ const cacheHitRate = totalInput > 0 ? cacheReadTokens / totalInput : 0;
94
+ return {
95
+ spanId: log.spanId ?? log.logId,
96
+ turnNumber: idx + 1,
97
+ name: log.eventName ?? 'log_turn',
98
+ timestamp: log.timestamp,
99
+ source: 'claude-code',
100
+ model: log.model,
101
+ inputTokens,
102
+ outputTokens,
103
+ cacheReadTokens,
104
+ freshTokens,
105
+ cacheHitRate,
106
+ costUsd,
107
+ durationMs: 0,
108
+ contextSize: runningContext,
109
+ contextDelta: runningContext - prevContext,
110
+ toolName: log.toolName,
111
+ isContextSpike: false, // will be set in second pass
112
+ childSpans: [],
113
+ ...(log.taskType !== undefined && { taskType: log.taskType }),
114
+ ...(log.phase !== undefined && { phase: log.phase }),
115
+ ...(log.dispatchId !== undefined && { dispatchId: log.dispatchId }),
116
+ };
117
+ });
118
+ // Second pass: spike detection (inputTokens > 2 × average)
119
+ const avg = turns.reduce((sum, t) => sum + t.inputTokens, 0) / turns.length;
120
+ for (const turn of turns) {
121
+ turn.isContextSpike = avg > 0 && turn.inputTokens > 2 * avg;
122
+ }
123
+ this._logger.debug({ turnCount: turns.length, avg }, 'LogTurnAnalyzer.analyze complete');
124
+ return turns;
125
+ }
126
+ catch (err) {
127
+ this._logger.warn({ err }, 'LogTurnAnalyzer.analyze failed — returning empty array');
128
+ return [];
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=log-turn-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-turn-analyzer.js","sourceRoot":"","sources":["../../src/telemetry/log-turn-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAkBH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,OAAO,eAAe;IACT,OAAO,CAAS;IAEjC,YAAY,MAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,OAAO,CAAA;IAClC,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E;;;;;;OAMG;IACH,OAAO,CAAC,IAAqB;QAC3B,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,EAAE,CAAA;YACX,CAAC;YAED,8EAA8E;YAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,IAAI,IAAI;gBACX,OAAO,GAAG,KAAK,QAAQ;gBACvB,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAC9D,CAAA;YACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAA;gBACzE,OAAO,EAAE,CAAA;YACX,CAAC;YAED,6CAA6C;YAC7C,8EAA8E;YAC9E,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAA;YAClD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,GAAG,GACP,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI;oBACvC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE;oBAChC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA;gBACf,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;gBACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACf,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACzB,CAAC;YAED,yEAAyE;YACzE,MAAM,MAAM,GAAqB,EAAE,CAAA;YACnC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;gBACnE,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;gBAEjC,IAAI,WAAW,GAAG,CAAC,CAAA;gBACnB,IAAI,YAAY,GAAG,CAAC,CAAA;gBACpB,IAAI,eAAe,GAAG,CAAC,CAAA;gBACvB,IAAI,OAAO,GAAG,CAAC,CAAA;gBACf,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;oBACxB,WAAW,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,CAAA;oBACnC,YAAY,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAA;oBACrC,eAAe,IAAI,GAAG,CAAC,eAAe,IAAI,CAAC,CAAA;oBAC3C,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;gBAC7B,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAA;YACtF,CAAC;YAED,kEAAkE;YAClE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;YAE9E,4DAA4D;YAC5D,IAAI,cAAc,GAAG,CAAC,CAAA;YACtB,MAAM,KAAK,GAAmB,MAAM,CAAC,GAAG,CACtC,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE;gBACpF,MAAM,WAAW,GAAG,cAAc,CAAA;gBAClC,yFAAyF;gBACzF,cAAc,IAAI,WAAW,GAAG,eAAe,CAAA;gBAE/C,wFAAwF;gBACxF,MAAM,WAAW,GAAG,WAAW,CAAA;gBAC/B,qEAAqE;gBACrE,iEAAiE;gBACjE,+CAA+C;gBAC/C,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,CAAA;gBAChD,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;gBAEtE,OAAO;oBACL,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK;oBAC/B,UAAU,EAAE,GAAG,GAAG,CAAC;oBACnB,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,UAAU;oBACjC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,MAAM,EAAE,aAAa;oBACrB,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,WAAW;oBACX,YAAY;oBACZ,eAAe;oBACf,WAAW;oBACX,YAAY;oBACZ,OAAO;oBACP,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,cAAc;oBAC3B,YAAY,EAAE,cAAc,GAAG,WAAW;oBAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,cAAc,EAAE,KAAK,EAAE,6BAA6B;oBACpD,UAAU,EAAE,EAAE;oBACd,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAC7D,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;iBACpE,CAAA;YACH,CAAC,CACF,CAAA;YAED,2DAA2D;YAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;YAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,GAAG,CAAA;YAC7D,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAA;YAExF,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,wDAAwD,CAAC,CAAA;YACpF,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * TelemetryNormalizer — transforms raw OTLP payloads into normalized models.
3
+ *
4
+ * Accepts raw OTLP JSON objects (traces or logs) and returns arrays of
5
+ * `NormalizedSpan` or `NormalizedLog` objects suitable for downstream analysis.
6
+ *
7
+ * Design invariants:
8
+ * - Never throws from public methods — returns empty array on any error
9
+ * - Constructor injection of ILogger for testability
10
+ * - No external dependencies beyond built-in Node.js and internal modules
11
+ */
12
+ import type { ILogger } from '../dispatch/types.js';
13
+ import type { NormalizedSpan, NormalizedLog, DispatchContext } from './types.js';
14
+ /**
15
+ * Transforms raw OTLP payloads into normalized telemetry models.
16
+ *
17
+ * Inject an `ILogger` for structured logging.
18
+ * All public methods return empty arrays on any error — never throw.
19
+ */
20
+ export declare class TelemetryNormalizer {
21
+ private readonly _logger;
22
+ constructor(logger: ILogger);
23
+ /**
24
+ * Normalize a raw OTLP trace payload into an array of `NormalizedSpan`.
25
+ *
26
+ * @param raw - Raw OTLP trace payload (resourceSpans structure)
27
+ * @returns Array of normalized spans; empty on error or empty input
28
+ */
29
+ normalizeSpan(raw: unknown): NormalizedSpan[];
30
+ private _normalizeSpanInternal;
31
+ private _normalizeOneSpan;
32
+ /**
33
+ * Normalize a raw OTLP log payload into an array of `NormalizedLog`.
34
+ *
35
+ * @param raw - Raw OTLP log payload (resourceLogs structure)
36
+ * @param dispatchContext - Optional dispatch context to stamp on each log (Story 30-1)
37
+ * @returns Array of normalized logs; empty on error or empty input
38
+ */
39
+ normalizeLog(raw: unknown, dispatchContext?: DispatchContext): NormalizedLog[];
40
+ private _normalizeLogInternal;
41
+ private _normalizeOneLog;
42
+ }
43
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/telemetry/normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA+JhF;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,OAAO;IAQ3B;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,EAAE;IAS7C,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,iBAAiB;IA6EzB;;;;;;OAMG;IACH,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,eAAe,GAAG,aAAa,EAAE;IAS9E,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,gBAAgB;CAqEzB"}