@office-ai/aioncli-core 0.2.3 → 0.8.1

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 (756) hide show
  1. package/dist/index.d.ts +10 -3
  2. package/dist/index.js +10 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/agents/codebase-investigator.d.ts +11 -0
  5. package/dist/src/agents/codebase-investigator.js +73 -0
  6. package/dist/src/agents/codebase-investigator.js.map +1 -0
  7. package/dist/src/agents/executor.d.ts +88 -0
  8. package/dist/src/agents/executor.js +417 -0
  9. package/dist/src/agents/executor.js.map +1 -0
  10. package/dist/src/agents/executor.test.js +419 -0
  11. package/dist/src/agents/executor.test.js.map +1 -0
  12. package/dist/src/agents/invocation.d.ts +43 -0
  13. package/dist/src/agents/invocation.js +100 -0
  14. package/dist/src/agents/invocation.js.map +1 -0
  15. package/dist/src/agents/invocation.test.js +206 -0
  16. package/dist/src/agents/invocation.test.js.map +1 -0
  17. package/dist/src/agents/registry.d.ts +35 -0
  18. package/dist/src/agents/registry.js +58 -0
  19. package/dist/src/agents/registry.js.map +1 -0
  20. package/dist/src/agents/registry.test.js +146 -0
  21. package/dist/src/agents/registry.test.js.map +1 -0
  22. package/dist/src/agents/schema-utils.d.ts +39 -0
  23. package/dist/src/agents/schema-utils.js +57 -0
  24. package/dist/src/agents/schema-utils.js.map +1 -0
  25. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  26. package/dist/src/agents/schema-utils.test.js +144 -0
  27. package/dist/src/agents/schema-utils.test.js.map +1 -0
  28. package/dist/src/agents/subagent-tool-wrapper.d.ts +36 -0
  29. package/dist/src/agents/subagent-tool-wrapper.js +47 -0
  30. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  31. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  32. package/dist/src/agents/subagent-tool-wrapper.test.js +105 -0
  33. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  34. package/dist/src/agents/types.d.ts +116 -0
  35. package/dist/src/agents/types.js +17 -0
  36. package/dist/src/agents/types.js.map +1 -0
  37. package/dist/src/agents/utils.d.ts +15 -0
  38. package/dist/src/agents/utils.js +29 -0
  39. package/dist/src/agents/utils.js.map +1 -0
  40. package/dist/src/agents/utils.test.d.ts +6 -0
  41. package/dist/src/agents/utils.test.js +87 -0
  42. package/dist/src/agents/utils.test.js.map +1 -0
  43. package/dist/src/code_assist/codeAssist.d.ts +6 -3
  44. package/dist/src/code_assist/codeAssist.js +12 -0
  45. package/dist/src/code_assist/codeAssist.js.map +1 -1
  46. package/dist/src/code_assist/converter.d.ts +4 -1
  47. package/dist/src/code_assist/converter.js +38 -5
  48. package/dist/src/code_assist/converter.js.map +1 -1
  49. package/dist/src/code_assist/converter.test.js +93 -0
  50. package/dist/src/code_assist/converter.test.js.map +1 -1
  51. package/dist/src/code_assist/oauth-credential-storage.d.ts +25 -0
  52. package/dist/src/code_assist/oauth-credential-storage.js +109 -0
  53. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -0
  54. package/dist/src/code_assist/oauth-credential-storage.test.d.ts +6 -0
  55. package/dist/src/code_assist/oauth-credential-storage.test.js +136 -0
  56. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -0
  57. package/dist/src/code_assist/oauth2.d.ts +1 -1
  58. package/dist/src/code_assist/oauth2.js +107 -48
  59. package/dist/src/code_assist/oauth2.js.map +1 -1
  60. package/dist/src/code_assist/oauth2.test.js +735 -343
  61. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  62. package/dist/src/code_assist/server.d.ts +4 -4
  63. package/dist/src/code_assist/server.js +25 -2
  64. package/dist/src/code_assist/server.js.map +1 -1
  65. package/dist/src/code_assist/server.test.js +25 -0
  66. package/dist/src/code_assist/server.test.js.map +1 -1
  67. package/dist/src/code_assist/setup.d.ts +1 -1
  68. package/dist/src/code_assist/setup.js +1 -1
  69. package/dist/src/code_assist/setup.js.map +1 -1
  70. package/dist/src/code_assist/setup.test.js.map +1 -1
  71. package/dist/src/code_assist/types.d.ts +17 -2
  72. package/dist/src/config/config.d.ts +121 -25
  73. package/dist/src/config/config.js +298 -89
  74. package/dist/src/config/config.js.map +1 -1
  75. package/dist/src/config/config.test.js +370 -131
  76. package/dist/src/config/config.test.js.map +1 -1
  77. package/dist/src/config/constants.d.ts +11 -0
  78. package/dist/src/config/constants.js +16 -0
  79. package/dist/src/config/constants.js.map +1 -0
  80. package/dist/src/config/models.d.ts +16 -0
  81. package/dist/src/config/models.js +29 -0
  82. package/dist/src/config/models.js.map +1 -1
  83. package/dist/src/config/models.test.d.ts +6 -0
  84. package/dist/src/config/models.test.js +55 -0
  85. package/dist/src/config/models.test.js.map +1 -0
  86. package/dist/src/config/storage.d.ts +34 -0
  87. package/dist/src/config/storage.js +95 -0
  88. package/dist/src/config/storage.js.map +1 -0
  89. package/dist/src/config/storage.test.d.ts +6 -0
  90. package/dist/src/config/storage.test.js +47 -0
  91. package/dist/src/config/storage.test.js.map +1 -0
  92. package/dist/src/confirmation-bus/index.d.ts +7 -0
  93. package/dist/src/confirmation-bus/index.js +8 -0
  94. package/dist/src/confirmation-bus/index.js.map +1 -0
  95. package/dist/src/confirmation-bus/message-bus.d.ts +17 -0
  96. package/dist/src/confirmation-bus/message-bus.js +81 -0
  97. package/dist/src/confirmation-bus/message-bus.js.map +1 -0
  98. package/dist/src/confirmation-bus/message-bus.test.d.ts +6 -0
  99. package/dist/src/confirmation-bus/message-bus.test.js +164 -0
  100. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -0
  101. package/dist/src/confirmation-bus/types.d.ts +38 -0
  102. package/dist/src/confirmation-bus/types.js +15 -0
  103. package/dist/src/confirmation-bus/types.js.map +1 -0
  104. package/dist/src/core/baseLlmClient.d.ts +54 -0
  105. package/dist/src/core/baseLlmClient.js +190 -0
  106. package/dist/src/core/baseLlmClient.js.map +1 -0
  107. package/dist/src/core/baseLlmClient.test.d.ts +6 -0
  108. package/dist/src/core/baseLlmClient.test.js +316 -0
  109. package/dist/src/core/baseLlmClient.test.js.map +1 -0
  110. package/dist/src/core/client.d.ts +28 -33
  111. package/dist/src/core/client.js +187 -384
  112. package/dist/src/core/client.js.map +1 -1
  113. package/dist/src/core/client.test.js +745 -500
  114. package/dist/src/core/client.test.js.map +1 -1
  115. package/dist/src/core/contentGenerator.d.ts +4 -4
  116. package/dist/src/core/contentGenerator.js +6 -7
  117. package/dist/src/core/contentGenerator.js.map +1 -1
  118. package/dist/src/core/contentGenerator.test.js +1 -3
  119. package/dist/src/core/contentGenerator.test.js.map +1 -1
  120. package/dist/src/core/coreToolScheduler.d.ts +20 -7
  121. package/dist/src/core/coreToolScheduler.js +216 -53
  122. package/dist/src/core/coreToolScheduler.js.map +1 -1
  123. package/dist/src/core/coreToolScheduler.test.js +564 -88
  124. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  125. package/dist/src/core/geminiChat.d.ts +54 -53
  126. package/dist/src/core/geminiChat.js +300 -356
  127. package/dist/src/core/geminiChat.js.map +1 -1
  128. package/dist/src/core/geminiChat.test.js +1255 -321
  129. package/dist/src/core/geminiChat.test.js.map +1 -1
  130. package/dist/src/core/geminiRequest.js +1 -0
  131. package/dist/src/core/geminiRequest.js.map +1 -1
  132. package/dist/src/core/logger.d.ts +4 -2
  133. package/dist/src/core/logger.js +4 -3
  134. package/dist/src/core/logger.js.map +1 -1
  135. package/dist/src/core/logger.test.js +17 -16
  136. package/dist/src/core/logger.test.js.map +1 -1
  137. package/dist/src/core/loggingContentGenerator.d.ts +3 -3
  138. package/dist/src/core/loggingContentGenerator.js +15 -16
  139. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  140. package/dist/src/core/nonInteractiveToolExecutor.d.ts +3 -5
  141. package/dist/src/core/nonInteractiveToolExecutor.js +14 -122
  142. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  143. package/dist/src/core/nonInteractiveToolExecutor.test.js +158 -78
  144. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  145. package/dist/src/core/openaiContentGenerator.d.ts +4 -3
  146. package/dist/src/core/openaiContentGenerator.js +21 -14
  147. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  148. package/dist/src/core/openaiContentGenerator.test.js +1 -0
  149. package/dist/src/core/openaiContentGenerator.test.js.map +1 -1
  150. package/dist/src/core/prompts.d.ts +5 -0
  151. package/dist/src/core/prompts.js +66 -44
  152. package/dist/src/core/prompts.js.map +1 -1
  153. package/dist/src/core/prompts.test.js +130 -1
  154. package/dist/src/core/prompts.test.js.map +1 -1
  155. package/dist/src/core/subagent.d.ts +24 -18
  156. package/dist/src/core/subagent.js +125 -90
  157. package/dist/src/core/subagent.js.map +1 -1
  158. package/dist/src/core/subagent.test.js +59 -44
  159. package/dist/src/core/subagent.test.js.map +1 -1
  160. package/dist/src/core/turn.d.ts +37 -13
  161. package/dist/src/core/turn.js +63 -28
  162. package/dist/src/core/turn.js.map +1 -1
  163. package/dist/src/core/turn.test.js +359 -100
  164. package/dist/src/core/turn.test.js.map +1 -1
  165. package/dist/src/fallback/handler.d.ts +7 -0
  166. package/dist/src/fallback/handler.js +129 -0
  167. package/dist/src/fallback/handler.js.map +1 -0
  168. package/dist/src/fallback/handler.test.d.ts +6 -0
  169. package/dist/src/fallback/handler.test.js +130 -0
  170. package/dist/src/fallback/handler.test.js.map +1 -0
  171. package/dist/src/fallback/types.d.ts +14 -0
  172. package/dist/src/fallback/types.js +7 -0
  173. package/dist/src/fallback/types.js.map +1 -0
  174. package/dist/src/ide/constants.d.ts +3 -0
  175. package/dist/src/ide/constants.js +3 -0
  176. package/dist/src/ide/constants.js.map +1 -1
  177. package/dist/src/ide/detect-ide.d.ts +48 -12
  178. package/dist/src/ide/detect-ide.js +47 -66
  179. package/dist/src/ide/detect-ide.js.map +1 -1
  180. package/dist/src/ide/detect-ide.test.js +79 -52
  181. package/dist/src/ide/detect-ide.test.js.map +1 -1
  182. package/dist/src/ide/ide-client.d.ts +69 -23
  183. package/dist/src/ide/ide-client.js +372 -78
  184. package/dist/src/ide/ide-client.js.map +1 -1
  185. package/dist/src/ide/ide-client.test.js +375 -30
  186. package/dist/src/ide/ide-client.test.js.map +1 -1
  187. package/dist/src/ide/ide-installer.d.ts +2 -2
  188. package/dist/src/ide/ide-installer.js +37 -24
  189. package/dist/src/ide/ide-installer.js.map +1 -1
  190. package/dist/src/ide/ide-installer.test.js +104 -26
  191. package/dist/src/ide/ide-installer.test.js.map +1 -1
  192. package/dist/src/ide/ideContext.d.ts +35 -365
  193. package/dist/src/ide/ideContext.js +60 -106
  194. package/dist/src/ide/ideContext.js.map +1 -1
  195. package/dist/src/ide/ideContext.test.js +152 -24
  196. package/dist/src/ide/ideContext.test.js.map +1 -1
  197. package/dist/src/ide/process-utils.d.ts +7 -5
  198. package/dist/src/ide/process-utils.js +81 -50
  199. package/dist/src/ide/process-utils.js.map +1 -1
  200. package/dist/src/ide/process-utils.test.d.ts +6 -0
  201. package/dist/src/ide/process-utils.test.js +158 -0
  202. package/dist/src/ide/process-utils.test.js.map +1 -0
  203. package/dist/src/ide/types.d.ts +486 -0
  204. package/dist/src/ide/types.js +138 -0
  205. package/dist/src/ide/types.js.map +1 -0
  206. package/dist/src/index.d.ts +20 -2
  207. package/dist/src/index.js +20 -2
  208. package/dist/src/index.js.map +1 -1
  209. package/dist/src/mcp/google-auth-provider.d.ts +3 -3
  210. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  211. package/dist/src/mcp/oauth-provider.d.ts +17 -13
  212. package/dist/src/mcp/oauth-provider.js +81 -69
  213. package/dist/src/mcp/oauth-provider.js.map +1 -1
  214. package/dist/src/mcp/oauth-provider.test.js +212 -37
  215. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  216. package/dist/src/mcp/oauth-token-storage.d.ts +14 -32
  217. package/dist/src/mcp/oauth-token-storage.js +54 -25
  218. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  219. package/dist/src/mcp/oauth-token-storage.test.js +256 -162
  220. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  221. package/dist/src/mcp/oauth-utils.d.ts +9 -1
  222. package/dist/src/mcp/oauth-utils.js +42 -27
  223. package/dist/src/mcp/oauth-utils.js.map +1 -1
  224. package/dist/src/mcp/oauth-utils.test.js +41 -1
  225. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  226. package/dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
  227. package/dist/src/mcp/sa-impersonation-provider.js +130 -0
  228. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  229. package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  230. package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  231. package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  232. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  233. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  234. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  235. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  236. package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  237. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  238. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  239. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  240. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  241. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  242. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  243. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  244. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  245. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  246. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  247. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  248. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  249. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  250. package/dist/src/mcp/token-storage/index.d.ts +11 -0
  251. package/dist/src/mcp/token-storage/index.js +12 -0
  252. package/dist/src/mcp/token-storage/index.js.map +1 -0
  253. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  254. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  255. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  256. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  257. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  258. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  259. package/dist/src/mcp/token-storage/types.d.ts +38 -0
  260. package/dist/src/mcp/token-storage/types.js +11 -0
  261. package/dist/src/mcp/token-storage/types.js.map +1 -0
  262. package/dist/src/output/json-formatter.d.ts +11 -0
  263. package/dist/src/output/json-formatter.js +30 -0
  264. package/dist/src/output/json-formatter.js.map +1 -0
  265. package/dist/src/output/json-formatter.test.d.ts +6 -0
  266. package/dist/src/output/json-formatter.test.js +266 -0
  267. package/dist/src/output/json-formatter.test.js.map +1 -0
  268. package/dist/src/output/types.d.ts +20 -0
  269. package/dist/src/output/types.js +11 -0
  270. package/dist/src/output/types.js.map +1 -0
  271. package/dist/src/policy/index.d.ts +7 -0
  272. package/dist/src/policy/index.js +8 -0
  273. package/dist/src/policy/index.js.map +1 -0
  274. package/dist/src/policy/policy-engine.d.ts +30 -0
  275. package/dist/src/policy/policy-engine.js +92 -0
  276. package/dist/src/policy/policy-engine.js.map +1 -0
  277. package/dist/src/policy/policy-engine.test.d.ts +6 -0
  278. package/dist/src/policy/policy-engine.test.js +515 -0
  279. package/dist/src/policy/policy-engine.test.js.map +1 -0
  280. package/dist/src/policy/stable-stringify.d.ts +58 -0
  281. package/dist/src/policy/stable-stringify.js +122 -0
  282. package/dist/src/policy/stable-stringify.js.map +1 -0
  283. package/dist/src/policy/types.d.ts +47 -0
  284. package/dist/src/policy/types.js +12 -0
  285. package/dist/src/policy/types.js.map +1 -0
  286. package/dist/src/prompts/mcp-prompts.d.ts +2 -2
  287. package/dist/src/prompts/prompt-registry.d.ts +1 -1
  288. package/dist/src/routing/modelRouterService.d.ts +23 -0
  289. package/dist/src/routing/modelRouterService.js +70 -0
  290. package/dist/src/routing/modelRouterService.js.map +1 -0
  291. package/dist/src/routing/modelRouterService.test.d.ts +6 -0
  292. package/dist/src/routing/modelRouterService.test.js +98 -0
  293. package/dist/src/routing/modelRouterService.test.js.map +1 -0
  294. package/dist/src/routing/routingStrategy.d.ts +62 -0
  295. package/dist/src/routing/routingStrategy.js +7 -0
  296. package/dist/src/routing/routingStrategy.js.map +1 -0
  297. package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
  298. package/dist/src/routing/strategies/classifierStrategy.js +173 -0
  299. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
  300. package/dist/src/routing/strategies/classifierStrategy.test.d.ts +6 -0
  301. package/dist/src/routing/strategies/classifierStrategy.test.js +192 -0
  302. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -0
  303. package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
  304. package/dist/src/routing/strategies/compositeStrategy.js +68 -0
  305. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
  306. package/dist/src/routing/strategies/compositeStrategy.test.d.ts +6 -0
  307. package/dist/src/routing/strategies/compositeStrategy.test.js +123 -0
  308. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -0
  309. package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
  310. package/dist/src/routing/strategies/defaultStrategy.js +20 -0
  311. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
  312. package/dist/src/routing/strategies/defaultStrategy.test.d.ts +6 -0
  313. package/dist/src/routing/strategies/defaultStrategy.test.js +26 -0
  314. package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -0
  315. package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
  316. package/dist/src/routing/strategies/fallbackStrategy.js +25 -0
  317. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
  318. package/dist/src/routing/strategies/fallbackStrategy.test.d.ts +6 -0
  319. package/dist/src/routing/strategies/fallbackStrategy.test.js +55 -0
  320. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -0
  321. package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
  322. package/dist/src/routing/strategies/overrideStrategy.js +28 -0
  323. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
  324. package/dist/src/routing/strategies/overrideStrategy.test.d.ts +6 -0
  325. package/dist/src/routing/strategies/overrideStrategy.test.js +42 -0
  326. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -0
  327. package/dist/src/services/chatRecordingService.d.ts +8 -14
  328. package/dist/src/services/chatRecordingService.js +33 -21
  329. package/dist/src/services/chatRecordingService.js.map +1 -1
  330. package/dist/src/services/chatRecordingService.test.js +69 -25
  331. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  332. package/dist/src/services/fileDiscoveryService.d.ts +10 -0
  333. package/dist/src/services/fileDiscoveryService.js +32 -18
  334. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  335. package/dist/src/services/fileDiscoveryService.test.js +3 -3
  336. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  337. package/dist/src/services/fileSystemService.d.ts +9 -0
  338. package/dist/src/services/fileSystemService.js +12 -1
  339. package/dist/src/services/fileSystemService.js.map +1 -1
  340. package/dist/src/services/fileSystemService.test.js +1 -1
  341. package/dist/src/services/fileSystemService.test.js.map +1 -1
  342. package/dist/src/services/gitService.d.ts +3 -1
  343. package/dist/src/services/gitService.js +30 -24
  344. package/dist/src/services/gitService.js.map +1 -1
  345. package/dist/src/services/gitService.test.js +30 -37
  346. package/dist/src/services/gitService.test.js.map +1 -1
  347. package/dist/src/services/loopDetectionService.d.ts +8 -2
  348. package/dist/src/services/loopDetectionService.js +64 -24
  349. package/dist/src/services/loopDetectionService.js.map +1 -1
  350. package/dist/src/services/loopDetectionService.test.js +64 -13
  351. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  352. package/dist/src/services/shellExecutionService.d.ts +36 -2
  353. package/dist/src/services/shellExecutionService.js +238 -47
  354. package/dist/src/services/shellExecutionService.js.map +1 -1
  355. package/dist/src/services/shellExecutionService.test.js +197 -58
  356. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  357. package/dist/src/telemetry/activity-detector.d.ts +41 -0
  358. package/dist/src/telemetry/activity-detector.js +61 -0
  359. package/dist/src/telemetry/activity-detector.js.map +1 -0
  360. package/dist/src/telemetry/activity-detector.test.d.ts +6 -0
  361. package/dist/src/telemetry/activity-detector.test.js +136 -0
  362. package/dist/src/telemetry/activity-detector.test.js.map +1 -0
  363. package/dist/src/telemetry/activity-types.d.ts +19 -0
  364. package/dist/src/telemetry/activity-types.js +21 -0
  365. package/dist/src/telemetry/activity-types.js.map +1 -0
  366. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +34 -4
  367. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +322 -15
  368. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  369. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
  370. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +321 -11
  371. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  372. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +51 -2
  373. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +124 -2
  374. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  375. package/dist/src/telemetry/config.d.ts +31 -0
  376. package/dist/src/telemetry/config.js +76 -0
  377. package/dist/src/telemetry/config.js.map +1 -0
  378. package/dist/src/telemetry/config.test.d.ts +6 -0
  379. package/dist/src/telemetry/config.test.js +124 -0
  380. package/dist/src/telemetry/config.test.js.map +1 -0
  381. package/dist/src/telemetry/constants.d.ts +17 -7
  382. package/dist/src/telemetry/constants.js +18 -7
  383. package/dist/src/telemetry/constants.js.map +1 -1
  384. package/dist/src/telemetry/file-exporters.d.ts +5 -4
  385. package/dist/src/telemetry/file-exporters.js +1 -1
  386. package/dist/src/telemetry/file-exporters.js.map +1 -1
  387. package/dist/src/telemetry/gcp-exporters.d.ts +34 -0
  388. package/dist/src/telemetry/gcp-exporters.js +117 -0
  389. package/dist/src/telemetry/gcp-exporters.js.map +1 -0
  390. package/dist/src/telemetry/gcp-exporters.test.d.ts +6 -0
  391. package/dist/src/telemetry/gcp-exporters.test.js +318 -0
  392. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -0
  393. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  394. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  395. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  396. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  397. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  398. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  399. package/dist/src/telemetry/index.d.ts +12 -2
  400. package/dist/src/telemetry/index.js +16 -2
  401. package/dist/src/telemetry/index.js.map +1 -1
  402. package/dist/src/telemetry/loggers.d.ts +17 -2
  403. package/dist/src/telemetry/loggers.js +316 -14
  404. package/dist/src/telemetry/loggers.js.map +1 -1
  405. package/dist/src/telemetry/loggers.test.circular.js +3 -3
  406. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  407. package/dist/src/telemetry/loggers.test.js +452 -48
  408. package/dist/src/telemetry/loggers.test.js.map +1 -1
  409. package/dist/src/telemetry/metrics.d.ts +323 -12
  410. package/dist/src/telemetry/metrics.js +464 -83
  411. package/dist/src/telemetry/metrics.js.map +1 -1
  412. package/dist/src/telemetry/metrics.test.js +583 -38
  413. package/dist/src/telemetry/metrics.test.js.map +1 -1
  414. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  415. package/dist/src/telemetry/rate-limiter.js +100 -0
  416. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  417. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  418. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  419. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  420. package/dist/src/telemetry/sdk.d.ts +1 -1
  421. package/dist/src/telemetry/sdk.js +20 -2
  422. package/dist/src/telemetry/sdk.js.map +1 -1
  423. package/dist/src/telemetry/sdk.test.js +108 -0
  424. package/dist/src/telemetry/sdk.test.js.map +1 -1
  425. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  426. package/dist/src/telemetry/telemetry-utils.js +14 -0
  427. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  428. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  429. package/dist/src/telemetry/telemetry-utils.test.js +40 -0
  430. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  431. package/dist/src/telemetry/types.d.ts +136 -8
  432. package/dist/src/telemetry/types.js +233 -11
  433. package/dist/src/telemetry/types.js.map +1 -1
  434. package/dist/src/telemetry/uiTelemetry.d.ts +3 -3
  435. package/dist/src/telemetry/uiTelemetry.js +7 -8
  436. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  437. package/dist/src/telemetry/uiTelemetry.test.js +33 -29
  438. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  439. package/dist/src/test-utils/config.d.ts +2 -1
  440. package/dist/src/test-utils/config.js.map +1 -1
  441. package/dist/src/test-utils/index.d.ts +6 -0
  442. package/dist/src/test-utils/index.js +7 -0
  443. package/dist/src/test-utils/index.js.map +1 -0
  444. package/dist/src/test-utils/mock-tool.d.ts +66 -0
  445. package/dist/src/test-utils/{tools.js → mock-tool.js} +45 -29
  446. package/dist/src/test-utils/mock-tool.js.map +1 -0
  447. package/dist/src/test-utils/mockWorkspaceContext.d.ts +1 -1
  448. package/dist/src/tools/diffOptions.d.ts +1 -1
  449. package/dist/src/tools/diffOptions.js +21 -13
  450. package/dist/src/tools/diffOptions.js.map +1 -1
  451. package/dist/src/tools/diffOptions.test.js +58 -22
  452. package/dist/src/tools/diffOptions.test.js.map +1 -1
  453. package/dist/src/tools/edit.d.ts +6 -5
  454. package/dist/src/tools/edit.js +58 -40
  455. package/dist/src/tools/edit.js.map +1 -1
  456. package/dist/src/tools/edit.test.js +192 -16
  457. package/dist/src/tools/edit.test.js.map +1 -1
  458. package/dist/src/tools/glob.d.ts +7 -2
  459. package/dist/src/tools/glob.js +42 -23
  460. package/dist/src/tools/glob.js.map +1 -1
  461. package/dist/src/tools/glob.test.js +80 -4
  462. package/dist/src/tools/glob.test.js.map +1 -1
  463. package/dist/src/tools/grep.d.ts +3 -2
  464. package/dist/src/tools/grep.js +35 -15
  465. package/dist/src/tools/grep.js.map +1 -1
  466. package/dist/src/tools/grep.test.js +26 -3
  467. package/dist/src/tools/grep.test.js.map +1 -1
  468. package/dist/src/tools/ls.d.ts +3 -2
  469. package/dist/src/tools/ls.js +31 -39
  470. package/dist/src/tools/ls.js.map +1 -1
  471. package/dist/src/tools/ls.test.js +145 -280
  472. package/dist/src/tools/ls.test.js.map +1 -1
  473. package/dist/src/tools/mcp-client-manager.d.ts +8 -6
  474. package/dist/src/tools/mcp-client-manager.js +13 -4
  475. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  476. package/dist/src/tools/mcp-client-manager.test.js +20 -1
  477. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  478. package/dist/src/tools/mcp-client.d.ts +18 -21
  479. package/dist/src/tools/mcp-client.js +87 -120
  480. package/dist/src/tools/mcp-client.js.map +1 -1
  481. package/dist/src/tools/mcp-client.test.js +32 -152
  482. package/dist/src/tools/mcp-client.test.js.map +1 -1
  483. package/dist/src/tools/mcp-tool.d.ts +6 -4
  484. package/dist/src/tools/mcp-tool.js +51 -13
  485. package/dist/src/tools/mcp-tool.js.map +1 -1
  486. package/dist/src/tools/mcp-tool.test.js +166 -12
  487. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  488. package/dist/src/tools/memoryTool.d.ts +3 -2
  489. package/dist/src/tools/memoryTool.js +14 -37
  490. package/dist/src/tools/memoryTool.js.map +1 -1
  491. package/dist/src/tools/memoryTool.test.js +16 -4
  492. package/dist/src/tools/memoryTool.test.js.map +1 -1
  493. package/dist/src/tools/message-bus-integration.test.d.ts +6 -0
  494. package/dist/src/tools/message-bus-integration.test.js +183 -0
  495. package/dist/src/tools/message-bus-integration.test.js.map +1 -0
  496. package/dist/src/tools/modifiable-tool.d.ts +2 -2
  497. package/dist/src/tools/modifiable-tool.js +3 -3
  498. package/dist/src/tools/modifiable-tool.js.map +1 -1
  499. package/dist/src/tools/modifiable-tool.test.js +4 -4
  500. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  501. package/dist/src/tools/read-file.d.ts +3 -2
  502. package/dist/src/tools/read-file.js +23 -38
  503. package/dist/src/tools/read-file.js.map +1 -1
  504. package/dist/src/tools/read-file.test.js +38 -6
  505. package/dist/src/tools/read-file.test.js.map +1 -1
  506. package/dist/src/tools/read-many-files.d.ts +3 -2
  507. package/dist/src/tools/read-many-files.js +52 -107
  508. package/dist/src/tools/read-many-files.js.map +1 -1
  509. package/dist/src/tools/read-many-files.test.js +64 -11
  510. package/dist/src/tools/read-many-files.test.js.map +1 -1
  511. package/dist/src/tools/ripGrep.d.ts +55 -0
  512. package/dist/src/tools/ripGrep.js +393 -0
  513. package/dist/src/tools/ripGrep.js.map +1 -0
  514. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  515. package/dist/src/tools/ripGrep.test.js +976 -0
  516. package/dist/src/tools/ripGrep.test.js.map +1 -0
  517. package/dist/src/tools/shell.d.ts +13 -2
  518. package/dist/src/tools/shell.js +42 -32
  519. package/dist/src/tools/shell.js.map +1 -1
  520. package/dist/src/tools/shell.test.js +57 -75
  521. package/dist/src/tools/shell.test.js.map +1 -1
  522. package/dist/src/tools/smart-edit.d.ts +91 -0
  523. package/dist/src/tools/smart-edit.js +702 -0
  524. package/dist/src/tools/smart-edit.js.map +1 -0
  525. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  526. package/dist/src/tools/smart-edit.test.js +542 -0
  527. package/dist/src/tools/smart-edit.test.js.map +1 -0
  528. package/dist/src/tools/tool-error.d.ts +18 -1
  529. package/dist/src/tools/tool-error.js +27 -0
  530. package/dist/src/tools/tool-error.js.map +1 -1
  531. package/dist/src/tools/tool-registry.d.ts +10 -4
  532. package/dist/src/tools/tool-registry.js +20 -7
  533. package/dist/src/tools/tool-registry.js.map +1 -1
  534. package/dist/src/tools/tool-registry.test.js +93 -10
  535. package/dist/src/tools/tool-registry.test.js.map +1 -1
  536. package/dist/src/tools/tools.d.ts +33 -16
  537. package/dist/src/tools/tools.js +115 -5
  538. package/dist/src/tools/tools.js.map +1 -1
  539. package/dist/src/tools/tools.test.js +1 -2
  540. package/dist/src/tools/tools.test.js.map +1 -1
  541. package/dist/src/tools/web-fetch.d.ts +3 -2
  542. package/dist/src/tools/web-fetch.js +14 -10
  543. package/dist/src/tools/web-fetch.js.map +1 -1
  544. package/dist/src/tools/web-fetch.test.js +55 -16
  545. package/dist/src/tools/web-fetch.test.js.map +1 -1
  546. package/dist/src/tools/web-search.d.ts +4 -3
  547. package/dist/src/tools/web-search.js +31 -8
  548. package/dist/src/tools/web-search.js.map +1 -1
  549. package/dist/src/tools/web-search.test.js +69 -1
  550. package/dist/src/tools/web-search.test.js.map +1 -1
  551. package/dist/src/tools/write-file.d.ts +4 -3
  552. package/dist/src/tools/write-file.js +17 -18
  553. package/dist/src/tools/write-file.js.map +1 -1
  554. package/dist/src/tools/write-file.test.js +108 -24
  555. package/dist/src/tools/write-file.test.js.map +1 -1
  556. package/dist/src/tools/write-todos.d.ts +25 -0
  557. package/dist/src/tools/write-todos.js +150 -0
  558. package/dist/src/tools/write-todos.js.map +1 -0
  559. package/dist/src/tools/write-todos.test.d.ts +6 -0
  560. package/dist/src/tools/write-todos.test.js +89 -0
  561. package/dist/src/tools/write-todos.test.js.map +1 -0
  562. package/dist/src/utils/bfsFileSearch.d.ts +2 -2
  563. package/dist/src/utils/bfsFileSearch.js +13 -7
  564. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  565. package/dist/src/utils/bfsFileSearch.test.js +3 -3
  566. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  567. package/dist/src/utils/editCorrector.d.ts +9 -8
  568. package/dist/src/utils/editCorrector.js +62 -19
  569. package/dist/src/utils/editCorrector.js.map +1 -1
  570. package/dist/src/utils/editCorrector.test.js +33 -82
  571. package/dist/src/utils/editCorrector.test.js.map +1 -1
  572. package/dist/src/utils/editor.js +32 -45
  573. package/dist/src/utils/editor.js.map +1 -1
  574. package/dist/src/utils/editor.test.js +62 -76
  575. package/dist/src/utils/editor.test.js.map +1 -1
  576. package/dist/src/utils/environmentContext.d.ts +2 -2
  577. package/dist/src/utils/errorParsing.js +2 -2
  578. package/dist/src/utils/errorParsing.js.map +1 -1
  579. package/dist/src/utils/errorParsing.test.js +7 -7
  580. package/dist/src/utils/errorParsing.test.js.map +1 -1
  581. package/dist/src/utils/errorReporting.d.ts +1 -1
  582. package/dist/src/utils/errors.d.ts +25 -0
  583. package/dist/src/utils/errors.js +42 -0
  584. package/dist/src/utils/errors.js.map +1 -1
  585. package/dist/src/utils/fetch.js +1 -1
  586. package/dist/src/utils/fetch.js.map +1 -1
  587. package/dist/src/utils/fileUtils.d.ts +24 -12
  588. package/dist/src/utils/fileUtils.js +170 -79
  589. package/dist/src/utils/fileUtils.js.map +1 -1
  590. package/dist/src/utils/fileUtils.test.js +347 -29
  591. package/dist/src/utils/fileUtils.test.js.map +1 -1
  592. package/dist/src/utils/filesearch/crawler.d.ts +1 -1
  593. package/dist/src/utils/filesearch/crawler.test.js +2 -2
  594. package/dist/src/utils/filesearch/crawler.test.js.map +1 -1
  595. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  596. package/dist/src/utils/filesearch/fileSearch.js +14 -9
  597. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  598. package/dist/src/utils/filesearch/fileSearch.test.js +90 -0
  599. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  600. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  601. package/dist/src/utils/{flashFallback.integration.test.js → flashFallback.test.js} +33 -29
  602. package/dist/src/utils/flashFallback.test.js.map +1 -0
  603. package/dist/src/utils/geminiIgnoreParser.d.ts +18 -0
  604. package/dist/src/utils/geminiIgnoreParser.js +61 -0
  605. package/dist/src/utils/geminiIgnoreParser.js.map +1 -0
  606. package/dist/src/utils/geminiIgnoreParser.test.d.ts +6 -0
  607. package/dist/src/utils/geminiIgnoreParser.test.js +50 -0
  608. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -0
  609. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -2
  610. package/dist/src/utils/generateContentResponseUtilities.js +1 -13
  611. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  612. package/dist/src/utils/generateContentResponseUtilities.test.js +2 -40
  613. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  614. package/dist/src/utils/getFolderStructure.d.ts +2 -2
  615. package/dist/src/utils/getFolderStructure.js +3 -3
  616. package/dist/src/utils/getFolderStructure.js.map +1 -1
  617. package/dist/src/utils/getFolderStructure.test.js +4 -4
  618. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  619. package/dist/src/utils/gitIgnoreParser.d.ts +3 -7
  620. package/dist/src/utils/gitIgnoreParser.js +126 -35
  621. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  622. package/dist/src/utils/gitIgnoreParser.test.js +69 -38
  623. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  624. package/dist/src/utils/gitUtils.js +2 -2
  625. package/dist/src/utils/gitUtils.js.map +1 -1
  626. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  627. package/dist/src/utils/ignorePatterns.js +220 -0
  628. package/dist/src/utils/ignorePatterns.js.map +1 -0
  629. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  630. package/dist/src/utils/ignorePatterns.test.js +250 -0
  631. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  632. package/dist/src/utils/installationManager.d.ts +16 -0
  633. package/dist/src/utils/installationManager.js +50 -0
  634. package/dist/src/utils/installationManager.js.map +1 -0
  635. package/dist/src/utils/installationManager.test.d.ts +6 -0
  636. package/dist/src/utils/installationManager.test.js +83 -0
  637. package/dist/src/utils/installationManager.test.js.map +1 -0
  638. package/dist/src/utils/language-detection.d.ts +6 -0
  639. package/dist/src/utils/language-detection.js +101 -0
  640. package/dist/src/utils/language-detection.js.map +1 -0
  641. package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
  642. package/dist/src/utils/llm-edit-fixer.js +131 -0
  643. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  644. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  645. package/dist/src/utils/llm-edit-fixer.test.js +186 -0
  646. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  647. package/dist/src/utils/memoryDiscovery.d.ts +7 -6
  648. package/dist/src/utils/memoryDiscovery.js +68 -33
  649. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  650. package/dist/src/utils/memoryDiscovery.test.js +88 -26
  651. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  652. package/dist/src/utils/memoryImportProcessor.js +15 -22
  653. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  654. package/dist/src/utils/memoryImportProcessor.test.js +16 -141
  655. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  656. package/dist/src/utils/messageInspectors.d.ts +1 -1
  657. package/dist/src/utils/nextSpeakerChecker.d.ts +3 -3
  658. package/dist/src/utils/nextSpeakerChecker.js +8 -2
  659. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  660. package/dist/src/utils/nextSpeakerChecker.test.js +75 -64
  661. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  662. package/dist/src/utils/partUtils.d.ts +22 -1
  663. package/dist/src/utils/partUtils.js +68 -0
  664. package/dist/src/utils/partUtils.js.map +1 -1
  665. package/dist/src/utils/partUtils.test.js +112 -1
  666. package/dist/src/utils/partUtils.test.js.map +1 -1
  667. package/dist/src/utils/pathReader.d.ts +17 -0
  668. package/dist/src/utils/pathReader.js +92 -0
  669. package/dist/src/utils/pathReader.js.map +1 -0
  670. package/dist/src/utils/pathReader.test.d.ts +6 -0
  671. package/dist/src/utils/pathReader.test.js +363 -0
  672. package/dist/src/utils/pathReader.test.js.map +1 -0
  673. package/dist/src/utils/paths.d.ts +0 -17
  674. package/dist/src/utils/paths.js +2 -28
  675. package/dist/src/utils/paths.js.map +1 -1
  676. package/dist/src/utils/promptIdContext.d.ts +7 -0
  677. package/dist/src/utils/promptIdContext.js +8 -0
  678. package/dist/src/utils/promptIdContext.js.map +1 -0
  679. package/dist/src/utils/quotaErrorDetection.d.ts +1 -1
  680. package/dist/src/utils/retry.d.ts +3 -1
  681. package/dist/src/utils/retry.js +20 -5
  682. package/dist/src/utils/retry.js.map +1 -1
  683. package/dist/src/utils/retry.test.js +35 -3
  684. package/dist/src/utils/retry.test.js.map +1 -1
  685. package/dist/src/utils/schemaValidator.js +15 -1
  686. package/dist/src/utils/schemaValidator.js.map +1 -1
  687. package/dist/src/utils/schemaValidator.test.d.ts +6 -0
  688. package/dist/src/utils/schemaValidator.test.js +113 -0
  689. package/dist/src/utils/schemaValidator.test.js.map +1 -0
  690. package/dist/src/utils/session.js +1 -1
  691. package/dist/src/utils/session.js.map +1 -1
  692. package/dist/src/utils/shell-utils.d.ts +6 -1
  693. package/dist/src/utils/shell-utils.js +51 -30
  694. package/dist/src/utils/shell-utils.js.map +1 -1
  695. package/dist/src/utils/shell-utils.test.js +9 -0
  696. package/dist/src/utils/shell-utils.test.js.map +1 -1
  697. package/dist/src/utils/summarizer.d.ts +2 -2
  698. package/dist/src/utils/summarizer.test.js.map +1 -1
  699. package/dist/src/utils/systemEncoding.js +2 -2
  700. package/dist/src/utils/systemEncoding.js.map +1 -1
  701. package/dist/src/utils/systemEncoding.test.js +2 -2
  702. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  703. package/dist/src/utils/terminalSerializer.d.ts +25 -0
  704. package/dist/src/utils/terminalSerializer.js +432 -0
  705. package/dist/src/utils/terminalSerializer.js.map +1 -0
  706. package/dist/src/utils/terminalSerializer.test.d.ts +6 -0
  707. package/dist/src/utils/terminalSerializer.test.js +176 -0
  708. package/dist/src/utils/terminalSerializer.test.js.map +1 -0
  709. package/dist/src/utils/textUtils.d.ts +5 -0
  710. package/dist/src/utils/textUtils.js +14 -0
  711. package/dist/src/utils/textUtils.js.map +1 -1
  712. package/dist/src/utils/textUtils.test.d.ts +6 -0
  713. package/dist/src/utils/textUtils.test.js +59 -0
  714. package/dist/src/utils/textUtils.test.js.map +1 -0
  715. package/dist/src/utils/thoughtUtils.d.ts +21 -0
  716. package/dist/src/utils/thoughtUtils.js +39 -0
  717. package/dist/src/utils/thoughtUtils.js.map +1 -0
  718. package/dist/src/utils/thoughtUtils.test.d.ts +6 -0
  719. package/dist/src/utils/thoughtUtils.test.js +78 -0
  720. package/dist/src/utils/thoughtUtils.test.js.map +1 -0
  721. package/dist/src/utils/tool-utils.d.ts +19 -0
  722. package/dist/src/utils/tool-utils.js +58 -0
  723. package/dist/src/utils/tool-utils.js.map +1 -0
  724. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  725. package/dist/src/utils/tool-utils.test.js +61 -0
  726. package/dist/src/utils/tool-utils.test.js.map +1 -0
  727. package/dist/src/utils/userAccountManager.d.ts +20 -0
  728. package/dist/src/utils/userAccountManager.js +114 -0
  729. package/dist/src/utils/userAccountManager.js.map +1 -0
  730. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  731. package/dist/src/utils/{user_account.test.js → userAccountManager.test.js} +33 -30
  732. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  733. package/dist/src/utils/workspaceContext.js +13 -7
  734. package/dist/src/utils/workspaceContext.js.map +1 -1
  735. package/dist/src/utils/workspaceContext.test.js +41 -16
  736. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  737. package/dist/tsconfig.tsbuildinfo +1 -1
  738. package/package.json +18 -9
  739. package/dist/src/core/modelCheck.d.ts +0 -14
  740. package/dist/src/core/modelCheck.js +0 -62
  741. package/dist/src/core/modelCheck.js.map +0 -1
  742. package/dist/src/test-utils/tools.d.ts +0 -44
  743. package/dist/src/test-utils/tools.js.map +0 -1
  744. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  745. package/dist/src/utils/user_account.d.ts +0 -9
  746. package/dist/src/utils/user_account.js +0 -109
  747. package/dist/src/utils/user_account.js.map +0 -1
  748. package/dist/src/utils/user_account.test.js.map +0 -1
  749. package/dist/src/utils/user_id.d.ts +0 -11
  750. package/dist/src/utils/user_id.js +0 -49
  751. package/dist/src/utils/user_id.js.map +0 -1
  752. package/dist/src/utils/user_id.test.js +0 -21
  753. package/dist/src/utils/user_id.test.js.map +0 -1
  754. /package/dist/src/{utils/flashFallback.integration.test.d.ts → agents/executor.test.d.ts} +0 -0
  755. /package/dist/src/{utils/user_account.test.d.ts → agents/invocation.test.d.ts} +0 -0
  756. /package/dist/src/{utils/user_id.test.d.ts → agents/registry.test.d.ts} +0 -0
