@machina.ai/cell-cli-core 1.8.2-rc1 → 1.11.0-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 (381) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +5 -3
  5. package/dist/src/agents/codebase-investigator.d.ts +36 -1
  6. package/dist/src/agents/codebase-investigator.js +93 -34
  7. package/dist/src/agents/codebase-investigator.js.map +1 -1
  8. package/dist/src/agents/executor.d.ts +15 -11
  9. package/dist/src/agents/executor.js +271 -115
  10. package/dist/src/agents/executor.js.map +1 -1
  11. package/dist/src/agents/executor.test.js +508 -242
  12. package/dist/src/agents/executor.test.js.map +1 -1
  13. package/dist/src/agents/invocation.d.ts +5 -2
  14. package/dist/src/agents/invocation.js +4 -2
  15. package/dist/src/agents/invocation.js.map +1 -1
  16. package/dist/src/agents/invocation.test.js +9 -0
  17. package/dist/src/agents/invocation.test.js.map +1 -1
  18. package/dist/src/agents/registry.d.ts +2 -1
  19. package/dist/src/agents/registry.js +28 -4
  20. package/dist/src/agents/registry.js.map +1 -1
  21. package/dist/src/agents/subagent-tool-wrapper.d.ts +3 -1
  22. package/dist/src/agents/subagent-tool-wrapper.js +4 -3
  23. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  24. package/dist/src/agents/subagent-tool-wrapper.test.js +8 -1
  25. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  26. package/dist/src/agents/types.d.ts +35 -6
  27. package/dist/src/agents/types.js +1 -0
  28. package/dist/src/agents/types.js.map +1 -1
  29. package/dist/src/code_assist/converter.d.ts +1 -0
  30. package/dist/src/code_assist/converter.js +1 -0
  31. package/dist/src/code_assist/converter.js.map +1 -1
  32. package/dist/src/code_assist/converter.test.js +19 -0
  33. package/dist/src/code_assist/converter.test.js.map +1 -1
  34. package/dist/src/code_assist/oauth-credential-storage.js +1 -1
  35. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  36. package/dist/src/code_assist/oauth-credential-storage.test.js +1 -1
  37. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  38. package/dist/src/code_assist/oauth2.js +13 -12
  39. package/dist/src/code_assist/oauth2.js.map +1 -1
  40. package/dist/src/code_assist/oauth2.test.js +14 -13
  41. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  42. package/dist/src/code_assist/setup.js +4 -2
  43. package/dist/src/code_assist/setup.js.map +1 -1
  44. package/dist/src/config/config.d.ts +58 -18
  45. package/dist/src/config/config.js +125 -36
  46. package/dist/src/config/config.js.map +1 -1
  47. package/dist/src/config/config.test.js +125 -18
  48. package/dist/src/config/config.test.js.map +1 -1
  49. package/dist/src/config/storage.d.ts +0 -1
  50. package/dist/src/config/storage.js +2 -2
  51. package/dist/src/config/storage.js.map +1 -1
  52. package/dist/src/config/storage.test.js +7 -6
  53. package/dist/src/config/storage.test.js.map +1 -1
  54. package/dist/src/confirmation-bus/message-bus.d.ts +2 -1
  55. package/dist/src/confirmation-bus/message-bus.js +7 -1
  56. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  57. package/dist/src/confirmation-bus/types.d.ts +12 -2
  58. package/dist/src/confirmation-bus/types.js +1 -0
  59. package/dist/src/confirmation-bus/types.js.map +1 -1
  60. package/dist/src/core/client.d.ts +3 -1
  61. package/dist/src/core/client.js +70 -19
  62. package/dist/src/core/client.js.map +1 -1
  63. package/dist/src/core/client.test.js +199 -25
  64. package/dist/src/core/client.test.js.map +1 -1
  65. package/dist/src/core/contentGenerator.js +3 -1
  66. package/dist/src/core/contentGenerator.js.map +1 -1
  67. package/dist/src/core/coreToolScheduler.d.ts +7 -0
  68. package/dist/src/core/coreToolScheduler.js +58 -22
  69. package/dist/src/core/coreToolScheduler.js.map +1 -1
  70. package/dist/src/core/coreToolScheduler.test.js +351 -3
  71. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  72. package/dist/src/core/geminiChat.d.ts +7 -11
  73. package/dist/src/core/geminiChat.js +33 -70
  74. package/dist/src/core/geminiChat.js.map +1 -1
  75. package/dist/src/core/geminiChat.test.js +93 -228
  76. package/dist/src/core/geminiChat.test.js.map +1 -1
  77. package/dist/src/core/logger.js +11 -10
  78. package/dist/src/core/logger.js.map +1 -1
  79. package/dist/src/core/logger.test.js +2 -2
  80. package/dist/src/core/logger.test.js.map +1 -1
  81. package/dist/src/core/nonInteractiveToolExecutor.d.ts +3 -2
  82. package/dist/src/core/nonInteractiveToolExecutor.js +2 -2
  83. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  84. package/dist/src/core/nonInteractiveToolExecutor.test.js +11 -8
  85. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  86. package/dist/src/core/prompts.d.ts +2 -1
  87. package/dist/src/core/prompts.js +58 -123
  88. package/dist/src/core/prompts.js.map +1 -1
  89. package/dist/src/core/prompts.test.js +83 -29
  90. package/dist/src/core/prompts.test.js.map +1 -1
  91. package/dist/src/core/turn.d.ts +16 -2
  92. package/dist/src/core/turn.js +15 -2
  93. package/dist/src/core/turn.js.map +1 -1
  94. package/dist/src/core/turn.test.js +62 -2
  95. package/dist/src/core/turn.test.js.map +1 -1
  96. package/dist/src/generated/git-commit.d.ts +2 -2
  97. package/dist/src/generated/git-commit.js +2 -2
  98. package/dist/src/generated/git-commit.js.map +1 -1
  99. package/dist/src/ide/detect-ide.test.js +11 -0
  100. package/dist/src/ide/detect-ide.test.js.map +1 -1
  101. package/dist/src/ide/ide-client.js +5 -4
  102. package/dist/src/ide/ide-client.js.map +1 -1
  103. package/dist/src/ide/ide-client.test.js +4 -4
  104. package/dist/src/ide/ide-installer.js +1 -1
  105. package/dist/src/ide/ide-installer.js.map +1 -1
  106. package/dist/src/ide/ide-installer.test.js +13 -1
  107. package/dist/src/ide/ide-installer.test.js.map +1 -1
  108. package/dist/src/ide/process-utils.js +85 -75
  109. package/dist/src/ide/process-utils.js.map +1 -1
  110. package/dist/src/ide/process-utils.test.js +83 -90
  111. package/dist/src/ide/process-utils.test.js.map +1 -1
  112. package/dist/src/index.d.ts +6 -0
  113. package/dist/src/index.js +6 -0
  114. package/dist/src/index.js.map +1 -1
  115. package/dist/src/mcp/oauth-provider.js +21 -20
  116. package/dist/src/mcp/oauth-provider.js.map +1 -1
  117. package/dist/src/mcp/oauth-utils.js +9 -8
  118. package/dist/src/mcp/oauth-utils.js.map +1 -1
  119. package/dist/src/mcp/oauth-utils.test.js +13 -2
  120. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  121. package/dist/src/mcp/token-storage/file-token-storage.js +2 -1
  122. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
  123. package/dist/src/mcp/token-storage/file-token-storage.test.js +4 -3
  124. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  125. package/dist/src/output/stream-json-formatter.d.ts +32 -0
  126. package/dist/src/output/stream-json-formatter.js +52 -0
  127. package/dist/src/output/stream-json-formatter.js.map +1 -0
  128. package/dist/src/output/stream-json-formatter.test.js +479 -0
  129. package/dist/src/output/stream-json-formatter.test.js.map +1 -0
  130. package/dist/src/output/types.d.ts +63 -1
  131. package/dist/src/output/types.js +11 -0
  132. package/dist/src/output/types.js.map +1 -1
  133. package/dist/src/prompts/prompt-registry.js +2 -1
  134. package/dist/src/prompts/prompt-registry.js.map +1 -1
  135. package/dist/src/routing/strategies/classifierStrategy.js +3 -2
  136. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  137. package/dist/src/services/chatRecordingService.d.ts +2 -1
  138. package/dist/src/services/chatRecordingService.js +2 -1
  139. package/dist/src/services/chatRecordingService.js.map +1 -1
  140. package/dist/src/services/loopDetectionService.js +3 -2
  141. package/dist/src/services/loopDetectionService.js.map +1 -1
  142. package/dist/src/services/shellExecutionService.d.ts +1 -0
  143. package/dist/src/services/shellExecutionService.js +177 -91
  144. package/dist/src/services/shellExecutionService.js.map +1 -1
  145. package/dist/src/services/shellExecutionService.test.js +113 -12
  146. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  147. package/dist/src/telemetry/activity-monitor.d.ts +116 -0
  148. package/dist/src/telemetry/activity-monitor.js +209 -0
  149. package/dist/src/telemetry/activity-monitor.js.map +1 -0
  150. package/dist/src/telemetry/activity-monitor.test.d.ts +6 -0
  151. package/dist/src/telemetry/activity-monitor.test.js +248 -0
  152. package/dist/src/telemetry/activity-monitor.test.js.map +1 -0
  153. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +15 -2
  154. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +154 -31
  155. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  156. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +84 -15
  157. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  158. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +16 -3
  159. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +38 -5
  160. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  161. package/dist/src/telemetry/constants.d.ts +0 -28
  162. package/dist/src/telemetry/constants.js +0 -29
  163. package/dist/src/telemetry/constants.js.map +1 -1
  164. package/dist/src/telemetry/index.d.ts +6 -3
  165. package/dist/src/telemetry/index.js +12 -4
  166. package/dist/src/telemetry/index.js.map +1 -1
  167. package/dist/src/telemetry/loggers.d.ts +8 -2
  168. package/dist/src/telemetry/loggers.js +165 -299
  169. package/dist/src/telemetry/loggers.js.map +1 -1
  170. package/dist/src/telemetry/loggers.test.js +213 -21
  171. package/dist/src/telemetry/loggers.test.js.map +1 -1
  172. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  173. package/dist/src/telemetry/memory-monitor.js +335 -0
  174. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  175. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  176. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  177. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  178. package/dist/src/telemetry/metrics.d.ts +131 -4
  179. package/dist/src/telemetry/metrics.js +182 -6
  180. package/dist/src/telemetry/metrics.js.map +1 -1
  181. package/dist/src/telemetry/metrics.test.js +360 -1
  182. package/dist/src/telemetry/metrics.test.js.map +1 -1
  183. package/dist/src/telemetry/sdk.js +3 -2
  184. package/dist/src/telemetry/sdk.js.map +1 -1
  185. package/dist/src/telemetry/telemetryAttributes.d.ts +8 -0
  186. package/dist/src/telemetry/telemetryAttributes.js +18 -0
  187. package/dist/src/telemetry/telemetryAttributes.js.map +1 -0
  188. package/dist/src/telemetry/types.d.ts +163 -7
  189. package/dist/src/telemetry/types.js +691 -38
  190. package/dist/src/telemetry/types.js.map +1 -1
  191. package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
  192. package/dist/src/telemetry/uiTelemetry.js +1 -1
  193. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  194. package/dist/src/telemetry/uiTelemetry.test.js +1 -1
  195. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  196. package/dist/src/tools/edit.js +8 -7
  197. package/dist/src/tools/edit.js.map +1 -1
  198. package/dist/src/tools/edit.test.js +0 -1
  199. package/dist/src/tools/edit.test.js.map +1 -1
  200. package/dist/src/tools/glob.d.ts +3 -2
  201. package/dist/src/tools/glob.js +8 -7
  202. package/dist/src/tools/glob.js.map +1 -1
  203. package/dist/src/tools/grep.d.ts +3 -2
  204. package/dist/src/tools/grep.js +20 -14
  205. package/dist/src/tools/grep.js.map +1 -1
  206. package/dist/src/tools/ls.d.ts +3 -2
  207. package/dist/src/tools/ls.js +8 -7
  208. package/dist/src/tools/ls.js.map +1 -1
  209. package/dist/src/tools/mcp-client-manager.d.ts +2 -9
  210. package/dist/src/tools/mcp-client-manager.js +6 -14
  211. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  212. package/dist/src/tools/mcp-client-manager.test.js +16 -6
  213. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  214. package/dist/src/tools/mcp-client.d.ts +3 -2
  215. package/dist/src/tools/mcp-client.js +49 -52
  216. package/dist/src/tools/mcp-client.js.map +1 -1
  217. package/dist/src/tools/mcp-client.test.js +168 -5
  218. package/dist/src/tools/mcp-client.test.js.map +1 -1
  219. package/dist/src/tools/mcp-tool.d.ts +2 -1
  220. package/dist/src/tools/mcp-tool.js +7 -3
  221. package/dist/src/tools/mcp-tool.js.map +1 -1
  222. package/dist/src/tools/memoryTool.d.ts +2 -2
  223. package/dist/src/tools/memoryTool.js +4 -4
  224. package/dist/src/tools/memoryTool.js.map +1 -1
  225. package/dist/src/tools/memoryTool.test.js +9 -8
  226. package/dist/src/tools/memoryTool.test.js.map +1 -1
  227. package/dist/src/tools/message-bus-integration.test.js +14 -1
  228. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  229. package/dist/src/tools/read-file.d.ts +4 -3
  230. package/dist/src/tools/read-file.js +9 -8
  231. package/dist/src/tools/read-file.js.map +1 -1
  232. package/dist/src/tools/read-many-files.d.ts +4 -3
  233. package/dist/src/tools/read-many-files.js +11 -8
  234. package/dist/src/tools/read-many-files.js.map +1 -1
  235. package/dist/src/tools/read-many-files.test.js +0 -1
  236. package/dist/src/tools/read-many-files.test.js.map +1 -1
  237. package/dist/src/tools/ripGrep.d.ts +3 -2
  238. package/dist/src/tools/ripGrep.js +47 -17
  239. package/dist/src/tools/ripGrep.js.map +1 -1
  240. package/dist/src/tools/ripGrep.test.js +106 -60
  241. package/dist/src/tools/ripGrep.test.js.map +1 -1
  242. package/dist/src/tools/shell.d.ts +1 -1
  243. package/dist/src/tools/shell.js +31 -14
  244. package/dist/src/tools/shell.js.map +1 -1
  245. package/dist/src/tools/shell.test.js +63 -9
  246. package/dist/src/tools/shell.test.js.map +1 -1
  247. package/dist/src/tools/smart-edit.d.ts +1 -20
  248. package/dist/src/tools/smart-edit.js +64 -61
  249. package/dist/src/tools/smart-edit.js.map +1 -1
  250. package/dist/src/tools/smart-edit.test.js +70 -87
  251. package/dist/src/tools/smart-edit.test.js.map +1 -1
  252. package/dist/src/tools/tool-error.d.ts +21 -0
  253. package/dist/src/tools/tool-error.js +27 -0
  254. package/dist/src/tools/tool-error.js.map +1 -1
  255. package/dist/src/tools/tool-names.d.ts +17 -0
  256. package/dist/src/tools/tool-names.js +21 -0
  257. package/dist/src/tools/tool-names.js.map +1 -0
  258. package/dist/src/tools/tool-registry.js +4 -3
  259. package/dist/src/tools/tool-registry.js.map +1 -1
  260. package/dist/src/tools/tools.d.ts +17 -10
  261. package/dist/src/tools/tools.js +54 -39
  262. package/dist/src/tools/tools.js.map +1 -1
  263. package/dist/src/tools/web-fetch.d.ts +11 -3
  264. package/dist/src/tools/web-fetch.js +90 -32
  265. package/dist/src/tools/web-fetch.js.map +1 -1
  266. package/dist/src/tools/web-fetch.test.js +388 -8
  267. package/dist/src/tools/web-fetch.test.js.map +1 -1
  268. package/dist/src/tools/web-search.d.ts +4 -3
  269. package/dist/src/tools/web-search.js +10 -7
  270. package/dist/src/tools/web-search.js.map +1 -1
  271. package/dist/src/tools/write-file.d.ts +1 -1
  272. package/dist/src/tools/write-file.js +3 -2
  273. package/dist/src/tools/write-file.js.map +1 -1
  274. package/dist/src/tools/write-file.test.js +0 -1
  275. package/dist/src/tools/write-file.test.js.map +1 -1
  276. package/dist/src/tools/write-todos.d.ts +3 -8
  277. package/dist/src/tools/write-todos.js +14 -7
  278. package/dist/src/tools/write-todos.js.map +1 -1
  279. package/dist/src/tools/write-todos.test.js +2 -2
  280. package/dist/src/tools/write-todos.test.js.map +1 -1
  281. package/dist/src/utils/bfsFileSearch.js +3 -2
  282. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  283. package/dist/src/utils/debugLogger.d.ts +25 -0
  284. package/dist/src/utils/debugLogger.js +33 -0
  285. package/dist/src/utils/debugLogger.js.map +1 -0
  286. package/dist/src/utils/debugLogger.test.d.ts +6 -0
  287. package/dist/src/utils/debugLogger.test.js +67 -0
  288. package/dist/src/utils/debugLogger.test.js.map +1 -0
  289. package/dist/src/utils/delay.d.ts +16 -0
  290. package/dist/src/utils/delay.js +43 -0
  291. package/dist/src/utils/delay.js.map +1 -0
  292. package/dist/src/utils/delay.test.d.ts +6 -0
  293. package/dist/src/utils/delay.test.js +88 -0
  294. package/dist/src/utils/delay.test.js.map +1 -0
  295. package/dist/src/utils/editCorrector.js +6 -10
  296. package/dist/src/utils/editCorrector.js.map +1 -1
  297. package/dist/src/utils/editCorrector.test.js +3 -5
  298. package/dist/src/utils/editCorrector.test.js.map +1 -1
  299. package/dist/src/utils/editor.js +33 -37
  300. package/dist/src/utils/editor.js.map +1 -1
  301. package/dist/src/utils/editor.test.js +1 -0
  302. package/dist/src/utils/editor.test.js.map +1 -1
  303. package/dist/src/utils/environmentContext.js +0 -33
  304. package/dist/src/utils/environmentContext.js.map +1 -1
  305. package/dist/src/utils/environmentContext.test.js +0 -34
  306. package/dist/src/utils/environmentContext.test.js.map +1 -1
  307. package/dist/src/utils/fetch.d.ts +1 -0
  308. package/dist/src/utils/fetch.js +9 -0
  309. package/dist/src/utils/fetch.js.map +1 -1
  310. package/dist/src/utils/fileUtils.d.ts +4 -0
  311. package/dist/src/utils/fileUtils.js +34 -2
  312. package/dist/src/utils/fileUtils.js.map +1 -1
  313. package/dist/src/utils/fileUtils.test.js +12 -1
  314. package/dist/src/utils/fileUtils.test.js.map +1 -1
  315. package/dist/src/utils/formatters.d.ts +1 -0
  316. package/dist/src/utils/formatters.js +2 -1
  317. package/dist/src/utils/formatters.js.map +1 -1
  318. package/dist/src/utils/formatters.test.d.ts +6 -0
  319. package/dist/src/utils/formatters.test.js +26 -0
  320. package/dist/src/utils/formatters.test.js.map +1 -0
  321. package/dist/src/utils/getFolderStructure.js +2 -1
  322. package/dist/src/utils/getFolderStructure.js.map +1 -1
  323. package/dist/src/utils/getFolderStructure.test.js +7 -6
  324. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  325. package/dist/src/utils/gitIgnoreParser.js +7 -6
  326. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  327. package/dist/src/utils/gitIgnoreParser.test.js +30 -0
  328. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  329. package/dist/src/utils/installationManager.test.js +2 -1
  330. package/dist/src/utils/installationManager.test.js.map +1 -1
  331. package/dist/src/utils/llm-edit-fixer.js +5 -4
  332. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  333. package/dist/src/utils/memoryDiscovery.d.ts +3 -1
  334. package/dist/src/utils/memoryDiscovery.js +14 -12
  335. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  336. package/dist/src/utils/memoryDiscovery.test.js +136 -36
  337. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  338. package/dist/src/utils/memoryImportProcessor.js +3 -2
  339. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  340. package/dist/src/utils/nextSpeakerChecker.js +2 -1
  341. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  342. package/dist/src/utils/pathCorrector.d.ts +25 -0
  343. package/dist/src/utils/pathCorrector.js +33 -0
  344. package/dist/src/utils/pathCorrector.js.map +1 -0
  345. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  346. package/dist/src/utils/pathCorrector.test.js +83 -0
  347. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  348. package/dist/src/utils/retry.d.ts +3 -1
  349. package/dist/src/utils/retry.js +44 -33
  350. package/dist/src/utils/retry.js.map +1 -1
  351. package/dist/src/utils/retry.test.js +102 -40
  352. package/dist/src/utils/retry.test.js.map +1 -1
  353. package/dist/src/utils/safeJsonStringify.d.ts +4 -4
  354. package/dist/src/utils/safeJsonStringify.js +31 -7
  355. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  356. package/dist/src/utils/shell-utils.d.ts +15 -2
  357. package/dist/src/utils/shell-utils.js +354 -137
  358. package/dist/src/utils/shell-utils.js.map +1 -1
  359. package/dist/src/utils/shell-utils.test.js +154 -60
  360. package/dist/src/utils/shell-utils.test.js.map +1 -1
  361. package/dist/src/utils/systemEncoding.js +5 -4
  362. package/dist/src/utils/systemEncoding.js.map +1 -1
  363. package/dist/src/utils/tool-utils.d.ts +2 -2
  364. package/dist/src/utils/tool-utils.js +15 -6
  365. package/dist/src/utils/tool-utils.js.map +1 -1
  366. package/dist/src/utils/tool-utils.test.js +8 -0
  367. package/dist/src/utils/tool-utils.test.js.map +1 -1
  368. package/dist/src/utils/userAccountManager.js +5 -4
  369. package/dist/src/utils/userAccountManager.js.map +1 -1
  370. package/dist/src/utils/userAccountManager.test.js +2 -1
  371. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  372. package/dist/src/utils/workspaceContext.js +2 -1
  373. package/dist/src/utils/workspaceContext.js.map +1 -1
  374. package/dist/tsconfig.tsbuildinfo +1 -1
  375. package/package.json +5 -3
  376. package/dist/src/core/subagent.d.ts +0 -236
  377. package/dist/src/core/subagent.js +0 -482
  378. package/dist/src/core/subagent.js.map +0 -1
  379. package/dist/src/core/subagent.test.js +0 -530
  380. package/dist/src/core/subagent.test.js.map +0 -1
  381. /package/dist/src/{core/subagent.test.d.ts → output/stream-json-formatter.test.d.ts} +0 -0
