@google/gemini-cli-core 0.21.1 → 0.22.0-preview.0

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 (273) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/agents/codebase-investigator.js +2 -2
  5. package/dist/src/agents/codebase-investigator.js.map +1 -1
  6. package/dist/src/agents/codebase-investigator.test.js +2 -2
  7. package/dist/src/agents/codebase-investigator.test.js.map +1 -1
  8. package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
  9. package/dist/src/agents/delegate-to-agent-tool.js +111 -0
  10. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
  11. package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
  12. package/dist/src/agents/delegate-to-agent-tool.test.js +133 -0
  13. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
  14. package/dist/src/agents/executor.js +1 -1
  15. package/dist/src/agents/executor.js.map +1 -1
  16. package/dist/src/agents/executor.test.js.map +1 -1
  17. package/dist/src/agents/registry.d.ts +15 -0
  18. package/dist/src/agents/registry.js +49 -17
  19. package/dist/src/agents/registry.js.map +1 -1
  20. package/dist/src/agents/registry.test.js +22 -33
  21. package/dist/src/agents/registry.test.js.map +1 -1
  22. package/dist/src/availability/policyCatalog.d.ts +0 -1
  23. package/dist/src/availability/policyCatalog.js +8 -6
  24. package/dist/src/availability/policyCatalog.js.map +1 -1
  25. package/dist/src/availability/policyCatalog.test.js +2 -2
  26. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  27. package/dist/src/availability/policyHelpers.d.ts +2 -5
  28. package/dist/src/availability/policyHelpers.js +17 -30
  29. package/dist/src/availability/policyHelpers.js.map +1 -1
  30. package/dist/src/availability/policyHelpers.test.js +2 -30
  31. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  32. package/dist/src/code_assist/experiments/client_metadata.js +2 -1
  33. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
  34. package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
  35. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
  36. package/dist/src/commands/init.d.ts +7 -0
  37. package/dist/src/commands/init.js +53 -0
  38. package/dist/src/commands/init.js.map +1 -0
  39. package/dist/src/commands/init.test.d.ts +6 -0
  40. package/dist/src/commands/init.test.js +25 -0
  41. package/dist/src/commands/init.test.js.map +1 -0
  42. package/dist/src/config/config.d.ts +0 -5
  43. package/dist/src/config/config.js +30 -69
  44. package/dist/src/config/config.js.map +1 -1
  45. package/dist/src/config/config.test.js +36 -123
  46. package/dist/src/config/config.test.js.map +1 -1
  47. package/dist/src/config/defaultModelConfigs.js +10 -11
  48. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  49. package/dist/src/config/models.d.ts +17 -22
  50. package/dist/src/config/models.js +32 -64
  51. package/dist/src/config/models.js.map +1 -1
  52. package/dist/src/config/models.test.js +89 -57
  53. package/dist/src/config/models.test.js.map +1 -1
  54. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  55. package/dist/src/confirmation-bus/types.d.ts +4 -0
  56. package/dist/src/core/baseLlmClient.d.ts +1 -3
  57. package/dist/src/core/baseLlmClient.js +1 -8
  58. package/dist/src/core/baseLlmClient.js.map +1 -1
  59. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  60. package/dist/src/core/client.js +3 -4
  61. package/dist/src/core/client.js.map +1 -1
  62. package/dist/src/core/client.test.js +1 -3
  63. package/dist/src/core/client.test.js.map +1 -1
  64. package/dist/src/core/contentGenerator.js +5 -3
  65. package/dist/src/core/contentGenerator.js.map +1 -1
  66. package/dist/src/core/contentGenerator.test.js +29 -2
  67. package/dist/src/core/contentGenerator.test.js.map +1 -1
  68. package/dist/src/core/coreToolScheduler.d.ts +1 -1
  69. package/dist/src/core/coreToolScheduler.js +72 -34
  70. package/dist/src/core/coreToolScheduler.js.map +1 -1
  71. package/dist/src/core/coreToolScheduler.test.js +134 -37
  72. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  73. package/dist/src/core/geminiChat.js +23 -16
  74. package/dist/src/core/geminiChat.js.map +1 -1
  75. package/dist/src/core/geminiChat.test.js +186 -40
  76. package/dist/src/core/geminiChat.test.js.map +1 -1
  77. package/dist/src/core/geminiChat_network_retry.test.js +0 -2
  78. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  79. package/dist/src/core/logger.js.map +1 -1
  80. package/dist/src/core/nonInteractiveToolExecutor.test.js +4 -5
  81. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  82. package/dist/src/core/prompts.js +15 -12
  83. package/dist/src/core/prompts.js.map +1 -1
  84. package/dist/src/core/prompts.test.js +14 -13
  85. package/dist/src/core/prompts.test.js.map +1 -1
  86. package/dist/src/core/turn.js +1 -1
  87. package/dist/src/core/turn.js.map +1 -1
  88. package/dist/src/fallback/handler.js +121 -54
  89. package/dist/src/fallback/handler.js.map +1 -1
  90. package/dist/src/fallback/handler.test.js +266 -82
  91. package/dist/src/fallback/handler.test.js.map +1 -1
  92. package/dist/src/generated/git-commit.d.ts +2 -2
  93. package/dist/src/generated/git-commit.js +2 -2
  94. package/dist/src/generated/git-commit.js.map +1 -1
  95. package/dist/src/hooks/hookEventHandler.js +6 -1
  96. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  97. package/dist/src/hooks/hookEventHandler.test.js +8 -1
  98. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  99. package/dist/src/hooks/hookRegistry.d.ts +0 -7
  100. package/dist/src/hooks/hookRegistry.js +0 -20
  101. package/dist/src/hooks/hookRegistry.js.map +1 -1
  102. package/dist/src/hooks/hookRegistry.test.js +1 -7
  103. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  104. package/dist/src/hooks/hookRunner.test.js +1 -1
  105. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  106. package/dist/src/hooks/hookSystem.d.ts +0 -8
  107. package/dist/src/hooks/hookSystem.js +0 -18
  108. package/dist/src/hooks/hookSystem.js.map +1 -1
  109. package/dist/src/hooks/hookSystem.test.js +2 -21
  110. package/dist/src/hooks/hookSystem.test.js.map +1 -1
  111. package/dist/src/ide/detect-ide.test.js +32 -1
  112. package/dist/src/ide/detect-ide.test.js.map +1 -1
  113. package/dist/src/ide/ide-installer.test.js +1 -1
  114. package/dist/src/ide/ide-installer.test.js.map +1 -1
  115. package/dist/src/index.d.ts +3 -0
  116. package/dist/src/index.js +3 -0
  117. package/dist/src/index.js.map +1 -1
  118. package/dist/src/mcp/oauth-provider.js.map +1 -1
  119. package/dist/src/output/json-formatter.test.js +2 -0
  120. package/dist/src/output/json-formatter.test.js.map +1 -1
  121. package/dist/src/output/stream-json-formatter.js +6 -0
  122. package/dist/src/output/stream-json-formatter.js.map +1 -1
  123. package/dist/src/output/stream-json-formatter.test.js +98 -100
  124. package/dist/src/output/stream-json-formatter.test.js.map +1 -1
  125. package/dist/src/output/types.d.ts +2 -0
  126. package/dist/src/policy/config.js +71 -2
  127. package/dist/src/policy/config.js.map +1 -1
  128. package/dist/src/policy/persistence.test.d.ts +6 -0
  129. package/dist/src/policy/persistence.test.js +149 -0
  130. package/dist/src/policy/persistence.test.js.map +1 -0
  131. package/dist/src/policy/policies/agent.toml +31 -0
  132. package/dist/src/policy/policy-engine.js +55 -1
  133. package/dist/src/policy/policy-engine.js.map +1 -1
  134. package/dist/src/policy/shell-safety.test.d.ts +6 -0
  135. package/dist/src/policy/shell-safety.test.js +74 -0
  136. package/dist/src/policy/shell-safety.test.js.map +1 -0
  137. package/dist/src/policy/toml-loader.d.ts +8 -0
  138. package/dist/src/policy/toml-loader.js +3 -3
  139. package/dist/src/policy/toml-loader.js.map +1 -1
  140. package/dist/src/routing/modelRouterService.js +15 -0
  141. package/dist/src/routing/modelRouterService.js.map +1 -1
  142. package/dist/src/routing/modelRouterService.test.js +62 -0
  143. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  144. package/dist/src/routing/strategies/classifierStrategy.js +21 -10
  145. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  146. package/dist/src/routing/strategies/classifierStrategy.test.js +1 -2
  147. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  148. package/dist/src/routing/strategies/fallbackStrategy.js +12 -23
  149. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  150. package/dist/src/routing/strategies/fallbackStrategy.test.js +39 -69
  151. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  152. package/dist/src/routing/strategies/overrideStrategy.js +3 -4
  153. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  154. package/dist/src/safety/checker-runner.js +17 -6
  155. package/dist/src/safety/checker-runner.js.map +1 -1
  156. package/dist/src/services/chatCompressionService.js +1 -3
  157. package/dist/src/services/chatCompressionService.js.map +1 -1
  158. package/dist/src/services/chatRecordingService.d.ts +5 -0
  159. package/dist/src/services/chatRecordingService.js +7 -0
  160. package/dist/src/services/chatRecordingService.js.map +1 -1
  161. package/dist/src/services/fileSystemService.d.ts +0 -9
  162. package/dist/src/services/fileSystemService.js +0 -11
  163. package/dist/src/services/fileSystemService.js.map +1 -1
  164. package/dist/src/services/loopDetectionService.js +2 -2
  165. package/dist/src/services/loopDetectionService.js.map +1 -1
  166. package/dist/src/services/modelConfig.golden.test.js +32 -0
  167. package/dist/src/services/modelConfig.golden.test.js.map +1 -1
  168. package/dist/src/services/modelConfigService.d.ts +3 -0
  169. package/dist/src/services/modelConfigService.js +3 -2
  170. package/dist/src/services/modelConfigService.js.map +1 -1
  171. package/dist/src/services/modelConfigService.test.js +110 -0
  172. package/dist/src/services/modelConfigService.test.js.map +1 -1
  173. package/dist/src/services/shellExecutionService.js +1 -2
  174. package/dist/src/services/shellExecutionService.js.map +1 -1
  175. package/dist/src/services/shellExecutionService.test.js +6 -3
  176. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  177. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +222 -0
  178. package/dist/src/services/test-data/resolved-aliases.golden.json +0 -16
  179. package/dist/src/telemetry/activity-detector.test.js.map +1 -1
  180. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -5
  181. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  182. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +18 -1
  183. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  184. package/dist/src/telemetry/config.js.map +1 -1
  185. package/dist/src/telemetry/loggers.test.js +5 -5
  186. package/dist/src/telemetry/loggers.test.js.map +1 -1
  187. package/dist/src/telemetry/metrics.test.js.map +1 -1
  188. package/dist/src/telemetry/startupProfiler.test.js +1 -2
  189. package/dist/src/telemetry/startupProfiler.test.js.map +1 -1
  190. package/dist/src/telemetry/trace.js.map +1 -1
  191. package/dist/src/telemetry/types.d.ts +10 -5
  192. package/dist/src/telemetry/types.js +16 -8
  193. package/dist/src/telemetry/types.js.map +1 -1
  194. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  195. package/dist/src/telemetry/uiTelemetry.js +2 -0
  196. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  197. package/dist/src/telemetry/uiTelemetry.test.js +4 -0
  198. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  199. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  200. package/dist/src/tools/edit.js +1 -0
  201. package/dist/src/tools/edit.js.map +1 -1
  202. package/dist/src/tools/edit.test.js.map +1 -1
  203. package/dist/src/tools/grep.js.map +1 -1
  204. package/dist/src/tools/mcp-tool.js +13 -0
  205. package/dist/src/tools/mcp-tool.js.map +1 -1
  206. package/dist/src/tools/mcp-tool.test.js +25 -0
  207. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  208. package/dist/src/tools/memoryTool.js +1 -0
  209. package/dist/src/tools/memoryTool.js.map +1 -1
  210. package/dist/src/tools/modifiable-tool.js.map +1 -1
  211. package/dist/src/tools/read-file.test.js.map +1 -1
  212. package/dist/src/tools/shell.d.ts +2 -1
  213. package/dist/src/tools/shell.js +9 -1
  214. package/dist/src/tools/shell.js.map +1 -1
  215. package/dist/src/tools/shell.test.js +2 -1
  216. package/dist/src/tools/shell.test.js.map +1 -1
  217. package/dist/src/tools/smart-edit.js +1 -0
  218. package/dist/src/tools/smart-edit.js.map +1 -1
  219. package/dist/src/tools/smart-edit.test.js.map +1 -1
  220. package/dist/src/tools/tool-names.d.ts +1 -0
  221. package/dist/src/tools/tool-names.js +1 -0
  222. package/dist/src/tools/tool-names.js.map +1 -1
  223. package/dist/src/tools/tools.d.ts +19 -0
  224. package/dist/src/tools/tools.js +28 -9
  225. package/dist/src/tools/tools.js.map +1 -1
  226. package/dist/src/tools/web-fetch.js +1 -0
  227. package/dist/src/tools/web-fetch.js.map +1 -1
  228. package/dist/src/tools/write-file.js +1 -0
  229. package/dist/src/tools/write-file.js.map +1 -1
  230. package/dist/src/tools/write-file.test.js.map +1 -1
  231. package/dist/src/utils/bfsFileSearch.d.ts +8 -0
  232. package/dist/src/utils/bfsFileSearch.js +63 -23
  233. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  234. package/dist/src/utils/bfsFileSearch.test.js +65 -1
  235. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  236. package/dist/src/utils/checkpointUtils.js.map +1 -1
  237. package/dist/src/utils/extensionLoader.d.ts +2 -2
  238. package/dist/src/utils/extensionLoader.js +5 -6
  239. package/dist/src/utils/extensionLoader.js.map +1 -1
  240. package/dist/src/utils/extensionLoader.test.js +11 -0
  241. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  242. package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
  243. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  244. package/dist/src/utils/flashFallback.test.js +1 -1
  245. package/dist/src/utils/flashFallback.test.js.map +1 -1
  246. package/dist/src/utils/pathCorrector.js +12 -2
  247. package/dist/src/utils/pathCorrector.js.map +1 -1
  248. package/dist/src/utils/pathCorrector.test.js +6 -2
  249. package/dist/src/utils/pathCorrector.test.js.map +1 -1
  250. package/dist/src/utils/retry.js +16 -2
  251. package/dist/src/utils/retry.js.map +1 -1
  252. package/dist/src/utils/retry.test.js +22 -7
  253. package/dist/src/utils/retry.test.js.map +1 -1
  254. package/dist/src/utils/shell-permissions.d.ts +52 -0
  255. package/dist/src/utils/shell-permissions.js +188 -0
  256. package/dist/src/utils/shell-permissions.js.map +1 -0
  257. package/dist/src/utils/shell-permissions.test.d.ts +6 -0
  258. package/dist/src/utils/shell-permissions.test.js +342 -0
  259. package/dist/src/utils/shell-permissions.test.js.map +1 -0
  260. package/dist/src/utils/shell-utils.d.ts +10 -47
  261. package/dist/src/utils/shell-utils.js +1 -182
  262. package/dist/src/utils/shell-utils.js.map +1 -1
  263. package/dist/src/utils/shell-utils.test.js +1 -288
  264. package/dist/src/utils/shell-utils.test.js.map +1 -1
  265. package/dist/src/utils/tool-utils.js.map +1 -1
  266. package/dist/src/utils/version.d.ts +6 -0
  267. package/dist/src/utils/version.js +15 -0
  268. package/dist/src/utils/version.js.map +1 -0
  269. package/dist/src/utils/version.test.d.ts +6 -0
  270. package/dist/src/utils/version.test.js +39 -0
  271. package/dist/src/utils/version.test.js.map +1 -0
  272. package/dist/tsconfig.tsbuildinfo +1 -1
  273. package/package.json +2 -1