@@ -5,12 +5,31 @@
5
5
  */
6
6
  // DISCLAIMER: This is a copied version of https://github.com/googleapis/js-genai/blob/main/src/chats.ts with the intention of working around a key bug
7
7
  // where function responses are not treated as "valid" responses: https://b.corp.google.com/issues/420354090
8
- import { createUserContent, } from '@google/genai';
8
+ import { GenerateContentResponse, FinishReason, ApiError, } from '@google/genai';
9
+ import { toParts } from '../code_assist/converter.js';
10
+ import { createUserContent } from '@google/genai';
9
11
  import { retryWithBackoff } from '../utils/retry.js';
12
+ import { DEFAULT_GEMINI_FLASH_MODEL, getEffectiveModel, } from '../config/models.js';
13
+ import { hasCycleInSchema, MUTATOR_KINDS } from '../tools/tools.js';
14
+ import { logContentRetry, logContentRetryFailure, } from '../telemetry/loggers.js';
15
+ import { ChatRecordingService } from '../services/chatRecordingService.js';
16
+ import { ContentRetryEvent, ContentRetryFailureEvent, } from '../telemetry/types.js';
17
+ import { handleFallback } from '../fallback/handler.js';
10
18
  import { isFunctionResponse } from '../utils/messageInspectors.js';
