@machina.ai/cell-cli-core 1.0.13-rc9 → 1.0.21-rc1

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 (484) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.js +3 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +12 -4
  5. package/dist/src/code_assist/converter.d.ts +6 -3
  6. package/dist/src/code_assist/converter.js +4 -2
  7. package/dist/src/code_assist/converter.js.map +1 -1
  8. package/dist/src/code_assist/converter.test.js +61 -11
  9. package/dist/src/code_assist/converter.test.js.map +1 -1
  10. package/dist/src/code_assist/oauth2.d.ts +1 -0
  11. package/dist/src/code_assist/oauth2.js +43 -18
  12. package/dist/src/code_assist/oauth2.js.map +1 -1
  13. package/dist/src/code_assist/oauth2.test.js +142 -9
  14. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  15. package/dist/src/code_assist/server.d.ts +2 -2
  16. package/dist/src/code_assist/server.js +5 -5
  17. package/dist/src/code_assist/server.js.map +1 -1
  18. package/dist/src/code_assist/server.test.js +13 -10
  19. package/dist/src/code_assist/server.test.js.map +1 -1
  20. package/dist/src/code_assist/setup.js +49 -18
  21. package/dist/src/code_assist/setup.js.map +1 -1
  22. package/dist/src/code_assist/setup.test.js +115 -9
  23. package/dist/src/code_assist/setup.test.js.map +1 -1
  24. package/dist/src/config/config.d.ts +71 -13
  25. package/dist/src/config/config.js +154 -41
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/config.test.js +206 -21
  28. package/dist/src/config/config.test.js.map +1 -1
  29. package/dist/src/config/flashFallback.test.js +19 -47
  30. package/dist/src/config/flashFallback.test.js.map +1 -1
  31. package/dist/src/config/models.d.ts +1 -0
  32. package/dist/src/config/models.js +1 -0
  33. package/dist/src/config/models.js.map +1 -1
  34. package/dist/src/core/client.d.ts +15 -16
  35. package/dist/src/core/client.js +247 -104
  36. package/dist/src/core/client.js.map +1 -1
  37. package/dist/src/core/client.test.js +798 -49
  38. package/dist/src/core/client.test.js.map +1 -1
  39. package/dist/src/core/contentGenerator.d.ts +2 -2
  40. package/dist/src/core/contentGenerator.js +23 -21
  41. package/dist/src/core/contentGenerator.js.map +1 -1
  42. package/dist/src/core/contentGenerator.test.js +30 -126
  43. package/dist/src/core/contentGenerator.test.js.map +1 -1
  44. package/dist/src/core/coreToolScheduler.d.ts +23 -10
  45. package/dist/src/core/coreToolScheduler.js +201 -77
  46. package/dist/src/core/coreToolScheduler.js.map +1 -1
  47. package/dist/src/core/coreToolScheduler.test.js +322 -94
  48. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  49. package/dist/src/core/geminiChat.d.ts +8 -6
  50. package/dist/src/core/geminiChat.js +49 -51
  51. package/dist/src/core/geminiChat.js.map +1 -1
  52. package/dist/src/core/geminiChat.test.js +2 -2
  53. package/dist/src/core/geminiChat.test.js.map +1 -1
  54. package/dist/src/core/geminiRequest.js +2 -37
  55. package/dist/src/core/geminiRequest.js.map +1 -1
  56. package/dist/src/core/logger.d.ts +24 -1
  57. package/dist/src/core/logger.js +128 -4
  58. package/dist/src/core/logger.js.map +1 -1
  59. package/dist/src/core/logger.test.js +157 -11
  60. package/dist/src/core/logger.test.js.map +1 -1
  61. package/dist/src/core/loggingContentGenerator.d.ts +25 -0
  62. package/dist/src/core/loggingContentGenerator.js +95 -0
  63. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  64. package/dist/src/core/nonInteractiveToolExecutor.js +39 -4
  65. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  66. package/dist/src/core/nonInteractiveToolExecutor.test.js +85 -62
  67. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  68. package/dist/src/core/prompts.js +43 -19
  69. package/dist/src/core/prompts.js.map +1 -1
  70. package/dist/src/core/prompts.test.js +118 -1
  71. package/dist/src/core/prompts.test.js.map +1 -1
  72. package/dist/src/core/subagent.d.ts +230 -0
  73. package/dist/src/core/subagent.js +447 -0
  74. package/dist/src/core/subagent.js.map +1 -0
  75. package/dist/src/core/subagent.test.js +515 -0
  76. package/dist/src/core/subagent.test.js.map +1 -0
  77. package/dist/src/core/tokenLimits.js +1 -0
  78. package/dist/src/core/tokenLimits.js.map +1 -1
  79. package/dist/src/core/turn.d.ts +3 -0
  80. package/dist/src/core/turn.js +4 -0
  81. package/dist/src/core/turn.js.map +1 -1
  82. package/dist/src/core/turn.test.js +4 -0
  83. package/dist/src/core/turn.test.js.map +1 -1
  84. package/dist/src/generated/git-commit.d.ts +7 -0
  85. package/dist/src/generated/git-commit.js +10 -0
  86. package/dist/src/generated/git-commit.js.map +1 -0
  87. package/dist/src/ide/constants.d.ts +6 -0
  88. package/dist/src/ide/constants.js +7 -0
  89. package/dist/src/ide/constants.js.map +1 -0
  90. package/dist/src/ide/detect-ide.d.ts +20 -0
  91. package/dist/src/ide/detect-ide.js +86 -0
  92. package/dist/src/ide/detect-ide.js.map +1 -0
  93. package/dist/src/ide/detect-ide.test.js +65 -0
  94. package/dist/src/ide/detect-ide.test.js.map +1 -0
  95. package/dist/src/ide/ide-client.d.ts +63 -0
  96. package/dist/src/ide/ide-client.js +320 -0
  97. package/dist/src/ide/ide-client.js.map +1 -0
  98. package/dist/src/ide/ide-client.test.d.ts +6 -0
  99. package/dist/src/ide/ide-client.test.js +43 -0
  100. package/dist/src/ide/ide-client.test.js.map +1 -0
  101. package/dist/src/ide/ide-installer.d.ts +14 -0
  102. package/dist/src/ide/ide-installer.js +98 -0
  103. package/dist/src/ide/ide-installer.js.map +1 -0
  104. package/dist/src/ide/ide-installer.test.d.ts +6 -0
  105. package/dist/src/ide/ide-installer.test.js +53 -0
  106. package/dist/src/ide/ide-installer.test.js.map +1 -0
  107. package/dist/src/ide/ideContext.d.ts +374 -0
  108. package/dist/src/ide/ideContext.js +147 -0
  109. package/dist/src/ide/ideContext.js.map +1 -0
  110. package/dist/src/ide/ideContext.test.d.ts +6 -0
  111. package/dist/src/ide/ideContext.test.js +265 -0
  112. package/dist/src/ide/ideContext.test.js.map +1 -0
  113. package/dist/src/ide/process-utils.d.ts +14 -0
  114. package/dist/src/ide/process-utils.js +57 -0
  115. package/dist/src/ide/process-utils.js.map +1 -0
  116. package/dist/src/index.d.ts +17 -1
  117. package/dist/src/index.js +20 -1
  118. package/dist/src/index.js.map +1 -1
  119. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  120. package/dist/src/mcp/google-auth-provider.js +72 -0
  121. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  122. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  123. package/dist/src/mcp/google-auth-provider.test.js +89 -0
  124. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  125. package/dist/src/mcp/oauth-provider.d.ts +6 -2
  126. package/dist/src/mcp/oauth-provider.js +208 -53
  127. package/dist/src/mcp/oauth-provider.js.map +1 -1
  128. package/dist/src/mcp/oauth-provider.test.js +222 -70
  129. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  130. package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
  131. package/dist/src/mcp/oauth-token-storage.js +3 -1
  132. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  133. package/dist/src/mcp/oauth-utils.d.ts +3 -1
  134. package/dist/src/mcp/oauth-utils.js +52 -14
  135. package/dist/src/mcp/oauth-utils.js.map +1 -1
  136. package/dist/src/mcp/oauth-utils.test.js +18 -3
  137. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  138. package/dist/src/mocks/msw.d.ts +6 -0
  139. package/dist/src/mocks/msw.js +8 -0
  140. package/dist/src/mocks/msw.js.map +1 -0
  141. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  142. package/dist/src/prompts/mcp-prompts.js +13 -0
  143. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  144. package/dist/src/prompts/prompt-registry.d.ts +34 -0
  145. package/dist/src/prompts/prompt-registry.js +63 -0
  146. package/dist/src/prompts/prompt-registry.js.map +1 -0
  147. package/dist/src/services/chatRecordingService.d.ts +150 -0
  148. package/dist/src/services/chatRecordingService.js +318 -0
  149. package/dist/src/services/chatRecordingService.js.map +1 -0
  150. package/dist/src/services/chatRecordingService.test.d.ts +6 -0
  151. package/dist/src/services/chatRecordingService.test.js +288 -0
  152. package/dist/src/services/chatRecordingService.test.js.map +1 -0
  153. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  154. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  155. package/dist/src/services/fileSystemService.d.ts +31 -0
  156. package/dist/src/services/fileSystemService.js +18 -0
  157. package/dist/src/services/fileSystemService.js.map +1 -0
  158. package/dist/src/services/fileSystemService.test.d.ts +6 -0
  159. package/dist/src/services/fileSystemService.test.js +41 -0
  160. package/dist/src/services/fileSystemService.test.js.map +1 -0
  161. package/dist/src/services/gitService.test.js +67 -86
  162. package/dist/src/services/gitService.test.js.map +1 -1
  163. package/dist/src/services/loopDetectionService.d.ts +51 -5
  164. package/dist/src/services/loopDetectionService.js +152 -45
  165. package/dist/src/services/loopDetectionService.js.map +1 -1
  166. package/dist/src/services/loopDetectionService.test.js +286 -89
  167. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  168. package/dist/src/services/shellExecutionService.d.ts +70 -0
  169. package/dist/src/services/shellExecutionService.js +175 -0
  170. package/dist/src/services/shellExecutionService.js.map +1 -0
  171. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  172. package/dist/src/services/shellExecutionService.test.js +282 -0
  173. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  174. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +81 -9
  175. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +356 -182
  176. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  177. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +17 -0
  178. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +342 -0
  179. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  180. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +19 -2
  181. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +51 -9
  182. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  183. package/dist/src/telemetry/constants.d.ts +4 -0
  184. package/dist/src/telemetry/constants.js +4 -0
  185. package/dist/src/telemetry/constants.js.map +1 -1
  186. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  187. package/dist/src/telemetry/file-exporters.js +62 -0
  188. package/dist/src/telemetry/file-exporters.js.map +1 -0
  189. package/dist/src/telemetry/index.d.ts +2 -2
  190. package/dist/src/telemetry/index.js +2 -2
  191. package/dist/src/telemetry/index.js.map +1 -1
  192. package/dist/src/telemetry/integration.test.circular.js +1 -0
  193. package/dist/src/telemetry/integration.test.circular.js.map +1 -1
  194. package/dist/src/telemetry/loggers.d.ts +6 -1
  195. package/dist/src/telemetry/loggers.js +87 -6
  196. package/dist/src/telemetry/loggers.js.map +1 -1
  197. package/dist/src/telemetry/loggers.test.circular.js +9 -2
  198. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  199. package/dist/src/telemetry/loggers.test.js +51 -11
  200. package/dist/src/telemetry/loggers.test.js.map +1 -1
  201. package/dist/src/telemetry/metrics.d.ts +7 -2
  202. package/dist/src/telemetry/metrics.js +26 -6
  203. package/dist/src/telemetry/metrics.js.map +1 -1
  204. package/dist/src/telemetry/metrics.test.js +81 -1
  205. package/dist/src/telemetry/metrics.test.js.map +1 -1
  206. package/dist/src/telemetry/sdk.d.ts +1 -1
  207. package/dist/src/telemetry/sdk.js +77 -30
  208. package/dist/src/telemetry/sdk.js.map +1 -1
  209. package/dist/src/telemetry/sdk.test.d.ts +6 -0
  210. package/dist/src/telemetry/sdk.test.js +82 -0
  211. package/dist/src/telemetry/sdk.test.js.map +1 -0
  212. package/dist/src/telemetry/telemetry.test.js +2 -2
  213. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  214. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  215. package/dist/src/telemetry/tool-call-decision.js +29 -0
  216. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  217. package/dist/src/telemetry/types.d.ts +74 -18
  218. package/dist/src/telemetry/types.js +110 -32
  219. package/dist/src/telemetry/types.js.map +1 -1
  220. package/dist/src/telemetry/uiTelemetry.d.ts +8 -1
  221. package/dist/src/telemetry/uiTelemetry.js +17 -2
  222. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  223. package/dist/src/telemetry/uiTelemetry.test.js +60 -10
  224. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  225. package/dist/src/test-utils/config.d.ts +16 -0
  226. package/dist/src/test-utils/config.js +32 -0
  227. package/dist/src/test-utils/config.js.map +1 -0
  228. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  229. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  230. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  231. package/dist/src/test-utils/tools.d.ts +44 -0
  232. package/dist/src/test-utils/tools.js +105 -0
  233. package/dist/src/test-utils/tools.js.map +1 -0
  234. package/dist/src/tools/diffOptions.d.ts +2 -0
  235. package/dist/src/tools/diffOptions.js +28 -0
  236. package/dist/src/tools/diffOptions.js.map +1 -1
  237. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  238. package/dist/src/tools/diffOptions.test.js +119 -0
  239. package/dist/src/tools/diffOptions.test.js.map +1 -0
  240. package/dist/src/tools/edit.d.ts +10 -34
  241. package/dist/src/tools/edit.js +171 -131
  242. package/dist/src/tools/edit.js.map +1 -1
  243. package/dist/src/tools/edit.test.js +220 -43
  244. package/dist/src/tools/edit.test.js.map +1 -1
  245. package/dist/src/tools/glob.d.ts +4 -11
  246. package/dist/src/tools/glob.js +129 -97
  247. package/dist/src/tools/glob.js.map +1 -1
  248. package/dist/src/tools/glob.test.js +73 -17
  249. package/dist/src/tools/glob.test.js.map +1 -1
  250. package/dist/src/tools/grep.d.ts +5 -37
  251. package/dist/src/tools/grep.js +175 -100
  252. package/dist/src/tools/grep.js.map +1 -1
  253. package/dist/src/tools/grep.test.js +112 -28
  254. package/dist/src/tools/grep.test.js.map +1 -1
  255. package/dist/src/tools/ls.d.ts +4 -23
  256. package/dist/src/tools/ls.js +77 -78
  257. package/dist/src/tools/ls.js.map +1 -1
  258. package/dist/src/tools/ls.test.d.ts +6 -0
  259. package/dist/src/tools/ls.test.js +384 -0
  260. package/dist/src/tools/ls.test.js.map +1 -0
  261. package/dist/src/tools/mcp-client-manager.d.ts +38 -0
  262. package/dist/src/tools/mcp-client-manager.js +74 -0
  263. package/dist/src/tools/mcp-client-manager.js.map +1 -0
  264. package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
  265. package/dist/src/tools/mcp-client-manager.test.js +39 -0
  266. package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
  267. package/dist/src/tools/mcp-client.d.ts +86 -4
  268. package/dist/src/tools/mcp-client.js +730 -59
  269. package/dist/src/tools/mcp-client.js.map +1 -1
  270. package/dist/src/tools/mcp-client.test.js +295 -22
  271. package/dist/src/tools/mcp-client.test.js.map +1 -1
  272. package/dist/src/tools/mcp-tool.d.ts +6 -13
  273. package/dist/src/tools/mcp-tool.js +163 -76
  274. package/dist/src/tools/mcp-tool.js.map +1 -1
  275. package/dist/src/tools/mcp-tool.test.js +400 -29
  276. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  277. package/dist/src/tools/memoryTool.d.ts +14 -3
  278. package/dist/src/tools/memoryTool.js +159 -40
  279. package/dist/src/tools/memoryTool.js.map +1 -1
  280. package/dist/src/tools/memoryTool.test.js +116 -11
  281. package/dist/src/tools/memoryTool.test.js.map +1 -1
  282. package/dist/src/tools/modifiable-tool.d.ts +9 -6
  283. package/dist/src/tools/modifiable-tool.js +6 -3
  284. package/dist/src/tools/modifiable-tool.js.map +1 -1
  285. package/dist/src/tools/modifiable-tool.test.js +63 -74
  286. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  287. package/dist/src/tools/read-file.d.ts +4 -6
  288. package/dist/src/tools/read-file.js +100 -53
  289. package/dist/src/tools/read-file.js.map +1 -1
  290. package/dist/src/tools/read-file.test.js +238 -111
  291. package/dist/src/tools/read-file.test.js.map +1 -1
  292. package/dist/src/tools/read-many-files.d.ts +3 -6
  293. package/dist/src/tools/read-many-files.js +232 -157
  294. package/dist/src/tools/read-many-files.js.map +1 -1
  295. package/dist/src/tools/read-many-files.test.js +231 -34
  296. package/dist/src/tools/read-many-files.test.js.map +1 -1
  297. package/dist/src/tools/shell.d.ts +6 -28
  298. package/dist/src/tools/shell.js +249 -366
  299. package/dist/src/tools/shell.js.map +1 -1
  300. package/dist/src/tools/shell.test.js +305 -384
  301. package/dist/src/tools/shell.test.js.map +1 -1
  302. package/dist/src/tools/tool-error.d.ts +27 -0
  303. package/dist/src/tools/tool-error.js +32 -0
  304. package/dist/src/tools/tool-error.js.map +1 -0
  305. package/dist/src/tools/tool-registry.d.ts +38 -23
  306. package/dist/src/tools/tool-registry.js +127 -99
  307. package/dist/src/tools/tool-registry.js.map +1 -1
  308. package/dist/src/tools/tool-registry.test.js +37 -212
  309. package/dist/src/tools/tool-registry.test.js.map +1 -1
  310. package/dist/src/tools/tools.d.ts +145 -92
  311. package/dist/src/tools/tools.js +188 -61
  312. package/dist/src/tools/tools.js.map +1 -1
  313. package/dist/src/tools/tools.test.d.ts +6 -0
  314. package/dist/src/tools/tools.test.js +206 -0
  315. package/dist/src/tools/tools.test.js.map +1 -0
  316. package/dist/src/tools/web-fetch.d.ts +4 -7
  317. package/dist/src/tools/web-fetch.js +58 -64
  318. package/dist/src/tools/web-fetch.js.map +1 -1
  319. package/dist/src/tools/web-fetch.test.js +8 -4
  320. package/dist/src/tools/web-fetch.test.js.map +1 -1
  321. package/dist/src/tools/web-search.d.ts +4 -5
  322. package/dist/src/tools/web-search.js +47 -51
  323. package/dist/src/tools/web-search.js.map +1 -1
  324. package/dist/src/tools/web-search.test.d.ts +6 -0
  325. package/dist/src/tools/web-search.test.js +139 -0
  326. package/dist/src/tools/web-search.test.js.map +1 -0
  327. package/dist/src/tools/write-file.d.ts +20 -11
  328. package/dist/src/tools/write-file.js +198 -141
  329. package/dist/src/tools/write-file.js.map +1 -1
  330. package/dist/src/tools/write-file.test.js +190 -76
  331. package/dist/src/tools/write-file.test.js.map +1 -1
  332. package/dist/src/utils/bfsFileSearch.js +51 -27
  333. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  334. package/dist/src/utils/bfsFileSearch.test.js +137 -136
  335. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  336. package/dist/src/utils/browser.js +4 -3
  337. package/dist/src/utils/browser.js.map +1 -1
  338. package/dist/src/utils/editCorrector.js +23 -24
  339. package/dist/src/utils/editCorrector.js.map +1 -1
  340. package/dist/src/utils/editor.d.ts +2 -2
  341. package/dist/src/utils/editor.js +23 -6
  342. package/dist/src/utils/editor.js.map +1 -1
  343. package/dist/src/utils/editor.test.js +67 -15
  344. package/dist/src/utils/editor.test.js.map +1 -1
  345. package/dist/src/utils/environmentContext.d.ts +21 -0
  346. package/dist/src/utils/environmentContext.js +90 -0
  347. package/dist/src/utils/environmentContext.js.map +1 -0
  348. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  349. package/dist/src/utils/environmentContext.test.js +140 -0
  350. package/dist/src/utils/environmentContext.test.js.map +1 -0
  351. package/dist/src/utils/errorParsing.d.ts +8 -0
  352. package/dist/src/utils/errorParsing.js +93 -0
  353. package/dist/src/utils/errorParsing.js.map +1 -0
  354. package/dist/src/utils/errorParsing.test.d.ts +6 -0
  355. package/dist/src/utils/errorParsing.test.js +172 -0
  356. package/dist/src/utils/errorParsing.test.js.map +1 -0
  357. package/dist/src/utils/errorReporting.d.ts +1 -1
  358. package/dist/src/utils/errorReporting.js +2 -2
  359. package/dist/src/utils/errorReporting.js.map +1 -1
  360. package/dist/src/utils/errorReporting.test.js +44 -38
  361. package/dist/src/utils/errorReporting.test.js.map +1 -1
  362. package/dist/src/utils/fileUtils.d.ts +9 -1
  363. package/dist/src/utils/fileUtils.js +27 -13
  364. package/dist/src/utils/fileUtils.js.map +1 -1
  365. package/dist/src/utils/fileUtils.test.js +61 -18
  366. package/dist/src/utils/fileUtils.test.js.map +1 -1
  367. package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
  368. package/dist/src/utils/filesearch/crawlCache.js +57 -0
  369. package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
  370. package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
  371. package/dist/src/utils/filesearch/crawlCache.test.js +103 -0
  372. package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
  373. package/dist/src/utils/filesearch/crawler.d.ts +15 -0
  374. package/dist/src/utils/filesearch/crawler.js +50 -0
  375. package/dist/src/utils/filesearch/crawler.js.map +1 -0
  376. package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  377. package/dist/src/utils/filesearch/crawler.test.js +468 -0
  378. package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
  379. package/dist/src/utils/filesearch/fileSearch.d.ts +37 -0
  380. package/dist/src/utils/filesearch/fileSearch.js +186 -0
  381. package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
  382. package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
  383. package/dist/src/utils/filesearch/fileSearch.test.js +552 -0
  384. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
  385. package/dist/src/utils/filesearch/ignore.d.ts +42 -0
  386. package/dist/src/utils/filesearch/ignore.js +106 -0
  387. package/dist/src/utils/filesearch/ignore.js.map +1 -0
  388. package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
  389. package/dist/src/utils/filesearch/ignore.test.js +144 -0
  390. package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
  391. package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
  392. package/dist/src/utils/filesearch/result-cache.js +59 -0
  393. package/dist/src/utils/filesearch/result-cache.js.map +1 -0
  394. package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
  395. package/dist/src/utils/filesearch/result-cache.test.js +46 -0
  396. package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
  397. package/dist/src/utils/flashFallback.integration.test.js +6 -0
  398. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  399. package/dist/src/utils/formatters.d.ts +6 -0
  400. package/dist/src/utils/formatters.js +16 -0
  401. package/dist/src/utils/formatters.js.map +1 -0
  402. package/dist/src/utils/getFolderStructure.test.js +11 -13
  403. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  404. package/dist/src/utils/gitIgnoreParser.js +5 -11
  405. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  406. package/dist/src/utils/gitIgnoreParser.test.js +58 -61
  407. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  408. package/dist/src/utils/memoryDiscovery.d.ts +1 -1
  409. package/dist/src/utils/memoryDiscovery.js +76 -83
  410. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  411. package/dist/src/utils/memoryDiscovery.test.js +122 -372
  412. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  413. package/dist/src/utils/memoryImportProcessor.d.ts +19 -12
  414. package/dist/src/utils/memoryImportProcessor.js +240 -85
  415. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  416. package/dist/src/utils/memoryImportProcessor.test.js +593 -51
  417. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  418. package/dist/src/utils/nextSpeakerChecker.js +4 -25
  419. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  420. package/dist/src/utils/partUtils.d.ts +14 -0
  421. package/dist/src/utils/partUtils.js +65 -0
  422. package/dist/src/utils/partUtils.js.map +1 -0
  423. package/dist/src/utils/partUtils.test.d.ts +6 -0
  424. package/dist/src/utils/partUtils.test.js +130 -0
  425. package/dist/src/utils/partUtils.test.js.map +1 -0
  426. package/dist/src/utils/paths.d.ts +18 -2
  427. package/dist/src/utils/paths.js +39 -7
  428. package/dist/src/utils/paths.js.map +1 -1
  429. package/dist/src/utils/paths.test.d.ts +6 -0
  430. package/dist/src/utils/paths.test.js +225 -0
  431. package/dist/src/utils/paths.test.js.map +1 -0
  432. package/dist/src/utils/quotaErrorDetection.d.ts +1 -5
  433. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  434. package/dist/src/utils/retry.d.ts +3 -0
  435. package/dist/src/utils/retry.js.map +1 -1
  436. package/dist/src/utils/retry.test.js.map +1 -1
  437. package/dist/src/utils/schemaValidator.d.ts +1 -8
  438. package/dist/src/utils/schemaValidator.js +1 -32
  439. package/dist/src/utils/schemaValidator.js.map +1 -1
  440. package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
  441. package/dist/src/utils/secure-browser-launcher.js +165 -0
  442. package/dist/src/utils/secure-browser-launcher.js.map +1 -0
  443. package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  444. package/dist/src/utils/secure-browser-launcher.test.js +149 -0
  445. package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  446. package/dist/src/utils/shell-utils.d.ts +117 -0
  447. package/dist/src/utils/shell-utils.js +376 -0
  448. package/dist/src/utils/shell-utils.js.map +1 -0
  449. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  450. package/dist/src/utils/shell-utils.test.js +328 -0
  451. package/dist/src/utils/shell-utils.test.js.map +1 -0
  452. package/dist/src/utils/summarizer.js +3 -32
  453. package/dist/src/utils/summarizer.js.map +1 -1
  454. package/dist/src/utils/systemEncoding.js +1 -1
  455. package/dist/src/utils/systemEncoding.js.map +1 -1
  456. package/dist/src/utils/systemEncoding.test.js +23 -23
  457. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  458. package/dist/src/utils/textUtils.d.ts +13 -0
  459. package/dist/src/utils/textUtils.js +28 -0
  460. package/dist/src/utils/textUtils.js.map +1 -0
  461. package/dist/src/utils/user_account.js +58 -48
  462. package/dist/src/utils/user_account.js.map +1 -1
  463. package/dist/src/utils/user_account.test.js +76 -9
  464. package/dist/src/utils/user_account.test.js.map +1 -1
  465. package/dist/src/utils/workspaceContext.d.ts +66 -0
  466. package/dist/src/utils/workspaceContext.js +165 -0
  467. package/dist/src/utils/workspaceContext.js.map +1 -0
  468. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  469. package/dist/src/utils/workspaceContext.test.js +293 -0
  470. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  471. package/dist/tsconfig.tsbuildinfo +1 -1
  472. package/package.json +14 -3
  473. package/dist/src/core/geminiRequest.test.js +0 -72
  474. package/dist/src/core/geminiRequest.test.js.map +0 -1
  475. package/dist/src/core/modelCheck.d.ts +0 -14
  476. package/dist/src/core/modelCheck.js +0 -62
  477. package/dist/src/core/modelCheck.js.map +0 -1
  478. package/dist/src/services/ideContext.d.ts +0 -178
  479. package/dist/src/services/ideContext.js +0 -105
  480. package/dist/src/services/ideContext.js.map +0 -1
  481. package/dist/src/services/ideContext.test.js +0 -111
  482. package/dist/src/services/ideContext.test.js.map +0 -1
  483. /package/dist/src/core/{geminiRequest.test.d.ts → subagent.test.d.ts} +0 -0
  484. /package/dist/src/{services/ideContext.test.d.ts → ide/detect-ide.test.d.ts} +0 -0