@@ -6,7 +6,8 @@
6
6
  import { describe, it, expect, vi, beforeEach } from 'vitest';
7
7
  import { FileOperation, MemoryMetricType, ToolExecutionPhase, ApiRequestPhase, } from './metrics.js';
8
8
  import { makeFakeConfig } from '../test-utils/config.js';
9
- import { ModelRoutingEvent } from './types.js';
9
+ import { ModelRoutingEvent, AgentFinishEvent } from './types.js';
10
+ import { AgentTerminateMode } from '../agents/types.js';
10
11
  const mockCounterAddFn = vi.fn();
11
12
  const mockHistogramRecordFn = vi.fn();
12
13
  const mockCreateCounterFn = vi.fn();
@@ -34,9 +35,15 @@ function originalOtelMockFactory() {
34
35
  setLogger: vi.fn(),
35
36
  warn: vi.fn(),
36
37
  },
38
+ DiagConsoleLogger: vi.fn(),
39
+ DiagLogLevel: {
40
+ NONE: 0,
41
+ INFO: 1,
42
+ },
37
43
  };
38
44
  }
39
45
  vi.mock('@opentelemetry/api');
46
+ vi.mock('./telemetryAttributes.js');
40
47
  describe('Telemetry Metrics', () => {
41
48
  let initializeMetricsModule;
42
49
  let recordTokenUsageMetricsModule;
@@ -53,6 +60,10 @@ describe('Telemetry Metrics', () => {
53
60
  let recordPerformanceScoreModule;
54
61
  let recordPerformanceRegressionModule;
55
62
  let recordBaselineComparisonModule;
63
+ let recordGenAiClientTokenUsageModule;
64
+ let recordGenAiClientOperationDurationModule;
65
+ let recordFlickerFrameModule;
66
+ let recordAgentRunMetricsModule;
56
67
  beforeEach(async () => {
57
68
  vi.resetModules();
58
69
  vi.doMock('@opentelemetry/api', () => {
@@ -60,6 +71,12 @@ describe('Telemetry Metrics', () => {
60
71
  actualApi.metrics.getMeter.mockReturnValue(mockMeterInstance);
61
72
  return actualApi;
62
73
  });
74
+ const { getCommonAttributes } = await import('./telemetryAttributes.js');
75
+ getCommonAttributes.mockReturnValue({
76
+ 'session.id': 'test-session-id',
77
+ 'installation.id': 'test-installation-id',
78
+ 'user.email': 'test@example.com',
79
+ });
63
80
  const metricsJsModule = await import('./metrics.js');
64
81
  initializeMetricsModule = metricsJsModule.initializeMetrics;
65
82
  recordTokenUsageMetricsModule = metricsJsModule.recordTokenUsageMetrics;
@@ -79,6 +96,12 @@ describe('Telemetry Metrics', () => {
79
96
  recordPerformanceRegressionModule =
80
97
  metricsJsModule.recordPerformanceRegression;
81
98
  recordBaselineComparisonModule = metricsJsModule.recordBaselineComparison;
99
+ recordGenAiClientTokenUsageModule =
100
+ metricsJsModule.recordGenAiClientTokenUsage;
101
+ recordGenAiClientOperationDurationModule =
102
+ metricsJsModule.recordGenAiClientOperationDuration;
103
+ recordFlickerFrameModule = metricsJsModule.recordFlickerFrame;
104
+ recordAgentRunMetricsModule = metricsJsModule.recordAgentRunMetrics;
82
105
  const otelApiModule = await import('@opentelemetry/api');
83
106
  mockCounterAddFn.mockClear();
84
107
  mockCreateCounterFn.mockClear();
@@ -89,6 +112,39 @@ describe('Telemetry Metrics', () => {
89
112
  mockCreateCounterFn.mockReturnValue(mockCounterInstance);
90
113
  mockCreateHistogramFn.mockReturnValue(mockHistogramInstance);
91
114
  });
115
+ describe('recordFlickerFrame', () => {
116
+ it('does not record metrics if not initialized', () => {
117
+ const config = makeFakeConfig({});
118
+ recordFlickerFrameModule(config);
119
+ expect(mockCounterAddFn).not.toHaveBeenCalled();
120
+ });
121
+ it('records a flicker frame event when initialized', () => {
122
+ const config = makeFakeConfig({});
123
+ initializeMetricsModule(config);
124
+ recordFlickerFrameModule(config);
125
+ // Called for session, then for flicker
126
+ expect(mockCounterAddFn).toHaveBeenCalledTimes(2);
127
+ expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 1, {
128
+ 'session.id': 'test-session-id',
129
+ 'installation.id': 'test-installation-id',
130
+ 'user.email': 'test@example.com',
131
+ });
132
+ });
133
+ });
134
+ describe('initializeMetrics', () => {
135
+ const mockConfig = {
136
+ getSessionId: () => 'test-session-id',
137
+ getTelemetryEnabled: () => true,
138
+ };
139
+ it('should apply common attributes including email', () => {
140
+ initializeMetricsModule(mockConfig);
141
+ expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
142
+ 'session.id': 'test-session-id',
143
+ 'installation.id': 'test-installation-id',
144
+ 'user.email': 'test@example.com',
145
+ });
146
+ });
147
+ });
92
148
  describe('recordChatCompressionMetrics', () => {
93
149
  it('does not record metrics if not initialized', () => {
94
150
  const lol = makeFakeConfig({});
@@ -107,6 +163,8 @@ describe('Telemetry Metrics', () => {
107
163
  });
108
164
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
109
165
  'session.id': 'test-session-id',
166
+ 'installation.id': 'test-installation-id',
167
+ 'user.email': 'test@example.com',
110
168
  tokens_after: 100,
111
169
  tokens_before: 200,
112
170
  });
@@ -133,9 +191,13 @@ describe('Telemetry Metrics', () => {
133
191
  expect(mockCounterAddFn).toHaveBeenCalledTimes(2);
134
192
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(1, 1, {
135
193
  'session.id': 'test-session-id',
194
+ 'installation.id': 'test-installation-id',
195
+ 'user.email': 'test@example.com',
136
196
  });
137
197
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 100, {
138
198
  'session.id': 'test-session-id',
199
+ 'installation.id': 'test-installation-id',
200
+ 'user.email': 'test@example.com',
139
201
  model: 'gemini-pro',
140
202
  type: 'input',
141
203
  });
@@ -149,6 +211,8 @@ describe('Telemetry Metrics', () => {
149
211
  });
150
212
  expect(mockCounterAddFn).toHaveBeenCalledWith(50, {
151
213
  'session.id': 'test-session-id',
214
+ 'installation.id': 'test-installation-id',
215
+ 'user.email': 'test@example.com',
152
216
  model: 'gemini-pro',
153
217
  type: 'output',
154
218
  });
@@ -158,6 +222,8 @@ describe('Telemetry Metrics', () => {
158
222
  });
159
223
  expect(mockCounterAddFn).toHaveBeenCalledWith(25, {
160
224
  'session.id': 'test-session-id',
225
+ 'installation.id': 'test-installation-id',
226
+ 'user.email': 'test@example.com',
161
227
  model: 'gemini-pro',
162
228
  type: 'thought',
163
229
  });
@@ -167,6 +233,8 @@ describe('Telemetry Metrics', () => {
167
233
  });
168
234
  expect(mockCounterAddFn).toHaveBeenCalledWith(75, {
169
235
  'session.id': 'test-session-id',
236
+ 'installation.id': 'test-installation-id',
237
+ 'user.email': 'test@example.com',
170
238
  model: 'gemini-pro',
171
239
  type: 'cache',
172
240
  });
@@ -176,6 +244,8 @@ describe('Telemetry Metrics', () => {
176
244
  });
177
245
  expect(mockCounterAddFn).toHaveBeenCalledWith(125, {
178
246
  'session.id': 'test-session-id',
247
+ 'installation.id': 'test-installation-id',
248
+ 'user.email': 'test@example.com',
179
249
  model: 'gemini-pro',
180
250
  type: 'tool',
181
251
  });
@@ -189,6 +259,8 @@ describe('Telemetry Metrics', () => {
189
259
  });
190
260
  expect(mockCounterAddFn).toHaveBeenCalledWith(200, {
191
261
  'session.id': 'test-session-id',
262
+ 'installation.id': 'test-installation-id',
263
+ 'user.email': 'test@example.com',
192
264
  model: 'gemini-ultra',
193
265
  type: 'input',
194
266
  });
@@ -219,9 +291,13 @@ describe('Telemetry Metrics', () => {
219
291
  expect(mockCounterAddFn).toHaveBeenCalledTimes(2);
220
292
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(1, 1, {
221
293
  'session.id': 'test-session-id',
294
+ 'installation.id': 'test-installation-id',
295
+ 'user.email': 'test@example.com',
222
296
  });
223
297
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 1, {
224
298
  'session.id': 'test-session-id',
299
+ 'installation.id': 'test-installation-id',
300
+ 'user.email': 'test@example.com',
225
301
  operation: FileOperation.CREATE,
226
302
  lines: 10,
227
303
  mimetype: 'text/plain',
@@ -236,6 +312,8 @@ describe('Telemetry Metrics', () => {
236
312
  });
237
313
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
238
314
  'session.id': 'test-session-id',
315
+ 'installation.id': 'test-installation-id',
316
+ 'user.email': 'test@example.com',
239
317
  operation: FileOperation.READ,
240
318
  });
241
319
  });
@@ -248,6 +326,8 @@ describe('Telemetry Metrics', () => {
248
326
  });
249
327
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
250
328
  'session.id': 'test-session-id',
329
+ 'installation.id': 'test-installation-id',
330
+ 'user.email': 'test@example.com',
251
331
  operation: FileOperation.UPDATE,
252
332
  mimetype: 'application/javascript',
253
333
  });
@@ -260,6 +340,8 @@ describe('Telemetry Metrics', () => {
260
340
  });
261
341
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
262
342
  'session.id': 'test-session-id',
343
+ 'installation.id': 'test-installation-id',
344
+ 'user.email': 'test@example.com',
263
345
  operation: FileOperation.UPDATE,
264
346
  });
265
347
  });
@@ -274,6 +356,8 @@ describe('Telemetry Metrics', () => {
274
356
  });
275
357
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
276
358
  'session.id': 'test-session-id',
359
+ 'installation.id': 'test-installation-id',
360
+ 'user.email': 'test@example.com',
277
361
  operation: FileOperation.UPDATE,
278
362
  lines: 10,
279
363
  mimetype: 'text/plain',
@@ -288,6 +372,8 @@ describe('Telemetry Metrics', () => {
288
372
  });
289
373
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
290
374
  'session.id': 'test-session-id',
375
+ 'installation.id': 'test-installation-id',
376
+ 'user.email': 'test@example.com',
291
377
  operation: FileOperation.UPDATE,
292
378
  });
293
379
  });
