@office-ai/aioncli-core 0.2.2 → 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 (758) 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 -87
  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 -28
  111. package/dist/src/core/client.js +187 -333
  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 -43
  126. package/dist/src/core/geminiChat.js +298 -280
  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/generated/git-commit.d.ts +1 -1
  175. package/dist/src/generated/git-commit.js +1 -1
  176. package/dist/src/ide/constants.d.ts +3 -0
  177. package/dist/src/ide/constants.js +3 -0
  178. package/dist/src/ide/constants.js.map +1 -1
  179. package/dist/src/ide/detect-ide.d.ts +48 -12
  180. package/dist/src/ide/detect-ide.js +47 -66
  181. package/dist/src/ide/detect-ide.js.map +1 -1
  182. package/dist/src/ide/detect-ide.test.js +79 -52
  183. package/dist/src/ide/detect-ide.test.js.map +1 -1
  184. package/dist/src/ide/ide-client.d.ts +69 -23
  185. package/dist/src/ide/ide-client.js +372 -78
  186. package/dist/src/ide/ide-client.js.map +1 -1
  187. package/dist/src/ide/ide-client.test.js +375 -30
  188. package/dist/src/ide/ide-client.test.js.map +1 -1
  189. package/dist/src/ide/ide-installer.d.ts +2 -2
  190. package/dist/src/ide/ide-installer.js +37 -24
  191. package/dist/src/ide/ide-installer.js.map +1 -1
  192. package/dist/src/ide/ide-installer.test.js +104 -26
  193. package/dist/src/ide/ide-installer.test.js.map +1 -1
  194. package/dist/src/ide/ideContext.d.ts +35 -365
  195. package/dist/src/ide/ideContext.js +60 -106
  196. package/dist/src/ide/ideContext.js.map +1 -1
  197. package/dist/src/ide/ideContext.test.js +152 -24
  198. package/dist/src/ide/ideContext.test.js.map +1 -1
  199. package/dist/src/ide/process-utils.d.ts +7 -5
  200. package/dist/src/ide/process-utils.js +81 -50
  201. package/dist/src/ide/process-utils.js.map +1 -1
  202. package/dist/src/ide/process-utils.test.d.ts +6 -0
  203. package/dist/src/ide/process-utils.test.js +158 -0
  204. package/dist/src/ide/process-utils.test.js.map +1 -0
  205. package/dist/src/ide/types.d.ts +486 -0
  206. package/dist/src/ide/types.js +138 -0
  207. package/dist/src/ide/types.js.map +1 -0
  208. package/dist/src/index.d.ts +20 -2
  209. package/dist/src/index.js +20 -2
  210. package/dist/src/index.js.map +1 -1
  211. package/dist/src/mcp/google-auth-provider.d.ts +3 -3
  212. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  213. package/dist/src/mcp/oauth-provider.d.ts +17 -13
  214. package/dist/src/mcp/oauth-provider.js +81 -69
  215. package/dist/src/mcp/oauth-provider.js.map +1 -1
  216. package/dist/src/mcp/oauth-provider.test.js +212 -37
  217. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  218. package/dist/src/mcp/oauth-token-storage.d.ts +14 -32
  219. package/dist/src/mcp/oauth-token-storage.js +54 -25
  220. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  221. package/dist/src/mcp/oauth-token-storage.test.js +256 -162
  222. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  223. package/dist/src/mcp/oauth-utils.d.ts +9 -1
  224. package/dist/src/mcp/oauth-utils.js +42 -27
  225. package/dist/src/mcp/oauth-utils.js.map +1 -1
  226. package/dist/src/mcp/oauth-utils.test.js +41 -1
  227. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  228. package/dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
  229. package/dist/src/mcp/sa-impersonation-provider.js +130 -0
  230. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  231. package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  232. package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  233. package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  234. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  235. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  236. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  237. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  238. package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  239. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  240. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  241. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  242. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  243. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  244. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  245. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  246. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  247. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  248. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  249. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  250. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  251. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  252. package/dist/src/mcp/token-storage/index.d.ts +11 -0
  253. package/dist/src/mcp/token-storage/index.js +12 -0
  254. package/dist/src/mcp/token-storage/index.js.map +1 -0
  255. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  256. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  257. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  258. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  259. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  260. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  261. package/dist/src/mcp/token-storage/types.d.ts +38 -0
  262. package/dist/src/mcp/token-storage/types.js +11 -0
  263. package/dist/src/mcp/token-storage/types.js.map +1 -0
  264. package/dist/src/output/json-formatter.d.ts +11 -0
  265. package/dist/src/output/json-formatter.js +30 -0
  266. package/dist/src/output/json-formatter.js.map +1 -0
  267. package/dist/src/output/json-formatter.test.d.ts +6 -0
  268. package/dist/src/output/json-formatter.test.js +266 -0
  269. package/dist/src/output/json-formatter.test.js.map +1 -0
  270. package/dist/src/output/types.d.ts +20 -0
  271. package/dist/src/output/types.js +11 -0
  272. package/dist/src/output/types.js.map +1 -0
  273. package/dist/src/policy/index.d.ts +7 -0
  274. package/dist/src/policy/index.js +8 -0
  275. package/dist/src/policy/index.js.map +1 -0
  276. package/dist/src/policy/policy-engine.d.ts +30 -0
  277. package/dist/src/policy/policy-engine.js +92 -0
  278. package/dist/src/policy/policy-engine.js.map +1 -0
  279. package/dist/src/policy/policy-engine.test.d.ts +6 -0
  280. package/dist/src/policy/policy-engine.test.js +515 -0
  281. package/dist/src/policy/policy-engine.test.js.map +1 -0
  282. package/dist/src/policy/stable-stringify.d.ts +58 -0
  283. package/dist/src/policy/stable-stringify.js +122 -0
  284. package/dist/src/policy/stable-stringify.js.map +1 -0
  285. package/dist/src/policy/types.d.ts +47 -0
  286. package/dist/src/policy/types.js +12 -0
  287. package/dist/src/policy/types.js.map +1 -0
  288. package/dist/src/prompts/mcp-prompts.d.ts +2 -2
  289. package/dist/src/prompts/prompt-registry.d.ts +1 -1
  290. package/dist/src/routing/modelRouterService.d.ts +23 -0
  291. package/dist/src/routing/modelRouterService.js +70 -0
  292. package/dist/src/routing/modelRouterService.js.map +1 -0
  293. package/dist/src/routing/modelRouterService.test.d.ts +6 -0
  294. package/dist/src/routing/modelRouterService.test.js +98 -0
  295. package/dist/src/routing/modelRouterService.test.js.map +1 -0
  296. package/dist/src/routing/routingStrategy.d.ts +62 -0
  297. package/dist/src/routing/routingStrategy.js +7 -0
  298. package/dist/src/routing/routingStrategy.js.map +1 -0
  299. package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
  300. package/dist/src/routing/strategies/classifierStrategy.js +173 -0
  301. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
  302. package/dist/src/routing/strategies/classifierStrategy.test.d.ts +6 -0
  303. package/dist/src/routing/strategies/classifierStrategy.test.js +192 -0
  304. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -0
  305. package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
  306. package/dist/src/routing/strategies/compositeStrategy.js +68 -0
  307. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
  308. package/dist/src/routing/strategies/compositeStrategy.test.d.ts +6 -0
  309. package/dist/src/routing/strategies/compositeStrategy.test.js +123 -0
  310. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -0
  311. package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
  312. package/dist/src/routing/strategies/defaultStrategy.js +20 -0
  313. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
  314. package/dist/src/routing/strategies/defaultStrategy.test.d.ts +6 -0
  315. package/dist/src/routing/strategies/defaultStrategy.test.js +26 -0
  316. package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -0
  317. package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
  318. package/dist/src/routing/strategies/fallbackStrategy.js +25 -0
  319. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
  320. package/dist/src/routing/strategies/fallbackStrategy.test.d.ts +6 -0
  321. package/dist/src/routing/strategies/fallbackStrategy.test.js +55 -0
  322. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -0
  323. package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
  324. package/dist/src/routing/strategies/overrideStrategy.js +28 -0
  325. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
  326. package/dist/src/routing/strategies/overrideStrategy.test.d.ts +6 -0
  327. package/dist/src/routing/strategies/overrideStrategy.test.js +42 -0
  328. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -0
  329. package/dist/src/services/chatRecordingService.d.ts +8 -14
  330. package/dist/src/services/chatRecordingService.js +33 -21
  331. package/dist/src/services/chatRecordingService.js.map +1 -1
  332. package/dist/src/services/chatRecordingService.test.js +69 -25
  333. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  334. package/dist/src/services/fileDiscoveryService.d.ts +10 -0
  335. package/dist/src/services/fileDiscoveryService.js +32 -18
  336. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  337. package/dist/src/services/fileDiscoveryService.test.js +3 -3
  338. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  339. package/dist/src/services/fileSystemService.d.ts +9 -0
  340. package/dist/src/services/fileSystemService.js +12 -1
  341. package/dist/src/services/fileSystemService.js.map +1 -1
  342. package/dist/src/services/fileSystemService.test.js +1 -1
  343. package/dist/src/services/fileSystemService.test.js.map +1 -1
  344. package/dist/src/services/gitService.d.ts +3 -1
  345. package/dist/src/services/gitService.js +30 -24
  346. package/dist/src/services/gitService.js.map +1 -1
  347. package/dist/src/services/gitService.test.js +30 -37
  348. package/dist/src/services/gitService.test.js.map +1 -1
  349. package/dist/src/services/loopDetectionService.d.ts +8 -2
  350. package/dist/src/services/loopDetectionService.js +64 -24
  351. package/dist/src/services/loopDetectionService.js.map +1 -1
  352. package/dist/src/services/loopDetectionService.test.js +64 -13
  353. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  354. package/dist/src/services/shellExecutionService.d.ts +36 -2
  355. package/dist/src/services/shellExecutionService.js +238 -47
  356. package/dist/src/services/shellExecutionService.js.map +1 -1
  357. package/dist/src/services/shellExecutionService.test.js +197 -58
  358. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  359. package/dist/src/telemetry/activity-detector.d.ts +41 -0
  360. package/dist/src/telemetry/activity-detector.js +61 -0
  361. package/dist/src/telemetry/activity-detector.js.map +1 -0
  362. package/dist/src/telemetry/activity-detector.test.d.ts +6 -0
  363. package/dist/src/telemetry/activity-detector.test.js +136 -0
  364. package/dist/src/telemetry/activity-detector.test.js.map +1 -0
  365. package/dist/src/telemetry/activity-types.d.ts +19 -0
  366. package/dist/src/telemetry/activity-types.js +21 -0
  367. package/dist/src/telemetry/activity-types.js.map +1 -0
  368. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +34 -4
  369. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +322 -15
  370. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  371. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +1 -0
  372. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +321 -11
  373. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  374. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +51 -2
  375. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +124 -2
  376. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  377. package/dist/src/telemetry/config.d.ts +31 -0
  378. package/dist/src/telemetry/config.js +76 -0
  379. package/dist/src/telemetry/config.js.map +1 -0
  380. package/dist/src/telemetry/config.test.d.ts +6 -0
  381. package/dist/src/telemetry/config.test.js +124 -0
  382. package/dist/src/telemetry/config.test.js.map +1 -0
  383. package/dist/src/telemetry/constants.d.ts +17 -7
  384. package/dist/src/telemetry/constants.js +18 -7
  385. package/dist/src/telemetry/constants.js.map +1 -1
  386. package/dist/src/telemetry/file-exporters.d.ts +5 -4
  387. package/dist/src/telemetry/file-exporters.js +1 -1
  388. package/dist/src/telemetry/file-exporters.js.map +1 -1
  389. package/dist/src/telemetry/gcp-exporters.d.ts +34 -0
  390. package/dist/src/telemetry/gcp-exporters.js +117 -0
  391. package/dist/src/telemetry/gcp-exporters.js.map +1 -0
  392. package/dist/src/telemetry/gcp-exporters.test.d.ts +6 -0
  393. package/dist/src/telemetry/gcp-exporters.test.js +318 -0
  394. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -0
  395. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  396. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  397. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  398. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  399. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  400. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  401. package/dist/src/telemetry/index.d.ts +12 -2
  402. package/dist/src/telemetry/index.js +16 -2
  403. package/dist/src/telemetry/index.js.map +1 -1
  404. package/dist/src/telemetry/loggers.d.ts +17 -2
  405. package/dist/src/telemetry/loggers.js +316 -14
  406. package/dist/src/telemetry/loggers.js.map +1 -1
  407. package/dist/src/telemetry/loggers.test.circular.js +3 -3
  408. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  409. package/dist/src/telemetry/loggers.test.js +452 -48
  410. package/dist/src/telemetry/loggers.test.js.map +1 -1
  411. package/dist/src/telemetry/metrics.d.ts +323 -12
  412. package/dist/src/telemetry/metrics.js +464 -83
  413. package/dist/src/telemetry/metrics.js.map +1 -1
  414. package/dist/src/telemetry/metrics.test.js +583 -38
  415. package/dist/src/telemetry/metrics.test.js.map +1 -1
  416. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  417. package/dist/src/telemetry/rate-limiter.js +100 -0
  418. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  419. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  420. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  421. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  422. package/dist/src/telemetry/sdk.d.ts +1 -1
  423. package/dist/src/telemetry/sdk.js +20 -2
  424. package/dist/src/telemetry/sdk.js.map +1 -1
  425. package/dist/src/telemetry/sdk.test.js +108 -0
  426. package/dist/src/telemetry/sdk.test.js.map +1 -1
  427. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  428. package/dist/src/telemetry/telemetry-utils.js +14 -0
  429. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  430. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  431. package/dist/src/telemetry/telemetry-utils.test.js +40 -0
  432. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  433. package/dist/src/telemetry/types.d.ts +136 -8
  434. package/dist/src/telemetry/types.js +233 -11
  435. package/dist/src/telemetry/types.js.map +1 -1
  436. package/dist/src/telemetry/uiTelemetry.d.ts +3 -3
  437. package/dist/src/telemetry/uiTelemetry.js +7 -8
  438. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  439. package/dist/src/telemetry/uiTelemetry.test.js +33 -29
  440. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  441. package/dist/src/test-utils/config.d.ts +2 -1
  442. package/dist/src/test-utils/config.js.map +1 -1
  443. package/dist/src/test-utils/index.d.ts +6 -0
  444. package/dist/src/test-utils/index.js +7 -0
  445. package/dist/src/test-utils/index.js.map +1 -0
  446. package/dist/src/test-utils/mock-tool.d.ts +66 -0
  447. package/dist/src/test-utils/{tools.js → mock-tool.js} +45 -29
  448. package/dist/src/test-utils/mock-tool.js.map +1 -0
  449. package/dist/src/test-utils/mockWorkspaceContext.d.ts +1 -1
  450. package/dist/src/tools/diffOptions.d.ts +1 -1
  451. package/dist/src/tools/diffOptions.js +21 -13
  452. package/dist/src/tools/diffOptions.js.map +1 -1
  453. package/dist/src/tools/diffOptions.test.js +58 -22
  454. package/dist/src/tools/diffOptions.test.js.map +1 -1
  455. package/dist/src/tools/edit.d.ts +6 -5
  456. package/dist/src/tools/edit.js +58 -40
  457. package/dist/src/tools/edit.js.map +1 -1
  458. package/dist/src/tools/edit.test.js +192 -16
  459. package/dist/src/tools/edit.test.js.map +1 -1
  460. package/dist/src/tools/glob.d.ts +7 -2
  461. package/dist/src/tools/glob.js +42 -23
  462. package/dist/src/tools/glob.js.map +1 -1
  463. package/dist/src/tools/glob.test.js +80 -4
  464. package/dist/src/tools/glob.test.js.map +1 -1
  465. package/dist/src/tools/grep.d.ts +3 -2
  466. package/dist/src/tools/grep.js +35 -15
  467. package/dist/src/tools/grep.js.map +1 -1
  468. package/dist/src/tools/grep.test.js +26 -3
  469. package/dist/src/tools/grep.test.js.map +1 -1
  470. package/dist/src/tools/ls.d.ts +3 -2
  471. package/dist/src/tools/ls.js +31 -39
  472. package/dist/src/tools/ls.js.map +1 -1
  473. package/dist/src/tools/ls.test.js +145 -280
  474. package/dist/src/tools/ls.test.js.map +1 -1
  475. package/dist/src/tools/mcp-client-manager.d.ts +8 -6
  476. package/dist/src/tools/mcp-client-manager.js +13 -4
  477. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  478. package/dist/src/tools/mcp-client-manager.test.js +20 -1
  479. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  480. package/dist/src/tools/mcp-client.d.ts +18 -21
  481. package/dist/src/tools/mcp-client.js +87 -120
  482. package/dist/src/tools/mcp-client.js.map +1 -1
  483. package/dist/src/tools/mcp-client.test.js +32 -152
  484. package/dist/src/tools/mcp-client.test.js.map +1 -1
  485. package/dist/src/tools/mcp-tool.d.ts +6 -4
  486. package/dist/src/tools/mcp-tool.js +51 -13
  487. package/dist/src/tools/mcp-tool.js.map +1 -1
  488. package/dist/src/tools/mcp-tool.test.js +166 -12
  489. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  490. package/dist/src/tools/memoryTool.d.ts +3 -2
  491. package/dist/src/tools/memoryTool.js +14 -37
  492. package/dist/src/tools/memoryTool.js.map +1 -1
  493. package/dist/src/tools/memoryTool.test.js +16 -4
  494. package/dist/src/tools/memoryTool.test.js.map +1 -1
  495. package/dist/src/tools/message-bus-integration.test.d.ts +6 -0
  496. package/dist/src/tools/message-bus-integration.test.js +183 -0
  497. package/dist/src/tools/message-bus-integration.test.js.map +1 -0
  498. package/dist/src/tools/modifiable-tool.d.ts +2 -2
  499. package/dist/src/tools/modifiable-tool.js +3 -3
  500. package/dist/src/tools/modifiable-tool.js.map +1 -1
  501. package/dist/src/tools/modifiable-tool.test.js +4 -4
  502. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  503. package/dist/src/tools/read-file.d.ts +3 -2
  504. package/dist/src/tools/read-file.js +33 -43
  505. package/dist/src/tools/read-file.js.map +1 -1
  506. package/dist/src/tools/read-file.test.js +39 -7
  507. package/dist/src/tools/read-file.test.js.map +1 -1
  508. package/dist/src/tools/read-many-files.d.ts +3 -2
  509. package/dist/src/tools/read-many-files.js +52 -107
  510. package/dist/src/tools/read-many-files.js.map +1 -1
  511. package/dist/src/tools/read-many-files.test.js +64 -11
  512. package/dist/src/tools/read-many-files.test.js.map +1 -1
  513. package/dist/src/tools/ripGrep.d.ts +55 -0
  514. package/dist/src/tools/ripGrep.js +393 -0
  515. package/dist/src/tools/ripGrep.js.map +1 -0
  516. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  517. package/dist/src/tools/ripGrep.test.js +976 -0
  518. package/dist/src/tools/ripGrep.test.js.map +1 -0
  519. package/dist/src/tools/shell.d.ts +13 -2
  520. package/dist/src/tools/shell.js +42 -32
  521. package/dist/src/tools/shell.js.map +1 -1
  522. package/dist/src/tools/shell.test.js +57 -75
  523. package/dist/src/tools/shell.test.js.map +1 -1
  524. package/dist/src/tools/smart-edit.d.ts +91 -0
  525. package/dist/src/tools/smart-edit.js +702 -0
  526. package/dist/src/tools/smart-edit.js.map +1 -0
  527. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  528. package/dist/src/tools/smart-edit.test.js +542 -0
  529. package/dist/src/tools/smart-edit.test.js.map +1 -0
  530. package/dist/src/tools/tool-error.d.ts +18 -1
  531. package/dist/src/tools/tool-error.js +27 -0
  532. package/dist/src/tools/tool-error.js.map +1 -1
  533. package/dist/src/tools/tool-registry.d.ts +10 -4
  534. package/dist/src/tools/tool-registry.js +20 -7
  535. package/dist/src/tools/tool-registry.js.map +1 -1
  536. package/dist/src/tools/tool-registry.test.js +93 -10
  537. package/dist/src/tools/tool-registry.test.js.map +1 -1
  538. package/dist/src/tools/tools.d.ts +33 -16
  539. package/dist/src/tools/tools.js +115 -5
  540. package/dist/src/tools/tools.js.map +1 -1
  541. package/dist/src/tools/tools.test.js +1 -2
  542. package/dist/src/tools/tools.test.js.map +1 -1
  543. package/dist/src/tools/web-fetch.d.ts +3 -2
  544. package/dist/src/tools/web-fetch.js +14 -10
  545. package/dist/src/tools/web-fetch.js.map +1 -1
  546. package/dist/src/tools/web-fetch.test.js +55 -16
  547. package/dist/src/tools/web-fetch.test.js.map +1 -1
  548. package/dist/src/tools/web-search.d.ts +4 -3
  549. package/dist/src/tools/web-search.js +31 -8
  550. package/dist/src/tools/web-search.js.map +1 -1
  551. package/dist/src/tools/web-search.test.js +69 -1
  552. package/dist/src/tools/web-search.test.js.map +1 -1
  553. package/dist/src/tools/write-file.d.ts +4 -3
  554. package/dist/src/tools/write-file.js +17 -18
  555. package/dist/src/tools/write-file.js.map +1 -1
  556. package/dist/src/tools/write-file.test.js +108 -24
  557. package/dist/src/tools/write-file.test.js.map +1 -1
  558. package/dist/src/tools/write-todos.d.ts +25 -0
  559. package/dist/src/tools/write-todos.js +150 -0
  560. package/dist/src/tools/write-todos.js.map +1 -0
  561. package/dist/src/tools/write-todos.test.d.ts +6 -0
  562. package/dist/src/tools/write-todos.test.js +89 -0
  563. package/dist/src/tools/write-todos.test.js.map +1 -0
  564. package/dist/src/utils/bfsFileSearch.d.ts +2 -2
  565. package/dist/src/utils/bfsFileSearch.js +13 -7
  566. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  567. package/dist/src/utils/bfsFileSearch.test.js +3 -3
  568. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  569. package/dist/src/utils/editCorrector.d.ts +9 -8
  570. package/dist/src/utils/editCorrector.js +62 -19
  571. package/dist/src/utils/editCorrector.js.map +1 -1
  572. package/dist/src/utils/editCorrector.test.js +33 -82
  573. package/dist/src/utils/editCorrector.test.js.map +1 -1
  574. package/dist/src/utils/editor.js +32 -45
  575. package/dist/src/utils/editor.js.map +1 -1
  576. package/dist/src/utils/editor.test.js +62 -76
  577. package/dist/src/utils/editor.test.js.map +1 -1
  578. package/dist/src/utils/environmentContext.d.ts +2 -2
  579. package/dist/src/utils/errorParsing.js +2 -2
  580. package/dist/src/utils/errorParsing.js.map +1 -1
  581. package/dist/src/utils/errorParsing.test.js +7 -7
  582. package/dist/src/utils/errorParsing.test.js.map +1 -1
  583. package/dist/src/utils/errorReporting.d.ts +1 -1
  584. package/dist/src/utils/errors.d.ts +25 -0
  585. package/dist/src/utils/errors.js +42 -0
  586. package/dist/src/utils/errors.js.map +1 -1
  587. package/dist/src/utils/fetch.js +1 -1
  588. package/dist/src/utils/fetch.js.map +1 -1
  589. package/dist/src/utils/fileUtils.d.ts +24 -12
  590. package/dist/src/utils/fileUtils.js +170 -79
  591. package/dist/src/utils/fileUtils.js.map +1 -1
  592. package/dist/src/utils/fileUtils.test.js +347 -29
  593. package/dist/src/utils/fileUtils.test.js.map +1 -1
  594. package/dist/src/utils/filesearch/crawler.d.ts +1 -1
  595. package/dist/src/utils/filesearch/crawler.test.js +2 -2
  596. package/dist/src/utils/filesearch/crawler.test.js.map +1 -1
  597. package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
  598. package/dist/src/utils/filesearch/fileSearch.js +14 -9
  599. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  600. package/dist/src/utils/filesearch/fileSearch.test.js +90 -0
  601. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  602. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  603. package/dist/src/utils/{flashFallback.integration.test.js → flashFallback.test.js} +33 -29
  604. package/dist/src/utils/flashFallback.test.js.map +1 -0
  605. package/dist/src/utils/geminiIgnoreParser.d.ts +18 -0
  606. package/dist/src/utils/geminiIgnoreParser.js +61 -0
  607. package/dist/src/utils/geminiIgnoreParser.js.map +1 -0
  608. package/dist/src/utils/geminiIgnoreParser.test.d.ts +6 -0
  609. package/dist/src/utils/geminiIgnoreParser.test.js +50 -0
  610. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -0
  611. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -2
  612. package/dist/src/utils/generateContentResponseUtilities.js +1 -13
  613. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  614. package/dist/src/utils/generateContentResponseUtilities.test.js +2 -40
  615. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  616. package/dist/src/utils/getFolderStructure.d.ts +2 -2
  617. package/dist/src/utils/getFolderStructure.js +3 -3
  618. package/dist/src/utils/getFolderStructure.js.map +1 -1
  619. package/dist/src/utils/getFolderStructure.test.js +4 -4
  620. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  621. package/dist/src/utils/gitIgnoreParser.d.ts +3 -7
  622. package/dist/src/utils/gitIgnoreParser.js +126 -35
  623. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  624. package/dist/src/utils/gitIgnoreParser.test.js +69 -38
  625. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  626. package/dist/src/utils/gitUtils.js +2 -2
  627. package/dist/src/utils/gitUtils.js.map +1 -1
  628. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  629. package/dist/src/utils/ignorePatterns.js +220 -0
  630. package/dist/src/utils/ignorePatterns.js.map +1 -0
  631. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  632. package/dist/src/utils/ignorePatterns.test.js +250 -0
  633. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  634. package/dist/src/utils/installationManager.d.ts +16 -0
  635. package/dist/src/utils/installationManager.js +50 -0
  636. package/dist/src/utils/installationManager.js.map +1 -0
  637. package/dist/src/utils/installationManager.test.d.ts +6 -0
  638. package/dist/src/utils/installationManager.test.js +83 -0
  639. package/dist/src/utils/installationManager.test.js.map +1 -0
  640. package/dist/src/utils/language-detection.d.ts +6 -0
  641. package/dist/src/utils/language-detection.js +101 -0
  642. package/dist/src/utils/language-detection.js.map +1 -0
  643. package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
  644. package/dist/src/utils/llm-edit-fixer.js +131 -0
  645. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  646. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  647. package/dist/src/utils/llm-edit-fixer.test.js +186 -0
  648. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  649. package/dist/src/utils/memoryDiscovery.d.ts +7 -6
  650. package/dist/src/utils/memoryDiscovery.js +68 -33
  651. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  652. package/dist/src/utils/memoryDiscovery.test.js +88 -26
  653. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  654. package/dist/src/utils/memoryImportProcessor.js +15 -22
  655. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  656. package/dist/src/utils/memoryImportProcessor.test.js +16 -141
  657. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  658. package/dist/src/utils/messageInspectors.d.ts +1 -1
  659. package/dist/src/utils/nextSpeakerChecker.d.ts +3 -3
  660. package/dist/src/utils/nextSpeakerChecker.js +8 -2
  661. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  662. package/dist/src/utils/nextSpeakerChecker.test.js +75 -64
  663. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  664. package/dist/src/utils/partUtils.d.ts +22 -1
  665. package/dist/src/utils/partUtils.js +68 -0
  666. package/dist/src/utils/partUtils.js.map +1 -1
  667. package/dist/src/utils/partUtils.test.js +112 -1
  668. package/dist/src/utils/partUtils.test.js.map +1 -1
  669. package/dist/src/utils/pathReader.d.ts +17 -0
  670. package/dist/src/utils/pathReader.js +92 -0
  671. package/dist/src/utils/pathReader.js.map +1 -0
  672. package/dist/src/utils/pathReader.test.d.ts +6 -0
  673. package/dist/src/utils/pathReader.test.js +363 -0
  674. package/dist/src/utils/pathReader.test.js.map +1 -0
  675. package/dist/src/utils/paths.d.ts +0 -17
  676. package/dist/src/utils/paths.js +2 -28
  677. package/dist/src/utils/paths.js.map +1 -1
  678. package/dist/src/utils/promptIdContext.d.ts +7 -0
  679. package/dist/src/utils/promptIdContext.js +8 -0
  680. package/dist/src/utils/promptIdContext.js.map +1 -0
  681. package/dist/src/utils/quotaErrorDetection.d.ts +1 -1
  682. package/dist/src/utils/retry.d.ts +3 -1
  683. package/dist/src/utils/retry.js +60 -5
  684. package/dist/src/utils/retry.js.map +1 -1
  685. package/dist/src/utils/retry.test.js +35 -3
  686. package/dist/src/utils/retry.test.js.map +1 -1
  687. package/dist/src/utils/schemaValidator.js +15 -1
  688. package/dist/src/utils/schemaValidator.js.map +1 -1
  689. package/dist/src/utils/schemaValidator.test.d.ts +6 -0
  690. package/dist/src/utils/schemaValidator.test.js +113 -0
  691. package/dist/src/utils/schemaValidator.test.js.map +1 -0
  692. package/dist/src/utils/session.js +1 -1
  693. package/dist/src/utils/session.js.map +1 -1
  694. package/dist/src/utils/shell-utils.d.ts +6 -1
  695. package/dist/src/utils/shell-utils.js +51 -30
  696. package/dist/src/utils/shell-utils.js.map +1 -1
  697. package/dist/src/utils/shell-utils.test.js +9 -0
  698. package/dist/src/utils/shell-utils.test.js.map +1 -1
  699. package/dist/src/utils/summarizer.d.ts +2 -2
  700. package/dist/src/utils/summarizer.test.js.map +1 -1
  701. package/dist/src/utils/systemEncoding.js +2 -2
  702. package/dist/src/utils/systemEncoding.js.map +1 -1
  703. package/dist/src/utils/systemEncoding.test.js +2 -2
  704. package/dist/src/utils/systemEncoding.test.js.map +1 -1
  705. package/dist/src/utils/terminalSerializer.d.ts +25 -0
  706. package/dist/src/utils/terminalSerializer.js +432 -0
  707. package/dist/src/utils/terminalSerializer.js.map +1 -0
  708. package/dist/src/utils/terminalSerializer.test.d.ts +6 -0
  709. package/dist/src/utils/terminalSerializer.test.js +176 -0
  710. package/dist/src/utils/terminalSerializer.test.js.map +1 -0
  711. package/dist/src/utils/textUtils.d.ts +5 -0
  712. package/dist/src/utils/textUtils.js +14 -0
  713. package/dist/src/utils/textUtils.js.map +1 -1
  714. package/dist/src/utils/textUtils.test.d.ts +6 -0
  715. package/dist/src/utils/textUtils.test.js +59 -0
  716. package/dist/src/utils/textUtils.test.js.map +1 -0
  717. package/dist/src/utils/thoughtUtils.d.ts +21 -0
  718. package/dist/src/utils/thoughtUtils.js +39 -0
  719. package/dist/src/utils/thoughtUtils.js.map +1 -0
  720. package/dist/src/utils/thoughtUtils.test.d.ts +6 -0
  721. package/dist/src/utils/thoughtUtils.test.js +78 -0
  722. package/dist/src/utils/thoughtUtils.test.js.map +1 -0
  723. package/dist/src/utils/tool-utils.d.ts +19 -0
  724. package/dist/src/utils/tool-utils.js +58 -0
  725. package/dist/src/utils/tool-utils.js.map +1 -0
  726. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  727. package/dist/src/utils/tool-utils.test.js +61 -0
  728. package/dist/src/utils/tool-utils.test.js.map +1 -0
  729. package/dist/src/utils/userAccountManager.d.ts +20 -0
  730. package/dist/src/utils/userAccountManager.js +114 -0
  731. package/dist/src/utils/userAccountManager.js.map +1 -0
  732. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  733. package/dist/src/utils/{user_account.test.js → userAccountManager.test.js} +33 -30
  734. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  735. package/dist/src/utils/workspaceContext.js +13 -7
  736. package/dist/src/utils/workspaceContext.js.map +1 -1
  737. package/dist/src/utils/workspaceContext.test.js +41 -16
  738. package/dist/src/utils/workspaceContext.test.js.map +1 -1
  739. package/dist/tsconfig.tsbuildinfo +1 -1
  740. package/package.json +18 -9
  741. package/dist/src/core/modelCheck.d.ts +0 -14
  742. package/dist/src/core/modelCheck.js +0 -62
  743. package/dist/src/core/modelCheck.js.map +0 -1
  744. package/dist/src/test-utils/tools.d.ts +0 -44
  745. package/dist/src/test-utils/tools.js.map +0 -1
  746. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  747. package/dist/src/utils/user_account.d.ts +0 -9
  748. package/dist/src/utils/user_account.js +0 -109
  749. package/dist/src/utils/user_account.js.map +0 -1
  750. package/dist/src/utils/user_account.test.js.map +0 -1
  751. package/dist/src/utils/user_id.d.ts +0 -11
  752. package/dist/src/utils/user_id.js +0 -49
  753. package/dist/src/utils/user_id.js.map +0 -1
  754. package/dist/src/utils/user_id.test.js +0 -21
  755. package/dist/src/utils/user_id.test.js.map +0 -1
  756. /package/dist/src/{utils/flashFallback.integration.test.d.ts → agents/executor.test.d.ts} +0 -0
  757. /package/dist/src/{utils/user_account.test.d.ts → agents/invocation.test.d.ts} +0 -0
  758. /package/dist/src/{utils/user_id.test.d.ts → agents/registry.test.d.ts} +0 -0
