@google/gemini-cli 0.5.0-nightly.20250908.4693137b → 0.5.0-nightly.20250909.2b05cf3b

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 (70) hide show
  1. package/dist/google-gemini-cli-0.3.4.tgz +0 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/config/settings.js +2 -2
  4. package/dist/src/config/settings.js.map +1 -1
  5. package/dist/src/config/settingsSchema.d.ts +20 -4
  6. package/dist/src/config/settingsSchema.js +13 -1
  7. package/dist/src/config/settingsSchema.js.map +1 -1
  8. package/dist/src/config/settingsSchema.test.js +62 -55
  9. package/dist/src/config/settingsSchema.test.js.map +1 -1
  10. package/dist/src/gemini.js +4 -37
  11. package/dist/src/gemini.js.map +1 -1
  12. package/dist/src/generated/git-commit.d.ts +2 -2
  13. package/dist/src/generated/git-commit.js +2 -2
  14. package/dist/src/ui/AppContainer.js +40 -136
  15. package/dist/src/ui/AppContainer.js.map +1 -1
  16. package/dist/src/ui/AppContainer.test.js +199 -16
  17. package/dist/src/ui/AppContainer.test.js.map +1 -1
  18. package/dist/src/ui/components/AppHeader.js +5 -2
  19. package/dist/src/ui/components/AppHeader.js.map +1 -1
  20. package/dist/src/ui/components/Composer.js +2 -1
  21. package/dist/src/ui/components/Composer.js.map +1 -1
  22. package/dist/src/ui/components/ConfigInitDisplay.d.ts +6 -0
  23. package/dist/src/ui/components/ConfigInitDisplay.js +37 -0
  24. package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -0
  25. package/dist/src/ui/components/DialogManager.js +2 -3
  26. package/dist/src/ui/components/DialogManager.js.map +1 -1
  27. package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +5 -0
  28. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -1
  29. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  30. package/dist/src/ui/components/ProQuotaDialog.d.ts +2 -2
  31. package/dist/src/ui/components/ProQuotaDialog.js +2 -2
  32. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
  33. package/dist/src/ui/components/ProQuotaDialog.test.js +3 -3
  34. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
  35. package/dist/src/ui/components/SettingsDialog.js +20 -5
  36. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  37. package/dist/src/ui/components/SettingsDialog.test.js +144 -79
  38. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  39. package/dist/src/ui/components/ThemeDialog.js +10 -27
  40. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  41. package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
  42. package/dist/src/ui/components/ThemeDialog.test.js +65 -0
  43. package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
  44. package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
  45. package/dist/src/ui/components/shared/ScopeSelector.js +11 -0
  46. package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
  47. package/dist/src/ui/contexts/UIStateContext.d.ts +8 -2
  48. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  49. package/dist/src/ui/hooks/useFolderTrust.d.ts +1 -2
  50. package/dist/src/ui/hooks/useFolderTrust.js +21 -8
  51. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  52. package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
  53. package/dist/src/ui/hooks/useMessageQueue.js +5 -3
  54. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
  55. package/dist/src/ui/hooks/useMessageQueue.test.js +9 -0
  56. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
  57. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +21 -0
  58. package/dist/src/ui/hooks/useQuotaAndFallback.js +122 -0
  59. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -0
  60. package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +6 -0
  61. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +269 -0
  62. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -0
  63. package/dist/src/utils/settingsUtils.d.ts +16 -6
  64. package/dist/src/utils/settingsUtils.js +35 -25
  65. package/dist/src/utils/settingsUtils.js.map +1 -1
  66. package/dist/src/utils/settingsUtils.test.js +418 -156
  67. package/dist/src/utils/settingsUtils.test.js.map +1 -1
  68. package/dist/src/zed-integration/schema.d.ts +4 -4
  69. package/dist/tsconfig.tsbuildinfo +1 -1
  70. package/package.json +3 -3
