@codemieai/code 0.0.16 → 0.0.18

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 (410) hide show
  1. package/README.md +62 -5
  2. package/bin/agent-executor.js +7 -28
  3. package/bin/codemie-claude.js +18 -0
  4. package/bin/codemie-codex.js +18 -0
  5. package/bin/codemie-deepagents.js +18 -0
  6. package/bin/codemie-gemini.js +18 -0
  7. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  8. package/dist/agents/codemie-code/agent.js +3 -32
  9. package/dist/agents/codemie-code/agent.js.map +1 -1
  10. package/dist/agents/codemie-code/tools/planning.d.ts +2 -2
  11. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  12. package/dist/agents/core/AgentCLI.js +31 -62
  13. package/dist/agents/core/AgentCLI.js.map +1 -1
  14. package/dist/agents/core/BaseAgentAdapter.d.ts +9 -1
  15. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  16. package/dist/agents/core/BaseAgentAdapter.js +125 -10
  17. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  18. package/dist/agents/core/BaseMetricsAdapter.d.ts +64 -0
  19. package/dist/agents/core/BaseMetricsAdapter.d.ts.map +1 -0
  20. package/dist/agents/core/BaseMetricsAdapter.js +74 -0
  21. package/dist/agents/core/BaseMetricsAdapter.js.map +1 -0
  22. package/dist/agents/core/types.d.ts +1 -0
  23. package/dist/agents/core/types.d.ts.map +1 -1
  24. package/dist/agents/plugins/claude.metrics.d.ts +112 -0
  25. package/dist/agents/plugins/claude.metrics.d.ts.map +1 -0
  26. package/dist/agents/plugins/claude.metrics.js +700 -0
  27. package/dist/agents/plugins/claude.metrics.js.map +1 -0
  28. package/dist/agents/plugins/claude.plugin.d.ts +9 -0
  29. package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
  30. package/dist/agents/plugins/claude.plugin.js +52 -10
  31. package/dist/agents/plugins/claude.plugin.js.map +1 -1
  32. package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
  33. package/dist/agents/plugins/codemie-code.plugin.js +57 -13
  34. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  35. package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
  36. package/dist/agents/plugins/codex.plugin.js +1 -3
  37. package/dist/agents/plugins/codex.plugin.js.map +1 -1
  38. package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
  39. package/dist/agents/plugins/gemini.plugin.js +0 -7
  40. package/dist/agents/plugins/gemini.plugin.js.map +1 -1
  41. package/dist/agents/plugins/history-parser.d.ts +52 -0
  42. package/dist/agents/plugins/history-parser.d.ts.map +1 -0
  43. package/dist/agents/plugins/history-parser.js +155 -0
  44. package/dist/agents/plugins/history-parser.js.map +1 -0
  45. package/dist/cli/commands/analytics/aggregator.d.ts +58 -0
  46. package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -0
  47. package/dist/cli/commands/analytics/aggregator.js +702 -0
  48. package/dist/cli/commands/analytics/aggregator.js.map +1 -0
  49. package/dist/cli/commands/analytics/data-loader.d.ts +84 -0
  50. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -0
  51. package/dist/cli/commands/analytics/data-loader.js +211 -0
  52. package/dist/cli/commands/analytics/data-loader.js.map +1 -0
  53. package/dist/cli/commands/analytics/exporter.d.ts +20 -0
  54. package/dist/cli/commands/analytics/exporter.d.ts.map +1 -0
  55. package/dist/cli/commands/analytics/exporter.js +103 -0
  56. package/dist/cli/commands/analytics/exporter.js.map +1 -0
  57. package/dist/cli/commands/analytics/formatter.d.ts +49 -0
  58. package/dist/cli/commands/analytics/formatter.d.ts.map +1 -0
  59. package/dist/cli/commands/analytics/formatter.js +309 -0
  60. package/dist/cli/commands/analytics/formatter.js.map +1 -0
  61. package/dist/cli/commands/analytics/index.d.ts +6 -0
  62. package/dist/cli/commands/analytics/index.d.ts.map +1 -0
  63. package/dist/cli/commands/analytics/index.js +157 -0
  64. package/dist/cli/commands/analytics/index.js.map +1 -0
  65. package/dist/cli/commands/analytics/model-normalizer.d.ts +21 -0
  66. package/dist/cli/commands/analytics/model-normalizer.d.ts.map +1 -0
  67. package/dist/cli/commands/analytics/model-normalizer.js +44 -0
  68. package/dist/cli/commands/analytics/model-normalizer.js.map +1 -0
  69. package/dist/cli/commands/analytics/types.d.ts +188 -0
  70. package/dist/cli/commands/analytics/types.d.ts.map +1 -0
  71. package/dist/cli/commands/analytics/types.js +6 -0
  72. package/dist/cli/commands/analytics/types.js.map +1 -0
  73. package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts +9 -0
  74. package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts.map +1 -0
  75. package/dist/cli/commands/doctor/checks/AwsCliCheck.js +28 -0
  76. package/dist/cli/commands/doctor/checks/AwsCliCheck.js.map +1 -0
  77. package/dist/cli/commands/doctor/checks/PythonCheck.d.ts.map +1 -1
  78. package/dist/cli/commands/doctor/checks/PythonCheck.js +10 -0
  79. package/dist/cli/commands/doctor/checks/PythonCheck.js.map +1 -1
  80. package/dist/cli/commands/doctor/checks/WorkflowsCheck.d.ts.map +1 -1
  81. package/dist/cli/commands/doctor/checks/WorkflowsCheck.js +2 -1
  82. package/dist/cli/commands/doctor/checks/WorkflowsCheck.js.map +1 -1
  83. package/dist/cli/commands/doctor/checks/index.d.ts +1 -0
  84. package/dist/cli/commands/doctor/checks/index.d.ts.map +1 -1
  85. package/dist/cli/commands/doctor/checks/index.js +1 -0
  86. package/dist/cli/commands/doctor/checks/index.js.map +1 -1
  87. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  88. package/dist/cli/commands/doctor/index.js +75 -3
  89. package/dist/cli/commands/doctor/index.js.map +1 -1
  90. package/dist/cli/commands/profile.d.ts.map +1 -1
  91. package/dist/cli/commands/profile.js +49 -89
  92. package/dist/cli/commands/profile.js.map +1 -1
  93. package/dist/cli/commands/setup.js +1 -21
  94. package/dist/cli/commands/setup.js.map +1 -1
  95. package/dist/cli/index.js +1 -1
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/env/types.d.ts +14 -2
  98. package/dist/env/types.d.ts.map +1 -1
  99. package/dist/env/types.js.map +1 -1
  100. package/dist/metrics/MetricsOrchestrator.d.ts +67 -0
  101. package/dist/metrics/MetricsOrchestrator.d.ts.map +1 -0
  102. package/dist/metrics/MetricsOrchestrator.js +287 -0
  103. package/dist/metrics/MetricsOrchestrator.js.map +1 -0
  104. package/dist/metrics/config.d.ts +38 -0
  105. package/dist/metrics/config.d.ts.map +1 -0
  106. package/dist/metrics/config.js +80 -0
  107. package/dist/metrics/config.js.map +1 -0
  108. package/dist/metrics/core/DeltaWriter.d.ts +49 -0
  109. package/dist/metrics/core/DeltaWriter.d.ts.map +1 -0
  110. package/dist/metrics/core/DeltaWriter.js +146 -0
  111. package/dist/metrics/core/DeltaWriter.js.map +1 -0
  112. package/dist/metrics/core/FileSnapshotter.d.ts +22 -0
  113. package/dist/metrics/core/FileSnapshotter.d.ts.map +1 -0
  114. package/dist/metrics/core/FileSnapshotter.js +74 -0
  115. package/dist/metrics/core/FileSnapshotter.js.map +1 -0
  116. package/dist/metrics/core/SessionCorrelator.d.ts +34 -0
  117. package/dist/metrics/core/SessionCorrelator.d.ts.map +1 -0
  118. package/dist/metrics/core/SessionCorrelator.js +115 -0
  119. package/dist/metrics/core/SessionCorrelator.js.map +1 -0
  120. package/dist/metrics/core/SyncStateManager.d.ts +69 -0
  121. package/dist/metrics/core/SyncStateManager.d.ts.map +1 -0
  122. package/dist/metrics/core/SyncStateManager.js +284 -0
  123. package/dist/metrics/core/SyncStateManager.js.map +1 -0
  124. package/dist/metrics/index.d.ts +9 -0
  125. package/dist/metrics/index.d.ts.map +1 -0
  126. package/dist/metrics/index.js +11 -0
  127. package/dist/metrics/index.js.map +1 -0
  128. package/dist/metrics/session/SessionStore.d.ts +43 -0
  129. package/dist/metrics/session/SessionStore.d.ts.map +1 -0
  130. package/dist/metrics/session/SessionStore.js +142 -0
  131. package/dist/metrics/session/SessionStore.js.map +1 -0
  132. package/dist/metrics/sync/MetricsApiClient.d.ts +32 -0
  133. package/dist/metrics/sync/MetricsApiClient.d.ts.map +1 -0
  134. package/dist/metrics/sync/MetricsApiClient.js +155 -0
  135. package/dist/metrics/sync/MetricsApiClient.js.map +1 -0
  136. package/dist/metrics/sync/aggregator.d.ts +14 -0
  137. package/dist/metrics/sync/aggregator.d.ts.map +1 -0
  138. package/dist/metrics/sync/aggregator.js +214 -0
  139. package/dist/metrics/sync/aggregator.js.map +1 -0
  140. package/dist/metrics/sync/index.d.ts +10 -0
  141. package/dist/metrics/sync/index.d.ts.map +1 -0
  142. package/dist/metrics/sync/index.js +10 -0
  143. package/dist/metrics/sync/index.js.map +1 -0
  144. package/dist/metrics/sync/jsonl-writer.d.ts +28 -0
  145. package/dist/metrics/sync/jsonl-writer.d.ts.map +1 -0
  146. package/dist/metrics/sync/jsonl-writer.js +72 -0
  147. package/dist/metrics/sync/jsonl-writer.js.map +1 -0
  148. package/dist/metrics/sync/types.d.ts +73 -0
  149. package/dist/metrics/sync/types.d.ts.map +1 -0
  150. package/dist/metrics/sync/types.js +7 -0
  151. package/dist/metrics/sync/types.js.map +1 -0
  152. package/dist/metrics/types.d.ts +308 -0
  153. package/dist/metrics/types.d.ts.map +1 -0
  154. package/dist/metrics/types.js +8 -0
  155. package/dist/metrics/types.js.map +1 -0
  156. package/dist/providers/index.d.ts +2 -0
  157. package/dist/providers/index.d.ts.map +1 -1
  158. package/dist/providers/index.js +2 -0
  159. package/dist/providers/index.js.map +1 -1
  160. package/dist/providers/integration/setup-ui.d.ts +1 -1
  161. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  162. package/dist/providers/integration/setup-ui.js +51 -6
  163. package/dist/providers/integration/setup-ui.js.map +1 -1
  164. package/dist/providers/plugins/bedrock/bedrock.health.d.ts +53 -0
  165. package/dist/providers/plugins/bedrock/bedrock.health.d.ts.map +1 -0
  166. package/dist/providers/plugins/bedrock/bedrock.health.js +115 -0
  167. package/dist/providers/plugins/bedrock/bedrock.health.js.map +1 -0
  168. package/dist/providers/plugins/bedrock/bedrock.models.d.ts +26 -0
  169. package/dist/providers/plugins/bedrock/bedrock.models.d.ts.map +1 -0
  170. package/dist/providers/plugins/bedrock/bedrock.models.js +89 -0
  171. package/dist/providers/plugins/bedrock/bedrock.models.js.map +1 -0
  172. package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts +12 -0
  173. package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts.map +1 -0
  174. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js +308 -0
  175. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js.map +1 -0
  176. package/dist/providers/plugins/bedrock/bedrock.template.d.ts +11 -0
  177. package/dist/providers/plugins/bedrock/bedrock.template.d.ts.map +1 -0
  178. package/dist/providers/plugins/bedrock/bedrock.template.js +85 -0
  179. package/dist/providers/plugins/bedrock/bedrock.template.js.map +1 -0
  180. package/dist/providers/plugins/bedrock/index.d.ts +11 -0
  181. package/dist/providers/plugins/bedrock/index.d.ts.map +1 -0
  182. package/dist/providers/plugins/bedrock/index.js +11 -0
  183. package/dist/providers/plugins/bedrock/index.js.map +1 -0
  184. package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
  185. package/dist/providers/plugins/ollama/ollama.template.js +2 -0
  186. package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
  187. package/dist/providers/plugins/sso/sso.http-client.d.ts +2 -0
  188. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
  189. package/dist/providers/plugins/sso/sso.http-client.js +9 -3
  190. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  191. package/dist/proxy/http-client.d.ts +1 -1
  192. package/dist/proxy/http-client.d.ts.map +1 -1
  193. package/dist/proxy/http-client.js +78 -12
  194. package/dist/proxy/http-client.js.map +1 -1
  195. package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts +19 -0
  196. package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts.map +1 -0
  197. package/dist/proxy/plugins/endpoint-blocker.plugin.js +61 -0
  198. package/dist/proxy/plugins/endpoint-blocker.plugin.js.map +1 -0
  199. package/dist/proxy/plugins/header-injection.plugin.js +3 -0
  200. package/dist/proxy/plugins/header-injection.plugin.js.map +1 -1
  201. package/dist/proxy/plugins/index.d.ts +3 -1
  202. package/dist/proxy/plugins/index.d.ts.map +1 -1
  203. package/dist/proxy/plugins/index.js +5 -1
  204. package/dist/proxy/plugins/index.js.map +1 -1
  205. package/dist/proxy/plugins/logging.plugin.d.ts +11 -3
  206. package/dist/proxy/plugins/logging.plugin.d.ts.map +1 -1
  207. package/dist/proxy/plugins/logging.plugin.js +189 -25
  208. package/dist/proxy/plugins/logging.plugin.js.map +1 -1
  209. package/dist/proxy/plugins/metrics-sync.plugin.d.ts +33 -0
  210. package/dist/proxy/plugins/metrics-sync.plugin.d.ts.map +1 -0
  211. package/dist/proxy/plugins/metrics-sync.plugin.js +320 -0
  212. package/dist/proxy/plugins/metrics-sync.plugin.js.map +1 -0
  213. package/dist/proxy/plugins/registry.d.ts.map +1 -1
  214. package/dist/proxy/plugins/registry.js +8 -1
  215. package/dist/proxy/plugins/registry.js.map +1 -1
  216. package/dist/proxy/plugins/types.d.ts +6 -2
  217. package/dist/proxy/plugins/types.d.ts.map +1 -1
  218. package/dist/proxy/types.d.ts +8 -1
  219. package/dist/proxy/types.d.ts.map +1 -1
  220. package/dist/utils/ascii-logo.d.ts +21 -0
  221. package/dist/utils/ascii-logo.d.ts.map +1 -0
  222. package/dist/utils/ascii-logo.js +85 -0
  223. package/dist/utils/ascii-logo.js.map +1 -0
  224. package/dist/utils/codemie-proxy.d.ts +2 -7
  225. package/dist/utils/codemie-proxy.d.ts.map +1 -1
  226. package/dist/utils/codemie-proxy.js +83 -61
  227. package/dist/utils/codemie-proxy.js.map +1 -1
  228. package/dist/utils/config-loader.d.ts.map +1 -1
  229. package/dist/utils/config-loader.js +22 -6
  230. package/dist/utils/config-loader.js.map +1 -1
  231. package/dist/utils/exec.d.ts +11 -0
  232. package/dist/utils/exec.d.ts.map +1 -1
  233. package/dist/utils/exec.js +17 -1
  234. package/dist/utils/exec.js.map +1 -1
  235. package/dist/utils/goodbye-messages.d.ts +13 -0
  236. package/dist/utils/goodbye-messages.d.ts.map +1 -0
  237. package/dist/utils/goodbye-messages.js +245 -0
  238. package/dist/utils/goodbye-messages.js.map +1 -0
  239. package/dist/utils/json-parser.d.ts +52 -0
  240. package/dist/utils/json-parser.d.ts.map +1 -0
  241. package/dist/utils/json-parser.js +126 -0
  242. package/dist/utils/json-parser.js.map +1 -0
  243. package/dist/utils/logger.d.ts +37 -1
  244. package/dist/utils/logger.d.ts.map +1 -1
  245. package/dist/utils/logger.js +92 -20
  246. package/dist/utils/logger.js.map +1 -1
  247. package/dist/utils/sanitize.d.ts.map +1 -1
  248. package/dist/utils/sanitize.js +0 -1
  249. package/dist/utils/sanitize.js.map +1 -1
  250. package/dist/utils/which.d.ts +20 -0
  251. package/dist/utils/which.d.ts.map +1 -0
  252. package/dist/utils/which.js +47 -0
  253. package/dist/utils/which.js.map +1 -0
  254. package/package.json +10 -5
  255. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +0 -37
  256. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +0 -1
  257. package/dist/analytics/aggregation/adapters/claude.adapter.js +0 -531
  258. package/dist/analytics/aggregation/adapters/claude.adapter.js.map +0 -1
  259. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +0 -25
  260. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +0 -1
  261. package/dist/analytics/aggregation/adapters/codex.adapter.js +0 -396
  262. package/dist/analytics/aggregation/adapters/codex.adapter.js.map +0 -1
  263. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +0 -36
  264. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +0 -1
  265. package/dist/analytics/aggregation/adapters/gemini.adapter.js +0 -365
  266. package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +0 -1
  267. package/dist/analytics/aggregation/adapters/index.d.ts +0 -7
  268. package/dist/analytics/aggregation/adapters/index.d.ts.map +0 -1
  269. package/dist/analytics/aggregation/adapters/index.js +0 -7
  270. package/dist/analytics/aggregation/adapters/index.js.map +0 -1
  271. package/dist/analytics/aggregation/aggregator.d.ts +0 -49
  272. package/dist/analytics/aggregation/aggregator.d.ts.map +0 -1
  273. package/dist/analytics/aggregation/aggregator.js +0 -239
  274. package/dist/analytics/aggregation/aggregator.js.map +0 -1
  275. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +0 -99
  276. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +0 -1
  277. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +0 -110
  278. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +0 -1
  279. package/dist/analytics/aggregation/core/adapter.interface.d.ts +0 -76
  280. package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +0 -1
  281. package/dist/analytics/aggregation/core/adapter.interface.js +0 -9
  282. package/dist/analytics/aggregation/core/adapter.interface.js.map +0 -1
  283. package/dist/analytics/aggregation/core/aggregation-utils.d.ts +0 -86
  284. package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +0 -1
  285. package/dist/analytics/aggregation/core/aggregation-utils.js +0 -126
  286. package/dist/analytics/aggregation/core/aggregation-utils.js.map +0 -1
  287. package/dist/analytics/aggregation/core/discovery.d.ts +0 -40
  288. package/dist/analytics/aggregation/core/discovery.d.ts.map +0 -1
  289. package/dist/analytics/aggregation/core/discovery.js +0 -132
  290. package/dist/analytics/aggregation/core/discovery.js.map +0 -1
  291. package/dist/analytics/aggregation/core/file-utils.d.ts +0 -24
  292. package/dist/analytics/aggregation/core/file-utils.d.ts.map +0 -1
  293. package/dist/analytics/aggregation/core/file-utils.js +0 -143
  294. package/dist/analytics/aggregation/core/file-utils.js.map +0 -1
  295. package/dist/analytics/aggregation/core/index.d.ts +0 -14
  296. package/dist/analytics/aggregation/core/index.d.ts.map +0 -1
  297. package/dist/analytics/aggregation/core/index.js +0 -14
  298. package/dist/analytics/aggregation/core/index.js.map +0 -1
  299. package/dist/analytics/aggregation/core/project-mapping.d.ts +0 -50
  300. package/dist/analytics/aggregation/core/project-mapping.d.ts.map +0 -1
  301. package/dist/analytics/aggregation/core/project-mapping.js +0 -102
  302. package/dist/analytics/aggregation/core/project-mapping.js.map +0 -1
  303. package/dist/analytics/aggregation/core/streaming.d.ts +0 -26
  304. package/dist/analytics/aggregation/core/streaming.d.ts.map +0 -1
  305. package/dist/analytics/aggregation/core/streaming.js +0 -58
  306. package/dist/analytics/aggregation/core/streaming.js.map +0 -1
  307. package/dist/analytics/aggregation/core/user-prompt-source.d.ts +0 -81
  308. package/dist/analytics/aggregation/core/user-prompt-source.d.ts.map +0 -1
  309. package/dist/analytics/aggregation/core/user-prompt-source.js +0 -69
  310. package/dist/analytics/aggregation/core/user-prompt-source.js.map +0 -1
  311. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts +0 -49
  312. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts.map +0 -1
  313. package/dist/analytics/aggregation/core/user-prompt-sources/json.js +0 -66
  314. package/dist/analytics/aggregation/core/user-prompt-sources/json.js.map +0 -1
  315. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts +0 -43
  316. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts.map +0 -1
  317. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js +0 -56
  318. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js.map +0 -1
  319. package/dist/analytics/aggregation/index.d.ts +0 -8
  320. package/dist/analytics/aggregation/index.d.ts.map +0 -1
  321. package/dist/analytics/aggregation/index.js +0 -8
  322. package/dist/analytics/aggregation/index.js.map +0 -1
  323. package/dist/analytics/aggregation/types.d.ts +0 -278
  324. package/dist/analytics/aggregation/types.d.ts.map +0 -1
  325. package/dist/analytics/aggregation/types.js +0 -8
  326. package/dist/analytics/aggregation/types.js.map +0 -1
  327. package/dist/analytics/collector.d.ts +0 -46
  328. package/dist/analytics/collector.d.ts.map +0 -1
  329. package/dist/analytics/collector.js +0 -83
  330. package/dist/analytics/collector.js.map +0 -1
  331. package/dist/analytics/config.d.ts +0 -15
  332. package/dist/analytics/config.d.ts.map +0 -1
  333. package/dist/analytics/config.js +0 -65
  334. package/dist/analytics/config.js.map +0 -1
  335. package/dist/analytics/index.d.ts +0 -99
  336. package/dist/analytics/index.d.ts.map +0 -1
  337. package/dist/analytics/index.js +0 -280
  338. package/dist/analytics/index.js.map +0 -1
  339. package/dist/analytics/plugins/api-metrics.plugin.d.ts +0 -26
  340. package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +0 -1
  341. package/dist/analytics/plugins/api-metrics.plugin.js +0 -97
  342. package/dist/analytics/plugins/api-metrics.plugin.js.map +0 -1
  343. package/dist/analytics/plugins/index.d.ts +0 -15
  344. package/dist/analytics/plugins/index.d.ts.map +0 -1
  345. package/dist/analytics/plugins/index.js +0 -15
  346. package/dist/analytics/plugins/index.js.map +0 -1
  347. package/dist/analytics/plugins/model-metrics.plugin.d.ts +0 -39
  348. package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +0 -1
  349. package/dist/analytics/plugins/model-metrics.plugin.js +0 -105
  350. package/dist/analytics/plugins/model-metrics.plugin.js.map +0 -1
  351. package/dist/analytics/plugins/provider-metrics.plugin.d.ts +0 -41
  352. package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +0 -1
  353. package/dist/analytics/plugins/provider-metrics.plugin.js +0 -123
  354. package/dist/analytics/plugins/provider-metrics.plugin.js.map +0 -1
  355. package/dist/analytics/plugins/types.d.ts +0 -61
  356. package/dist/analytics/plugins/types.d.ts.map +0 -1
  357. package/dist/analytics/plugins/types.js +0 -54
  358. package/dist/analytics/plugins/types.js.map +0 -1
  359. package/dist/analytics/privacy.d.ts +0 -10
  360. package/dist/analytics/privacy.d.ts.map +0 -1
  361. package/dist/analytics/privacy.js +0 -20
  362. package/dist/analytics/privacy.js.map +0 -1
  363. package/dist/analytics/remote-submission/cursor-manager.d.ts +0 -71
  364. package/dist/analytics/remote-submission/cursor-manager.d.ts.map +0 -1
  365. package/dist/analytics/remote-submission/cursor-manager.js +0 -204
  366. package/dist/analytics/remote-submission/cursor-manager.js.map +0 -1
  367. package/dist/analytics/remote-submission/index.d.ts +0 -12
  368. package/dist/analytics/remote-submission/index.d.ts.map +0 -1
  369. package/dist/analytics/remote-submission/index.js +0 -11
  370. package/dist/analytics/remote-submission/index.js.map +0 -1
  371. package/dist/analytics/remote-submission/lock-manager.d.ts +0 -71
  372. package/dist/analytics/remote-submission/lock-manager.d.ts.map +0 -1
  373. package/dist/analytics/remote-submission/lock-manager.js +0 -238
  374. package/dist/analytics/remote-submission/lock-manager.js.map +0 -1
  375. package/dist/analytics/remote-submission/metric-transformer.d.ts +0 -21
  376. package/dist/analytics/remote-submission/metric-transformer.d.ts.map +0 -1
  377. package/dist/analytics/remote-submission/metric-transformer.js +0 -82
  378. package/dist/analytics/remote-submission/metric-transformer.js.map +0 -1
  379. package/dist/analytics/remote-submission/submitter.d.ts +0 -79
  380. package/dist/analytics/remote-submission/submitter.d.ts.map +0 -1
  381. package/dist/analytics/remote-submission/submitter.js +0 -362
  382. package/dist/analytics/remote-submission/submitter.js.map +0 -1
  383. package/dist/analytics/remote-submission/types.d.ts +0 -123
  384. package/dist/analytics/remote-submission/types.d.ts.map +0 -1
  385. package/dist/analytics/remote-submission/types.js +0 -13
  386. package/dist/analytics/remote-submission/types.js.map +0 -1
  387. package/dist/analytics/session.d.ts +0 -56
  388. package/dist/analytics/session.d.ts.map +0 -1
  389. package/dist/analytics/session.js +0 -95
  390. package/dist/analytics/session.js.map +0 -1
  391. package/dist/analytics/types.d.ts +0 -104
  392. package/dist/analytics/types.d.ts.map +0 -1
  393. package/dist/analytics/types.js +0 -15
  394. package/dist/analytics/types.js.map +0 -1
  395. package/dist/analytics/writer.d.ts +0 -18
  396. package/dist/analytics/writer.d.ts.map +0 -1
  397. package/dist/analytics/writer.js +0 -44
  398. package/dist/analytics/writer.js.map +0 -1
  399. package/dist/cli/commands/analytics.d.ts +0 -3
  400. package/dist/cli/commands/analytics.d.ts.map +0 -1
  401. package/dist/cli/commands/analytics.js +0 -748
  402. package/dist/cli/commands/analytics.js.map +0 -1
  403. package/dist/utils/analytics-reader.d.ts +0 -117
  404. package/dist/utils/analytics-reader.d.ts.map +0 -1
  405. package/dist/utils/analytics-reader.js +0 -421
  406. package/dist/utils/analytics-reader.js.map +0 -1
  407. package/dist/utils/date-formatter.d.ts +0 -88
  408. package/dist/utils/date-formatter.d.ts.map +0 -1
  409. package/dist/utils/date-formatter.js +0 -133
  410. package/dist/utils/date-formatter.js.map +0 -1
