@vybestack/llxprt-code 0.3.4-nightly.250918.ed04d656 → 0.3.4-nightly.250921.fdbf3cd7

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 (203) hide show
  1. package/README.md +3 -0
  2. package/dist/package.json +7 -6
  3. package/dist/src/commands/extensions/examples/context/LLXPRT.md +8 -0
  4. package/dist/src/commands/extensions/examples/context/llxprt-extension.json +5 -0
  5. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  6. package/dist/src/commands/extensions/examples/custom-commands/llxprt-extension.json +4 -0
  7. package/dist/src/commands/extensions/examples/exclude-tools/llxprt-extension.json +5 -0
  8. package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
  9. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  10. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  11. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  12. package/dist/src/commands/extensions/examples/mcp-server/llxprt-extension.json +10 -0
  13. package/dist/src/commands/extensions/install.js +35 -7
  14. package/dist/src/commands/extensions/install.js.map +1 -1
  15. package/dist/src/commands/extensions/install.test.js +20 -2
  16. package/dist/src/commands/extensions/install.test.js.map +1 -1
  17. package/dist/src/commands/extensions/link.d.ts +12 -0
  18. package/dist/src/commands/extensions/link.js +37 -0
  19. package/dist/src/commands/extensions/link.js.map +1 -0
  20. package/dist/src/commands/extensions/new.d.ts +7 -0
  21. package/dist/src/commands/extensions/new.js +70 -0
  22. package/dist/src/commands/extensions/new.js.map +1 -0
  23. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  24. package/dist/src/commands/extensions/new.test.js +50 -0
  25. package/dist/src/commands/extensions/new.test.js.map +1 -0
  26. package/dist/src/commands/extensions/update.d.ts +2 -1
  27. package/dist/src/commands/extensions/update.js +40 -13
  28. package/dist/src/commands/extensions/update.js.map +1 -1
  29. package/dist/src/commands/extensions.js +4 -0
  30. package/dist/src/commands/extensions.js.map +1 -1
  31. package/dist/src/commands/mcp/add.js +1 -1
  32. package/dist/src/commands/mcp/add.js.map +1 -1
  33. package/dist/src/commands/mcp/list.js +2 -2
  34. package/dist/src/commands/mcp/list.js.map +1 -1
  35. package/dist/src/commands/mcp/remove.js +1 -1
  36. package/dist/src/commands/mcp/remove.js.map +1 -1
  37. package/dist/src/config/auth.d.ts +1 -1
  38. package/dist/src/config/auth.js +6 -13
  39. package/dist/src/config/auth.js.map +1 -1
  40. package/dist/src/config/auth.test.js +13 -7
  41. package/dist/src/config/auth.test.js.map +1 -1
  42. package/dist/src/config/config.d.ts +4 -1
  43. package/dist/src/config/config.js +47 -23
  44. package/dist/src/config/config.js.map +1 -1
  45. package/dist/src/config/extension.d.ts +8 -5
  46. package/dist/src/config/extension.js +76 -24
  47. package/dist/src/config/extension.js.map +1 -1
  48. package/dist/src/config/keyBindings.d.ts +1 -0
  49. package/dist/src/config/keyBindings.js +6 -25
  50. package/dist/src/config/keyBindings.js.map +1 -1
  51. package/dist/src/config/settings.d.ts +4 -4
  52. package/dist/src/config/settings.js +101 -68
  53. package/dist/src/config/settings.js.map +1 -1
  54. package/dist/src/config/settingsSchema.d.ts +252 -3
  55. package/dist/src/config/settingsSchema.js +248 -3
  56. package/dist/src/config/settingsSchema.js.map +1 -1
  57. package/dist/src/config/trustedFolders.d.ts +14 -3
  58. package/dist/src/config/trustedFolders.js +63 -37
  59. package/dist/src/config/trustedFolders.js.map +1 -1
  60. package/dist/src/config/trustedFolders.test.js +84 -9
  61. package/dist/src/config/trustedFolders.test.js.map +1 -1
  62. package/dist/src/gemini.js +74 -18
  63. package/dist/src/gemini.js.map +1 -1
  64. package/dist/src/gemini.test.js +7 -23
  65. package/dist/src/gemini.test.js.map +1 -1
  66. package/dist/src/generated/git-commit.d.ts +1 -1
  67. package/dist/src/generated/git-commit.js +1 -1
  68. package/dist/src/nonInteractiveCli.js +32 -2
  69. package/dist/src/nonInteractiveCli.js.map +1 -1
  70. package/dist/src/providers/providerManagerInstance.js +0 -1
  71. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  72. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  73. package/dist/src/services/FileCommandLoader.js +7 -0
  74. package/dist/src/services/FileCommandLoader.js.map +1 -1
  75. package/dist/src/ui/App.js +103 -51
  76. package/dist/src/ui/App.js.map +1 -1
  77. package/dist/src/ui/commands/directoryCommand.js +1 -1
  78. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  79. package/dist/src/ui/commands/memoryCommand.js +1 -1
  80. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  81. package/dist/src/ui/components/AuthDialog.test.js +13 -13
  82. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  83. package/dist/src/ui/components/FolderTrustDialog.js +5 -3
  84. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  85. package/dist/src/ui/components/FolderTrustDialog.test.js +21 -6
  86. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  87. package/dist/src/ui/components/Footer.d.ts +3 -0
  88. package/dist/src/ui/components/Footer.js +4 -4
  89. package/dist/src/ui/components/Footer.js.map +1 -1
  90. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
  91. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  92. package/dist/src/ui/components/InputPrompt.d.ts +2 -2
  93. package/dist/src/ui/components/InputPrompt.js +35 -25
  94. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  95. package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
  96. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  97. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  98. package/dist/src/ui/components/ProQuotaDialog.js +22 -0
  99. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  100. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  101. package/dist/src/ui/components/ProQuotaDialog.test.js +57 -0
  102. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  103. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  104. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  105. package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
  106. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  107. package/dist/src/ui/components/messages/DiffRenderer.js +5 -1
  108. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  109. package/dist/src/ui/components/messages/GeminiMessage.js +1 -1
  110. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  111. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  112. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  113. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  114. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  115. package/dist/src/ui/components/messages/ToolMessage.js +2 -1
  116. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  117. package/dist/src/ui/components/messages/UserMessage.js +1 -1
  118. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  119. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  120. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  121. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  122. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +2 -2
  123. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  124. package/dist/src/ui/components/shared/text-buffer.js +35 -51
  125. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  126. package/dist/src/ui/constants.d.ts +8 -2
  127. package/dist/src/ui/constants.js +9 -2
  128. package/dist/src/ui/constants.js.map +1 -1
  129. package/dist/src/ui/containers/SessionController.js +1 -1
  130. package/dist/src/ui/containers/SessionController.js.map +1 -1
  131. package/dist/src/ui/containers/SessionController.test.js +1 -0
  132. package/dist/src/ui/containers/SessionController.test.js.map +1 -1
  133. package/dist/src/ui/contexts/KeypressContext.js +255 -42
  134. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  135. package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
  136. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  137. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -1
  138. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  139. package/dist/src/ui/hooks/useFolderTrust.js +6 -3
  140. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  141. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  142. package/dist/src/ui/hooks/useGeminiStream.integration.test.js +1 -1
  143. package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -1
  144. package/dist/src/ui/hooks/useGeminiStream.js +170 -35
  145. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  146. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
  147. package/dist/src/ui/hooks/useIdeTrustListener.js +37 -0
  148. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  149. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  150. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  151. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  152. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  153. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  154. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  155. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  156. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  157. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  158. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  159. package/dist/src/ui/hooks/useLoadingIndicator.test.js +102 -0
  160. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  161. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  162. package/dist/src/ui/hooks/usePhraseCycler.js +25 -17
  163. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  164. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  165. package/dist/src/ui/hooks/usePrivacySettings.js +20 -13
  166. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  167. package/dist/src/ui/hooks/usePrivacySettings.test.js +52 -105
  168. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  169. package/dist/src/ui/hooks/useToolScheduler.test.js +57 -70
  170. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  171. package/dist/src/ui/keyMatchers.test.js +9 -0
  172. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  173. package/dist/src/ui/textConstants.d.ts +9 -0
  174. package/dist/src/ui/textConstants.js +10 -0
  175. package/dist/src/ui/textConstants.js.map +1 -0
  176. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  177. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  178. package/dist/src/ui/utils/highlight.d.ts +10 -0
  179. package/dist/src/ui/utils/highlight.js +41 -0
  180. package/dist/src/ui/utils/highlight.js.map +1 -0
  181. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  182. package/dist/src/ui/utils/highlight.test.js +93 -0
  183. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  184. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  185. package/dist/src/ui/utils/platformConstants.js +26 -1
  186. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  187. package/dist/src/utils/envVarResolver.d.ts +39 -0
  188. package/dist/src/utils/envVarResolver.js +97 -0
  189. package/dist/src/utils/envVarResolver.js.map +1 -0
  190. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  191. package/dist/src/utils/envVarResolver.test.js +221 -0
  192. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  193. package/dist/src/utils/errors.d.ts +9 -0
  194. package/dist/src/utils/errors.js +18 -0
  195. package/dist/src/utils/errors.js.map +1 -0
  196. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  197. package/dist/src/utils/userStartupWarnings.js +1 -1
  198. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  199. package/dist/src/zed-integration/schema.d.ts +398 -398
  200. package/dist/src/zed-integration/zedIntegration.js +11 -7
  201. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  202. package/dist/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +7 -6
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { renderHook, act } from '@testing-library/react';
8
+ import { useLoadingIndicator } from './useLoadingIndicator.js';
9
+ import { StreamingState } from '../types.js';
10
+ import { WITTY_LOADING_PHRASES, PHRASE_CHANGE_INTERVAL_MS, } from './usePhraseCycler.js';
11
+ describe('useLoadingIndicator', () => {
12
+ beforeEach(() => {
13
+ vi.useFakeTimers();
14
+ });
15
+ afterEach(() => {
16
+ vi.useRealTimers(); // Restore real timers after each test
17
+ act(() => vi.runOnlyPendingTimers);
18
+ });
19
+ it('should initialize with default values when Idle', () => {
20
+ const { result } = renderHook(() => useLoadingIndicator(StreamingState.Idle));
21
+ expect(result.current.elapsedTime).toBe(0);
22
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
23
+ });
24
+ it('should reflect values when Responding', async () => {
25
+ const { result } = renderHook(() => useLoadingIndicator(StreamingState.Responding));
26
+ // Initial state before timers advance
27
+ expect(result.current.elapsedTime).toBe(0);
28
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
29
+ await act(async () => {
30
+ await vi.advanceTimersByTimeAsync(PHRASE_CHANGE_INTERVAL_MS + 1);
31
+ });
32
+ // Phrase should cycle if PHRASE_CHANGE_INTERVAL_MS has passed
33
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
34
+ });
35
+ it('should show waiting phrase and retain elapsedTime when WaitingForConfirmation', async () => {
36
+ const { result, rerender } = renderHook(({ streamingState }) => useLoadingIndicator(streamingState), { initialProps: { streamingState: StreamingState.Responding } });
37
+ await act(async () => {
38
+ await vi.advanceTimersByTimeAsync(60000);
39
+ });
40
+ expect(result.current.elapsedTime).toBe(60);
41
+ act(() => {
42
+ rerender({ streamingState: StreamingState.WaitingForConfirmation });
43
+ });
44
+ expect(result.current.currentLoadingPhrase).toBe('Waiting for user confirmation...');
45
+ expect(result.current.elapsedTime).toBe(60); // Elapsed time should be retained
46
+ // Timer should not advance further
47
+ await act(async () => {
48
+ await vi.advanceTimersByTimeAsync(2000);
49
+ });
50
+ expect(result.current.elapsedTime).toBe(60);
51
+ });
52
+ it('should reset elapsedTime and use a witty phrase when transitioning from WaitingForConfirmation to Responding', async () => {
53
+ const { result, rerender } = renderHook(({ streamingState }) => useLoadingIndicator(streamingState), { initialProps: { streamingState: StreamingState.Responding } });
54
+ await act(async () => {
55
+ await vi.advanceTimersByTimeAsync(5000); // 5s
56
+ });
57
+ expect(result.current.elapsedTime).toBe(5);
58
+ act(() => {
59
+ rerender({ streamingState: StreamingState.WaitingForConfirmation });
60
+ });
61
+ expect(result.current.elapsedTime).toBe(5);
62
+ expect(result.current.currentLoadingPhrase).toBe('Waiting for user confirmation...');
63
+ act(() => {
64
+ rerender({ streamingState: StreamingState.Responding });
65
+ });
66
+ expect(result.current.elapsedTime).toBe(0); // Should reset
67
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
68
+ await act(async () => {
69
+ await vi.advanceTimersByTimeAsync(1000);
70
+ });
71
+ expect(result.current.elapsedTime).toBe(1);
72
+ });
73
+ it('should reset timer and phrase when streamingState changes from Responding to Idle', async () => {
74
+ const { result, rerender } = renderHook(({ streamingState }) => useLoadingIndicator(streamingState), { initialProps: { streamingState: StreamingState.Responding } });
75
+ await act(async () => {
76
+ await vi.advanceTimersByTimeAsync(10000); // 10s
77
+ });
78
+ expect(result.current.elapsedTime).toBe(10);
79
+ act(() => {
80
+ rerender({ streamingState: StreamingState.Idle });
81
+ });
82
+ expect(result.current.elapsedTime).toBe(0);
83
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
84
+ // Timer should not advance
85
+ await act(async () => {
86
+ await vi.advanceTimersByTimeAsync(2000);
87
+ });
88
+ expect(result.current.elapsedTime).toBe(0);
89
+ });
90
+ it('should use custom witty phrases when provided', async () => {
91
+ const customPhrases = ['Custom phrase 1', 'Custom phrase 2'];
92
+ const { result } = renderHook(() => useLoadingIndicator(StreamingState.Responding, customPhrases));
93
+ // Should use a custom phrase
94
+ expect(customPhrases).toContain(result.current.currentLoadingPhrase);
95
+ await act(async () => {
96
+ await vi.advanceTimersByTimeAsync(PHRASE_CHANGE_INTERVAL_MS + 1);
97
+ });
98
+ // Should still be using a custom phrase after change
99
+ expect(customPhrases).toContain(result.current.currentLoadingPhrase);
100
+ });
101
+ });
102
+ //# sourceMappingURL=useLoadingIndicator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLoadingIndicator.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useLoadingIndicator.test.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,4 @@ export declare const PHRASE_CHANGE_INTERVAL_MS = 15000;
11
11
  * @param isWaiting Whether to show a specific waiting phrase.
