@vybestack/llxprt-code 0.3.4-nightly.250919.5e3f575d → 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.
- package/README.md +1 -0
- package/dist/package.json +7 -6
- package/dist/src/commands/extensions/examples/context/LLXPRT.md +8 -0
- package/dist/src/commands/extensions/examples/context/llxprt-extension.json +5 -0
- package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
- package/dist/src/commands/extensions/examples/custom-commands/llxprt-extension.json +4 -0
- package/dist/src/commands/extensions/examples/exclude-tools/llxprt-extension.json +5 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.d.ts +6 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.js +46 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.js.map +1 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
- package/dist/src/commands/extensions/examples/mcp-server/llxprt-extension.json +10 -0
- package/dist/src/commands/extensions/install.js +35 -7
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +20 -2
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.d.ts +12 -0
- package/dist/src/commands/extensions/link.js +37 -0
- package/dist/src/commands/extensions/link.js.map +1 -0
- package/dist/src/commands/extensions/new.d.ts +7 -0
- package/dist/src/commands/extensions/new.js +70 -0
- package/dist/src/commands/extensions/new.js.map +1 -0
- package/dist/src/commands/extensions/new.test.d.ts +6 -0
- package/dist/src/commands/extensions/new.test.js +50 -0
- package/dist/src/commands/extensions/new.test.js.map +1 -0
- package/dist/src/commands/extensions/update.d.ts +2 -1
- package/dist/src/commands/extensions/update.js +40 -13
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/extensions.js +4 -0
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/commands/mcp/add.js +1 -1
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/commands/mcp/list.js +2 -2
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/commands/mcp/remove.js +1 -1
- package/dist/src/commands/mcp/remove.js.map +1 -1
- package/dist/src/config/auth.d.ts +1 -1
- package/dist/src/config/auth.js +6 -13
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/auth.test.js +13 -7
- package/dist/src/config/auth.test.js.map +1 -1
- package/dist/src/config/config.d.ts +4 -1
- package/dist/src/config/config.js +47 -23
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +8 -5
- package/dist/src/config/extension.js +76 -24
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +1 -0
- package/dist/src/config/keyBindings.js +6 -25
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/settings.d.ts +4 -4
- package/dist/src/config/settings.js +101 -68
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +252 -3
- package/dist/src/config/settingsSchema.js +248 -3
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +14 -3
- package/dist/src/config/trustedFolders.js +63 -37
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/config/trustedFolders.test.js +84 -9
- package/dist/src/config/trustedFolders.test.js.map +1 -1
- package/dist/src/gemini.js +74 -18
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +7 -23
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/nonInteractiveCli.js +32 -2
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.js +0 -1
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +2 -0
- package/dist/src/services/FileCommandLoader.js +7 -0
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/ui/App.js +103 -51
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.js +1 -1
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +1 -1
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.test.js +13 -13
- package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.js +5 -3
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +21 -6
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +3 -0
- package/dist/src/ui/components/Footer.js +4 -4
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.js +5 -3
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +2 -2
- package/dist/src/ui/components/InputPrompt.js +35 -25
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/MemoryUsageDisplay.js +1 -1
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
- package/dist/src/ui/components/ProQuotaDialog.js +22 -0
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
- package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js +57 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.test.js +2 -2
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.js +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.js +5 -1
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiMessage.js +1 -1
- package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +2 -1
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +1 -1
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +2 -2
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +35 -51
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/constants.d.ts +8 -2
- package/dist/src/ui/constants.js +9 -2
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/containers/SessionController.js +1 -1
- package/dist/src/ui/containers/SessionController.js.map +1 -1
- package/dist/src/ui/containers/SessionController.test.js +1 -0
- package/dist/src/ui/containers/SessionController.test.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +255 -42
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +115 -1
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +3 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +6 -3
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
- package/dist/src/ui/hooks/useGeminiStream.integration.test.js +1 -1
- package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +170 -35
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.d.ts +15 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js +37 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +102 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +12 -17
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.d.ts +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.js +20 -13
- package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.test.js +52 -105
- package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +57 -70
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +9 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/textConstants.d.ts +9 -0
- package/dist/src/ui/textConstants.js +10 -0
- package/dist/src/ui/textConstants.js.map +1 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/highlight.d.ts +10 -0
- package/dist/src/ui/utils/highlight.js +41 -0
- package/dist/src/ui/utils/highlight.js.map +1 -0
- package/dist/src/ui/utils/highlight.test.d.ts +6 -0
- package/dist/src/ui/utils/highlight.test.js +93 -0
- package/dist/src/ui/utils/highlight.test.js.map +1 -0
- package/dist/src/ui/utils/platformConstants.d.ts +24 -1
- package/dist/src/ui/utils/platformConstants.js +26 -1
- package/dist/src/ui/utils/platformConstants.js.map +1 -1
- package/dist/src/utils/envVarResolver.d.ts +39 -0
- package/dist/src/utils/envVarResolver.js +97 -0
- package/dist/src/utils/envVarResolver.js.map +1 -0
- package/dist/src/utils/envVarResolver.test.d.ts +6 -0
- package/dist/src/utils/envVarResolver.test.js +221 -0
- package/dist/src/utils/envVarResolver.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +9 -0
- package/dist/src/utils/errors.js +18 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.d.ts +1 -1
- package/dist/src/utils/userStartupWarnings.js +1 -1
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +398 -398
- package/dist/src/zed-integration/zedIntegration.js +11 -7
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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;
|
@@ -54,8 +54,11 @@ export const PHRASE_CHANGE_INTERVAL_MS = 15000; // 15 seconds between phrase cha
|
|
54
54
|
* @param isWaiting Whether to show a specific waiting phrase.
|
55
55
|
* @returns The current loading phrase.
|
56
56
|
*/
|
57
|
-
export const usePhraseCycler = (isActive, isWaiting) => {
|
58
|
-
const
|
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]);
|
59
62
|
const phraseIntervalRef = useRef(null);
|
60
63
|
useEffect(() => {
|
61
64
|
if (isWaiting) {
|
@@ -70,20 +73,12 @@ export const usePhraseCycler = (isActive, isWaiting) => {
|
|
70
73
|
clearInterval(phraseIntervalRef.current);
|
71
74
|
}
|
72
75
|
// Select an initial random phrase
|
73
|
-
const initialRandomIndex = Math.floor(Math.random() *
|
74
|
-
setCurrentLoadingPhrase(
|
76
|
+
const initialRandomIndex = Math.floor(Math.random() * loadingPhrases.length);
|
77
|
+
setCurrentLoadingPhrase(loadingPhrases[initialRandomIndex]);
|
75
78
|
phraseIntervalRef.current = setInterval(() => {
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
if (WITTY_LOADING_PHRASES.length > 1) {
|
80
|
-
do {
|
81
|
-
const randomIndex = Math.floor(Math.random() * WITTY_LOADING_PHRASES.length);
|
82
|
-
nextPhrase = WITTY_LOADING_PHRASES[randomIndex];
|
83
|
-
} while (nextPhrase === prevPhrase);
|
84
|
-
}
|
85
|
-
return nextPhrase;
|
86
|
-
});
|
79
|
+
// Select a new random phrase
|
80
|
+
const randomIndex = Math.floor(Math.random() * loadingPhrases.length);
|
81
|
+
setCurrentLoadingPhrase(loadingPhrases[randomIndex]);
|
87
82
|
}, PHRASE_CHANGE_INTERVAL_MS);
|
88
83
|
}
|
89
84
|
else {
|
@@ -93,7 +88,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
|
|
93
88
|
clearInterval(phraseIntervalRef.current);
|
94
89
|
phraseIntervalRef.current = null;
|
95
90
|
}
|
96
|
-
setCurrentLoadingPhrase(
|
91
|
+
setCurrentLoadingPhrase(loadingPhrases[0]);
|
97
92
|
}
|
98
93
|
return () => {
|
99
94
|
if (phraseIntervalRef.current) {
|
@@ -101,7 +96,7 @@ export const usePhraseCycler = (isActive, isWaiting) => {
|
|
101
96
|
phraseIntervalRef.current = null;
|
102
97
|
}
|
103
98
|
};
|
104
|
-
}, [isActive, isWaiting]);
|
99
|
+
}, [isActive, isWaiting, loadingPhrases]);
|
105
100
|
return currentLoadingPhrase;
|
106
101
|
};
|
107
102
|
//# 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,oBAAoB;IACpB,oEAAoE;IACpE,qEAAqE;IACrE,uEAAuE;IACvE,uCAAuC;IACvC,yDAAyD;IACzD,0GAA0G;IAC1G,6DAA6D;IAC7D,mEAAmE;IACnE,0CAA0C;IAC1C,2EAA2E;IAC3E,6CAA6C;IAE7C,uBAAuB;IACvB,yDAAyD;IACzD,+BAA+B;IAC/B,gFAAgF;IAChF,+IAA+I;IAC/I,2EAA2E;IAC3E,iHAAiH;IACjH,yJAAyJ;IACzJ,iHAAiH;IAEjH,sBAAsB;IACtB,2CAA2C;IAC3C,8DAA8D;IAC9D,mCAAmC;IACnC,kDAAkD;IAClD,6CAA6C;IAC7C,qDAAqD;IAErD,uBAAuB;IACvB,qGAAqG;IACrG,+FAA+F;IAC/F,gEAAgE;IAChE,qBAAqB;IACrB,wFAAwF;IAExF,4BAA4B;IAC5B,yCAAyC;IACzC,sDAAsD;IAEtD,wBAAwB;IACxB,mFAAmF;IAEnF,sBAAsB;IACtB,wFAAwF;CACzF,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC,CAAC,oCAAoC;AAEpF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,
|
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 {
|
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 =
|
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 =
|
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
|
68
|
-
|
69
|
-
|
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 (
|
78
|
-
throw new Error('
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,
|
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 {
|
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
|
83
|
-
//
|
84
|
-
const
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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).
|
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
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
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
|
-
|
130
|
-
|
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('
|
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
|
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":"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;
|
1
|
+
{"version":3,"file":"usePrivacySettings.test.js","sourceRoot":"","sources":["../../../../src/ui/hooks/usePrivacySettings.test.ts"],"names":[],"mappings":"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"}
|