@@ -4,49 +4,67 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { getDirectoryContextString, getEnvironmentContext, } from '../utils/environmentContext.js';
7
- import { Turn, GeminiEventType, } from './turn.js';
7
+ import { CompressionStatus } from './turn.js';
8
+ import { Turn, GeminiEventType } from './turn.js';
8
9
  import { getCoreSystemPrompt, getCompressionPrompt } from './prompts.js';
9
- import { getResponseText, getFunctionCalls } from '../utils/generateContentResponseUtilities.js';
10
+ import { getResponseText } from '../utils/partUtils.js';
10
11
  import { checkNextSpeaker } from '../utils/nextSpeakerChecker.js';
11
12
  import { reportError } from '../utils/errorReporting.js';
12
13
  import { GeminiChat } from './geminiChat.js';
13
14
  import { retryWithBackoff } from '../utils/retry.js';
14
15
  import { getErrorMessage } from '../utils/errors.js';
15
- import { isFunctionResponse } from '../utils/messageInspectors.js';
16
16
  import { tokenLimit } from './tokenLimits.js';
17
- import { AuthType, createContentGenerator, } from './contentGenerator.js';
18
- import { ProxyAgent, setGlobalDispatcher } from 'undici';
19
- import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
17
+ import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_THINKING_MODE, getEffectiveModel, } from '../config/models.js';
20
18
  import { LoopDetectionService } from '../services/loopDetectionService.js';
