@vybestack/llxprt-code 0.3.4-nightly.250918.ed04d656 → 0.3.4-nightly.250921.fdbf3cd7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -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 +25 -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;
|
@@ -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
|
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() *
|
61
|
-
setCurrentLoadingPhrase(
|
76
|
+
const initialRandomIndex = Math.floor(Math.random() * loadingPhrases.length);
|
77
|
+
setCurrentLoadingPhrase(loadingPhrases[initialRandomIndex]);
|
62
78
|
phraseIntervalRef.current = setInterval(() => {
|
63
|
-
|
64
|
-
|
65
|
-
|
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(
|
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":"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;
|
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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"}
|