11
- import { AuthType, createContentGenerator } from './contentGenerator.js';
12
- import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
13
- import { hasCycleInSchema } from '../tools/tools.js';
19
+ import { partListUnionToString } from './geminiRequest.js';
20
+ import { uiTelemetryService } from '../telemetry/uiTelemetry.js';
21
+ export var StreamEventType;
22
+ (function (StreamEventType) {
23
+ /** A regular content chunk from the API. */
24
+ StreamEventType["CHUNK"] = "chunk";
25
+ /** A signal that a retry is about to happen. The UI should discard any partial
26
+ * content from the attempt that just failed. */
27
+ StreamEventType["RETRY"] = "retry";
28
+ })(StreamEventType || (StreamEventType = {}));
29
+ const INVALID_CONTENT_RETRY_OPTIONS = {
30
+ maxAttempts: 2, // 1 initial call + 1 retry
31
+ initialDelayMs: 500,
32
+ };
14
33
  /**
15
34
  * Returns true if the response is valid, false otherwise.
16
35
  */
@@ -24,6 +43,16 @@ function isValidResponse(response) {
24
43
  }
25
44
  return isValidContent(content);
26
45
  }
46
+ export function isValidNonThoughtTextPart(part) {
47
+ return (typeof part.text === 'string' &&
48
+ !part.thought &&
49
+ // Technically, the model should never generate parts that have text and
50
+ // any of these but we don't trust them so check anyways.
51
+ !part.functionCall &&
52
+ !part.functionResponse &&
53
+ !part.inlineData &&
54
+ !part.fileData);
55
+ }
27
56
  function isValidContent(content) {
28
57
  if (content.parts === undefined || content.parts.length === 0) {
29
58
  return false;
@@ -84,14 +113,22 @@ function extractCuratedHistory(comprehensiveHistory) {
84
113
  if (isValid) {
85
114
  curatedHistory.push(...modelOutput);
86
115
  }
87
- else {
88
- // Remove the last user input when model content is invalid.
89
- curatedHistory.pop();
90
- }
91
116
  }
92
117
  }
93
118
  return curatedHistory;
94
119
  }
