@google/gemini-cli-core 0.0.3-preview.4 → 0.0.3

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 (490) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +12 -2
  3. package/dist/index.d.ts +6 -2
  4. package/dist/index.js +6 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/code_assist/codeAssist.d.ts +2 -0
  7. package/dist/src/code_assist/codeAssist.js +12 -0
  8. package/dist/src/code_assist/codeAssist.js.map +1 -1
  9. package/dist/src/code_assist/converter.d.ts +3 -1
  10. package/dist/src/code_assist/converter.js +2 -1
  11. package/dist/src/code_assist/converter.js.map +1 -1
  12. package/dist/src/code_assist/converter.test.js +10 -0
  13. package/dist/src/code_assist/converter.test.js.map +1 -1
  14. package/dist/src/code_assist/oauth-credential-storage.d.ts +25 -0
  15. package/dist/src/code_assist/oauth-credential-storage.js +109 -0
  16. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -0
  17. package/dist/src/code_assist/oauth-credential-storage.test.js +136 -0
  18. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -0
  19. package/dist/src/code_assist/oauth2.js +92 -29
  20. package/dist/src/code_assist/oauth2.js.map +1 -1
  21. package/dist/src/code_assist/oauth2.test.js +729 -339
  22. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  23. package/dist/src/code_assist/server.d.ts +1 -1
  24. package/dist/src/code_assist/server.js +24 -1
  25. package/dist/src/code_assist/server.js.map +1 -1
  26. package/dist/src/code_assist/server.test.js +25 -0
  27. package/dist/src/code_assist/server.test.js.map +1 -1
  28. package/dist/src/code_assist/types.d.ts +17 -2
  29. package/dist/src/config/config.d.ts +72 -12
  30. package/dist/src/config/config.js +196 -64
  31. package/dist/src/config/config.js.map +1 -1
  32. package/dist/src/config/config.test.js +305 -178
  33. package/dist/src/config/config.test.js.map +1 -1
  34. package/dist/src/config/models.d.ts +16 -0
  35. package/dist/src/config/models.js +29 -0
  36. package/dist/src/config/models.js.map +1 -1
  37. package/dist/src/config/models.test.d.ts +6 -0
  38. package/dist/src/config/models.test.js +55 -0
  39. package/dist/src/config/models.test.js.map +1 -0
  40. package/dist/src/config/storage.d.ts +2 -0
  41. package/dist/src/config/storage.js +6 -1
  42. package/dist/src/config/storage.js.map +1 -1
  43. package/dist/src/config/storage.test.js +4 -0
  44. package/dist/src/config/storage.test.js.map +1 -1
  45. package/dist/src/confirmation-bus/index.d.ts +7 -0
  46. package/dist/src/confirmation-bus/index.js +8 -0
  47. package/dist/src/confirmation-bus/index.js.map +1 -0
  48. package/dist/src/confirmation-bus/message-bus.d.ts +17 -0
  49. package/dist/src/confirmation-bus/message-bus.js +81 -0
  50. package/dist/src/confirmation-bus/message-bus.js.map +1 -0
  51. package/dist/src/confirmation-bus/message-bus.test.d.ts +6 -0
  52. package/dist/src/confirmation-bus/message-bus.test.js +164 -0
  53. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -0
  54. package/dist/src/confirmation-bus/types.d.ts +38 -0
  55. package/dist/src/confirmation-bus/types.js +15 -0
  56. package/dist/src/confirmation-bus/types.js.map +1 -0
  57. package/dist/src/core/baseLlmClient.d.ts +46 -0
  58. package/dist/src/core/baseLlmClient.js +112 -0
  59. package/dist/src/core/baseLlmClient.js.map +1 -0
  60. package/dist/src/core/baseLlmClient.test.d.ts +6 -0
  61. package/dist/src/core/baseLlmClient.test.js +253 -0
  62. package/dist/src/core/baseLlmClient.test.js.map +1 -0
  63. package/dist/src/core/client.d.ts +16 -21
  64. package/dist/src/core/client.js +145 -232
  65. package/dist/src/core/client.js.map +1 -1
  66. package/dist/src/core/client.test.js +393 -492
  67. package/dist/src/core/client.test.js.map +1 -1
  68. package/dist/src/core/contentGenerator.d.ts +2 -3
  69. package/dist/src/core/contentGenerator.js +0 -4
  70. package/dist/src/core/contentGenerator.js.map +1 -1
  71. package/dist/src/core/contentGenerator.test.js +1 -3
  72. package/dist/src/core/contentGenerator.test.js.map +1 -1
  73. package/dist/src/core/coreToolScheduler.d.ts +8 -3
  74. package/dist/src/core/coreToolScheduler.js +106 -5
  75. package/dist/src/core/coreToolScheduler.js.map +1 -1
  76. package/dist/src/core/coreToolScheduler.test.js +233 -5
  77. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  78. package/dist/src/core/geminiChat.d.ts +38 -32
  79. package/dist/src/core/geminiChat.js +209 -219
  80. package/dist/src/core/geminiChat.js.map +1 -1
  81. package/dist/src/core/geminiChat.test.js +674 -386
  82. package/dist/src/core/geminiChat.test.js.map +1 -1
  83. package/dist/src/core/loggingContentGenerator.js +13 -16
  84. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  85. package/dist/src/core/nonInteractiveToolExecutor.test.js +59 -1
  86. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  87. package/dist/src/core/prompts.d.ts +5 -0
  88. package/dist/src/core/prompts.js +63 -42
  89. package/dist/src/core/prompts.js.map +1 -1
  90. package/dist/src/core/prompts.test.js +130 -1
  91. package/dist/src/core/prompts.test.js.map +1 -1
  92. package/dist/src/core/subagent.js +7 -10
  93. package/dist/src/core/subagent.js.map +1 -1
  94. package/dist/src/core/subagent.test.js +32 -22
  95. package/dist/src/core/subagent.test.js.map +1 -1
  96. package/dist/src/core/turn.d.ts +21 -5
  97. package/dist/src/core/turn.js +45 -11
  98. package/dist/src/core/turn.js.map +1 -1
  99. package/dist/src/core/turn.test.js +340 -100
  100. package/dist/src/core/turn.test.js.map +1 -1
  101. package/dist/src/fallback/handler.d.ts +7 -0
  102. package/dist/src/fallback/handler.js +51 -0
  103. package/dist/src/fallback/handler.js.map +1 -0
  104. package/dist/src/fallback/handler.test.d.ts +6 -0
  105. package/dist/src/fallback/handler.test.js +130 -0
  106. package/dist/src/fallback/handler.test.js.map +1 -0
  107. package/dist/src/fallback/types.d.ts +14 -0
  108. package/dist/src/fallback/types.js +7 -0
  109. package/dist/src/fallback/types.js.map +1 -0
  110. package/dist/src/generated/git-commit.d.ts +2 -2
  111. package/dist/src/generated/git-commit.js +2 -2
  112. package/dist/src/generated/git-commit.js.map +1 -1
  113. package/dist/src/ide/constants.d.ts +3 -0
  114. package/dist/src/ide/constants.js +3 -0
  115. package/dist/src/ide/constants.js.map +1 -1
  116. package/dist/src/ide/detect-ide.d.ts +42 -14
  117. package/dist/src/ide/detect-ide.js +22 -68
  118. package/dist/src/ide/detect-ide.js.map +1 -1
  119. package/dist/src/ide/detect-ide.test.js +11 -51
  120. package/dist/src/ide/detect-ide.test.js.map +1 -1
  121. package/dist/src/ide/ide-client.d.ts +60 -18
  122. package/dist/src/ide/ide-client.js +275 -53
  123. package/dist/src/ide/ide-client.js.map +1 -1
  124. package/dist/src/ide/ide-client.test.js +239 -6
  125. package/dist/src/ide/ide-client.test.js.map +1 -1
  126. package/dist/src/ide/ide-installer.d.ts +2 -2
  127. package/dist/src/ide/ide-installer.js +15 -11
  128. package/dist/src/ide/ide-installer.js.map +1 -1
  129. package/dist/src/ide/ide-installer.test.js +30 -12
  130. package/dist/src/ide/ide-installer.test.js.map +1 -1
  131. package/dist/src/ide/ideContext.d.ts +35 -365
  132. package/dist/src/ide/ideContext.js +60 -106
  133. package/dist/src/ide/ideContext.js.map +1 -1
  134. package/dist/src/ide/ideContext.test.js +152 -24
  135. package/dist/src/ide/ideContext.test.js.map +1 -1
  136. package/dist/src/ide/process-utils.d.ts +0 -1
  137. package/dist/src/ide/process-utils.js +43 -25
  138. package/dist/src/ide/process-utils.js.map +1 -1
  139. package/dist/src/ide/process-utils.test.js +90 -4
  140. package/dist/src/ide/process-utils.test.js.map +1 -1
  141. package/dist/src/ide/types.d.ts +486 -0
  142. package/dist/src/ide/types.js +138 -0
  143. package/dist/src/ide/types.js.map +1 -0
  144. package/dist/src/index.d.ts +10 -2
  145. package/dist/src/index.js +11 -2
  146. package/dist/src/index.js.map +1 -1
  147. package/dist/src/mcp/oauth-provider.d.ts +15 -12
  148. package/dist/src/mcp/oauth-provider.js +63 -56
  149. package/dist/src/mcp/oauth-provider.js.map +1 -1
  150. package/dist/src/mcp/oauth-provider.test.js +74 -35
  151. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  152. package/dist/src/mcp/oauth-token-storage.d.ts +14 -10
  153. package/dist/src/mcp/oauth-token-storage.js +52 -20
  154. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  155. package/dist/src/mcp/oauth-token-storage.test.js +255 -162
  156. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  157. package/dist/src/mcp/token-storage/base-token-storage.d.ts +1 -1
  158. package/dist/src/mcp/token-storage/base-token-storage.js +1 -1
  159. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -1
  160. package/dist/src/mcp/token-storage/base-token-storage.test.js +1 -1
  161. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  162. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  163. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  164. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  165. package/dist/src/mcp/token-storage/file-token-storage.test.d.ts +6 -0
  166. package/dist/src/mcp/token-storage/file-token-storage.test.js +235 -0
  167. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -0
  168. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  169. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  170. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  171. package/dist/src/mcp/token-storage/hybrid-token-storage.test.d.ts +6 -0
  172. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js +193 -0
  173. package/dist/src/mcp/token-storage/hybrid-token-storage.test.js.map +1 -0
  174. package/dist/src/mcp/token-storage/index.d.ts +11 -0
  175. package/dist/src/mcp/token-storage/index.js +12 -0
  176. package/dist/src/mcp/token-storage/index.js.map +1 -0
  177. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  178. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  179. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  180. package/dist/src/mcp/token-storage/keychain-token-storage.test.d.ts +6 -0
  181. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +254 -0
  182. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -0
  183. package/dist/src/mcp/token-storage/types.d.ts +4 -0
  184. package/dist/src/mcp/token-storage/types.js +5 -1
  185. package/dist/src/mcp/token-storage/types.js.map +1 -1
  186. package/dist/src/output/json-formatter.d.ts +11 -0
  187. package/dist/src/output/json-formatter.js +30 -0
  188. package/dist/src/output/json-formatter.js.map +1 -0
  189. package/dist/src/output/json-formatter.test.d.ts +6 -0
  190. package/dist/src/output/json-formatter.test.js +266 -0
  191. package/dist/src/output/json-formatter.test.js.map +1 -0
  192. package/dist/src/output/types.d.ts +20 -0
  193. package/dist/src/output/types.js +11 -0
  194. package/dist/src/output/types.js.map +1 -0
  195. package/dist/src/policy/index.d.ts +7 -0
  196. package/dist/src/policy/index.js +8 -0
  197. package/dist/src/policy/index.js.map +1 -0
  198. package/dist/src/policy/policy-engine.d.ts +30 -0
  199. package/dist/src/policy/policy-engine.js +92 -0
  200. package/dist/src/policy/policy-engine.js.map +1 -0
  201. package/dist/src/policy/policy-engine.test.d.ts +6 -0
  202. package/dist/src/policy/policy-engine.test.js +515 -0
  203. package/dist/src/policy/policy-engine.test.js.map +1 -0
  204. package/dist/src/policy/stable-stringify.d.ts +58 -0
  205. package/dist/src/policy/stable-stringify.js +122 -0
  206. package/dist/src/policy/stable-stringify.js.map +1 -0
  207. package/dist/src/policy/types.d.ts +47 -0
  208. package/dist/src/policy/types.js +12 -0
  209. package/dist/src/policy/types.js.map +1 -0
  210. package/dist/src/routing/modelRouterService.d.ts +23 -0
  211. package/dist/src/routing/modelRouterService.js +70 -0
  212. package/dist/src/routing/modelRouterService.js.map +1 -0
  213. package/dist/src/routing/modelRouterService.test.d.ts +6 -0
  214. package/dist/src/routing/modelRouterService.test.js +98 -0
  215. package/dist/src/routing/modelRouterService.test.js.map +1 -0
  216. package/dist/src/routing/routingStrategy.d.ts +62 -0
  217. package/dist/src/routing/routingStrategy.js +7 -0
  218. package/dist/src/routing/routingStrategy.js.map +1 -0
  219. package/dist/src/routing/strategies/classifierStrategy.d.ts +12 -0
  220. package/dist/src/routing/strategies/classifierStrategy.js +173 -0
  221. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -0
  222. package/dist/src/routing/strategies/classifierStrategy.test.d.ts +6 -0
  223. package/dist/src/routing/strategies/classifierStrategy.test.js +192 -0
  224. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -0
  225. package/dist/src/routing/strategies/compositeStrategy.d.ts +26 -0
  226. package/dist/src/routing/strategies/compositeStrategy.js +67 -0
  227. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -0
  228. package/dist/src/routing/strategies/compositeStrategy.test.d.ts +6 -0
  229. package/dist/src/routing/strategies/compositeStrategy.test.js +123 -0
  230. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -0
  231. package/dist/src/routing/strategies/defaultStrategy.d.ts +12 -0
  232. package/dist/src/routing/strategies/defaultStrategy.js +20 -0
  233. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -0
  234. package/dist/src/routing/strategies/defaultStrategy.test.d.ts +6 -0
  235. package/dist/src/routing/strategies/defaultStrategy.test.js +26 -0
  236. package/dist/src/routing/strategies/defaultStrategy.test.js.map +1 -0
  237. package/dist/src/routing/strategies/fallbackStrategy.d.ts +12 -0
  238. package/dist/src/routing/strategies/fallbackStrategy.js +25 -0
  239. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -0
  240. package/dist/src/routing/strategies/fallbackStrategy.test.d.ts +6 -0
  241. package/dist/src/routing/strategies/fallbackStrategy.test.js +55 -0
  242. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -0
  243. package/dist/src/routing/strategies/overrideStrategy.d.ts +15 -0
  244. package/dist/src/routing/strategies/overrideStrategy.js +28 -0
  245. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -0
  246. package/dist/src/routing/strategies/overrideStrategy.test.d.ts +6 -0
  247. package/dist/src/routing/strategies/overrideStrategy.test.js +42 -0
  248. package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -0
  249. package/dist/src/services/chatRecordingService.d.ts +7 -13
  250. package/dist/src/services/chatRecordingService.js +28 -19
  251. package/dist/src/services/chatRecordingService.js.map +1 -1
  252. package/dist/src/services/chatRecordingService.test.js +62 -20
  253. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  254. package/dist/src/services/fileDiscoveryService.d.ts +10 -0
  255. package/dist/src/services/fileDiscoveryService.js +31 -17
  256. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  257. package/dist/src/services/gitService.js +9 -12
  258. package/dist/src/services/gitService.js.map +1 -1
  259. package/dist/src/services/gitService.test.js +10 -20
  260. package/dist/src/services/gitService.test.js.map +1 -1
  261. package/dist/src/services/loopDetectionService.d.ts +5 -0
  262. package/dist/src/services/loopDetectionService.js +36 -20
  263. package/dist/src/services/loopDetectionService.js.map +1 -1
  264. package/dist/src/services/loopDetectionService.test.js +41 -12
  265. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  266. package/dist/src/services/shellExecutionService.d.ts +34 -2
  267. package/dist/src/services/shellExecutionService.js +192 -43
  268. package/dist/src/services/shellExecutionService.js.map +1 -1
  269. package/dist/src/services/shellExecutionService.test.js +184 -55
  270. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  271. package/dist/src/telemetry/activity-detector.d.ts +41 -0
  272. package/dist/src/telemetry/activity-detector.js +61 -0
  273. package/dist/src/telemetry/activity-detector.js.map +1 -0
  274. package/dist/src/telemetry/activity-detector.test.d.ts +6 -0
  275. package/dist/src/telemetry/activity-detector.test.js +136 -0
  276. package/dist/src/telemetry/activity-detector.test.js.map +1 -0
  277. package/dist/src/telemetry/activity-types.d.ts +19 -0
  278. package/dist/src/telemetry/activity-types.js +21 -0
  279. package/dist/src/telemetry/activity-types.js.map +1 -0
  280. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +16 -2
  281. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +143 -24
  282. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  283. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +101 -1
  284. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  285. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +19 -2
  286. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +48 -2
  287. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  288. package/dist/src/telemetry/constants.d.ts +8 -0
  289. package/dist/src/telemetry/constants.js +8 -0
  290. package/dist/src/telemetry/constants.js.map +1 -1
  291. package/dist/src/telemetry/gcp-exporters.d.ts +34 -0
  292. package/dist/src/telemetry/gcp-exporters.js +117 -0
  293. package/dist/src/telemetry/gcp-exporters.js.map +1 -0
  294. package/dist/src/telemetry/gcp-exporters.test.d.ts +6 -0
  295. package/dist/src/telemetry/gcp-exporters.test.js +318 -0
  296. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -0
  297. package/dist/src/telemetry/high-water-mark-tracker.d.ts +43 -0
  298. package/dist/src/telemetry/high-water-mark-tracker.js +88 -0
  299. package/dist/src/telemetry/high-water-mark-tracker.js.map +1 -0
  300. package/dist/src/telemetry/high-water-mark-tracker.test.d.ts +6 -0
  301. package/dist/src/telemetry/high-water-mark-tracker.test.js +152 -0
  302. package/dist/src/telemetry/high-water-mark-tracker.test.js.map +1 -0
  303. package/dist/src/telemetry/index.d.ts +7 -2
  304. package/dist/src/telemetry/index.js +7 -2
  305. package/dist/src/telemetry/index.js.map +1 -1
  306. package/dist/src/telemetry/loggers.d.ts +8 -1
  307. package/dist/src/telemetry/loggers.js +140 -8
  308. package/dist/src/telemetry/loggers.js.map +1 -1
  309. package/dist/src/telemetry/loggers.test.js +268 -39
  310. package/dist/src/telemetry/loggers.test.js.map +1 -1
  311. package/dist/src/telemetry/metrics.d.ts +4 -3
  312. package/dist/src/telemetry/metrics.js +33 -10
  313. package/dist/src/telemetry/metrics.js.map +1 -1
  314. package/dist/src/telemetry/metrics.test.js +47 -25
  315. package/dist/src/telemetry/metrics.test.js.map +1 -1
  316. package/dist/src/telemetry/rate-limiter.d.ts +48 -0
  317. package/dist/src/telemetry/rate-limiter.js +100 -0
  318. package/dist/src/telemetry/rate-limiter.js.map +1 -0
  319. package/dist/src/telemetry/rate-limiter.test.d.ts +6 -0
  320. package/dist/src/telemetry/rate-limiter.test.js +207 -0
  321. package/dist/src/telemetry/rate-limiter.test.js.map +1 -0
  322. package/dist/src/telemetry/sdk.js +16 -1
  323. package/dist/src/telemetry/sdk.js.map +1 -1
  324. package/dist/src/telemetry/sdk.test.js +95 -0
  325. package/dist/src/telemetry/sdk.test.js.map +1 -1
  326. package/dist/src/telemetry/types.d.ts +70 -6
  327. package/dist/src/telemetry/types.js +112 -8
  328. package/dist/src/telemetry/types.js.map +1 -1
  329. package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
  330. package/dist/src/telemetry/uiTelemetry.js +6 -7
  331. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  332. package/dist/src/telemetry/uiTelemetry.test.js +15 -15
  333. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  334. package/dist/src/test-utils/index.d.ts +6 -0
  335. package/dist/src/test-utils/index.js +7 -0
  336. package/dist/src/test-utils/index.js.map +1 -0
  337. package/dist/src/test-utils/mock-tool.d.ts +41 -0
  338. package/dist/src/test-utils/mock-tool.js +51 -0
  339. package/dist/src/test-utils/mock-tool.js.map +1 -0
  340. package/dist/src/tools/diffOptions.js +21 -13
  341. package/dist/src/tools/diffOptions.js.map +1 -1
  342. package/dist/src/tools/diffOptions.test.js +58 -22
  343. package/dist/src/tools/diffOptions.test.js.map +1 -1
  344. package/dist/src/tools/edit.d.ts +2 -2
  345. package/dist/src/tools/edit.js +35 -44
  346. package/dist/src/tools/edit.js.map +1 -1
  347. package/dist/src/tools/edit.test.js +124 -13
  348. package/dist/src/tools/edit.test.js.map +1 -1
  349. package/dist/src/tools/glob.d.ts +5 -1
  350. package/dist/src/tools/glob.js +24 -17
  351. package/dist/src/tools/glob.js.map +1 -1
  352. package/dist/src/tools/glob.test.js +51 -0
  353. package/dist/src/tools/glob.test.js.map +1 -1
  354. package/dist/src/tools/ls.js +19 -32
  355. package/dist/src/tools/ls.js.map +1 -1
  356. package/dist/src/tools/ls.test.js +140 -280
  357. package/dist/src/tools/ls.test.js.map +1 -1
  358. package/dist/src/tools/mcp-client-manager.d.ts +5 -3
  359. package/dist/src/tools/mcp-client-manager.js +13 -4
  360. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  361. package/dist/src/tools/mcp-client-manager.test.js +20 -1
  362. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  363. package/dist/src/tools/mcp-client.d.ts +5 -5
  364. package/dist/src/tools/mcp-client.js +40 -35
  365. package/dist/src/tools/mcp-client.js.map +1 -1
  366. package/dist/src/tools/mcp-client.test.js +3 -3
  367. package/dist/src/tools/mcp-client.test.js.map +1 -1
  368. package/dist/src/tools/mcp-tool.d.ts +3 -2
  369. package/dist/src/tools/mcp-tool.js +9 -9
  370. package/dist/src/tools/mcp-tool.js.map +1 -1
  371. package/dist/src/tools/mcp-tool.test.js +28 -7
  372. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  373. package/dist/src/tools/memoryTool.js +5 -33
  374. package/dist/src/tools/memoryTool.js.map +1 -1
  375. package/dist/src/tools/read-file.js +8 -3
  376. package/dist/src/tools/read-file.js.map +1 -1
  377. package/dist/src/tools/read-file.test.js +29 -0
  378. package/dist/src/tools/read-file.test.js.map +1 -1
  379. package/dist/src/tools/read-many-files.d.ts +1 -1
  380. package/dist/src/tools/read-many-files.js +18 -50
  381. package/dist/src/tools/read-many-files.js.map +1 -1
  382. package/dist/src/tools/read-many-files.test.js +4 -4
  383. package/dist/src/tools/read-many-files.test.js.map +1 -1
  384. package/dist/src/tools/ripGrep.d.ts +8 -0
  385. package/dist/src/tools/ripGrep.js +26 -1
  386. package/dist/src/tools/ripGrep.js.map +1 -1
  387. package/dist/src/tools/ripGrep.test.js +107 -5
  388. package/dist/src/tools/ripGrep.test.js.map +1 -1
  389. package/dist/src/tools/shell.d.ts +12 -2
  390. package/dist/src/tools/shell.js +20 -24
  391. package/dist/src/tools/shell.js.map +1 -1
  392. package/dist/src/tools/shell.test.js +35 -70
  393. package/dist/src/tools/shell.test.js.map +1 -1
  394. package/dist/src/tools/smart-edit.d.ts +72 -0
  395. package/dist/src/tools/smart-edit.js +594 -0
  396. package/dist/src/tools/smart-edit.js.map +1 -0
  397. package/dist/src/tools/smart-edit.test.d.ts +6 -0
  398. package/dist/src/tools/smart-edit.test.js +419 -0
  399. package/dist/src/tools/smart-edit.test.js.map +1 -0
  400. package/dist/src/tools/tool-registry.d.ts +2 -1
  401. package/dist/src/tools/tool-registry.js +6 -5
  402. package/dist/src/tools/tool-registry.js.map +1 -1
  403. package/dist/src/tools/tools.d.ts +14 -7
  404. package/dist/src/tools/tools.js +9 -2
  405. package/dist/src/tools/tools.js.map +1 -1
  406. package/dist/src/tools/web-fetch.js +4 -3
  407. package/dist/src/tools/web-fetch.js.map +1 -1
  408. package/dist/src/tools/web-search.d.ts +1 -1
  409. package/dist/src/tools/web-search.js +3 -1
  410. package/dist/src/tools/web-search.js.map +1 -1
  411. package/dist/src/tools/write-file.js +14 -19
  412. package/dist/src/tools/write-file.js.map +1 -1
  413. package/dist/src/tools/write-file.test.js +99 -19
  414. package/dist/src/tools/write-file.test.js.map +1 -1
  415. package/dist/src/utils/bfsFileSearch.js +11 -5
  416. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  417. package/dist/src/utils/editCorrector.d.ts +7 -6
  418. package/dist/src/utils/editCorrector.js +61 -18
  419. package/dist/src/utils/editCorrector.js.map +1 -1
  420. package/dist/src/utils/editCorrector.test.js +30 -79
  421. package/dist/src/utils/editCorrector.test.js.map +1 -1
  422. package/dist/src/utils/editor.js +31 -44
  423. package/dist/src/utils/editor.js.map +1 -1
  424. package/dist/src/utils/editor.test.js +61 -75
  425. package/dist/src/utils/editor.test.js.map +1 -1
  426. package/dist/src/utils/errorParsing.js +2 -2
  427. package/dist/src/utils/errorParsing.js.map +1 -1
  428. package/dist/src/utils/errorParsing.test.js +7 -7
  429. package/dist/src/utils/errorParsing.test.js.map +1 -1
  430. package/dist/src/utils/errors.d.ts +6 -0
  431. package/dist/src/utils/errors.js +10 -0
  432. package/dist/src/utils/errors.js.map +1 -1
  433. package/dist/src/utils/fileUtils.d.ts +20 -3
  434. package/dist/src/utils/fileUtils.js +154 -32
  435. package/dist/src/utils/fileUtils.js.map +1 -1
  436. package/dist/src/utils/fileUtils.test.js +347 -29
  437. package/dist/src/utils/fileUtils.test.js.map +1 -1
  438. package/dist/src/utils/flashFallback.test.d.ts +6 -0
  439. package/dist/src/utils/{flashFallback.integration.test.js → flashFallback.test.js} +31 -27
  440. package/dist/src/utils/flashFallback.test.js.map +1 -0
  441. package/dist/src/utils/geminiIgnoreParser.d.ts +18 -0
  442. package/dist/src/utils/geminiIgnoreParser.js +61 -0
  443. package/dist/src/utils/geminiIgnoreParser.js.map +1 -0
  444. package/dist/src/utils/geminiIgnoreParser.test.d.ts +6 -0
  445. package/dist/src/utils/geminiIgnoreParser.test.js +50 -0
  446. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -0
  447. package/dist/src/utils/gitIgnoreParser.d.ts +3 -7
  448. package/dist/src/utils/gitIgnoreParser.js +125 -34
  449. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  450. package/dist/src/utils/gitIgnoreParser.test.js +66 -35
  451. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  452. package/dist/src/utils/llm-edit-fixer.d.ts +26 -0
  453. package/dist/src/utils/llm-edit-fixer.js +121 -0
  454. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  455. package/dist/src/utils/llm-edit-fixer.test.d.ts +6 -0
  456. package/dist/src/utils/llm-edit-fixer.test.js +105 -0
  457. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -0
  458. package/dist/src/utils/memoryDiscovery.d.ts +5 -4
  459. package/dist/src/utils/memoryDiscovery.js +10 -9
  460. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  461. package/dist/src/utils/memoryDiscovery.test.js +50 -25
  462. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  463. package/dist/src/utils/nextSpeakerChecker.d.ts +2 -2
  464. package/dist/src/utils/nextSpeakerChecker.js +8 -2
  465. package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
  466. package/dist/src/utils/nextSpeakerChecker.test.js +75 -64
  467. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  468. package/dist/src/utils/promptIdContext.d.ts +7 -0
  469. package/dist/src/utils/promptIdContext.js +8 -0
  470. package/dist/src/utils/promptIdContext.js.map +1 -0
  471. package/dist/src/utils/shell-utils.d.ts +5 -0
  472. package/dist/src/utils/shell-utils.js +23 -0
  473. package/dist/src/utils/shell-utils.js.map +1 -1
  474. package/dist/src/utils/terminalSerializer.d.ts +28 -0
  475. package/dist/src/utils/terminalSerializer.js +432 -0
  476. package/dist/src/utils/terminalSerializer.js.map +1 -0
  477. package/dist/src/utils/terminalSerializer.test.d.ts +6 -0
  478. package/dist/src/utils/terminalSerializer.test.js +176 -0
  479. package/dist/src/utils/terminalSerializer.test.js.map +1 -0
  480. package/dist/src/utils/textUtils.d.ts +5 -0
  481. package/dist/src/utils/textUtils.js +14 -0
  482. package/dist/src/utils/textUtils.js.map +1 -1
  483. package/dist/src/utils/textUtils.test.d.ts +6 -0
  484. package/dist/src/utils/textUtils.test.js +59 -0
  485. package/dist/src/utils/textUtils.test.js.map +1 -0
  486. package/dist/tsconfig.tsbuildinfo +1 -1
  487. package/package.json +9 -3
  488. package/dist/google-gemini-cli-core-0.3.0-preview.3.tgz +0 -0
  489. package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
  490. /package/dist/src/{utils/flashFallback.integration.test.d.ts → code_assist/oauth-credential-storage.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseLlmClient.test.js","sourceRoot":"","sources":["../../../src/core/baseLlmClient.test.ts"],"names":[],"mappings":"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"}
@@ -7,24 +7,26 @@ import type { GenerateContentConfig, PartListUnion, Content, GenerateContentResp
7
7
  import type { ServerGeminiStreamEvent, ChatCompressionInfo } from './turn.js';
8
8
  import { Turn } from './turn.js';
9
9
  import type { Config } from '../config/config.js';
10
- import type { UserTierId } from '../code_assist/types.js';
11
10
  import { GeminiChat } from './geminiChat.js';
12
- import type { ContentGenerator, ContentGeneratorConfig } from './contentGenerator.js';
11
+ import type { ChatRecordingService } from '../services/chatRecordingService.js';
12
+ import { LoopDetectionService } from '../services/loopDetectionService.js';
13
+ export declare function isThinkingSupported(model: string): boolean;
14
+ export declare function isThinkingDefault(model: string): boolean;
13
15
  /**
14
- * Returns the index of the content after the fraction of the total characters in the history.
16
+ * Returns the index of the oldest item to keep when compressing. May return
17
+ * contents.length which indicates that everything should be compressed.
15
18
  *
16
19
  * Exported for testing purposes.
17
20
  */
18
- export declare function findIndexAfterFraction(history: Content[], fraction: number): number;
21
+ export declare function findCompressSplitPoint(contents: Content[], fraction: number): number;
19
22
  export declare class GeminiClient {
20
23
  private readonly config;
21
24
  private chat?;
22
- private contentGenerator?;
23
- private readonly embeddingModel;
24
25
  private readonly generateContentConfig;
25
26
  private sessionTurnCount;
26
27
  private readonly loopDetector;
27
28
  private lastPromptId;
29
+ private currentSequenceModel;
28
30
  private lastSentIdeContext;
29
31
  private forceFullIdeContext;
30
32
  /**
@@ -33,31 +35,24 @@ export declare class GeminiClient {
33
35
  */
34
36
  private hasFailedCompressionAttempt;
35
37
  constructor(config: Config);
36
- initialize(contentGeneratorConfig: ContentGeneratorConfig): Promise<void>;
37
- getContentGenerator(): ContentGenerator;
38
- getUserTier(): UserTierId | undefined;
38
+ initialize(): Promise<void>;
39
+ private getContentGeneratorOrFail;
39
40
  addHistory(content: Content): Promise<void>;
40
41
  getChat(): GeminiChat;
41
42
  isInitialized(): boolean;
42
43
  getHistory(): Content[];
43
- setHistory(history: Content[], { stripThoughts }?: {
44
- stripThoughts?: boolean;
45
- }): void;
44
+ stripThoughtsFromHistory(): void;
45
+ setHistory(history: Content[]): void;
46
46
  setTools(): Promise<void>;
47
47
  resetChat(): Promise<void>;
48
+ getChatRecordingService(): ChatRecordingService | undefined;
49
+ getLoopDetectionService(): LoopDetectionService;
48
50
  addDirectoryContext(): Promise<void>;
49
51
  startChat(extraHistory?: Content[]): Promise<GeminiChat>;
50
52
  private getIdeContextParts;
51
- sendMessageStream(request: PartListUnion, signal: AbortSignal, prompt_id: string, turns?: number, originalModel?: string): AsyncGenerator<ServerGeminiStreamEvent, Turn>;
52
- generateJson(contents: Content[], schema: Record<string, unknown>, abortSignal: AbortSignal, model?: string, config?: GenerateContentConfig): Promise<Record<string, unknown>>;
53
- generateContent(contents: Content[], generationConfig: GenerateContentConfig, abortSignal: AbortSignal, model?: string): Promise<GenerateContentResponse>;
54
- generateEmbedding(texts: string[]): Promise<number[][]>;
53
+ sendMessageStream(request: PartListUnion, signal: AbortSignal, prompt_id: string, turns?: number): AsyncGenerator<ServerGeminiStreamEvent, Turn>;
54
+ generateContent(contents: Content[], generationConfig: GenerateContentConfig, abortSignal: AbortSignal, model: string): Promise<GenerateContentResponse>;
55
55
  tryCompressChat(prompt_id: string, force?: boolean): Promise<ChatCompressionInfo>;
56
- /**
57
- * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
58
- * Uses a fallback handler if provided by the config; otherwise, returns null.
59
- */
60
- private handleFlashFallback;
61
56
  }
62
57
  export declare const TEST_ONLY: {
63
58
  COMPRESSION_PRESERVE_THRESHOLD: number;
@@ -13,40 +13,58 @@ import { reportError } from '../utils/errorReporting.js';
13
13
  import { GeminiChat } from './geminiChat.js';
14
14
  import { retryWithBackoff } from '../utils/retry.js';
15
15
  import { getErrorMessage } from '../utils/errors.js';
16
- import { isFunctionResponse } from '../utils/messageInspectors.js';
17
16
  import { tokenLimit } from './tokenLimits.js';
18
- import { AuthType, createContentGenerator } from './contentGenerator.js';
19
- import { ProxyAgent, setGlobalDispatcher } from 'undici';
20
- 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';
21
18
  import { LoopDetectionService } from '../services/loopDetectionService.js';
22
- import { ideContext } from '../ide/ideContext.js';
23
- import { logChatCompression, logNextSpeakerCheck, logMalformedJsonResponse, } from '../telemetry/loggers.js';
24
- import { makeChatCompressionEvent, MalformedJsonResponseEvent, NextSpeakerCheckEvent, } from '../telemetry/types.js';
25
- function isThinkingSupported(model) {
26
- if (model.startsWith('gemini-2.5'))
27
- return true;
28
- return false;
19
+ import { ideContextStore } from '../ide/ideContext.js';
20
+ import { logChatCompression, logNextSpeakerCheck, } from '../telemetry/loggers.js';
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;
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
+ cumulativeCharCount += charCounts[i];
50
+ const content = contents[i];
51
+ if (content.role === 'user' &&
52
+ !content.parts?.some((part) => !!part.functionResponse)) {
53
+ if (cumulativeCharCount >= targetCharCount) {
54
+ return i;
55
+ }
56
+ lastSplitPoint = i;
47
57
  }
48
58
  }
49
- return contentLengths.length;
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;
65
+ }
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,6 +87,7 @@ export class GeminiClient {
71
87
  sessionTurnCount = 0;
72
88
  loopDetector;
73
89
  lastPromptId;
90
+ currentSequenceModel = null;
74
91
  lastSentIdeContext;
75
92
  forceFullIdeContext = true;
76
93
  /**
@@ -80,25 +97,17 @@ export class GeminiClient {
80
97
  hasFailedCompressionAttempt = false;
81
98
  constructor(config) {
82
99
  this.config = config;
83
- if (config.getProxy()) {
84
- setGlobalDispatcher(new ProxyAgent(config.getProxy()));
85
- }
86
- this.embeddingModel = config.getEmbeddingModel();
87
100
  this.loopDetector = new LoopDetectionService(config);
88
101
  this.lastPromptId = this.config.getSessionId();
89
102
  }
90
- async initialize(contentGeneratorConfig) {
91
- this.contentGenerator = await createContentGenerator(contentGeneratorConfig, this.config, this.config.getSessionId());
103
+ async initialize() {
92
104
  this.chat = await this.startChat();
93
105
  }
94
- getContentGenerator() {
95
- if (!this.contentGenerator) {
106
+ getContentGeneratorOrFail() {
107
+ if (!this.config.getContentGenerator()) {
96
108
  throw new Error('Content generator not initialized');
97
109
  }
98
- return this.contentGenerator;
99
- }
100
- getUserTier() {
101
- return this.contentGenerator?.userTier;
110
+ return this.config.getContentGenerator();
102
111
  }
103
112
  async addHistory(content) {
104
113
  this.getChat().addHistory(content);
@@ -110,32 +119,16 @@ export class GeminiClient {
110
119
  return this.chat;
111
120
  }
112
121
  isInitialized() {
113
- return this.chat !== undefined && this.contentGenerator !== undefined;
122
+ return this.chat !== undefined;
114
123
  }
115
124
  getHistory() {
116
125
  return this.getChat().getHistory();
117
126
  }
118
- setHistory(history, { stripThoughts = false } = {}) {
119
- const historyToSet = stripThoughts
120
- ? history.map((content) => {
121
- const newContent = { ...content };
122
- if (newContent.parts) {
123
- newContent.parts = newContent.parts.map((part) => {
124
- if (part &&
125
- typeof part === 'object' &&
126
- 'thoughtSignature' in part) {
127
- const newPart = { ...part };
128
- delete newPart
129
- .thoughtSignature;
130
- return newPart;
131
- }
132
- return part;
133
- });
134
- }
135
- return newContent;
136
- })
137
- : history;
138
- this.getChat().setHistory(historyToSet);
127
+ stripThoughtsFromHistory() {
128
+ this.getChat().stripThoughtsFromHistory();
129
+ }
130
+ setHistory(history) {
131
+ this.getChat().setHistory(history);
139
132
  this.forceFullIdeContext = true;
140
133
  }
141
134
  async setTools() {
@@ -147,6 +140,12 @@ export class GeminiClient {
147
140
  async resetChat() {
148
141
  this.chat = await this.startChat();
149
142
  }
143
+ getChatRecordingService() {
144
+ return this.chat?.getChatRecordingService();
145
+ }
146
+ getLoopDetectionService() {
147
+ return this.loopDetector;
148
+ }
150
149
  async addDirectoryContext() {
151
150
  if (!this.chat) {
152
151
  return;
@@ -177,18 +176,17 @@ export class GeminiClient {
177
176
  try {
178
177
  const userMemory = this.config.getUserMemory();
179
178
  const systemInstruction = getCoreSystemPrompt(userMemory);
180
- const generateContentConfigWithThinking = isThinkingSupported(this.config.getModel())
181
- ? {
182
- ...this.generateContentConfig,
183
- thinkingConfig: {
184
- thinkingBudget: -1,
185
- includeThoughts: true,
186
- },
187
- }
188
- : this.generateContentConfig;
189
- 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, {
190
188
  systemInstruction,
191
- ...generateContentConfigWithThinking,
189
+ ...config,
192
190
  tools,
193
191
  }, history);
194
192
  }
@@ -198,7 +196,7 @@ export class GeminiClient {
198
196
  }
199
197
  }
200
198
  getIdeContextParts(forceFullContext) {
201
- const currentIdeContext = ideContext.getIdeContext();
199
+ const currentIdeContext = ideContextStore.get();
202
200
  if (!currentIdeContext) {
203
201
  return { contextParts: [], newIdeContext: undefined };
204
202
  }
@@ -336,10 +334,11 @@ export class GeminiClient {
336
334
  };
337
335
  }
338
336
  }
339
- async *sendMessageStream(request, signal, prompt_id, turns = MAX_TURNS, originalModel) {
337
+ async *sendMessageStream(request, signal, prompt_id, turns = MAX_TURNS) {
340
338
  if (this.lastPromptId !== prompt_id) {
341
339
  this.loopDetector.reset(prompt_id);
342
340
  this.lastPromptId = prompt_id;
341
+ this.currentSequenceModel = null;
343
342
  }
344
343
  this.sessionTurnCount++;
345
344
  if (this.config.getMaxSessionTurns() > 0 &&
@@ -352,9 +351,7 @@ export class GeminiClient {
352
351
  if (!boundedTurns) {
353
352
  return new Turn(this.getChat(), prompt_id);
354
353
  }
355
- // Track the original model from the first call to detect model switching
356
- const initialModel = originalModel || this.config.getModel();
357
- const compressed = await this.tryCompressChat(prompt_id);
354
+ const compressed = await this.tryCompressChat(prompt_id, false);
358
355
  if (compressed.compressionStatus === CompressionStatus.COMPRESSED) {
359
356
  yield { type: GeminiEventType.ChatCompressed, value: compressed };
360
357
  }
@@ -380,15 +377,35 @@ export class GeminiClient {
380
377
  this.forceFullIdeContext = false;
381
378
  }
382
379
  const turn = new Turn(this.getChat(), prompt_id);
380
+ const controller = new AbortController();
381
+ const linkedSignal = AbortSignal.any([signal, controller.signal]);
383
382
  const loopDetected = await this.loopDetector.turnStarted(signal);
384
383
  if (loopDetected) {
385
384
  yield { type: GeminiEventType.LoopDetected };
386
385
  return turn;
387
386
  }
388
- 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);
389
405
  for await (const event of resultStream) {
390
406
  if (this.loopDetector.addAndCheck(event)) {
391
407
  yield { type: GeminiEventType.LoopDetected };
408
+ controller.abort();
392
409
  return turn;
393
410
  }
394
411
  yield event;
@@ -397,92 +414,26 @@ export class GeminiClient {
397
414
  }
398
415
  }
399
416
  if (!turn.pendingToolCalls.length && signal && !signal.aborted) {
400
- // Check if model was switched during the call (likely due to quota error)
401
- const currentModel = this.config.getModel();
402
- if (currentModel !== initialModel) {
403
- // Model was switched (likely due to quota error fallback)
404
- // Don't continue with recursive call to prevent unwanted Flash execution
417
+ // Check if next speaker check is needed
418
+ if (this.config.getQuotaErrorOccurred()) {
405
419
  return turn;
406
420
  }
407
421
  if (this.config.getSkipNextSpeakerCheck()) {
408
422
  return turn;
409
423
  }
410
- const nextSpeakerCheck = await checkNextSpeaker(this.getChat(), this, signal);
424
+ const nextSpeakerCheck = await checkNextSpeaker(this.getChat(), this.config.getBaseLlmClient(), signal, prompt_id);
411
425
  logNextSpeakerCheck(this.config, new NextSpeakerCheckEvent(prompt_id, turn.finishReason?.toString() || '', nextSpeakerCheck?.next_speaker || ''));
412
426
  if (nextSpeakerCheck?.next_speaker === 'model') {
413
427
  const nextRequest = [{ text: 'Please continue.' }];
414
428
  // This recursive call's events will be yielded out, but the final
415
429
  // turn object will be from the top-level call.
416
- yield* this.sendMessageStream(nextRequest, signal, prompt_id, boundedTurns - 1, initialModel);
430
+ yield* this.sendMessageStream(nextRequest, signal, prompt_id, boundedTurns - 1);
417
431
  }
418
432
  }
419
433
  return turn;
420
434
  }
421
- async generateJson(contents, schema, abortSignal, model, config = {}) {
422
- // Use current model from config instead of hardcoded Flash model
423
- const modelToUse = model || this.config.getModel() || DEFAULT_GEMINI_FLASH_MODEL;
424
- try {
425
- const userMemory = this.config.getUserMemory();
426
- const systemInstruction = getCoreSystemPrompt(userMemory);
427
- const requestConfig = {
428
- abortSignal,
429
- ...this.generateContentConfig,
430
- ...config,
431
- };
432
- const apiCall = () => this.getContentGenerator().generateContent({
433
- model: modelToUse,
434
- config: {
435
- ...requestConfig,
436
- systemInstruction,
437
- responseJsonSchema: schema,
438
- responseMimeType: 'application/json',
439
- },
440
- contents,
441
- }, this.lastPromptId);
442
- const result = await retryWithBackoff(apiCall, {
443
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
444
- authType: this.config.getContentGeneratorConfig()?.authType,
445
- });
446
- let text = getResponseText(result);
447
- if (!text) {
448
- const error = new Error('API returned an empty response for generateJson.');
449
- await reportError(error, 'Error in generateJson: API returned an empty response.', contents, 'generateJson-empty-response');
450
- throw error;
451
- }
452
- const prefix = '```json';
453
- const suffix = '```';
454
- if (text.startsWith(prefix) && text.endsWith(suffix)) {
455
- logMalformedJsonResponse(this.config, new MalformedJsonResponseEvent(modelToUse));
456
- text = text
457
- .substring(prefix.length, text.length - suffix.length)
458
- .trim();
459
- }
460
- try {
461
- return JSON.parse(text);
462
- }
463
- catch (parseError) {
464
- await reportError(parseError, 'Failed to parse JSON response from generateJson.', {
465
- responseTextFailedToParse: text,
466
- originalRequestContents: contents,
467
- }, 'generateJson-parse');
468
- throw new Error(`Failed to parse API response as JSON: ${getErrorMessage(parseError)}`);
469
- }
470
- }
471
- catch (error) {
472
- if (abortSignal.aborted) {
473
- throw error;
474
- }
475
- // Avoid double reporting for the empty response case handled above
476
- if (error instanceof Error &&
477
- error.message === 'API returned an empty response for generateJson.') {
478
- throw error;
479
- }
480
- await reportError(error, 'Error generating JSON content via API.', contents, 'generateJson-api');
481
- throw new Error(`Failed to generate JSON content: ${getErrorMessage(error)}`);
482
- }
483
- }
484
435
  async generateContent(contents, generationConfig, abortSignal, model) {
485
- const modelToUse = model ?? this.config.getModel();
436
+ let currentAttemptModel = model;
486
437
  const configToUse = {
487
438
  ...this.generateContentConfig,
488
439
  ...generationConfig,
@@ -495,13 +446,22 @@ export class GeminiClient {
495
446
  ...configToUse,
496
447
  systemInstruction,
497
448
  };
498
- const apiCall = () => this.getContentGenerator().generateContent({
499
- model: modelToUse,
500
- config: requestConfig,
501
- contents,
502
- }, 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);
503
463
  const result = await retryWithBackoff(apiCall, {
504
- onPersistent429: async (authType, error) => await this.handleFlashFallback(authType, error),
464
+ onPersistent429: onPersistent429Callback,
505
465
  authType: this.config.getContentGeneratorConfig()?.authType,
506
466
  });
507
467
  return result;
@@ -510,38 +470,23 @@ export class GeminiClient {
510
470
  if (abortSignal.aborted) {
511
471
  throw error;
512
472
  }
513
- await reportError(error, `Error generating content via API with model ${modelToUse}.`, {
473
+ await reportError(error, `Error generating content via API with model ${currentAttemptModel}.`, {
514
474
  requestContents: contents,
515
475
  requestConfig: configToUse,
516
476
  }, 'generateContent-api');
517
- throw new Error(`Failed to generate content with model ${modelToUse}: ${getErrorMessage(error)}`);
477
+ throw new Error(`Failed to generate content with model ${currentAttemptModel}: ${getErrorMessage(error)}`);
518
478
  }
519
479
  }
520
- async generateEmbedding(texts) {
521
- if (!texts || texts.length === 0) {
522
- return [];
523
- }
524
- const embedModelParams = {
525
- model: this.embeddingModel,
526
- contents: texts,
527
- };
528
- const embedContentResponse = await this.getContentGenerator().embedContent(embedModelParams);
529
- if (!embedContentResponse.embeddings ||
530
- embedContentResponse.embeddings.length === 0) {
531
- throw new Error('No embeddings found in API response.');
532
- }
533
- if (embedContentResponse.embeddings.length !== texts.length) {
534
- throw new Error(`API returned a mismatched number of embeddings. Expected ${texts.length}, got ${embedContentResponse.embeddings.length}.`);
535
- }
536
- return embedContentResponse.embeddings.map((embedding, index) => {
537
- const values = embedding.values;
538
- if (!values || values.length === 0) {
539
- throw new Error(`API returned an empty embedding for input text at index ${index}: "${texts[index]}"`);
540
- }
541
- return values;
542
- });
543
- }
544
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);
545
490
  const curatedHistory = this.getChat().getHistory(true);
546
491
  // Regardless of `force`, don't do anything if the history is empty.
547
492
  if (curatedHistory.length === 0 ||
@@ -552,8 +497,7 @@ export class GeminiClient {
552
497
  compressionStatus: CompressionStatus.NOOP,
553
498
  };
554
499
  }
555
- const model = this.config.getModel();
556
- const { totalTokens: originalTokenCount } = await this.getContentGenerator().countTokens({
500
+ const { totalTokens: originalTokenCount } = await this.getContentGeneratorOrFail().countTokens({
557
501
  model,
558
502
  contents: curatedHistory,
559
503
  });
@@ -578,25 +522,29 @@ export class GeminiClient {
578
522
  };
579
523
  }
580
524
  }
581
- let compressBeforeIndex = findIndexAfterFraction(curatedHistory, 1 - COMPRESSION_PRESERVE_THRESHOLD);
582
- // Find the first user message after the index. This is the start of the next turn.
583
- while (compressBeforeIndex < curatedHistory.length &&
584
- (curatedHistory[compressBeforeIndex]?.role === 'model' ||
585
- isFunctionResponse(curatedHistory[compressBeforeIndex]))) {
586
- compressBeforeIndex++;
587
- }
588
- const historyToCompress = curatedHistory.slice(0, compressBeforeIndex);
589
- const historyToKeep = curatedHistory.slice(compressBeforeIndex);
590
- this.getChat().setHistory(historyToCompress);
591
- const { text: summary } = await this.getChat().sendMessage({
592
- message: {
593
- text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
594
- },
525
+ const splitPoint = findCompressSplitPoint(curatedHistory, 1 - COMPRESSION_PRESERVE_THRESHOLD);
526
+ const historyToCompress = curatedHistory.slice(0, splitPoint);
527
+ const historyToKeep = curatedHistory.slice(splitPoint);
528
+ const summaryResponse = await this.config
529
+ .getContentGenerator()
530
+ .generateContent({
531
+ model,
532
+ contents: [
533
+ ...historyToCompress,
534
+ {
535
+ role: 'user',
536
+ parts: [
537
+ {
538
+ text: 'First, reason in your scratchpad. Then, generate the <state_snapshot>.',
539
+ },
540
+ ],
541
+ },
542
+ ],
595
543
  config: {
596
544
  systemInstruction: { text: getCompressionPrompt() },
597
- maxOutputTokens: originalTokenCount,
598
545
  },
599
546
  }, prompt_id);
547
+ const summary = getResponseText(summaryResponse) ?? '';
600
548
  const chat = await this.startChat([
601
549
  {
602
550
  role: 'user',
@@ -609,7 +557,7 @@ export class GeminiClient {
609
557
  ...historyToKeep,
610
558
  ]);
611
559
  this.forceFullIdeContext = true;
612
- const { totalTokens: newTokenCount } = await this.getContentGenerator().countTokens({
560
+ const { totalTokens: newTokenCount } = await this.getContentGeneratorOrFail().countTokens({
613
561
  // model might change after calling `sendMessage`, so we get the newest value from config
614
562
  model: this.config.getModel(),
615
563
  contents: chat.getHistory(),
@@ -623,6 +571,7 @@ export class GeminiClient {
623
571
  compressionStatus: CompressionStatus.COMPRESSION_FAILED_TOKEN_COUNT_ERROR,
624
572
  };
625
573
  }
574
+ uiTelemetryService.setLastPromptTokenCount(newTokenCount);
626
575
  logChatCompression(this.config, makeChatCompressionEvent({
627
576
  tokens_before: originalTokenCount,
628
577
  tokens_after: newTokenCount,
@@ -645,42 +594,6 @@ export class GeminiClient {
645
594
  compressionStatus: CompressionStatus.COMPRESSED,
646
595
  };
647
596
  }
648
- /**
649
- * Handles falling back to Flash model when persistent 429 errors occur for OAuth users.
650
- * Uses a fallback handler if provided by the config; otherwise, returns null.
651
- */
652
- async handleFlashFallback(authType, error) {
653
- // Only handle fallback for OAuth users
654
- if (authType !== AuthType.LOGIN_WITH_GOOGLE) {
655
- return null;
656
- }
657
- const currentModel = this.config.getModel();
658
- const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
659
- // Don't fallback if already using Flash model
660
- if (currentModel === fallbackModel) {
661
- return null;
662
- }
663
- // Check if config has a fallback handler (set by CLI package)
664
- const fallbackHandler = this.config.flashFallbackHandler;
665
- if (typeof fallbackHandler === 'function') {
666
- try {
667
- const accepted = await fallbackHandler(currentModel, fallbackModel, error);
668
- if (accepted !== false && accepted !== null) {
669
- this.config.setModel(fallbackModel);
670
- this.config.setFallbackMode(true);
671
- return fallbackModel;
672
- }
673
- // Check if the model was switched manually in the handler
674
- if (this.config.getModel() === fallbackModel) {
675
- return null; // Model was switched but don't continue with current prompt
676
- }
677
- }
678
- catch (error) {
679
- console.warn('Flash fallback handler failed:', error);
680
- }
681
- }
682
- return null;
683
- }
684
597
  }
685
598
  export const TEST_ONLY = {
686
599
  COMPRESSION_PRESERVE_THRESHOLD,