@@ -3,34 +3,102 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { Buffer } from 'buffer';
7
- import * as https from 'https';
8
6
  import { HttpsProxyAgent } from 'https-proxy-agent';
9
- import { EndSessionEvent, } from '../types.js';
10
7
  import { EventMetadataKey } from './event-metadata-key.js';
11
- import { getInstallationId } from '../../utils/user_id.js';
12
- import { getCachedGoogleAccount, getLifetimeGoogleAccounts, } from '../../utils/user_account.js';
13
8
  import { safeJsonStringify } from '../../utils/safeJsonStringify.js';
14
- const start_session_event_name = 'start_session';
15
- const new_prompt_event_name = 'new_prompt';
16
- const tool_call_event_name = 'tool_call';
17
- const api_request_event_name = 'api_request';
18
- const api_response_event_name = 'api_response';
19
- const api_error_event_name = 'api_error';
20
- const end_session_event_name = 'end_session';
21
- const flash_fallback_event_name = 'flash_fallback';
22
- const loop_detected_event_name = 'loop_detected';
9
+ import { getCachedGoogleAccount, getLifetimeGoogleAccounts, } from '../../utils/user_account.js';
10
+ import { getInstallationId } from '../../utils/user_id.js';
11
+ import { FixedDeque } from 'mnemonist';
12
+ import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js';
13
+ import { DetectedIde, detectIde } from '../../ide/detect-ide.js';
14
+ export var EventNames;
15
+ (function (EventNames) {
16
+ EventNames["START_SESSION"] = "start_session";
17
+ EventNames["NEW_PROMPT"] = "new_prompt";
18
+ EventNames["TOOL_CALL"] = "tool_call";
19
+ EventNames["API_REQUEST"] = "api_request";
20
+ EventNames["API_RESPONSE"] = "api_response";
21
+ EventNames["API_ERROR"] = "api_error";
22
+ EventNames["END_SESSION"] = "end_session";
23
+ EventNames["FLASH_FALLBACK"] = "flash_fallback";
24
+ EventNames["LOOP_DETECTED"] = "loop_detected";
25
+ EventNames["NEXT_SPEAKER_CHECK"] = "next_speaker_check";
26
+ EventNames["SLASH_COMMAND"] = "slash_command";
27
+ EventNames["MALFORMED_JSON_RESPONSE"] = "malformed_json_response";
28
+ EventNames["IDE_CONNECTION"] = "ide_connection";
29
+ EventNames["KITTY_SEQUENCE_OVERFLOW"] = "kitty_sequence_overflow";
30
+ EventNames["CHAT_COMPRESSION"] = "chat_compression";
31
+ })(EventNames || (EventNames = {}));
32
+ /**
33
+ * Determine the surface that the user is currently using. Surface is effectively the
34
+ * distribution channel in which the user is using Gemini CLI. Gemini CLI comes bundled
35
+ * w/ Firebase Studio and Cloud Shell. Users that manually download themselves will
36
+ * likely be "SURFACE_NOT_SET".
37
+ *
38
+ * This is computed based upon a series of environment variables these distribution
39
+ * methods might have in their runtimes.
40
+ */
41
+ function determineSurface() {
42
+ if (process.env['SURFACE']) {
43
+ return process.env['SURFACE'];
44
+ }
45
+ else if (process.env['GITHUB_SHA']) {
46
+ return 'GitHub';
47
+ }
48
+ else if (process.env['TERM_PROGRAM'] === 'vscode') {
49
+ return detectIde() || DetectedIde.VSCode;
50
+ }
51
+ else {
52
+ return 'SURFACE_NOT_SET';
53
+ }
54
+ }
55
+ /**
56
+ * Clearcut URL to send logging events to.
57
+ */
58
+ const CLEARCUT_URL = 'https://play.googleapis.com/log?format=json&hasfast=true';
59
+ /**
60
+ * Interval in which buffered events are sent to clearcut.
61
+ */
62
+ const FLUSH_INTERVAL_MS = 1000 * 60;
63
+ /**
64
+ * Maximum amount of events to keep in memory. Events added after this amount
65
+ * are dropped until the next flush to clearcut, which happens periodically as
66
+ * defined by {@link FLUSH_INTERVAL_MS}.
67
+ */
68
+ const MAX_EVENTS = 1000;
69
+ /**
70
+ * Maximum events to retry after a failed clearcut flush
71
+ */
72
+ const MAX_RETRY_EVENTS = 100;
23
73
  // Singleton class for batch posting log events to Clearcut. When a new event comes in, the elapsed time
