@google/gemini-cli 0.3.0-preview.3 → 0.4.0-nightly.20250904.e133acd2

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 (178) hide show
  1. package/dist/google-gemini-cli-0.2.2.tgz +0 -0
  2. package/dist/package.json +4 -3
  3. package/dist/src/commands/extensions/enable.js +1 -1
  4. package/dist/src/commands/extensions/enable.js.map +1 -1
  5. package/dist/src/commands/extensions/examples/context/GEMINI.md +8 -0
  6. package/dist/src/commands/extensions/examples/context/gemini-extension.json +5 -0
  7. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  8. package/dist/src/commands/extensions/examples/custom-commands/gemini-extension.json +4 -0
  9. package/dist/src/commands/extensions/examples/exclude-tools/gemini-extension.json +5 -0
  10. package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
  11. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  12. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  13. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  14. package/dist/src/commands/extensions/examples/mcp-server/gemini-extension.json +10 -0
  15. package/dist/src/commands/extensions/install.js +35 -7
  16. package/dist/src/commands/extensions/install.js.map +1 -1
  17. package/dist/src/commands/extensions/install.test.js +20 -2
  18. package/dist/src/commands/extensions/install.test.js.map +1 -1
  19. package/dist/src/commands/extensions/link.d.ts +12 -0
  20. package/dist/src/commands/extensions/link.js +37 -0
  21. package/dist/src/commands/extensions/link.js.map +1 -0
  22. package/dist/src/commands/extensions/new.d.ts +7 -0
  23. package/dist/src/commands/extensions/new.js +70 -0
  24. package/dist/src/commands/extensions/new.js.map +1 -0
  25. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  26. package/dist/src/commands/extensions/new.test.js +50 -0
  27. package/dist/src/commands/extensions/new.test.js.map +1 -0
  28. package/dist/src/commands/extensions/update.d.ts +2 -1
  29. package/dist/src/commands/extensions/update.js +36 -15
  30. package/dist/src/commands/extensions/update.js.map +1 -1
  31. package/dist/src/commands/extensions.js +4 -0
  32. package/dist/src/commands/extensions.js.map +1 -1
  33. package/dist/src/commands/mcp/add.js +1 -1
  34. package/dist/src/commands/mcp/add.js.map +1 -1
  35. package/dist/src/commands/mcp/list.js +2 -2
  36. package/dist/src/commands/mcp/list.js.map +1 -1
  37. package/dist/src/commands/mcp/remove.js +1 -1
  38. package/dist/src/commands/mcp/remove.js.map +1 -1
  39. package/dist/src/config/auth.d.ts +1 -1
  40. package/dist/src/config/auth.js +4 -4
  41. package/dist/src/config/auth.js.map +1 -1
  42. package/dist/src/config/auth.test.js +15 -7
  43. package/dist/src/config/auth.test.js.map +1 -1
  44. package/dist/src/config/config.d.ts +4 -1
  45. package/dist/src/config/config.js +32 -18
  46. package/dist/src/config/config.js.map +1 -1
  47. package/dist/src/config/extension.d.ts +7 -4
  48. package/dist/src/config/extension.js +76 -24
  49. package/dist/src/config/extension.js.map +1 -1
  50. package/dist/src/config/keyBindings.d.ts +1 -0
  51. package/dist/src/config/keyBindings.js +6 -25
  52. package/dist/src/config/keyBindings.js.map +1 -1
  53. package/dist/src/config/settings.d.ts +3 -4
  54. package/dist/src/config/settings.js +28 -84
  55. package/dist/src/config/settings.js.map +1 -1
  56. package/dist/src/config/settingsSchema.d.ts +101 -13
  57. package/dist/src/config/settingsSchema.js +96 -13
  58. package/dist/src/config/settingsSchema.js.map +1 -1
  59. package/dist/src/config/trustedFolders.d.ts +12 -2
  60. package/dist/src/config/trustedFolders.js +59 -40
  61. package/dist/src/config/trustedFolders.js.map +1 -1
  62. package/dist/src/config/trustedFolders.test.js +81 -2
  63. package/dist/src/config/trustedFolders.test.js.map +1 -1
  64. package/dist/src/gemini.d.ts +1 -1
  65. package/dist/src/gemini.js +53 -23
  66. package/dist/src/gemini.js.map +1 -1
  67. package/dist/src/gemini.test.js +2 -30
  68. package/dist/src/gemini.test.js.map +1 -1
  69. package/dist/src/generated/git-commit.d.ts +2 -2
  70. package/dist/src/generated/git-commit.js +2 -2
  71. package/dist/src/generated/git-commit.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 +100 -45
  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.js +8 -2
  82. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  83. package/dist/src/ui/components/AuthDialog.test.js +41 -10
  84. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  85. package/dist/src/ui/components/FolderTrustDialog.js +3 -1
  86. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  87. package/dist/src/ui/components/FolderTrustDialog.test.js +19 -4
  88. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  89. package/dist/src/ui/components/Footer.d.ts +3 -0
  90. package/dist/src/ui/components/Footer.js +4 -3
  91. package/dist/src/ui/components/Footer.js.map +1 -1
  92. package/dist/src/ui/components/InputPrompt.js +34 -24
  93. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  94. package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
  95. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  96. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  97. package/dist/src/ui/components/ProQuotaDialog.js +21 -0
  98. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  99. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  100. package/dist/src/ui/components/ProQuotaDialog.test.js +56 -0
  101. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  102. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  103. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  104. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  105. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  106. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  107. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  108. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  109. package/dist/src/ui/components/shared/text-buffer.js +35 -51
  110. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  111. package/dist/src/ui/contexts/KeypressContext.js +255 -42
  112. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  113. package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
  114. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  115. package/dist/src/ui/hooks/slashCommandProcessor.js +2 -2
  116. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  117. package/dist/src/ui/hooks/useFolderTrust.js +6 -4
  118. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  119. package/dist/src/ui/hooks/useGeminiStream.d.ts +3 -2
  120. package/dist/src/ui/hooks/useGeminiStream.js +28 -3
  121. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  122. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
  123. package/dist/src/ui/hooks/useIdeTrustListener.js +34 -0
  124. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  125. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  126. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  127. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  128. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  129. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  130. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  131. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  132. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  133. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  134. package/dist/src/ui/hooks/useLoadingIndicator.test.js +2 -2
  135. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
  136. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  137. package/dist/src/ui/hooks/usePhraseCycler.js +11 -8
  138. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  139. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  140. package/dist/src/ui/hooks/usePrivacySettings.js +8 -13
  141. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  142. package/dist/src/ui/hooks/usePrivacySettings.test.js +33 -97
  143. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  144. package/dist/src/ui/hooks/useSlashCompletion.js +263 -67
  145. package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
  146. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +4 -1
  147. package/dist/src/ui/hooks/useSlashCompletion.test.js +452 -59
  148. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
  149. package/dist/src/ui/hooks/useToolScheduler.test.js +57 -59
  150. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  151. package/dist/src/ui/keyMatchers.test.js +9 -0
  152. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  153. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  154. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  155. package/dist/src/ui/utils/highlight.d.ts +10 -0
  156. package/dist/src/ui/utils/highlight.js +41 -0
  157. package/dist/src/ui/utils/highlight.js.map +1 -0
  158. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  159. package/dist/src/ui/utils/highlight.test.js +93 -0
  160. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  161. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  162. package/dist/src/ui/utils/platformConstants.js +26 -1
  163. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  164. package/dist/src/utils/envVarResolver.d.ts +39 -0
  165. package/dist/src/utils/envVarResolver.js +97 -0
  166. package/dist/src/utils/envVarResolver.js.map +1 -0
  167. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  168. package/dist/src/utils/envVarResolver.test.js +221 -0
  169. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  170. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  171. package/dist/src/utils/userStartupWarnings.js +1 -1
  172. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  173. package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
  174. package/dist/src/validateNonInterActiveAuth.js +11 -2
  175. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  176. package/dist/tsconfig.tsbuildinfo +1 -1
  177. package/package.json +5 -4
  178. package/dist/google-gemini-cli-0.3.0-preview.2.tgz +0 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useCallback, useEffect, useState, useSyncExternalStore } from 'react';
