@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
@@ -5,7 +5,8 @@
5
5
  * SOLID: Single responsibility = inject CodeMie headers
6
6
  * KISS: Straightforward header injection
7
7
  */
8
- import { logger } from '../../logger.js';
8
+ import { ProviderRegistry } from '../../providers/core/registry.js';
9
+ import { logger } from '../../utils/logger.js';
9
10
  export class HeaderInjectionPlugin {
10
11
  id = '@codemie/proxy-headers';
11
12
  name = 'Header Injection';
@@ -25,9 +26,15 @@ class HeaderInjectionInterceptor {
25
26
  // Request and session ID headers
26
27
  context.headers['X-CodeMie-Request-ID'] = context.requestId;
27
28
  context.headers['X-CodeMie-Session-ID'] = context.sessionId;
29
+ // Add CLI version header
30
+ const cliVersion = this.context.config.version || '0.0.0';
31
+ context.headers['X-CodeMie-CLI'] = `codemie-cli/${cliVersion}`;
28
32
  const config = this.context.config;
29
- // Add integration header only for ai-run-sso provider
30
- if (config.provider === 'ai-run-sso' && config.integrationId) {
33
+ // Check if provider requires integration header
34
+ const provider = ProviderRegistry.getProvider(config.provider || '');
35
+ const requiresIntegration = provider?.customProperties?.requiresIntegration === true;
36
+ // Add integration header for providers that require it
37
+ if (requiresIntegration && config.integrationId) {
31
38
  context.headers['X-CodeMie-Integration'] = config.integrationId;
32
39
  }
33
40
  // Add model header if configured (for all providers)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-injection.plugin.js","sourceRoot":"","sources":["../../../src/proxy/plugins/header-injection.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,OAAO,qBAAqB;IAChC,EAAE,GAAG,wBAAwB,CAAC;IAC9B,IAAI,GAAG,kBAAkB,CAAC;IAC1B,OAAO,GAAG,OAAO,CAAC;IAClB,QAAQ,GAAG,EAAE,CAAC;IAEd,KAAK,CAAC,iBAAiB,CAAC,OAAsB;QAC5C,OAAO,IAAI,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,0BAA0B;IAGV;IAFpB,IAAI,GAAG,kBAAkB,CAAC;IAE1B,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAE9C,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,iCAAiC;QACjC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;QAE5D,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,UAAU,EAAE,CAAC;QAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAEnC,gDAAgD;QAChD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,mBAAmB,GAAG,QAAQ,EAAE,gBAAgB,EAAE,mBAAmB,KAAK,IAAI,CAAC;QAErF,uDAAuD;QACvD,IAAI,mBAAmB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAChD,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC;QAClE,CAAC;QAED,qDAAqD;QACrD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACxD,CAAC;QAED,uDAAuD;QACvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAC1D,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,4BAA4B,CAAC,CAAC;IAC1D,CAAC;CACF"}
@@ -4,15 +4,17 @@
4
4
  * KISS: Single file to register all core plugins
5
5
  * Extensibility: Easy to add new plugins
6
6
  */
7
+ import { EndpointBlockerPlugin } from './endpoint-blocker.plugin.js';
7
8
  import { SSOAuthPlugin } from './sso-auth.plugin.js';
8
9
  import { HeaderInjectionPlugin } from './header-injection.plugin.js';
9
- import { AnalyticsPlugin } from './analytics.plugin.js';
10
+ import { LoggingPlugin } from './logging.plugin.js';
11
+ import { MetricsSyncPlugin } from './metrics-sync.plugin.js';
10
12
  /**
11
13
  * Register core plugins
12
14
  * Called at app startup
13
15
  */
14
16
  export declare function registerCorePlugins(): void;
15
- export { SSOAuthPlugin, HeaderInjectionPlugin, AnalyticsPlugin };
17
+ export { EndpointBlockerPlugin, SSOAuthPlugin, HeaderInjectionPlugin, LoggingPlugin, MetricsSyncPlugin };
16
18
  export { getPluginRegistry, resetPluginRegistry } from './registry.js';
17
19
  export * from './types.js';
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/proxy/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAS1C;AAMD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,cAAc,YAAY,CAAC"}
@@ -5,9 +5,11 @@
5
5
  * Extensibility: Easy to add new plugins
6
6
  */
7
7
  import { getPluginRegistry } from './registry.js';
8
+ import { EndpointBlockerPlugin } from './endpoint-blocker.plugin.js';
8
9
  import { SSOAuthPlugin } from './sso-auth.plugin.js';
9
10
  import { HeaderInjectionPlugin } from './header-injection.plugin.js';
10
- import { AnalyticsPlugin } from './analytics.plugin.js';
11
+ import { LoggingPlugin } from './logging.plugin.js';
12
+ import { MetricsSyncPlugin } from './metrics-sync.plugin.js';
11
13
  /**
12
14
  * Register core plugins
13
15
  * Called at app startup
@@ -15,16 +17,16 @@ import { AnalyticsPlugin } from './analytics.plugin.js';
15
17
  export function registerCorePlugins() {
16
18
  const registry = getPluginRegistry();
17
19
  // Register in any order (priority determines execution order)
20
+ registry.register(new EndpointBlockerPlugin()); // Priority 5 - blocks unwanted endpoints early
18
21
  registry.register(new SSOAuthPlugin());
19
22
  registry.register(new HeaderInjectionPlugin());
20
- registry.register(new AnalyticsPlugin(), {
21
- enabled: false // Disabled by default (enabled in proxy start() if analytics is enabled)
22
- });
23
+ registry.register(new LoggingPlugin()); // Always enabled - logs to log files at INFO level
24
+ registry.register(new MetricsSyncPlugin()); // SSO-only - gracefully skips if not in SSO mode
23
25
  }
24
26
  // Auto-register on import
25
27
  registerCorePlugins();
26
28
  // Re-export for convenience
27
- export { SSOAuthPlugin, HeaderInjectionPlugin, AnalyticsPlugin };
29
+ export { EndpointBlockerPlugin, SSOAuthPlugin, HeaderInjectionPlugin, LoggingPlugin, MetricsSyncPlugin };
28
30
  export { getPluginRegistry, resetPluginRegistry } from './registry.js';
29
31
  export * from './types.js';
30
32
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/proxy/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IAErC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC,CAAC,+CAA+C;IAC/F,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,mDAAmD;IAC3F,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,iDAAiD;AAC/F,CAAC;AAED,0BAA0B;AAC1B,mBAAmB,EAAE,CAAC;AAEtB,4BAA4B;AAC5B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,cAAc,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Logging Plugin - Request/Response Logging
3
+ * Priority: 50 (runs before analytics)
4
+ *
5
+ * Purpose: Logs detailed proxy request/response information
6
+ * Separates operational logging from analytics metrics
7
+ *
8
+ * Log Level: DEBUG (file + console when CODEMIE_DEBUG=1)
9
+ * Log Location: ~/.codemie/logs/debug-YYYY-MM-DD.log
10
+ *
11
+ * SOLID: Single responsibility = log proxy activity
12
+ * KISS: Simple logging, reuses Logger system
13
+ */
14
+ import { ProxyPlugin, PluginContext, ProxyInterceptor } from './types.js';
15
+ export declare class LoggingPlugin implements ProxyPlugin {
16
+ id: string;
17
+ name: string;
18
+ version: string;
19
+ priority: number;
20
+ createInterceptor(_context: PluginContext): Promise<ProxyInterceptor>;
21
+ }
22
+ //# sourceMappingURL=logging.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.plugin.d.ts","sourceRoot":"","sources":["../../../src/proxy/plugins/logging.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAI5F,qBAAa,aAAc,YAAW,WAAW;IAC/C,EAAE,SAA4B;IAC9B,IAAI,SAAa;IACjB,OAAO,SAAW;IAClB,QAAQ,SAAM;IAER,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAG5E"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Logging Plugin - Request/Response Logging
3
+ * Priority: 50 (runs before analytics)
4
+ *
5
+ * Purpose: Logs detailed proxy request/response information
6
+ * Separates operational logging from analytics metrics
7
+ *
8
+ * Log Level: DEBUG (file + console when CODEMIE_DEBUG=1)
9
+ * Log Location: ~/.codemie/logs/debug-YYYY-MM-DD.log
10
+ *
11
+ * SOLID: Single responsibility = log proxy activity
12
+ * KISS: Simple logging, reuses Logger system
13
+ */
14
+ import { logger } from '../../utils/logger.js';
15
+ export class LoggingPlugin {
16
+ id = '@codemie/proxy-logging';
17
+ name = 'Logging';
18
+ version = '1.0.0';
19
+ priority = 50; // Run before analytics
20
+ async createInterceptor(_context) {
21
+ return new LoggingInterceptor();
22
+ }
23
+ }
24
+ class LoggingInterceptor {
25
+ name = 'logging';
26
+ chunkCount = 0;
27
+ totalBytes = 0;
28
+ async onRequest(context) {
29
+ try {
30
+ // Reset counters for new request
31
+ this.chunkCount = 0;
32
+ this.totalBytes = 0;
33
+ logger.debug(`[proxy-request] ${context.method} ${context.url}`, {
34
+ requestId: context.requestId,
35
+ sessionId: context.sessionId,
36
+ agent: context.agentName,
37
+ profile: context.profile,
38
+ provider: context.provider,
39
+ model: context.model,
40
+ targetUrl: context.targetUrl,
41
+ bodySize: context.requestBody?.length || 0,
42
+ headers: this.sanitizeHeaders(context.headers)
43
+ });
44
+ }
45
+ catch (error) {
46
+ // Don't break proxy flow on logging errors
47
+ logger.error(`[${this.name}] Error logging request:`, error);
48
+ }
49
+ }
50
+ async onResponseHeaders(context, headers) {
51
+ try {
52
+ logger.debug(`[proxy-response-headers] ${context.url}`, {
53
+ requestId: context.requestId,
54
+ sessionId: context.sessionId,
55
+ agent: context.agentName,
56
+ profile: context.profile,
57
+ provider: context.provider,
58
+ model: context.model,
59
+ headers: {
60
+ 'content-type': headers['content-type'],
61
+ 'content-length': headers['content-length'],
62
+ 'transfer-encoding': headers['transfer-encoding']
63
+ }
64
+ });
65
+ }
66
+ catch (error) {
67
+ logger.error(`[${this.name}] Error logging response headers:`, error);
68
+ }
69
+ }
70
+ async onResponseChunk(context, chunk) {
71
+ try {
72
+ this.chunkCount++;
73
+ this.totalBytes += chunk.length;
74
+ // Log every 1000th chunk to avoid spam (or first/last chunks)
75
+ if (this.chunkCount === 1 || this.chunkCount % 1000 === 0) {
76
+ logger.debug(`[proxy-streaming] ${context.url}`, {
77
+ requestId: context.requestId,
78
+ sessionId: context.sessionId,
79
+ chunkNumber: this.chunkCount,
80
+ chunkSize: chunk.length,
81
+ totalBytes: this.totalBytes
82
+ });
83
+ }
84
+ }
85
+ catch (error) {
86
+ logger.error(`[${this.name}] Error logging chunk:`, error);
87
+ }
88
+ return chunk;
89
+ }
90
+ async onResponseComplete(context, metadata) {
91
+ try {
92
+ logger.debug(`[proxy-response] ${metadata.statusCode} ${context.url} (${metadata.durationMs}ms)`, {
93
+ requestId: context.requestId,
94
+ sessionId: context.sessionId,
95
+ agent: context.agentName,
96
+ profile: context.profile,
97
+ provider: context.provider,
98
+ model: context.model,
99
+ statusCode: metadata.statusCode,
100
+ statusMessage: metadata.statusMessage,
101
+ bytesSent: metadata.bytesSent,
102
+ durationMs: metadata.durationMs,
103
+ totalChunks: this.chunkCount,
104
+ totalBytesStreamed: this.totalBytes
105
+ });
106
+ // Log completion marker to track if we reach this point
107
+ logger.debug(`[proxy-complete] Request fully processed for ${context.url}`, {
108
+ requestId: context.requestId,
109
+ sessionId: context.sessionId,
110
+ agent: context.agentName,
111
+ profile: context.profile,
112
+ provider: context.provider,
113
+ model: context.model,
114
+ finalStatus: 'success'
115
+ });
116
+ }
117
+ catch (error) {
118
+ // Don't break proxy flow on logging errors
119
+ logger.error(`[${this.name}] Error logging response:`, error);
120
+ }
121
+ }
122
+ async onError(context, error) {
123
+ try {
124
+ logger.debug(`[proxy-error] ${error.name}: ${error.message}`, {
125
+ requestId: context.requestId,
126
+ sessionId: context.sessionId,
127
+ agent: context.agentName,
128
+ profile: context.profile,
129
+ provider: context.provider,
130
+ model: context.model,
131
+ url: context.url,
132
+ errorType: error.name,
133
+ errorMessage: error.message,
134
+ errorStack: error.stack
135
+ });
136
+ }
137
+ catch (logError) {
138
+ // Don't break proxy flow on logging errors
139
+ logger.error(`[${this.name}] Error logging error:`, logError);
140
+ }
141
+ }
142
+ /**
143
+ * Filter headers to only include X-Codemie headers
144
+ */
145
+ sanitizeHeaders(headers) {
146
+ const filtered = {};
147
+ for (const [key, value] of Object.entries(headers)) {
148
+ // Only include X-Codemie headers
149
+ if (key.toLowerCase().startsWith('x-codemie')) {
150
+ filtered[key] = value;
151
+ }
152
+ }
153
+ return filtered;
154
+ }
155
+ }
156
+ //# sourceMappingURL=logging.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.plugin.js","sourceRoot":"","sources":["../../../src/proxy/plugins/logging.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Metrics Sync Plugin
3
+ * Priority: 100 (runs after logging plugin)
4
+ *
5
+ * Purpose: Syncs metrics to CodeMie API in background
6
+ * - Runs only in SSO mode (ai-run-sso provider)
7
+ * - Background timer (every 5 minutes)
8
+ * - Aggregates pending deltas into single metric
9
+ * - Marks deltas as synced in JSONL
10
+ * - Final sync on proxy shutdown
11
+ *
12
+ * SOLID: Single responsibility = sync metrics
13
+ * KISS: Simple timer-based sync
14
+ */
15
+ import { ProxyPlugin, PluginContext, ProxyInterceptor } from './types.js';
16
+ export declare class MetricsSyncPlugin implements ProxyPlugin {
17
+ id: string;
18
+ name: string;
19
+ version: string;
20
+ priority: number;
21
+ createInterceptor(context: PluginContext): Promise<ProxyInterceptor>;
22
+ /**
23
+ * Check if metrics sync is enabled
24
+ * Priority: ENV > Profile config > Default (true)
25
+ */
26
+ private isSyncEnabled;
27
+ /**
28
+ * Check if dry-run mode is enabled
29
+ * Priority: ENV > Profile config > Default (false)
30
+ */
31
+ private isDryRunEnabled;
32
+ }
33
+ //# sourceMappingURL=metrics-sync.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-sync.plugin.d.ts","sourceRoot":"","sources":["../../../src/proxy/plugins/metrics-sync.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ1E,qBAAa,iBAAkB,YAAW,WAAW;IACnD,EAAE,SAAiC;IACnC,IAAI,SAAkB;IACtB,OAAO,SAAW;IAClB,QAAQ,SAAO;IAET,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkC1E;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgBrB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAexB"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Metrics Sync Plugin
3
+ * Priority: 100 (runs after logging plugin)
4
+ *
5
+ * Purpose: Syncs metrics to CodeMie API in background
6
+ * - Runs only in SSO mode (ai-run-sso provider)
7
+ * - Background timer (every 5 minutes)
8
+ * - Aggregates pending deltas into single metric
9
+ * - Marks deltas as synced in JSONL
10
+ * - Final sync on proxy shutdown
11
+ *
12
+ * SOLID: Single responsibility = sync metrics
13
+ * KISS: Simple timer-based sync
14
+ */
15
+ import { logger } from '../../utils/logger.js';
16
+ import { MetricsApiClient } from '../../metrics/sync/MetricsApiClient.js';
17
+ import { readJSONL, writeJSONLAtomic } from '../../metrics/sync/jsonl-writer.js';
18
+ import { aggregateDeltas } from '../../metrics/sync/aggregator.js';
19
+ import { SessionStore } from '../../metrics/session/SessionStore.js';
20
+ import { getSessionMetricsPath } from '../../metrics/config.js';
21
+ export class MetricsSyncPlugin {
22
+ id = '@codemie/proxy-metrics-sync';
23
+ name = 'Metrics Sync';
24
+ version = '1.0.0';
25
+ priority = 100; // Run after logging (priority 50)
26
+ async createInterceptor(context) {
27
+ // Only create interceptor if we have necessary context
28
+ if (!context.config.sessionId) {
29
+ logger.debug('[MetricsSyncPlugin] Skipping: Session ID not available');
30
+ throw new Error('Session ID not available (metrics sync disabled)');
31
+ }
32
+ if (!context.credentials) {
33
+ logger.debug('[MetricsSyncPlugin] Skipping: SSO credentials not available');
34
+ throw new Error('SSO credentials not available (metrics sync disabled)');
35
+ }
36
+ // Check if metrics sync is enabled (from config or env var)
37
+ const syncEnabled = this.isSyncEnabled(context);
38
+ if (!syncEnabled) {
39
+ logger.debug('[MetricsSyncPlugin] Skipping: Metrics sync disabled by configuration');
40
+ throw new Error('Metrics sync disabled by configuration');
41
+ }
42
+ logger.info('[MetricsSyncPlugin] Initializing metrics sync');
43
+ // Check if dry-run mode is enabled
44
+ const dryRun = this.isDryRunEnabled(context);
45
+ return new MetricsSyncInterceptor(context.config.sessionId, context.config.targetApiUrl, context.credentials.cookies, context.config.clientType, context.config.version, dryRun);
46
+ }
47
+ /**
48
+ * Check if metrics sync is enabled
49
+ * Priority: ENV > Profile config > Default (true)
50
+ */
51
+ isSyncEnabled(context) {
52
+ // Check environment variable first
53
+ const envEnabled = process.env.CODEMIE_METRICS_SYNC_ENABLED;
54
+ if (envEnabled !== undefined) {
55
+ return envEnabled === 'true' || envEnabled === '1';
56
+ }
57
+ // Check profile config (if available)
58
+ if (context.profileConfig?.metrics?.sync?.enabled !== undefined) {
59
+ return context.profileConfig.metrics.sync.enabled;
60
+ }
61
+ // Default to enabled for SSO mode
62
+ return true;
63
+ }
64
+ /**
65
+ * Check if dry-run mode is enabled
66
+ * Priority: ENV > Profile config > Default (false)
67
+ */
68
+ isDryRunEnabled(context) {
69
+ // Check environment variable first
70
+ const envDryRun = process.env.CODEMIE_METRICS_DRY_RUN;
71
+ if (envDryRun !== undefined) {
72
+ return envDryRun === 'true' || envDryRun === '1';
73
+ }
74
+ // Check profile config (if available)
75
+ if (context.profileConfig?.metrics?.sync?.dryRun !== undefined) {
76
+ return context.profileConfig.metrics.sync.dryRun;
77
+ }
78
+ // Default to disabled
79
+ return false;
80
+ }
81
+ }
82
+ class MetricsSyncInterceptor {
83
+ sessionId;
84
+ name = 'metrics-sync';
85
+ syncTimer;
86
+ sessionStore = new SessionStore();
87
+ apiClient;
88
+ syncInterval;
89
+ isSyncing = false;
90
+ version;
91
+ dryRun;
92
+ constructor(sessionId, baseUrl, cookies, clientType, version, dryRun = false) {
93
+ this.sessionId = sessionId;
94
+ // Get version from proxy config (passed from AgentCLI)
95
+ this.version = version || '0.0.0';
96
+ // Set dry-run mode (passed from plugin)
97
+ this.dryRun = dryRun;
98
+ if (this.dryRun) {
99
+ logger.info('[metrics-sync] Dry-run mode enabled - metrics will be logged but not sent');
100
+ }
101
+ // Build cookie header
102
+ const cookieHeader = Object.entries(cookies)
103
+ .map(([key, value]) => `${key}=${value}`)
104
+ .join('; ');
105
+ this.apiClient = new MetricsApiClient({
106
+ baseUrl,
107
+ cookies: cookieHeader,
108
+ timeout: 30000,
109
+ retryAttempts: 3,
110
+ version: this.version,
111
+ clientType: clientType || 'codemie-cli'
112
+ });
113
+ // Get sync interval from env or default to 5 minutes
114
+ this.syncInterval = Number.parseInt(process.env.CODEMIE_METRICS_SYNC_INTERVAL || '300000', 10);
115
+ }
116
+ /**
117
+ * Called when proxy starts - initialize background timer
118
+ */
119
+ async onProxyStart() {
120
+ logger.info(`[${this.name}] Starting metrics sync (interval: ${this.syncInterval}ms)`);
121
+ // Start background timer
122
+ this.syncTimer = setInterval(() => {
123
+ this.syncMetrics().catch(error => {
124
+ logger.error(`[${this.name}] Sync failed:`, error);
125
+ });
126
+ }, this.syncInterval);
127
+ logger.debug(`[${this.name}] Background timer started`);
128
+ }
129
+ /**
130
+ * Called when proxy stops - cleanup and final sync
131
+ */
132
+ async onProxyStop() {
133
+ logger.info(`[${this.name}] Stopping metrics sync`);
134
+ // Stop timer
135
+ if (this.syncTimer) {
136
+ clearInterval(this.syncTimer);
137
+ this.syncTimer = undefined;
138
+ }
139
+ // Final sync (ensure all pending metrics are sent)
140
+ try {
141
+ await this.syncMetrics();
142
+ logger.info(`[${this.name}] Final sync completed`);
143
+ }
144
+ catch (error) {
145
+ logger.error(`[${this.name}] Final sync failed:`, error);
146
+ }
147
+ }
148
+ /**
149
+ * Sync metrics to API
150
+ */
151
+ async syncMetrics() {
152
+ // Skip if already syncing (prevent concurrent syncs)
153
+ if (this.isSyncing) {
154
+ logger.debug(`[${this.name}] Sync already in progress, skipping`);
155
+ return;
156
+ }
157
+ this.isSyncing = true;
158
+ try {
159
+ const metricsFile = getSessionMetricsPath(this.sessionId);
160
+ // 1. Read all deltas from JSONL
161
+ const allDeltas = await readJSONL(metricsFile);
162
+ // 2. Filter for pending deltas only
163
+ const pendingDeltas = allDeltas.filter(d => d.syncStatus === 'pending');
164
+ if (pendingDeltas.length === 0) {
165
+ logger.debug(`[${this.name}] No pending deltas to sync`);
166
+ return;
167
+ }
168
+ logger.info(`[${this.name}] Syncing ${pendingDeltas.length} pending deltas`);
169
+ // Debug: Log collected deltas
170
+ logger.debug(`[${this.name}] Collected pending deltas:`, {
171
+ count: pendingDeltas.length,
172
+ deltas: pendingDeltas.map(d => {
173
+ // Calculate tool stats from tools and toolStatus
174
+ const totalTools = Object.values(d.tools || {}).reduce((sum, count) => sum + count, 0);
175
+ let successCount = 0;
176
+ let failureCount = 0;
177
+ if (d.toolStatus) {
178
+ for (const status of Object.values(d.toolStatus)) {
179
+ successCount += status.success || 0;
180
+ failureCount += status.failure || 0;
181
+ }
182
+ }
183
+ // Calculate file operation totals
184
+ const fileOps = d.fileOperations || [];
185
+ const linesAdded = fileOps.reduce((sum, op) => sum + (op.linesAdded || 0), 0);
186
+ const linesRemoved = fileOps.reduce((sum, op) => sum + (op.linesRemoved || 0), 0);
187
+ const writeOps = fileOps.filter(op => op.type === 'write').length;
188
+ const editOps = fileOps.filter(op => op.type === 'edit').length;
189
+ const deleteOps = fileOps.filter(op => op.type === 'delete').length;
190
+ return {
191
+ recordId: d.recordId,
192
+ timestamp: typeof d.timestamp === 'number'
193
+ ? new Date(d.timestamp).toISOString()
194
+ : d.timestamp,
195
+ tokens: d.tokens,
196
+ tools: {
197
+ total: totalTools,
198
+ success: successCount,
199
+ failure: failureCount,
200
+ breakdown: d.tools
201
+ },
202
+ fileOperations: {
203
+ created: writeOps,
204
+ modified: editOps,
205
+ deleted: deleteOps,
206
+ linesAdded,
207
+ linesRemoved
208
+ }
209
+ };
210
+ })
211
+ });
212
+ // 3. Load session metadata
213
+ const session = await this.sessionStore.loadSession(this.sessionId);
214
+ if (!session) {
215
+ logger.error(`[${this.name}] Session not found: ${this.sessionId}`);
216
+ return;
217
+ }
218
+ // 4. Aggregate pending deltas into single metric
219
+ const metric = aggregateDeltas(pendingDeltas, session, this.version);
220
+ // Debug: Log aggregated metric
221
+ logger.debug(`[${this.name}] Aggregated metric:`, {
222
+ name: metric.name,
223
+ attributes: {
224
+ // Identity
225
+ agent: metric.attributes.agent,
226
+ agent_version: metric.attributes.agent_version,
227
+ llm_model: metric.attributes.llm_model,
228
+ project: metric.attributes.project,
229
+ session_id: metric.attributes.session_id,
230
+ // Interaction totals
231
+ total_user_prompts: metric.attributes.total_user_prompts,
232
+ // Token totals
233
+ total_input_tokens: metric.attributes.total_input_tokens,
234
+ total_output_tokens: metric.attributes.total_output_tokens,
235
+ total_cache_read_input_tokens: metric.attributes.total_cache_read_input_tokens,
236
+ total_cache_creation_tokens: metric.attributes.total_cache_creation_tokens,
237
+ // Tool totals
238
+ total_tool_calls: metric.attributes.total_tool_calls,
239
+ successful_tool_calls: metric.attributes.successful_tool_calls,
240
+ failed_tool_calls: metric.attributes.failed_tool_calls,
241
+ // File operation totals
242
+ files_created: metric.attributes.files_created,
243
+ files_modified: metric.attributes.files_modified,
244
+ files_deleted: metric.attributes.files_deleted,
245
+ total_lines_added: metric.attributes.total_lines_added,
246
+ total_lines_removed: metric.attributes.total_lines_removed,
247
+ // Session info
248
+ session_duration_ms: metric.attributes.session_duration_ms,
249
+ count: metric.attributes.count
250
+ }
251
+ });
252
+ // 5. Send to API (single aggregated metric) or log in dry-run mode
253
+ if (this.dryRun) {
254
+ // Dry-run mode: Log what would be sent without actually sending
255
+ logger.info(`[${this.name}] [DRY-RUN] Would send metric to API:`, {
256
+ endpoint: `${this.apiClient['config'].baseUrl}/v1/metrics`,
257
+ method: 'POST',
258
+ headers: {
259
+ 'Content-Type': 'application/json',
260
+ 'User-Agent': `CodeMie-CLI/${this.version}`,
261
+ 'X-CodeMie-Client': this.apiClient['config'].clientType,
262
+ 'Cookie': '[REDACTED]'
263
+ },
264
+ payload: {
265
+ name: metric.name,
266
+ attributes: metric.attributes
267
+ }
268
+ });
269
+ logger.info(`[${this.name}] [DRY-RUN] Skipping actual API call - ${pendingDeltas.length} deltas would be synced`);
270
+ }
271
+ else {
272
+ // Normal mode: Actually send to API
273
+ const response = await this.apiClient.sendMetric(metric);
274
+ if (!response.success) {
275
+ logger.error(`[${this.name}] Sync failed: ${response.message}`);
276
+ return;
277
+ }
278
+ }
279
+ // 6. Mark deltas as synced in JSONL (atomic rewrite)
280
+ const syncedAt = Date.now();
281
+ const pendingRecordIds = new Set(pendingDeltas.map(d => d.recordId));
282
+ const updatedDeltas = allDeltas.map(d => pendingRecordIds.has(d.recordId)
283
+ ? {
284
+ ...d,
285
+ syncStatus: 'synced',
286
+ syncAttempts: d.syncAttempts + 1,
287
+ syncedAt
288
+ }
289
+ : d);
290
+ await writeJSONLAtomic(metricsFile, updatedDeltas);
291
+ logger.info(`[${this.name}] Successfully synced ${pendingDeltas.length} deltas`);
292
+ // Debug: Log which deltas were marked as synced
293
+ logger.debug(`[${this.name}] Marked deltas as synced:`, {
294
+ syncedAt: new Date(syncedAt).toISOString(),
295
+ recordIds: Array.from(pendingRecordIds),
296
+ totalDeltasInFile: updatedDeltas.length,
297
+ syncedCount: updatedDeltas.filter(d => d.syncStatus === 'synced').length,
298
+ pendingCount: updatedDeltas.filter(d => d.syncStatus === 'pending').length
299
+ });
300
+ }
301
+ catch (error) {
302
+ logger.error(`[${this.name}] Sync failed:`, error);
303
+ throw error;
304
+ }
305
+ finally {
306
+ this.isSyncing = false;
307
+ }
308
+ }
309
+ }
310
+ //# sourceMappingURL=metrics-sync.plugin.js.map