@vybestack/llxprt-code 0.3.4 → 0.4.1-nightly.250922.4a350bed

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 (221) hide show
  1. package/README.md +3 -0
  2. package/dist/package.json +7 -6
  3. package/dist/src/auth/anthropic-oauth-provider.d.ts +4 -0
  4. package/dist/src/auth/anthropic-oauth-provider.js +14 -0
  5. package/dist/src/auth/anthropic-oauth-provider.js.map +1 -1
  6. package/dist/src/auth/gemini-oauth-provider.d.ts +7 -1
  7. package/dist/src/auth/gemini-oauth-provider.js +39 -8
  8. package/dist/src/auth/gemini-oauth-provider.js.map +1 -1
  9. package/dist/src/auth/qwen-oauth-provider.d.ts +5 -1
  10. package/dist/src/auth/qwen-oauth-provider.js +6 -0
  11. package/dist/src/auth/qwen-oauth-provider.js.map +1 -1
  12. package/dist/src/commands/extensions/examples/context/LLXPRT.md +8 -0
  13. package/dist/src/commands/extensions/examples/context/llxprt-extension.json +5 -0
  14. package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
  15. package/dist/src/commands/extensions/examples/custom-commands/llxprt-extension.json +4 -0
  16. package/dist/src/commands/extensions/examples/exclude-tools/llxprt-extension.json +5 -0
  17. package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
  18. package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
  19. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
  20. package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
  21. package/dist/src/commands/extensions/examples/mcp-server/llxprt-extension.json +10 -0
  22. package/dist/src/commands/extensions/install.js +35 -7
  23. package/dist/src/commands/extensions/install.js.map +1 -1
  24. package/dist/src/commands/extensions/install.test.js +20 -2
  25. package/dist/src/commands/extensions/install.test.js.map +1 -1
  26. package/dist/src/commands/extensions/link.d.ts +12 -0
  27. package/dist/src/commands/extensions/link.js +37 -0
  28. package/dist/src/commands/extensions/link.js.map +1 -0
  29. package/dist/src/commands/extensions/new.d.ts +7 -0
  30. package/dist/src/commands/extensions/new.js +70 -0
  31. package/dist/src/commands/extensions/new.js.map +1 -0
  32. package/dist/src/commands/extensions/new.test.d.ts +6 -0
  33. package/dist/src/commands/extensions/new.test.js +50 -0
  34. package/dist/src/commands/extensions/new.test.js.map +1 -0
  35. package/dist/src/commands/extensions/update.d.ts +2 -1
  36. package/dist/src/commands/extensions/update.js +40 -13
  37. package/dist/src/commands/extensions/update.js.map +1 -1
  38. package/dist/src/commands/extensions.js +4 -0
  39. package/dist/src/commands/extensions.js.map +1 -1
  40. package/dist/src/commands/mcp/add.js +1 -1
  41. package/dist/src/commands/mcp/add.js.map +1 -1
  42. package/dist/src/commands/mcp/list.js +2 -2
  43. package/dist/src/commands/mcp/list.js.map +1 -1
  44. package/dist/src/commands/mcp/remove.js +1 -1
  45. package/dist/src/commands/mcp/remove.js.map +1 -1
  46. package/dist/src/config/auth.d.ts +1 -1
  47. package/dist/src/config/auth.js +6 -13
  48. package/dist/src/config/auth.js.map +1 -1
  49. package/dist/src/config/auth.test.js +13 -7
  50. package/dist/src/config/auth.test.js.map +1 -1
  51. package/dist/src/config/config.d.ts +4 -1
  52. package/dist/src/config/config.js +47 -23
  53. package/dist/src/config/config.js.map +1 -1
  54. package/dist/src/config/extension.d.ts +8 -5
  55. package/dist/src/config/extension.js +76 -24
  56. package/dist/src/config/extension.js.map +1 -1
  57. package/dist/src/config/keyBindings.d.ts +1 -0
  58. package/dist/src/config/keyBindings.js +6 -25
  59. package/dist/src/config/keyBindings.js.map +1 -1
  60. package/dist/src/config/settings.d.ts +4 -4
  61. package/dist/src/config/settings.js +101 -68
  62. package/dist/src/config/settings.js.map +1 -1
  63. package/dist/src/config/settingsSchema.d.ts +252 -3
  64. package/dist/src/config/settingsSchema.js +248 -3
  65. package/dist/src/config/settingsSchema.js.map +1 -1
  66. package/dist/src/config/trustedFolders.d.ts +14 -3
  67. package/dist/src/config/trustedFolders.js +63 -37
  68. package/dist/src/config/trustedFolders.js.map +1 -1
  69. package/dist/src/config/trustedFolders.test.js +84 -9
  70. package/dist/src/config/trustedFolders.test.js.map +1 -1
  71. package/dist/src/gemini.js +74 -18
  72. package/dist/src/gemini.js.map +1 -1
  73. package/dist/src/gemini.test.js +7 -23
  74. package/dist/src/gemini.test.js.map +1 -1
  75. package/dist/src/generated/git-commit.d.ts +1 -1
  76. package/dist/src/generated/git-commit.js +1 -1
  77. package/dist/src/nonInteractiveCli.js +32 -2
  78. package/dist/src/nonInteractiveCli.js.map +1 -1
  79. package/dist/src/providers/providerManagerInstance.d.ts +2 -1
  80. package/dist/src/providers/providerManagerInstance.js +27 -5
  81. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  82. package/dist/src/services/FileCommandLoader.d.ts +2 -0
  83. package/dist/src/services/FileCommandLoader.js +7 -0
  84. package/dist/src/services/FileCommandLoader.js.map +1 -1
  85. package/dist/src/ui/App.js +104 -52
  86. package/dist/src/ui/App.js.map +1 -1
  87. package/dist/src/ui/commands/directoryCommand.js +1 -1
  88. package/dist/src/ui/commands/directoryCommand.js.map +1 -1
  89. package/dist/src/ui/commands/memoryCommand.js +1 -1
  90. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  91. package/dist/src/ui/commands/providerCommand.js +21 -8
  92. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  93. package/dist/src/ui/components/AuthDialog.test.js +13 -13
  94. package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
  95. package/dist/src/ui/components/FolderTrustDialog.js +5 -3
  96. package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
  97. package/dist/src/ui/components/FolderTrustDialog.test.js +21 -6
  98. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
  99. package/dist/src/ui/components/Footer.d.ts +3 -0
  100. package/dist/src/ui/components/Footer.js +4 -4
  101. package/dist/src/ui/components/Footer.js.map +1 -1
  102. package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
  103. package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
  104. package/dist/src/ui/components/InputPrompt.d.ts +2 -2
  105. package/dist/src/ui/components/InputPrompt.js +35 -25
  106. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  107. package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
  108. package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
  109. package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
  110. package/dist/src/ui/components/ProQuotaDialog.js +22 -0
  111. package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
  112. package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
  113. package/dist/src/ui/components/ProQuotaDialog.test.js +57 -0
  114. package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
  115. package/dist/src/ui/components/SettingsDialog.test.js +2 -2
  116. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  117. package/dist/src/ui/components/ShellConfirmationDialog.js +7 -1
  118. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  119. package/dist/src/ui/components/TodoPanel.js +75 -10
  120. package/dist/src/ui/components/TodoPanel.js.map +1 -1
  121. package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
  122. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  123. package/dist/src/ui/components/messages/DiffRenderer.js +5 -1
  124. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  125. package/dist/src/ui/components/messages/GeminiMessage.js +1 -1
  126. package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
  127. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
  128. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  129. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
  130. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
  131. package/dist/src/ui/components/messages/ToolMessage.js +2 -1
  132. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  133. package/dist/src/ui/components/messages/UserMessage.js +1 -1
  134. package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
  135. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  136. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  137. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  138. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +2 -2
  139. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
  140. package/dist/src/ui/components/shared/text-buffer.js +35 -51
  141. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  142. package/dist/src/ui/constants.d.ts +8 -2
  143. package/dist/src/ui/constants.js +9 -2
  144. package/dist/src/ui/constants.js.map +1 -1
  145. package/dist/src/ui/containers/SessionController.js +1 -1
  146. package/dist/src/ui/containers/SessionController.js.map +1 -1
  147. package/dist/src/ui/containers/SessionController.test.js +1 -0
  148. package/dist/src/ui/containers/SessionController.test.js.map +1 -1
  149. package/dist/src/ui/contexts/KeypressContext.js +255 -42
  150. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  151. package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
  152. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  153. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -1
  154. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  155. package/dist/src/ui/hooks/useFolderTrust.js +6 -3
  156. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  157. package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
  158. package/dist/src/ui/hooks/useGeminiStream.integration.test.js +1 -1
  159. package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -1
  160. package/dist/src/ui/hooks/useGeminiStream.js +170 -35
  161. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  162. package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
  163. package/dist/src/ui/hooks/useIdeTrustListener.js +37 -0
  164. package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
  165. package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
  166. package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
  167. package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
  168. package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
  169. package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
  170. package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
  171. package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
  172. package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
  173. package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
  174. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  175. package/dist/src/ui/hooks/useLoadingIndicator.test.js +102 -0
  176. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  177. package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
  178. package/dist/src/ui/hooks/usePhraseCycler.js +25 -17
  179. package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
  180. package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
  181. package/dist/src/ui/hooks/usePrivacySettings.js +20 -13
  182. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  183. package/dist/src/ui/hooks/usePrivacySettings.test.js +52 -105
  184. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
  185. package/dist/src/ui/hooks/useTerminalSize.js +22 -8
  186. package/dist/src/ui/hooks/useTerminalSize.js.map +1 -1
  187. package/dist/src/ui/hooks/useToolScheduler.test.js +57 -70
  188. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  189. package/dist/src/ui/keyMatchers.test.js +9 -0
  190. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  191. package/dist/src/ui/textConstants.d.ts +9 -0
  192. package/dist/src/ui/textConstants.js +10 -0
  193. package/dist/src/ui/textConstants.js.map +1 -0
  194. package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
  195. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
  196. package/dist/src/ui/utils/highlight.d.ts +10 -0
  197. package/dist/src/ui/utils/highlight.js +41 -0
  198. package/dist/src/ui/utils/highlight.js.map +1 -0
  199. package/dist/src/ui/utils/highlight.test.d.ts +6 -0
  200. package/dist/src/ui/utils/highlight.test.js +93 -0
  201. package/dist/src/ui/utils/highlight.test.js.map +1 -0
  202. package/dist/src/ui/utils/platformConstants.d.ts +24 -1
  203. package/dist/src/ui/utils/platformConstants.js +26 -1
  204. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  205. package/dist/src/utils/envVarResolver.d.ts +39 -0
  206. package/dist/src/utils/envVarResolver.js +97 -0
  207. package/dist/src/utils/envVarResolver.js.map +1 -0
  208. package/dist/src/utils/envVarResolver.test.d.ts +6 -0
  209. package/dist/src/utils/envVarResolver.test.js +221 -0
  210. package/dist/src/utils/envVarResolver.test.js.map +1 -0
  211. package/dist/src/utils/errors.d.ts +9 -0
  212. package/dist/src/utils/errors.js +18 -0
  213. package/dist/src/utils/errors.js.map +1 -0
  214. package/dist/src/utils/userStartupWarnings.d.ts +1 -1
  215. package/dist/src/utils/userStartupWarnings.js +1 -1
  216. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  217. package/dist/src/zed-integration/schema.d.ts +398 -398
  218. package/dist/src/zed-integration/zedIntegration.js +11 -7
  219. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  220. package/dist/tsconfig.tsbuildinfo +1 -1
  221. 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,sCAAsC;QAC1D,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,CACzC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,mBAAmB,CAAC,cAAc,CAAC,UAAU,CAAC,CAC/C,CAAC;QAEF,sCAAsC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CACpC,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CACrC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAC3D,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE,EAAE,CAChE,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5C,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAC9C,kCAAkC,CACnC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC;QAE/E,mCAAmC;QACnC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8GAA8G,EAAE,KAAK,IAAI,EAAE;QAC5H,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CACrC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAC3D,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE,EAAE,CAChE,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAChD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3C,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAC9C,kCAAkC,CACnC,CAAC;QAEF,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;QAC3D,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CACpC,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CACrC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAC3D,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE,EAAE,CAChE,CAAC;QAEF,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QAClD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5C,GAAG,CAAC,GAAG,EAAE;YACP,QAAQ,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CACpC,CAAC;QAEF,2BAA2B;QAC3B,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,aAAa,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CACjC,mBAAmB,CAAC,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,CAC9D,CAAC;QAEF,6BAA6B;QAC7B,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAErE,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,wBAAwB,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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":"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"}