21
- import { ideContext } from '../ide/ideContext.js';
19
+ import { ideContextStore } from '../ide/ideContext.js';
22
20
  import { logChatCompression, logNextSpeakerCheck, } from '../telemetry/loggers.js';
23
- import { makeChatCompressionEvent, MalformedJsonResponseEvent, NextSpeakerCheckEvent, } from '../telemetry/types.js';
24
- import { ClearcutLogger } from '../telemetry/clearcut-logger/clearcut-logger.js';
25
- function isThinkingSupported(model) {
26
- if (model.startsWith('gemini-2.5'))
27
- return true;
28
- return false;
21
+ import { makeChatCompressionEvent, NextSpeakerCheckEvent, } from '../telemetry/types.js';
22
+ import { handleFallback } from '../fallback/handler.js';
23
+ import { uiTelemetryService } from '../telemetry/uiTelemetry.js';
24
+ export function isThinkingSupported(model) {
25
+ return model.startsWith('gemini-2.5') || model === DEFAULT_GEMINI_MODEL_AUTO;
26
+ }
27
+ export function isThinkingDefault(model) {
28
+ if (model.startsWith('gemini-2.5-flash-lite')) {
29
+ return false;
30
+ }
31
+ return model.startsWith('gemini-2.5') || model === DEFAULT_GEMINI_MODEL_AUTO;
29
32
  }
30
33
  /**
31
- * Returns the index of the content after the fraction of the total characters in the history.
34
+ * Returns the index of the oldest item to keep when compressing. May return
35
+ * contents.length which indicates that everything should be compressed.
32
36
  *
33
37
  * Exported for testing purposes.
34
38
  */
35
- export function findIndexAfterFraction(history, fraction) {
39
+ export function findCompressSplitPoint(contents, fraction) {
36
40
  if (fraction <= 0 || fraction >= 1) {
37
41
  throw new Error('Fraction must be between 0 and 1');
38
42
  }
39
- const contentLengths = history.map((content) => JSON.stringify(content).length);
40
- const totalCharacters = contentLengths.reduce((sum, length) => sum + length, 0);
41
- const targetCharacters = totalCharacters * fraction;
42
- let charactersSoFar = 0;
43
- for (let i = 0; i < contentLengths.length; i++) {
44
- charactersSoFar += contentLengths[i];
45
- if (charactersSoFar >= targetCharacters) {
46
- return i;
47
- }
43
+ const charCounts = contents.map((content) => JSON.stringify(content).length);
44
+ const totalCharCount = charCounts.reduce((a, b) => a + b, 0);
45
+ const targetCharCount = totalCharCount * fraction;
46
+ let lastSplitPoint = 0; // 0 is always valid (compress nothing)
47
+ let cumulativeCharCount = 0;
48
+ for (let i = 0; i < contents.length; i++) {
49
+ const content = contents[i];
50
+ if (content.role === 'user' &&
51
+ !content.parts?.some((part) => !!part.functionResponse)) {
52
+ if (cumulativeCharCount >= targetCharCount) {
53
+ return i;
54
+ }
55
+ lastSplitPoint = i;
56
+ }
57
+ cumulativeCharCount += charCounts[i];
58
+ }
59
+ // We found no split points after targetCharCount.
60
+ // Check if it's safe to compress everything.
61
+ const lastContent = contents[contents.length - 1];
62
+ if (lastContent?.role === 'model' &&
63
+ !lastContent?.parts?.some((part) => part.functionCall)) {
64
+ return contents.length;
48
65
  }
49
- return contentLengths.length;
66
+ // Can't compress everything so just compress at last splitpoint.
67
+ return lastSplitPoint;
50
68
  }
51
69
  const MAX_TURNS = 100;
52
70
  /**
@@ -62,8 +80,6 @@ const COMPRESSION_PRESERVE_THRESHOLD = 0.3;
62
80
  export class GeminiClient {
63
81
  config;
64
82
  chat;
65
- contentGenerator;
66
- embeddingModel;
67
83
  generateContentConfig = {
68
84
  temperature: 0,
69
85
  topP: 1,
@@ -71,29 +87,27 @@ export class GeminiClient {
71
87
  sessionTurnCount = 0;
72
88
  loopDetector;
73
89
  lastPromptId;
90
+ currentSequenceModel = null;
74
91
  lastSentIdeContext;
75
92
  forceFullIdeContext = true;
93
+ /**
94
+ * At any point in this conversation, was compression triggered without
95
+ * being forced and did it fail?
96
+ */
97
+ hasFailedCompressionAttempt = false;
76
98
  constructor(config) {
77
99
  this.config = config;
78
- if (config.getProxy()) {
79
- setGlobalDispatcher(new ProxyAgent(config.getProxy()));
80
- }
81
- this.embeddingModel = config.getEmbeddingModel();
82
100
  this.loopDetector = new LoopDetectionService(config);
83
101
  this.lastPromptId = this.config.getSessionId();
84
102
  }
85
- async initialize(contentGeneratorConfig) {
86
- this.contentGenerator = await createContentGenerator(contentGeneratorConfig, this.config, this.config.getSessionId());
103
+ async initialize() {
87
104
  this.chat = await this.startChat();
88
105
  }
89
- getContentGenerator() {
90
- if (!this.contentGenerator) {
106
+ getContentGeneratorOrFail() {
107
+ if (!this.config.getContentGenerator()) {
91
108
  throw new Error('Content generator not initialized');
92
109
  }
93
- return this.contentGenerator;
94
- }
95
- getUserTier() {
96
- return this.contentGenerator?.userTier;
110
+ return this.config.getContentGenerator();
97
111
  }
98
112
  async addHistory(content) {
99
113
  this.getChat().addHistory(content);
@@ -105,32 +119,16 @@ export class GeminiClient {
105
119
  return this.chat;
106
120
  }
107
121
  isInitialized() {
108
- return this.chat !== undefined && this.contentGenerator !== undefined;
122
+ return this.chat !== undefined;
109
123
  }
110
124
  getHistory() {
111
125
  return this.getChat().getHistory();
112
126
  }
113
- setHistory(history, { stripThoughts = false } = {}) {
114
- const historyToSet = stripThoughts
115
- ? history.map((content) => {
116
- const newContent = { ...content };
117
- if (newContent.parts) {
118
- newContent.parts = newContent.parts.map((part) => {
119
- if (part &&
120
- typeof part === 'object' &&
121
- 'thoughtSignature' in part) {
122
- const newPart = { ...part };
123
- delete newPart
124
- .thoughtSignature;
125
- return newPart;
126
- }
127
- return part;
128
- });
129
- }
130
- return newContent;
131
- })
132
- : history;
133
- this.getChat().setHistory(historyToSet);
127
+ stripThoughtsFromHistory() {
128
+ this.getChat().stripThoughtsFromHistory();
129
+ }
130
+ setHistory(history) {
131
+ this.getChat().setHistory(history);
134
132
  this.forceFullIdeContext = true;
135
133
  }
136
134
  async setTools() {
@@ -142,6 +140,12 @@ export class GeminiClient {
142
140
  async resetChat() {
143
141
  this.chat = await this.startChat();
144
142
  }
143
+ getChatRecordingService() {
144
+ return this.chat?.getChatRecordingService();
145
+ }
146
+ getLoopDetectionService() {
147
+ return this.loopDetector;
148
+ }
145
149
  async addDirectoryContext() {
146
150
  if (!this.chat) {
147
151
  return;
@@ -153,6 +157,7 @@ export class GeminiClient {
153
157
  }
154
158
  async startChat(extraHistory) {
155
159
  this.forceFullIdeContext = true;
160
+ this.hasFailedCompressionAttempt = false;
156
161
  const envParts = await getEnvironmentContext(this.config);
157
162
  const toolRegistry = this.config.getToolRegistry();
158
163
  const toolDeclarations = toolRegistry.getFunctionDeclarations();
@@ -171,17 +176,17 @@ export class GeminiClient {
171
176
  try {
172
177
  const userMemory = this.config.getUserMemory();
173
178
  const systemInstruction = getCoreSystemPrompt(userMemory);
174
- const generateContentConfigWithThinking = isThinkingSupported(this.config.getModel())
175
- ? {
176
- ...this.generateContentConfig,
177
- thinkingConfig: {
178
- includeThoughts: true,
179
- },
180
- }
181
- : this.generateContentConfig;
182
- return new GeminiChat(this.config, this.getContentGenerator(), {
179
+ const model = this.config.getModel();
180
+ const config = { ...this.generateContentConfig };
181
+ if (isThinkingSupported(model)) {
182
+ config.thinkingConfig = {
183
+ includeThoughts: true,
184
+ thinkingBudget: DEFAULT_THINKING_MODE,
185
+ };
186
+ }
187
+ return new GeminiChat(this.config, {
183
188
  systemInstruction,
184
- ...generateContentConfigWithThinking,
189
+ ...config,
185
190
  tools,
186
191
  }, history);
187
192
  }
@@ -191,7 +196,7 @@ export class GeminiClient {
191
196
  }
192
197
  }
193
198
  getIdeContextParts(forceFullContext) {
194
- const currentIdeContext = ideContext.getIdeContext();
199
+ const currentIdeContext = ideContextStore.get();
195
200
  if (!currentIdeContext) {
196
201
  return { contextParts: [], newIdeContext: undefined };
197
202
  }
@@ -329,10 +334,11 @@ export class GeminiClient {
329
334
  };
330
335
  }
331
336
  }
332
- async *sendMessageStream(request, signal, prompt_id, turns = MAX_TURNS, originalModel) {
337
+ async *sendMessageStream(request, signal, prompt_id, turns = MAX_TURNS) {
333
338
  if (this.lastPromptId !== prompt_id) {
334
339
  this.loopDetector.reset(prompt_id);
335
340
  this.lastPromptId = prompt_id;
341
+ this.currentSequenceModel = null;
336
342
  }
337
343
  this.sessionTurnCount++;
338
344
  if (this.config.getMaxSessionTurns() > 0 &&
@@ -345,10 +351,8 @@ export class GeminiClient {
345
351
  if (!boundedTurns) {
346
352
  return new Turn(this.getChat(), prompt_id);
347
353
  }
348
- // Track the original model from the first call to detect model switching
349
- const initialModel = originalModel || this.config.getModel();
350
- const compressed = await this.tryCompressChat(prompt_id);
351
- if (compressed) {
354
+ const compressed = await this.tryCompressChat(prompt_id, false);
355
+ if (compressed.compressionStatus === CompressionStatus.COMPRESSED) {
352
356
  yield { type: GeminiEventType.ChatCompressed, value: compressed };
353
357
  }
354
358
  // Prevent context updates from being sent while a tool call is
@@ -373,186 +377,63 @@ export class GeminiClient {
373
377
  this.forceFullIdeContext = false;
374
378
  }
375
379
  const turn = new Turn(this.getChat(), prompt_id);
380
+ const controller = new AbortController();
381
+ const linkedSignal = AbortSignal.any([signal, controller.signal]);
376
382
  const loopDetected = await this.loopDetector.turnStarted(signal);
377
383
  if (loopDetected) {
378
384
  yield { type: GeminiEventType.LoopDetected };
379
385
  return turn;
380
386
  }
381
- const resultStream = turn.run(request, signal);
387
+ const routingContext = {
388
+ history: this.getChat().getHistory(/*curated=*/ true),
389
+ request,
390
+ signal,
391
+ };
392
+ let modelToUse;
393
+ // Determine Model (Stickiness vs. Routing)
394
+ if (this.currentSequenceModel) {
395
+ modelToUse = this.currentSequenceModel;
396
+ }
397
+ else {
398
+ const router = await this.config.getModelRouterService();
399
+ const decision = await router.route(routingContext);
400
+ modelToUse = decision.model;
401
+ // Lock the model for the rest of the sequence
402
+ this.currentSequenceModel = modelToUse;
403
+ }
404
+ const resultStream = turn.run(modelToUse, request, linkedSignal);
382
405
  for await (const event of resultStream) {
383
406
  if (this.loopDetector.addAndCheck(event)) {
384
407
  yield { type: GeminiEventType.LoopDetected };
408
+ controller.abort();
385
409
  return turn;
386
410
  }
387
411
  yield event;
412
+ if (event.type === GeminiEventType.Error) {
413
+ return turn;
414
+ }
388
415
  }
389
416
  if (!turn.pendingToolCalls.length && signal && !signal.aborted) {
390
- // Check if model was switched during the call (likely due to quota error)
391
- const currentModel = this.config.getModel();
392
- if (currentModel !== initialModel) {
393
- // Model was switched (likely due to quota error fallback)
394
- // Don't continue with recursive call to prevent unwanted Flash execution
417
+ // Check if next speaker check is needed
418
+ if (this.config.getQuotaErrorOccurred()) {
395
419
  return turn;
396
420
  }
397
421
  if (this.config.getSkipNextSpeakerCheck()) {
398
422
  return turn;
399
423
  }
400
- const nextSpeakerCheck = await checkNextSpeaker(this.getChat(), this, signal);
424
+ const nextSpeakerCheck = await checkNextSpeaker(this.getChat(), this.config.getBaseLlmClient(), signal, prompt_id);
401
425
  logNextSpeakerCheck(this.config, new NextSpeakerCheckEvent(prompt_id, turn.finishReason?.toString() || '', nextSpeakerCheck?.next_speaker || ''));
402
426
  if (nextSpeakerCheck?.next_speaker === 'model') {
403
427
  const nextRequest = [{ text: 'Please continue.' }];
404
428
  // This recursive call's events will be yielded out, but the final
405
429
  // turn object will be from the top-level call.
406
- yield* this.sendMessageStream(nextRequest, signal, prompt_id, boundedTurns - 1, initialModel);
430
+ yield* this.sendMessageStream(nextRequest, signal, prompt_id, boundedTurns - 1);
407
431
  }
408
432
  }
409
433
  return turn;
410
434
  }
411
- async generateJson(contents, schema, abortSignal, model, config = {}) {
412
- // Use current model from config instead of hardcoded Flash model
413
- const modelToUse = model || this.config.getModel() || DEFAULT_GEMINI_FLASH_MODEL;
414
- // If using OpenAI authType, use OpenAI implementation
415
- console.log("my generateJson", this.config.getContentGeneratorConfig()?.authType, modelToUse);
416
- if (this.config.getContentGeneratorConfig()?.authType === AuthType.USE_OPENAI) {
417
- return this.openaiGenerateJson(contents, schema, abortSignal, modelToUse, config);
418
- }
419
- try {
420
- const userMemory = this.config.getUserMemory();
421
- const systemInstruction = getCoreSystemPrompt(userMemory);
422
- const requestConfig = {
423
- abortSignal,
424
- ...this.generateContentConfig,
425
- ...config,
426
- };
427
- const apiCall = () => this.getContentGenerator().generateContent({
428
- model: modelToUse,
429
- config: {
430
- ...requestConfig,
431
- systemInstruction,
432
- responseJsonSchema: schema,
433
- responseMimeType: 'application/json',
434
- },
435
- contents,
436
- }, this.lastPromptId);
437
- const result = await retryWithBackoff(apiCall, {
438
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
439
- authType: this.config.getContentGeneratorConfig()?.authType,
440
- });
441
- let text = getResponseText(result);
442
- if (!text) {
443
- const error = new Error('API returned an empty response for generateJson.');
444
- await reportError(error, 'Error in generateJson: API returned an empty response.', contents, 'generateJson-empty-response');
445
- throw error;
446
- }
447
- const prefix = '```json';
448
- const suffix = '```';
449
- if (text.startsWith(prefix) && text.endsWith(suffix)) {
450
- ClearcutLogger.getInstance(this.config)?.logMalformedJsonResponseEvent(new MalformedJsonResponseEvent(modelToUse));
451
- text = text
452
- .substring(prefix.length, text.length - suffix.length)
453
- .trim();
454
- }
455
- try {
456
- return JSON.parse(text);
457
- }
458
- catch (parseError) {
459
- await reportError(parseError, 'Failed to parse JSON response from generateJson.', {
460
- responseTextFailedToParse: text,
461
- originalRequestContents: contents,
462
- }, 'generateJson-parse');
463
- throw new Error(`Failed to parse API response as JSON: ${getErrorMessage(parseError)}`);
464
- }
465
- }
466
- catch (error) {
467
- if (abortSignal.aborted) {
468
- throw error;
469
- }
470
- // Avoid double reporting for the empty response case handled above
471
- if (error instanceof Error &&
472
- error.message === 'API returned an empty response for generateJson.') {
473
- throw error;
474
- }
475
- await reportError(error, 'Error generating JSON content via API.', contents, 'generateJson-api');
476
- throw new Error(`Failed to generate JSON content: ${getErrorMessage(error)}`);
477
- }
478
- }
479
- async openaiGenerateJson(contents, schema, abortSignal, model, config = {}) {
480
- try {
481
- const userMemory = this.config.getUserMemory();
482
- const systemInstruction = getCoreSystemPrompt(userMemory);
483
- const requestConfig = {
484
- abortSignal,
485
- ...this.generateContentConfig,
486
- ...config,
487
- };
488
- // Create function declaration for OpenAI-style response
489
- const functionDeclaration = {
490
- name: 'respond_in_schema',
491
- description: 'Provide the response in provided schema',
492
- parameters: schema,
493
- };
494
- const tools = [
495
- {
496
- functionDeclarations: [functionDeclaration],
497
- },
498
- ];
499
- const apiCall = () => this.getContentGenerator().generateContent({
500
- model,
501
- config: {
502
- ...requestConfig,
503
- systemInstruction,
504
- tools,
505
- },
506
- contents,
507
- }, this.lastPromptId);
508
- const result = await retryWithBackoff(apiCall, {
509
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
510
- authType: this.config.getContentGeneratorConfig()?.authType,
511
- });
512
- // Try to extract function call arguments
513
- const functionCalls = getFunctionCalls(result);
514
- if (functionCalls && functionCalls.length > 0) {
515
- const functionCall = functionCalls.find((call) => call.name === 'respond_in_schema');
516
- if (functionCall && functionCall.args) {
517
- return functionCall.args;
518
- }
519
- }
520
- // Fallback: try to parse response text as JSON
521
- let text = getResponseText(result);
522
- if (!text) {
523
- const error = new Error('API returned an empty response for openaiGenerateJson.');
524
- await reportError(error, 'Error in openaiGenerateJson: API returned an empty response.', contents, 'openaiGenerateJson-empty-response');
525
- throw error;
526
- }
527
- // Handle markdown wrapped JSON
528
- const prefix = '```json';
529
- const suffix = '```';
530
- if (text.startsWith(prefix) && text.endsWith(suffix)) {
531
- text = text
532
- .substring(prefix.length, text.length - suffix.length)
533
- .trim();
534
- }
535
- try {
536
- return JSON.parse(text);
537
- }
538
- catch (parseError) {
539
- await reportError(parseError, 'Failed to parse JSON response from openaiGenerateJson.', {
540
- responseTextFailedToParse: text,
541
- originalRequestContents: contents,
542
- }, 'openaiGenerateJson-parse');
543
- throw new Error(`Failed to parse API response as JSON: ${getErrorMessage(parseError)}`);
544
- }
545
- }
546
- catch (error) {
547
- if (abortSignal.aborted) {
548
- throw error;
549
- }
550
- await reportError(error, 'Error generating JSON content via OpenAI API.', contents, 'openaiGenerateJson-api');
551
- throw new Error(`Failed to generate JSON content: ${getErrorMessage(error)}`);
552
- }
553
- }
554
435
  async generateContent(contents, generationConfig, abortSignal, model) {
555
- const modelToUse = model ?? this.config.getModel();
436
+ let currentAttemptModel = model;
556
437
  const configToUse = {
557
438
  ...this.generateContentConfig,
558
439
  ...generationConfig,
@@ -565,13 +446,22 @@ export class GeminiClient {
565
446
  ...configToUse,
566
447
  systemInstruction,
567
448
  };
568
- const apiCall = () => this.getContentGenerator().generateContent({
569
- model: modelToUse,
570
- config: requestConfig,
571
- contents,
572
- }, this.lastPromptId);
449
+ const apiCall = () => {
450
+ const modelToUse = this.config.isInFallbackMode()
451
+ ? DEFAULT_GEMINI_FLASH_MODEL
452
+ : model;
453
+ currentAttemptModel = modelToUse;
454
+ return this.getContentGeneratorOrFail().generateContent({
455
+ model: modelToUse,
456
+ config: requestConfig,
457
+ contents,
458
+ }, this.lastPromptId);
459
+ };
460
+ const onPersistent429Callback = async (authType, error) =>
461
+ // Pass the captured model to the centralized handler.
462
+ await handleFallback(this.config, currentAttemptModel, authType, error);
573
463
  const result = await retryWithBackoff(apiCall, {
574
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
464
+ onPersistent429: onPersistent429Callback,
575
465
  authType: this.config.getContentGeneratorConfig()?.authType,
576
466
  });
577
467
  return result;
@@ -580,79 +470,70 @@ export class GeminiClient {
580
470
  if (abortSignal.aborted) {
581
471
  throw error;
582
472
  }
583
- await reportError(error, `Error generating content via API with model ${modelToUse}.`, {
473
+ await reportError(error, `Error generating content via API with model ${currentAttemptModel}.`, {
584
474
  requestContents: contents,
585
475
  requestConfig: configToUse,
586
476
  }, 'generateContent-api');
587
- throw new Error(`Failed to generate content with model ${modelToUse}: ${getErrorMessage(error)}`);
588
- }
589
- }
590
- async generateEmbedding(texts) {
591
- if (!texts || texts.length === 0) {
592
- return [];
593
- }
594
- const embedModelParams = {
595
- model: this.embeddingModel,
596
- contents: texts,
597
- };
598
- const embedContentResponse = await this.getContentGenerator().embedContent(embedModelParams);
599
- if (!embedContentResponse.embeddings ||
600
- embedContentResponse.embeddings.length === 0) {
601
- throw new Error('No embeddings found in API response.');
602
- }
603
- if (embedContentResponse.embeddings.length !== texts.length) {
604
- throw new Error(`API returned a mismatched number of embeddings. Expected ${texts.length}, got ${embedContentResponse.embeddings.length}.`);
477
+ throw new Error(`Failed to generate content with model ${currentAttemptModel}: ${getErrorMessage(error)}`);
605
478
  }
606
- return embedContentResponse.embeddings.map((embedding, index) => {
607
- const values = embedding.values;
608
- if (!values || values.length === 0) {
609
- throw new Error(`API returned an empty embedding for input text at index ${index}: "${texts[index]}"`);
610
- }
611
- return values;
612
- });
613
479
  }
614
480
  async tryCompressChat(prompt_id, force = false) {
481
+ // If the model is 'auto', we will use a placeholder model to check.
482
+ // Compression occurs before we choose a model, so calling `count_tokens`
483
+ // before the model is chosen would result in an error.
484
+ const configModel = this.config.getModel();
485
+ let model = configModel === DEFAULT_GEMINI_MODEL_AUTO
486
+ ? DEFAULT_GEMINI_MODEL
487
+ : configModel;
488
+ // Check if the model needs to be a fallback
489
+ model = getEffectiveModel(this.config.isInFallbackMode(), model);
615
490
  const curatedHistory = this.getChat().getHistory(true);
616
491
  // Regardless of `force`, don't do anything if the history is empty.
617
- if (curatedHistory.length === 0) {
618
- return null;
619
- }
620
- const model = this.config.getModel();
621
- const { totalTokens: originalTokenCount } = await this.getContentGenerator().countTokens({
622
- model,
623
- contents: curatedHistory,
624
- });
625
- if (originalTokenCount === undefined) {
626
- console.warn(`Could not determine token count for model ${model}.`);
627
- return null;
492
+ if (curatedHistory.length === 0 ||
493
+ (this.hasFailedCompressionAttempt && !force)) {
494
+ return {
495
+ originalTokenCount: 0,
496
+ newTokenCount: 0,
497
+ compressionStatus: CompressionStatus.NOOP,
498
+ };
628
499
  }
500
+ const originalTokenCount = uiTelemetryService.getLastPromptTokenCount();
629
501
  const contextPercentageThreshold = this.config.getChatCompression()?.contextPercentageThreshold;
630
502
  // Don't compress if not forced and we are under the limit.
631
503
  if (!force) {
632
504
  const threshold = contextPercentageThreshold ?? COMPRESSION_TOKEN_THRESHOLD;
633
505
  if (originalTokenCount < threshold * tokenLimit(model)) {
634
- return null;
506
+ return {
507
+ originalTokenCount,
508
+ newTokenCount: originalTokenCount,
509
+ compressionStatus: CompressionStatus.NOOP,
510
+ };
635
511
  }
636
512
  }
637
- let compressBeforeIndex = findIndexAfterFraction(curatedHistory, 1 - COMPRESSION_PRESERVE_THRESHOLD);
638
- // Find the first user message after the index. This is the start of the next turn.
639
- while (compressBeforeIndex < curatedHistory.length &&
640
- (curatedHistory[compressBeforeIndex]?.role === 'model' ||
641
- isFunctionResponse(curatedHistory[compressBeforeIndex]))) {
642
- compressBeforeIndex++;
643
- }
644
- const historyToCompress = curatedHistory.slice(0, compressBeforeIndex);
645
- const historyToKeep = curatedHistory.slice(compressBeforeIndex);
646
- this.getChat().setHistory(historyToCompress);
647
- const { text: summary } = await this.getChat().sendMessage({
648
- message: {
649
- text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
650
- },
513
+ const splitPoint = findCompressSplitPoint(curatedHistory, 1 - COMPRESSION_PRESERVE_THRESHOLD);
514
+ const historyToCompress = curatedHistory.slice(0, splitPoint);
515
+ const historyToKeep = curatedHistory.slice(splitPoint);
516
+ const summaryResponse = await this.config
517
+ .getContentGenerator()
518
+ .generateContent({
519
+ model,
520
+ contents: [
521
+ ...historyToCompress,
522
+ {
523
+ role: 'user',
524
+ parts: [
525
+ {
526
+ text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
527
+ },
528
+ ],
529
+ },
530
+ ],
651
531
  config: {
652
532
  systemInstruction: { text: getCompressionPrompt() },
653
533
  },
654
534
  }, prompt_id);
655
- this.chat = await this.startChat([
535
+ const summary = getResponseText(summaryResponse) ?? '';
536
+ const chat = await this.startChat([
656
537
  {
657
538
  role: 'user',
658
539
  parts: [{ text: summary }],
@@ -664,60 +545,33 @@ export class GeminiClient {
664
545
  ...historyToKeep,
665
546
  ]);
666
547
  this.forceFullIdeContext = true;
667
- const { totalTokens: newTokenCount } = await this.getContentGenerator().countTokens({
668
- // model might change after calling `sendMessage`, so we get the newest value from config
669
- model: this.config.getModel(),
670
- contents: this.getChat().getHistory(),
671
- });
672
- if (newTokenCount === undefined) {
673
- console.warn('Could not determine compressed history token count.');
674
- return null;
675
- }
548
+ // Estimate token count 1 token 4 characters
549
+ const newTokenCount = Math.floor(chat
550
+ .getHistory()
551
+ .reduce((total, content) => total + JSON.stringify(content).length, 0) /
552
+ 4);
676
553
  logChatCompression(this.config, makeChatCompressionEvent({
677
554
  tokens_before: originalTokenCount,
678
555
  tokens_after: newTokenCount,
679
556
  }));
557
+ if (newTokenCount > originalTokenCount) {
558
+ this.hasFailedCompressionAttempt = !force && true;
559
+ return {
560
+ originalTokenCount,
561
+ newTokenCount,
562
+ compressionStatus: CompressionStatus.COMPRESSION_FAILED_INFLATED_TOKEN_COUNT,
563
+ };
564
+ }
565
+ else {
566
+ this.chat = chat; // Chat compression successful, set new state.
567
+ uiTelemetryService.setLastPromptTokenCount(newTokenCount);
568
+ }
680
569
  return {
681
570
  originalTokenCount,
682
571
  newTokenCount,
572
+ compressionStatus: CompressionStatus.COMPRESSED,
683
573
  };
684
574
  }
685
- /**
686
- * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
687
- * Uses a fallback handler if provided by the config; otherwise, returns null.
688
- */
689
- async handleFlashFallback(authType, error) {
690
- // Only handle fallback for OAuth users
691
- if (authType !== AuthType.LOGIN_WITH_GOOGLE) {
692
- return null;
693
- }
694
- const currentModel = this.config.getModel();
695
- const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
696
- // Don't fallback if already using Flash model
697
- if (currentModel === fallbackModel) {
698
- return null;
699
- }
700
- // Check if config has a fallback handler (set by CLI package)
701
- const fallbackHandler = this.config.flashFallbackHandler;
702
- if (typeof fallbackHandler === 'function') {
703
- try {
704
- const accepted = await fallbackHandler(currentModel, fallbackModel, error);
705
- if (accepted !== false && accepted !== null) {
706
- this.config.setModel(fallbackModel);
707
- this.config.setFallbackMode(true);
708
- return fallbackModel;
709
- }
710
- // Check if the model was switched manually in the handler
711
- if (this.config.getModel() === fallbackModel) {
712
- return null; // Model was switched but don't continue with current prompt
713
- }
714
- }
715
- catch (error) {
716
- console.warn('Flash fallback handler failed:', error);
717
- }
718
- }
719
- return null;
720
- }
721
575
  }
722
576
  export const TEST_ONLY = {
723
577
  COMPRESSION_PRESERVE_THRESHOLD,