@codemieai/code 0.0.57 → 0.1.0

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 (338) hide show
  1. package/README.md +165 -19
  2. package/bin/proxy-daemon.js +10 -0
  3. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  4. package/dist/agents/core/BaseAgentAdapter.js +3 -0
  5. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  6. package/dist/agents/core/session/SessionStore.d.ts +4 -0
  7. package/dist/agents/core/session/SessionStore.d.ts.map +1 -1
  8. package/dist/agents/core/session/SessionStore.js +40 -1
  9. package/dist/agents/core/session/SessionStore.js.map +1 -1
  10. package/dist/agents/core/session/types.d.ts +7 -0
  11. package/dist/agents/core/session/types.d.ts.map +1 -1
  12. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  13. package/dist/agents/plugins/claude/claude.plugin.js +18 -0
  14. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  15. package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
  16. package/dist/agents/plugins/claude/plugin/commands/README.md +2 -31
  17. package/dist/agents/plugins/claude/plugin/commands/codemie-catchup.md +5 -0
  18. package/dist/agents/plugins/claude/plugin/commands/codemie-init.md +42 -43
  19. package/dist/agents/plugins/claude/plugin/commands/codemie-subagents.md +5 -0
  20. package/dist/agents/plugins/claude/plugin/commands/handoff.md +56 -0
  21. package/dist/agents/plugins/claude/plugin/commands/memory-refresh.md +5 -0
  22. package/dist/agents/plugins/claude/plugin/hooks/hooks.json +1 -1
  23. package/dist/agents/plugins/claude/plugin/scripts/bash/rtk-rewrite.sh +101 -0
  24. package/dist/agents/plugins/claude/plugin/skills/msgraph/README.md +4 -1
  25. package/dist/agents/plugins/claude/plugin/skills/msgraph/SKILL.md +27 -8
  26. package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +63 -3
  27. package/dist/agents/plugins/claude/plugin/skills/report-issue/SKILL.md +1 -0
  28. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts +1 -0
  29. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  30. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +32 -20
  31. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  32. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts +2 -0
  33. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
  34. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +24 -1
  35. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
  36. package/dist/assets/demo.gif +0 -0
  37. package/dist/assets/skills-sh-egress-guard.cjs +166 -0
  38. package/dist/bin/proxy-daemon.d.ts +2 -0
  39. package/dist/bin/proxy-daemon.d.ts.map +1 -0
  40. package/dist/bin/proxy-daemon.js +138 -0
  41. package/dist/bin/proxy-daemon.js.map +1 -0
  42. package/dist/cli/commands/assistants/setup/constants.d.ts +1 -25
  43. package/dist/cli/commands/assistants/setup/constants.d.ts.map +1 -1
  44. package/dist/cli/commands/assistants/setup/constants.js +1 -20
  45. package/dist/cli/commands/assistants/setup/constants.js.map +1 -1
  46. package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.d.ts +4 -4
  47. package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.d.ts.map +1 -1
  48. package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.js +11 -10
  49. package/dist/cli/commands/assistants/setup/generators/claude-agent-generator.js.map +1 -1
  50. package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.d.ts +4 -4
  51. package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.d.ts.map +1 -1
  52. package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.js +11 -9
  53. package/dist/cli/commands/assistants/setup/generators/claude-skill-generator.js.map +1 -1
  54. package/dist/cli/commands/assistants/setup/helpers.d.ts +4 -18
  55. package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
  56. package/dist/cli/commands/assistants/setup/helpers.js +10 -60
  57. package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
  58. package/dist/cli/commands/assistants/setup/index.d.ts +0 -8
  59. package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
  60. package/dist/cli/commands/assistants/setup/index.js +20 -164
  61. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  62. package/dist/cli/commands/assistants/setup/selection/actions.d.ts +1 -30
  63. package/dist/cli/commands/assistants/setup/selection/actions.d.ts.map +1 -1
  64. package/dist/cli/commands/assistants/setup/selection/actions.js +1 -320
  65. package/dist/cli/commands/assistants/setup/selection/actions.js.map +1 -1
  66. package/dist/cli/commands/assistants/setup/selection/constants.d.ts +3 -65
  67. package/dist/cli/commands/assistants/setup/selection/constants.d.ts.map +1 -1
  68. package/dist/cli/commands/assistants/setup/selection/constants.js +4 -81
  69. package/dist/cli/commands/assistants/setup/selection/constants.js.map +1 -1
  70. package/dist/cli/commands/assistants/setup/selection/index.d.ts +1 -9
  71. package/dist/cli/commands/assistants/setup/selection/index.d.ts.map +1 -1
  72. package/dist/cli/commands/assistants/setup/selection/index.js +14 -34
  73. package/dist/cli/commands/assistants/setup/selection/index.js.map +1 -1
  74. package/dist/cli/commands/assistants/setup/selection/interactive-prompt.d.ts +1 -19
  75. package/dist/cli/commands/assistants/setup/selection/interactive-prompt.d.ts.map +1 -1
  76. package/dist/cli/commands/assistants/setup/selection/interactive-prompt.js +1 -338
  77. package/dist/cli/commands/assistants/setup/selection/interactive-prompt.js.map +1 -1
  78. package/dist/cli/commands/assistants/setup/selection/types.d.ts +7 -23
  79. package/dist/cli/commands/assistants/setup/selection/types.d.ts.map +1 -1
  80. package/dist/cli/commands/assistants/setup/selection/ui.d.ts +0 -8
  81. package/dist/cli/commands/assistants/setup/selection/ui.d.ts.map +1 -1
  82. package/dist/cli/commands/assistants/setup/selection/ui.js +7 -123
  83. package/dist/cli/commands/assistants/setup/selection/ui.js.map +1 -1
  84. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  85. package/dist/cli/commands/doctor/index.js +10 -1
  86. package/dist/cli/commands/doctor/index.js.map +1 -1
  87. package/dist/cli/commands/proxy/connectors/desktop-managed-mcp-servers.json +50 -0
  88. package/dist/cli/commands/proxy/connectors/desktop.d.ts +65 -0
  89. package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -0
  90. package/dist/cli/commands/proxy/connectors/desktop.js +218 -0
  91. package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -0
  92. package/dist/cli/commands/proxy/daemon-manager.d.ts +35 -0
  93. package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -0
  94. package/dist/cli/commands/proxy/daemon-manager.js +107 -0
  95. package/dist/cli/commands/proxy/daemon-manager.js.map +1 -0
  96. package/dist/cli/commands/proxy/index.d.ts +3 -0
  97. package/dist/cli/commands/proxy/index.d.ts.map +1 -0
  98. package/dist/cli/commands/proxy/index.js +258 -0
  99. package/dist/cli/commands/proxy/index.js.map +1 -0
  100. package/dist/cli/commands/proxy/inspect-desktop.d.ts +28 -0
  101. package/dist/cli/commands/proxy/inspect-desktop.d.ts.map +1 -0
  102. package/dist/cli/commands/proxy/inspect-desktop.js +134 -0
  103. package/dist/cli/commands/proxy/inspect-desktop.js.map +1 -0
  104. package/dist/cli/commands/setup.d.ts.map +1 -1
  105. package/dist/cli/commands/setup.js +2 -0
  106. package/dist/cli/commands/setup.js.map +1 -1
  107. package/dist/cli/commands/shared/constants.d.ts +15 -0
  108. package/dist/cli/commands/shared/constants.d.ts.map +1 -0
  109. package/dist/cli/commands/shared/constants.js +10 -0
  110. package/dist/cli/commands/shared/constants.js.map +1 -0
  111. package/dist/cli/commands/shared/helpers.d.ts +12 -0
  112. package/dist/cli/commands/shared/helpers.d.ts.map +1 -0
  113. package/dist/cli/commands/shared/helpers.js +54 -0
  114. package/dist/cli/commands/shared/helpers.js.map +1 -0
  115. package/dist/cli/commands/shared/prompts/storage-scope.d.ts +6 -0
  116. package/dist/cli/commands/shared/prompts/storage-scope.d.ts.map +1 -0
  117. package/dist/cli/commands/shared/prompts/storage-scope.js +84 -0
  118. package/dist/cli/commands/shared/prompts/storage-scope.js.map +1 -0
  119. package/dist/cli/commands/shared/selection/actions.d.ts +40 -0
  120. package/dist/cli/commands/shared/selection/actions.d.ts.map +1 -0
  121. package/dist/cli/commands/shared/selection/actions.js +264 -0
  122. package/dist/cli/commands/shared/selection/actions.js.map +1 -0
  123. package/dist/cli/commands/shared/selection/constants.d.ts +68 -0
  124. package/dist/cli/commands/shared/selection/constants.d.ts.map +1 -0
  125. package/dist/cli/commands/shared/selection/constants.js +70 -0
  126. package/dist/cli/commands/shared/selection/constants.js.map +1 -0
  127. package/dist/cli/commands/shared/selection/interactive-prompt.d.ts +16 -0
  128. package/dist/cli/commands/shared/selection/interactive-prompt.d.ts.map +1 -0
  129. package/dist/cli/commands/shared/selection/interactive-prompt.js +276 -0
  130. package/dist/cli/commands/shared/selection/interactive-prompt.js.map +1 -0
  131. package/dist/cli/commands/shared/selection/types.d.ts +31 -0
  132. package/dist/cli/commands/shared/selection/types.d.ts.map +1 -0
  133. package/dist/cli/commands/shared/selection/types.js +2 -0
  134. package/dist/cli/commands/shared/selection/types.js.map +1 -0
  135. package/dist/cli/commands/shared/selection/ui.d.ts +9 -0
  136. package/dist/cli/commands/shared/selection/ui.d.ts.map +1 -0
  137. package/dist/cli/commands/shared/selection/ui.js +92 -0
  138. package/dist/cli/commands/shared/selection/ui.js.map +1 -0
  139. package/dist/cli/commands/skills/add.d.ts +9 -0
  140. package/dist/cli/commands/skills/add.d.ts.map +1 -0
  141. package/dist/cli/commands/skills/add.js +187 -0
  142. package/dist/cli/commands/skills/add.js.map +1 -0
  143. package/dist/cli/commands/skills/find.d.ts +17 -0
  144. package/dist/cli/commands/skills/find.d.ts.map +1 -0
  145. package/dist/cli/commands/skills/find.js +94 -0
  146. package/dist/cli/commands/skills/find.js.map +1 -0
  147. package/dist/cli/commands/skills/index.d.ts +10 -0
  148. package/dist/cli/commands/skills/index.d.ts.map +1 -0
  149. package/dist/cli/commands/skills/index.js +23 -0
  150. package/dist/cli/commands/skills/index.js.map +1 -0
  151. package/dist/cli/commands/skills/lib/agent-detection.d.ts +27 -0
  152. package/dist/cli/commands/skills/lib/agent-detection.d.ts.map +1 -0
  153. package/dist/cli/commands/skills/lib/agent-detection.js +50 -0
  154. package/dist/cli/commands/skills/lib/agent-detection.js.map +1 -0
  155. package/dist/cli/commands/skills/lib/error-classify.d.ts +14 -0
  156. package/dist/cli/commands/skills/lib/error-classify.d.ts.map +1 -0
  157. package/dist/cli/commands/skills/lib/error-classify.js +64 -0
  158. package/dist/cli/commands/skills/lib/error-classify.js.map +1 -0
  159. package/dist/cli/commands/skills/lib/require-auth.d.ts +17 -0
  160. package/dist/cli/commands/skills/lib/require-auth.d.ts.map +1 -0
  161. package/dist/cli/commands/skills/lib/require-auth.js +44 -0
  162. package/dist/cli/commands/skills/lib/require-auth.js.map +1 -0
  163. package/dist/cli/commands/skills/lib/result-render.d.ts +26 -0
  164. package/dist/cli/commands/skills/lib/result-render.d.ts.map +1 -0
  165. package/dist/cli/commands/skills/lib/result-render.js +77 -0
  166. package/dist/cli/commands/skills/lib/result-render.js.map +1 -0
  167. package/dist/cli/commands/skills/lib/run-skills-cli.d.ts +46 -0
  168. package/dist/cli/commands/skills/lib/run-skills-cli.d.ts.map +1 -0
  169. package/dist/cli/commands/skills/lib/run-skills-cli.js +217 -0
  170. package/dist/cli/commands/skills/lib/run-skills-cli.js.map +1 -0
  171. package/dist/cli/commands/skills/lib/sanitize.d.ts +17 -0
  172. package/dist/cli/commands/skills/lib/sanitize.d.ts.map +1 -0
  173. package/dist/cli/commands/skills/lib/sanitize.js +73 -0
  174. package/dist/cli/commands/skills/lib/sanitize.js.map +1 -0
  175. package/dist/cli/commands/skills/lib/skills-metrics.d.ts +74 -0
  176. package/dist/cli/commands/skills/lib/skills-metrics.d.ts.map +1 -0
  177. package/dist/cli/commands/skills/lib/skills-metrics.js +268 -0
  178. package/dist/cli/commands/skills/lib/skills-metrics.js.map +1 -0
  179. package/dist/cli/commands/skills/lib/skills-search-client.d.ts +36 -0
  180. package/dist/cli/commands/skills/lib/skills-search-client.d.ts.map +1 -0
  181. package/dist/cli/commands/skills/lib/skills-search-client.js +147 -0
  182. package/dist/cli/commands/skills/lib/skills-search-client.js.map +1 -0
  183. package/dist/cli/commands/skills/lib/skills-sh-telemetry.d.ts +10 -0
  184. package/dist/cli/commands/skills/lib/skills-sh-telemetry.d.ts.map +1 -0
  185. package/dist/cli/commands/skills/lib/skills-sh-telemetry.js +33 -0
  186. package/dist/cli/commands/skills/lib/skills-sh-telemetry.js.map +1 -0
  187. package/dist/cli/commands/skills/list.d.ts +13 -0
  188. package/dist/cli/commands/skills/list.d.ts.map +1 -0
  189. package/dist/cli/commands/skills/list.js +55 -0
  190. package/dist/cli/commands/skills/list.js.map +1 -0
  191. package/dist/cli/commands/skills/remove.d.ts +11 -0
  192. package/dist/cli/commands/skills/remove.d.ts.map +1 -0
  193. package/dist/cli/commands/skills/remove.js +93 -0
  194. package/dist/cli/commands/skills/remove.js.map +1 -0
  195. package/dist/cli/commands/skills/setup/constants.d.ts +2 -0
  196. package/dist/cli/commands/skills/setup/constants.d.ts.map +1 -0
  197. package/dist/cli/commands/skills/setup/constants.js +2 -0
  198. package/dist/cli/commands/skills/setup/constants.js.map +1 -0
  199. package/dist/cli/commands/skills/setup/data.d.ts +28 -0
  200. package/dist/cli/commands/skills/setup/data.d.ts.map +1 -0
  201. package/dist/cli/commands/skills/setup/data.js +79 -0
  202. package/dist/cli/commands/skills/setup/data.js.map +1 -0
  203. package/dist/cli/commands/skills/setup/generators/claude-skill-generator.d.ts +12 -0
  204. package/dist/cli/commands/skills/setup/generators/claude-skill-generator.d.ts.map +1 -0
  205. package/dist/cli/commands/skills/setup/generators/claude-skill-generator.js +94 -0
  206. package/dist/cli/commands/skills/setup/generators/claude-skill-generator.js.map +1 -0
  207. package/dist/cli/commands/skills/setup/helpers.d.ts +12 -0
  208. package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -0
  209. package/dist/cli/commands/skills/setup/helpers.js +31 -0
  210. package/dist/cli/commands/skills/setup/helpers.js.map +1 -0
  211. package/dist/cli/commands/skills/setup/index.d.ts +5 -0
  212. package/dist/cli/commands/skills/setup/index.d.ts.map +1 -0
  213. package/dist/cli/commands/skills/setup/index.js +137 -0
  214. package/dist/cli/commands/skills/setup/index.js.map +1 -0
  215. package/dist/cli/commands/skills/setup/selection/actions.d.ts +2 -0
  216. package/dist/cli/commands/skills/setup/selection/actions.d.ts.map +1 -0
  217. package/dist/cli/commands/skills/setup/selection/actions.js +2 -0
  218. package/dist/cli/commands/skills/setup/selection/actions.js.map +1 -0
  219. package/dist/cli/commands/skills/setup/selection/constants.d.ts +11 -0
  220. package/dist/cli/commands/skills/setup/selection/constants.d.ts.map +1 -0
  221. package/dist/cli/commands/skills/setup/selection/constants.js +11 -0
  222. package/dist/cli/commands/skills/setup/selection/constants.js.map +1 -0
  223. package/dist/cli/commands/skills/setup/selection/index.d.ts +13 -0
  224. package/dist/cli/commands/skills/setup/selection/index.d.ts.map +1 -0
  225. package/dist/cli/commands/skills/setup/selection/index.js +113 -0
  226. package/dist/cli/commands/skills/setup/selection/index.js.map +1 -0
  227. package/dist/cli/commands/skills/setup/selection/interactive-prompt.d.ts +2 -0
  228. package/dist/cli/commands/skills/setup/selection/interactive-prompt.d.ts.map +1 -0
  229. package/dist/cli/commands/skills/setup/selection/interactive-prompt.js +2 -0
  230. package/dist/cli/commands/skills/setup/selection/interactive-prompt.js.map +1 -0
  231. package/dist/cli/commands/skills/setup/selection/types.d.ts +13 -0
  232. package/dist/cli/commands/skills/setup/selection/types.d.ts.map +1 -0
  233. package/dist/cli/commands/skills/setup/selection/types.js +2 -0
  234. package/dist/cli/commands/skills/setup/selection/types.js.map +1 -0
  235. package/dist/cli/commands/skills/setup/selection/ui.d.ts +3 -0
  236. package/dist/cli/commands/skills/setup/selection/ui.d.ts.map +1 -0
  237. package/dist/cli/commands/skills/setup/selection/ui.js +68 -0
  238. package/dist/cli/commands/skills/setup/selection/ui.js.map +1 -0
  239. package/dist/cli/commands/skills/setup/sync.d.ts +13 -0
  240. package/dist/cli/commands/skills/setup/sync.d.ts.map +1 -0
  241. package/dist/cli/commands/skills/setup/sync.js +46 -0
  242. package/dist/cli/commands/skills/setup/sync.js.map +1 -0
  243. package/dist/cli/commands/skills/update.d.ts +7 -0
  244. package/dist/cli/commands/skills/update.d.ts.map +1 -0
  245. package/dist/cli/commands/skills/update.js +71 -0
  246. package/dist/cli/commands/skills/update.js.map +1 -0
  247. package/dist/cli/first-time.d.ts.map +1 -1
  248. package/dist/cli/first-time.js +4 -0
  249. package/dist/cli/first-time.js.map +1 -1
  250. package/dist/cli/index.js +14 -0
  251. package/dist/cli/index.js.map +1 -1
  252. package/dist/env/types.d.ts +14 -0
  253. package/dist/env/types.d.ts.map +1 -1
  254. package/dist/env/types.js.map +1 -1
  255. package/dist/providers/core/types.d.ts +1 -1
  256. package/dist/providers/core/types.d.ts.map +1 -1
  257. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
  258. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +26 -2
  259. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
  260. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts +31 -0
  261. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts.map +1 -0
  262. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js +148 -0
  263. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js.map +1 -0
  264. package/dist/providers/plugins/sso/proxy/plugins/gateway-key.plugin.d.ts +9 -0
  265. package/dist/providers/plugins/sso/proxy/plugins/gateway-key.plugin.d.ts.map +1 -0
  266. package/dist/providers/plugins/sso/proxy/plugins/gateway-key.plugin.js +36 -0
  267. package/dist/providers/plugins/sso/proxy/plugins/gateway-key.plugin.js.map +1 -0
  268. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +12 -12
  269. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  270. package/dist/providers/plugins/sso/proxy/plugins/index.js +15 -15
  271. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  272. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +4 -0
  273. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
  274. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  275. package/dist/providers/plugins/sso/proxy/sso.proxy.js +4 -3
  276. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  277. package/dist/providers/plugins/sso/sso.http-client.d.ts +1 -1
  278. package/dist/providers/plugins/sso/sso.http-client.js +3 -3
  279. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  280. package/dist/providers/plugins/sso/sso.models.js +2 -2
  281. package/dist/providers/plugins/sso/sso.models.js.map +1 -1
  282. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  283. package/dist/providers/plugins/sso/sso.setup-steps.js +6 -10
  284. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  285. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts +15 -0
  286. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts.map +1 -0
  287. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js +117 -0
  288. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js.map +1 -0
  289. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts +3 -0
  290. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts.map +1 -0
  291. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js +138 -0
  292. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js.map +1 -0
  293. package/dist/telemetry/clients/claude-desktop/claude-desktop.metrics.d.ts +4 -0
  294. package/dist/telemetry/clients/claude-desktop/claude-desktop.metrics.d.ts.map +1 -0
  295. package/dist/telemetry/clients/claude-desktop/claude-desktop.metrics.js +53 -0
  296. package/dist/telemetry/clients/claude-desktop/claude-desktop.metrics.js.map +1 -0
  297. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.d.ts +4 -0
  298. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.d.ts.map +1 -0
  299. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.js +60 -0
  300. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.js.map +1 -0
  301. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.d.ts +4 -0
  302. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.d.ts.map +1 -0
  303. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.js +19 -0
  304. package/dist/telemetry/clients/claude-desktop/claude-desktop.paths.js.map +1 -0
  305. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts +23 -0
  306. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -0
  307. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +243 -0
  308. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -0
  309. package/dist/telemetry/runtime/checkpoints.d.ts +10 -0
  310. package/dist/telemetry/runtime/checkpoints.d.ts.map +1 -0
  311. package/dist/telemetry/runtime/checkpoints.js +8 -0
  312. package/dist/telemetry/runtime/checkpoints.js.map +1 -0
  313. package/dist/telemetry/runtime/types.d.ts +32 -0
  314. package/dist/telemetry/runtime/types.d.ts.map +1 -0
  315. package/dist/telemetry/runtime/types.js +2 -0
  316. package/dist/telemetry/runtime/types.js.map +1 -0
  317. package/dist/utils/config.d.ts +14 -3
  318. package/dist/utils/config.d.ts.map +1 -1
  319. package/dist/utils/config.js +95 -5
  320. package/dist/utils/config.js.map +1 -1
  321. package/dist/utils/processes.d.ts +6 -0
  322. package/dist/utils/processes.d.ts.map +1 -1
  323. package/dist/utils/processes.js +13 -3
  324. package/dist/utils/processes.js.map +1 -1
  325. package/package.json +25 -11
  326. package/scripts/README.md +15 -1
  327. package/scripts/copy-plugins.js +5 -0
  328. package/scripts/prepare-install-artifacts.mjs +66 -0
  329. package/scripts/sonar/package.json +3 -0
  330. package/scripts/sonar/run-local-sonar.js +405 -0
  331. package/scripts/test-desktop-telemetry.js +229 -0
  332. package/scripts/test-proxy-endpoint.js +173 -0
  333. package/dist/agents/plugins/claude/plugin/commands/codemie-commit.md +0 -31
  334. package/dist/agents/plugins/claude/plugin/scripts/bash/rtk-auto-wrapper.sh +0 -81
  335. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts +0 -30
  336. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.d.ts.map +0 -1
  337. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js +0 -111
  338. package/dist/providers/plugins/sso/proxy/plugins/claude-thinking-transformer.plugin.js.map +0 -1