12
12
  * @returns The current loading phrase.
13
13
  */
14
- export declare const usePhraseCycler: (isActive: boolean, isWaiting: boolean) => string;
14
+ export declare const usePhraseCycler: (isActive: boolean, isWaiting: boolean, customPhrases?: string[]) => string;
@@ -33,6 +33,19 @@ export const WITTY_LOADING_PHRASES = [
33
33
  "Looks like somebody's got a case of the Mondays.",
34
34
  'Did you get the memo about the TPS reports?',
35
35
  "It's not that I'm lazy—it's that I just don't care.",
36
+ // René Magritte quotes
37
+ 'An object is not so attached to its name that we cannot find another one that would suit it better.',
38
+ 'If the dream is a translation of waking life, waking life is also a translation of the dream.',
39
+ 'Art evokes the mystery without which the world would not exist',
40
+ 'This is not a pipe.',
41
+ 'We must not fear daylight just because it almost always illuminates a miserable world.',
42
+ // More Salvador Dalí quotes
43
+ 'I am not strange. I am just not normal.',
44
+ 'Take me, I am the drug; take me, I am hallucinogenic',
45
+ // Marcel Duchamp quotes
46
+ 'I force myself to contradict myself in order to avoid conforming to my own taste.',
47
+ // André Breton quotes
48
+ 'It is living and ceasing to live that are imaginary solutions. Existence is elsewhere.',
36
49
  ];