7
+ import { ideContext } from '@google/gemini-cli-core';
8
+ /**
9
+ * This hook listens for trust status updates from the IDE companion extension.
10
+ * It provides the current trust status from the IDE and a flag indicating
11
+ * if a restart is needed because the trust state has changed.
12
+ */
13
+ export function useIdeTrustListener(config) {
14
+ const subscribe = useCallback((onStoreChange) => {
15
+ const ideClient = config.getIdeClient();
16
+ ideClient.addTrustChangeListener(onStoreChange);
17
+ return () => {
18
+ ideClient.removeTrustChangeListener(onStoreChange);
19
+ };
20
+ }, [config]);
21
+ const getSnapshot = () => ideContext.getIdeContext()?.workspaceState?.isTrusted;
22
+ const isIdeTrusted = useSyncExternalStore(subscribe, getSnapshot);
23
+ const [needsRestart, setNeedsRestart] = useState(false);
24
+ const [initialTrustValue] = useState(isIdeTrusted);
25
+ useEffect(() => {
26
+ if (!needsRestart &&
27
+ initialTrustValue !== undefined &&
28
+ initialTrustValue !== isIdeTrusted) {
29
+ setNeedsRestart(true);
30
+ }
31
+ }, [isIdeTrusted, initialTrustValue, needsRestart]);
32
+ return { isIdeTrusted, needsRestart };
33
+ }
34
+ //# sourceMappingURL=useIdeTrustListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIdeTrustListener.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useIdeTrustListener.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,aAAyB,EAAE,EAAE;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,SAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,UAAU,CAAC,aAAa,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC;IAExD,MAAM,YAAY,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAElE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,IACE,CAAC,YAAY;YACb,iBAAiB,KAAK,SAAS;YAC/B,iBAAiB,KAAK,YAAY,EAClC,CAAC;YACD,eAAe,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ interface Logger {
7
+ getPreviousUserMessages(): Promise<string[]>;
8
+ }
9
+ export interface UseInputHistoryStoreReturn {
10
+ inputHistory: string[];
11
+ addInput: (input: string) => void;
12
+ initializeFromLogger: (logger: Logger | null) => Promise<void>;
13
+ }
14
+ /**
15
+ * Hook for independently managing input history.
16
+ * Completely separated from chat history and unaffected by /clear commands.
17
+ */
18
+ export declare function useInputHistoryStore(): UseInputHistoryStoreReturn;
19
+ export {};
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useState, useCallback } from 'react';
7
+ /**
8
+ * Hook for independently managing input history.
9
+ * Completely separated from chat history and unaffected by /clear commands.
10
+ */
11
+ export function useInputHistoryStore() {
12
+ const [inputHistory, setInputHistory] = useState([]);
13
+ const [_pastSessionMessages, setPastSessionMessages] = useState([]);
14
+ const [_currentSessionMessages, setCurrentSessionMessages] = useState([]);
15
+ const [isInitialized, setIsInitialized] = useState(false);
16
+ /**
17
+ * Recalculate the complete input history from past and current sessions.
18
+ * Applies the same deduplication logic as the previous implementation.
19
+ */
20
+ const recalculateHistory = useCallback((currentSession, pastSession) => {
21
+ // Combine current session (newest first) + past session (newest first)
22
+ const combinedMessages = [...currentSession, ...pastSession];
23
+ // Deduplicate consecutive identical messages (same algorithm as before)
24
+ const deduplicatedMessages = [];
25
+ if (combinedMessages.length > 0) {
26
+ deduplicatedMessages.push(combinedMessages[0]); // Add the newest one unconditionally
27
+ for (let i = 1; i < combinedMessages.length; i++) {
28
+ if (combinedMessages[i] !== combinedMessages[i - 1]) {
29
+ deduplicatedMessages.push(combinedMessages[i]);
30
+ }
31
+ }
32
+ }
33
+ // Reverse to oldest first for useInputHistory
34
+ setInputHistory(deduplicatedMessages.reverse());
35
+ }, []);
36
+ /**
37
+ * Initialize input history from logger with past session data.
38
+ * Executed only once at app startup.
39
+ */
40
+ const initializeFromLogger = useCallback(async (logger) => {
41
+ if (isInitialized || !logger)
42
+ return;
43
+ try {
44
+ const pastMessages = (await logger.getPreviousUserMessages()) || [];
45
+ setPastSessionMessages(pastMessages); // Store as newest first
46
+ recalculateHistory([], pastMessages);
47
+ setIsInitialized(true);
48
+ }
49
+ catch (error) {
50
+ // Start with empty history even if logger initialization fails
51
+ console.warn('Failed to initialize input history from logger:', error);
52
+ setPastSessionMessages([]);
53
+ recalculateHistory([], []);
54
+ setIsInitialized(true);
55
+ }
56
+ }, [isInitialized, recalculateHistory]);
57
+ /**
58
+ * Add new input to history.
59
+ * Recalculates the entire history with deduplication.
60
+ */
61
+ const addInput = useCallback((input) => {
62
+ const trimmedInput = input.trim();
63
+ if (!trimmedInput)
64
+ return; // Filter empty/whitespace-only inputs
65
+ setCurrentSessionMessages((prevCurrent) => {
66
+ const newCurrentSession = [...prevCurrent, trimmedInput];
67
+ setPastSessionMessages((prevPast) => {
68
+ recalculateHistory(newCurrentSession.slice().reverse(), // Convert to newest first
69
+ prevPast);
70
+ return prevPast; // No change to past messages
71
+ });
72
+ return newCurrentSession;
73
+ });
74
+ }, [recalculateHistory]);
75
+ return {
76
+ inputHistory,
77
+ addInput,
78
+ initializeFromLogger,
79
+ };
80
+ }
81
+ //# sourceMappingURL=useInputHistoryStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputHistoryStore.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useInputHistoryStore.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,234 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { act, renderHook } from '@testing-library/react';
7
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
8
+ import { useInputHistoryStore } from './useInputHistoryStore.js';
9
+ describe('useInputHistoryStore', () => {
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ });
13
+ it('should initialize with empty input history', () => {
14
+ const { result } = renderHook(() => useInputHistoryStore());
15
+ expect(result.current.inputHistory).toEqual([]);
16
+ });
17
+ it('should add input to history', () => {
18
+ const { result } = renderHook(() => useInputHistoryStore());
19
+ act(() => {
20
+ result.current.addInput('test message 1');
21
+ });
22
+ expect(result.current.inputHistory).toEqual(['test message 1']);
23
+ act(() => {
24
+ result.current.addInput('test message 2');
25
+ });
26
+ expect(result.current.inputHistory).toEqual([
27
+ 'test message 1',
28
+ 'test message 2',
29
+ ]);
30
+ });
31
+ it('should not add empty or whitespace-only inputs', () => {
32
+ const { result } = renderHook(() => useInputHistoryStore());
33
+ act(() => {
34
+ result.current.addInput('');
35
+ });
36
+ expect(result.current.inputHistory).toEqual([]);
37
+ act(() => {
38
+ result.current.addInput(' ');
39
+ });
40
+ expect(result.current.inputHistory).toEqual([]);
41
+ });
42
+ it('should deduplicate consecutive identical messages', () => {
43
+ const { result } = renderHook(() => useInputHistoryStore());
44
+ act(() => {
45
+ result.current.addInput('test message');
46
+ });
47
+ act(() => {
48
+ result.current.addInput('test message'); // Same as previous
49
+ });
50
+ expect(result.current.inputHistory).toEqual(['test message']);
51
+ act(() => {
52
+ result.current.addInput('different message');
53
+ });
54
+ act(() => {
55
+ result.current.addInput('test message'); // Same as first, but not consecutive
56
+ });
57
+ expect(result.current.inputHistory).toEqual([
58
+ 'test message',
59
+ 'different message',
60
+ 'test message',
61
+ ]);
62
+ });
63
+ it('should initialize from logger successfully', async () => {
64
+ const mockLogger = {
65
+ getPreviousUserMessages: vi
66
+ .fn()
67
+ .mockResolvedValue(['newest', 'middle', 'oldest']),
68
+ };
69
+ const { result } = renderHook(() => useInputHistoryStore());
70
+ await act(async () => {
71
+ await result.current.initializeFromLogger(mockLogger);
72
+ });
73
+ // Should reverse the order to oldest first
74
+ expect(result.current.inputHistory).toEqual(['oldest', 'middle', 'newest']);
75
+ expect(mockLogger.getPreviousUserMessages).toHaveBeenCalledTimes(1);
76
+ });
77
+ it('should handle logger initialization failure gracefully', async () => {
78
+ const mockLogger = {
79
+ getPreviousUserMessages: vi
80
+ .fn()
81
+ .mockRejectedValue(new Error('Logger error')),
82
+ };
83
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
84
+ const { result } = renderHook(() => useInputHistoryStore());
85
+ await act(async () => {
86
+ await result.current.initializeFromLogger(mockLogger);
87
+ });
88
+ expect(result.current.inputHistory).toEqual([]);
89
+ expect(consoleSpy).toHaveBeenCalledWith('Failed to initialize input history from logger:', expect.any(Error));
90
+ consoleSpy.mockRestore();
91
+ });
92
+ it('should initialize only once', async () => {
93
+ const mockLogger = {
94
+ getPreviousUserMessages: vi
95
+ .fn()
96
+ .mockResolvedValue(['message1', 'message2']),
97
+ };
98
+ const { result } = renderHook(() => useInputHistoryStore());
99
+ // Call initializeFromLogger twice
100
+ await act(async () => {
101
+ await result.current.initializeFromLogger(mockLogger);
102
+ });
103
+ await act(async () => {
104
+ await result.current.initializeFromLogger(mockLogger);
105
+ });
106
+ // Should be called only once
107
+ expect(mockLogger.getPreviousUserMessages).toHaveBeenCalledTimes(1);
108
+ expect(result.current.inputHistory).toEqual(['message2', 'message1']);
109
+ });
110
+ it('should handle null logger gracefully', async () => {
111
+ const { result } = renderHook(() => useInputHistoryStore());
112
+ await act(async () => {
113
+ await result.current.initializeFromLogger(null);
114
+ });
115
+ expect(result.current.inputHistory).toEqual([]);
116
+ });
117
+ it('should trim input before adding to history', () => {
118
+ const { result } = renderHook(() => useInputHistoryStore());
119
+ act(() => {
120
+ result.current.addInput(' test message ');
121
+ });
122
+ expect(result.current.inputHistory).toEqual(['test message']);
123
+ });
124
+ describe('deduplication logic from previous implementation', () => {
125
+ it('should deduplicate consecutive messages from past sessions during initialization', async () => {
126
+ const mockLogger = {
127
+ getPreviousUserMessages: vi
128
+ .fn()
129
+ .mockResolvedValue([
130
+ 'message1',
131
+ 'message1',
132
+ 'message2',
133
+ 'message2',
134
+ 'message3',
135
+ ]), // newest first with duplicates
136
+ };
137
+ const { result } = renderHook(() => useInputHistoryStore());
138
+ await act(async () => {
139
+ await result.current.initializeFromLogger(mockLogger);
140
+ });
141
+ // Should deduplicate consecutive messages and reverse to oldest first
142
+ expect(result.current.inputHistory).toEqual([
143
+ 'message3',
144
+ 'message2',
145
+ 'message1',
146
+ ]);
147
+ });
148
+ it('should deduplicate across session boundaries', async () => {
149
+ const mockLogger = {
150
+ getPreviousUserMessages: vi.fn().mockResolvedValue(['old2', 'old1']), // newest first
151
+ };
152
+ const { result } = renderHook(() => useInputHistoryStore());
153
+ // Initialize with past session
154
+ await act(async () => {
155
+ await result.current.initializeFromLogger(mockLogger);
156
+ });
157
+ // Add current session inputs
158
+ act(() => {
159
+ result.current.addInput('old2'); // Same as last past session message
160
+ });
161
+ // Should deduplicate across session boundary
162
+ expect(result.current.inputHistory).toEqual(['old1', 'old2']);
163
+ act(() => {
164
+ result.current.addInput('new1');
165
+ });
166
+ expect(result.current.inputHistory).toEqual(['old1', 'old2', 'new1']);
167
+ });
168
+ it('should preserve non-consecutive duplicates', async () => {
169
+ const mockLogger = {
170
+ getPreviousUserMessages: vi
171
+ .fn()
172
+ .mockResolvedValue(['message2', 'message1', 'message2']), // newest first with non-consecutive duplicate
173
+ };
174
+ const { result } = renderHook(() => useInputHistoryStore());
175
+ await act(async () => {
176
+ await result.current.initializeFromLogger(mockLogger);
177
+ });
178
+ // Non-consecutive duplicates should be preserved
179
+ expect(result.current.inputHistory).toEqual([
180
+ 'message2',
181
+ 'message1',
182
+ 'message2',
183
+ ]);
184
+ });
185
+ it('should handle complex deduplication with current session', () => {
186
+ const { result } = renderHook(() => useInputHistoryStore());
187
+ // Add multiple messages with duplicates
188
+ act(() => {
189
+ result.current.addInput('hello');
190
+ });
191
+ act(() => {
192
+ result.current.addInput('hello'); // consecutive duplicate
193
+ });
194
+ act(() => {
195
+ result.current.addInput('world');
196
+ });
197
+ act(() => {
198
+ result.current.addInput('world'); // consecutive duplicate
199
+ });
200
+ act(() => {
201
+ result.current.addInput('hello'); // non-consecutive duplicate
202
+ });
203
+ // Should have deduplicated consecutive ones
204
+ expect(result.current.inputHistory).toEqual(['hello', 'world', 'hello']);
205
+ });
206
+ it('should maintain oldest-first order in final output', async () => {
207
+ const mockLogger = {
208
+ getPreviousUserMessages: vi
209
+ .fn()
210
+ .mockResolvedValue(['newest', 'middle', 'oldest']), // newest first
211
+ };
212
+ const { result } = renderHook(() => useInputHistoryStore());
213
+ await act(async () => {
214
+ await result.current.initializeFromLogger(mockLogger);
215
+ });
216
+ // Add current session messages
217
+ act(() => {
218
+ result.current.addInput('current1');
219
+ });
220
+ act(() => {
221
+ result.current.addInput('current2');
222
+ });
223
+ // Should maintain oldest-first order
224
+ expect(result.current.inputHistory).toEqual([
225
+ 'oldest',
226
+ 'middle',
227
+ 'newest',
228
+ 'current1',
229
+ 'current2',
230
+ ]);
231
+ });
232
+ });
233
+ });
234
+ //# sourceMappingURL=useInputHistoryStore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputHistoryStore.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useInputHistoryStore.test.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { StreamingState } from '../types.js';
7
- export declare const useLoadingIndicator: (streamingState: StreamingState) => {
7
+ export declare const useLoadingIndicator: (streamingState: StreamingState, customWittyPhrases?: string[]) => {
8
8
  elapsedTime: number;
9
9
  currentLoadingPhrase: string;
10
10
  };
@@ -7,13 +7,13 @@ import { StreamingState } from '../types.js';
7
7
  import { useTimer } from './useTimer.js';
8
8
  import { usePhraseCycler } from './usePhraseCycler.js';
9
9
  import { useState, useEffect, useRef } from 'react'; // Added useRef
10
- export const useLoadingIndicator = (streamingState) => {
10
+ export const useLoadingIndicator = (streamingState, customWittyPhrases) => {
11
11
  const [timerResetKey, setTimerResetKey] = useState(0);
12
12
  const isTimerActive = streamingState === StreamingState.Responding;
13
13
  const elapsedTimeFromTimer = useTimer(isTimerActive, timerResetKey);
14
14
  const isPhraseCyclingActive = streamingState === StreamingState.Responding;
15
15
  const isWaiting = streamingState === StreamingState.WaitingForConfirmation;
16
- const currentLoadingPhrase = usePhraseCycler(isPhraseCyclingActive, isWaiting);
16
+ const currentLoadingPhrase = usePhraseCycler(isPhraseCyclingActive, isWaiting, customWittyPhrases);
17
17
  const [retainedElapsedTime, setRetainedElapsedTime] = useState(0);
18
18
  const prevStreamingStateRef = useRef(null);
19
19
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadingIndicator.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useLoadingIndicator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,eAAe;AAEpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAA8B,EAAE,EAAE;IACpE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,cAAc,KAAK,cAAc,CAAC,UAAU,CAAC;IAEnE,MAAM,oBAAoB,GAAG,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAEpE,MAAM,qBAAqB,GAAG,cAAc,KAAK,cAAc,CAAC,UAAU,CAAC;IAC3E,MAAM,SAAS,GAAG,cAAc,KAAK,cAAc,CAAC,sBAAsB,CAAC;IAC3E,MAAM,oBAAoB,GAAG,eAAe,CAC1C,qBAAqB,EACrB,SAAS,CACV,CAAC;IAEF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,qBAAqB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAElE,SAAS,CAAC,GAAG,EAAE;QACb,IACE,qBAAqB,CAAC,OAAO,KAAK,cAAc,CAAC,sBAAsB;YACvE,cAAc,KAAK,cAAc,CAAC,UAAU,EAC5C,CAAC;YACD,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3C,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,oDAAoD;QACjF,CAAC;aAAM,IACL,cAAc,KAAK,cAAc,CAAC,IAAI;YACtC,qBAAqB,CAAC,OAAO,KAAK,cAAc,CAAC,UAAU,EAC3D,CAAC;YACD,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,iDAAiD;YAC7F,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,cAAc,KAAK,cAAc,CAAC,sBAAsB,EAAE,CAAC;YACpE,wDAAwD;YACxD,kFAAkF;YAClF,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;QAC/C,CAAC;QAED,qBAAqB,CAAC,OAAO,GAAG,cAAc,CAAC;IACjD,CAAC,EAAE,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,WAAW,EACT,cAAc,KAAK,cAAc,CAAC,sBAAsB;YACtD,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,oBAAoB;QAC1B,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"useLoadingIndicator.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useLoadingIndicator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,eAAe;AAEpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,cAA8B,EAC9B,kBAA6B,EAC7B,EAAE;IACF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,cAAc,KAAK,cAAc,CAAC,UAAU,CAAC;IAEnE,MAAM,oBAAoB,GAAG,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAEpE,MAAM,qBAAqB,GAAG,cAAc,KAAK,cAAc,CAAC,UAAU,CAAC;IAC3E,MAAM,SAAS,GAAG,cAAc,KAAK,cAAc,CAAC,sBAAsB,CAAC;IAC3E,MAAM,oBAAoB,GAAG,eAAe,CAC1C,qBAAqB,EACrB,SAAS,EACT,kBAAkB,CACnB,CAAC;IAEF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,qBAAqB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAElE,SAAS,CAAC,GAAG,EAAE;QACb,IACE,qBAAqB,CAAC,OAAO,KAAK,cAAc,CAAC,sBAAsB;YACvE,cAAc,KAAK,cAAc,CAAC,UAAU,EAC5C,CAAC;YACD,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3C,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,oDAAoD;QACjF,CAAC;aAAM,IACL,cAAc,KAAK,cAAc,CAAC,IAAI;YACtC,qBAAqB,CAAC,OAAO,KAAK,cAAc,CAAC,UAAU,EAC3D,CAAC;YACD,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,iDAAiD;YAC7F,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,cAAc,KAAK,cAAc,CAAC,sBAAsB,EAAE,CAAC;YACpE,wDAAwD;YACxD,kFAAkF;YAClF,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;QAC/C,CAAC;QAED,qBAAqB,CAAC,OAAO,GAAG,cAAc,CAAC;IACjD,CAAC,EAAE,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAE3C,OAAO;QACL,WAAW,EACT,cAAc,KAAK,cAAc,CAAC,sBAAsB;YACtD,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,oBAAoB;QAC1B,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC"}
@@ -19,7 +19,7 @@ describe('useLoadingIndicator', () => {
19
19
  it('should initialize with default values when Idle', () => {
20
20
  const { result } = renderHook(() => useLoadingIndicator(StreamingState.Idle));
21
21
  expect(result.current.elapsedTime).toBe(0);
22
- expect(result.current.currentLoadingPhrase).toBe(WITTY_LOADING_PHRASES[0]);
22
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
23
23
  });
24
24
  it('should reflect values when Responding', async () => {
25
25
  const { result } = renderHook(() => useLoadingIndicator(StreamingState.Responding));
@@ -80,7 +80,7 @@ describe('useLoadingIndicator', () => {
80
80
  rerender({ streamingState: StreamingState.Idle });
81
81
  });
82
82
  expect(result.current.elapsedTime).toBe(0);
83
- expect(result.current.currentLoadingPhrase).toBe(WITTY_LOADING_PHRASES[0]);
83
+ expect(WITTY_LOADING_PHRASES).toContain(result.current.currentLoadingPhrase);
84
84
  // Timer should not advance
85
85
  await act(async () => {
86
86
  await vi.advanceTimersByTimeAsync(2000);
@@ -1 +1 @@
1
- {"version":3,"file":"useLoadingIndicator.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useLoadingIndicator.test.ts"],"names":[],"mappings":"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"}
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;
@@ -142,8 +142,11 @@ export const PHRASE_CHANGE_INTERVAL_MS = 15000;
142
142
  * @param isWaiting Whether to show a specific waiting phrase.
143
143
  * @returns The current loading phrase.
144
144
  */
145
- export const usePhraseCycler = (isActive, isWaiting) => {
146
- const [currentLoadingPhrase, setCurrentLoadingPhrase] = useState(WITTY_LOADING_PHRASES[0]);
145
+ export const usePhraseCycler = (isActive, isWaiting, customPhrases) => {
146
+ const loadingPhrases = customPhrases && customPhrases.length > 0
147
+ ? customPhrases
148
+ : WITTY_LOADING_PHRASES;
149
+ const [currentLoadingPhrase, setCurrentLoadingPhrase] = useState(loadingPhrases[0]);
147
150
  const phraseIntervalRef = useRef(null);
148
151
  useEffect(() => {
149
152
  if (isWaiting) {
@@ -158,12 +161,12 @@ export const usePhraseCycler = (isActive, isWaiting) => {
158
161
  clearInterval(phraseIntervalRef.current);
159
162
  }
160
163
  // Select an initial random phrase
161
- const initialRandomIndex = Math.floor(Math.random() * WITTY_LOADING_PHRASES.length);
162
- setCurrentLoadingPhrase(WITTY_LOADING_PHRASES[initialRandomIndex]);
164
+ const initialRandomIndex = Math.floor(Math.random() * loadingPhrases.length);
165
+ setCurrentLoadingPhrase(loadingPhrases[initialRandomIndex]);
163
166
  phraseIntervalRef.current = setInterval(() => {
164
167
  // Select a new random phrase
165
- const randomIndex = Math.floor(Math.random() * WITTY_LOADING_PHRASES.length);
166
- setCurrentLoadingPhrase(WITTY_LOADING_PHRASES[randomIndex]);
168
+ const randomIndex = Math.floor(Math.random() * loadingPhrases.length);
169
+ setCurrentLoadingPhrase(loadingPhrases[randomIndex]);
167
170
  }, PHRASE_CHANGE_INTERVAL_MS);
168
171
  }
169
172
  else {
@@ -173,7 +176,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
173
176
  clearInterval(phraseIntervalRef.current);
174
177
  phraseIntervalRef.current = null;
175
178
  }
176
- setCurrentLoadingPhrase(WITTY_LOADING_PHRASES[0]);
179
+ setCurrentLoadingPhrase(loadingPhrases[0]);
177
180
  }
178
181
  return () => {
179
182
  if (phraseIntervalRef.current) {
@@ -181,7 +184,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
181
184
  phraseIntervalRef.current = null;
182
185
  }
183
186
  };
184
- }, [isActive, isWaiting]);
187
+ }, [isActive, isWaiting, loadingPhrases]);
185
188
  return currentLoadingPhrase;
186
189
  };
187
190
  //# sourceMappingURL=usePhraseCycler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePhraseCycler.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePhraseCycler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEpD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mBAAmB;IACnB,0BAA0B;IAC1B,gCAAgC;IAChC,8BAA8B;IAC9B,mCAAmC;IACnC,yBAAyB;IACzB,+BAA+B;IAC/B,iCAAiC;IACjC,4BAA4B;IAC5B,6BAA6B;IAC7B,uCAAuC;IACvC,wBAAwB;IACxB,uBAAuB;IACvB,kCAAkC;IAClC,+CAA+C;IAC/C,iCAAiC;IACjC,yBAAyB;IACzB,2BAA2B;IAC3B,yBAAyB;IACzB,oBAAoB;IACpB,kCAAkC;IAClC,+BAA+B;IAC/B,sCAAsC;IACtC,4BAA4B;IAC5B,kCAAkC;IAClC,gDAAgD;IAChD,4BAA4B;IAC5B,qDAAqD;IACrD,oDAAoD;IACpD,+BAA+B;IAC/B,8CAA8C;IAC9C,gCAAgC;IAChC,0CAA0C;IAC1C,wCAAwC;IACxC,6BAA6B;IAC7B,gCAAgC;IAChC,oCAAoC;IACpC,0BAA0B;IAC1B,sCAAsC;IACtC,qCAAqC;IACrC,4BAA4B;IAC5B,mCAAmC;IACnC,qCAAqC;IACrC,yBAAyB;IACzB,4CAA4C;IAC5C,kBAAkB;IAClB,gCAAgC;IAChC,mCAAmC;IACnC,4CAA4C;IAC5C,sCAAsC;IACtC,2CAA2C;IAC3C,6CAA6C;IAC7C,2CAA2C;IAC3C,yCAAyC;IACzC,6CAA6C;IAC7C,uBAAuB;IACvB,uCAAuC;IACvC,gBAAgB;IAChB,+BAA+B;IAC/B,sCAAsC;IACtC,6BAA6B;IAC7B,8BAA8B;IAC9B,4BAA4B;IAC5B,qDAAqD;IACrD,mDAAmD;IACnD,gDAAgD;IAChD,8CAA8C;IAC9C,6BAA6B;IAC7B,yBAAyB;IACzB,yBAAyB;IACzB,0CAA0C;IAC1C,2CAA2C;IAC3C,6BAA6B;IAC7B,iDAAiD;IACjD,oCAAoC;IACpC,oBAAoB;IACpB,wBAAwB;IACxB,sDAAsD;IACtD,sBAAsB;IACtB,4BAA4B;IAC5B,gDAAgD;IAChD,iDAAiD;IACjD,uCAAuC;IACvC,oBAAoB;IACpB,uCAAuC;IACvC,6CAA6C;IAC7C,yBAAyB;IACzB,gDAAgD;IAChD,8DAA8D;IAC9D,4DAA4D;IAC5D,qEAAqE;IACrE,yEAAyE;IACzE,kEAAkE;IAClE,oCAAoC;IACpC,8CAA8C;IAC9C,oDAAoD;IACpD,+CAA+C;IAC/C,uBAAuB;IACvB,kCAAkC;IAClC,mDAAmD;IACnD,SAAS;IACT,iCAAiC;IACjC,iCAAiC;IACjC,sCAAsC;IACtC,kCAAkC;IAClC,wCAAwC;IACxC,sBAAsB;IACtB,yFAAyF;IACzF,+BAA+B;IAC/B,iDAAiD;IACjD,6DAA6D;IAC7D,gCAAgC;IAChC,mCAAmC;IACnC,uDAAuD;IACvD,yBAAyB;IACzB,8CAA8C;IAC9C,uDAAuD;IACvD,4CAA4C;IAC5C,2CAA2C;IAC3C,oDAAoD;IACpD,gDAAgD;IAChD,kCAAkC;IAClC,0CAA0C;IAC1C,gEAAgE;IAChE,0CAA0C;IAC1C,2DAA2D;IAC3D,2EAA2E;IAC3E,mCAAmC;IACnC,0BAA0B;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAiB,EAAE,SAAkB,EAAE,EAAE;IACvE,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAC9D,qBAAqB,CAAC,CAAC,CAAC,CACzB,CAAC;IACF,MAAM,iBAAiB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,EAAE,CAAC;YACd,uBAAuB,CAAC,kCAAkC,CAAC,CAAC;YAC5D,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACzC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,kCAAkC;YAClC,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAC7C,CAAC;YACF,uBAAuB,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAEnE,iBAAiB,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC3C,6BAA6B;gBAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAI,CAAC,MAAM,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAC7C,CAAC;gBACF,uBAAuB,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9D,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,uDAAuD;YACvD,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACzC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACzC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1B,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC"}
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 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import type { Config } from '@google/gemini-cli-core';
6
+ import { type Config } from '@google/gemini-cli-core';
7
7
  export interface PrivacyState {
8
8
  isLoading: boolean;
9
9
  error?: string;
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { useState, useEffect, useCallback } from 'react';
7
- import { CodeAssistServer, UserTierId, LoggingContentGenerator, } from '@google/gemini-cli-core';
7
+ import { UserTierId, getCodeAssistServer, } from '@google/gemini-cli-core';
8
8
  export const usePrivacySettings = (config) => {
9
9
  const [privacyState, setPrivacyState] = useState({
10
10
  isLoading: true,
@@ -15,7 +15,7 @@ export const usePrivacySettings = (config) => {
15
15
  isLoading: true,
16
16
  });
17
17
  try {
18
- const server = getCodeAssistServer(config);
18
+ const server = getCodeAssistServerOrFail(config);
19
19
  const tier = await getTier(server);
20
20
  if (tier !== UserTierId.FREE) {
21
21
  // We don't need to fetch opt-out info since non-free tier
@@ -44,7 +44,7 @@ export const usePrivacySettings = (config) => {
44
44
  }, [config]);
45
45
  const updateDataCollectionOptIn = useCallback(async (optIn) => {
46
46
  try {
47
- const server = getCodeAssistServer(config);
47
+ const server = getCodeAssistServerOrFail(config);
48
48
  const updatedOptIn = await setRemoteDataCollectionOptIn(server, optIn);
49
49
  setPrivacyState({
50
50
  isLoading: false,
@@ -64,18 +64,13 @@ export const usePrivacySettings = (config) => {
64
64
  updateDataCollectionOptIn,
65
65
  };
66
66
  };
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)) {
67
+ function getCodeAssistServerOrFail(config) {
68
+ const server = getCodeAssistServer(config);
69
+ if (server === undefined) {
75
70
  throw new Error('Oauth not being used');
76
71
  }
77
- else if (!server.projectId) {
78
- throw new Error('Oauth not being used');
72
+ else if (server.projectId === undefined) {
73
+ throw new Error('CodeAssist server is missing a project ID');
79
74
  }
80
75
  return server;
81
76
  }