@@ -4,14 +4,64 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { AuthType } from '../core/contentGenerator.js';
7
+ import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
8
+ import { logFlashFallback, FlashFallbackEvent } from '../telemetry/index.js';
7
9
  import { openBrowserSecurely } from '../utils/secure-browser-launcher.js';
8
10
  import { debugLogger } from '../utils/debugLogger.js';
9
11
  import { getErrorMessage } from '../utils/errors.js';
12
+ import { ModelNotFoundError } from '../utils/httpErrors.js';
13
+ import { TerminalQuotaError } from '../utils/googleQuotaErrors.js';
14
+ import { coreEvents } from '../utils/events.js';
10
15
  import { classifyFailureKind } from '../availability/errorClassification.js';
11
- import { buildFallbackPolicyContext, resolvePolicyChain, resolvePolicyAction, applyAvailabilityTransition, } from '../availability/policyHelpers.js';
16
+ import { buildFallbackPolicyContext, resolvePolicyChain, resolvePolicyAction, } from '../availability/policyHelpers.js';
12
17
  const UPGRADE_URL_PAGE = 'https://goo.gle/set-up-gemini-code-assist';
13
18
  export async function handleFallback(config, failedModel, authType, error) {
14
- return handlePolicyDrivenFallback(config, failedModel, authType, error);
19
+ if (config.isModelAvailabilityServiceEnabled()) {
20
+ return handlePolicyDrivenFallback(config, failedModel, authType, error);
21
+ }
22
+ return legacyHandleFallback(config, failedModel, authType, error);
23
+ }
24
+ /**
25
+ * Old fallback logic relying on hard coded strings
26
+ */
27
+ async function legacyHandleFallback(config, failedModel, authType, error) {
28
+ if (authType !== AuthType.LOGIN_WITH_GOOGLE)
29
+ return null;
30
+ // Guardrail: If it's a ModelNotFoundError but NOT the preview model, do not handle it.
31
+ if (error instanceof ModelNotFoundError &&
32
+ failedModel !== PREVIEW_GEMINI_MODEL) {
33
+ return null;
34
+ }
35
+ const shouldActivatePreviewFallback = failedModel === PREVIEW_GEMINI_MODEL &&
36
+ !(error instanceof TerminalQuotaError);
37
+ // Preview Model Specific Logic
38
+ if (shouldActivatePreviewFallback) {
39
+ // Always set bypass mode for the immediate retry, for non-TerminalQuotaErrors.
40
+ // This ensures the next attempt uses 2.5 Pro.
41
+ config.setPreviewModelBypassMode(true);
42
+ // If we are already in Preview Model fallback mode (user previously said "Always"),
43
+ // we silently retry (which will use 2.5 Pro due to bypass mode).
44
+ if (config.isPreviewModelFallbackMode()) {
45
+ return true;
46
+ }
47
+ }
48
+ const fallbackModel = shouldActivatePreviewFallback
49
+ ? DEFAULT_GEMINI_MODEL
50
+ : DEFAULT_GEMINI_FLASH_MODEL;
51
+ // Consult UI Handler for Intent
52
+ const fallbackModelHandler = config.fallbackModelHandler;
53
+ if (typeof fallbackModelHandler !== 'function')
54
+ return null;
55
+ try {
56
+ // Pass the specific failed model to the UI handler.
57
+ const intent = await fallbackModelHandler(failedModel, fallbackModel, error);
58
+ // Process Intent and Update State
59
+ return await processIntent(config, intent, failedModel, fallbackModel, authType, error);
60
+ }
61
+ catch (handlerError) {
62
+ console.error('Fallback UI handler failed:', handlerError);
63
+ return null;
64
+ }
15
65
  }
