@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.
- package/README.md +3 -0
- package/dist/package.json +7 -6
- package/dist/src/auth/anthropic-oauth-provider.d.ts +4 -0
- package/dist/src/auth/anthropic-oauth-provider.js +14 -0
- package/dist/src/auth/anthropic-oauth-provider.js.map +1 -1
- package/dist/src/auth/gemini-oauth-provider.d.ts +7 -1
- package/dist/src/auth/gemini-oauth-provider.js +39 -8
- package/dist/src/auth/gemini-oauth-provider.js.map +1 -1
- package/dist/src/auth/qwen-oauth-provider.d.ts +5 -1
- package/dist/src/auth/qwen-oauth-provider.js +6 -0
- package/dist/src/auth/qwen-oauth-provider.js.map +1 -1
- 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.d.ts +2 -1
- package/dist/src/providers/providerManagerInstance.js +27 -5
- 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 +104 -52
- 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/commands/providerCommand.js +21 -8
- package/dist/src/ui/commands/providerCommand.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/ShellConfirmationDialog.js +7 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/TodoPanel.js +75 -10
- package/dist/src/ui/components/TodoPanel.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/useTerminalSize.js +22 -8
- package/dist/src/ui/hooks/useTerminalSize.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
@@ -3,6 +3,7 @@
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
+
import type { Settings } from './settings.js';
|
6
7
|
export declare const TRUSTED_FOLDERS_FILENAME = "trustedFolders.json";
|
7
8
|
export declare const SETTINGS_DIRECTORY_NAME = ".llxprt";
|
8
9
|
export declare const USER_SETTINGS_DIR: string;
|
@@ -25,12 +26,22 @@ export interface TrustedFoldersFile {
|
|
25
26
|
path: string;
|
26
27
|
}
|
27
28
|
export declare class LoadedTrustedFolders {
|
28
|
-
user: TrustedFoldersFile;
|
29
|
-
errors: TrustedFoldersError[];
|
29
|
+
readonly user: TrustedFoldersFile;
|
30
|
+
readonly errors: TrustedFoldersError[];
|
30
31
|
constructor(user: TrustedFoldersFile, errors: TrustedFoldersError[]);
|
31
32
|
get rules(): TrustRule[];
|
33
|
+
/**
|
34
|
+
* Returns true or false if the path should be "trusted". This function
|
35
|
+
* should only be invoked when the folder trust setting is active.
|
36
|
+
*
|
37
|
+
* @param location path
|
38
|
+
* @returns
|
39
|
+
*/
|
40
|
+
isPathTrusted(location: string): boolean | undefined;
|
32
41
|
setValue(path: string, trustLevel: TrustLevel): void;
|
33
42
|
}
|
34
43
|
export declare function loadTrustedFolders(): LoadedTrustedFolders;
|
35
44
|
export declare function saveTrustedFolders(trustedFoldersFile: TrustedFoldersFile): void;
|
36
|
-
|
45
|
+
/** Is folder trust feature enabled per the current applied settings */
|
46
|
+
export declare function isFolderTrustEnabled(settings: Settings): boolean;
|
47
|
+
export declare function isWorkspaceTrusted(settings: Settings): boolean | undefined;
|
@@ -3,10 +3,10 @@
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
-
import * as fs from 'fs';
|
7
|
-
import * as path from 'path';
|
8
|
-
import { homedir } from 'os';
|
9
|
-
import { getErrorMessage, isWithinRoot } from '@vybestack/llxprt-code-core';
|
6
|
+
import * as fs from 'node:fs';
|
7
|
+
import * as path from 'node:path';
|
8
|
+
import { homedir } from 'node:os';
|
9
|
+
import { getErrorMessage, isWithinRoot, getIdeTrust, } from '@vybestack/llxprt-code-core';
|
10
10
|
import stripJsonComments from 'strip-json-comments';
|
11
11
|
export const TRUSTED_FOLDERS_FILENAME = 'trustedFolders.json';
|
12
12
|
export const SETTINGS_DIRECTORY_NAME = '.llxprt';
|
@@ -31,6 +31,44 @@ export class LoadedTrustedFolders {
|
|
31
31
|
trustLevel,
|
32
32
|
}));
|
33
33
|
}
|
34
|
+
/**
|
35
|
+
* Returns true or false if the path should be "trusted". This function
|
36
|
+
* should only be invoked when the folder trust setting is active.
|
37
|
+
*
|
38
|
+
* @param location path
|
39
|
+
* @returns
|
40
|
+
*/
|
41
|
+
isPathTrusted(location) {
|
42
|
+
const trustedPaths = [];
|
43
|
+
const untrustedPaths = [];
|
44
|
+
for (const rule of this.rules) {
|
45
|
+
switch (rule.trustLevel) {
|
46
|
+
case TrustLevel.TRUST_FOLDER:
|
47
|
+
trustedPaths.push(rule.path);
|
48
|
+
break;
|
49
|
+
case TrustLevel.TRUST_PARENT:
|
50
|
+
trustedPaths.push(path.dirname(rule.path));
|
51
|
+
break;
|
52
|
+
case TrustLevel.DO_NOT_TRUST:
|
53
|
+
untrustedPaths.push(rule.path);
|
54
|
+
break;
|
55
|
+
default:
|
56
|
+
// Do nothing for unknown trust levels.
|
57
|
+
break;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
for (const trustedPath of trustedPaths) {
|
61
|
+
if (isWithinRoot(location, trustedPath)) {
|
62
|
+
return true;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
for (const untrustedPath of untrustedPaths) {
|
66
|
+
if (path.normalize(location) === path.normalize(untrustedPath)) {
|
67
|
+
return false;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
return undefined;
|
71
|
+
}
|
34
72
|
setValue(path, trustLevel) {
|
35
73
|
this.user.config[path] = trustLevel;
|
36
74
|
saveTrustedFolders(this.user);
|
@@ -65,48 +103,36 @@ export function saveTrustedFolders(trustedFoldersFile) {
|
|
65
103
|
if (!fs.existsSync(dirPath)) {
|
66
104
|
fs.mkdirSync(dirPath, { recursive: true });
|
67
105
|
}
|
68
|
-
fs.writeFileSync(trustedFoldersFile.path, JSON.stringify(trustedFoldersFile.config, null, 2), 'utf-8');
|
106
|
+
fs.writeFileSync(trustedFoldersFile.path, JSON.stringify(trustedFoldersFile.config, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
69
107
|
}
|
70
108
|
catch (error) {
|
71
109
|
console.error('Error saving trusted folders file:', error);
|
72
110
|
}
|
73
111
|
}
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
112
|
+
/** Is folder trust feature enabled per the current applied settings */
|
113
|
+
export function isFolderTrustEnabled(settings) {
|
114
|
+
// In llxprt, we use flat settings structure
|
115
|
+
const folderTrustSetting = settings.folderTrust ?? false;
|
116
|
+
return folderTrustSetting;
|
117
|
+
}
|
118
|
+
function getWorkspaceTrustFromLocalConfig() {
|
119
|
+
const folders = loadTrustedFolders();
|
120
|
+
if (folders.errors.length > 0) {
|
121
|
+
for (const error of folders.errors) {
|
78
122
|
console.error(`Error loading trusted folders config from ${error.path}: ${error.message}`);
|
79
123
|
}
|
80
124
|
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
trustedPaths.push(rule.path);
|
87
|
-
break;
|
88
|
-
case TrustLevel.TRUST_PARENT:
|
89
|
-
trustedPaths.push(path.dirname(rule.path));
|
90
|
-
break;
|
91
|
-
case TrustLevel.DO_NOT_TRUST:
|
92
|
-
untrustedPaths.push(rule.path);
|
93
|
-
break;
|
94
|
-
default:
|
95
|
-
// Do nothing for unknown trust levels.
|
96
|
-
break;
|
97
|
-
}
|
98
|
-
}
|
99
|
-
const cwd = process.cwd();
|
100
|
-
for (const trustedPath of trustedPaths) {
|
101
|
-
if (isWithinRoot(cwd, trustedPath)) {
|
102
|
-
return true;
|
103
|
-
}
|
125
|
+
return folders.isPathTrusted(process.cwd());
|
126
|
+
}
|
127
|
+
export function isWorkspaceTrusted(settings) {
|
128
|
+
if (!isFolderTrustEnabled(settings)) {
|
129
|
+
return true;
|
104
130
|
}
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
}
|
131
|
+
const ideTrust = getIdeTrust();
|
132
|
+
if (ideTrust !== undefined) {
|
133
|
+
return ideTrust;
|
109
134
|
}
|
110
|
-
|
135
|
+
// Fall back to the local user configuration
|
136
|
+
return getWorkspaceTrustFromLocalConfig();
|
111
137
|
}
|
112
138
|
//# sourceMappingURL=trustedFolders.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"trustedFolders.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"trustedFolders.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.ts"],"names":[],"mappings":"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"}
|
@@ -53,6 +53,40 @@ describe('Trusted Folders Loading', () => {
|
|
53
53
|
expect(rules).toEqual([]);
|
54
54
|
expect(errors).toEqual([]);
|
55
55
|
});
|
56
|
+
describe('isPathTrusted', () => {
|
57
|
+
function setup({ config = {} } = {}) {
|
58
|
+
mockFsExistsSync.mockImplementation((p) => p === USER_TRUSTED_FOLDERS_PATH);
|
59
|
+
fs.readFileSync.mockImplementation((p) => {
|
60
|
+
if (p === USER_TRUSTED_FOLDERS_PATH)
|
61
|
+
return JSON.stringify(config);
|
62
|
+
return '{}';
|
63
|
+
});
|
64
|
+
const folders = loadTrustedFolders();
|
65
|
+
return { folders };
|
66
|
+
}
|
67
|
+
it('provides a method to determine if a path is trusted', () => {
|
68
|
+
const { folders } = setup({
|
69
|
+
config: {
|
70
|
+
'./myfolder': TrustLevel.TRUST_FOLDER,
|
71
|
+
'/trustedparent/trustme': TrustLevel.TRUST_PARENT,
|
72
|
+
'/user/folder': TrustLevel.TRUST_FOLDER,
|
73
|
+
'/secret': TrustLevel.DO_NOT_TRUST,
|
74
|
+
'/secret/publickeys': TrustLevel.TRUST_FOLDER,
|
75
|
+
},
|
76
|
+
});
|
77
|
+
expect(folders.isPathTrusted('/secret')).toBe(false);
|
78
|
+
expect(folders.isPathTrusted('/user/folder')).toBe(true);
|
79
|
+
expect(folders.isPathTrusted('/secret/publickeys/public.pem')).toBe(true);
|
80
|
+
expect(folders.isPathTrusted('/user/folder/harhar')).toBe(true);
|
81
|
+
expect(folders.isPathTrusted('myfolder/somefile.jpg')).toBe(true);
|
82
|
+
expect(folders.isPathTrusted('/trustedparent/someotherfolder')).toBe(true);
|
83
|
+
expect(folders.isPathTrusted('/trustedparent/trustme')).toBe(true);
|
84
|
+
// No explicit rule covers this file
|
85
|
+
expect(folders.isPathTrusted('/secret/bankaccounts.json')).toBe(undefined);
|
86
|
+
expect(folders.isPathTrusted('/secret/mine/privatekey.pem')).toBe(undefined);
|
87
|
+
expect(folders.isPathTrusted('/user/someotherfolder')).toBe(undefined);
|
88
|
+
});
|
89
|
+
});
|
56
90
|
it('should load user rules if only user file exists', () => {
|
57
91
|
const userPath = USER_TRUSTED_FOLDERS_PATH;
|
58
92
|
mockFsExistsSync.mockImplementation((p) => p === userPath);
|
@@ -88,12 +122,15 @@ describe('Trusted Folders Loading', () => {
|
|
88
122
|
const loadedFolders = loadTrustedFolders();
|
89
123
|
loadedFolders.setValue('/new/path', TrustLevel.TRUST_FOLDER);
|
90
124
|
expect(loadedFolders.user.config['/new/path']).toBe(TrustLevel.TRUST_FOLDER);
|
91
|
-
expect(mockFsWriteFileSync).toHaveBeenCalledWith(USER_TRUSTED_FOLDERS_PATH, JSON.stringify({ '/new/path': TrustLevel.TRUST_FOLDER }, null, 2), 'utf-8');
|
125
|
+
expect(mockFsWriteFileSync).toHaveBeenCalledWith(USER_TRUSTED_FOLDERS_PATH, JSON.stringify({ '/new/path': TrustLevel.TRUST_FOLDER }, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
92
126
|
});
|
93
127
|
});
|
94
128
|
describe('isWorkspaceTrusted', () => {
|
95
129
|
let mockCwd;
|
96
130
|
const mockRules = {};
|
131
|
+
const mockSettings = {
|
132
|
+
folderTrust: true,
|
133
|
+
};
|
97
134
|
beforeEach(() => {
|
98
135
|
vi.spyOn(process, 'cwd').mockImplementation(() => mockCwd);
|
99
136
|
vi.spyOn(fs, 'readFileSync').mockImplementation((p) => {
|
@@ -112,45 +149,83 @@ describe('isWorkspaceTrusted', () => {
|
|
112
149
|
it('should return true for a directly trusted folder', () => {
|
113
150
|
mockCwd = '/home/user/projectA';
|
114
151
|
mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
|
115
|
-
expect(isWorkspaceTrusted()).toBe(true);
|
152
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
116
153
|
});
|
117
154
|
it('should return true for a child of a trusted folder', () => {
|
118
155
|
mockCwd = '/home/user/projectA/src';
|
119
156
|
mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
|
120
|
-
expect(isWorkspaceTrusted()).toBe(true);
|
157
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
121
158
|
});
|
122
159
|
it('should return true for a child of a trusted parent folder', () => {
|
123
160
|
mockCwd = '/home/user/projectB';
|
124
161
|
mockRules['/home/user/projectB/somefile.txt'] = TrustLevel.TRUST_PARENT;
|
125
|
-
expect(isWorkspaceTrusted()).toBe(true);
|
162
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
126
163
|
});
|
127
164
|
it('should return false for a directly untrusted folder', () => {
|
128
165
|
mockCwd = '/home/user/untrusted';
|
129
166
|
mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
|
130
|
-
expect(isWorkspaceTrusted()).toBe(false);
|
167
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(false);
|
131
168
|
});
|
132
169
|
it('should return undefined for a child of an untrusted folder', () => {
|
133
170
|
mockCwd = '/home/user/untrusted/src';
|
134
171
|
mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
|
135
|
-
expect(isWorkspaceTrusted()).toBeUndefined();
|
172
|
+
expect(isWorkspaceTrusted(mockSettings)).toBeUndefined();
|
136
173
|
});
|
137
174
|
it('should return undefined when no rules match', () => {
|
138
175
|
mockCwd = '/home/user/other';
|
139
176
|
mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
|
140
177
|
mockRules['/home/user/untrusted'] = TrustLevel.DO_NOT_TRUST;
|
141
|
-
expect(isWorkspaceTrusted()).toBeUndefined();
|
178
|
+
expect(isWorkspaceTrusted(mockSettings)).toBeUndefined();
|
142
179
|
});
|
143
180
|
it('should prioritize trust over distrust', () => {
|
144
181
|
mockCwd = '/home/user/projectA/untrusted';
|
145
182
|
mockRules['/home/user/projectA'] = TrustLevel.TRUST_FOLDER;
|
146
183
|
mockRules['/home/user/projectA/untrusted'] = TrustLevel.DO_NOT_TRUST;
|
147
|
-
expect(isWorkspaceTrusted()).toBe(true);
|
184
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
148
185
|
});
|
149
186
|
it('should handle path normalization', () => {
|
150
187
|
mockCwd = '/home/user/projectA';
|
151
188
|
mockRules[`/home/user/../user/${path.basename('/home/user/projectA')}`] =
|
152
189
|
TrustLevel.TRUST_FOLDER;
|
153
|
-
expect(isWorkspaceTrusted()).toBe(true);
|
190
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
191
|
+
});
|
192
|
+
});
|
193
|
+
import { getIdeTrust } from '@vybestack/llxprt-code-core';
|
194
|
+
vi.mock('@vybestack/llxprt-code-core', async (importOriginal) => {
|
195
|
+
const actual = await importOriginal();
|
196
|
+
return {
|
197
|
+
...actual,
|
198
|
+
getIdeTrust: vi.fn(),
|
199
|
+
};
|
200
|
+
});
|
201
|
+
describe('isWorkspaceTrusted with IDE override', () => {
|
202
|
+
const mockSettings = {
|
203
|
+
folderTrust: true,
|
204
|
+
};
|
205
|
+
it('should return true when ideTrust is true, ignoring config', () => {
|
206
|
+
vi.mocked(getIdeTrust).mockReturnValue(true);
|
207
|
+
// Even if config says don't trust, ideTrust should win.
|
208
|
+
vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.DO_NOT_TRUST }));
|
209
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
210
|
+
});
|
211
|
+
it('should return false when ideTrust is false, ignoring config', () => {
|
212
|
+
vi.mocked(getIdeTrust).mockReturnValue(false);
|
213
|
+
// Even if config says trust, ideTrust should win.
|
214
|
+
vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.TRUST_FOLDER }));
|
215
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(false);
|
216
|
+
});
|
217
|
+
it('should fall back to config when ideTrust is undefined', () => {
|
218
|
+
vi.mocked(getIdeTrust).mockReturnValue(undefined);
|
219
|
+
vi.spyOn(fs, 'existsSync').mockReturnValue(true);
|
220
|
+
vi.spyOn(fs, 'readFileSync').mockReturnValue(JSON.stringify({ [process.cwd()]: TrustLevel.TRUST_FOLDER }));
|
221
|
+
expect(isWorkspaceTrusted(mockSettings)).toBe(true);
|
222
|
+
});
|
223
|
+
it('should always return true if folderTrust setting is disabled', () => {
|
224
|
+
const settings = {
|
225
|
+
folderTrust: false,
|
226
|
+
};
|
227
|
+
vi.mocked(getIdeTrust).mockReturnValue(false);
|
228
|
+
expect(isWorkspaceTrusted(settings)).toBe(true);
|
154
229
|
});
|
155
230
|
});
|
156
231
|
//# sourceMappingURL=trustedFolders.test.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"trustedFolders.test.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,KAAK,QAAQ,MAAM,IAAI,CAAC;AAC/B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAmB,CAAC;IACzD,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;QACvC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAGV,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,UAAU,EACV,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"trustedFolders.test.js","sourceRoot":"","sources":["../../../src/config/trustedFolders.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,KAAK,QAAQ,MAAM,IAAI,CAAC;AAC/B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAmB,CAAC;IACzD,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;QACvC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,EACL,QAAQ,EACR,EAAE,EACF,MAAM,EACN,EAAE,EACF,UAAU,EACV,SAAS,GAGV,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,UAAU,EACV,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAa,CAAC;IACnD,OAAO;QACL,GAAG,QAAQ;QACX,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;QACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;QACtB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;KACnB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;CACrC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,gBAA8C,CAAC;IACnD,IAAI,qBAAuD,CAAC;IAC5D,IAAI,mBAAoD,CAAC;IAEzD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC5C,qBAAqB,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACrD,mBAAmB,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAClD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC9D,qBAAyC,CAAC,kBAAkB,CAC3D,CAAC,UAAkB,EAAE,EAAE,CAAC,UAAU,CACnC,CAAC;QACD,gBAAyB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,EAAE,CAAC,YAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAgC,KAAK,EAAE;YAC9D,gBAAyB,CAAC,kBAAkB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,yBAAyB,CACvC,CAAC;YACD,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjD,IAAI,CAAC,KAAK,yBAAyB;oBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;YAErC,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAED,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;gBACxB,MAAM,EAAE;oBACN,YAAY,EAAE,UAAU,CAAC,YAAY;oBACrC,wBAAwB,EAAE,UAAU,CAAC,YAAY;oBACjD,cAAc,EAAE,UAAU,CAAC,YAAY;oBACvC,SAAS,EAAE,UAAU,CAAC,YAAY;oBAClC,oBAAoB,EAAE,UAAU,CAAC,YAAY;iBAC9C;aACF,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAClE,IAAI,CACL,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnE,oCAAoC;YACpC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAC7D,SAAS,CACV,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAC/D,SAAS,CACV,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC1C,gBAAyB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG;YAClB,cAAc,EAAE,UAAU,CAAC,YAAY;SACxC,CAAC;QACD,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,YAAY,EAAE;SAC9D,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QAC1C,gBAAyB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpE,EAAE,CAAC,YAAqB,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,cAAc,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,aAAa,GAAG,kBAAkB,EAAE,CAAC;QAC3C,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CACjD,UAAU,CAAC,YAAY,CACxB,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAC9C,yBAAyB,EACzB,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACjE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CACnC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,OAAe,CAAC;IACpB,MAAM,SAAS,GAA+B,EAAE,CAAC;IACjD,MAAM,YAAY,GAAa;QAC7B,WAAW,EAAE,IAAI;KACN,CAAC;IAEd,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3D,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,IAAI,CAAC,KAAK,yBAAyB,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,yBAAyB,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,mBAAmB;QACnB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,GAAG,yBAAyB,CAAC;QACpC,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,kCAAkC,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QACxE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,OAAO,GAAG,sBAAsB,CAAC;QACjC,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,OAAO,GAAG,0BAA0B,CAAC;QACrC,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,OAAO,GAAG,kBAAkB,CAAC;QAC7B,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,SAAS,CAAC,sBAAsB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,GAAG,+BAA+B,CAAC;QAC1C,SAAS,CAAC,qBAAqB,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QAC3D,SAAS,CAAC,+BAA+B,CAAC,GAAG,UAAU,CAAC,YAAY,CAAC;QACrE,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,OAAO,GAAG,qBAAqB,CAAC;QAChC,SAAS,CAAC,sBAAsB,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACrE,UAAU,CAAC,YAAY,CAAC;QAC1B,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,MAAM,cAAc,EAA2B,CAAC;IAC/D,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;KACrB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,MAAM,YAAY,GAAa;QAC7B,WAAW,EAAE,IAAI;KACN,CAAC;IAEd,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,wDAAwD;QACxD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,kDAAkD;QAClD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAClD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAC7D,CAAC;QACF,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GAAa;YACzB,WAAW,EAAE,KAAK;SACP,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/src/gemini.js
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
2
|
/**
|
3
3
|
* @license
|
4
4
|
* Copyright 2025 Vybestack LLC
|
5
5
|
* SPDX-License-Identifier: Apache-2.0
|
6
6
|
*/
|
7
|
-
import React from 'react';
|
8
|
-
import { render } from 'ink';
|
7
|
+
import React, { useState, useEffect } from 'react';
|
8
|
+
import { render, Box, Text } from 'ink';
|
9
|
+
import Spinner from 'ink-spinner';
|
9
10
|
import { AppWrapper } from './ui/App.js';
|
10
11
|
import { ErrorBoundary } from './ui/components/ErrorBoundary.js';
|
11
12
|
import { loadCliConfig, parseArguments } from './config/config.js';
|
@@ -19,7 +20,7 @@ import { spawn } from 'node:child_process';
|
|
19
20
|
import { start_sandbox } from './utils/sandbox.js';
|
20
21
|
import chalk from 'chalk';
|
21
22
|
import { loadSettings, SettingScope, } from './config/settings.js';
|
22
|
-
import { getSettingsService, sessionId, AuthType, getOauthClient, setGitStatsService, FatalConfigError,
|
23
|
+
import { getSettingsService, sessionId, AuthType, getOauthClient, setGitStatsService, FatalConfigError, uiTelemetryService,
|
23
24
|
// IDE connection logging removed - telemetry disabled in llxprt
|
24
25
|
} from '@vybestack/llxprt-code-core';
|
25
26
|
import { themeManager } from './ui/themes/theme-manager.js';
|
@@ -28,7 +29,7 @@ import { getUserStartupWarnings } from './utils/userStartupWarnings.js';
|
|
28
29
|
import { ConsolePatcher } from './ui/utils/ConsolePatcher.js';
|
29
30
|
import { runNonInteractive } from './nonInteractiveCli.js';
|
30
31
|
import { loadExtensions } from './config/extension.js';
|
31
|
-
import { cleanupCheckpoints, registerCleanup } from './utils/cleanup.js';
|
32
|
+
import { cleanupCheckpoints, registerCleanup, runExitCleanup, } from './utils/cleanup.js';
|
32
33
|
import { getCliVersion } from './utils/version.js';
|
33
34
|
import { validateAuthMethod } from './config/auth.js';
|
34
35
|
import { setMaxSizedBoxDebugging } from './ui/components/shared/MaxSizedBox.js';
|
@@ -41,6 +42,7 @@ import { handleAutoUpdate } from './utils/handleAutoUpdate.js';
|
|
41
42
|
import { GitStatsServiceImpl } from './providers/logging/git-stats-service-impl.js';
|
42
43
|
import { appEvents, AppEvent } from './utils/events.js';
|
43
44
|
import { SettingsContext } from './ui/contexts/SettingsContext.js';
|
45
|
+
import { writeFileSync } from 'node:fs';
|
44
46
|
export function validateDnsResolutionOrder(order) {
|
45
47
|
const defaultValue = 'ipv4first';
|
46
48
|
if (order === undefined) {
|
@@ -83,6 +85,26 @@ async function relaunchWithAdditionalArgs(additionalArgs) {
|
|
83
85
|
await new Promise((resolve) => child.on('close', resolve));
|
84
86
|
process.exit(0);
|
85
87
|
}
|
88
|
+
const InitializingComponent = ({ initialTotal }) => {
|
89
|
+
const [total, setTotal] = useState(initialTotal);
|
90
|
+
const [connected, setConnected] = useState(0);
|
91
|
+
useEffect(() => {
|
92
|
+
const onStart = ({ count }) => setTotal(count);
|
93
|
+
const onChange = () => {
|
94
|
+
setConnected((val) => val + 1);
|
95
|
+
};
|
96
|
+
appEvents.on('mcp-servers-discovery-start', onStart);
|
97
|
+
appEvents.on('mcp-server-connected', onChange);
|
98
|
+
appEvents.on('mcp-server-error', onChange);
|
99
|
+
return () => {
|
100
|
+
appEvents.off('mcp-servers-discovery-start', onStart);
|
101
|
+
appEvents.off('mcp-server-connected', onChange);
|
102
|
+
appEvents.off('mcp-server-error', onChange);
|
103
|
+
};
|
104
|
+
}, []);
|
105
|
+
const message = `Connecting to MCP servers... (${connected}/${total})`;
|
106
|
+
return (_jsx(Box, { children: _jsxs(Text, { children: [_jsx(Spinner, {}), " ", message] }) }));
|
107
|
+
};
|
86
108
|
import { runZedIntegration } from './zed-integration/zedIntegration.js';
|
87
109
|
import { existsSync, mkdirSync } from 'fs';
|
88
110
|
import { homedir } from 'os';
|
@@ -162,7 +184,25 @@ export async function main() {
|
|
162
184
|
const workspaceRoot = process.cwd();
|
163
185
|
const settings = loadSettings(workspaceRoot);
|
164
186
|
const argv = await parseArguments(settings.merged);
|
187
|
+
const hasPipedInput = !process.stdin.isTTY;
|
188
|
+
let cachedStdinData = null;
|
189
|
+
let stdinWasRead = false;
|
190
|
+
const readStdinOnce = async () => {
|
191
|
+
if (!stdinWasRead) {
|
192
|
+
stdinWasRead = true;
|
193
|
+
cachedStdinData = await readStdin();
|
194
|
+
}
|
195
|
+
return cachedStdinData ?? '';
|
196
|
+
};
|
197
|
+
const questionFromArgs = argv.promptInteractive || argv.prompt || (argv.promptWords || []).join(' ');
|
165
198
|
await cleanupCheckpoints();
|
199
|
+
if (hasPipedInput) {
|
200
|
+
const stdinSnapshot = await readStdinOnce();
|
201
|
+
if (!stdinSnapshot && !questionFromArgs) {
|
202
|
+
console.error(`No input provided via stdin. Input can be provided by piping data into gemini or using the --prompt option.`);
|
203
|
+
process.exit(1);
|
204
|
+
}
|
205
|
+
}
|
166
206
|
if (settings.errors.length > 0) {
|
167
207
|
const errorMessages = settings.errors.map((error) => `Error in ${error.path}: ${error.message}`);
|
168
208
|
throw new FatalConfigError(`${errorMessages.join('\n')}\nPlease fix the configuration file(s) and try again.`);
|
@@ -176,6 +216,12 @@ export async function main() {
|
|
176
216
|
}
|
177
217
|
const extensions = loadExtensions(workspaceRoot);
|
178
218
|
const config = await loadCliConfig(settings.merged, extensions, sessionId, argv);
|
219
|
+
if (argv.sessionSummary) {
|
220
|
+
registerCleanup(() => {
|
221
|
+
const metrics = uiTelemetryService.getMetrics();
|
222
|
+
writeFileSync(argv.sessionSummary, JSON.stringify({ sessionMetrics: metrics }, null, 2));
|
223
|
+
});
|
224
|
+
}
|
179
225
|
const consolePatcher = new ConsolePatcher({
|
180
226
|
stderr: true,
|
181
227
|
debugMode: config.getDebugMode(),
|
@@ -217,15 +263,22 @@ export async function main() {
|
|
217
263
|
settings.setValue(SettingScope.User, 'selectedAuthType', AuthType.USE_NONE);
|
218
264
|
}
|
219
265
|
}
|
220
|
-
// Empty key causes issues with the GoogleGenAI package.
|
221
|
-
if (process.env['GEMINI_API_KEY']?.trim() === '') {
|
222
|
-
delete process.env['GEMINI_API_KEY'];
|
223
|
-
}
|
224
|
-
if (process.env['GOOGLE_API_KEY']?.trim() === '') {
|
225
|
-
delete process.env['GOOGLE_API_KEY'];
|
226
|
-
}
|
227
266
|
setMaxSizedBoxDebugging(config.getDebugMode());
|
267
|
+
const mcpServers = config.getMcpServers();
|
268
|
+
const mcpServersCount = mcpServers ? Object.keys(mcpServers).length : 0;
|
269
|
+
let spinnerInstance;
|
270
|
+
if (typeof config.isInteractive === 'function' &&
|
271
|
+
config.isInteractive() &&
|
272
|
+
mcpServersCount > 0) {
|
273
|
+
spinnerInstance = render(_jsx(InitializingComponent, { initialTotal: mcpServersCount }));
|
274
|
+
}
|
228
275
|
await config.initialize();
|
276
|
+
if (spinnerInstance) {
|
277
|
+
// Small UX detail to show the completion message for a bit before unmounting.
|
278
|
+
await new Promise((f) => setTimeout(f, 100));
|
279
|
+
spinnerInstance.clear();
|
280
|
+
spinnerInstance.unmount();
|
281
|
+
}
|
229
282
|
if (config.getIdeMode()) {
|
230
283
|
const ideClient = config.getIdeClient();
|
231
284
|
if (ideClient) {
|
@@ -448,8 +501,8 @@ export async function main() {
|
|
448
501
|
}
|
449
502
|
}
|
450
503
|
let stdinData = '';
|
451
|
-
if (
|
452
|
-
stdinData = await
|
504
|
+
if (hasPipedInput) {
|
505
|
+
stdinData = await readStdinOnce();
|
453
506
|
}
|
454
507
|
// This function is a copy of the one from sandbox.ts
|
455
508
|
// It is moved here to decouple sandbox.ts from the CLI's argument structure.
|
@@ -515,16 +568,17 @@ export async function main() {
|
|
515
568
|
// Check if a provider is already active on startup
|
516
569
|
providerManager.getActiveProvider();
|
517
570
|
// Render UI, passing necessary config values. Check that there is no command line question.
|
518
|
-
if (config.isInteractive()) {
|
571
|
+
if (typeof config.isInteractive === 'function' && config.isInteractive()) {
|
519
572
|
await startInteractiveUI(config, settings, startupWarnings, workspaceRoot);
|
520
573
|
return;
|
521
574
|
}
|
522
575
|
// If not a TTY, read from stdin
|
523
576
|
// This is for cases where the user pipes input directly into the command
|
524
|
-
if (
|
525
|
-
const stdinData = await
|
577
|
+
if (hasPipedInput) {
|
578
|
+
const stdinData = await readStdinOnce();
|
526
579
|
if (stdinData) {
|
527
|
-
|
580
|
+
const existingInput = input ? `${input}` : '';
|
581
|
+
input = `${stdinData}\n\n${existingInput}`;
|
528
582
|
}
|
529
583
|
}
|
530
584
|
if (!input) {
|
@@ -534,6 +588,8 @@ export async function main() {
|
|
534
588
|
const prompt_id = Math.random().toString(16).slice(2);
|
535
589
|
const nonInteractiveConfig = await validateNonInteractiveAuth(settings.merged.selectedAuthType, settings.merged.useExternalAuth, config);
|
536
590
|
await runNonInteractive(nonInteractiveConfig, input, prompt_id);
|
591
|
+
// Call cleanup before process.exit, which causes cleanup to not run
|
592
|
+
await runExitCleanup();
|
537
593
|
process.exit(0);
|
538
594
|
}
|
539
595
|
function setWindowTitle(title, settings) {
|