@@ -19,6 +19,7 @@ describe('useMessageQueue', () => {
19
19
  });
20
20
  it('should initialize with empty queue', () => {
21
21
  const { result } = renderHook(() => useMessageQueue({
22
+ isConfigInitialized: true,
22
23
  streamingState: StreamingState.Idle,
23
24
  submitQuery: mockSubmitQuery,
24
25
  }));
@@ -27,6 +28,7 @@ describe('useMessageQueue', () => {
27
28
  });
28
29
  it('should add messages to queue', () => {
29
30
  const { result } = renderHook(() => useMessageQueue({
31
+ isConfigInitialized: true,
30
32
  streamingState: StreamingState.Responding,
31
33
  submitQuery: mockSubmitQuery,
32
34
  }));
@@ -41,6 +43,7 @@ describe('useMessageQueue', () => {
41
43
  });
42
44
  it('should filter out empty messages', () => {
43
45
  const { result } = renderHook(() => useMessageQueue({
46
+ isConfigInitialized: true,
44
47
  streamingState: StreamingState.Responding,
45
48
  submitQuery: mockSubmitQuery,
46
49
  }));
@@ -57,6 +60,7 @@ describe('useMessageQueue', () => {
57
60
  });
58
61
  it('should clear queue', () => {
59
62
  const { result } = renderHook(() => useMessageQueue({
63
+ isConfigInitialized: true,
60
64
  streamingState: StreamingState.Responding,
61
65
  submitQuery: mockSubmitQuery,
62
66
  }));
@@ -71,6 +75,7 @@ describe('useMessageQueue', () => {
71
75
  });
72
76
  it('should return queued messages as text with double newlines', () => {
73
77
  const { result } = renderHook(() => useMessageQueue({
78
+ isConfigInitialized: true,
74
79
  streamingState: StreamingState.Responding,
75
80
  submitQuery: mockSubmitQuery,
76
81
  }));
@@ -83,6 +88,7 @@ describe('useMessageQueue', () => {
83
88
  });
84
89
  it('should auto-submit queued messages when transitioning to Idle', () => {
85
90
  const { result, rerender } = renderHook(({ streamingState }) => useMessageQueue({
91
+ isConfigInitialized: true,
86
92
  streamingState,
87
93
  submitQuery: mockSubmitQuery,
88
94
  }), {
@@ -101,6 +107,7 @@ describe('useMessageQueue', () => {
101
107
  });
102
108
  it('should not auto-submit when queue is empty', () => {
103
109
  const { rerender } = renderHook(({ streamingState }) => useMessageQueue({
110
+ isConfigInitialized: true,
104
111
  streamingState,
105
112
  submitQuery: mockSubmitQuery,
106
113
  }), {
@@ -112,6 +119,7 @@ describe('useMessageQueue', () => {
112
119
  });
113
120
  it('should not auto-submit when not transitioning to Idle', () => {
114
121
  const { result, rerender } = renderHook(({ streamingState }) => useMessageQueue({
122
+ isConfigInitialized: true,
115
123
  streamingState,
116
124
  submitQuery: mockSubmitQuery,
117
125
  }), {
@@ -128,6 +136,7 @@ describe('useMessageQueue', () => {
128
136
  });
129
137
  it('should handle multiple state transitions correctly', () => {
130
138
  const { result, rerender } = renderHook(({ streamingState }) => useMessageQueue({
139
+ isConfigInitialized: true,
131
140
  streamingState,
132
141
  submitQuery: mockSubmitQuery,
133
142
  }), {
@@ -1 +1 @@
1
- {"version":3,"file":"useMessageQueue.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useMessageQueue.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useMessageQueue.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useMessageQueue.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type Config, UserTierId } from '@google/gemini-cli-core';
7
+ import { type UseHistoryManagerReturn } from './useHistoryManager.js';
8
+ import { AuthState } from '../types.js';
9
+ import { type ProQuotaDialogRequest } from '../contexts/UIStateContext.js';
10
+ interface UseQuotaAndFallbackArgs {
11
+ config: Config;
12
+ historyManager: UseHistoryManagerReturn;
13
+ userTier: UserTierId | undefined;
14
+ setAuthState: (state: AuthState) => void;
15
+ setModelSwitchedFromQuotaError: (value: boolean) => void;
16
+ }
17
+ export declare function useQuotaAndFallback({ config, historyManager, userTier, setAuthState, setModelSwitchedFromQuotaError, }: UseQuotaAndFallbackArgs): {
18
+ proQuotaRequest: ProQuotaDialogRequest | null;
19
+ handleProQuotaChoice: (choice: "auth" | "continue") => void;
20
+ };
21
+ export {};
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AuthType, isGenericQuotaExceededError, isProQuotaExceededError, UserTierId, } from '@google/gemini-cli-core';
7
+ import { useCallback, useEffect, useRef, useState } from 'react';
8
+ import {} from './useHistoryManager.js';
9
+ import { AuthState, MessageType } from '../types.js';
10
+ import {} from '../contexts/UIStateContext.js';
11
+ export function useQuotaAndFallback({ config, historyManager, userTier, setAuthState, setModelSwitchedFromQuotaError, }) {
12
+ const [proQuotaRequest, setProQuotaRequest] = useState(null);
13
+ const isDialogPending = useRef(false);
14
+ // Set up Flash fallback handler
15
+ useEffect(() => {
16
+ const fallbackHandler = async (failedModel, fallbackModel, error) => {
17
+ if (config.isInFallbackMode()) {
18
+ return null;
19
+ }
20
+ // Fallbacks are currently only handled for OAuth users.
21
+ const contentGeneratorConfig = config.getContentGeneratorConfig();
22
+ if (!contentGeneratorConfig ||
23
+ contentGeneratorConfig.authType !== AuthType.LOGIN_WITH_GOOGLE) {
24
+ return null;
25
+ }
26
+ // Use actual user tier if available; otherwise, default to FREE tier behavior (safe default)
27
+ const isPaidTier = userTier === UserTierId.LEGACY || userTier === UserTierId.STANDARD;
28
+ let message;
29
+ if (error && isProQuotaExceededError(error)) {
30
+ // Pro Quota specific messages (Interactive)
31
+ if (isPaidTier) {
32
+ message = `⚡ You have reached your daily ${failedModel} quota limit.
33
+ ⚡ You can choose to authenticate with a paid API key or continue with the fallback model.
34
+ ⚡ To continue accessing the ${failedModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
35
+ }
36
+ else {
37
+ message = `⚡ You have reached your daily ${failedModel} quota limit.
38
+ ⚡ You can choose to authenticate with a paid API key or continue with the fallback model.
39
+ ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
40
+ ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
41
+ ⚡ You can switch authentication methods by typing /auth`;
42
+ }
43
+ }
44
+ else if (error && isGenericQuotaExceededError(error)) {
45
+ // Generic Quota (Automatic fallback)
46
+ const actionMessage = `⚡ You have reached your daily quota limit.\n⚡ Automatically switching from ${failedModel} to ${fallbackModel} for the remainder of this session.`;
47
+ if (isPaidTier) {
48
+ message = `${actionMessage}
49
+ ⚡ To continue accessing the ${failedModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
50
+ }
51
+ else {
52
+ message = `${actionMessage}
53
+ ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
54
+ ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
55
+ ⚡ You can switch authentication methods by typing /auth`;
56
+ }
57
+ }
58
+ else {
59
+ // Consecutive 429s or other errors (Automatic fallback)
60
+ const actionMessage = `⚡ Automatically switching from ${failedModel} to ${fallbackModel} for faster responses for the remainder of this session.`;
61
+ if (isPaidTier) {
62
+ message = `${actionMessage}
63
+ ⚡ Possible reasons for this are that you have received multiple consecutive capacity errors or you have reached your daily ${failedModel} quota limit
64
+ ⚡ To continue accessing the ${failedModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
65
+ }
66
+ else {
67
+ message = `${actionMessage}
68
+ ⚡ Possible reasons for this are that you have received multiple consecutive capacity errors or you have reached your daily ${failedModel} quota limit
69
+ ⚡ To increase your limits, upgrade to a Gemini Code Assist Standard or Enterprise plan with higher limits at https://goo.gle/set-up-gemini-code-assist
70
+ ⚡ Or you can utilize a Gemini API Key. See: https://goo.gle/gemini-cli-docs-auth#gemini-api-key
71
+ ⚡ You can switch authentication methods by typing /auth`;
72
+ }
73
+ }
74
+ // Add message to UI history
75
+ historyManager.addItem({
76
+ type: MessageType.INFO,
77
+ text: message,
78
+ }, Date.now());
79
+ setModelSwitchedFromQuotaError(true);
80
+ config.setQuotaErrorOccurred(true);
81
+ // Interactive Fallback for Pro quota
82
+ if (error && isProQuotaExceededError(error)) {
83
+ if (isDialogPending.current) {
84
+ return 'stop'; // A dialog is already active, so just stop this request.
85
+ }
86
+ isDialogPending.current = true;
87
+ const intent = await new Promise((resolve) => {
88
+ setProQuotaRequest({
89
+ failedModel,
90
+ fallbackModel,
91
+ resolve,
92
+ });
93
+ });
94
+ return intent;
95
+ }
96
+ return 'stop';
97
+ };
98
+ config.setFallbackModelHandler(fallbackHandler);
99
+ }, [config, historyManager, userTier, setModelSwitchedFromQuotaError]);
100
+ const handleProQuotaChoice = useCallback((choice) => {
101
+ if (!proQuotaRequest)
102
+ return;
103
+ const intent = choice === 'auth' ? 'auth' : 'retry';
104
+ proQuotaRequest.resolve(intent);
105
+ setProQuotaRequest(null);
106
+ isDialogPending.current = false; // Reset the flag here
107
+ if (choice === 'auth') {
108
+ setAuthState(AuthState.Updating);
109
+ }
110
+ else {
111
+ historyManager.addItem({
112
+ type: MessageType.INFO,
113
+ text: 'Switched to fallback model. Tip: Press Ctrl+P (or Up Arrow) to recall your previous prompt and submit it again if you wish.',
114
+ }, Date.now());
115
+ }
116
+ }, [proQuotaRequest, setAuthState, historyManager]);
117
+ return {
118
+ proQuotaRequest,
119
+ handleProQuotaChoice,
120
+ };
121
+ }
122
+ //# sourceMappingURL=useQuotaAndFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuotaAndFallback.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,269 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { vi, describe, it, expect, beforeEach, afterEach, } from 'vitest';
7
+ import { act, renderHook } from '@testing-library/react';
8
+ import { UserTierId, AuthType, isGenericQuotaExceededError, isProQuotaExceededError, makeFakeConfig, } from '@google/gemini-cli-core';
9
+ import { useQuotaAndFallback } from './useQuotaAndFallback.js';
10
+ import { AuthState, MessageType } from '../types.js';
11
+ // Mock the error checking functions from the core package to control test scenarios
12
+ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
13
+ const original = await importOriginal();
14
+ return {
15
+ ...original,
16
+ isGenericQuotaExceededError: vi.fn(),
17
+ isProQuotaExceededError: vi.fn(),
18
+ };
19
+ });
20
+ describe('useQuotaAndFallback', () => {
21
+ let mockConfig;
22
+ let mockHistoryManager;
23
+ let mockSetAuthState;
24
+ let mockSetModelSwitchedFromQuotaError;
25
+ let setFallbackHandlerSpy;
26
+ const mockedIsGenericQuotaExceededError = isGenericQuotaExceededError;
27
+ const mockedIsProQuotaExceededError = isProQuotaExceededError;
28
+ beforeEach(() => {
29
+ mockConfig = makeFakeConfig();
30
+ // Spy on the method that requires the private field and mock its return.
31
+ // This is cleaner than modifying the config class for tests.
32
+ vi.spyOn(mockConfig, 'getContentGeneratorConfig').mockReturnValue({
33
+ model: 'gemini-pro',
34
+ authType: AuthType.LOGIN_WITH_GOOGLE,
35
+ });
36
+ mockHistoryManager = {
37
+ addItem: vi.fn(),
38
+ history: [],
39
+ updateItem: vi.fn(),
40
+ clearItems: vi.fn(),
41
+ loadHistory: vi.fn(),
42
+ };
43
+ mockSetAuthState = vi.fn();
44
+ mockSetModelSwitchedFromQuotaError = vi.fn();
45
+ setFallbackHandlerSpy = vi.spyOn(mockConfig, 'setFallbackModelHandler');
46
+ vi.spyOn(mockConfig, 'setQuotaErrorOccurred');
47
+ mockedIsGenericQuotaExceededError.mockReturnValue(false);
48
+ mockedIsProQuotaExceededError.mockReturnValue(false);
49
+ });
50
+ afterEach(() => {
51
+ vi.clearAllMocks();
52
+ });
53
+ it('should register a fallback handler on initialization', () => {
54
+ renderHook(() => useQuotaAndFallback({
55
+ config: mockConfig,
56
+ historyManager: mockHistoryManager,
57
+ userTier: UserTierId.FREE,
58
+ setAuthState: mockSetAuthState,
59
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
60
+ }));
61
+ expect(setFallbackHandlerSpy).toHaveBeenCalledTimes(1);
62
+ expect(setFallbackHandlerSpy.mock.calls[0][0]).toBeInstanceOf(Function);
63
+ });
64
+ describe('Fallback Handler Logic', () => {
65
+ // Helper function to render the hook and extract the registered handler
66
+ const getRegisteredHandler = (userTier = UserTierId.FREE) => {
67
+ renderHook((props) => useQuotaAndFallback({
68
+ config: mockConfig,
69
+ historyManager: mockHistoryManager,
70
+ userTier: props.userTier,
71
+ setAuthState: mockSetAuthState,
72
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
73
+ }), { initialProps: { userTier } });
74
+ return setFallbackHandlerSpy.mock.calls[0][0];
75
+ };
76
+ it('should return null and take no action if already in fallback mode', async () => {
77
+ vi.spyOn(mockConfig, 'isInFallbackMode').mockReturnValue(true);
78
+ const handler = getRegisteredHandler();
79
+ const result = await handler('gemini-pro', 'gemini-flash', new Error());
80
+ expect(result).toBeNull();
81
+ expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
82
+ });
83
+ it('should return null and take no action if authType is not LOGIN_WITH_GOOGLE', async () => {
84
+ // Override the default mock from beforeEach for this specific test
85
+ vi.spyOn(mockConfig, 'getContentGeneratorConfig').mockReturnValue({
86
+ model: 'gemini-pro',
87
+ authType: AuthType.USE_GEMINI,
88
+ });
89
+ const handler = getRegisteredHandler();
90
+ const result = await handler('gemini-pro', 'gemini-flash', new Error());
91
+ expect(result).toBeNull();
92
+ expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
93
+ });
94
+ describe('Automatic Fallback Scenarios', () => {
95
+ const testCases = [
96
+ {
97
+ errorType: 'generic',
98
+ tier: UserTierId.FREE,
99
+ expectedMessageSnippets: [
100
+ 'Automatically switching from model-A to model-B',
101
+ 'upgrade to a Gemini Code Assist Standard or Enterprise plan',
102
+ ],
103
+ },
104
+ {
105
+ errorType: 'generic',
106
+ tier: UserTierId.STANDARD, // Paid tier
107
+ expectedMessageSnippets: [
108
+ 'Automatically switching from model-A to model-B',
109
+ 'switch to using a paid API key from AI Studio',
110
+ ],
111
+ },
112
+ {
113
+ errorType: 'other',
114
+ tier: UserTierId.FREE,
115
+ expectedMessageSnippets: [
116
+ 'Automatically switching from model-A to model-B for faster responses',
117
+ 'upgrade to a Gemini Code Assist Standard or Enterprise plan',
118
+ ],
119
+ },
120
+ {
121
+ errorType: 'other',
122
+ tier: UserTierId.LEGACY, // Paid tier
123
+ expectedMessageSnippets: [
124
+ 'Automatically switching from model-A to model-B for faster responses',
125
+ 'switch to using a paid API key from AI Studio',
126
+ ],
127
+ },
128
+ ];
129
+ for (const { errorType, tier, expectedMessageSnippets } of testCases) {
130
+ it(`should handle ${errorType} error for ${tier} tier correctly`, async () => {
131
+ mockedIsGenericQuotaExceededError.mockReturnValue(errorType === 'generic');
132
+ const handler = getRegisteredHandler(tier);
133
+ const result = await handler('model-A', 'model-B', new Error('quota exceeded'));
134
+ // Automatic fallbacks should return 'stop'
135
+ expect(result).toBe('stop');
136
+ expect(mockHistoryManager.addItem).toHaveBeenCalledWith(expect.objectContaining({ type: MessageType.INFO }), expect.any(Number));
137
+ const message = mockHistoryManager.addItem.mock.calls[0][0]
138
+ .text;
139
+ for (const snippet of expectedMessageSnippets) {
140
+ expect(message).toContain(snippet);
141
+ }
142
+ expect(mockSetModelSwitchedFromQuotaError).toHaveBeenCalledWith(true);
143
+ expect(mockConfig.setQuotaErrorOccurred).toHaveBeenCalledWith(true);
144
+ });
145
+ }
146
+ });
147
+ describe('Interactive Fallback (Pro Quota Error)', () => {
148
+ beforeEach(() => {
149
+ mockedIsProQuotaExceededError.mockReturnValue(true);
150
+ });
151
+ it('should set an interactive request and wait for user choice', async () => {
152
+ const { result } = renderHook(() => useQuotaAndFallback({
153
+ config: mockConfig,
154
+ historyManager: mockHistoryManager,
155
+ userTier: UserTierId.FREE,
156
+ setAuthState: mockSetAuthState,
157
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
158
+ }));
159
+ const handler = setFallbackHandlerSpy.mock
160
+ .calls[0][0];
161
+ // Call the handler but do not await it, to check the intermediate state
162
+ const promise = handler('gemini-pro', 'gemini-flash', new Error('pro quota'));
163
+ await act(async () => { });
164
+ // The hook should now have a pending request for the UI to handle
165
+ expect(result.current.proQuotaRequest).not.toBeNull();
166
+ expect(result.current.proQuotaRequest?.failedModel).toBe('gemini-pro');
167
+ // Simulate the user choosing to continue with the fallback model
168
+ act(() => {
169
+ result.current.handleProQuotaChoice('continue');
170
+ });
171
+ // The original promise from the handler should now resolve
172
+ const intent = await promise;
173
+ expect(intent).toBe('retry');
174
+ // The pending request should be cleared from the state
175
+ expect(result.current.proQuotaRequest).toBeNull();
176
+ });
177
+ it('should handle race conditions by stopping subsequent requests', async () => {
178
+ const { result } = renderHook(() => useQuotaAndFallback({
179
+ config: mockConfig,
180
+ historyManager: mockHistoryManager,
181
+ userTier: UserTierId.FREE,
182
+ setAuthState: mockSetAuthState,
183
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
184
+ }));
185
+ const handler = setFallbackHandlerSpy.mock
186
+ .calls[0][0];
187
+ const promise1 = handler('gemini-pro', 'gemini-flash', new Error('pro quota 1'));
188
+ await act(async () => { });
189
+ const firstRequest = result.current.proQuotaRequest;
190
+ expect(firstRequest).not.toBeNull();
191
+ const result2 = await handler('gemini-pro', 'gemini-flash', new Error('pro quota 2'));
192
+ // The lock should have stopped the second request
193
+ expect(result2).toBe('stop');
194
+ expect(result.current.proQuotaRequest).toBe(firstRequest);
195
+ act(() => {
196
+ result.current.handleProQuotaChoice('continue');
197
+ });
198
+ const intent1 = await promise1;
199
+ expect(intent1).toBe('retry');
200
+ expect(result.current.proQuotaRequest).toBeNull();
201
+ });
202
+ });
203
+ });
204
+ describe('handleProQuotaChoice', () => {
205
+ beforeEach(() => {
206
+ mockedIsProQuotaExceededError.mockReturnValue(true);
207
+ });
208
+ it('should do nothing if there is no pending pro quota request', () => {
209
+ const { result } = renderHook(() => useQuotaAndFallback({
210
+ config: mockConfig,
211
+ historyManager: mockHistoryManager,
212
+ userTier: UserTierId.FREE,
213
+ setAuthState: mockSetAuthState,
214
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
215
+ }));
216
+ act(() => {
217
+ result.current.handleProQuotaChoice('auth');
218
+ });
219
+ expect(mockSetAuthState).not.toHaveBeenCalled();
220
+ expect(mockHistoryManager.addItem).not.toHaveBeenCalled();
221
+ });
222
+ it('should resolve intent to "auth" and trigger auth state update', async () => {
223
+ const { result } = renderHook(() => useQuotaAndFallback({
224
+ config: mockConfig,
225
+ historyManager: mockHistoryManager,
226
+ userTier: UserTierId.FREE,
227
+ setAuthState: mockSetAuthState,
228
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
229
+ }));
230
+ const handler = setFallbackHandlerSpy.mock
231
+ .calls[0][0];
232
+ const promise = handler('gemini-pro', 'gemini-flash', new Error('pro quota'));
233
+ await act(async () => { }); // Allow state to update
234
+ act(() => {
235
+ result.current.handleProQuotaChoice('auth');
236
+ });
237
+ const intent = await promise;
238
+ expect(intent).toBe('auth');
239
+ expect(mockSetAuthState).toHaveBeenCalledWith(AuthState.Updating);
240
+ expect(result.current.proQuotaRequest).toBeNull();
241
+ });
242
+ it('should resolve intent to "retry" and add info message on continue', async () => {
243
+ const { result } = renderHook(() => useQuotaAndFallback({
244
+ config: mockConfig,
245
+ historyManager: mockHistoryManager,
246
+ userTier: UserTierId.FREE,
247
+ setAuthState: mockSetAuthState,
248
+ setModelSwitchedFromQuotaError: mockSetModelSwitchedFromQuotaError,
249
+ }));
250
+ const handler = setFallbackHandlerSpy.mock
251
+ .calls[0][0];
252
+ // The first `addItem` call is for the initial quota error message
253
+ const promise = handler('gemini-pro', 'gemini-flash', new Error('pro quota'));
254
+ await act(async () => { }); // Allow state to update
255
+ act(() => {
256
+ result.current.handleProQuotaChoice('continue');
257
+ });
258
+ const intent = await promise;
259
+ expect(intent).toBe('retry');
260
+ expect(result.current.proQuotaRequest).toBeNull();
261
+ // Check for the second "Switched to fallback model" message
262
+ expect(mockHistoryManager.addItem).toHaveBeenCalledTimes(2);
263
+ const lastCall = mockHistoryManager.addItem.mock.calls[1][0];
264
+ expect(lastCall.type).toBe(MessageType.INFO);
265
+ expect(lastCall.text).toContain('Switched to fallback model.');
266
+ });
267
+ });
268
+ });
269
+ //# sourceMappingURL=useQuotaAndFallback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuotaAndFallback.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,13 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import type { Settings, SettingScope, LoadedSettings } from '../config/settings.js';
7
- import type { SettingDefinition } from '../config/settingsSchema.js';
7
+ import type { SettingDefinition, SettingsType, SettingsValue } from '../config/settingsSchema.js';
8
+ type FlattenedSchema = Record<string, SettingDefinition & {
9
+ key: string;
10
+ }>;
11
+ /** Returns a flattened schema, the first call is memoized for future requests. */
12
+ export declare function getFlattenedSchema(): FlattenedSchema;
13
+ declare function clearFlattenedSchema(): void;
8
14
  /**
9
15
  * Get all settings grouped by category
10
16
  */
@@ -24,7 +30,7 @@ export declare function requiresRestart(key: string): boolean;
24
30
  /**
25
31
  * Get the default value for a setting
26
32
  */
27
- export declare function getDefaultValue(key: string): SettingDefinition['default'];
33
+ export declare function getDefaultValue(key: string): SettingsValue;
28
34
  /**
29
35
  * Get all setting keys that require restart
30
36
  */
@@ -37,7 +43,7 @@ export declare function getNestedValue(obj: Record<string, unknown>, path: strin
37
43
  * Get the effective value for a setting, considering inheritance from higher scopes
38
44
  * Always returns a value (never undefined) - falls back to default if not set anywhere
39
45
  */
40
- export declare function getEffectiveValue(key: string, settings: Settings, mergedSettings: Settings): SettingDefinition['default'];
46
+ export declare function getEffectiveValue(key: string, settings: Settings, mergedSettings: Settings): SettingsValue;
41
47
  /**
42
48
  * Get all setting keys from the schema
43
49
  */
@@ -45,7 +51,7 @@ export declare function getAllSettingKeys(): string[];
45
51
  /**
46
52
  * Get settings by type
47
53
  */
48
- export declare function getSettingsByType(type: SettingDefinition['type']): Array<SettingDefinition & {
54
+ export declare function getSettingsByType(type: SettingsType): Array<SettingDefinition & {
49
55
  key: string;
50
56
  }>;
51
57
  /**
@@ -75,7 +81,7 @@ export declare function getDialogSettingsByCategory(): Record<string, Array<Sett
75
81
  /**
76
82
  * Get settings by type that should be shown in the dialog
77
83
  */
78
- export declare function getDialogSettingsByType(type: SettingDefinition['type']): Array<SettingDefinition & {
84
+ export declare function getDialogSettingsByType(type: SettingsType): Array<SettingDefinition & {
79
85
  key: string;
80
86
  }>;
81
87
  /**
@@ -102,7 +108,7 @@ export declare function setPendingSettingValue(key: string, value: boolean, pend
102
108
  /**
103
109
  * Generic setter: Set a setting value (boolean, number, string, etc.) in the pending settings
104
110
  */
105
- export declare function setPendingSettingValueAny(key: string, value: unknown, pendingSettings: Settings): Settings;
111
+ export declare function setPendingSettingValueAny(key: string, value: SettingsValue, pendingSettings: Settings): Settings;
106
112
  /**
107
113
  * Check if any modified settings require a restart
108
114
  */
@@ -132,3 +138,7 @@ export declare function isValueInherited(key: string, settings: Settings, _merge
132
138
  * Always returns a boolean value (never undefined)
133
139
  */
134
140
  export declare function getEffectiveDisplayValue(key: string, settings: Settings, mergedSettings: Settings): boolean;
141
+ export declare const TEST_ONLY: {
142
+ clearFlattenedSchema: typeof clearFlattenedSchema;
143
+ };
144
+ export {};