@umsai/ums-code 0.5.0-v1 → 0.6.0-v1

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 (194) hide show
  1. package/dist/package.json +4 -4
  2. package/dist/src/acp-integration/acp.d.ts +6 -0
  3. package/dist/src/acp-integration/acp.js +7 -0
  4. package/dist/src/acp-integration/acp.js.map +1 -1
  5. package/dist/src/acp-integration/acpAgent.js +33 -7
  6. package/dist/src/acp-integration/acpAgent.js.map +1 -1
  7. package/dist/src/acp-integration/schema.d.ts +1235 -892
  8. package/dist/src/acp-integration/schema.js +19 -0
  9. package/dist/src/acp-integration/schema.js.map +1 -1
  10. package/dist/src/acp-integration/session/Session.d.ts +0 -5
  11. package/dist/src/acp-integration/session/Session.js +94 -15
  12. package/dist/src/acp-integration/session/Session.js.map +1 -1
  13. package/dist/src/commandMode.d.ts +11 -0
  14. package/dist/src/commandMode.js +238 -0
  15. package/dist/src/commandMode.js.map +1 -0
  16. package/dist/src/config/auth.js +26 -0
  17. package/dist/src/config/auth.js.map +1 -1
  18. package/dist/src/config/config.d.ts +8 -0
  19. package/dist/src/config/config.js +96 -21
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/extensions/update.test.js +9 -0
  22. package/dist/src/config/extensions/update.test.js.map +1 -1
  23. package/dist/src/config/settingsSchema.d.ts +41 -2
  24. package/dist/src/config/settingsSchema.js +36 -2
  25. package/dist/src/config/settingsSchema.js.map +1 -1
  26. package/dist/src/core/initializer.js +3 -0
  27. package/dist/src/core/initializer.js.map +1 -1
  28. package/dist/src/gemini.js +39 -19
  29. package/dist/src/gemini.js.map +1 -1
  30. package/dist/src/gemini.test.js +30 -4
  31. package/dist/src/gemini.test.js.map +1 -1
  32. package/dist/src/generated/git-commit.d.ts +3 -3
  33. package/dist/src/generated/git-commit.js +3 -3
  34. package/dist/src/i18n/index.d.ts +10 -2
  35. package/dist/src/i18n/index.js +22 -1
  36. package/dist/src/i18n/index.js.map +1 -1
  37. package/dist/src/i18n/languages.d.ts +20 -0
  38. package/dist/src/i18n/languages.js +36 -0
  39. package/dist/src/i18n/languages.js.map +1 -0
  40. package/dist/src/i18n/locales/de.js +1073 -0
  41. package/dist/src/i18n/locales/en.js +120 -162
  42. package/dist/src/i18n/locales/ru.js +125 -151
  43. package/dist/src/i18n/locales/zh.js +51 -164
  44. package/dist/src/nonInteractive/control/controllers/systemController.d.ts +1 -1
  45. package/dist/src/nonInteractive/control/controllers/systemController.js +5 -10
  46. package/dist/src/nonInteractive/control/controllers/systemController.js.map +1 -1
  47. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js +11 -4
  48. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js.map +1 -1
  49. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js +40 -0
  50. package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js.map +1 -1
  51. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js +50 -0
  52. package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js.map +1 -1
  53. package/dist/src/nonInteractiveCli.js +104 -18
  54. package/dist/src/nonInteractiveCli.js.map +1 -1
  55. package/dist/src/nonInteractiveCliCommands.d.ts +48 -9
  56. package/dist/src/nonInteractiveCliCommands.js +180 -64
  57. package/dist/src/nonInteractiveCliCommands.js.map +1 -1
  58. package/dist/src/{ui/hooks/useQuotaAndFallback.test.d.ts → nonInteractiveCliCommands.test.d.ts} +1 -1
  59. package/dist/src/nonInteractiveCliCommands.test.js +157 -0
  60. package/dist/src/nonInteractiveCliCommands.test.js.map +1 -0
  61. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  62. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  63. package/dist/src/services/McpPromptLoader.js +4 -2
  64. package/dist/src/services/McpPromptLoader.js.map +1 -1
  65. package/dist/src/services/McpPromptLoader.test.js +1 -1
  66. package/dist/src/services/McpPromptLoader.test.js.map +1 -1
  67. package/dist/src/ui/AppContainer.js +23 -20
  68. package/dist/src/ui/AppContainer.js.map +1 -1
  69. package/dist/src/ui/AppContainer.test.js +0 -46
  70. package/dist/src/ui/AppContainer.test.js.map +1 -1
  71. package/dist/src/ui/auth/AuthDialog.test.js +4 -4
  72. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  73. package/dist/src/ui/auth/useAuth.js +11 -3
  74. package/dist/src/ui/auth/useAuth.js.map +1 -1
  75. package/dist/src/ui/commands/approvalModeCommand.js +53 -4
  76. package/dist/src/ui/commands/approvalModeCommand.js.map +1 -1
  77. package/dist/src/ui/commands/approvalModeCommand.test.js +72 -10
  78. package/dist/src/ui/commands/approvalModeCommand.test.js.map +1 -1
  79. package/dist/src/ui/commands/compressCommand.js +86 -16
  80. package/dist/src/ui/commands/compressCommand.js.map +1 -1
  81. package/dist/src/ui/commands/languageCommand.d.ts +6 -1
  82. package/dist/src/ui/commands/languageCommand.js +162 -216
  83. package/dist/src/ui/commands/languageCommand.js.map +1 -1
  84. package/dist/src/ui/commands/languageCommand.test.js +105 -10
  85. package/dist/src/ui/commands/languageCommand.test.js.map +1 -1
  86. package/dist/src/ui/commands/restoreCommand.js +1 -1
  87. package/dist/src/ui/commands/restoreCommand.js.map +1 -1
  88. package/dist/src/ui/commands/resumeCommand.d.ts +7 -0
  89. package/dist/src/ui/commands/resumeCommand.js +19 -0
  90. package/dist/src/ui/commands/resumeCommand.js.map +1 -0
  91. package/dist/src/ui/{components/ProQuotaDialog.test.d.ts → commands/resumeCommand.test.d.ts} +1 -1
  92. package/dist/src/ui/commands/resumeCommand.test.js +32 -0
  93. package/dist/src/ui/commands/resumeCommand.test.js.map +1 -0
  94. package/dist/src/ui/commands/reviewCommand.js +871 -92
  95. package/dist/src/ui/commands/reviewCommand.js.map +1 -1
  96. package/dist/src/ui/commands/reviewCommand.test.js +55 -0
  97. package/dist/src/ui/commands/reviewCommand.test.js.map +1 -1
  98. package/dist/src/ui/commands/summaryCommand.js +129 -42
  99. package/dist/src/ui/commands/summaryCommand.js.map +1 -1
  100. package/dist/src/ui/commands/types.d.ts +21 -2
  101. package/dist/src/ui/commands/types.js.map +1 -1
  102. package/dist/src/ui/components/DialogManager.js +4 -4
  103. package/dist/src/ui/components/DialogManager.js.map +1 -1
  104. package/dist/src/ui/components/HistoryItemDisplay.test.js +5 -2
  105. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  106. package/dist/src/ui/components/PermissionsModifyTrustDialog.js +1 -1
  107. package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
  108. package/dist/src/ui/components/SessionPicker.d.ts +18 -0
  109. package/dist/src/ui/components/SessionPicker.js +69 -0
  110. package/dist/src/ui/components/SessionPicker.js.map +1 -0
  111. package/dist/src/ui/components/SessionSummaryDisplay.js +6 -2
  112. package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -1
  113. package/dist/src/ui/components/{ResumeSessionPicker.d.ts → StandaloneSessionPicker.d.ts} +1 -1
  114. package/dist/src/ui/components/StandaloneSessionPicker.js +78 -0
  115. package/dist/src/ui/components/StandaloneSessionPicker.js.map +1 -0
  116. package/dist/src/ui/components/StandaloneSessionPicker.test.d.ts +6 -0
  117. package/dist/src/ui/components/StandaloneSessionPicker.test.js +410 -0
  118. package/dist/src/ui/components/StandaloneSessionPicker.test.js.map +1 -0
  119. package/dist/src/ui/components/ums/UMSKeyPrompt.js +1 -1
  120. package/dist/src/ui/components/ums/UMSKeyPrompt.js.map +1 -1
  121. package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -1
  122. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  123. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -8
  124. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  125. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -0
  126. package/dist/src/ui/hooks/slashCommandProcessor.js +9 -0
  127. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  128. package/dist/src/ui/hooks/useGeminiStream.js +46 -11
  129. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  130. package/dist/src/ui/hooks/useLoadingIndicator.test.js +11 -6
  131. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  132. package/dist/src/ui/hooks/usePhraseCycler.js +12 -136
  133. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  134. package/dist/src/ui/hooks/useQwenAuth.test.js +1 -1
  135. package/dist/src/ui/hooks/useQwenAuth.test.js.map +1 -1
  136. package/dist/src/ui/hooks/useResumeCommand.d.ts +20 -0
  137. package/dist/src/ui/hooks/useResumeCommand.js +49 -0
  138. package/dist/src/ui/hooks/useResumeCommand.js.map +1 -0
  139. package/dist/src/ui/hooks/useResumeCommand.test.d.ts +6 -0
  140. package/dist/src/ui/hooks/useResumeCommand.test.js +144 -0
  141. package/dist/src/ui/hooks/useResumeCommand.test.js.map +1 -0
  142. package/dist/src/ui/hooks/useSessionPicker.d.ts +36 -0
  143. package/dist/src/ui/hooks/useSessionPicker.js +189 -0
  144. package/dist/src/ui/hooks/useSessionPicker.js.map +1 -0
  145. package/dist/src/ui/hooks/useToolScheduler.test.js +1 -1
  146. package/dist/src/ui/models/availableModels.d.ts +1 -0
  147. package/dist/src/ui/models/availableModels.js +8 -0
  148. package/dist/src/ui/models/availableModels.js.map +1 -1
  149. package/dist/src/ui/utils/resumeHistoryUtils.js +5 -1
  150. package/dist/src/ui/utils/resumeHistoryUtils.js.map +1 -1
  151. package/dist/src/ui/utils/resumeHistoryUtils.test.js +5 -0
  152. package/dist/src/ui/utils/resumeHistoryUtils.test.js.map +1 -1
  153. package/dist/src/ui/utils/sessionPickerUtils.d.ts +30 -0
  154. package/dist/src/ui/utils/sessionPickerUtils.js +41 -0
  155. package/dist/src/ui/utils/sessionPickerUtils.js.map +1 -0
  156. package/dist/src/ui/utils/sessionPickerUtils.test.d.ts +6 -0
  157. package/dist/src/ui/utils/sessionPickerUtils.test.js +38 -0
  158. package/dist/src/ui/utils/sessionPickerUtils.test.js.map +1 -0
  159. package/dist/src/utils/errors.d.ts +1 -1
  160. package/dist/src/utils/errors.js +14 -3
  161. package/dist/src/utils/errors.js.map +1 -1
  162. package/dist/src/utils/errors.test.js +43 -1
  163. package/dist/src/utils/errors.test.js.map +1 -1
  164. package/dist/src/utils/gitUtils.js +22 -5
  165. package/dist/src/utils/gitUtils.js.map +1 -1
  166. package/dist/src/utils/gitUtils.test.js +59 -0
  167. package/dist/src/utils/gitUtils.test.js.map +1 -1
  168. package/dist/src/utils/nonInteractiveHelpers.d.ts +3 -1
  169. package/dist/src/utils/nonInteractiveHelpers.js +13 -14
  170. package/dist/src/utils/nonInteractiveHelpers.js.map +1 -1
  171. package/dist/src/utils/nonInteractiveHelpers.test.js +35 -20
  172. package/dist/src/utils/nonInteractiveHelpers.test.js.map +1 -1
  173. package/dist/src/utils/relaunch.js +2 -2
  174. package/dist/src/utils/relaunch.js.map +1 -1
  175. package/dist/src/utils/relaunch.test.js +5 -5
  176. package/dist/src/utils/relaunch.test.js.map +1 -1
  177. package/dist/src/utils/systemInfo.js +2 -1
  178. package/dist/src/utils/systemInfo.js.map +1 -1
  179. package/dist/src/validateNonInterActiveAuth.js +9 -0
  180. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  181. package/dist/tsconfig.tsbuildinfo +1 -1
  182. package/package.json +5 -5
  183. package/dist/src/ui/components/ProQuotaDialog.d.ts +0 -13
  184. package/dist/src/ui/components/ProQuotaDialog.js +0 -24
  185. package/dist/src/ui/components/ProQuotaDialog.js.map +0 -1
  186. package/dist/src/ui/components/ProQuotaDialog.test.js +0 -58
  187. package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
  188. package/dist/src/ui/components/ResumeSessionPicker.js +0 -249
  189. package/dist/src/ui/components/ResumeSessionPicker.js.map +0 -1
  190. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +0 -21
  191. package/dist/src/ui/hooks/useQuotaAndFallback.js +0 -122
  192. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +0 -1
  193. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -269
  194. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
@@ -1,269 +0,0 @@
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 '@umsai/ums-code-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('@umsai/ums-code-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: 'test-model',
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: 'test-model',
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"useQuotaAndFallback.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQuotaAndFallback.test.ts"],"names":[],"mappings":"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"}