@@ -309,6 +395,8 @@ describe('Telemetry Metrics', () => {
309
395
  recordModelRoutingMetricsModule(mockConfig, event);
310
396
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(150, {
311
397
  'session.id': 'test-session-id',
398
+ 'installation.id': 'test-installation-id',
399
+ 'user.email': 'test@example.com',
312
400
  'routing.decision_model': 'gemini-pro',
313
401
  'routing.decision_source': 'default',
314
402
  });
@@ -321,17 +409,226 @@ describe('Telemetry Metrics', () => {
321
409
  recordModelRoutingMetricsModule(mockConfig, event);
322
410
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(200, {
323
411
  'session.id': 'test-session-id',
412
+ 'installation.id': 'test-installation-id',
413
+ 'user.email': 'test@example.com',
324
414
  'routing.decision_model': 'gemini-pro',
325
415
  'routing.decision_source': 'classifier',
326
416
  });
327
417
  expect(mockCounterAddFn).toHaveBeenCalledTimes(2);
328
418
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 1, {
329
419
  'session.id': 'test-session-id',
420
+ 'installation.id': 'test-installation-id',
421
+ 'user.email': 'test@example.com',
330
422
  'routing.decision_source': 'classifier',
331
423
  'routing.error_message': 'test-error',
332
424
  });
333
425
  });
334
426
  });