24
74
  // is checked and events are flushed to Clearcut if at least a minute has passed since the last flush.
25
75
  export class ClearcutLogger {
26
76
  static instance;
27
77
  config;
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Clearcut expects this format.
29
- events = [];
30
- last_flush_time = Date.now();
31
- flush_interval_ms = 1000 * 60; // Wait at least a minute before flushing events.
78
+ sessionData = [];
79
+ promptId = '';
80
+ /**
81
+ * Queue of pending events that need to be flushed to the server. New events
82
+ * are added to this queue and then flushed on demand (via `flushToClearcut`)
83
+ */
84
+ events;
85
+ /**
86
+ * The last time that the events were successfully flushed to the server.
87
+ */
88
+ lastFlushTime = Date.now();
89
+ /**
90
+ * the value is true when there is a pending flush happening. This prevents
91
+ * concurrent flush operations.
92
+ */
93
+ flushing = false;
94
+ /**
95
+ * This value is true when a flush was requested during an ongoing flush.
96
+ */
97
+ pendingFlush = false;
32
98
  constructor(config) {
33
99
  this.config = config;
100
+ this.events = new FixedDeque(Array, MAX_EVENTS);
101
+ this.promptId = config?.getSessionId() ?? '';
34
102
  }
35
103
  static getInstance(config) {
36
104
  if (config === undefined || !config?.getUsageStatisticsEnabled())
@@ -40,27 +108,44 @@ export class ClearcutLogger {
40
108
  }
41
109
  return ClearcutLogger.instance;
42
110
  }
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Clearcut expects this format.
111
+ /** For testing purposes only. */
112
+ static clearInstance() {
113
+ // @ts-expect-error - ClearcutLogger is a singleton, but we need to clear it for tests.
114
+ ClearcutLogger.instance = undefined;
115
+ }
44
116
  enqueueLogEvent(event) {
45
- this.events.push([
46
- {
47
- event_time_ms: Date.now(),
48
- source_extension_json: safeJsonStringify(event),
49
- },
50
- ]);
117
+ try {
118
+ // Manually handle overflow for FixedDeque, which throws when full.
119
+ const wasAtCapacity = this.events.size >= MAX_EVENTS;
120
+ if (wasAtCapacity) {
121
+ this.events.shift(); // Evict oldest element to make space.
122
+ }
123
+ this.events.push([
124
+ {
125
+ event_time_ms: Date.now(),
126
+ source_extension_json: safeJsonStringify(event),
127
+ },
128
+ ]);
129
+ if (wasAtCapacity && this.config?.getDebugMode()) {
130
+ console.debug(`ClearcutLogger: Dropped old event to prevent memory leak (queue size: ${this.events.size})`);
131
+ }
132
+ }
133
+ catch (error) {
134
+ if (this.config?.getDebugMode()) {
135
+ console.error('ClearcutLogger: Failed to enqueue log event.', error);
136
+ }
137
+ }
51
138
  }
52
- createLogEvent(name, data) {
139
+ createLogEvent(eventName, data = []) {
53
140
  const email = getCachedGoogleAccount();
54
- const totalAccounts = getLifetimeGoogleAccounts();
55
- data.push({
56
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_GOOGLE_ACCOUNTS_COUNT,
57
- value: totalAccounts.toString(),
58
- });
59
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
141
+ if (eventName !== EventNames.START_SESSION) {
142
+ data.push(...this.sessionData);
143
+ }
144
+ data = this.addDefaultFields(data);
60
145
  const logEvent = {
61
146
  console_type: 'GEMINI_CLI',
62
- application: 102,
63
- event_name: name,
147
+ application: 102, // GEMINI_CLI
148
+ event_name: eventName,
64
149
  event_metadata: [data],
65
150
  };
66
151
  // Should log either email or install ID, not both. See go/cloudmill-1p-oss-instrumentation#define-sessionable-id
@@ -73,115 +158,86 @@ export class ClearcutLogger {
73
158
  return logEvent;
74
159
  }
75
160
  flushIfNeeded() {
76
- if (Date.now() - this.last_flush_time < this.flush_interval_ms) {
161
+ if (Date.now() - this.lastFlushTime < FLUSH_INTERVAL_MS) {
77
162
  return;
78
163
  }
79
164
  this.flushToClearcut().catch((error) => {
80
165
  console.debug('Error flushing to Clearcut:', error);
81
166
  });
82
167
  }
83
- flushToClearcut() {
168
+ async flushToClearcut() {
169
+ if (this.flushing) {
170
+ if (this.config?.getDebugMode()) {
171
+ console.debug('ClearcutLogger: Flush already in progress, marking pending flush.');
172
+ }
173
+ this.pendingFlush = true;
174
+ return Promise.resolve({});
175
+ }
176
+ this.flushing = true;
84
177
  if (this.config?.getDebugMode()) {
85
178
  console.log('Flushing log events to Clearcut.');
86
179
  }
87
- const eventsToSend = [...this.events];
88
- this.events.length = 0;
89
- return new Promise((resolve, reject) => {
90
- const request = [
91
- {
92
- log_source_name: 'CONCORD',
93
- request_time_ms: Date.now(),
94
- log_event: eventsToSend,
95
- },
96
- ];
97
- const body = safeJsonStringify(request);
98
- const options = {
99
- hostname: 'play.googleapis.com',
100
- path: '/log',
180
+ const eventsToSend = this.events.toArray();
181
+ this.events.clear();
182
+ const request = [
183
+ {
184
+ log_source_name: 'CONCORD',
185
+ request_time_ms: Date.now(),
186
+ log_event: eventsToSend,
187
+ },
188
+ ];
189
+ let result = {};
190
+ try {
191
+ const response = await fetch(CLEARCUT_URL, {
101
192
  method: 'POST',
102
- headers: { 'Content-Length': Buffer.byteLength(body) },
103
- };
104
- const bufs = [];
105
- const req = https.request({
106
- ...options,
107
- agent: this.getProxyAgent(),
108
- }, (res) => {
109
- res.on('data', (buf) => bufs.push(buf));
110
- res.on('end', () => {
111
- resolve(Buffer.concat(bufs));
112
- });
193
+ body: safeJsonStringify(request),
194
+ headers: {
195
+ 'Content-Type': 'application/json',
196
+ },
113
197
  });
114
- req.on('error', (e) => {
198
+ const responseBody = await response.text();
199
+ if (response.status >= 200 && response.status < 300) {
200
+ this.lastFlushTime = Date.now();
201
+ const nextRequestWaitMs = Number(JSON.parse(responseBody)[0]);
202
+ result = {
203
+ ...result,
204
+ nextRequestWaitMs,
205
+ };
206
+ }
207
+ else {
115
208
  if (this.config?.getDebugMode()) {
116
- console.log('Clearcut POST request error: ', e);
209
+ console.error(`Error flushing log events: HTTP ${response.status}: ${response.statusText}`);
117
210
  }
118
- // Add the events back to the front of the queue to be retried.
119
- this.events.unshift(...eventsToSend);
120
- reject(e);
121
- });
122
- req.end(body);
123
- })
124
- .then((buf) => {
125
- try {
126
- this.last_flush_time = Date.now();
127
- return this.decodeLogResponse(buf) || {};
128
- }
129
- catch (error) {
130
- console.error('Error flushing log events:', error);
131
- return {};
211
+ // Re-queue failed events for retry
212
+ this.requeueFailedEvents(eventsToSend);
132
213
  }
133
- })
134
- .catch((error) => {
135
- // Handle all errors to prevent unhandled promise rejections
136
- console.error('Error flushing log events:', error);
137
- // Return empty response to maintain the Promise<LogResponse> contract
138
- return {};
139
- });
140
- }
141
- // Visible for testing. Decodes protobuf-encoded response from Clearcut server.
142
- decodeLogResponse(buf) {
143
- // TODO(obrienowen): return specific errors to facilitate debugging.
144
- if (buf.length < 1) {
145
- return undefined;
146
214
  }
147
- // The first byte of the buffer is `field<<3 | type`. We're looking for field
148
- // 1, with type varint, represented by type=0. If the first byte isn't 8, that
149
- // means field 1 is missing or the message is corrupted. Either way, we return
150
- // undefined.
151
- if (buf.readUInt8(0) !== 8) {
152
- return undefined;
153
- }
154
- let ms = BigInt(0);
155
- let cont = true;
156
- // In each byte, the most significant bit is the continuation bit. If it's
157
- // set, we keep going. The lowest 7 bits, are data bits. They are concatenated
158
- // in reverse order to form the final number.
159
- for (let i = 1; cont && i < buf.length; i++) {
160
- const byte = buf.readUInt8(i);
161
- ms |= BigInt(byte & 0x7f) << BigInt(7 * (i - 1));
162
- cont = (byte & 0x80) !== 0;
215
+ catch (e) {
216
+ if (this.config?.getDebugMode()) {
217
+ console.error('Error flushing log events:', e);
218
+ }
219
+ // Re-queue failed events for retry
220
+ this.requeueFailedEvents(eventsToSend);
163
221
  }
164
- if (cont) {
165
- // We have fallen off the buffer without seeing a terminating byte. The
166
- // message is corrupted.
167
- return undefined;
222
+ this.flushing = false;
223
+ // If a flush was requested while we were flushing, flush again
224
+ if (this.pendingFlush) {
225
+ this.pendingFlush = false;
226
+ // Fire and forget the pending flush
227
+ this.flushToClearcut().catch((error) => {
228
+ if (this.config?.getDebugMode()) {
229
+ console.debug('Error in pending flush to Clearcut:', error);
230
+ }
231
+ });
168
232
  }
169
- const returnVal = {
170
- nextRequestWaitMs: Number(ms),
171
- };
172
- return returnVal;
233
+ return result;
173
234
  }
174
235
  logStartSessionEvent(event) {
175
- const surface = process.env.SURFACE || 'SURFACE_NOT_SET';
176
236
  const data = [
177
237
  {
178
238
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL,
179
239
  value: event.model,
180
240
  },
181
- {
182
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
183
- value: this.config?.getSessionId() ?? '',
184
- },
185
241
  {
186
242
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EMBEDDING_MODEL,
187
243
  value: event.embedding_model,
@@ -230,37 +286,23 @@ export class ClearcutLogger {
230
286
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED,
231
287
  value: event.telemetry_log_user_prompts_enabled.toString(),
232
288
  },
233
- {
234
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE,
235
- value: surface,
236
- },
237
289
  ];
290
+ this.sessionData = data;
238
291
  // Flush start event immediately
239
- this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data));
292
+ this.enqueueLogEvent(this.createLogEvent(EventNames.START_SESSION, data));
240
293
  this.flushToClearcut().catch((error) => {
241
294
  console.debug('Error flushing to Clearcut:', error);
242
295
  });
243
296
  }
244
297
  logNewPromptEvent(event) {
298
+ this.promptId = event.prompt_id;
245
299
  const data = [
246
300
  {
247
301
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH,
248
302
  value: JSON.stringify(event.prompt_length),
249
303
  },
250
- {
251
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
252
- value: this.config?.getSessionId() ?? '',
253
- },
254
- {
255
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
256
- value: JSON.stringify(event.prompt_id),
257
- },
258
- {
259
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
260
- value: JSON.stringify(event.auth_type),
261
- },
262
304
  ];
263
- this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data));
305
+ this.enqueueLogEvent(this.createLogEvent(EventNames.NEW_PROMPT, data));
264
306
  this.flushIfNeeded();
265
307
  }
266
308
  logToolCallEvent(event) {
@@ -269,10 +311,6 @@ export class ClearcutLogger {
269
311
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_NAME,
270
312
  value: JSON.stringify(event.function_name),
271
313
  },
272
- {
273
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
274
- value: JSON.stringify(event.prompt_id),
275
- },
276
314
  {
277
315
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION,
278
316
  value: JSON.stringify(event.decision),
@@ -293,8 +331,28 @@ export class ClearcutLogger {
293
331
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_ERROR_TYPE,
294
332
  value: JSON.stringify(event.error_type),
295
333
  },
334
+ {
335
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_TYPE,
336
+ value: JSON.stringify(event.tool_type),
337
+ },
296
338
  ];
297
- const logEvent = this.createLogEvent(tool_call_event_name, data);
339
+ if (event.metadata) {
340
+ const metadataMapping = {
341
+ ai_added_lines: EventMetadataKey.GEMINI_CLI_AI_ADDED_LINES,
342
+ ai_removed_lines: EventMetadataKey.GEMINI_CLI_AI_REMOVED_LINES,
343
+ user_added_lines: EventMetadataKey.GEMINI_CLI_USER_ADDED_LINES,
344
+ user_removed_lines: EventMetadataKey.GEMINI_CLI_USER_REMOVED_LINES,
345
+ };
346
+ for (const [key, gemini_cli_key] of Object.entries(metadataMapping)) {
347
+ if (event.metadata[key] !== undefined) {
348
+ data.push({
349
+ gemini_cli_key,
350
+ value: JSON.stringify(event.metadata[key]),
351
+ });
352
+ }
353
+ }
354
+ }
355
+ const logEvent = this.createLogEvent(EventNames.TOOL_CALL, data);
298
356
  this.enqueueLogEvent(logEvent);
299
357
  this.flushIfNeeded();
300
358
  }
@@ -304,12 +362,8 @@ export class ClearcutLogger {
304
362
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL,
305
363
  value: JSON.stringify(event.model),
306
364
  },
307
- {
308
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
309
- value: JSON.stringify(event.prompt_id),
310
- },
311
365
  ];
312
- this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data));
366
+ this.enqueueLogEvent(this.createLogEvent(EventNames.API_REQUEST, data));
313
367
  this.flushIfNeeded();
314
368
  }
315
369
  logApiResponseEvent(event) {
@@ -318,10 +372,6 @@ export class ClearcutLogger {
318
372
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_MODEL,
319
373
  value: JSON.stringify(event.model),
320
374
  },
321
- {
322
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
323
- value: JSON.stringify(event.prompt_id),
324
- },
325
375
  {
326
376
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE,
327
377
  value: JSON.stringify(event.status_code),
@@ -354,12 +404,8 @@ export class ClearcutLogger {
354
404
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_TOOL_TOKEN_COUNT,
355
405
  value: JSON.stringify(event.tool_token_count),
356
406
  },
357
- {
358
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
359
- value: JSON.stringify(event.auth_type),
360
- },
361
407
  ];
362
- this.enqueueLogEvent(this.createLogEvent(api_response_event_name, data));
408
+ this.enqueueLogEvent(this.createLogEvent(EventNames.API_RESPONSE, data));
363
409
  this.flushIfNeeded();
364
410
  }
365
411
  logApiErrorEvent(event) {
@@ -368,10 +414,6 @@ export class ClearcutLogger {
368
414
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_MODEL,
369
415
  value: JSON.stringify(event.model),
370
416
  },
371
- {
372
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
373
- value: JSON.stringify(event.prompt_id),
374
- },
375
417
  {
376
418
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE,
377
419
  value: JSON.stringify(event.error_type),
@@ -384,57 +426,155 @@ export class ClearcutLogger {
384
426
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_DURATION_MS,
385
427
  value: JSON.stringify(event.duration_ms),
386
428
  },
387
- {
388
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
389
- value: JSON.stringify(event.auth_type),
390
- },
391
429
  ];
392
- this.enqueueLogEvent(this.createLogEvent(api_error_event_name, data));
430
+ this.enqueueLogEvent(this.createLogEvent(EventNames.API_ERROR, data));
393
431
  this.flushIfNeeded();
394
432
  }
395
- logFlashFallbackEvent(event) {
433
+ logChatCompressionEvent(event) {
396
434
  const data = [
397
435
  {
398
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
399
- value: JSON.stringify(event.auth_type),
436
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_BEFORE,
437
+ value: `${event.tokens_before}`,
400
438
  },
401
439
  {
402
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
403
- value: this.config?.getSessionId() ?? '',
440
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_AFTER,
441
+ value: `${event.tokens_after}`,
404
442
  },
405
443
  ];
406
- this.enqueueLogEvent(this.createLogEvent(flash_fallback_event_name, data));
444
+ this.enqueueLogEvent(this.createLogEvent(EventNames.CHAT_COMPRESSION, data));
445
+ }
446
+ logFlashFallbackEvent() {
447
+ this.enqueueLogEvent(this.createLogEvent(EventNames.FLASH_FALLBACK, []));
407
448
  this.flushToClearcut().catch((error) => {
408
449
  console.debug('Error flushing to Clearcut:', error);
409
450
  });
410
451
  }
411
452
  logLoopDetectedEvent(event) {
412
453
  const data = [
413
- {
414
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
415
- value: this.config?.getSessionId() ?? '',
416
- },
417
454
  {
418
455
  gemini_cli_key: EventMetadataKey.GEMINI_CLI_LOOP_DETECTED_TYPE,
419
456
  value: JSON.stringify(event.loop_type),
420
457
  },
421
458
  ];
422
- this.enqueueLogEvent(this.createLogEvent(loop_detected_event_name, data));
459
+ this.enqueueLogEvent(this.createLogEvent(EventNames.LOOP_DETECTED, data));
423
460
  this.flushIfNeeded();
424
461
  }
425
- logEndSessionEvent(event) {
462
+ logNextSpeakerCheck(event) {
426
463
  const data = [
427
464
  {
428
- gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
429
- value: event?.session_id?.toString() ?? '',
465
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_RESPONSE_FINISH_REASON,
466
+ value: JSON.stringify(event.finish_reason),
467
+ },
468
+ {
469
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_NEXT_SPEAKER_CHECK_RESULT,
470
+ value: JSON.stringify(event.result),
471
+ },
472
+ ];
473
+ this.enqueueLogEvent(this.createLogEvent(EventNames.NEXT_SPEAKER_CHECK, data));
474
+ this.flushIfNeeded();
475
+ }
476
+ logSlashCommandEvent(event) {
477
+ const data = [
478
+ {
479
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_NAME,
480
+ value: JSON.stringify(event.command),
481
+ },
482
+ ];
483
+ if (event.subcommand) {
484
+ data.push({
485
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_SUBCOMMAND,
486
+ value: JSON.stringify(event.subcommand),
487
+ });
488
+ }
489
+ if (event.status) {
490
+ data.push({
491
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_STATUS,
492
+ value: JSON.stringify(event.status),
493
+ });
494
+ }
495
+ this.enqueueLogEvent(this.createLogEvent(EventNames.SLASH_COMMAND, data));
496
+ this.flushIfNeeded();
497
+ }
498
+ logMalformedJsonResponseEvent(event) {
499
+ const data = [
500
+ {
501
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_MALFORMED_JSON_RESPONSE_MODEL,
502
+ value: JSON.stringify(event.model),
503
+ },
504
+ ];
505
+ this.enqueueLogEvent(this.createLogEvent(EventNames.MALFORMED_JSON_RESPONSE, data));
506
+ this.flushIfNeeded();
507
+ }
508
+ logIdeConnectionEvent(event) {
509
+ const data = [
510
+ {
511
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_IDE_CONNECTION_TYPE,
512
+ value: JSON.stringify(event.connection_type),
430
513
  },
431
514
  ];
515
+ this.enqueueLogEvent(this.createLogEvent(EventNames.IDE_CONNECTION, data));
516
+ this.flushIfNeeded();
517
+ }
518
+ logKittySequenceOverflowEvent(event) {
519
+ const data = [
520
+ {
521
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_KITTY_SEQUENCE_LENGTH,
522
+ value: event.sequence_length.toString(),
523
+ },
524
+ {
525
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_KITTY_TRUNCATED_SEQUENCE,
526
+ value: event.truncated_sequence,
527
+ },
528
+ ];
529
+ this.enqueueLogEvent(this.createLogEvent(EventNames.KITTY_SEQUENCE_OVERFLOW, data));
530
+ this.flushIfNeeded();
531
+ }
532
+ logEndSessionEvent() {
432
533
  // Flush immediately on session end.
433
- this.enqueueLogEvent(this.createLogEvent(end_session_event_name, data));
534
+ this.enqueueLogEvent(this.createLogEvent(EventNames.END_SESSION, []));
434
535
  this.flushToClearcut().catch((error) => {
435
536
  console.debug('Error flushing to Clearcut:', error);
436
537
  });
437
538
  }
539
+ /**
540
+ * Adds default fields to data, and returns a new data array. This fields
541
+ * should exist on all log events.
542
+ */
543
+ addDefaultFields(data) {
544
+ const totalAccounts = getLifetimeGoogleAccounts();
545
+ const surface = determineSurface();
546
+ const defaultLogMetadata = [
547
+ {
548
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
549
+ value: this.config?.getSessionId() ?? '',
550
+ },
551
+ {
552
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
553
+ value: JSON.stringify(this.config?.getContentGeneratorConfig()?.authType),
554
+ },
555
+ {
556
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_GOOGLE_ACCOUNTS_COUNT,
557
+ value: `${totalAccounts}`,
558
+ },
559
+ {
560
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE,
561
+ value: surface,
562
+ },
563
+ {
564
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_VERSION,
565
+ value: CLI_VERSION,
566
+ },
567
+ {
568
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_GIT_COMMIT_HASH,
569
+ value: GIT_COMMIT_INFO,
570
+ },
571
+ {
572
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
573
+ value: this.promptId,
574
+ },
575
+ ];
576
+ return [...data, ...defaultLogMetadata];
577
+ }
438
578
  getProxyAgent() {
439
579
  const proxyUrl = this.config?.getProxy();
440
580
  if (!proxyUrl)
@@ -449,8 +589,42 @@ export class ClearcutLogger {
449
589
  }
450
590
  }
451
591
  shutdown() {
452
- const event = new EndSessionEvent(this.config);
453
- this.logEndSessionEvent(event);
592
+ this.logEndSessionEvent();
593
+ }
594
+ requeueFailedEvents(eventsToSend) {
595
+ // Add the events back to the front of the queue to be retried, but limit retry queue size
596
+ const eventsToRetry = eventsToSend.slice(-MAX_RETRY_EVENTS); // Keep only the most recent events
597
+ // Log a warning if we're dropping events
598
+ if (eventsToSend.length > MAX_RETRY_EVENTS && this.config?.getDebugMode()) {
599
+ console.warn(`ClearcutLogger: Dropping ${eventsToSend.length - MAX_RETRY_EVENTS} events due to retry queue limit. Total events: ${eventsToSend.length}, keeping: ${MAX_RETRY_EVENTS}`);
600
+ }
601
+ // Determine how many events can be re-queued
602
+ const availableSpace = MAX_EVENTS - this.events.size;
603
+ const numEventsToRequeue = Math.min(eventsToRetry.length, availableSpace);
604
+ if (numEventsToRequeue === 0) {
605
+ if (this.config?.getDebugMode()) {
606
+ console.debug(`ClearcutLogger: No events re-queued (queue size: ${this.events.size})`);
607
+ }
608
+ return;
609
+ }
610
+ // Get the most recent events to re-queue
611
+ const eventsToRequeue = eventsToRetry.slice(eventsToRetry.length - numEventsToRequeue);
612
+ // Prepend events to the front of the deque to be retried first.
613
+ // We iterate backwards to maintain the original order of the failed events.
614
+ for (let i = eventsToRequeue.length - 1; i >= 0; i--) {
615
+ this.events.unshift(eventsToRequeue[i]);
616
+ }
617
+ // Clear any potential overflow
618
+ while (this.events.size > MAX_EVENTS) {
619
+ this.events.pop();
620
+ }
621
+ if (this.config?.getDebugMode()) {
622
+ console.debug(`ClearcutLogger: Re-queued ${numEventsToRequeue} events for retry (queue size: ${this.events.size})`);
623
+ }
454
624
  }
455
625
  }
626
+ export const TEST_ONLY = {
627
+ MAX_RETRY_EVENTS,
628
+ MAX_EVENTS,
629
+ };
456
630
  //# sourceMappingURL=clearcut-logger.js.map