37
50
  export const PHRASE_CHANGE_INTERVAL_MS = 15000; // 15 seconds between phrase changes
38
51
  /**
@@ -41,8 +54,11 @@ export const PHRASE_CHANGE_INTERVAL_MS = 15000; // 15 seconds between phrase cha
41
54
  * @param isWaiting Whether to show a specific waiting phrase.
42
55
  * @returns The current loading phrase.
43
56
  */
44
- export const usePhraseCycler = (isActive, isWaiting) => {
45
- const [currentLoadingPhrase, setCurrentLoadingPhrase] = useState(WITTY_LOADING_PHRASES[0]);
57
+ export const usePhraseCycler = (isActive, isWaiting, customPhrases) => {
58
+ const loadingPhrases = customPhrases && customPhrases.length > 0
59
+ ? customPhrases
60
+ : WITTY_LOADING_PHRASES;
61
+ const [currentLoadingPhrase, setCurrentLoadingPhrase] = useState(loadingPhrases[0]);
46
62
  const phraseIntervalRef = useRef(null);
47
63
  useEffect(() => {
48
64
  if (isWaiting) {
@@ -57,20 +73,12 @@ export const usePhraseCycler = (isActive, isWaiting) => {
57
73
  clearInterval(phraseIntervalRef.current);
58
74
  }
59
75
  // Select an initial random phrase
60
- const initialRandomIndex = Math.floor(Math.random() * WITTY_LOADING_PHRASES.length);
61
- setCurrentLoadingPhrase(WITTY_LOADING_PHRASES[initialRandomIndex]);
76
+ const initialRandomIndex = Math.floor(Math.random() * loadingPhrases.length);
77
+ setCurrentLoadingPhrase(loadingPhrases[initialRandomIndex]);
62
78
  phraseIntervalRef.current = setInterval(() => {
63
- setCurrentLoadingPhrase((prevPhrase) => {
64
- // Pick a new phrase that is different from the previous one (when possible)
65
- let nextPhrase = prevPhrase;
66
- if (WITTY_LOADING_PHRASES.length > 1) {
67
- do {
68
- const randomIndex = Math.floor(Math.random() * WITTY_LOADING_PHRASES.length);
69
- nextPhrase = WITTY_LOADING_PHRASES[randomIndex];
70
- } while (nextPhrase === prevPhrase);
71
- }
72
- return nextPhrase;
73
- });
79
+ // Select a new random phrase
80
+ const randomIndex = Math.floor(Math.random() * loadingPhrases.length);
81
+ setCurrentLoadingPhrase(loadingPhrases[randomIndex]);
74
82
  }, PHRASE_CHANGE_INTERVAL_MS);
75
83
  }
76
84
  else {
@@ -80,7 +88,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
80
88
  clearInterval(phraseIntervalRef.current);
81
89
  phraseIntervalRef.current = null;
82
90
  }
83
- setCurrentLoadingPhrase(WITTY_LOADING_PHRASES[0]);
91
+ setCurrentLoadingPhrase(loadingPhrases[0]);
84
92
  }
85
93
  return () => {
86
94
  if (phraseIntervalRef.current) {
@@ -88,7 +96,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
88
96
  phraseIntervalRef.current = null;
89
97
  }
90
98
  };
91
- }, [isActive, isWaiting]);
99
+ }, [isActive, isWaiting, loadingPhrases]);
92
100
  return currentLoadingPhrase;