427
+ describe('recordAgentRunMetrics', () => {
428
+ const mockConfig = {
429
+ getSessionId: () => 'test-session-id',
430
+ getTelemetryEnabled: () => true,
431
+ };
432
+ it('should not record metrics if not initialized', () => {
433
+ const event = new AgentFinishEvent('agent-123', 'TestAgent', 1000, 5, AgentTerminateMode.GOAL);
434
+ recordAgentRunMetricsModule(mockConfig, event);
435
+ expect(mockCounterAddFn).not.toHaveBeenCalled();
436
+ expect(mockHistogramRecordFn).not.toHaveBeenCalled();
437
+ });
438
+ it('should record agent run metrics', () => {
439
+ initializeMetricsModule(mockConfig);
440
+ mockCounterAddFn.mockClear();
441
+ mockHistogramRecordFn.mockClear();
442
+ const event = new AgentFinishEvent('agent-123', 'TestAgent', 1000, 5, AgentTerminateMode.GOAL);
443
+ recordAgentRunMetricsModule(mockConfig, event);
444
+ // Verify agent run counter
445
+ expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
446
+ 'session.id': 'test-session-id',
447
+ 'installation.id': 'test-installation-id',
448
+ 'user.email': 'test@example.com',
449
+ agent_name: 'TestAgent',
450
+ terminate_reason: 'GOAL',
451
+ });
452
+ // Verify agent duration histogram
453
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(1000, {
454
+ 'session.id': 'test-session-id',
455
+ 'installation.id': 'test-installation-id',
456
+ 'user.email': 'test@example.com',
457
+ agent_name: 'TestAgent',
458
+ });
459
+ // Verify agent turns histogram
460
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(5, {
461
+ 'session.id': 'test-session-id',
462
+ 'installation.id': 'test-installation-id',
463
+ 'user.email': 'test@example.com',
464
+ agent_name: 'TestAgent',
465
+ });
466
+ });
467
+ });
468
+ describe('OpenTelemetry GenAI Semantic Convention Metrics', () => {
469
+ const mockConfig = {
470
+ getSessionId: () => 'test-session-id',
471
+ getTelemetryEnabled: () => true,
472
+ };
473
+ describe('recordGenAiClientTokenUsage', () => {
474
+ it('should not record metrics when not initialized', () => {
475
+ recordGenAiClientTokenUsageModule(mockConfig, 100, {
476
+ 'gen_ai.operation.name': 'generate_content',
477
+ 'gen_ai.provider.name': 'gcp.gen_ai',
478
+ 'gen_ai.token.type': 'input',
479
+ });
480
+ expect(mockHistogramRecordFn).not.toHaveBeenCalled();
481
+ });
482
+ it('should record input token usage with correct attributes', () => {
483
+ initializeMetricsModule(mockConfig);
484
+ mockHistogramRecordFn.mockClear();
485
+ recordGenAiClientTokenUsageModule(mockConfig, 150, {
486
+ 'gen_ai.operation.name': 'generate_content',
487
+ 'gen_ai.provider.name': 'gcp.gen_ai',
488
+ 'gen_ai.token.type': 'input',
489
+ 'gen_ai.request.model': 'gemini-2.0-flash',
490
+ 'gen_ai.response.model': 'gemini-2.0-flash',
491
+ });
492
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(150, {
493
+ 'session.id': 'test-session-id',
494
+ 'installation.id': 'test-installation-id',
495
+ 'user.email': 'test@example.com',
496
+ 'gen_ai.operation.name': 'generate_content',
497
+ 'gen_ai.provider.name': 'gcp.gen_ai',
498
+ 'gen_ai.token.type': 'input',
499
+ 'gen_ai.request.model': 'gemini-2.0-flash',
500
+ 'gen_ai.response.model': 'gemini-2.0-flash',
501
+ });
502
+ });
503
+ it('should record output token usage with correct attributes', () => {
504
+ initializeMetricsModule(mockConfig);
505
+ mockHistogramRecordFn.mockClear();
506
+ recordGenAiClientTokenUsageModule(mockConfig, 75, {
507
+ 'gen_ai.operation.name': 'generate_content',
508
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
509
+ 'gen_ai.token.type': 'output',
510
+ 'gen_ai.request.model': 'gemini-pro',
511
+ });
512
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(75, {
513
+ 'session.id': 'test-session-id',
514
+ 'installation.id': 'test-installation-id',
515
+ 'user.email': 'test@example.com',
516
+ 'gen_ai.operation.name': 'generate_content',
517
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
518
+ 'gen_ai.token.type': 'output',
519
+ 'gen_ai.request.model': 'gemini-pro',
520
+ });
521
+ });
522
+ it('should record token usage with optional attributes', () => {
523
+ initializeMetricsModule(mockConfig);
524
+ mockHistogramRecordFn.mockClear();
525
+ recordGenAiClientTokenUsageModule(mockConfig, 200, {
526
+ 'gen_ai.operation.name': 'generate_content',
527
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
528
+ 'gen_ai.token.type': 'input',
529
+ 'gen_ai.request.model': 'text-embedding-004',
530
+ 'server.address': 'aiplatform.googleapis.com',
531
+ 'server.port': 443,
532
+ });
533
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(200, {
534
+ 'session.id': 'test-session-id',
535
+ 'installation.id': 'test-installation-id',
536
+ 'user.email': 'test@example.com',
537
+ 'gen_ai.operation.name': 'generate_content',
538
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
539
+ 'gen_ai.token.type': 'input',
540
+ 'gen_ai.request.model': 'text-embedding-004',
541
+ 'server.address': 'aiplatform.googleapis.com',
542
+ 'server.port': 443,
543
+ });
544
+ });
545
+ });
546
+ describe('recordGenAiClientOperationDuration', () => {
547
+ it('should not record metrics when not initialized', () => {
548
+ recordGenAiClientOperationDurationModule(mockConfig, 2.5, {
549
+ 'gen_ai.operation.name': 'generate_content',
550
+ 'gen_ai.provider.name': 'gcp.gen_ai',
551
+ });
552
+ expect(mockHistogramRecordFn).not.toHaveBeenCalled();
553
+ });
554
+ it('should record successful operation duration with correct attributes', () => {
555
+ initializeMetricsModule(mockConfig);
556
+ mockHistogramRecordFn.mockClear();
557
+ recordGenAiClientOperationDurationModule(mockConfig, 1.25, {
558
+ 'gen_ai.operation.name': 'generate_content',
559
+ 'gen_ai.provider.name': 'gcp.gen_ai',
560
+ 'gen_ai.request.model': 'gemini-2.0-flash',
561
+ 'gen_ai.response.model': 'gemini-2.0-flash',
562
+ });
563
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(1.25, {
564
+ 'session.id': 'test-session-id',
565
+ 'installation.id': 'test-installation-id',
566
+ 'user.email': 'test@example.com',
567
+ 'gen_ai.operation.name': 'generate_content',
568
+ 'gen_ai.provider.name': 'gcp.gen_ai',
569
+ 'gen_ai.request.model': 'gemini-2.0-flash',
570
+ 'gen_ai.response.model': 'gemini-2.0-flash',
571
+ });
572
+ });
573
+ it('should record failed operation duration with error type', () => {
574
+ initializeMetricsModule(mockConfig);
575
+ mockHistogramRecordFn.mockClear();
576
+ recordGenAiClientOperationDurationModule(mockConfig, 3.75, {
577
+ 'gen_ai.operation.name': 'generate_content',
578
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
579
+ 'gen_ai.request.model': 'gemini-pro',
580
+ 'error.type': 'quota_exceeded',
581
+ });
582
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(3.75, {
583
+ 'session.id': 'test-session-id',
584
+ 'installation.id': 'test-installation-id',
585
+ 'user.email': 'test@example.com',
586
+ 'gen_ai.operation.name': 'generate_content',
587
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
588
+ 'gen_ai.request.model': 'gemini-pro',
589
+ 'error.type': 'quota_exceeded',
590
+ });
591
+ });
592
+ it('should record operation duration with server details', () => {
593
+ initializeMetricsModule(mockConfig);
594
+ mockHistogramRecordFn.mockClear();
595
+ recordGenAiClientOperationDurationModule(mockConfig, 0.95, {
596
+ 'gen_ai.operation.name': 'generate_content',
597
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
598
+ 'gen_ai.request.model': 'gemini-1.5-pro',
599
+ 'gen_ai.response.model': 'gemini-1.5-pro-001',
600
+ 'server.address': 'us-central1-aiplatform.googleapis.com',
601
+ 'server.port': 443,
602
+ });
603
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(0.95, {
604
+ 'session.id': 'test-session-id',
605
+ 'installation.id': 'test-installation-id',
606
+ 'user.email': 'test@example.com',
607
+ 'gen_ai.operation.name': 'generate_content',
608
+ 'gen_ai.provider.name': 'gcp.vertex_ai',
609
+ 'gen_ai.request.model': 'gemini-1.5-pro',
610
+ 'gen_ai.response.model': 'gemini-1.5-pro-001',
611
+ 'server.address': 'us-central1-aiplatform.googleapis.com',
612
+ 'server.port': 443,
613
+ });
614
+ });
615
+ it('should handle minimal required attributes', () => {
616
+ initializeMetricsModule(mockConfig);
617
+ mockHistogramRecordFn.mockClear();
618
+ recordGenAiClientOperationDurationModule(mockConfig, 2.1, {
619
+ 'gen_ai.operation.name': 'generate_content',
620
+ 'gen_ai.provider.name': 'gcp.gen_ai',
621
+ });
622
+ expect(mockHistogramRecordFn).toHaveBeenCalledWith(2.1, {
623
+ 'session.id': 'test-session-id',
624
+ 'installation.id': 'test-installation-id',
625
+ 'user.email': 'test@example.com',
626
+ 'gen_ai.operation.name': 'generate_content',
627
+ 'gen_ai.provider.name': 'gcp.gen_ai',
628
+ });
629
+ });
630
+ });
631
+ });
335
632
  describe('Performance Monitoring Metrics', () => {
336
633
  const mockConfig = {
337
634
  getSessionId: () => 'test-session-id',
@@ -367,6 +664,8 @@ describe('Telemetry Metrics', () => {
367
664
  });
368
665
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(150, {
369
666
  'session.id': 'test-session-id',
667
+ 'installation.id': 'test-installation-id',
668
+ 'user.email': 'test@example.com',
370
669
  phase: 'settings_loading',
371
670
  auth_type: 'gemini',
372
671
  telemetry_enabled: true,
@@ -379,6 +678,8 @@ describe('Telemetry Metrics', () => {
379
678
  recordStartupPerformanceModule(mockConfig, 50, { phase: 'cleanup' });
380
679
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(50, {
381
680
  'session.id': 'test-session-id',
681
+ 'installation.id': 'test-installation-id',
682
+ 'user.email': 'test@example.com',
382
683
  phase: 'cleanup',
383
684
  });
384
685
  });
@@ -396,6 +697,8 @@ describe('Telemetry Metrics', () => {
396
697
  });
397
698
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(floatingPointDuration, {
398
699
  'session.id': 'test-session-id',
700
+ 'installation.id': 'test-installation-id',
701
+ 'user.email': 'test@example.com',
399
702
  phase: 'total_startup',
400
703
  is_tty: true,
401
704
  has_question: false,
@@ -412,6 +715,8 @@ describe('Telemetry Metrics', () => {
412
715
  });
413
716
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(15728640, {
414
717
  'session.id': 'test-session-id',
718
+ 'installation.id': 'test-installation-id',
719
+ 'user.email': 'test@example.com',
415
720
  memory_type: 'heap_used',
416
721
  component: 'startup',
417
722
  });
@@ -434,16 +739,22 @@ describe('Telemetry Metrics', () => {
434
739
  expect(mockHistogramRecordFn).toHaveBeenCalledTimes(3); // One for each call
435
740
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(1, 31457280, {
436
741
  'session.id': 'test-session-id',
742
+ 'installation.id': 'test-installation-id',
743
+ 'user.email': 'test@example.com',
437
744
  memory_type: 'heap_total',
438
745
  component: 'api_call',
439
746
  });
440
747
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(2, 2097152, {
441
748
  'session.id': 'test-session-id',
749
+ 'installation.id': 'test-installation-id',
750
+ 'user.email': 'test@example.com',
442
751
  memory_type: 'external',
443
752
  component: 'tool_execution',
444
753
  });
445
754
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(3, 41943040, {
446
755
  'session.id': 'test-session-id',
756
+ 'installation.id': 'test-installation-id',
757
+ 'user.email': 'test@example.com',
447
758
  memory_type: 'rss',
448
759
  component: 'memory_monitor',
449
760
  });
@@ -456,6 +767,8 @@ describe('Telemetry Metrics', () => {
456
767
  });
457
768
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(15728640, {
458
769
  'session.id': 'test-session-id',
770
+ 'installation.id': 'test-installation-id',
771
+ 'user.email': 'test@example.com',
459
772
  memory_type: 'heap_used',
460
773
  });
461
774
  });
@@ -469,6 +782,8 @@ describe('Telemetry Metrics', () => {
469
782
  });
470
783
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(85.5, {
471
784
  'session.id': 'test-session-id',
785
+ 'installation.id': 'test-installation-id',
786
+ 'user.email': 'test@example.com',
472
787
  component: 'tool_execution',
473
788
  });
474
789
  });
@@ -478,6 +793,8 @@ describe('Telemetry Metrics', () => {
478
793
  recordCpuUsageModule(mockConfig, 42.3, {});
479
794
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(42.3, {
480
795
  'session.id': 'test-session-id',
796
+ 'installation.id': 'test-installation-id',
797
+ 'user.email': 'test@example.com',
481
798
  });
482
799
  });
483
800
  });
@@ -488,6 +805,8 @@ describe('Telemetry Metrics', () => {
488
805
  recordToolQueueDepthModule(mockConfig, 3);
489
806
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(3, {
490
807
  'session.id': 'test-session-id',
808
+ 'installation.id': 'test-installation-id',
809
+ 'user.email': 'test@example.com',
491
810
  });
492
811
  });
493
812
  it('should record zero queue depth', () => {
@@ -496,6 +815,8 @@ describe('Telemetry Metrics', () => {
496
815
  recordToolQueueDepthModule(mockConfig, 0);
497
816
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(0, {
498
817
  'session.id': 'test-session-id',
818
+ 'installation.id': 'test-installation-id',
819
+ 'user.email': 'test@example.com',
499
820
  });
500
821
  });
501
822
  });
@@ -509,6 +830,8 @@ describe('Telemetry Metrics', () => {
509
830
  });
510
831
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(25, {
511
832
  'session.id': 'test-session-id',
833
+ 'installation.id': 'test-installation-id',
834
+ 'user.email': 'test@example.com',
512
835
  function_name: 'Read',
513
836
  phase: 'validation',
514
837
  });
@@ -531,16 +854,22 @@ describe('Telemetry Metrics', () => {
531
854
  expect(mockHistogramRecordFn).toHaveBeenCalledTimes(3); // One for each call
532
855
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(1, 50, {
533
856
  'session.id': 'test-session-id',
857
+ 'installation.id': 'test-installation-id',
858
+ 'user.email': 'test@example.com',
534
859
  function_name: 'Bash',
535
860
  phase: 'preparation',
536
861
  });
537
862
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(2, 1500, {
538
863
  'session.id': 'test-session-id',
864
+ 'installation.id': 'test-installation-id',
865
+ 'user.email': 'test@example.com',
539
866
  function_name: 'Bash',
540
867
  phase: 'execution',
541
868
  });
542
869
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(3, 75, {
543
870
  'session.id': 'test-session-id',
871
+ 'installation.id': 'test-installation-id',
872
+ 'user.email': 'test@example.com',
544
873
  function_name: 'Bash',
545
874
  phase: 'result_processing',
546
875
  });
@@ -557,6 +886,8 @@ describe('Telemetry Metrics', () => {
557
886
  });
558
887
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(0.85, {
559
888
  'session.id': 'test-session-id',
889
+ 'installation.id': 'test-installation-id',
890
+ 'user.email': 'test@example.com',
560
891
  model: 'gemini-pro',
561
892
  metric: 'cache_hit_rate',
562
893
  context: 'api_request',
@@ -571,6 +902,8 @@ describe('Telemetry Metrics', () => {
571
902
  });
572
903
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(125.5, {
573
904
  'session.id': 'test-session-id',
905
+ 'installation.id': 'test-installation-id',
906
+ 'user.email': 'test@example.com',
574
907
  model: 'gemini-pro',
575
908
  metric: 'tokens_per_operation',
576
909
  });
@@ -586,6 +919,8 @@ describe('Telemetry Metrics', () => {
586
919
  });
587
920
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(15, {
588
921
  'session.id': 'test-session-id',
922
+ 'installation.id': 'test-installation-id',
923
+ 'user.email': 'test@example.com',
589
924
  model: 'gemini-pro',
590
925
  phase: 'request_preparation',
591
926
  });
@@ -608,16 +943,22 @@ describe('Telemetry Metrics', () => {
608
943
  expect(mockHistogramRecordFn).toHaveBeenCalledTimes(3); // One for each call
609
944
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(1, 250, {
610
945
  'session.id': 'test-session-id',
946
+ 'installation.id': 'test-installation-id',
947
+ 'user.email': 'test@example.com',
611
948
  model: 'gemini-pro',
612
949
  phase: 'network_latency',
613
950
  });
614
951
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(2, 100, {
615
952
  'session.id': 'test-session-id',
953
+ 'installation.id': 'test-installation-id',
954
+ 'user.email': 'test@example.com',
616
955
  model: 'gemini-pro',
617
956
  phase: 'response_processing',
618
957
  });
619
958
  expect(mockHistogramRecordFn).toHaveBeenNthCalledWith(3, 50, {
620
959
  'session.id': 'test-session-id',
960
+ 'installation.id': 'test-installation-id',
961
+ 'user.email': 'test@example.com',
621
962
  model: 'gemini-pro',
622
963
  phase: 'token_processing',
623
964
  });
@@ -633,6 +974,8 @@ describe('Telemetry Metrics', () => {
633
974
  });
634
975
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(85.5, {
635
976
  'session.id': 'test-session-id',
977
+ 'installation.id': 'test-installation-id',
978
+ 'user.email': 'test@example.com',
636
979
  category: 'memory_efficiency',
637
980
  baseline: 80.0,
638
981
  });
@@ -645,6 +988,8 @@ describe('Telemetry Metrics', () => {
645
988
  });
646
989
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(92.3, {
647
990
  'session.id': 'test-session-id',
991
+ 'installation.id': 'test-installation-id',
992
+ 'user.email': 'test@example.com',
648
993
  category: 'overall_performance',
649
994
  });
650
995
  });
@@ -663,6 +1008,8 @@ describe('Telemetry Metrics', () => {
663
1008
  // Verify regression counter
664
1009
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
665
1010
  'session.id': 'test-session-id',
1011
+ 'installation.id': 'test-installation-id',
1012
+ 'user.email': 'test@example.com',
666
1013
  metric: 'startup_time',
667
1014
  severity: 'medium',
668
1015
  current_value: 1200,
@@ -671,6 +1018,8 @@ describe('Telemetry Metrics', () => {
671
1018
  // Verify baseline comparison histogram (20% increase)
672
1019
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(20, {
673
1020
  'session.id': 'test-session-id',
1021
+ 'installation.id': 'test-installation-id',
1022
+ 'user.email': 'test@example.com',
674
1023
  metric: 'startup_time',
675
1024
  severity: 'medium',
676
1025
  current_value: 1200,
@@ -690,6 +1039,8 @@ describe('Telemetry Metrics', () => {
690
1039
  // Verify regression counter still recorded
691
1040
  expect(mockCounterAddFn).toHaveBeenCalledWith(1, {
692
1041
  'session.id': 'test-session-id',
1042
+ 'installation.id': 'test-installation-id',
1043
+ 'user.email': 'test@example.com',
693
1044
  metric: 'memory_usage',
694
1045
  severity: 'high',
695
1046
  current_value: 100,
@@ -715,6 +1066,8 @@ describe('Telemetry Metrics', () => {
715
1066
  });
716
1067
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(1, 1, {
717
1068
  'session.id': 'test-session-id',
1069
+ 'installation.id': 'test-installation-id',
1070
+ 'user.email': 'test@example.com',
718
1071
  metric: 'api_latency',
719
1072
  severity: 'low',
720
1073
  current_value: 500,
@@ -722,6 +1075,8 @@ describe('Telemetry Metrics', () => {
722
1075
  });
723
1076
  expect(mockCounterAddFn).toHaveBeenNthCalledWith(2, 1, {
724
1077
  'session.id': 'test-session-id',
1078
+ 'installation.id': 'test-installation-id',
1079
+ 'user.email': 'test@example.com',
725
1080
  metric: 'cpu_usage',
726
1081
  severity: 'high',
727
1082
  current_value: 90,
@@ -742,6 +1097,8 @@ describe('Telemetry Metrics', () => {
742
1097
  // 20% increase: (120 - 100) / 100 * 100 = 20%
743
1098
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(20, {
744
1099
  'session.id': 'test-session-id',
1100
+ 'installation.id': 'test-installation-id',
1101
+ 'user.email': 'test@example.com',
745
1102
  metric: 'memory_usage',
746
1103
  category: 'performance_tracking',
747
1104
  current_value: 120,
@@ -760,6 +1117,8 @@ describe('Telemetry Metrics', () => {
760
1117
  // 20% decrease: (800 - 1000) / 1000 * 100 = -20%
761
1118
  expect(mockHistogramRecordFn).toHaveBeenCalledWith(-20, {
762
1119
  'session.id': 'test-session-id',
1120
+ 'installation.id': 'test-installation-id',
1121
+ 'user.email': 'test@example.com',
763
1122
  metric: 'startup_time',
764
1123
  category: 'optimization',
765
1124
  current_value: 800,