120
+ /**
121
+ * Custom error to signal that a stream completed with invalid content,
122
+ * which should trigger a retry.
123
+ */
124
+ export class InvalidStreamError extends Error {
125
+ type;
126
+ constructor(message, type) {
127
+ super(message);
128
+ this.name = 'InvalidStreamError';
129
+ this.type = type;
130
+ }
131
+ }
95
132
  /**
96
133
  * Chat session that enables sending messages to the model with previous
97
134
  * conversation context.
@@ -101,213 +138,23 @@ function extractCuratedHistory(comprehensiveHistory) {
101
138
  */
102
139
  export class GeminiChat {
103
140
  config;
104
- contentGenerator;
105
141
  generationConfig;
106
142
  history;
107
143
  // A promise to represent the current state of the message being sent to the
108
144
  // model.
109
145
  sendPromise = Promise.resolve();
110
- constructor(config,
111
- // [PATCH:API_KEY_ROTATION] Remove readonly to allow updating contentGenerator for API key rotation
112
- contentGenerator,
113
- // [/PATCH:API_KEY_ROTATION]
114
- generationConfig = {}, history = []) {
146
+ chatRecordingService;
147
+ constructor(config, generationConfig = {}, history = []) {
115
148
  this.config = config;
116
- this.contentGenerator = contentGenerator;
117
149
  this.generationConfig = generationConfig;
118
150
  this.history = history;
119
151
  validateHistory(history);
120
- }
121
- // [PATCH:API_KEY_ROTATION] Update contentGenerator for API key rotation
122
- updateContentGenerator(newContentGenerator) {
123
- console.log('[API_KEY_ROTATION] Updating content generator in GeminiChat instance');
124
- this.contentGenerator = newContentGenerator;
125
- console.log('[API_KEY_ROTATION] Content generator updated successfully');
126
- }
127
- // [/PATCH:API_KEY_ROTATION]
128
- /**
129
- * [PATCH:API_KEY_ROTATION] Safely format API key for logging (shows first 8 and last 4 chars)
130
- */
131
- formatApiKeyForLog(apiKey) {
132
- if (!apiKey || apiKey.length < 12) {
133
- return 'invalid-key';
134
- }
135
- const start = apiKey.substring(0, 8);
136
- const end = apiKey.substring(apiKey.length - 4);
137
- const middle = '*'.repeat(Math.min(apiKey.length - 12, 20));
138
- return `${start}${middle}${end}`;
139
- }
140
- /**
141
- * [PATCH:API_KEY_ROTATION] Tries to rotate API key for GEMINI/OPENAI API key authentication modes.
142
- * Returns the current model name if key was rotated, null otherwise.
143
- */
144
- async tryRotateApiKey(authType) {
145
- // Support both GEMINI and OPENAI API key modes
146
- let envKey;
147
- if (authType === AuthType.USE_GEMINI) {
148
- envKey = 'GEMINI_API_KEY';
149
- }
150
- else if (authType === AuthType.USE_OPENAI) {
151
- envKey = 'OPENAI_API_KEY';
152
- }
153
- else {
154
- return null; // Not a supported API key mode
155
- }
156
- const newApiKey = process.env[envKey]?.trim();
157
- if (!newApiKey) {
158
- return null;
159
- }
160
- const currentConfig = this.config.getContentGeneratorConfig();
161
- if (!currentConfig) {
162
- return null;
163
- }
164
- if (currentConfig.apiKey === newApiKey) {
165
- return null; // Same key, no rotation needed
166
- }
167
- try {
168
- // Update the API key in config first
169
- currentConfig.apiKey = newApiKey;
170
- // Create new content generator with the new API key
171
- const newContentGenerator = await createContentGenerator(currentConfig, this.config, this.config.getSessionId());
172
- // Update our content generator
173
- this.contentGenerator = newContentGenerator;
174
- const modelName = this.config.getModel();
175
- return modelName;
176
- }
177
- catch (_error) {
178
- return null;
179
- }
180
- }
181
- // [/PATCH:API_KEY_ROTATION]
182
- /**
183
- * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
184
- * Uses a fallback handler if provided by the config; otherwise, returns null.
185
- */
186
- async handleFlashFallback(authType, error) {
187
- // First try to rotate API key for GEMINI/OPENAI API key modes
188
- const rotateResult = await this.tryRotateApiKey(authType);
189
- if (rotateResult) {
190
- return rotateResult;
191
- }
192
- const currentModel = this.config.getModel();
193
- const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
194
- // Don't fallback if already using Flash model
195
- if (currentModel === fallbackModel) {
196
- return null;
197
- }
198
- // Check if config has a fallback handler (set by CLI package)
199
- const fallbackHandler = this.config.flashFallbackHandler;
200
- if (typeof fallbackHandler === 'function') {
201
- try {
202
- const accepted = await fallbackHandler(currentModel, fallbackModel, error);
203
- if (accepted !== false && accepted !== null) {
204
- // Only OAuth users need model fallback, API key users rely on key rotation
205
- if (authType === AuthType.LOGIN_WITH_GOOGLE) {
206
- this.config.setModel(fallbackModel);
207
- this.config.setFallbackMode(true);
208
- return fallbackModel;
209
- }
210
- else {
211
- const currentModel = this.config.getModel();
212
- return currentModel; // Continue with original model, rely on API key rotation
213
- }
214
- }
215
- // Check if the model was switched manually in the handler
216
- const newModel = this.config.getModel();
217
- if (newModel === fallbackModel) {
218
- return null; // Model was switched but don't continue with current prompt
219
- }
220
- }
221
- catch (error) {
222
- // Fallback handler failed, continue to return null
223
- }
224
- }
225
- return null;
152
+ this.chatRecordingService = new ChatRecordingService(config);
153
+ this.chatRecordingService.initialize();
226
154
  }
227
155
  setSystemInstruction(sysInstr) {
228
156
  this.generationConfig.systemInstruction = sysInstr;
229
157
  }
230
- /**
231
- * Sends a message to the model and returns the response.
232
- *
233
- * @remarks
234
- * This method will wait for the previous message to be processed before
235
- * sending the next message.
236
- *
237
- * @see {@link Chat#sendMessageStream} for streaming method.
238
- * @param params - parameters for sending messages within a chat session.
239
- * @returns The model's response.
240
- *
241
- * @example
242
- * ```ts
243
- * const chat = ai.chats.create({model: 'gemini-2.0-flash'});
244
- * const response = await chat.sendMessage({
245
- * message: 'Why is the sky blue?'
246
- * });
247
- * console.log(response.text);
248
- * ```
249
- */
250
- async sendMessage(params, prompt_id) {
251
- await this.sendPromise;
252
- const userContent = createUserContent(params.message);
253
- const requestContents = this.getHistory(true).concat(userContent);
254
- let response;
255
- try {
256
- const apiCall = () => {
257
- const modelToUse = this.config.getModel() || DEFAULT_GEMINI_FLASH_MODEL;
258
- // Prevent Flash model calls immediately after quota error
259
- if (this.config.getQuotaErrorOccurred() &&
260
- modelToUse === DEFAULT_GEMINI_FLASH_MODEL) {
261
- throw new Error('Please submit a new query to continue with the Flash model.');
262
- }
263
- return this.contentGenerator.generateContent({
264
- model: modelToUse,
265
- contents: requestContents,
266
- config: { ...this.generationConfig, ...params.config },
267
- }, prompt_id);
268
- };
269
- response = await retryWithBackoff(apiCall, {
270
- shouldRetry: (error) => {
271
- // Check for known error messages and codes.
272
- if (error instanceof Error && error.message) {
273
- if (isSchemaDepthError(error.message))
274
- return false;
275
- if (error.message.includes('429'))
276
- return true;
277
- if (error.message.match(/5\d{2}/))
278
- return true;
279
- }
280
- return false; // Don't retry other errors by default
281
- },
282
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
283
- authType: this.config.getContentGeneratorConfig()?.authType,
284
- });
285
- this.sendPromise = (async () => {
286
- const outputContent = response.candidates?.[0]?.content;
287
- // Because the AFC input contains the entire curated chat history in
288
- // addition to the new user input, we need to truncate the AFC history
289
- // to deduplicate the existing chat history.
290
- const fullAutomaticFunctionCallingHistory = response.automaticFunctionCallingHistory;
291
- const index = this.getHistory(true).length;
292
- let automaticFunctionCallingHistory = [];
293
- if (fullAutomaticFunctionCallingHistory != null) {
294
- automaticFunctionCallingHistory =
295
- fullAutomaticFunctionCallingHistory.slice(index) ?? [];
296
- }
297
- const modelOutput = outputContent ? [outputContent] : [];
298
- this.recordHistory(userContent, modelOutput, automaticFunctionCallingHistory);
299
- })();
300
- await this.sendPromise.catch(() => {
301
- // Resets sendPromise to avoid subsequent calls failing
302
- this.sendPromise = Promise.resolve();
303
- });
304
- return response;
305
- }
306
- catch (error) {
307
- this.sendPromise = Promise.resolve();
308
- throw error;
309
- }
310
- }
311
158
  /**
312
159
  * Sends a message to the model and returns the response in chunks.
313
160
  *
@@ -323,64 +170,113 @@ export class GeminiChat {
323
170
  * ```ts
324
171
  * const chat = ai.chats.create({model: 'gemini-2.0-flash'});
325
172
  * const response = await chat.sendMessageStream({
326
- * message: 'Why is the sky blue?'
173
+ * message: 'Why is the sky blue?'
327
174
  * });
328
175
  * for await (const chunk of response) {
329
- * console.log(chunk.text);
176
+ * console.log(chunk.text);
330
177
  * }
331
178
  * ```
332
179
  */
333
- async sendMessageStream(params, prompt_id) {
180
+ async sendMessageStream(model, params, prompt_id) {
334
181
  await this.sendPromise;
182
+ let streamDoneResolver;
183
+ const streamDonePromise = new Promise((resolve) => {
184
+ streamDoneResolver = resolve;
185
+ });
186
+ this.sendPromise = streamDonePromise;
335
187
  const userContent = createUserContent(params.message);
336
- const requestContents = this.getHistory(true).concat(userContent);
337
- try {
338
- const apiCall = () => {
339
- const modelToUse = this.config.getModel();
340
- // Prevent Flash model calls immediately after quota error
341
- if (this.config.getQuotaErrorOccurred() &&
342
- modelToUse === DEFAULT_GEMINI_FLASH_MODEL) {
343
- throw new Error('Please submit a new query to continue with the Flash model.');
344
- }
345
- return this.contentGenerator.generateContentStream({
346
- model: modelToUse,
347
- contents: requestContents,
348
- config: { ...this.generationConfig, ...params.config },
349
- }, prompt_id);
350
- };
351
- // Note: Retrying streams can be complex. If generateContentStream itself doesn't handle retries
352
- // for transient issues internally before yielding the async generator, this retry will re-initiate
353
- // the stream. For simple 429/500 errors on initial call, this is fine.
354
- // If errors occur mid-stream, this setup won't resume the stream; it will restart it.
355
- const streamResponse = await retryWithBackoff(apiCall, {
356
- shouldRetry: (error) => {
357
- // Check for known error messages and codes.
358
- if (error instanceof Error && error.message) {
359
- if (isSchemaDepthError(error.message))
360
- return false;
361
- if (error.message.includes('429'))
362
- return true;
363
- if (error.message.match(/5\d{2}/))
364
- return true;
365
- }
366
- return false; // Don't retry other errors by default
367
- },
368
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
369
- authType: this.config.getContentGeneratorConfig()?.authType,
188
+ // Record user input - capture complete message with all parts (text, files, images, etc.)
189
+ // but skip recording function responses (tool call results) as they should be stored in tool call records
190
+ if (!isFunctionResponse(userContent)) {
191
+ const userMessage = Array.isArray(params.message)
192
+ ? params.message
193
+ : [params.message];
194
+ const userMessageContent = partListUnionToString(toParts(userMessage));
195
+ this.chatRecordingService.recordMessage({
196
+ model,
197
+ type: 'user',
198
+ content: userMessageContent,
370
199
  });
371
- // Resolve the internal tracking of send completion promise - `sendPromise`
372
- // for both success and failure response. The actual failure is still
373
- // propagated by the `await streamResponse`.
374
- this.sendPromise = Promise.resolve(streamResponse)
375
- .then(() => undefined)
376
- .catch(() => undefined);
377
- const result = this.processStreamResponse(streamResponse, userContent);
378
- return result;
379
- }
380
- catch (error) {
381
- this.sendPromise = Promise.resolve();
382
- throw error;
383
200
  }
201
+ // Add user content to history ONCE before any attempts.
202
+ this.history.push(userContent);
203
+ const requestContents = this.getHistory(true);
204
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
205
+ const self = this;
206
+ return (async function* () {
207
+ try {
208
+ let lastError = new Error('Request failed after all retries.');
209
+ for (let attempt = 0; attempt < INVALID_CONTENT_RETRY_OPTIONS.maxAttempts; attempt++) {
210
+ try {
211
+ if (attempt > 0) {
212
+ yield { type: StreamEventType.RETRY };
213
+ }
214
+ const stream = await self.makeApiCallAndProcessStream(model, requestContents, params, prompt_id);
215
+ for await (const chunk of stream) {
216
+ yield { type: StreamEventType.CHUNK, value: chunk };
217
+ }
218
+ lastError = null;
219
+ break;
220
+ }
221
+ catch (error) {
222
+ lastError = error;
223
+ const isContentError = error instanceof InvalidStreamError;
224
+ if (isContentError) {
225
+ // Check if we have more attempts left.
226
+ if (attempt < INVALID_CONTENT_RETRY_OPTIONS.maxAttempts - 1) {
227
+ logContentRetry(self.config, new ContentRetryEvent(attempt, error.type, INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs, model));
228
+ await new Promise((res) => setTimeout(res, INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs *
229
+ (attempt + 1)));
230
+ continue;
231
+ }
232
+ }
233
+ break;
234
+ }
235
+ }
236
+ if (lastError) {
237
+ if (lastError instanceof InvalidStreamError) {
238
+ logContentRetryFailure(self.config, new ContentRetryFailureEvent(INVALID_CONTENT_RETRY_OPTIONS.maxAttempts, lastError.type, model));
239
+ }
240
+ throw lastError;
241
+ }
242
+ }
243
+ finally {
244
+ streamDoneResolver();
245
+ }
246
+ })();
247
+ }
248
+ async makeApiCallAndProcessStream(model, requestContents, params, prompt_id) {
249
+ const apiCall = () => {
250
+ const modelToUse = getEffectiveModel(this.config.isInFallbackMode(), model);
251
+ if (this.config.getQuotaErrorOccurred() &&
252
+ modelToUse === DEFAULT_GEMINI_FLASH_MODEL) {
253
+ throw new Error('Please submit a new query to continue with the Flash model.');
254
+ }
255
+ return this.config.getContentGenerator().generateContentStream({
256
+ model: modelToUse,
257
+ contents: requestContents,
258
+ config: { ...this.generationConfig, ...params.config },
259
+ }, prompt_id);
260
+ };
261
+ const onPersistent429Callback = async (authType, error) => await handleFallback(this.config, model, authType, error);
262
+ const streamResponse = await retryWithBackoff(apiCall, {
263
+ shouldRetryOnError: (error) => {
264
+ if (error instanceof ApiError && error.message) {
265
+ if (error.status === 400)
266
+ return false;
267
+ if (isSchemaDepthError(error.message))
268
+ return false;
269
+ if (error.status === 429)
270
+ return true;
271
+ if (error.status >= 500 && error.status < 600)
272
+ return true;
273
+ }
274
+ return false;
275
+ },
276
+ onPersistent429: onPersistent429Callback,
277
+ authType: this.config.getContentGeneratorConfig()?.authType,
278
+ });
279
+ return this.processStreamResponse(model, streamResponse);
384
280
  }
385
281
  /**
386
282
  * Returns the chat history.
@@ -392,7 +288,7 @@ export class GeminiChat {
392
288
  * - The `curated history` contains only the valid turns between user and
393
289
  * model, which will be included in the subsequent requests sent to the model.
394
290
  * - The `comprehensive history` contains all turns, including invalid or
395
- * empty model outputs, providing a complete record of the history.
291
+ * empty model outputs, providing a complete record of the history.
396
292
  *
397
293
  * The history is updated after receiving the response from the model,
398
294
  * for streaming response, it means receiving the last chunk of the response.
@@ -401,9 +297,9 @@ export class GeminiChat {
401
297
  * history`, set the `curated` parameter to `true`.
402
298
  *
403
299
  * @param curated - whether to return the curated history or the comprehensive
404
- * history.
300
+ * history.
405
301
  * @return History contents alternating between user and model for the entire
406
- * chat session.
302
+ * chat session.
407
303
  */
408
304
  getHistory(curated = false) {
409
305
  const history = curated
@@ -421,8 +317,6 @@ export class GeminiChat {
421
317
  }
422
318
  /**
423
319
  * Adds a new entry to the chat history.
424
- *
425
- * @param content - The content to add to the history.
426
320
  */
427
321
  addHistory(content) {
428
322
  this.history.push(content);
@@ -430,6 +324,22 @@ export class GeminiChat {
430
324
  setHistory(history) {
431
325
  this.history = history;
432
326
  }
327
+ stripThoughtsFromHistory() {
328
+ this.history = this.history.map((content) => {
329
+ const newContent = { ...content };
330
+ if (newContent.parts) {
331
+ newContent.parts = newContent.parts.map((part) => {
332
+ if (part && typeof part === 'object' && 'thoughtSignature' in part) {
333
+ const newPart = { ...part };
334
+ delete newPart.thoughtSignature;
335
+ return newPart;
336
+ }
337
+ return part;
338
+ });
339
+ }
340
+ return newContent;
341
+ });
342
+ }
433
343
  setTools(tools) {
434
344
  this.generationConfig.tools = tools;
435
345
  }
@@ -455,122 +365,156 @@ export class GeminiChat {
455
365
  }
456
366
  }
457
367
  }
458
- async *processStreamResponse(streamResponse, inputContent) {
459
- const outputContent = [];
460
- const chunks = [];
461
- let errorOccurred = false;
462
- try {
463
- for await (const chunk of streamResponse) {
464
- if (isValidResponse(chunk)) {
465
- chunks.push(chunk);
466
- const content = chunk.candidates?.[0]?.content;
467
- if (content !== undefined) {
468
- if (this.isThoughtContent(content)) {
469
- yield chunk;
470
- continue;
471
- }
472
- outputContent.push(content);
368
+ async *processStreamResponse(model, streamResponse) {
369
+ const modelResponseParts = [];
370
+ let hasToolCall = false;
371
+ let hasFinishReason = false;
372
+ for await (const chunk of this.stopBeforeSecondMutator(streamResponse)) {
373
+ hasFinishReason =
374
+ chunk?.candidates?.some((candidate) => candidate.finishReason) ?? false;
375
+ if (isValidResponse(chunk)) {
376
+ const content = chunk.candidates?.[0]?.content;
377
+ if (content?.parts) {
378
+ if (content.parts.some((part) => part.thought)) {
379
+ // Record thoughts
380
+ this.recordThoughtFromContent(content);
473
381
  }
382
+ if (content.parts.some((part) => part.functionCall)) {
383
+ hasToolCall = true;
384
+ }
385
+ modelResponseParts.push(...content.parts.filter((part) => !part.thought));
474
386
  }
475
- yield chunk;
476
387
  }
477
- }
478
- catch (error) {
479
- errorOccurred = true;
480
- throw error;
481
- }
482
- if (!errorOccurred) {
483
- const allParts = [];
484
- for (const content of outputContent) {
485
- if (content.parts) {
486
- allParts.push(...content.parts);
388
+ // Record token usage if this chunk has usageMetadata
389
+ if (chunk.usageMetadata) {
390
+ this.chatRecordingService.recordMessageTokens(chunk.usageMetadata);
391
+ if (chunk.usageMetadata.promptTokenCount !== undefined) {
392
+ uiTelemetryService.setLastPromptTokenCount(chunk.usageMetadata.promptTokenCount);
487
393
  }
488
394
  }
489
- }
490
- this.recordHistory(inputContent, outputContent);
491
- }
492
- recordHistory(userInput, modelOutput, automaticFunctionCallingHistory) {
493
- const nonThoughtModelOutput = modelOutput.filter((content) => !this.isThoughtContent(content));
494
- let outputContents = [];
495
- if (nonThoughtModelOutput.length > 0 &&
496
- nonThoughtModelOutput.every((content) => content.role !== undefined)) {
497
- outputContents = nonThoughtModelOutput;
498
- }
499
- else if (nonThoughtModelOutput.length === 0 && modelOutput.length > 0) {
500
- // This case handles when the model returns only a thought.
501
- // We don't want to add an empty model response in this case.
502
- }
503
- else {
504
- // When not a function response appends an empty content when model returns empty response, so that the
505
- // history is always alternating between user and model.
506
- // Workaround for: https://b.corp.google.com/issues/420354090
507
- if (!isFunctionResponse(userInput)) {
508
- outputContents.push({
509
- role: 'model',
510
- parts: [],
511
- });
395
+ yield chunk; // Yield every chunk to the UI immediately.
396
+ }
397
+ // String thoughts and consolidate text parts.
398
+ const consolidatedParts = [];
399
+ for (const part of modelResponseParts) {
400
+ const lastPart = consolidatedParts[consolidatedParts.length - 1];
401
+ if (lastPart?.text &&
402
+ isValidNonThoughtTextPart(lastPart) &&
403
+ isValidNonThoughtTextPart(part)) {
404
+ lastPart.text += part.text;
405
+ }
406
+ else {
407
+ consolidatedParts.push(part);
512
408
  }
513
409
  }
514
- if (automaticFunctionCallingHistory &&
515
- automaticFunctionCallingHistory.length > 0) {
516
- this.history.push(...extractCuratedHistory(automaticFunctionCallingHistory));
517
- }
518
- else {
519
- this.history.push(userInput);
410
+ const responseText = consolidatedParts
411
+ .filter((part) => part.text)
412
+ .map((part) => part.text)
413
+ .join('')
414
+ .trim();
415
+ // Record model response text from the collected parts
416
+ if (responseText) {
417
+ this.chatRecordingService.recordMessage({
418
+ model,
419
+ type: 'gemini',
420
+ content: responseText,
421
+ });
520
422
  }
521
- // Consolidate adjacent model roles in outputContents
522
- const consolidatedOutputContents = [];
523
- for (const content of outputContents) {
524
- if (this.isThoughtContent(content)) {
525
- continue;
526
- }
527
- const lastContent = consolidatedOutputContents[consolidatedOutputContents.length - 1];
528
- if (this.isTextContent(lastContent) && this.isTextContent(content)) {
529
- // If both current and last are text, combine their text into the lastContent's first part
530
- // and append any other parts from the current content.
531
- lastContent.parts[0].text += content.parts[0].text || '';
532
- if (content.parts.length > 1) {
533
- lastContent.parts.push(...content.parts.slice(1));
534
- }
423
+ // Stream validation logic: A stream is considered successful if:
424
+ // 1. There's a tool call (tool calls can end without explicit finish reasons), OR
425
+ // 2. There's a finish reason AND we have non-empty response text
426
+ //
427
+ // We throw an error only when there's no tool call AND:
428
+ // - No finish reason, OR
429
+ // - Empty response text (e.g., only thoughts with no actual content)
430
+ if (!hasToolCall && (!hasFinishReason || !responseText)) {
431
+ if (!hasFinishReason) {
432
+ throw new InvalidStreamError('Model stream ended without a finish reason.', 'NO_FINISH_REASON');
535
433
  }
536
434
  else {
537
- consolidatedOutputContents.push(content);
435
+ throw new InvalidStreamError('Model stream ended with empty response text.', 'NO_RESPONSE_TEXT');
538
436
  }
539
437
  }
540
- if (consolidatedOutputContents.length > 0) {
541
- const lastHistoryEntry = this.history[this.history.length - 1];
542
- const canMergeWithLastHistory = !automaticFunctionCallingHistory ||
543
- automaticFunctionCallingHistory.length === 0;
544
- if (canMergeWithLastHistory &&
545
- this.isTextContent(lastHistoryEntry) &&
546
- this.isTextContent(consolidatedOutputContents[0])) {
547
- // If both current and last are text, combine their text into the lastHistoryEntry's first part
548
- // and append any other parts from the current content.
549
- lastHistoryEntry.parts[0].text +=
550
- consolidatedOutputContents[0].parts[0].text || '';
551
- if (consolidatedOutputContents[0].parts.length > 1) {
552
- lastHistoryEntry.parts.push(...consolidatedOutputContents[0].parts.slice(1));
438
+ this.history.push({ role: 'model', parts: consolidatedParts });
439
+ }
440
+ /**
441
+ * Gets the chat recording service instance.
442
+ */
443
+ getChatRecordingService() {
444
+ return this.chatRecordingService;
445
+ }
446
+ /**
447
+ * Extracts and records thought from thought content.
448
+ */
449
+ recordThoughtFromContent(content) {
450
+ if (!content.parts || content.parts.length === 0) {
451
+ return;
452
+ }
453
+ const thoughtPart = content.parts[0];
454
+ if (thoughtPart.text) {
455
+ // Extract subject and description using the same logic as turn.ts
456
+ const rawText = thoughtPart.text;
457
+ const subjectStringMatches = rawText.match(/\*\*(.*?)\*\*/s);
458
+ const subject = subjectStringMatches
459
+ ? subjectStringMatches[1].trim()
460
+ : '';
461
+ const description = rawText.replace(/\*\*(.*?)\*\*/s, '').trim();
462
+ this.chatRecordingService.recordThought({
463
+ subject,
464
+ description,
465
+ });
466
+ }
467
+ }
468
+ /**
469
+ * Truncates the chunkStream right before the second function call to a
470
+ * function that mutates state. This may involve trimming parts from a chunk
471
+ * as well as omtting some chunks altogether.
472
+ *
473
+ * We do this because it improves tool call quality if the model gets
474
+ * feedback from one mutating function call before it makes the next one.
475
+ */
476
+ async *stopBeforeSecondMutator(chunkStream) {
477
+ let foundMutatorFunctionCall = false;
478
+ for await (const chunk of chunkStream) {
479
+ const candidate = chunk.candidates?.[0];
480
+ const content = candidate?.content;
481
+ if (!candidate || !content?.parts) {
482
+ yield chunk;
483
+ continue;
484
+ }
485
+ const truncatedParts = [];
486
+ for (const part of content.parts) {
487
+ if (this.isMutatorFunctionCall(part)) {
488
+ if (foundMutatorFunctionCall) {
489
+ // This is the second mutator call.
490
+ // Truncate and return immedaitely.
491
+ const newChunk = new GenerateContentResponse();
492
+ newChunk.candidates = [
493
+ {
494
+ ...candidate,
495
+ content: {
496
+ ...content,
497
+ parts: truncatedParts,
498
+ },
499
+ finishReason: FinishReason.STOP,
500
+ },
501
+ ];
502
+ yield newChunk;
503
+ return;
504
+ }
505
+ foundMutatorFunctionCall = true;
553
506
  }
554
- consolidatedOutputContents.shift(); // Remove the first element as it's merged
507
+ truncatedParts.push(part);
555
508
  }
556
- this.history.push(...consolidatedOutputContents);
509
+ yield chunk;
557
510
  }
558
511
  }
559
- isTextContent(content) {
560
- return !!(content &&
561
- content.role === 'model' &&
562
- content.parts &&
563
- content.parts.length > 0 &&
564
- typeof content.parts[0].text === 'string' &&
565
- content.parts[0].text !== '');
566
- }
567
- isThoughtContent(content) {
568
- return !!(content &&
569
- content.role === 'model' &&
570
- content.parts &&
571
- content.parts.length > 0 &&
572
- typeof content.parts[0].thought === 'boolean' &&
573
- content.parts[0].thought === true);
512
+ isMutatorFunctionCall(part) {
513
+ if (!part?.functionCall?.name) {
514
+ return false;
515
+ }
516
+ const tool = this.config.getToolRegistry().getTool(part.functionCall.name);
517
+ return !!tool && MUTATOR_KINDS.includes(tool.kind);
574
518
  }
575
519
  }
576
520
  /** Visible for Testing */