@@ -4,18 +4,32 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { useEffect, useState } from 'react';
7
+ import { execSync } from 'child_process';
7
8
  const TERMINAL_PADDING_X = 8;
9
+ // Get terminal dimensions using child_process to run tput command
10
+ // as process.stdout.columns and process.stdout.rows aren't reliable in our environment
11
+ function getTerminalDimensions() {
12
+ try {
13
+ const cols = parseInt(execSync('tput cols').toString().trim(), 10);
14
+ const rows = parseInt(execSync('tput lines').toString().trim(), 10);
15
+ return {
16
+ columns: cols || 80,
17
+ rows: rows || 24,
18
+ };
19
+ }
20
+ catch (_error) {
21
+ // Fallback to process.stdout if tput doesn't work
22
+ return {
23
+ columns: (process.stdout.columns || 80) - TERMINAL_PADDING_X,
24
+ rows: process.stdout.rows || 24,
25
+ };
26
+ }
27
+ }
8
28
  export function useTerminalSize() {
9
- const [size, setSize] = useState({
10
- columns: (process.stdout.columns || 60) - TERMINAL_PADDING_X,
11
- rows: process.stdout.rows || 20,
12
- });
29
+ const [size, setSize] = useState(getTerminalDimensions());
13
30
  useEffect(() => {
14
31
  function updateSize() {
15
- setSize({
16
- columns: (process.stdout.columns || 60) - TERMINAL_PADDING_X,
17
- rows: process.stdout.rows || 20,
18
- });
32
+ setSize(getTerminalDimensions());
19
33
  }
20
34
  process.stdout.on('resize', updateSize);
21
35
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,kBAAkB;QAC5D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,UAAU;YACjB,OAAO,CAAC;gBACN,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,kBAAkB;gBAC5D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,kEAAkE;AAClE,uFAAuF;AACvF,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,IAAI,EAAE,IAAI,IAAI,EAAE;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,kDAAkD;QAClD,OAAO;YACL,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,kBAAkB;YAC5D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,UAAU;YACjB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AACd,CAAC"}