@@ -0,0 +1,702 @@
1
+ /**
2
+ * Analytics aggregator - processes raw session data into hierarchical analytics
3
+ * Uses core MetricDelta type from src/metrics/types.ts
4
+ */
5
+ import { normalizeModelName } from './model-normalizer.js';
6
+ /**
7
+ * Aggregates raw session data into hierarchical analytics
8
+ */
9
+ export class AnalyticsAggregator {
10
+ static shouldNormalizeModels = true;
11
+ /**
12
+ * Process raw sessions into root analytics
13
+ */
14
+ static aggregate(rawSessions, normalizeModels = true) {
15
+ this.shouldNormalizeModels = normalizeModels;
16
+ // Build session analytics first
17
+ const sessions = rawSessions
18
+ .map(raw => this.buildSessionAnalytics(raw))
19
+ .filter((s) => s !== null);
20
+ // Group deltas by project → branch across ALL sessions
21
+ // Key: project → branch, Value: deltas from all sessions on that branch
22
+ const projectBranchDeltas = new Map();
23
+ // Collect all deltas grouped by project and branch
24
+ for (const raw of rawSessions) {
25
+ if (!raw.startEvent)
26
+ continue;
27
+ const projectPath = raw.startEvent.data.workingDirectory || 'Unknown';
28
+ // Group deltas from this session by branch
29
+ for (const delta of raw.deltas) {
30
+ const branchName = delta.gitBranch || 'Unknown';
31
+ // Get or create project map
32
+ if (!projectBranchDeltas.has(projectPath)) {
33
+ projectBranchDeltas.set(projectPath, new Map());
34
+ }
35
+ const branchMap = projectBranchDeltas.get(projectPath);
36
+ // Get or create branch deltas array
37
+ if (!branchMap.has(branchName)) {
38
+ branchMap.set(branchName, []);
39
+ }
40
+ branchMap.get(branchName).push(delta);
41
+ }
42
+ }
43
+ // Build project → branch hierarchy from aggregated deltas
44
+ const projectsMap = new Map();
45
+ for (const [projectPath, branchMap] of projectBranchDeltas) {
46
+ // Get or create project
47
+ if (!projectsMap.has(projectPath)) {
48
+ projectsMap.set(projectPath, {
49
+ projectPath,
50
+ branches: [],
51
+ totalSessions: 0,
52
+ totalDuration: 0,
53
+ totalTokens: this.emptyTokenBreakdown(),
54
+ totalTurns: 0,
55
+ totalFileOperations: 0,
56
+ totalLinesAdded: 0,
57
+ totalLinesRemoved: 0,
58
+ totalLinesModified: 0,
59
+ netLinesChanged: 0,
60
+ totalToolCalls: 0,
61
+ successfulToolCalls: 0,
62
+ failedToolCalls: 0,
63
+ toolSuccessRate: 0,
64
+ models: [],
65
+ tools: [],
66
+ languages: [],
67
+ formats: []
68
+ });
69
+ }
70
+ const project = projectsMap.get(projectPath);
71
+ // Create branch analytics from aggregated deltas
72
+ for (const [branchName, deltas] of branchMap) {
73
+ // Find which sessions contributed to this branch
74
+ const contributingSessions = sessions.filter(session => session.workingDirectory === projectPath);
75
+ const branch = {
76
+ branchName,
77
+ sessions: contributingSessions, // Sessions that contributed deltas to this branch
78
+ totalSessions: new Set(deltas.map(d => d.sessionId)).size, // Count unique sessions
79
+ totalDuration: 0, // Will be calculated from sessions
80
+ totalTokens: this.calculateTokenBreakdown(deltas),
81
+ totalTurns: deltas.length,
82
+ totalFileOperations: 0,
83
+ totalLinesAdded: 0,
84
+ totalLinesRemoved: 0,
85
+ totalLinesModified: 0,
86
+ netLinesChanged: 0,
87
+ totalToolCalls: 0,
88
+ successfulToolCalls: 0,
89
+ failedToolCalls: 0,
90
+ toolSuccessRate: 0,
91
+ models: [],
92
+ tools: [],
93
+ languages: [],
94
+ formats: []
95
+ };
96
+ // Aggregate branch metrics from deltas
97
+ this.aggregateBranchFromDeltas(branch, deltas);
98
+ project.branches.push(branch);
99
+ }
100
+ }
101
+ // Aggregate project stats from branches
102
+ for (const project of projectsMap.values()) {
103
+ this.aggregateProject(project);
104
+ }
105
+ // Build root analytics
106
+ const projects = Array.from(projectsMap.values());
107
+ const root = {
108
+ projects,
109
+ totalSessions: 0,
110
+ totalDuration: 0,
111
+ totalTokens: this.emptyTokenBreakdown(),
112
+ totalTurns: 0,
113
+ totalFileOperations: 0,
114
+ totalLinesAdded: 0,
115
+ totalLinesRemoved: 0,
116
+ totalLinesModified: 0,
117
+ netLinesChanged: 0,
118
+ totalToolCalls: 0,
119
+ successfulToolCalls: 0,
120
+ failedToolCalls: 0,
121
+ toolSuccessRate: 0,
122
+ models: [],
123
+ tools: [],
124
+ languages: [],
125
+ formats: []
126
+ };
127
+ this.aggregateRoot(root);
128
+ return root;
129
+ }
130
+ /**
131
+ * Build session analytics from raw records (using MetricDelta)
132
+ */
133
+ static buildSessionAnalytics(raw) {
134
+ const startEvent = raw.startEvent;
135
+ const endEvent = raw.endEvent;
136
+ const deltas = raw.deltas;
137
+ if (!startEvent) {
138
+ return null;
139
+ }
140
+ // Calculate token breakdown from MetricDelta records
141
+ const tokens = this.calculateTokenBreakdown(deltas);
142
+ // Build model distribution from MetricDelta.models
143
+ const modelCounts = new Map();
144
+ for (const delta of deltas) {
145
+ if (delta.models) {
146
+ for (const model of delta.models) {
147
+ const modelName = this.shouldNormalizeModels ? normalizeModelName(model) : model;
148
+ modelCounts.set(modelName, (modelCounts.get(modelName) || 0) + 1);
149
+ }
150
+ }
151
+ }
152
+ const totalModelCalls = Array.from(modelCounts.values()).reduce((sum, count) => sum + count, 0);
153
+ const models = Array.from(modelCounts.entries())
154
+ .map(([model, calls]) => ({
155
+ model,
156
+ calls,
157
+ percentage: totalModelCalls > 0 ? (calls / totalModelCalls) * 100 : 0
158
+ }))
159
+ .sort((a, b) => b.calls - a.calls);
160
+ // Build tool usage stats from MetricDelta.toolStatus
161
+ const toolCounts = new Map();
162
+ for (const delta of deltas) {
163
+ if (delta.toolStatus) {
164
+ for (const [toolName, status] of Object.entries(delta.toolStatus)) {
165
+ if (!toolCounts.has(toolName)) {
166
+ toolCounts.set(toolName, { success: 0, failure: 0 });
167
+ }
168
+ const counts = toolCounts.get(toolName);
169
+ counts.success += status.success;
170
+ counts.failure += status.failure;
171
+ }
172
+ }
173
+ }
174
+ const tools = Array.from(toolCounts.entries())
175
+ .map(([toolName, counts]) => {
176
+ const total = counts.success + counts.failure;
177
+ return {
178
+ toolName,
179
+ totalCalls: total,
180
+ successCount: counts.success,
181
+ failureCount: counts.failure,
182
+ successRate: total > 0 ? (counts.success / total) * 100 : 0
183
+ };
184
+ })
185
+ .sort((a, b) => b.totalCalls - a.totalCalls);
186
+ // Build file operation summaries from MetricDelta.fileOperations
187
+ const fileOps = new Map();
188
+ for (const delta of deltas) {
189
+ if (delta.fileOperations) {
190
+ for (const fileOp of delta.fileOperations) {
191
+ if (!fileOp.path)
192
+ continue;
193
+ if (!fileOps.has(fileOp.path)) {
194
+ fileOps.set(fileOp.path, {
195
+ filePath: fileOp.path,
196
+ operationCount: 0,
197
+ linesAdded: 0,
198
+ linesRemoved: 0,
199
+ linesModified: 0,
200
+ netLinesChanged: 0
201
+ });
202
+ }
203
+ const summary = fileOps.get(fileOp.path);
204
+ summary.operationCount++;
205
+ summary.linesAdded += fileOp.linesAdded || 0;
206
+ summary.linesRemoved += fileOp.linesRemoved || 0;
207
+ summary.linesModified += fileOp.linesModified || 0;
208
+ summary.netLinesChanged += (fileOp.linesAdded || 0) - (fileOp.linesRemoved || 0);
209
+ }
210
+ }
211
+ }
212
+ // Build language stats from FileOperation.language
213
+ const languageCounts = new Map();
214
+ const totalLines = Array.from(fileOps.values()).reduce((sum, f) => sum + f.linesAdded, 0) || 1;
215
+ for (const delta of deltas) {
216
+ if (delta.fileOperations) {
217
+ for (const fileOp of delta.fileOperations) {
218
+ if (!fileOp.language)
219
+ continue;
220
+ const lang = fileOp.language;
221
+ if (!languageCounts.has(lang)) {
222
+ languageCounts.set(lang, { created: 0, modified: 0, lines: 0, tokens: 0 });
223
+ }
224
+ const counts = languageCounts.get(lang);
225
+ if (fileOp.type === 'write') {
226
+ counts.created++;
227
+ }
228
+ else if (fileOp.type === 'edit') {
229
+ counts.modified++;
230
+ }
231
+ counts.lines += fileOp.linesAdded || 0;
232
+ // Proportional token attribution
233
+ const tokenShare = ((fileOp.linesAdded || 0) / totalLines) * tokens.total;
234
+ counts.tokens += tokenShare;
235
+ }
236
+ }
237
+ }
238
+ const languages = Array.from(languageCounts.entries())
239
+ .map(([language, counts]) => ({
240
+ language,
241
+ filesCreated: counts.created,
242
+ filesModified: counts.modified,
243
+ linesAdded: counts.lines,
244
+ linesRemoved: 0,
245
+ tokens: counts.tokens,
246
+ percentage: totalLines > 0 ? (counts.lines / totalLines) * 100 : 0
247
+ }))
248
+ .sort((a, b) => b.linesAdded - a.linesAdded);
249
+ // Build format stats from FileOperation.format
250
+ const formatCounts = new Map();
251
+ for (const delta of deltas) {
252
+ if (delta.fileOperations) {
253
+ for (const fileOp of delta.fileOperations) {
254
+ if (!fileOp.format)
255
+ continue;
256
+ const fmt = fileOp.format;
257
+ if (!formatCounts.has(fmt)) {
258
+ formatCounts.set(fmt, { created: 0, modified: 0, lines: 0, tokens: 0 });
259
+ }
260
+ const counts = formatCounts.get(fmt);
261
+ if (fileOp.type === 'write') {
262
+ counts.created++;
263
+ }
264
+ else if (fileOp.type === 'edit') {
265
+ counts.modified++;
266
+ }
267
+ counts.lines += fileOp.linesAdded || 0;
268
+ // Proportional token attribution
269
+ const tokenShare = ((fileOp.linesAdded || 0) / totalLines) * tokens.total;
270
+ counts.tokens += tokenShare;
271
+ }
272
+ }
273
+ }
274
+ const formats = Array.from(formatCounts.entries())
275
+ .map(([language, counts]) => ({
276
+ language,
277
+ filesCreated: counts.created,
278
+ filesModified: counts.modified,
279
+ linesAdded: counts.lines,
280
+ linesRemoved: 0,
281
+ tokens: counts.tokens,
282
+ percentage: totalLines > 0 ? (counts.lines / totalLines) * 100 : 0
283
+ }))
284
+ .sort((a, b) => b.linesAdded - a.linesAdded);
285
+ // Calculate aggregated stats
286
+ const fileOpsArray = Array.from(fileOps.values());
287
+ const totalFileOperations = fileOpsArray.length;
288
+ const totalLinesAdded = fileOpsArray.reduce((sum, f) => sum + f.linesAdded, 0);
289
+ const totalLinesRemoved = fileOpsArray.reduce((sum, f) => sum + f.linesRemoved, 0);
290
+ const totalLinesModified = fileOpsArray.reduce((sum, f) => sum + f.linesModified, 0);
291
+ const netLinesChanged = totalLinesAdded - totalLinesRemoved;
292
+ const totalToolCalls = tools.reduce((sum, t) => sum + t.totalCalls, 0);
293
+ const successfulToolCalls = tools.reduce((sum, t) => sum + t.successCount, 0);
294
+ const failedToolCalls = tools.reduce((sum, t) => sum + t.failureCount, 0);
295
+ const toolSuccessRate = totalToolCalls > 0 ? (successfulToolCalls / totalToolCalls) * 100 : 0;
296
+ return {
297
+ sessionId: raw.sessionId,
298
+ agentName: startEvent.agentName,
299
+ provider: startEvent.data.provider,
300
+ workingDirectory: startEvent.data.workingDirectory,
301
+ startTime: startEvent.data.startTime,
302
+ endTime: endEvent?.data.endTime || Date.now(),
303
+ duration: endEvent?.data.duration || (Date.now() - startEvent.data.startTime),
304
+ tokens,
305
+ totalTurns: deltas.length,
306
+ totalFileOperations,
307
+ totalLinesAdded,
308
+ totalLinesRemoved,
309
+ totalLinesModified,
310
+ netLinesChanged,
311
+ totalToolCalls,
312
+ successfulToolCalls,
313
+ failedToolCalls,
314
+ toolSuccessRate,
315
+ models,
316
+ tools,
317
+ files: fileOpsArray,
318
+ languages,
319
+ formats
320
+ };
321
+ }
322
+ /**
323
+ * Calculate token breakdown from MetricDelta records
324
+ */
325
+ static calculateTokenBreakdown(deltas) {
326
+ let input = 0;
327
+ let output = 0;
328
+ let cacheRead = 0;
329
+ let cacheCreation = 0;
330
+ for (const delta of deltas) {
331
+ input += delta.tokens.input || 0;
332
+ output += delta.tokens.output || 0;
333
+ cacheRead += delta.tokens.cacheRead || 0;
334
+ cacheCreation += delta.tokens.cacheCreation || 0;
335
+ }
336
+ const total = input + output + cacheRead + cacheCreation;
337
+ const totalInput = input + cacheCreation + cacheRead;
338
+ const cacheHitRate = totalInput > 0 ? cacheRead / totalInput : 0;
339
+ return {
340
+ input,
341
+ output,
342
+ cacheRead,
343
+ cacheCreation,
344
+ total,
345
+ cacheHitRate
346
+ };
347
+ }
348
+ /**
349
+ * Aggregate branch statistics directly from deltas
350
+ * Used for branch-level aggregation across all sessions
351
+ */
352
+ static aggregateBranchFromDeltas(branch, deltas) {
353
+ // Calculate duration from contributing sessions
354
+ branch.totalDuration = branch.sessions.reduce((sum, s) => sum + s.duration, 0);
355
+ // File operations and line counts
356
+ const fileOps = new Map();
357
+ for (const delta of deltas) {
358
+ if (delta.fileOperations) {
359
+ for (const op of delta.fileOperations) {
360
+ if (op.path) {
361
+ const existing = fileOps.get(op.path) || { linesAdded: 0, linesRemoved: 0, linesModified: 0 };
362
+ existing.linesAdded += op.linesAdded || 0;
363
+ existing.linesRemoved += op.linesRemoved || 0;
364
+ existing.linesModified += op.linesModified || 0;
365
+ fileOps.set(op.path, existing);
366
+ }
367
+ }
368
+ }
369
+ }
370
+ const fileOpsArray = Array.from(fileOps.values());
371
+ branch.totalFileOperations = fileOpsArray.length;
372
+ branch.totalLinesAdded = fileOpsArray.reduce((sum, f) => sum + f.linesAdded, 0);
373
+ branch.totalLinesRemoved = fileOpsArray.reduce((sum, f) => sum + f.linesRemoved, 0);
374
+ branch.totalLinesModified = fileOpsArray.reduce((sum, f) => sum + f.linesModified, 0);
375
+ branch.netLinesChanged = branch.totalLinesAdded - branch.totalLinesRemoved;
376
+ // Tool calls
377
+ let totalToolCalls = 0;
378
+ let successfulToolCalls = 0;
379
+ let failedToolCalls = 0;
380
+ for (const delta of deltas) {
381
+ if (delta.tools) {
382
+ for (const count of Object.values(delta.tools)) {
383
+ totalToolCalls += count;
384
+ }
385
+ }
386
+ if (delta.toolStatus) {
387
+ for (const status of Object.values(delta.toolStatus)) {
388
+ successfulToolCalls += status.success || 0;
389
+ failedToolCalls += status.failure || 0;
390
+ }
391
+ }
392
+ }
393
+ branch.totalToolCalls = totalToolCalls;
394
+ branch.successfulToolCalls = successfulToolCalls;
395
+ branch.failedToolCalls = failedToolCalls;
396
+ branch.toolSuccessRate = totalToolCalls > 0 ? (successfulToolCalls / totalToolCalls) * 100 : 0;
397
+ // Models - aggregate from deltas
398
+ const modelCounts = new Map();
399
+ for (const delta of deltas) {
400
+ if (delta.models) {
401
+ for (const model of delta.models) {
402
+ const normalizedModel = this.shouldNormalizeModels ? normalizeModelName(model) : model;
403
+ modelCounts.set(normalizedModel, (modelCounts.get(normalizedModel) || 0) + 1);
404
+ }
405
+ }
406
+ }
407
+ const totalModelCalls = Array.from(modelCounts.values()).reduce((sum, count) => sum + count, 0);
408
+ branch.models = Array.from(modelCounts.entries()).map(([model, count]) => ({
409
+ model,
410
+ calls: count,
411
+ percentage: totalModelCalls > 0 ? (count / totalModelCalls) * 100 : 0
412
+ })).sort((a, b) => b.calls - a.calls);
413
+ // Tools - aggregate from deltas
414
+ const toolCounts = new Map();
415
+ for (const delta of deltas) {
416
+ if (delta.tools) {
417
+ for (const [toolName, count] of Object.entries(delta.tools)) {
418
+ const existing = toolCounts.get(toolName) || { total: 0, success: 0, failure: 0 };
419
+ existing.total += count;
420
+ toolCounts.set(toolName, existing);
421
+ }
422
+ }
423
+ if (delta.toolStatus) {
424
+ for (const [toolName, status] of Object.entries(delta.toolStatus)) {
425
+ const existing = toolCounts.get(toolName) || { total: 0, success: 0, failure: 0 };
426
+ existing.success += status.success || 0;
427
+ existing.failure += status.failure || 0;
428
+ toolCounts.set(toolName, existing);
429
+ }
430
+ }
431
+ }
432
+ branch.tools = Array.from(toolCounts.entries()).map(([toolName, counts]) => ({
433
+ toolName,
434
+ totalCalls: counts.total,
435
+ successCount: counts.success,
436
+ failureCount: counts.failure,
437
+ successRate: counts.total > 0 ? (counts.success / counts.total) * 100 : 0
438
+ })).sort((a, b) => b.totalCalls - a.totalCalls);
439
+ // Languages and formats - aggregate from file operations
440
+ const languageCounts = new Map();
441
+ const formatCounts = new Map();
442
+ // Track file operations per language/format
443
+ for (const delta of deltas) {
444
+ if (delta.fileOperations) {
445
+ for (const op of delta.fileOperations) {
446
+ const deltaTokens = (delta.tokens.input || 0) + (delta.tokens.output || 0);
447
+ if (op.language) {
448
+ const existing = languageCounts.get(op.language) || {
449
+ filesCreated: new Set(),
450
+ filesModified: new Set(),
451
+ linesAdded: 0,
452
+ linesRemoved: 0,
453
+ tokens: 0
454
+ };
455
+ if (op.type === 'write' && op.path) {
456
+ existing.filesCreated.add(op.path);
457
+ }
458
+ else if (op.type === 'edit' && op.path) {
459
+ existing.filesModified.add(op.path);
460
+ }
461
+ existing.linesAdded += op.linesAdded || 0;
462
+ existing.linesRemoved += op.linesRemoved || 0;
463
+ existing.tokens += deltaTokens;
464
+ languageCounts.set(op.language, existing);
465
+ }
466
+ if (op.format) {
467
+ const existing = formatCounts.get(op.format) || {
468
+ filesCreated: new Set(),
469
+ filesModified: new Set(),
470
+ linesAdded: 0,
471
+ linesRemoved: 0,
472
+ tokens: 0
473
+ };
474
+ if (op.type === 'write' && op.path) {
475
+ existing.filesCreated.add(op.path);
476
+ }
477
+ else if (op.type === 'edit' && op.path) {
478
+ existing.filesModified.add(op.path);
479
+ }
480
+ existing.linesAdded += op.linesAdded || 0;
481
+ existing.linesRemoved += op.linesRemoved || 0;
482
+ existing.tokens += deltaTokens;
483
+ formatCounts.set(op.format, existing);
484
+ }
485
+ }
486
+ }
487
+ }
488
+ const totalLinesForLang = Array.from(languageCounts.values()).reduce((sum, l) => sum + l.linesAdded, 0);
489
+ branch.languages = Array.from(languageCounts.entries()).map(([language, data]) => ({
490
+ language,
491
+ filesCreated: data.filesCreated.size,
492
+ filesModified: data.filesModified.size,
493
+ linesAdded: data.linesAdded,
494
+ linesRemoved: data.linesRemoved,
495
+ tokens: data.tokens,
496
+ percentage: totalLinesForLang > 0 ? (data.linesAdded / totalLinesForLang) * 100 : 0
497
+ })).sort((a, b) => b.linesAdded - a.linesAdded);
498
+ const totalLinesForFormat = Array.from(formatCounts.values()).reduce((sum, l) => sum + l.linesAdded, 0);
499
+ branch.formats = Array.from(formatCounts.entries()).map(([format, data]) => ({
500
+ language: format,
501
+ filesCreated: data.filesCreated.size,
502
+ filesModified: data.filesModified.size,
503
+ linesAdded: data.linesAdded,
504
+ linesRemoved: data.linesRemoved,
505
+ tokens: data.tokens,
506
+ percentage: totalLinesForFormat > 0 ? (data.linesAdded / totalLinesForFormat) * 100 : 0
507
+ })).sort((a, b) => b.linesAdded - a.linesAdded);
508
+ }
509
+ /**
510
+ * Aggregate branch statistics from sessions (legacy method, no longer used)
511
+ */
512
+ static aggregateBranch(branch) {
513
+ branch.totalSessions = branch.sessions.length;
514
+ branch.totalDuration = branch.sessions.reduce((sum, s) => sum + s.duration, 0);
515
+ branch.totalTurns = branch.sessions.reduce((sum, s) => sum + s.totalTurns, 0);
516
+ branch.totalFileOperations = branch.sessions.reduce((sum, s) => sum + s.totalFileOperations, 0);
517
+ branch.totalLinesAdded = branch.sessions.reduce((sum, s) => sum + s.totalLinesAdded, 0);
518
+ branch.totalLinesRemoved = branch.sessions.reduce((sum, s) => sum + s.totalLinesRemoved, 0);
519
+ branch.totalLinesModified = branch.sessions.reduce((sum, s) => sum + s.totalLinesModified, 0);
520
+ branch.netLinesChanged = branch.sessions.reduce((sum, s) => sum + s.netLinesChanged, 0);
521
+ branch.totalToolCalls = branch.sessions.reduce((sum, s) => sum + s.totalToolCalls, 0);
522
+ branch.successfulToolCalls = branch.sessions.reduce((sum, s) => sum + s.successfulToolCalls, 0);
523
+ branch.failedToolCalls = branch.sessions.reduce((sum, s) => sum + s.failedToolCalls, 0);
524
+ branch.toolSuccessRate = branch.totalToolCalls > 0 ? (branch.successfulToolCalls / branch.totalToolCalls) * 100 : 0;
525
+ // Aggregate tokens
526
+ branch.totalTokens = {
527
+ input: branch.sessions.reduce((sum, s) => sum + s.tokens.input, 0),
528
+ output: branch.sessions.reduce((sum, s) => sum + s.tokens.output, 0),
529
+ cacheRead: branch.sessions.reduce((sum, s) => sum + s.tokens.cacheRead, 0),
530
+ cacheCreation: branch.sessions.reduce((sum, s) => sum + s.tokens.cacheCreation, 0),
531
+ total: branch.sessions.reduce((sum, s) => sum + s.tokens.total, 0),
532
+ cacheHitRate: 0
533
+ };
534
+ const totalInput = branch.totalTokens.input + branch.totalTokens.cacheCreation + branch.totalTokens.cacheRead;
535
+ branch.totalTokens.cacheHitRate = totalInput > 0 ? branch.totalTokens.cacheRead / totalInput : 0;
536
+ // Aggregate models
537
+ branch.models = this.aggregateModels(branch.sessions.flatMap(s => s.models));
538
+ // Aggregate tools
539
+ branch.tools = this.aggregateTools(branch.sessions.flatMap(s => s.tools));
540
+ // Aggregate languages
541
+ branch.languages = this.aggregateLanguages(branch.sessions.flatMap(s => s.languages));
542
+ // Aggregate formats
543
+ branch.formats = this.aggregateLanguages(branch.sessions.flatMap(s => s.formats));
544
+ }
545
+ /**
546
+ * Aggregate project statistics from branches
547
+ */
548
+ static aggregateProject(project) {
549
+ project.totalSessions = project.branches.reduce((sum, b) => sum + b.totalSessions, 0);
550
+ project.totalDuration = project.branches.reduce((sum, b) => sum + b.totalDuration, 0);
551
+ project.totalTurns = project.branches.reduce((sum, b) => sum + b.totalTurns, 0);
552
+ project.totalFileOperations = project.branches.reduce((sum, b) => sum + b.totalFileOperations, 0);
553
+ project.totalLinesAdded = project.branches.reduce((sum, b) => sum + b.totalLinesAdded, 0);
554
+ project.totalLinesRemoved = project.branches.reduce((sum, b) => sum + b.totalLinesRemoved, 0);
555
+ project.totalLinesModified = project.branches.reduce((sum, b) => sum + b.totalLinesModified, 0);
556
+ project.netLinesChanged = project.branches.reduce((sum, b) => sum + b.netLinesChanged, 0);
557
+ project.totalToolCalls = project.branches.reduce((sum, b) => sum + b.totalToolCalls, 0);
558
+ project.successfulToolCalls = project.branches.reduce((sum, b) => sum + b.successfulToolCalls, 0);
559
+ project.failedToolCalls = project.branches.reduce((sum, b) => sum + b.failedToolCalls, 0);
560
+ project.toolSuccessRate = project.totalToolCalls > 0 ? (project.successfulToolCalls / project.totalToolCalls) * 100 : 0;
561
+ // Aggregate tokens
562
+ project.totalTokens = {
563
+ input: project.branches.reduce((sum, b) => sum + b.totalTokens.input, 0),
564
+ output: project.branches.reduce((sum, b) => sum + b.totalTokens.output, 0),
565
+ cacheRead: project.branches.reduce((sum, b) => sum + b.totalTokens.cacheRead, 0),
566
+ cacheCreation: project.branches.reduce((sum, b) => sum + b.totalTokens.cacheCreation, 0),
567
+ total: project.branches.reduce((sum, b) => sum + b.totalTokens.total, 0),
568
+ cacheHitRate: 0
569
+ };
570
+ const totalInput = project.totalTokens.input + project.totalTokens.cacheCreation + project.totalTokens.cacheRead;
571
+ project.totalTokens.cacheHitRate = totalInput > 0 ? project.totalTokens.cacheRead / totalInput : 0;
572
+ // Aggregate models
573
+ project.models = this.aggregateModels(project.branches.flatMap(b => b.models));
574
+ // Aggregate tools
575
+ project.tools = this.aggregateTools(project.branches.flatMap(b => b.tools));
576
+ // Aggregate languages
577
+ project.languages = this.aggregateLanguages(project.branches.flatMap(b => b.languages));
578
+ // Aggregate formats
579
+ project.formats = this.aggregateLanguages(project.branches.flatMap(b => b.formats));
580
+ }
581
+ /**
582
+ * Aggregate root statistics from projects
583
+ */
584
+ static aggregateRoot(root) {
585
+ root.totalSessions = root.projects.reduce((sum, p) => sum + p.totalSessions, 0);
586
+ root.totalDuration = root.projects.reduce((sum, p) => sum + p.totalDuration, 0);
587
+ root.totalTurns = root.projects.reduce((sum, p) => sum + p.totalTurns, 0);
588
+ root.totalFileOperations = root.projects.reduce((sum, p) => sum + p.totalFileOperations, 0);
589
+ root.totalLinesAdded = root.projects.reduce((sum, p) => sum + p.totalLinesAdded, 0);
590
+ root.totalLinesRemoved = root.projects.reduce((sum, p) => sum + p.totalLinesRemoved, 0);
591
+ root.totalLinesModified = root.projects.reduce((sum, p) => sum + p.totalLinesModified, 0);
592
+ root.netLinesChanged = root.projects.reduce((sum, p) => sum + p.netLinesChanged, 0);
593
+ root.totalToolCalls = root.projects.reduce((sum, p) => sum + p.totalToolCalls, 0);
594
+ root.successfulToolCalls = root.projects.reduce((sum, p) => sum + p.successfulToolCalls, 0);
595
+ root.failedToolCalls = root.projects.reduce((sum, p) => sum + p.failedToolCalls, 0);
596
+ root.toolSuccessRate = root.totalToolCalls > 0 ? (root.successfulToolCalls / root.totalToolCalls) * 100 : 0;
597
+ // Aggregate tokens
598
+ root.totalTokens = {
599
+ input: root.projects.reduce((sum, p) => sum + p.totalTokens.input, 0),
600
+ output: root.projects.reduce((sum, p) => sum + p.totalTokens.output, 0),
601
+ cacheRead: root.projects.reduce((sum, p) => sum + p.totalTokens.cacheRead, 0),
602
+ cacheCreation: root.projects.reduce((sum, p) => sum + p.totalTokens.cacheCreation, 0),
603
+ total: root.projects.reduce((sum, p) => sum + p.totalTokens.total, 0),
604
+ cacheHitRate: 0
605
+ };
606
+ const totalInput = root.totalTokens.input + root.totalTokens.cacheCreation + root.totalTokens.cacheRead;
607
+ root.totalTokens.cacheHitRate = totalInput > 0 ? root.totalTokens.cacheRead / totalInput : 0;
608
+ // Aggregate models
609
+ root.models = this.aggregateModels(root.projects.flatMap(p => p.models));
610
+ // Aggregate tools
611
+ root.tools = this.aggregateTools(root.projects.flatMap(p => p.tools));
612
+ // Aggregate languages
613
+ root.languages = this.aggregateLanguages(root.projects.flatMap(p => p.languages));
614
+ // Aggregate formats
615
+ root.formats = this.aggregateLanguages(root.projects.flatMap(p => p.formats));
616
+ }
617
+ /**
618
+ * Aggregate model statistics
619
+ */
620
+ static aggregateModels(models) {
621
+ const modelCounts = new Map();
622
+ for (const model of models) {
623
+ modelCounts.set(model.model, (modelCounts.get(model.model) || 0) + model.calls);
624
+ }
625
+ const totalCalls = Array.from(modelCounts.values()).reduce((sum, count) => sum + count, 0);
626
+ return Array.from(modelCounts.entries())
627
+ .map(([model, calls]) => ({
628
+ model,
629
+ calls,
630
+ percentage: totalCalls > 0 ? (calls / totalCalls) * 100 : 0
631
+ }))
632
+ .sort((a, b) => b.calls - a.calls);
633
+ }
634
+ /**
635
+ * Aggregate tool statistics
636
+ */
637
+ static aggregateTools(tools) {
638
+ const toolCounts = new Map();
639
+ for (const tool of tools) {
640
+ if (!toolCounts.has(tool.toolName)) {
641
+ toolCounts.set(tool.toolName, { success: 0, failure: 0 });
642
+ }
643
+ const counts = toolCounts.get(tool.toolName);
644
+ counts.success += tool.successCount;
645
+ counts.failure += tool.failureCount;
646
+ }
647
+ return Array.from(toolCounts.entries())
648
+ .map(([toolName, counts]) => {
649
+ const total = counts.success + counts.failure;
650
+ return {
651
+ toolName,
652
+ totalCalls: total,
653
+ successCount: counts.success,
654
+ failureCount: counts.failure,
655
+ successRate: total > 0 ? (counts.success / total) * 100 : 0
656
+ };
657
+ })
658
+ .sort((a, b) => b.totalCalls - a.totalCalls);
659
+ }
660
+ /**
661
+ * Aggregate language/format statistics
662
+ */
663
+ static aggregateLanguages(languages) {
664
+ const langCounts = new Map();
665
+ for (const lang of languages) {
666
+ if (!langCounts.has(lang.language)) {
667
+ langCounts.set(lang.language, { created: 0, modified: 0, lines: 0, tokens: 0 });
668
+ }
669
+ const counts = langCounts.get(lang.language);
670
+ counts.created += lang.filesCreated;
671
+ counts.modified += lang.filesModified;
672
+ counts.lines += lang.linesAdded;
673
+ counts.tokens += lang.tokens;
674
+ }
675
+ const totalLines = Array.from(langCounts.values()).reduce((sum, c) => sum + c.lines, 0) || 1;
676
+ return Array.from(langCounts.entries())
677
+ .map(([language, counts]) => ({
678
+ language,
679
+ filesCreated: counts.created,
680
+ filesModified: counts.modified,
681
+ linesAdded: counts.lines,
682
+ linesRemoved: 0,
683
+ tokens: counts.tokens,
684
+ percentage: totalLines > 0 ? (counts.lines / totalLines) * 100 : 0
685
+ }))
686
+ .sort((a, b) => b.linesAdded - a.linesAdded);
687
+ }
688
+ /**
689
+ * Create empty token breakdown
690
+ */
691
+ static emptyTokenBreakdown() {
692
+ return {
693
+ input: 0,
694
+ output: 0,
695
+ cacheRead: 0,
696
+ cacheCreation: 0,
697
+ total: 0,
698
+ cacheHitRate: 0
699
+ };
700
+ }
701
+ }
702
+ //# sourceMappingURL=aggregator.js.map