16
66
  /**
17
67
  * New fallback logic using the ModelAvailabilityService
@@ -23,58 +73,39 @@ async function handlePolicyDrivenFallback(config, failedModel, authType, error)
23
73
  const chain = resolvePolicyChain(config);
24
74
  const { failedPolicy, candidates } = buildFallbackPolicyContext(chain, failedModel);
25
75
  const failureKind = classifyFailureKind(error);
26
- const availability = config.getModelAvailabilityService();
27
- const getAvailabilityContext = () => {
28
- if (!failedPolicy)
29
- return undefined;
30
- return { service: availability, policy: failedPolicy };
31
- };
32
- let fallbackModel;
33
76
  if (!candidates.length) {
34
- fallbackModel = failedModel;
35
- }
36
- else {
37
- const selection = availability.selectFirstAvailable(candidates.map((policy) => policy.model));
38
- const lastResortPolicy = candidates.find((policy) => policy.isLastResort);
39
- const selectedFallbackModel = selection.selectedModel ?? lastResortPolicy?.model;
40
- const selectedPolicy = candidates.find((policy) => policy.model === selectedFallbackModel);
41
- if (!selectedFallbackModel ||
42
- selectedFallbackModel === failedModel ||
43
- !selectedPolicy) {
44
- return null;
45
- }
46
- fallbackModel = selectedFallbackModel;
47
- // failureKind is already declared and calculated above
48
- const action = resolvePolicyAction(failureKind, selectedPolicy);
49
- if (action === 'silent') {
50
- applyAvailabilityTransition(getAvailabilityContext, failureKind);
51
- return processIntent(config, 'retry_always', fallbackModel);
52
- }
53
- // This will be used in the future when FallbackRecommendation is passed through UI
54
- const recommendation = {
55
- ...selection,
56
- selectedModel: fallbackModel,
57
- action,
58
- failureKind,
59
- failedPolicy,
60
- selectedPolicy,
61
- };
62
- void recommendation;
77
+ return null;
78
+ }
79
+ const availability = config.getModelAvailabilityService();
80
+ const selection = availability.selectFirstAvailable(candidates.map((policy) => policy.model));
81
+ const lastResortPolicy = candidates.find((policy) => policy.isLastResort);
82
+ const fallbackModel = selection.selectedModel ?? lastResortPolicy?.model;
83
+ const selectedPolicy = candidates.find((policy) => policy.model === fallbackModel);
84
+ if (!fallbackModel || fallbackModel === failedModel || !selectedPolicy) {
85
+ return null;
63
86
  }
87
+ // failureKind is already declared and calculated above
88
+ const action = resolvePolicyAction(failureKind, selectedPolicy);
89
+ if (action === 'silent') {
90
+ return processIntent(config, 'retry_always', failedModel, fallbackModel, authType, error);
91
+ }
92
+ // This will be used in the future when FallbackRecommendation is passed through UI
93
+ const recommendation = {
94
+ ...selection,
95
+ selectedModel: fallbackModel,
96
+ action,
97
+ failureKind,
98
+ failedPolicy,
99
+ selectedPolicy,
100
+ };
101
+ void recommendation;
64
102
  const handler = config.getFallbackModelHandler();
65
103
  if (typeof handler !== 'function') {
66
104
  return null;
67
105
  }
68
106
  try {
69
107
  const intent = await handler(failedModel, fallbackModel, error);
70
- // If the user chose to switch/retry, we apply the availability transition
71
- // to the failed model (e.g. marking it terminal if it had a quota error).
72
- // We DO NOT apply it if the user chose 'stop' or 'retry_later', allowing
73
- // them to try again later with the same model state.
74
- if (intent === 'retry_always' || intent === 'retry_once') {
75
- applyAvailabilityTransition(getAvailabilityContext, failureKind);
76
- }
77
- return await processIntent(config, intent, fallbackModel);
108
+ return await processIntent(config, intent, failedModel, fallbackModel, authType, error);
78
109
  }
79
110
  catch (handlerError) {
80
111
  debugLogger.error('Fallback handler failed:', handlerError);
@@ -89,20 +120,41 @@ async function handleUpgrade() {
89
120
  debugLogger.warn('Failed to open browser automatically:', getErrorMessage(error));
90
121
  }
91
122
  }
92
- async function processIntent(config, intent, fallbackModel) {
123
+ async function processIntent(config, intent, failedModel, fallbackModel, authType, error) {
124
+ const isAvailabilityEnabled = config.isModelAvailabilityServiceEnabled();
93
125
  switch (intent) {
94
126
  case 'retry_always':
95
- // TODO(telemetry): Implement generic fallback event logging. Existing
96
- // logFlashFallback is specific to a single Model.
97
- config.setActiveModel(fallbackModel);
127
+ if (isAvailabilityEnabled) {
128
+ // TODO(telemetry): Implement generic fallback event logging. Existing
129
+ // logFlashFallback is specific to a single Model.
130
+ config.setActiveModel(fallbackModel);
131
+ }
132
+ else {
133
+ // If the error is non-retryable, e.g. TerminalQuota Error, trigger a regular fallback to flash.
134
+ // For all other errors, activate previewModel fallback.
135
+ if (failedModel === PREVIEW_GEMINI_MODEL &&
136
+ !(error instanceof TerminalQuotaError)) {
137
+ activatePreviewModelFallbackMode(config);
138
+ }
139
+ else {
140
+ activateFallbackMode(config, authType);
141
+ }
142
+ }
98
143
  return true;
99
144
  case 'retry_once':
100
- // For distinct retry (retry_once), we do NOT set the active model permanently.
101
- // The FallbackStrategy will handle routing to the available model for this turn
102
- // based on the availability service state (which is updated before this).
145
+ if (isAvailabilityEnabled) {
146
+ config.setActiveModel(fallbackModel);
147
+ }
103
148
  return true;
104
149
  case 'stop':
105
- // Do not switch model on stop. User wants to stay on current model (and stop).
150
+ if (isAvailabilityEnabled) {
151
+ // TODO(telemetry): Implement generic fallback event logging. Existing
152
+ // logFlashFallback is specific to a single Model.
153
+ config.setActiveModel(fallbackModel);
154
+ }
155
+ else {
156
+ activateFallbackMode(config, authType);
157
+ }
106
158
  return false;
107
159
  case 'retry_later':
108
160
  return false;
@@ -113,4 +165,19 @@ async function processIntent(config, intent, fallbackModel) {
113
165
  throw new Error(`Unexpected fallback intent received from fallbackModelHandler: "${intent}"`);
114
166
  }
115
167
  }
168
+ function activateFallbackMode(config, authType) {
169
+ if (!config.isInFallbackMode()) {
170
+ config.setFallbackMode(true);
171
+ coreEvents.emitFallbackModeChanged(true);
172
+ if (authType) {
173
+ logFlashFallback(config, new FlashFallbackEvent(authType));
174
+ }
175
+ }
176
+ }
177
+ function activatePreviewModelFallbackMode(config) {
178
+ if (!config.isPreviewModelFallbackMode()) {
179
+ config.setPreviewModelFallbackMode(true);
180
+ // We might want a specific event for Preview Model fallback, but for now we just set the mode.
181
+ }
182
+ }
116
183
  //# sourceMappingURL=handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fallback/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/fallback/handler.ts"],"names":[],"mappings":"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"}