@codemieai/code 0.0.15 → 0.0.17

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 (608) hide show
  1. package/README.md +86 -14
  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 +5 -34
  9. package/dist/agents/codemie-code/agent.js.map +1 -1
  10. package/dist/agents/codemie-code/config.d.ts.map +1 -1
  11. package/dist/agents/codemie-code/config.js +12 -4
  12. package/dist/agents/codemie-code/config.js.map +1 -1
  13. package/dist/agents/codemie-code/tools/planning.d.ts +1 -1
  14. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  15. package/dist/agents/core/AgentCLI.js +30 -63
  16. package/dist/agents/core/AgentCLI.js.map +1 -1
  17. package/dist/agents/core/BaseAgentAdapter.d.ts +10 -6
  18. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  19. package/dist/agents/core/BaseAgentAdapter.js +108 -36
  20. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  21. package/dist/agents/core/BaseMetricsAdapter.d.ts +64 -0
  22. package/dist/agents/core/BaseMetricsAdapter.d.ts.map +1 -0
  23. package/dist/agents/core/BaseMetricsAdapter.js +74 -0
  24. package/dist/agents/core/BaseMetricsAdapter.js.map +1 -0
  25. package/dist/agents/core/types.d.ts +1 -0
  26. package/dist/agents/core/types.d.ts.map +1 -1
  27. package/dist/agents/plugins/claude.metrics.d.ts +112 -0
  28. package/dist/agents/plugins/claude.metrics.d.ts.map +1 -0
  29. package/dist/agents/plugins/claude.metrics.js +700 -0
  30. package/dist/agents/plugins/claude.metrics.js.map +1 -0
  31. package/dist/agents/plugins/claude.plugin.d.ts +9 -0
  32. package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
  33. package/dist/agents/plugins/claude.plugin.js +52 -10
  34. package/dist/agents/plugins/claude.plugin.js.map +1 -1
  35. package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
  36. package/dist/agents/plugins/codemie-code.plugin.js +46 -14
  37. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  38. package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
  39. package/dist/agents/plugins/codex.plugin.js +2 -4
  40. package/dist/agents/plugins/codex.plugin.js.map +1 -1
  41. package/dist/agents/plugins/deepagents.plugin.js +1 -1
  42. package/dist/agents/plugins/deepagents.plugin.js.map +1 -1
  43. package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
  44. package/dist/agents/plugins/gemini.plugin.js +1 -8
  45. package/dist/agents/plugins/gemini.plugin.js.map +1 -1
  46. package/dist/agents/plugins/history-parser.d.ts +52 -0
  47. package/dist/agents/plugins/history-parser.d.ts.map +1 -0
  48. package/dist/agents/plugins/history-parser.js +155 -0
  49. package/dist/agents/plugins/history-parser.js.map +1 -0
  50. package/dist/cli/commands/analytics/aggregator.d.ts +58 -0
  51. package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -0
  52. package/dist/cli/commands/analytics/aggregator.js +702 -0
  53. package/dist/cli/commands/analytics/aggregator.js.map +1 -0
  54. package/dist/cli/commands/analytics/data-loader.d.ts +84 -0
  55. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -0
  56. package/dist/cli/commands/analytics/data-loader.js +211 -0
  57. package/dist/cli/commands/analytics/data-loader.js.map +1 -0
  58. package/dist/cli/commands/analytics/exporter.d.ts +20 -0
  59. package/dist/cli/commands/analytics/exporter.d.ts.map +1 -0
  60. package/dist/cli/commands/analytics/exporter.js +103 -0
  61. package/dist/cli/commands/analytics/exporter.js.map +1 -0
  62. package/dist/cli/commands/analytics/formatter.d.ts +49 -0
  63. package/dist/cli/commands/analytics/formatter.d.ts.map +1 -0
  64. package/dist/cli/commands/analytics/formatter.js +309 -0
  65. package/dist/cli/commands/analytics/formatter.js.map +1 -0
  66. package/dist/cli/commands/analytics/index.d.ts +6 -0
  67. package/dist/cli/commands/analytics/index.d.ts.map +1 -0
  68. package/dist/cli/commands/analytics/index.js +157 -0
  69. package/dist/cli/commands/analytics/index.js.map +1 -0
  70. package/dist/cli/commands/analytics/model-normalizer.d.ts +21 -0
  71. package/dist/cli/commands/analytics/model-normalizer.d.ts.map +1 -0
  72. package/dist/cli/commands/analytics/model-normalizer.js +44 -0
  73. package/dist/cli/commands/analytics/model-normalizer.js.map +1 -0
  74. package/dist/cli/commands/analytics/types.d.ts +188 -0
  75. package/dist/cli/commands/analytics/types.d.ts.map +1 -0
  76. package/dist/cli/commands/analytics/types.js +6 -0
  77. package/dist/cli/commands/analytics/types.js.map +1 -0
  78. package/dist/cli/commands/auth.d.ts.map +1 -1
  79. package/dist/cli/commands/auth.js +10 -5
  80. package/dist/cli/commands/auth.js.map +1 -1
  81. package/dist/cli/commands/doctor/checks/AIConfigCheck.d.ts.map +1 -1
  82. package/dist/cli/commands/doctor/checks/AIConfigCheck.js +12 -5
  83. package/dist/cli/commands/doctor/checks/AIConfigCheck.js.map +1 -1
  84. package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts +9 -0
  85. package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts.map +1 -0
  86. package/dist/cli/commands/doctor/checks/AwsCliCheck.js +28 -0
  87. package/dist/cli/commands/doctor/checks/AwsCliCheck.js.map +1 -0
  88. package/dist/cli/commands/doctor/checks/PythonCheck.d.ts.map +1 -1
  89. package/dist/cli/commands/doctor/checks/PythonCheck.js +10 -0
  90. package/dist/cli/commands/doctor/checks/PythonCheck.js.map +1 -1
  91. package/dist/cli/commands/doctor/checks/WorkflowsCheck.d.ts.map +1 -1
  92. package/dist/cli/commands/doctor/checks/WorkflowsCheck.js +2 -1
  93. package/dist/cli/commands/doctor/checks/WorkflowsCheck.js.map +1 -1
  94. package/dist/cli/commands/doctor/checks/index.d.ts +1 -0
  95. package/dist/cli/commands/doctor/checks/index.d.ts.map +1 -1
  96. package/dist/cli/commands/doctor/checks/index.js +1 -0
  97. package/dist/cli/commands/doctor/checks/index.js.map +1 -1
  98. package/dist/cli/commands/doctor/formatter.d.ts +1 -1
  99. package/dist/cli/commands/doctor/formatter.d.ts.map +1 -1
  100. package/dist/cli/commands/doctor/formatter.js +1 -6
  101. package/dist/cli/commands/doctor/formatter.js.map +1 -1
  102. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  103. package/dist/cli/commands/doctor/index.js +107 -10
  104. package/dist/cli/commands/doctor/index.js.map +1 -1
  105. package/dist/cli/commands/doctor/type-adapters.d.ts +18 -0
  106. package/dist/cli/commands/doctor/type-adapters.d.ts.map +1 -0
  107. package/dist/cli/commands/doctor/type-adapters.js +75 -0
  108. package/dist/cli/commands/doctor/type-adapters.js.map +1 -0
  109. package/dist/cli/commands/install.d.ts.map +1 -1
  110. package/dist/cli/commands/install.js +1 -6
  111. package/dist/cli/commands/install.js.map +1 -1
  112. package/dist/cli/commands/list.d.ts.map +1 -1
  113. package/dist/cli/commands/list.js +0 -5
  114. package/dist/cli/commands/list.js.map +1 -1
  115. package/dist/cli/commands/profile.d.ts.map +1 -1
  116. package/dist/cli/commands/profile.js +130 -92
  117. package/dist/cli/commands/profile.js.map +1 -1
  118. package/dist/cli/commands/setup.d.ts.map +1 -1
  119. package/dist/cli/commands/setup.js +147 -668
  120. package/dist/cli/commands/setup.js.map +1 -1
  121. package/dist/cli/index.d.ts +1 -1
  122. package/dist/cli/index.d.ts.map +1 -1
  123. package/dist/cli/index.js +5 -2
  124. package/dist/cli/index.js.map +1 -1
  125. package/dist/env/types.d.ts +14 -2
  126. package/dist/env/types.d.ts.map +1 -1
  127. package/dist/env/types.js.map +1 -1
  128. package/dist/metrics/MetricsOrchestrator.d.ts +67 -0
  129. package/dist/metrics/MetricsOrchestrator.d.ts.map +1 -0
  130. package/dist/metrics/MetricsOrchestrator.js +287 -0
  131. package/dist/metrics/MetricsOrchestrator.js.map +1 -0
  132. package/dist/metrics/config.d.ts +38 -0
  133. package/dist/metrics/config.d.ts.map +1 -0
  134. package/dist/metrics/config.js +80 -0
  135. package/dist/metrics/config.js.map +1 -0
  136. package/dist/metrics/core/DeltaWriter.d.ts +49 -0
  137. package/dist/metrics/core/DeltaWriter.d.ts.map +1 -0
  138. package/dist/metrics/core/DeltaWriter.js +146 -0
  139. package/dist/metrics/core/DeltaWriter.js.map +1 -0
  140. package/dist/metrics/core/FileSnapshotter.d.ts +22 -0
  141. package/dist/metrics/core/FileSnapshotter.d.ts.map +1 -0
  142. package/dist/metrics/core/FileSnapshotter.js +74 -0
  143. package/dist/metrics/core/FileSnapshotter.js.map +1 -0
  144. package/dist/metrics/core/SessionCorrelator.d.ts +34 -0
  145. package/dist/metrics/core/SessionCorrelator.d.ts.map +1 -0
  146. package/dist/metrics/core/SessionCorrelator.js +115 -0
  147. package/dist/metrics/core/SessionCorrelator.js.map +1 -0
  148. package/dist/metrics/core/SyncStateManager.d.ts +69 -0
  149. package/dist/metrics/core/SyncStateManager.d.ts.map +1 -0
  150. package/dist/metrics/core/SyncStateManager.js +284 -0
  151. package/dist/metrics/core/SyncStateManager.js.map +1 -0
  152. package/dist/metrics/index.d.ts +9 -0
  153. package/dist/metrics/index.d.ts.map +1 -0
  154. package/dist/metrics/index.js +11 -0
  155. package/dist/metrics/index.js.map +1 -0
  156. package/dist/metrics/session/SessionStore.d.ts +43 -0
  157. package/dist/metrics/session/SessionStore.d.ts.map +1 -0
  158. package/dist/metrics/session/SessionStore.js +142 -0
  159. package/dist/metrics/session/SessionStore.js.map +1 -0
  160. package/dist/metrics/sync/MetricsApiClient.d.ts +32 -0
  161. package/dist/metrics/sync/MetricsApiClient.d.ts.map +1 -0
  162. package/dist/metrics/sync/MetricsApiClient.js +155 -0
  163. package/dist/metrics/sync/MetricsApiClient.js.map +1 -0
  164. package/dist/metrics/sync/aggregator.d.ts +13 -0
  165. package/dist/metrics/sync/aggregator.d.ts.map +1 -0
  166. package/dist/metrics/sync/aggregator.js +196 -0
  167. package/dist/metrics/sync/aggregator.js.map +1 -0
  168. package/dist/metrics/sync/index.d.ts +10 -0
  169. package/dist/metrics/sync/index.d.ts.map +1 -0
  170. package/dist/metrics/sync/index.js +10 -0
  171. package/dist/metrics/sync/index.js.map +1 -0
  172. package/dist/metrics/sync/jsonl-writer.d.ts +28 -0
  173. package/dist/metrics/sync/jsonl-writer.d.ts.map +1 -0
  174. package/dist/metrics/sync/jsonl-writer.js +72 -0
  175. package/dist/metrics/sync/jsonl-writer.js.map +1 -0
  176. package/dist/metrics/sync/types.d.ts +72 -0
  177. package/dist/metrics/sync/types.d.ts.map +1 -0
  178. package/dist/metrics/sync/types.js +7 -0
  179. package/dist/metrics/sync/types.js.map +1 -0
  180. package/dist/metrics/types.d.ts +308 -0
  181. package/dist/metrics/types.d.ts.map +1 -0
  182. package/dist/metrics/types.js +8 -0
  183. package/dist/metrics/types.js.map +1 -0
  184. package/dist/providers/core/base/BaseHealthCheck.d.ts +57 -0
  185. package/dist/providers/core/base/BaseHealthCheck.d.ts.map +1 -0
  186. package/dist/providers/core/base/BaseHealthCheck.js +121 -0
  187. package/dist/providers/core/base/BaseHealthCheck.js.map +1 -0
  188. package/dist/providers/core/base/BaseModelProxy.d.ts +45 -0
  189. package/dist/providers/core/base/BaseModelProxy.d.ts.map +1 -0
  190. package/dist/providers/core/base/BaseModelProxy.js +43 -0
  191. package/dist/providers/core/base/BaseModelProxy.js.map +1 -0
  192. package/dist/providers/core/base/http-client.d.ts +57 -0
  193. package/dist/providers/core/base/http-client.d.ts.map +1 -0
  194. package/dist/providers/core/base/http-client.js +240 -0
  195. package/dist/providers/core/base/http-client.js.map +1 -0
  196. package/dist/providers/core/decorators.d.ts +13 -0
  197. package/dist/providers/core/decorators.d.ts.map +1 -0
  198. package/dist/providers/core/decorators.js +15 -0
  199. package/dist/providers/core/decorators.js.map +1 -0
  200. package/dist/providers/core/index.d.ts +13 -0
  201. package/dist/providers/core/index.d.ts.map +1 -0
  202. package/dist/providers/core/index.js +14 -0
  203. package/dist/providers/core/index.js.map +1 -0
  204. package/dist/providers/core/registry.d.ts +66 -0
  205. package/dist/providers/core/registry.d.ts.map +1 -0
  206. package/dist/providers/core/registry.js +105 -0
  207. package/dist/providers/core/registry.js.map +1 -0
  208. package/dist/providers/core/types.d.ts +285 -0
  209. package/dist/providers/core/types.d.ts.map +1 -0
  210. package/dist/providers/core/types.js +7 -0
  211. package/dist/providers/core/types.js.map +1 -0
  212. package/dist/providers/index.d.ts +22 -0
  213. package/dist/providers/index.d.ts.map +1 -0
  214. package/dist/providers/index.js +24 -0
  215. package/dist/providers/index.js.map +1 -0
  216. package/dist/providers/integration/setup-ui.d.ts +76 -0
  217. package/dist/providers/integration/setup-ui.d.ts.map +1 -0
  218. package/dist/providers/integration/setup-ui.js +186 -0
  219. package/dist/providers/integration/setup-ui.js.map +1 -0
  220. package/dist/providers/plugins/bedrock/bedrock.health.d.ts +53 -0
  221. package/dist/providers/plugins/bedrock/bedrock.health.d.ts.map +1 -0
  222. package/dist/providers/plugins/bedrock/bedrock.health.js +115 -0
  223. package/dist/providers/plugins/bedrock/bedrock.health.js.map +1 -0
  224. package/dist/providers/plugins/bedrock/bedrock.models.d.ts +26 -0
  225. package/dist/providers/plugins/bedrock/bedrock.models.d.ts.map +1 -0
  226. package/dist/providers/plugins/bedrock/bedrock.models.js +89 -0
  227. package/dist/providers/plugins/bedrock/bedrock.models.js.map +1 -0
  228. package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts +12 -0
  229. package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts.map +1 -0
  230. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js +308 -0
  231. package/dist/providers/plugins/bedrock/bedrock.setup-steps.js.map +1 -0
  232. package/dist/providers/plugins/bedrock/bedrock.template.d.ts +11 -0
  233. package/dist/providers/plugins/bedrock/bedrock.template.d.ts.map +1 -0
  234. package/dist/providers/plugins/bedrock/bedrock.template.js +85 -0
  235. package/dist/providers/plugins/bedrock/bedrock.template.js.map +1 -0
  236. package/dist/providers/plugins/bedrock/index.d.ts +11 -0
  237. package/dist/providers/plugins/bedrock/index.d.ts.map +1 -0
  238. package/dist/providers/plugins/bedrock/index.js +11 -0
  239. package/dist/providers/plugins/bedrock/index.js.map +1 -0
  240. package/dist/providers/plugins/litellm/index.d.ts +8 -0
  241. package/dist/providers/plugins/litellm/index.d.ts.map +1 -0
  242. package/dist/providers/plugins/litellm/index.js +12 -0
  243. package/dist/providers/plugins/litellm/index.js.map +1 -0
  244. package/dist/providers/plugins/litellm/litellm.models.d.ts +27 -0
  245. package/dist/providers/plugins/litellm/litellm.models.d.ts.map +1 -0
  246. package/dist/providers/plugins/litellm/litellm.models.js +48 -0
  247. package/dist/providers/plugins/litellm/litellm.models.js.map +1 -0
  248. package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts +8 -0
  249. package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -0
  250. package/dist/providers/plugins/litellm/litellm.setup-steps.js +52 -0
  251. package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -0
  252. package/dist/providers/plugins/litellm/litellm.template.d.ts +11 -0
  253. package/dist/providers/plugins/litellm/litellm.template.d.ts.map +1 -0
  254. package/dist/providers/plugins/litellm/litellm.template.js +59 -0
  255. package/dist/providers/plugins/litellm/litellm.template.js.map +1 -0
  256. package/dist/providers/plugins/ollama/index.d.ts +11 -0
  257. package/dist/providers/plugins/ollama/index.d.ts.map +1 -0
  258. package/dist/providers/plugins/ollama/index.js +11 -0
  259. package/dist/providers/plugins/ollama/index.js.map +1 -0
  260. package/dist/providers/plugins/ollama/ollama.health.d.ts +48 -0
  261. package/dist/providers/plugins/ollama/ollama.health.d.ts.map +1 -0
  262. package/dist/providers/plugins/ollama/ollama.health.js +87 -0
  263. package/dist/providers/plugins/ollama/ollama.health.js.map +1 -0
  264. package/dist/providers/plugins/ollama/ollama.models.d.ts +47 -0
  265. package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -0
  266. package/dist/providers/plugins/ollama/ollama.models.js +252 -0
  267. package/dist/providers/plugins/ollama/ollama.models.js.map +1 -0
  268. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts +16 -0
  269. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -0
  270. package/dist/providers/plugins/ollama/ollama.setup-steps.js +164 -0
  271. package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -0
  272. package/dist/providers/plugins/ollama/ollama.template.d.ts +11 -0
  273. package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -0
  274. package/dist/providers/plugins/ollama/ollama.template.js +89 -0
  275. package/dist/providers/plugins/ollama/ollama.template.js.map +1 -0
  276. package/dist/providers/plugins/sso/index.d.ts +12 -0
  277. package/dist/providers/plugins/sso/index.d.ts.map +1 -0
  278. package/dist/providers/plugins/sso/index.js +12 -0
  279. package/dist/providers/plugins/sso/index.js.map +1 -0
  280. package/dist/providers/plugins/sso/sso.auth.d.ts +50 -0
  281. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -0
  282. package/dist/{utils/sso-auth.js → providers/plugins/sso/sso.auth.js} +37 -2
  283. package/dist/providers/plugins/sso/sso.auth.js.map +1 -0
  284. package/dist/providers/plugins/sso/sso.health.d.ts +44 -0
  285. package/dist/providers/plugins/sso/sso.health.d.ts.map +1 -0
  286. package/dist/providers/plugins/sso/sso.health.js +178 -0
  287. package/dist/providers/plugins/sso/sso.health.js.map +1 -0
  288. package/dist/providers/plugins/sso/sso.http-client.d.ts +24 -0
  289. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -0
  290. package/dist/providers/plugins/sso/sso.http-client.js +193 -0
  291. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -0
  292. package/dist/providers/plugins/sso/sso.models.d.ts +48 -0
  293. package/dist/providers/plugins/sso/sso.models.d.ts.map +1 -0
  294. package/dist/providers/plugins/sso/sso.models.js +139 -0
  295. package/dist/providers/plugins/sso/sso.models.js.map +1 -0
  296. package/dist/providers/plugins/sso/sso.setup-steps.d.ts +16 -0
  297. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -0
  298. package/dist/providers/plugins/sso/sso.setup-steps.js +145 -0
  299. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -0
  300. package/dist/providers/plugins/sso/sso.template.d.ts +11 -0
  301. package/dist/providers/plugins/sso/sso.template.d.ts.map +1 -0
  302. package/dist/providers/plugins/sso/sso.template.js +35 -0
  303. package/dist/providers/plugins/sso/sso.template.js.map +1 -0
  304. package/dist/proxy/errors.d.ts.map +1 -0
  305. package/dist/proxy/errors.js.map +1 -0
  306. package/dist/proxy/http-client.d.ts.map +1 -0
  307. package/dist/{utils/proxy → proxy}/http-client.js +50 -15
  308. package/dist/proxy/http-client.js.map +1 -0
  309. package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts +19 -0
  310. package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts.map +1 -0
  311. package/dist/proxy/plugins/endpoint-blocker.plugin.js +61 -0
  312. package/dist/proxy/plugins/endpoint-blocker.plugin.js.map +1 -0
  313. package/dist/proxy/plugins/header-injection.plugin.d.ts.map +1 -0
  314. package/dist/{utils/proxy → proxy}/plugins/header-injection.plugin.js +10 -3
  315. package/dist/proxy/plugins/header-injection.plugin.js.map +1 -0
  316. package/dist/{utils/proxy → proxy}/plugins/index.d.ts +4 -2
  317. package/dist/proxy/plugins/index.d.ts.map +1 -0
  318. package/dist/{utils/proxy → proxy}/plugins/index.js +7 -5
  319. package/dist/proxy/plugins/index.js.map +1 -0
  320. package/dist/proxy/plugins/logging.plugin.d.ts +22 -0
  321. package/dist/proxy/plugins/logging.plugin.d.ts.map +1 -0
  322. package/dist/proxy/plugins/logging.plugin.js +156 -0
  323. package/dist/proxy/plugins/logging.plugin.js.map +1 -0
  324. package/dist/proxy/plugins/metrics-sync.plugin.d.ts +33 -0
  325. package/dist/proxy/plugins/metrics-sync.plugin.d.ts.map +1 -0
  326. package/dist/proxy/plugins/metrics-sync.plugin.js +310 -0
  327. package/dist/proxy/plugins/metrics-sync.plugin.js.map +1 -0
  328. package/dist/proxy/plugins/registry.d.ts.map +1 -0
  329. package/dist/{utils/proxy → proxy}/plugins/registry.js +9 -2
  330. package/dist/proxy/plugins/registry.js.map +1 -0
  331. package/dist/proxy/plugins/sso-auth.plugin.d.ts.map +1 -0
  332. package/dist/{utils/proxy → proxy}/plugins/sso-auth.plugin.js +1 -1
  333. package/dist/proxy/plugins/sso-auth.plugin.js.map +1 -0
  334. package/dist/{utils/proxy → proxy}/plugins/types.d.ts +8 -4
  335. package/dist/proxy/plugins/types.d.ts.map +1 -0
  336. package/dist/proxy/plugins/types.js.map +1 -0
  337. package/dist/{utils/proxy → proxy}/types.d.ts +7 -0
  338. package/dist/proxy/types.d.ts.map +1 -0
  339. package/dist/proxy/types.js.map +1 -0
  340. package/dist/utils/ascii-logo.d.ts +21 -0
  341. package/dist/utils/ascii-logo.d.ts.map +1 -0
  342. package/dist/utils/ascii-logo.js +75 -0
  343. package/dist/utils/ascii-logo.js.map +1 -0
  344. package/dist/utils/codemie-proxy.d.ts +2 -7
  345. package/dist/utils/codemie-proxy.d.ts.map +1 -1
  346. package/dist/utils/codemie-proxy.js +56 -61
  347. package/dist/utils/codemie-proxy.js.map +1 -1
  348. package/dist/utils/config-loader.d.ts +1 -6
  349. package/dist/utils/config-loader.d.ts.map +1 -1
  350. package/dist/utils/config-loader.js +49 -93
  351. package/dist/utils/config-loader.js.map +1 -1
  352. package/dist/utils/credential-store.d.ts +1 -1
  353. package/dist/utils/credential-store.d.ts.map +1 -1
  354. package/dist/utils/exec.d.ts +11 -0
  355. package/dist/utils/exec.d.ts.map +1 -1
  356. package/dist/utils/exec.js +17 -1
  357. package/dist/utils/exec.js.map +1 -1
  358. package/dist/utils/goodbye-messages.d.ts +13 -0
  359. package/dist/utils/goodbye-messages.d.ts.map +1 -0
  360. package/dist/utils/goodbye-messages.js +245 -0
  361. package/dist/utils/goodbye-messages.js.map +1 -0
  362. package/dist/utils/json-parser.d.ts +52 -0
  363. package/dist/utils/json-parser.d.ts.map +1 -0
  364. package/dist/utils/json-parser.js +126 -0
  365. package/dist/utils/json-parser.js.map +1 -0
  366. package/dist/utils/logger.d.ts +37 -1
  367. package/dist/utils/logger.d.ts.map +1 -1
  368. package/dist/utils/logger.js +92 -22
  369. package/dist/utils/logger.js.map +1 -1
  370. package/dist/utils/sanitize.d.ts.map +1 -1
  371. package/dist/utils/sanitize.js +0 -1
  372. package/dist/utils/sanitize.js.map +1 -1
  373. package/dist/utils/which.d.ts +20 -0
  374. package/dist/utils/which.d.ts.map +1 -0
  375. package/dist/utils/which.js +47 -0
  376. package/dist/utils/which.js.map +1 -0
  377. package/package.json +10 -5
  378. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +0 -37
  379. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +0 -1
  380. package/dist/analytics/aggregation/adapters/claude.adapter.js +0 -531
  381. package/dist/analytics/aggregation/adapters/claude.adapter.js.map +0 -1
  382. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +0 -25
  383. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +0 -1
  384. package/dist/analytics/aggregation/adapters/codex.adapter.js +0 -396
  385. package/dist/analytics/aggregation/adapters/codex.adapter.js.map +0 -1
  386. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +0 -36
  387. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +0 -1
  388. package/dist/analytics/aggregation/adapters/gemini.adapter.js +0 -365
  389. package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +0 -1
  390. package/dist/analytics/aggregation/adapters/index.d.ts +0 -7
  391. package/dist/analytics/aggregation/adapters/index.d.ts.map +0 -1
  392. package/dist/analytics/aggregation/adapters/index.js +0 -7
  393. package/dist/analytics/aggregation/adapters/index.js.map +0 -1
  394. package/dist/analytics/aggregation/aggregator.d.ts +0 -49
  395. package/dist/analytics/aggregation/aggregator.d.ts.map +0 -1
  396. package/dist/analytics/aggregation/aggregator.js +0 -239
  397. package/dist/analytics/aggregation/aggregator.js.map +0 -1
  398. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +0 -99
  399. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +0 -1
  400. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +0 -110
  401. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +0 -1
  402. package/dist/analytics/aggregation/core/adapter.interface.d.ts +0 -76
  403. package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +0 -1
  404. package/dist/analytics/aggregation/core/adapter.interface.js +0 -9
  405. package/dist/analytics/aggregation/core/adapter.interface.js.map +0 -1
  406. package/dist/analytics/aggregation/core/aggregation-utils.d.ts +0 -86
  407. package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +0 -1
  408. package/dist/analytics/aggregation/core/aggregation-utils.js +0 -126
  409. package/dist/analytics/aggregation/core/aggregation-utils.js.map +0 -1
  410. package/dist/analytics/aggregation/core/discovery.d.ts +0 -40
  411. package/dist/analytics/aggregation/core/discovery.d.ts.map +0 -1
  412. package/dist/analytics/aggregation/core/discovery.js +0 -132
  413. package/dist/analytics/aggregation/core/discovery.js.map +0 -1
  414. package/dist/analytics/aggregation/core/file-utils.d.ts +0 -24
  415. package/dist/analytics/aggregation/core/file-utils.d.ts.map +0 -1
  416. package/dist/analytics/aggregation/core/file-utils.js +0 -143
  417. package/dist/analytics/aggregation/core/file-utils.js.map +0 -1
  418. package/dist/analytics/aggregation/core/index.d.ts +0 -14
  419. package/dist/analytics/aggregation/core/index.d.ts.map +0 -1
  420. package/dist/analytics/aggregation/core/index.js +0 -14
  421. package/dist/analytics/aggregation/core/index.js.map +0 -1
  422. package/dist/analytics/aggregation/core/project-mapping.d.ts +0 -50
  423. package/dist/analytics/aggregation/core/project-mapping.d.ts.map +0 -1
  424. package/dist/analytics/aggregation/core/project-mapping.js +0 -102
  425. package/dist/analytics/aggregation/core/project-mapping.js.map +0 -1
  426. package/dist/analytics/aggregation/core/streaming.d.ts +0 -26
  427. package/dist/analytics/aggregation/core/streaming.d.ts.map +0 -1
  428. package/dist/analytics/aggregation/core/streaming.js +0 -58
  429. package/dist/analytics/aggregation/core/streaming.js.map +0 -1
  430. package/dist/analytics/aggregation/core/user-prompt-source.d.ts +0 -81
  431. package/dist/analytics/aggregation/core/user-prompt-source.d.ts.map +0 -1
  432. package/dist/analytics/aggregation/core/user-prompt-source.js +0 -69
  433. package/dist/analytics/aggregation/core/user-prompt-source.js.map +0 -1
  434. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts +0 -49
  435. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts.map +0 -1
  436. package/dist/analytics/aggregation/core/user-prompt-sources/json.js +0 -66
  437. package/dist/analytics/aggregation/core/user-prompt-sources/json.js.map +0 -1
  438. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts +0 -43
  439. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts.map +0 -1
  440. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js +0 -56
  441. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js.map +0 -1
  442. package/dist/analytics/aggregation/index.d.ts +0 -8
  443. package/dist/analytics/aggregation/index.d.ts.map +0 -1
  444. package/dist/analytics/aggregation/index.js +0 -8
  445. package/dist/analytics/aggregation/index.js.map +0 -1
  446. package/dist/analytics/aggregation/types.d.ts +0 -278
  447. package/dist/analytics/aggregation/types.d.ts.map +0 -1
  448. package/dist/analytics/aggregation/types.js +0 -8
  449. package/dist/analytics/aggregation/types.js.map +0 -1
  450. package/dist/analytics/collector.d.ts +0 -46
  451. package/dist/analytics/collector.d.ts.map +0 -1
  452. package/dist/analytics/collector.js +0 -83
  453. package/dist/analytics/collector.js.map +0 -1
  454. package/dist/analytics/config.d.ts +0 -15
  455. package/dist/analytics/config.d.ts.map +0 -1
  456. package/dist/analytics/config.js +0 -65
  457. package/dist/analytics/config.js.map +0 -1
  458. package/dist/analytics/index.d.ts +0 -99
  459. package/dist/analytics/index.d.ts.map +0 -1
  460. package/dist/analytics/index.js +0 -288
  461. package/dist/analytics/index.js.map +0 -1
  462. package/dist/analytics/plugins/api-metrics.plugin.d.ts +0 -26
  463. package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +0 -1
  464. package/dist/analytics/plugins/api-metrics.plugin.js +0 -97
  465. package/dist/analytics/plugins/api-metrics.plugin.js.map +0 -1
  466. package/dist/analytics/plugins/index.d.ts +0 -15
  467. package/dist/analytics/plugins/index.d.ts.map +0 -1
  468. package/dist/analytics/plugins/index.js +0 -15
  469. package/dist/analytics/plugins/index.js.map +0 -1
  470. package/dist/analytics/plugins/model-metrics.plugin.d.ts +0 -39
  471. package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +0 -1
  472. package/dist/analytics/plugins/model-metrics.plugin.js +0 -105
  473. package/dist/analytics/plugins/model-metrics.plugin.js.map +0 -1
  474. package/dist/analytics/plugins/provider-metrics.plugin.d.ts +0 -41
  475. package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +0 -1
  476. package/dist/analytics/plugins/provider-metrics.plugin.js +0 -123
  477. package/dist/analytics/plugins/provider-metrics.plugin.js.map +0 -1
  478. package/dist/analytics/plugins/types.d.ts +0 -61
  479. package/dist/analytics/plugins/types.d.ts.map +0 -1
  480. package/dist/analytics/plugins/types.js +0 -54
  481. package/dist/analytics/plugins/types.js.map +0 -1
  482. package/dist/analytics/privacy.d.ts +0 -10
  483. package/dist/analytics/privacy.d.ts.map +0 -1
  484. package/dist/analytics/privacy.js +0 -20
  485. package/dist/analytics/privacy.js.map +0 -1
  486. package/dist/analytics/remote-submission/cursor-manager.d.ts +0 -71
  487. package/dist/analytics/remote-submission/cursor-manager.d.ts.map +0 -1
  488. package/dist/analytics/remote-submission/cursor-manager.js +0 -204
  489. package/dist/analytics/remote-submission/cursor-manager.js.map +0 -1
  490. package/dist/analytics/remote-submission/index.d.ts +0 -12
  491. package/dist/analytics/remote-submission/index.d.ts.map +0 -1
  492. package/dist/analytics/remote-submission/index.js +0 -11
  493. package/dist/analytics/remote-submission/index.js.map +0 -1
  494. package/dist/analytics/remote-submission/lock-manager.d.ts +0 -71
  495. package/dist/analytics/remote-submission/lock-manager.d.ts.map +0 -1
  496. package/dist/analytics/remote-submission/lock-manager.js +0 -238
  497. package/dist/analytics/remote-submission/lock-manager.js.map +0 -1
  498. package/dist/analytics/remote-submission/metric-transformer.d.ts +0 -49
  499. package/dist/analytics/remote-submission/metric-transformer.d.ts.map +0 -1
  500. package/dist/analytics/remote-submission/metric-transformer.js +0 -175
  501. package/dist/analytics/remote-submission/metric-transformer.js.map +0 -1
  502. package/dist/analytics/remote-submission/submitter.d.ts +0 -78
  503. package/dist/analytics/remote-submission/submitter.d.ts.map +0 -1
  504. package/dist/analytics/remote-submission/submitter.js +0 -381
  505. package/dist/analytics/remote-submission/submitter.js.map +0 -1
  506. package/dist/analytics/remote-submission/types.d.ts +0 -169
  507. package/dist/analytics/remote-submission/types.d.ts.map +0 -1
  508. package/dist/analytics/remote-submission/types.js +0 -13
  509. package/dist/analytics/remote-submission/types.js.map +0 -1
  510. package/dist/analytics/session.d.ts +0 -56
  511. package/dist/analytics/session.d.ts.map +0 -1
  512. package/dist/analytics/session.js +0 -95
  513. package/dist/analytics/session.js.map +0 -1
  514. package/dist/analytics/types.d.ts +0 -104
  515. package/dist/analytics/types.d.ts.map +0 -1
  516. package/dist/analytics/types.js +0 -15
  517. package/dist/analytics/types.js.map +0 -1
  518. package/dist/analytics/writer.d.ts +0 -18
  519. package/dist/analytics/writer.d.ts.map +0 -1
  520. package/dist/analytics/writer.js +0 -44
  521. package/dist/analytics/writer.js.map +0 -1
  522. package/dist/cli/commands/analytics.d.ts +0 -3
  523. package/dist/cli/commands/analytics.d.ts.map +0 -1
  524. package/dist/cli/commands/analytics.js +0 -748
  525. package/dist/cli/commands/analytics.js.map +0 -1
  526. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.d.ts +0 -11
  527. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.d.ts.map +0 -1
  528. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js +0 -264
  529. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js.map +0 -1
  530. package/dist/cli/commands/doctor/providers/BaseProviderCheck.d.ts +0 -12
  531. package/dist/cli/commands/doctor/providers/BaseProviderCheck.d.ts.map +0 -1
  532. package/dist/cli/commands/doctor/providers/BaseProviderCheck.js +0 -12
  533. package/dist/cli/commands/doctor/providers/BaseProviderCheck.js.map +0 -1
  534. package/dist/cli/commands/doctor/providers/StandardProviderCheck.d.ts +0 -11
  535. package/dist/cli/commands/doctor/providers/StandardProviderCheck.d.ts.map +0 -1
  536. package/dist/cli/commands/doctor/providers/StandardProviderCheck.js +0 -97
  537. package/dist/cli/commands/doctor/providers/StandardProviderCheck.js.map +0 -1
  538. package/dist/cli/commands/doctor/providers/index.d.ts +0 -30
  539. package/dist/cli/commands/doctor/providers/index.d.ts.map +0 -1
  540. package/dist/cli/commands/doctor/providers/index.js +0 -66
  541. package/dist/cli/commands/doctor/providers/index.js.map +0 -1
  542. package/dist/types/sso.d.ts +0 -42
  543. package/dist/types/sso.d.ts.map +0 -1
  544. package/dist/types/sso.js +0 -2
  545. package/dist/types/sso.js.map +0 -1
  546. package/dist/utils/analytics-reader.d.ts +0 -117
  547. package/dist/utils/analytics-reader.d.ts.map +0 -1
  548. package/dist/utils/analytics-reader.js +0 -421
  549. package/dist/utils/analytics-reader.js.map +0 -1
  550. package/dist/utils/async-tips.d.ts +0 -64
  551. package/dist/utils/async-tips.d.ts.map +0 -1
  552. package/dist/utils/async-tips.js +0 -203
  553. package/dist/utils/async-tips.js.map +0 -1
  554. package/dist/utils/codemie-integration-validator.d.ts +0 -18
  555. package/dist/utils/codemie-integration-validator.d.ts.map +0 -1
  556. package/dist/utils/codemie-integration-validator.js +0 -119
  557. package/dist/utils/codemie-integration-validator.js.map +0 -1
  558. package/dist/utils/codemie-model-fetcher.d.ts +0 -11
  559. package/dist/utils/codemie-model-fetcher.d.ts.map +0 -1
  560. package/dist/utils/codemie-model-fetcher.js +0 -317
  561. package/dist/utils/codemie-model-fetcher.js.map +0 -1
  562. package/dist/utils/date-formatter.d.ts +0 -88
  563. package/dist/utils/date-formatter.d.ts.map +0 -1
  564. package/dist/utils/date-formatter.js +0 -133
  565. package/dist/utils/date-formatter.js.map +0 -1
  566. package/dist/utils/health-checker.d.ts +0 -20
  567. package/dist/utils/health-checker.d.ts.map +0 -1
  568. package/dist/utils/health-checker.js +0 -172
  569. package/dist/utils/health-checker.js.map +0 -1
  570. package/dist/utils/model-fetcher.d.ts +0 -21
  571. package/dist/utils/model-fetcher.d.ts.map +0 -1
  572. package/dist/utils/model-fetcher.js +0 -148
  573. package/dist/utils/model-fetcher.js.map +0 -1
  574. package/dist/utils/proxy/errors.d.ts.map +0 -1
  575. package/dist/utils/proxy/errors.js.map +0 -1
  576. package/dist/utils/proxy/http-client.d.ts.map +0 -1
  577. package/dist/utils/proxy/http-client.js.map +0 -1
  578. package/dist/utils/proxy/plugins/analytics.plugin.d.ts +0 -19
  579. package/dist/utils/proxy/plugins/analytics.plugin.d.ts.map +0 -1
  580. package/dist/utils/proxy/plugins/analytics.plugin.js +0 -84
  581. package/dist/utils/proxy/plugins/analytics.plugin.js.map +0 -1
  582. package/dist/utils/proxy/plugins/header-injection.plugin.d.ts.map +0 -1
  583. package/dist/utils/proxy/plugins/header-injection.plugin.js.map +0 -1
  584. package/dist/utils/proxy/plugins/index.d.ts.map +0 -1
  585. package/dist/utils/proxy/plugins/index.js.map +0 -1
  586. package/dist/utils/proxy/plugins/registry.d.ts.map +0 -1
  587. package/dist/utils/proxy/plugins/registry.js.map +0 -1
  588. package/dist/utils/proxy/plugins/sso-auth.plugin.d.ts.map +0 -1
  589. package/dist/utils/proxy/plugins/sso-auth.plugin.js.map +0 -1
  590. package/dist/utils/proxy/plugins/types.d.ts.map +0 -1
  591. package/dist/utils/proxy/plugins/types.js.map +0 -1
  592. package/dist/utils/proxy/types.d.ts.map +0 -1
  593. package/dist/utils/proxy/types.js.map +0 -1
  594. package/dist/utils/sso-auth.d.ts +0 -15
  595. package/dist/utils/sso-auth.d.ts.map +0 -1
  596. package/dist/utils/sso-auth.js.map +0 -1
  597. package/dist/utils/tips.d.ts +0 -35
  598. package/dist/utils/tips.d.ts.map +0 -1
  599. package/dist/utils/tips.js +0 -93
  600. package/dist/utils/tips.js.map +0 -1
  601. /package/dist/{utils/proxy → proxy}/errors.d.ts +0 -0
  602. /package/dist/{utils/proxy → proxy}/errors.js +0 -0
  603. /package/dist/{utils/proxy → proxy}/http-client.d.ts +0 -0
  604. /package/dist/{utils/proxy → proxy}/plugins/header-injection.plugin.d.ts +0 -0
  605. /package/dist/{utils/proxy → proxy}/plugins/registry.d.ts +0 -0
  606. /package/dist/{utils/proxy → proxy}/plugins/sso-auth.plugin.d.ts +0 -0
  607. /package/dist/{utils/proxy → proxy}/plugins/types.js +0 -0
  608. /package/dist/{utils/proxy → proxy}/types.js +0 -0
@@ -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