93
101
  };
94
102
  //# sourceMappingURL=usePhraseCycler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePhraseCycler.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePhraseCycler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePhraseCycler.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePhraseCycler.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2025 Vybestack LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { Config } from '@vybestack/llxprt-code-core';
6
+ import { type Config } from '@vybestack/llxprt-code-core';
7
7
  export interface PrivacyState {
8
8
  isLoading: boolean;
9
9
  error?: string;
@@ -4,7 +4,19 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { useState, useEffect, useCallback } from 'react';
7
- import { CodeAssistServer, UserTierId, LoggingContentGenerator, } from '@vybestack/llxprt-code-core';
7
+ import { UserTierId,
8
+ // TODO: Re-enable when getCodeAssistServer is exported from core
9
+ // getCodeAssistServer,
10
+ } from '@vybestack/llxprt-code-core';
11
+ // TODO: Remove when getCodeAssistServer is exported from core
12
+ function getCodeAssistServer(config) {
13
+ const contentGenerator = config.getGeminiClient().getContentGenerator();
14
+ // Check if it's a CodeAssistServer
15
+ if (contentGenerator && 'projectId' in contentGenerator) {
16
+ return contentGenerator;
17
+ }
18
+ return undefined;
19
+ }
8
20
  export const usePrivacySettings = (config) => {
9
21
  const [privacyState, setPrivacyState] = useState({
10
22
  isLoading: true,
@@ -15,7 +27,7 @@ export const usePrivacySettings = (config) => {
15
27
  isLoading: true,
16
28
  });
17
29
  try {
18
- const server = getCodeAssistServer(config);
30
+ const server = getCodeAssistServerOrFail(config);
19
31
  const tier = await getTier(server);
20
32
  if (tier !== UserTierId.FREE) {
21
33
  // We don't need to fetch opt-out info since non-free tier
@@ -44,7 +56,7 @@ export const usePrivacySettings = (config) => {
44
56
  }, [config]);
45
57
  const updateDataCollectionOptIn = useCallback(async (optIn) => {
46
58
  try {
47
- const server = getCodeAssistServer(config);
59
+ const server = getCodeAssistServerOrFail(config);
48
60
  const updatedOptIn = await setRemoteDataCollectionOptIn(server, optIn);
49
61
  setPrivacyState({
50
62
  isLoading: false,
@@ -64,18 +76,13 @@ export const usePrivacySettings = (config) => {
64
76
  updateDataCollectionOptIn,
65
77
  };
66
78
  };
67
- function getCodeAssistServer(config) {
68
- let server = config.getGeminiClient().getContentGenerator();
69
- // Unwrap LoggingContentGenerator if present
70
- if (server instanceof LoggingContentGenerator) {
71
- server = server.getWrapped();
72
- }
73
- // Neither of these cases should ever happen.
74
- if (!(server instanceof CodeAssistServer)) {
79
+ function getCodeAssistServerOrFail(config) {
80
+ const server = getCodeAssistServer(config);
81
+ if (server === undefined) {
75
82
  throw new Error('Oauth not being used');
76
83
  }
77
- else if (!server.projectId) {
78
- throw new Error('Oauth not being used');
84
+ else if (server.projectId === undefined) {
85
+ throw new Error('CodeAssist server is missing a project ID');
79
86
  }
80
87
  return server;
81
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePrivacySettings.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePrivacySettings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePrivacySettings.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePrivacySettings.ts"],"names":[],"mappings":"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"}
@@ -5,104 +5,39 @@
5
5
  */
6
6
  import { describe, it, expect, beforeEach, vi } from 'vitest';
7
7
  import { renderHook, waitFor } from '@testing-library/react';
8
- import { CodeAssistServer, LoggingContentGenerator, UserTierId, } from '@vybestack/llxprt-code-core';
8
+ import { UserTierId } from '@vybestack/llxprt-code-core';
9
9
  import { usePrivacySettings } from './usePrivacySettings.js';
10
- // Mock the dependencies
11
- vi.mock('@vybestack/llxprt-code-core', () => {
12
- // Mock classes for instanceof checks
13
- class MockCodeAssistServer {
14
- projectId = 'test-project-id';
15
- loadCodeAssist = vi.fn();
16
- getCodeAssistGlobalUserSetting = vi.fn();
17
- setCodeAssistGlobalUserSetting = vi.fn();
18
- constructor(_client, _projectId, _httpOptions, _sessionId, _userTier) { }
19
- }
20
- class MockLoggingContentGenerator {
21
- getWrapped = vi.fn();
22
- constructor(_wrapped, _config) { }
23
- }
24
- return {
25
- Config: vi.fn(),
26
- CodeAssistServer: MockCodeAssistServer,
27
- LoggingContentGenerator: MockLoggingContentGenerator,
28
- GeminiClient: vi.fn(),
29
- UserTierId: {
30
- FREE: 'free-tier',
31
- LEGACY: 'legacy-tier',
32
- STANDARD: 'standard-tier',
33
- },
34
- };
35
- });
36
10
  describe('usePrivacySettings', () => {
37
- let mockConfig;
38
- let mockClient;
39
- let mockCodeAssistServer;
40
- let mockLoggingContentGenerator;
41
11
  beforeEach(() => {
42
12
  vi.clearAllMocks();
43
- // Create mock CodeAssistServer instance
44
- mockCodeAssistServer = new CodeAssistServer(null, 'test-project-id');
45
- mockCodeAssistServer.loadCodeAssist.mockResolvedValue({
46
- currentTier: { id: UserTierId.FREE },
47
- });
48
- mockCodeAssistServer.getCodeAssistGlobalUserSetting.mockResolvedValue({
49
- freeTierDataCollectionOptin: true,
50
- });
51
- mockCodeAssistServer.setCodeAssistGlobalUserSetting.mockResolvedValue({
52
- freeTierDataCollectionOptin: false,
53
- });
54
- // Create mock LoggingContentGenerator that wraps the CodeAssistServer
55
- mockLoggingContentGenerator = new LoggingContentGenerator(mockCodeAssistServer, null);
56
- mockLoggingContentGenerator.getWrapped.mockReturnValue(mockCodeAssistServer);
57
- // Create mock GeminiClient
58
- mockClient = {
59
- getContentGenerator: vi.fn().mockReturnValue(mockLoggingContentGenerator),
60
- };
61
- // Create mock Config
62
- mockConfig = {
63
- getGeminiClient: vi.fn().mockReturnValue(mockClient),
64
- };
65
- });
66
- it('should handle LoggingContentGenerator wrapper correctly and not throw "Oauth not being used" error', async () => {
67
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
68
- // Initial state should be loading
69
- expect(result.current.privacyState.isLoading).toBe(true);
70
- expect(result.current.privacyState.error).toBeUndefined();
71
- // Wait for the hook to complete
72
- await waitFor(() => {
73
- expect(result.current.privacyState.isLoading).toBe(false);
74
- });
75
- // Should not have the "Oauth not being used" error
76
- expect(result.current.privacyState.error).toBeUndefined();
77
- expect(result.current.privacyState.isFreeTier).toBe(true);
78
- expect(result.current.privacyState.dataCollectionOptIn).toBe(true);
79
- // Verify that getWrapped was called to unwrap the LoggingContentGenerator
80
- expect(mockLoggingContentGenerator.getWrapped).toHaveBeenCalled();
81
13
  });
82
- it('should work with direct CodeAssistServer (no wrapper)', async () => {
83
- // Test case where the content generator is directly a CodeAssistServer
84
- const directServer = new CodeAssistServer(null, 'test-project-id');
85
- directServer.loadCodeAssist.mockResolvedValue({
86
- currentTier: { id: UserTierId.FREE },
87
- });
88
- directServer.getCodeAssistGlobalUserSetting.mockResolvedValue({
89
- freeTierDataCollectionOptin: true,
90
- });
91
- mockClient.getContentGenerator = vi.fn().mockReturnValue(directServer);
92
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
14
+ it('should throw error when content generator is not a CodeAssistServer', async () => {
15
+ // Mock config to return undefined content generator
16
+ const testConfig = {
17
+ getGeminiClient: vi.fn().mockReturnValue({
18
+ getContentGenerator: vi.fn().mockReturnValue(undefined),
19
+ }),
20
+ };
21
+ const { result } = renderHook(() => usePrivacySettings(testConfig));
93
22
  await waitFor(() => {
94
23
  expect(result.current.privacyState.isLoading).toBe(false);
95
24
  });
96
- expect(result.current.privacyState.error).toBeUndefined();
97
- expect(result.current.privacyState.isFreeTier).toBe(true);
98
- expect(result.current.privacyState.dataCollectionOptIn).toBe(true);
25
+ expect(result.current.privacyState.error).toBe('Oauth not being used');
99
26
  });
100
27
  it('should handle paid tier users correctly', async () => {
101
28
  // Mock paid tier response
102
- mockCodeAssistServer.loadCodeAssist.mockResolvedValue({
103
- currentTier: { id: UserTierId.STANDARD },
104
- });
105
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
29
+ const mockCodeAssistServer = {
30
+ projectId: 'test-project-id',
31
+ loadCodeAssist: vi.fn().mockResolvedValue({
32
+ currentTier: { id: UserTierId.STANDARD },
33
+ }),
34
+ };
35
+ const testConfig = {
36
+ getGeminiClient: vi.fn().mockReturnValue({
37
+ getContentGenerator: vi.fn().mockReturnValue(mockCodeAssistServer),
38
+ }),
39
+ };
40
+ const { result } = renderHook(() => usePrivacySettings(testConfig));
106
41
  await waitFor(() => {
107
42
  expect(result.current.privacyState.isLoading).toBe(false);
108
43
  });
@@ -110,31 +45,43 @@ describe('usePrivacySettings', () => {
110
45
  expect(result.current.privacyState.isFreeTier).toBe(false);
111
46
  expect(result.current.privacyState.dataCollectionOptIn).toBeUndefined();
112
47
  });
113
- it('should throw error when content generator is not a CodeAssistServer', async () => {
114
- // Mock a non-CodeAssistServer content generator
115
- const mockOtherGenerator = { someOtherMethod: vi.fn() };
116
- mockLoggingContentGenerator.getWrapped.mockReturnValue(mockOtherGenerator);
117
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
118
- await waitFor(() => {
119
- expect(result.current.privacyState.isLoading).toBe(false);
120
- });
121
- expect(result.current.privacyState.error).toBe('Oauth not being used');
122
- });
123
48
  it('should throw error when CodeAssistServer has no projectId', async () => {
124
- // Mock CodeAssistServer without projectId
125
- const mockServerNoProject = {
126
- ...mockCodeAssistServer,
127
- projectId: undefined,
49
+ const mockCodeAssistServer = {
50
+ projectId: undefined, // Explicitly set projectId to undefined
51
+ loadCodeAssist: vi.fn().mockResolvedValue({
52
+ currentTier: { id: UserTierId.FREE },
53
+ }),
128
54
  };
129
- mockLoggingContentGenerator.getWrapped.mockReturnValue(mockServerNoProject);
130
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
55
+ const testConfig = {
56
+ getGeminiClient: vi.fn().mockReturnValue({
57
+ getContentGenerator: vi.fn().mockReturnValue(mockCodeAssistServer),
58
+ }),
59
+ };
60
+ const { result } = renderHook(() => usePrivacySettings(testConfig));
131
61
  await waitFor(() => {
132
62
  expect(result.current.privacyState.isLoading).toBe(false);
133
63
  });
134
- expect(result.current.privacyState.error).toBe('Oauth not being used');
64
+ expect(result.current.privacyState.error).toBe('CodeAssist server is missing a project ID');
135
65
  });
136
66
  it('should update data collection opt-in setting', async () => {
137
- const { result } = renderHook(() => usePrivacySettings(mockConfig));
67
+ const mockCodeAssistServer = {
68
+ projectId: 'test-project-id',
69
+ getCodeAssistGlobalUserSetting: vi.fn().mockResolvedValue({
70
+ freeTierDataCollectionOptin: true,
71
+ }),
72
+ setCodeAssistGlobalUserSetting: vi.fn().mockResolvedValue({
73
+ freeTierDataCollectionOptin: false,
74
+ }),
75
+ loadCodeAssist: vi.fn().mockResolvedValue({
76
+ currentTier: { id: UserTierId.FREE },
77
+ }),
78
+ };
79
+ const testConfig = {
80
+ getGeminiClient: vi.fn().mockReturnValue({
81
+ getContentGenerator: vi.fn().mockReturnValue(mockCodeAssistServer),
82
+ }),
83
+ };
84
+ const { result } = renderHook(() => usePrivacySettings(testConfig));
138
85
  // Wait for initial load
139
86
  await waitFor(() => {
140
87
  expect(result.current.privacyState.isLoading).toBe(false);
@@ -1 +1 @@
1
- {"version":3,"file":"usePrivacySettings.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePrivacySettings.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePrivacySettings.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePrivacySettings.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,oDAAoD;QACpD,MAAM,UAAU,GAAG;YACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACvC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;aACxD,CAAC;SACkB,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,0BAA0B;QAC1B,MAAM,oBAAoB,GAAG;YAC3B,SAAS,EAAE,iBAAiB;YAC5B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,WAAW,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE;aACf,CAAC;SACE,CAAC;QAEjC,MAAM,UAAU,GAAG;YACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACvC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,CAAC;aACnE,CAAC;SACkB,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,oBAAoB,GAAG;YAC3B,SAAS,EAAE,SAAS,EAAE,wCAAwC;YAC9D,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,WAAW,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE;aACX,CAAC;SACE,CAAC;QAEjC,MAAM,UAAU,GAAG;YACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACvC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,CAAC;aACnE,CAAC;SACkB,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAC5C,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,oBAAoB,GAAG;YAC3B,SAAS,EAAE,iBAAiB;YAC5B,8BAA8B,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxD,2BAA2B,EAAE,IAAI;aAClC,CAAC;YACF,8BAA8B,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxD,2BAA2B,EAAE,KAAK;aACnC,CAAC;YACF,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,WAAW,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE;aACX,CAAC;SACE,CAAC;QAEjC,MAAM,UAAU,GAAG;YACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;gBACvC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,CAAC;aACnE,CAAC;SACkB,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEpE,wBAAwB;QACxB,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAEtD,8BAA8B;QAC9B,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,MAAM,CACJ,oBAAoB,CAAC,8BAA8B,CACpD,CAAC,oBAAoB,CAAC;YACrB,uBAAuB,EAAE,iBAAiB;YAC1C,2BAA2B,EAAE,KAAK;SACnC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}