@@ -0,0 +1,405 @@
1
+ // Copyright 2026 EPAM Systems, Inc. (“EPAM”)
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ const { spawn } = require('node:child_process');
16
+ const fs = require('node:fs');
17
+ const http = require('node:http');
18
+ const https = require('node:https');
19
+ const path = require('node:path');
20
+
21
+ const REPOSITORY_ROOT = path.resolve(__dirname, '../..');
22
+ const CONNECTED_MODE_PATH = path.resolve(REPOSITORY_ROOT, '.sonarlint/connectedMode.json');
23
+ const SONAR_PROPERTIES_PATH = path.resolve(REPOSITORY_ROOT, 'sonar-project.properties');
24
+ const SERVER_TIMEOUT_MS = 5000;
25
+ const PAGE_SIZE = 500;
26
+
27
+ function log(message) {
28
+ process.stdout.write(`[sonar-local] ${message}\n`);
29
+ }
30
+
31
+ function logError(message) {
32
+ process.stderr.write(`[sonar-local] ${message}\n`);
33
+ }
34
+
35
+ function readConnectedModeConfig() {
36
+ if (!fs.existsSync(CONNECTED_MODE_PATH)) {
37
+ throw new Error(`Missing SonarLint connected mode config: ${CONNECTED_MODE_PATH}`);
38
+ }
39
+
40
+ const rawContent = fs.readFileSync(CONNECTED_MODE_PATH, 'utf8');
41
+ const parsedConfig = JSON.parse(rawContent);
42
+ const sonarHostUrl = parsedConfig.sonarQubeUri;
43
+ const sonarProjectKey = parsedConfig.projectKey;
44
+
45
+ if (!sonarHostUrl || !sonarProjectKey) {
46
+ throw new Error(
47
+ `SonarLint connected mode config must define both "sonarQubeUri" and "projectKey": ${CONNECTED_MODE_PATH}`,
48
+ );
49
+ }
50
+
51
+ return { sonarHostUrl, sonarProjectKey };
52
+ }
53
+
54
+ function readSonarProperties() {
55
+ if (!fs.existsSync(SONAR_PROPERTIES_PATH)) {
56
+ throw new Error(`Missing Sonar project configuration: ${SONAR_PROPERTIES_PATH}`);
57
+ }
58
+
59
+ const properties = {};
60
+ const rawContent = fs.readFileSync(SONAR_PROPERTIES_PATH, 'utf8');
61
+
62
+ for (const rawLine of rawContent.split(/\r?\n/u)) {
63
+ const line = rawLine.trim();
64
+ if (!line || line.startsWith('#')) {
65
+ continue;
66
+ }
67
+
68
+ const separatorIndex = line.indexOf('=');
69
+ if (separatorIndex === -1) {
70
+ continue;
71
+ }
72
+
73
+ const key = line.slice(0, separatorIndex).trim();
74
+ const value = line.slice(separatorIndex + 1).trim();
75
+ properties[key] = value;
76
+ }
77
+
78
+ return properties;
79
+ }
80
+
81
+ function createRequestModule(targetUrl) {
82
+ return targetUrl.protocol === 'https:' ? https : http;
83
+ }
84
+
85
+ function resolveBranchName() {
86
+ const overrideBranchName = process.env.SONAR_BRANCH_NAME?.trim();
87
+ if (overrideBranchName) {
88
+ return overrideBranchName;
89
+ }
90
+
91
+ const gitEntryPath = path.resolve(REPOSITORY_ROOT, '.git');
92
+ if (!fs.existsSync(gitEntryPath)) {
93
+ throw new Error('Unable to locate .git metadata. Set SONAR_BRANCH_NAME explicitly and retry.');
94
+ }
95
+
96
+ let gitDirPath = gitEntryPath;
97
+ const gitEntryStat = fs.statSync(gitEntryPath);
98
+ if (gitEntryStat.isFile()) {
99
+ const gitPointer = fs.readFileSync(gitEntryPath, 'utf8').trim();
100
+ const gitDirPrefix = 'gitdir:';
101
+ if (!gitPointer.startsWith(gitDirPrefix)) {
102
+ throw new Error('Unable to resolve git metadata directory. Set SONAR_BRANCH_NAME explicitly and retry.');
103
+ }
104
+
105
+ gitDirPath = path.resolve(REPOSITORY_ROOT, gitPointer.slice(gitDirPrefix.length).trim());
106
+ }
107
+
108
+ const headPath = path.join(gitDirPath, 'HEAD');
109
+ if (!fs.existsSync(headPath)) {
110
+ throw new Error('Unable to locate git HEAD. Set SONAR_BRANCH_NAME explicitly and retry.');
111
+ }
112
+
113
+ const headContents = fs.readFileSync(headPath, 'utf8').trim();
114
+ const refPrefix = 'ref: refs/heads/';
115
+ if (!headContents.startsWith(refPrefix)) {
116
+ throw new Error('Unable to determine the current git branch from HEAD. Set SONAR_BRANCH_NAME explicitly.');
117
+ }
118
+
119
+ return headContents.slice(refPrefix.length);
120
+ }
121
+
122
+ function runCommand(command, args, options = {}) {
123
+ const { env = process.env, description = command } = options;
124
+
125
+ return new Promise((resolve, reject) => {
126
+ const child = spawn(command, args, {
127
+ cwd: REPOSITORY_ROOT,
128
+ env,
129
+ stdio: 'inherit',
130
+ shell: process.platform === 'win32',
131
+ });
132
+
133
+ child.on('error', (error) => {
134
+ reject(new Error(`Failed to start ${description}: ${error.message}`));
135
+ });
136
+
137
+ child.on('exit', (code) => {
138
+ if (code === 0) {
139
+ resolve();
140
+ return;
141
+ }
142
+
143
+ reject(new Error(`${description} exited with code ${code}`));
144
+ });
145
+ });
146
+ }
147
+
148
+ function resolveScannerCommand() {
149
+ const scannerCommand = process.env.SONAR_SCANNER_PATH?.trim() || 'sonar-scanner';
150
+
151
+ if (scannerCommand === 'sonar-scanner') {
152
+ const pathEntries = (process.env.PATH || '').split(path.delimiter);
153
+ const executableNames =
154
+ process.platform === 'win32'
155
+ ? ['sonar-scanner.cmd', 'sonar-scanner.bat', 'sonar-scanner.exe']
156
+ : ['sonar-scanner'];
157
+
158
+ const foundScanner = pathEntries.some((entry) =>
159
+ executableNames.some((name) => fs.existsSync(path.join(entry, name))),
160
+ );
161
+ if (!foundScanner) {
162
+ throw new Error(
163
+ 'sonar-scanner was not found. Install the official SonarScanner CLI or set SONAR_SCANNER_PATH.',
164
+ );
165
+ }
166
+ } else if (!fs.existsSync(scannerCommand)) {
167
+ throw new Error(`SONAR_SCANNER_PATH does not exist: ${scannerCommand}`);
168
+ }
169
+
170
+ return scannerCommand;
171
+ }
172
+
173
+ function sonarRequestJson(sonarHostUrl, sonarToken, endpoint, searchParams = {}) {
174
+ return new Promise((resolve, reject) => {
175
+ const requestUrl = new URL(endpoint, sonarHostUrl);
176
+ for (const [key, value] of Object.entries(searchParams)) {
177
+ if (value !== undefined && value !== null && value !== '') {
178
+ requestUrl.searchParams.set(key, String(value));
179
+ }
180
+ }
181
+
182
+ const request = createRequestModule(requestUrl).request(
183
+ requestUrl,
184
+ {
185
+ method: 'GET',
186
+ timeout: SERVER_TIMEOUT_MS,
187
+ headers: {
188
+ Authorization: `Basic ${Buffer.from(`${sonarToken}:`).toString('base64')}`,
189
+ Accept: 'application/json',
190
+ },
191
+ },
192
+ (response) => {
193
+ const chunks = [];
194
+ response.on('data', (chunk) => chunks.push(chunk));
195
+ response.on('end', () => {
196
+ const rawBody = Buffer.concat(chunks).toString('utf8');
197
+ if (response.statusCode && response.statusCode >= 400) {
198
+ reject(new Error(`Sonar API request failed (${response.statusCode}) for ${requestUrl.pathname}.`));
199
+ return;
200
+ }
201
+
202
+ try {
203
+ resolve(JSON.parse(rawBody));
204
+ } catch (error) {
205
+ reject(new Error(`Failed to parse Sonar API response for ${requestUrl.pathname}: ${error.message}`));
206
+ }
207
+ });
208
+ },
209
+ );
210
+
211
+ request.on('timeout', () => {
212
+ request.destroy(new Error(`Timed out after ${SERVER_TIMEOUT_MS}ms`));
213
+ });
214
+
215
+ request.on('error', (error) => {
216
+ reject(new Error(`Sonar API request failed for ${requestUrl.pathname}: ${error.message}`));
217
+ });
218
+
219
+ request.end();
220
+ });
221
+ }
222
+
223
+ async function fetchPaginatedItems(fetchPage) {
224
+ const items = [];
225
+ let page = 1;
226
+ let total = 0;
227
+ let pageSize = 0;
228
+
229
+ do {
230
+ const response = await fetchPage(page);
231
+ const responseItems = response.issues ?? response.hotspots ?? [];
232
+ items.push(...responseItems);
233
+ total = response.total ?? response.paging?.total ?? responseItems.length;
234
+ pageSize = response.ps ?? response.paging?.pageSize ?? responseItems.length;
235
+ page += 1;
236
+ } while (items.length < total && pageSize > 0);
237
+
238
+ return items;
239
+ }
240
+
241
+ function stripProjectKey(component, projectKey) {
242
+ const componentPrefix = `${projectKey}:`;
243
+ if (!component) {
244
+ return '(unknown component)';
245
+ }
246
+
247
+ return component.startsWith(componentPrefix) ? component.slice(componentPrefix.length) : component;
248
+ }
249
+
250
+ function formatIssue(issue, projectKey) {
251
+ const location = `${stripProjectKey(issue.component, projectKey)}:${issue.line ?? 1}`;
252
+ return `- [${issue.severity}] [${issue.type}] ${location} ${issue.rule}: ${issue.message}`;
253
+ }
254
+
255
+ function formatHotspot(hotspot, projectKey) {
256
+ const location = `${stripProjectKey(hotspot.component, projectKey)}:${hotspot.line ?? 1}`;
257
+ return `- ${location} ${hotspot.ruleKey ?? hotspot.rule ?? 'unknown-rule'}: ${hotspot.message}`;
258
+ }
259
+
260
+ async function collectSonarDetails({ sonarHostUrl, sonarProjectKey, branchName, sonarToken }) {
261
+ const qualityGate = await sonarRequestJson(sonarHostUrl, sonarToken, '/api/qualitygates/project_status', {
262
+ projectKey: sonarProjectKey,
263
+ branch: branchName,
264
+ });
265
+
266
+ const issues = await fetchPaginatedItems((page) =>
267
+ sonarRequestJson(sonarHostUrl, sonarToken, '/api/issues/search', {
268
+ componentKeys: sonarProjectKey,
269
+ branch: branchName,
270
+ resolved: 'false',
271
+ p: page,
272
+ ps: PAGE_SIZE,
273
+ s: 'FILE_LINE',
274
+ asc: 'true',
275
+ }),
276
+ );
277
+
278
+ const hotspots = await fetchPaginatedItems((page) =>
279
+ sonarRequestJson(sonarHostUrl, sonarToken, '/api/hotspots/search', {
280
+ projectKey: sonarProjectKey,
281
+ branch: branchName,
282
+ status: 'TO_REVIEW',
283
+ p: page,
284
+ ps: PAGE_SIZE,
285
+ }),
286
+ );
287
+
288
+ return { hotspots, issues, qualityGate };
289
+ }
290
+
291
+ function printSonarDetails(details, context) {
292
+ const { hotspots, issues, qualityGate } = details;
293
+ const { branchName, sonarProjectKey } = context;
294
+
295
+ log(`Project: ${sonarProjectKey}`);
296
+ log(`Branch: ${branchName}`);
297
+ log(`Quality gate: ${qualityGate.projectStatus.status}`);
298
+
299
+ const failedConditions = (qualityGate.projectStatus.conditions ?? []).filter(
300
+ (condition) => condition.status === 'ERROR',
301
+ );
302
+ if (failedConditions.length > 0) {
303
+ log('Failing gate conditions:');
304
+ for (const condition of failedConditions) {
305
+ log(
306
+ `- ${condition.metricKey}: actual=${condition.actualValue ?? 'n/a'}, threshold=${condition.errorThreshold ?? 'n/a'}`,
307
+ );
308
+ }
309
+ } else {
310
+ log('Failing gate conditions: none');
311
+ }
312
+
313
+ log(`Blocking security hotspots: ${hotspots.length}`);
314
+ for (const hotspot of hotspots) {
315
+ log(formatHotspot(hotspot, sonarProjectKey));
316
+ }
317
+
318
+ const bugsAndVulnerabilities = issues.filter((issue) => issue.type === 'BUG' || issue.type === 'VULNERABILITY');
319
+ log(`Bugs and vulnerabilities: ${bugsAndVulnerabilities.length}`);
320
+ for (const issue of bugsAndVulnerabilities) {
321
+ log(formatIssue(issue, sonarProjectKey));
322
+ }
323
+
324
+ log(`All unresolved issues: ${issues.length}`);
325
+ for (const issue of issues) {
326
+ log(formatIssue(issue, sonarProjectKey));
327
+ }
328
+ }
329
+
330
+ async function printFailureDetails(context) {
331
+ try {
332
+ const details = await collectSonarDetails(context);
333
+ printSonarDetails(details, context);
334
+ } catch (detailsError) {
335
+ logError(`Failed to fetch Sonar details after scan failure: ${detailsError.message}`);
336
+ }
337
+ }
338
+
339
+ async function main() {
340
+ const { sonarHostUrl, sonarProjectKey } = readConnectedModeConfig();
341
+ const sonarProperties = readSonarProperties();
342
+ const sonarToken = process.env.SONAR_TOKEN?.trim();
343
+ const branchName = resolveBranchName();
344
+
345
+ if (!sonarToken) {
346
+ log('Skipping Sonar scan because SONAR_TOKEN is not set.');
347
+ process.exit(0);
348
+ }
349
+
350
+ log(`Using SonarQube project "${sonarProjectKey}" from .sonarlint/connectedMode.json.`);
351
+ log(`Running analysis for branch "${branchName}".`);
352
+
353
+ if (sonarProperties['sonar.projectKey'] && sonarProperties['sonar.projectKey'] !== sonarProjectKey) {
354
+ log(
355
+ `Overriding sonar.projectKey="${sonarProperties['sonar.projectKey']}" with connected-mode project key "${sonarProjectKey}".`,
356
+ );
357
+ }
358
+
359
+ if (process.env.SONAR_SKIP_TESTS?.trim()) {
360
+ log('Skipping test run (SONAR_SKIP_TESTS is set). Using existing coverage.xml.');
361
+ } else {
362
+ log('Generating coverage.xml...');
363
+ await runCommand(
364
+ 'poetry',
365
+ ['run', 'pytest', 'tests/', '-W', 'ignore::DeprecationWarning', '--cov', '--cov-report=xml:coverage.xml'],
366
+ { description: 'coverage generation' },
367
+ );
368
+ }
369
+
370
+ const scannerCommand = resolveScannerCommand();
371
+ log(`Running sonar-scanner against ${sonarHostUrl}.`);
372
+ try {
373
+ await runCommand(
374
+ scannerCommand,
375
+ [
376
+ `-Dsonar.projectKey=${sonarProjectKey}`,
377
+ `-Dsonar.branch.name=${branchName}`,
378
+ '-Dsonar.qualitygate.wait=true',
379
+ ],
380
+ {
381
+ description: 'sonar-scanner',
382
+ env: {
383
+ ...process.env,
384
+ SONAR_HOST_URL: sonarHostUrl,
385
+ SONAR_TOKEN: sonarToken,
386
+ },
387
+ },
388
+ );
389
+ } catch (error) {
390
+ await printFailureDetails({
391
+ branchName,
392
+ sonarHostUrl,
393
+ sonarProjectKey,
394
+ sonarToken,
395
+ });
396
+ throw error;
397
+ }
398
+
399
+ log('Sonar scan completed successfully.');
400
+ }
401
+
402
+ main().catch((error) => {
403
+ logError(error.message);
404
+ process.exit(1);
405
+ });
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { randomUUID } from 'crypto';
5
+ import { resolve } from 'path';
6
+
7
+ function printUsage() {
8
+ console.log(`Usage: node scripts/test-desktop-telemetry.js [options]
9
+
10
+ Options:
11
+ --latest Use the most recently updated Desktop session (default)
12
+ --session <local_id> Use a specific Desktop local session id
13
+ --dry-run Build and sync through processors without remote writes (default)
14
+ --live Attempt real sync using stored SSO credentials
15
+ --target-url <url> Override API base URL for sync
16
+ --codemie-url <url> Override CodeMie URL for credential lookup
17
+ --codemie-home <dir> Override CODEMIE_HOME for isolated local output
18
+ --limit <count> Number of recent sessions to search while resolving --session (default: 20)
19
+ --help Show this help
20
+ `);
21
+ }
22
+
23
+ function parseArgs(argv) {
24
+ const args = {
25
+ latest: true,
26
+ sessionId: undefined,
27
+ dryRun: true,
28
+ targetUrl: undefined,
29
+ codeMieUrl: undefined,
30
+ codemieHome: undefined,
31
+ limit: 20
32
+ };
33
+
34
+ for (let index = 0; index < argv.length; index += 1) {
35
+ const arg = argv[index];
36
+
37
+ switch (arg) {
38
+ case '--latest':
39
+ args.latest = true;
40
+ break;
41
+ case '--session':
42
+ args.sessionId = argv[index + 1];
43
+ args.latest = false;
44
+ index += 1;
45
+ break;
46
+ case '--dry-run':
47
+ args.dryRun = true;
48
+ break;
49
+ case '--live':
50
+ args.dryRun = false;
51
+ break;
52
+ case '--target-url':
53
+ args.targetUrl = argv[index + 1];
54
+ index += 1;
55
+ break;
56
+ case '--codemie-url':
57
+ args.codeMieUrl = argv[index + 1];
58
+ index += 1;
59
+ break;
60
+ case '--codemie-home':
61
+ args.codemieHome = argv[index + 1];
62
+ index += 1;
63
+ break;
64
+ case '--limit':
65
+ args.limit = Number.parseInt(argv[index + 1], 10);
66
+ index += 1;
67
+ break;
68
+ case '--help':
69
+ printUsage();
70
+ process.exit(0);
71
+ default:
72
+ console.error(`Unknown argument: ${arg}`);
73
+ printUsage();
74
+ process.exit(1);
75
+ }
76
+ }
77
+
78
+ return args;
79
+ }
80
+
81
+ const args = parseArgs(process.argv.slice(2));
82
+ if (args.codemieHome) {
83
+ process.env.CODEMIE_HOME = resolve(args.codemieHome);
84
+ }
85
+
86
+ const distRoot = resolve(process.cwd(), 'dist');
87
+ if (!existsSync(distRoot)) {
88
+ console.error('dist/ is missing. Run: rtk npm run build');
89
+ process.exit(1);
90
+ }
91
+
92
+ const [
93
+ { discoverClaudeDesktopSessions },
94
+ { ClaudeDesktopTelemetryAdapter },
95
+ { SessionStore },
96
+ { getSessionConversationPath, getSessionMetricsPath },
97
+ { SessionSyncer },
98
+ { CodeMieSSO },
99
+ { detectGitBranch, detectGitRemoteRepo },
100
+ ] = await Promise.all([
101
+ import('../dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js'),
102
+ import('../dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js'),
103
+ import('../dist/agents/core/session/SessionStore.js'),
104
+ import('../dist/agents/core/session/session-config.js'),
105
+ import('../dist/providers/plugins/sso/session/SessionSyncer.js'),
106
+ import('../dist/providers/plugins/sso/sso.auth.js'),
107
+ import('../dist/utils/processes.js')
108
+ ]);
109
+
110
+ const discoveredSessions = await discoverClaudeDesktopSessions(0);
111
+ const recentSessions = discoveredSessions
112
+ .sort((a, b) => b.updatedAt - a.updatedAt)
113
+ .slice(0, Number.isFinite(args.limit) && args.limit > 0 ? args.limit : 20);
114
+
115
+ const selected = args.sessionId
116
+ ? recentSessions.find((session) => session.externalSessionId === args.sessionId)
117
+ : recentSessions[0];
118
+
119
+ if (!selected) {
120
+ console.error('No matching Claude Desktop local session found.');
121
+ process.exit(1);
122
+ }
123
+
124
+ const sessionStore = new SessionStore();
125
+ let session = await sessionStore.findSessionByExternalId('claude-desktop', selected.externalSessionId);
126
+
127
+ if (!session) {
128
+ const [gitBranch, repository] = await Promise.all([
129
+ detectGitBranch(selected.workingDirectory),
130
+ detectGitRemoteRepo(selected.workingDirectory)
131
+ ]);
132
+
133
+ session = {
134
+ sessionId: randomUUID(),
135
+ agentName: 'claude-desktop',
136
+ provider: 'ai-run-sso',
137
+ startTime: selected.createdAt,
138
+ workingDirectory: selected.workingDirectory,
139
+ gitBranch: gitBranch || undefined,
140
+ repository: repository || undefined,
141
+ status: 'active',
142
+ activeDurationMs: 0,
143
+ correlation: {
144
+ status: 'matched',
145
+ agentSessionId: selected.agentSessionId,
146
+ agentSessionFile: selected.transcriptPath,
147
+ retryCount: 0
148
+ },
149
+ runtimeCheckpoint: {
150
+ externalSessionId: selected.externalSessionId,
151
+ transcriptPath: selected.transcriptPath,
152
+ lastDiscoveredAt: Date.now(),
153
+ lastSeenActivityAt: selected.updatedAt
154
+ }
155
+ };
156
+
157
+ await sessionStore.saveSession(session);
158
+ }
159
+
160
+ const targetUrl = args.targetUrl
161
+ || process.env.CODEMIE_TEST_API_URL
162
+ || process.env.CODEMIE_API_URL
163
+ || 'http://127.0.0.1:3000';
164
+ const codeMieUrl = args.codeMieUrl
165
+ || process.env.CODEMIE_TEST_CODEMIE_URL
166
+ || process.env.CODEMIE_URL
167
+ || targetUrl;
168
+
169
+ let cookies = '';
170
+ if (!args.dryRun) {
171
+ const credentials = await new CodeMieSSO().getStoredCredentials(codeMieUrl);
172
+ if (!credentials?.cookies) {
173
+ console.error(`No stored SSO credentials found for ${codeMieUrl}`);
174
+ process.exit(1);
175
+ }
176
+ cookies = Object.entries(credentials.cookies)
177
+ .map(([key, value]) => `${key}=${value}`)
178
+ .join('; ');
179
+ }
180
+
181
+ const adapter = new ClaudeDesktopTelemetryAdapter();
182
+ const parsedSession = await adapter.parseSession(selected, session.sessionId);
183
+ const context = {
184
+ apiBaseUrl: targetUrl,
185
+ cookies,
186
+ clientType: 'claude-desktop',
187
+ version: readCliVersion(),
188
+ dryRun: args.dryRun,
189
+ sessionId: session.sessionId,
190
+ agentSessionId: selected.agentSessionId,
191
+ agentSessionFile: selected.transcriptPath
192
+ };
193
+
194
+ const processed = await adapter.processParsedSession(parsedSession, context);
195
+ const syncResult = await new SessionSyncer().sync(session.sessionId, context);
196
+ const metricsPath = getSessionMetricsPath(session.sessionId);
197
+ const conversationPath = getSessionConversationPath(session.sessionId);
198
+
199
+ console.log('Claude Desktop telemetry simulation');
200
+ console.log(` mode: ${args.dryRun ? 'dry-run' : 'live'}`);
201
+ console.log(` local session: ${selected.externalSessionId}`);
202
+ console.log(` cli session: ${selected.agentSessionId}`);
203
+ console.log(` codemie session: ${session.sessionId}`);
204
+ console.log(` updated at: ${new Date(selected.updatedAt).toISOString()}`);
205
+ console.log(` transcript: ${selected.transcriptPath}`);
206
+ console.log(` messages parsed: ${parsedSession.messages.length}`);
207
+ console.log(` metrics path: ${metricsPath}${existsSync(metricsPath) ? '' : ' (missing)'}`);
208
+ console.log(` conversation path: ${conversationPath}${existsSync(conversationPath) ? '' : ' (missing)'}`);
209
+ console.log(` processors: ${processed.success ? 'ok' : 'failed'} (${processed.totalRecords} records)`);
210
+ console.log(` sync: ${syncResult.success ? 'ok' : 'failed'} (${syncResult.message})`);
211
+
212
+ if (existsSync(metricsPath)) {
213
+ const lines = readFileSync(metricsPath, 'utf-8').split('\n').filter(Boolean).length;
214
+ console.log(` metrics lines: ${lines}`);
215
+ }
216
+
217
+ if (existsSync(conversationPath)) {
218
+ const lines = readFileSync(conversationPath, 'utf-8').split('\n').filter(Boolean).length;
219
+ console.log(` conversation lines:${String(lines).padStart(2, ' ')}`);
220
+ }
221
+
222
+ function readCliVersion() {
223
+ try {
224
+ const pkg = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf-8'));
225
+ return pkg.version || '0.0.0';
226
+ } catch {
227
+ return '0.0.0';
228
+ }
229
+ }