@vybestack/llxprt-code 0.1.14 → 0.1.16
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 +90 -2
- package/dist/package.json +4 -5
- package/dist/src/config/config.d.ts +4 -1
- package/dist/src/config/config.js +151 -54
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +1 -0
- package/dist/src/config/extension.js +4 -0
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/settings.d.ts +13 -3
- package/dist/src/config/settings.js +84 -23
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.d.ts +3 -0
- package/dist/src/gemini.js +212 -36
- package/dist/src/gemini.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/generated/git-commit.js.map +1 -1
- package/dist/src/integration-tests/GITHUB_ACTIONS_README.md +41 -0
- package/dist/src/integration-tests/test-utils.d.ts +68 -0
- package/dist/src/integration-tests/test-utils.js +167 -0
- package/dist/src/integration-tests/test-utils.js.map +1 -0
- package/dist/src/nonInteractiveCli.js +24 -66
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/IFileSystem.d.ts +42 -0
- package/dist/src/providers/IFileSystem.js +46 -0
- package/dist/src/providers/IFileSystem.js.map +1 -0
- package/dist/src/providers/providerConfigUtils.d.ts +0 -4
- package/dist/src/providers/providerConfigUtils.js +21 -52
- package/dist/src/providers/providerConfigUtils.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.d.ts +6 -1
- package/dist/src/providers/providerManagerInstance.js +117 -82
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +13 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/CommandService.d.ts +8 -4
- package/dist/src/services/CommandService.js +24 -8
- package/dist/src/services/CommandService.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +15 -3
- package/dist/src/services/FileCommandLoader.js +94 -42
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.d.ts +25 -0
- package/dist/src/services/McpPromptLoader.js +192 -0
- package/dist/src/services/McpPromptLoader.js.map +1 -0
- package/dist/src/services/prompt-processors/shellProcessor.d.ts +32 -0
- package/dist/src/services/prompt-processors/shellProcessor.js +77 -0
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
- package/dist/src/services/prompt-processors/types.d.ts +4 -0
- package/dist/src/services/prompt-processors/types.js +4 -0
- package/dist/src/services/prompt-processors/types.js.map +1 -1
- package/dist/src/ui/App.js +325 -195
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +2 -5
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/baseurlCommand.js +54 -9
- package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +39 -1
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.d.ts +10 -0
- package/dist/src/ui/commands/diagnosticsCommand.js +122 -0
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -0
- package/dist/src/ui/commands/directoryCommand.d.ts +8 -0
- package/dist/src/ui/commands/directoryCommand.js +116 -0
- package/dist/src/ui/commands/directoryCommand.js.map +1 -0
- package/dist/src/ui/commands/ideCommand.js +101 -105
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/initCommand.d.ts +7 -0
- package/dist/src/ui/commands/initCommand.js +108 -0
- package/dist/src/ui/commands/initCommand.js.map +1 -0
- package/dist/src/ui/commands/keyCommand.js +75 -11
- package/dist/src/ui/commands/keyCommand.js.map +1 -1
- package/dist/src/ui/commands/keyfileCommand.js +54 -13
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +53 -8
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +2 -1
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +2 -5
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.d.ts +10 -0
- package/dist/src/ui/commands/profileCommand.js +592 -0
- package/dist/src/ui/commands/profileCommand.js.map +1 -0
- package/dist/src/ui/commands/providerCommand.js +46 -3
- package/dist/src/ui/commands/providerCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.d.ts +7 -0
- package/dist/src/ui/commands/setCommand.js +431 -0
- package/dist/src/ui/commands/setCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.d.ts +7 -0
- package/dist/src/ui/commands/setupGithubCommand.js +49 -0
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +23 -4
- package/dist/src/ui/commands/types.js +1 -0
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/commands/vimCommand.js +0 -7
- package/dist/src/ui/commands/vimCommand.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.d.ts +3 -3
- package/dist/src/ui/components/ContextSummaryDisplay.js +8 -8
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
- package/dist/src/ui/components/DebugProfiler.js +26 -0
- package/dist/src/ui/components/DebugProfiler.js.map +1 -0
- package/dist/src/ui/components/Footer.d.ts +2 -0
- package/dist/src/ui/components/Footer.js +5 -4
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Header.js +1 -1
- package/dist/src/ui/components/Header.js.map +1 -1
- package/dist/src/ui/components/Help.js +2 -2
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/IDEContextDetailDisplay.d.ts +5 -4
- package/dist/src/ui/components/IDEContextDetailDisplay.js +6 -8
- package/dist/src/ui/components/IDEContextDetailDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.d.ts +2 -0
- package/dist/src/ui/components/InputPrompt.js +128 -13
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoadProfileDialog.d.ts +13 -0
- package/dist/src/ui/components/LoadProfileDialog.js +57 -0
- package/dist/src/ui/components/LoadProfileDialog.js.map +1 -0
- package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
- package/dist/src/ui/components/PrepareLabel.js +16 -0
- package/dist/src/ui/components/PrepareLabel.js.map +1 -0
- package/dist/src/ui/components/ProviderModelDialog.js +75 -28
- package/dist/src/ui/components/ProviderModelDialog.js.map +1 -1
- package/dist/src/ui/components/SecureKeyInput.d.ts +15 -0
- package/dist/src/ui/components/SecureKeyInput.js +58 -0
- package/dist/src/ui/components/SecureKeyInput.js.map +1 -0
- package/dist/src/ui/components/ShellConfirmationDialog.d.ts +15 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js +45 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
- package/dist/src/ui/components/SuggestionsDisplay.d.ts +1 -0
- package/dist/src/ui/components/SuggestionsDisplay.js +3 -3
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/Tips.js +1 -1
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +15 -4
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +4 -1
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.d.ts +270 -2
- package/dist/src/ui/components/shared/text-buffer.js +410 -70
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +72 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.js +565 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
- package/dist/src/ui/containers/SessionController.js +14 -15
- package/dist/src/ui/containers/SessionController.js.map +1 -1
- package/dist/src/ui/contexts/VimModeContext.js +2 -2
- package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
- package/dist/src/ui/editors/editorSettingsManager.js +2 -0
- package/dist/src/ui/editors/editorSettingsManager.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +56 -48
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.js +139 -200
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +7 -3
- package/dist/src/ui/hooks/slashCommandProcessor.js +219 -130
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +9 -0
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCompletion.d.ts +5 -5
- package/dist/src/ui/hooks/useCompletion.js +7 -402
- package/dist/src/ui/hooks/useCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useConsoleMessages.js +53 -37
- package/dist/src/ui/hooks/useConsoleMessages.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +58 -12
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useKeypress.js +5 -2
- package/dist/src/ui/hooks/useKeypress.js.map +1 -1
- package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +27 -0
- package/dist/src/ui/hooks/useLoadProfileDialog.js +138 -0
- package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -0
- package/dist/src/ui/hooks/useReactToolScheduler.js +0 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.js +54 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useShellHistory.d.ts +1 -0
- package/dist/src/ui/hooks/useShellHistory.js +30 -7
- package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +24 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +451 -0
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -0
- package/dist/src/ui/hooks/vim.d.ts +28 -0
- package/dist/src/ui/hooks/vim.js +630 -0
- package/dist/src/ui/hooks/vim.js.map +1 -0
- package/dist/src/ui/reducers/appReducer.d.ts +3 -2
- package/dist/src/ui/reducers/appReducer.js +1 -0
- package/dist/src/ui/reducers/appReducer.js.map +1 -1
- package/dist/src/ui/themes/theme-manager.js +10 -1
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/themes/theme.d.ts +1 -0
- package/dist/src/ui/themes/theme.js +19 -4
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/utils/renderLoopDetector.js +3 -3
- package/dist/src/ui/utils/renderLoopDetector.js.map +1 -1
- package/dist/src/ui/utils/secureInputHandler.d.ts +46 -0
- package/dist/src/ui/utils/secureInputHandler.js +128 -0
- package/dist/src/ui/utils/secureInputHandler.js.map +1 -0
- package/dist/src/ui/utils/textUtils.d.ts +0 -8
- package/dist/src/ui/utils/textUtils.js +0 -22
- package/dist/src/ui/utils/textUtils.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.d.ts +7 -1
- package/dist/src/ui/utils/updateCheck.js +59 -25
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/utils/events.d.ts +11 -0
- package/dist/src/utils/events.js +13 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +10 -0
- package/dist/src/utils/gitUtils.js +24 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/handleAutoUpdate.d.ts +11 -0
- package/dist/src/utils/handleAutoUpdate.js +101 -0
- package/dist/src/utils/handleAutoUpdate.js.map +1 -0
- package/dist/src/utils/installationInfo.d.ts +23 -0
- package/dist/src/utils/installationInfo.js +154 -0
- package/dist/src/utils/installationInfo.js.map +1 -0
- package/dist/src/utils/sandbox-macos-permissive-closed.sb +6 -0
- package/dist/src/utils/sandbox-macos-permissive-open.sb +6 -0
- package/dist/src/utils/sandbox-macos-permissive-proxied.sb +6 -0
- package/dist/src/utils/sandbox-macos-restrictive-closed.sb +6 -0
- package/dist/src/utils/sandbox-macos-restrictive-open.sb +6 -0
- package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +6 -0
- package/dist/src/utils/sandbox.d.ts +2 -2
- package/dist/src/utils/sandbox.js +35 -11
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/spawnWrapper.d.ts +7 -0
- package/dist/src/utils/spawnWrapper.js +8 -0
- package/dist/src/utils/spawnWrapper.js.map +1 -0
- package/dist/src/utils/updateEventEmitter.d.ts +11 -0
- package/dist/src/utils/updateEventEmitter.js +12 -0
- package/dist/src/utils/updateEventEmitter.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.d.ts +2 -1
- package/dist/src/validateNonInterActiveAuth.js +31 -5
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -5
- package/dist/src/providers/enhanceConfigWithProviders.d.ts +0 -12
- package/dist/src/providers/enhanceConfigWithProviders.js +0 -16
- package/dist/src/providers/enhanceConfigWithProviders.js.map +0 -1
@@ -15,10 +15,6 @@ export interface ProviderConfigResult {
|
|
15
15
|
* Sets or removes the API key for the active provider
|
16
16
|
*/
|
17
17
|
export declare function setProviderApiKey(providerManager: ProviderManager, settings: LoadedSettings, apiKey: string | undefined, config?: Config): Promise<ProviderConfigResult>;
|
18
|
-
/**
|
19
|
-
* Sets the API key from a file for the active provider
|
20
|
-
*/
|
21
|
-
export declare function setProviderApiKeyFromFile(providerManager: ProviderManager, settings: LoadedSettings, filePath: string, config?: Config): Promise<ProviderConfigResult>;
|
22
18
|
/**
|
23
19
|
* Sets or clears the base URL for the active provider
|
24
20
|
*/
|
@@ -3,10 +3,20 @@
|
|
3
3
|
* Copyright 2025 Google LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
-
import {
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
import { AuthType, sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
|
7
|
+
/**
|
8
|
+
* Sanitizes API keys to remove problematic characters that cause ByteString errors.
|
9
|
+
* This handles cases where API key files have encoding issues or contain
|
10
|
+
* Unicode replacement characters (U+FFFD).
|
11
|
+
*/
|
12
|
+
function sanitizeApiKey(key) {
|
13
|
+
const sanitized = sanitizeForByteString(key);
|
14
|
+
if (needsSanitization(key)) {
|
15
|
+
console.warn('[ProviderConfig] API key contained non-ASCII or control characters that were removed. ' +
|
16
|
+
'Please check your API key file encoding (should be UTF-8 without BOM).');
|
17
|
+
}
|
18
|
+
return sanitized;
|
19
|
+
}
|
10
20
|
/**
|
11
21
|
* Sets or removes the API key for the active provider
|
12
22
|
*/
|
@@ -21,10 +31,7 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
|
|
21
31
|
// Clear the API key
|
22
32
|
if (activeProvider.setApiKey) {
|
23
33
|
activeProvider.setApiKey('');
|
24
|
-
//
|
25
|
-
const currentKeys = settings.merged.providerApiKeys || {};
|
26
|
-
delete currentKeys[providerName];
|
27
|
-
settings.setValue(SettingScope.User, 'providerApiKeys', currentKeys);
|
34
|
+
// Don't need to remove from settings as we no longer save API keys there
|
28
35
|
// If this is the Gemini provider, we might need to switch auth mode
|
29
36
|
const requiresAuthRefresh = providerName === 'gemini' && !!config;
|
30
37
|
if (requiresAuthRefresh && config) {
|
@@ -49,13 +56,11 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
|
|
49
56
|
};
|
50
57
|
}
|
51
58
|
}
|
52
|
-
// Update the provider's API key
|
59
|
+
// Update the provider's API key (sanitized)
|
53
60
|
if (activeProvider.setApiKey) {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
currentKeys[providerName] = apiKey;
|
58
|
-
settings.setValue(SettingScope.User, 'providerApiKeys', currentKeys);
|
61
|
+
const sanitizedKey = sanitizeApiKey(apiKey);
|
62
|
+
activeProvider.setApiKey(sanitizedKey);
|
63
|
+
// Don't save API keys to settings - they should only be in profiles or ephemeral
|
59
64
|
// If this is the Gemini provider, we need to refresh auth to use API key mode
|
60
65
|
const requiresAuthRefresh = providerName === 'gemini' && !!config;
|
61
66
|
if (requiresAuthRefresh && config) {
|
@@ -87,36 +92,6 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
|
|
87
92
|
};
|
88
93
|
}
|
89
94
|
}
|
90
|
-
/**
|
91
|
-
* Sets the API key from a file for the active provider
|
92
|
-
*/
|
93
|
-
export async function setProviderApiKeyFromFile(providerManager, settings, filePath, config) {
|
94
|
-
try {
|
95
|
-
// Resolve ~ to home directory
|
96
|
-
const resolvedPath = filePath.replace(/^~/, homedir());
|
97
|
-
// Read the API key from file
|
98
|
-
const apiKey = (await readFile(resolvedPath, 'utf-8')).trim();
|
99
|
-
if (!apiKey) {
|
100
|
-
return {
|
101
|
-
success: false,
|
102
|
-
message: 'The specified file is empty',
|
103
|
-
};
|
104
|
-
}
|
105
|
-
// Use the setProviderApiKey function to handle the actual key setting
|
106
|
-
const result = await setProviderApiKey(providerManager, settings, apiKey, config);
|
107
|
-
// Modify the message to indicate it was loaded from a file
|
108
|
-
if (result.success && result.message.includes('API key updated')) {
|
109
|
-
result.message = result.message.replace('API key updated', `API key loaded from ${resolvedPath}`);
|
110
|
-
}
|
111
|
-
return result;
|
112
|
-
}
|
113
|
-
catch (error) {
|
114
|
-
return {
|
115
|
-
success: false,
|
116
|
-
message: `Failed to process keyfile: ${error instanceof Error ? error.message : String(error)}`,
|
117
|
-
};
|
118
|
-
}
|
119
|
-
}
|
120
95
|
/**
|
121
96
|
* Sets or clears the base URL for the active provider
|
122
97
|
*/
|
@@ -128,10 +103,7 @@ export async function setProviderBaseUrl(providerManager, settings, baseUrl) {
|
|
128
103
|
// Clear base URL to provider default
|
129
104
|
if (activeProvider.setBaseUrl) {
|
130
105
|
activeProvider.setBaseUrl(undefined);
|
131
|
-
//
|
132
|
-
const currentUrls = settings.merged.providerBaseUrls || {};
|
133
|
-
delete currentUrls[providerName];
|
134
|
-
settings.setValue(SettingScope.User, 'providerBaseUrls', currentUrls);
|
106
|
+
// Don't need to remove from settings as we no longer save base URLs there
|
135
107
|
return {
|
136
108
|
success: true,
|
137
109
|
message: `Base URL cleared, provider '${providerName}' now uses default URL`,
|
@@ -147,10 +119,7 @@ export async function setProviderBaseUrl(providerManager, settings, baseUrl) {
|
|
147
119
|
// Update the provider's base URL
|
148
120
|
if (activeProvider.setBaseUrl) {
|
149
121
|
activeProvider.setBaseUrl(baseUrl);
|
150
|
-
//
|
151
|
-
const currentUrls = settings.merged.providerBaseUrls || {};
|
152
|
-
currentUrls[providerName] = baseUrl;
|
153
|
-
settings.setValue(SettingScope.User, 'providerBaseUrls', currentUrls);
|
122
|
+
// Don't save base URLs to settings - they should only be in profiles or ephemeral
|
154
123
|
return {
|
155
124
|
success: true,
|
156
125
|
message: `Base URL updated to '${baseUrl}' for provider '${providerName}'`,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"providerConfigUtils.js","sourceRoot":"","sources":["../../../src/providers/providerConfigUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
1
|
+
{"version":3,"file":"providerConfigUtils.js","sourceRoot":"","sources":["../../../src/providers/providerConfigUtils.ts"],"names":[],"mappings":"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"}
|
@@ -4,6 +4,11 @@
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
6
|
import { Config, ProviderManager } from '@vybestack/llxprt-code-core';
|
7
|
-
|
7
|
+
import { IFileSystem } from './IFileSystem.js';
|
8
|
+
/**
|
9
|
+
* Set a custom file system implementation (mainly for testing).
|
10
|
+
*/
|
11
|
+
export declare function setFileSystem(fs: IFileSystem): void;
|
12
|
+
export declare function getProviderManager(config?: Config, allowBrowserEnvironment?: boolean): ProviderManager;
|
8
13
|
export declare function resetProviderManager(): void;
|
9
14
|
export { getProviderManager as providerManager };
|
@@ -3,109 +3,144 @@
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
5
5
|
*/
|
6
|
-
import { ProviderManager, OpenAIProvider, AnthropicProvider, GeminiProvider, } from '@vybestack/llxprt-code-core';
|
7
|
-
import {
|
6
|
+
import { ProviderManager, OpenAIProvider, AnthropicProvider, GeminiProvider, sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
|
7
|
+
import { NodeFileSystem } from './IFileSystem.js';
|
8
8
|
import { homedir } from 'os';
|
9
9
|
import { join } from 'path';
|
10
10
|
import { USER_SETTINGS_PATH } from '../config/settings.js';
|
11
11
|
import stripJsonComments from 'strip-json-comments';
|
12
|
+
/**
|
13
|
+
* Sanitizes API keys to remove problematic characters that cause ByteString errors.
|
14
|
+
* This handles cases where API key files have encoding issues or contain
|
15
|
+
* Unicode replacement characters (U+FFFD).
|
16
|
+
*/
|
17
|
+
function sanitizeApiKey(key) {
|
18
|
+
const sanitized = sanitizeForByteString(key);
|
19
|
+
if (needsSanitization(key)) {
|
20
|
+
console.warn('[ProviderManager] API key contained non-ASCII or control characters that were removed. ' +
|
21
|
+
'Please check your API key file encoding (should be UTF-8 without BOM).');
|
22
|
+
}
|
23
|
+
return sanitized;
|
24
|
+
}
|
12
25
|
let providerManagerInstance = null;
|
13
|
-
|
26
|
+
let fileSystemInstance = null;
|
27
|
+
/**
|
28
|
+
* Set a custom file system implementation (mainly for testing).
|
29
|
+
*/
|
30
|
+
export function setFileSystem(fs) {
|
31
|
+
fileSystemInstance = fs;
|
32
|
+
}
|
33
|
+
/**
|
34
|
+
* Get the file system implementation to use.
|
35
|
+
*/
|
36
|
+
function getFileSystem() {
|
37
|
+
if (!fileSystemInstance) {
|
38
|
+
fileSystemInstance = new NodeFileSystem();
|
39
|
+
}
|
40
|
+
return fileSystemInstance;
|
41
|
+
}
|
42
|
+
export function getProviderManager(config, allowBrowserEnvironment = false) {
|
14
43
|
if (!providerManagerInstance) {
|
15
44
|
providerManagerInstance = new ProviderManager();
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
const userContent = readFileSync(USER_SETTINGS_PATH, 'utf-8');
|
24
|
-
userSettings = JSON.parse(stripJsonComments(userContent));
|
25
|
-
savedApiKeys = userSettings.providerApiKeys || {};
|
26
|
-
}
|
27
|
-
}
|
28
|
-
catch (_error) {
|
29
|
-
// Failed to load user settings, that's OK
|
45
|
+
const fs = getFileSystem();
|
46
|
+
// Load user settings
|
47
|
+
let userSettings;
|
48
|
+
try {
|
49
|
+
if (fs.existsSync(USER_SETTINGS_PATH)) {
|
50
|
+
const userContent = fs.readFileSync(USER_SETTINGS_PATH, 'utf-8');
|
51
|
+
userSettings = JSON.parse(stripJsonComments(userContent));
|
30
52
|
}
|
31
|
-
|
32
|
-
|
33
|
-
//
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
try {
|
49
|
-
const keyfilePath = join(homedir(), '.google_key');
|
50
|
-
const geminiApiKey = readFileSync(keyfilePath, 'utf-8').trim();
|
51
|
-
if (geminiApiKey) {
|
52
|
-
geminiProvider.setApiKey(geminiApiKey);
|
53
|
-
}
|
54
|
-
}
|
55
|
-
catch (_error) {
|
56
|
-
// No Google keyfile available, that's OK - will use OAuth if available
|
53
|
+
}
|
54
|
+
catch (_error) {
|
55
|
+
// Failed to load user settings, that's OK
|
56
|
+
}
|
57
|
+
// Always register GeminiProvider
|
58
|
+
const geminiProvider = new GeminiProvider(undefined, undefined, config);
|
59
|
+
if (config) {
|
60
|
+
geminiProvider.setConfig(config);
|
61
|
+
}
|
62
|
+
providerManagerInstance.registerProvider(geminiProvider);
|
63
|
+
// Configure Gemini auth - check for keyfile only
|
64
|
+
try {
|
65
|
+
const keyfilePath = join(homedir(), '.google_key');
|
66
|
+
if (fs.existsSync(keyfilePath)) {
|
67
|
+
const geminiApiKey = fs.readFileSync(keyfilePath, 'utf-8').trim();
|
68
|
+
if (geminiApiKey) {
|
69
|
+
geminiProvider.setApiKey(sanitizeApiKey(geminiApiKey));
|
57
70
|
}
|
58
71
|
}
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
+
}
|
73
|
+
catch (_error) {
|
74
|
+
// No Google keyfile available, that's OK - will use OAuth if available
|
75
|
+
}
|
76
|
+
// Always register OpenAI provider
|
77
|
+
// Priority: Environment variable > keyfile (skip keyfile in test)
|
78
|
+
let openaiApiKey;
|
79
|
+
if (process.env.OPENAI_API_KEY) {
|
80
|
+
openaiApiKey = sanitizeApiKey(process.env.OPENAI_API_KEY);
|
81
|
+
}
|
82
|
+
if (!openaiApiKey) {
|
83
|
+
try {
|
84
|
+
const apiKeyPath = join(homedir(), '.openai_key');
|
85
|
+
if (fs.existsSync(apiKeyPath)) {
|
86
|
+
const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
|
87
|
+
openaiApiKey = sanitizeApiKey(rawKey);
|
72
88
|
}
|
73
89
|
}
|
74
|
-
|
75
|
-
|
76
|
-
console.log('[ProviderManager] Initializing OpenAI provider with:', {
|
77
|
-
hasApiKey: !!openaiApiKey,
|
78
|
-
baseUrl: openaiBaseUrl || 'default',
|
79
|
-
});
|
80
|
-
}
|
81
|
-
const openaiProvider = new OpenAIProvider(openaiApiKey || '', openaiBaseUrl, userSettings);
|
82
|
-
providerManagerInstance.registerProvider(openaiProvider);
|
83
|
-
// OpenAI provider registered
|
84
|
-
// Initialize with Anthropic provider if API key is available
|
85
|
-
// Priority: CLI /key (in settings) > Environment variable > keyfile
|
86
|
-
let anthropicApiKey = savedApiKeys.anthropic;
|
87
|
-
if (!anthropicApiKey) {
|
88
|
-
anthropicApiKey = process.env.ANTHROPIC_API_KEY;
|
90
|
+
catch (_error) {
|
91
|
+
// No OpenAI keyfile available, that's OK
|
89
92
|
}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
93
|
+
}
|
94
|
+
const openaiBaseUrl = process.env.OPENAI_BASE_URL;
|
95
|
+
if (process.env.DEBUG || process.env.VERBOSE) {
|
96
|
+
console.log('[ProviderManager] Initializing OpenAI provider with:', {
|
97
|
+
hasApiKey: !!openaiApiKey,
|
98
|
+
baseUrl: openaiBaseUrl || 'default',
|
99
|
+
});
|
100
|
+
}
|
101
|
+
// Create provider config from user settings
|
102
|
+
const openaiProviderConfig = {
|
103
|
+
enableTextToolCallParsing: userSettings?.enableTextToolCallParsing,
|
104
|
+
textToolCallModels: userSettings?.textToolCallModels,
|
105
|
+
providerToolFormatOverrides: userSettings?.providerToolFormatOverrides,
|
106
|
+
openaiResponsesEnabled: userSettings?.openaiResponsesEnabled,
|
107
|
+
allowBrowserEnvironment,
|
108
|
+
};
|
109
|
+
const openaiProvider = new OpenAIProvider(openaiApiKey || '', openaiBaseUrl, openaiProviderConfig);
|
110
|
+
providerManagerInstance.registerProvider(openaiProvider);
|
111
|
+
// Always register Anthropic provider
|
112
|
+
// Priority: Environment variable > keyfile (skip keyfile in test)
|
113
|
+
let anthropicApiKey;
|
114
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
115
|
+
anthropicApiKey = sanitizeApiKey(process.env.ANTHROPIC_API_KEY);
|
116
|
+
}
|
117
|
+
if (!anthropicApiKey) {
|
118
|
+
try {
|
119
|
+
const apiKeyPath = join(homedir(), '.anthropic_key');
|
120
|
+
if (fs.existsSync(apiKeyPath)) {
|
121
|
+
const rawKey = fs.readFileSync(apiKeyPath, 'utf-8').trim();
|
122
|
+
anthropicApiKey = sanitizeApiKey(rawKey);
|
97
123
|
}
|
98
124
|
}
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
// Anthropic provider registered
|
125
|
+
catch (_error) {
|
126
|
+
// No Anthropic keyfile available, that's OK
|
127
|
+
}
|
103
128
|
}
|
129
|
+
const anthropicBaseUrl = process.env.ANTHROPIC_BASE_URL;
|
130
|
+
// Create provider config from user settings
|
131
|
+
const anthropicProviderConfig = {
|
132
|
+
allowBrowserEnvironment,
|
133
|
+
};
|
134
|
+
const anthropicProvider = new AnthropicProvider(anthropicApiKey || '', anthropicBaseUrl, anthropicProviderConfig);
|
135
|
+
providerManagerInstance.registerProvider(anthropicProvider);
|
136
|
+
// Set default provider to gemini
|
137
|
+
providerManagerInstance.setActiveProvider('gemini');
|
104
138
|
}
|
105
139
|
return providerManagerInstance;
|
106
140
|
}
|
107
141
|
export function resetProviderManager() {
|
108
142
|
providerManagerInstance = null;
|
143
|
+
fileSystemInstance = null;
|
109
144
|
}
|
110
145
|
export { getProviderManager as providerManager };
|
111
146
|
//# sourceMappingURL=providerManagerInstance.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,cAAc,
|
1
|
+
{"version":3,"file":"providerManagerInstance.js","sourceRoot":"","sources":["../../../src/providers/providerManagerInstance.ts"],"names":[],"mappings":"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"}
|
@@ -11,10 +11,12 @@ import { clearCommand } from '../ui/commands/clearCommand.js';
|
|
11
11
|
import { compressCommand } from '../ui/commands/compressCommand.js';
|
12
12
|
import { copyCommand } from '../ui/commands/copyCommand.js';
|
13
13
|
import { docsCommand } from '../ui/commands/docsCommand.js';
|
14
|
+
import { directoryCommand } from '../ui/commands/directoryCommand.js';
|
14
15
|
import { editorCommand } from '../ui/commands/editorCommand.js';
|
15
16
|
import { extensionsCommand } from '../ui/commands/extensionsCommand.js';
|
16
17
|
import { helpCommand } from '../ui/commands/helpCommand.js';
|
17
18
|
import { ideCommand } from '../ui/commands/ideCommand.js';
|
19
|
+
import { initCommand } from '../ui/commands/initCommand.js';
|
18
20
|
import { mcpCommand } from '../ui/commands/mcpCommand.js';
|
19
21
|
import { memoryCommand } from '../ui/commands/memoryCommand.js';
|
20
22
|
import { privacyCommand } from '../ui/commands/privacyCommand.js';
|
@@ -30,6 +32,11 @@ import { keyCommand } from '../ui/commands/keyCommand.js';
|
|
30
32
|
import { keyfileCommand } from '../ui/commands/keyfileCommand.js';
|
31
33
|
import { baseurlCommand } from '../ui/commands/baseurlCommand.js';
|
32
34
|
import { toolformatCommand } from '../ui/commands/toolformatCommand.js';
|
35
|
+
import { setupGithubCommand } from '../ui/commands/setupGithubCommand.js';
|
36
|
+
import { setCommand } from '../ui/commands/setCommand.js';
|
37
|
+
import { profileCommand } from '../ui/commands/profileCommand.js';
|
38
|
+
import { diagnosticsCommand } from '../ui/commands/diagnosticsCommand.js';
|
39
|
+
import { isGitHubRepository } from '../utils/gitUtils.js';
|
33
40
|
/**
|
34
41
|
* Loads the core, hard-coded slash commands that are an integral part
|
35
42
|
* of the Gemini CLI application.
|
@@ -56,10 +63,12 @@ export class BuiltinCommandLoader {
|
|
56
63
|
compressCommand,
|
57
64
|
copyCommand,
|
58
65
|
docsCommand,
|
66
|
+
directoryCommand,
|
59
67
|
editorCommand,
|
60
68
|
extensionsCommand,
|
61
69
|
helpCommand,
|
62
70
|
ideCommand(this.config),
|
71
|
+
initCommand,
|
63
72
|
mcpCommand,
|
64
73
|
memoryCommand,
|
65
74
|
privacyCommand,
|
@@ -75,6 +84,10 @@ export class BuiltinCommandLoader {
|
|
75
84
|
keyfileCommand,
|
76
85
|
baseurlCommand,
|
77
86
|
toolformatCommand,
|
87
|
+
setCommand,
|
88
|
+
profileCommand,
|
89
|
+
diagnosticsCommand,
|
90
|
+
...(isGitHubRepository() ? [setupGithubCommand] : []),
|
78
91
|
];
|
79
92
|
return allDefinitions.filter((cmd) => cmd !== null);
|
80
93
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;
|
1
|
+
{"version":3,"file":"BuiltinCommandLoader.js","sourceRoot":"","sources":["../../../src/services/BuiltinCommandLoader.ts"],"names":[],"mappings":"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"}
|
@@ -28,13 +28,17 @@ export declare class CommandService {
|
|
28
28
|
*
|
29
29
|
* This factory method orchestrates the entire command loading process. It
|
30
30
|
* runs all provided loaders in parallel, aggregates their results, handles
|
31
|
-
* name conflicts
|
31
|
+
* name conflicts for extension commands by renaming them, and then returns a
|
32
32
|
* fully constructed `CommandService` instance.
|
33
33
|
*
|
34
|
+
* Conflict resolution:
|
35
|
+
* - Extension commands that conflict with existing commands are renamed to
|
36
|
+
* `extensionName.commandName`
|
37
|
+
* - Non-extension commands (built-in, user, project) override earlier commands
|
38
|
+
* with the same name based on loader order
|
39
|
+
*
|
34
40
|
* @param loaders An array of objects that conform to the `ICommandLoader`
|
35
|
-
* interface.
|
36
|
-
* provide a command with the same name, the command from the loader that
|
37
|
-
* appears later in the array will take precedence.
|
41
|
+
* interface. Built-in commands should come first, followed by FileCommandLoader.
|
38
42
|
* @param signal An AbortSignal to cancel the loading process.
|
39
43
|
* @returns A promise that resolves to a new, fully initialized `CommandService` instance.
|
40
44
|
*/
|
@@ -28,13 +28,17 @@ export class CommandService {
|
|
28
28
|
*
|
29
29
|
* This factory method orchestrates the entire command loading process. It
|
30
30
|
* runs all provided loaders in parallel, aggregates their results, handles
|
31
|
-
* name conflicts
|
31
|
+
* name conflicts for extension commands by renaming them, and then returns a
|
32
32
|
* fully constructed `CommandService` instance.
|
33
33
|
*
|
34
|
+
* Conflict resolution:
|
35
|
+
* - Extension commands that conflict with existing commands are renamed to
|
36
|
+
* `extensionName.commandName`
|
37
|
+
* - Non-extension commands (built-in, user, project) override earlier commands
|
38
|
+
* with the same name based on loader order
|
39
|
+
*
|
34
40
|
* @param loaders An array of objects that conform to the `ICommandLoader`
|
35
|
-
* interface.
|
36
|
-
* provide a command with the same name, the command from the loader that
|
37
|
-
* appears later in the array will take precedence.
|
41
|
+
* interface. Built-in commands should come first, followed by FileCommandLoader.
|
38
42
|
* @param signal An AbortSignal to cancel the loading process.
|
39
43
|
* @returns A promise that resolves to a new, fully initialized `CommandService` instance.
|
40
44
|
*/
|
@@ -49,12 +53,24 @@ export class CommandService {
|
|
49
53
|
console.debug('A command loader failed:', result.reason);
|
50
54
|
}
|
51
55
|
}
|
52
|
-
// De-duplicate commands using a Map. The last one found with a given name wins.
|
53
|
-
// This creates a natural override system based on the order of the loaders
|
54
|
-
// passed to the constructor.
|
55
56
|
const commandMap = new Map();
|
56
57
|
for (const cmd of allCommands) {
|
57
|
-
|
58
|
+
let finalName = cmd.name;
|
59
|
+
// Extension commands get renamed if they conflict with existing commands
|
60
|
+
if (cmd.extensionName && commandMap.has(cmd.name)) {
|
61
|
+
let renamedName = `${cmd.extensionName}.${cmd.name}`;
|
62
|
+
let suffix = 1;
|
63
|
+
// Keep trying until we find a name that doesn't conflict
|
64
|
+
while (commandMap.has(renamedName)) {
|
65
|
+
renamedName = `${cmd.extensionName}.${cmd.name}${suffix}`;
|
66
|
+
suffix++;
|
67
|
+
}
|
68
|
+
finalName = renamedName;
|
69
|
+
}
|
70
|
+
commandMap.set(finalName, {
|
71
|
+
...cmd,
|
72
|
+
name: finalName,
|
73
|
+
});
|
58
74
|
}
|
59
75
|
const finalCommands = Object.freeze(Array.from(commandMap.values()));
|
60
76
|
return new CommandService(finalCommands);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"CommandService.js","sourceRoot":"","sources":["../../../src/services/CommandService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IAKY;IAJrC;;;OAGG;IACH,YAAqC,QAAiC;QAAjC,aAAQ,GAAR,QAAQ,CAAyB;IAAG,CAAC;IAE1E
|
1
|
+
{"version":3,"file":"CommandService.js","sourceRoot":"","sources":["../../../src/services/CommandService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IAKY;IAJrC;;;OAGG;IACH,YAAqC,QAAiC;QAAjC,aAAQ,GAAR,QAAQ,CAAyB;IAAG,CAAC;IAE1E;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAyB,EACzB,MAAmB;QAEnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;YAEzB,yEAAyE;YACzE,IAAI,GAAG,CAAC,aAAa,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,IAAI,WAAW,GAAG,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,MAAM,GAAG,CAAC,CAAC;gBAEf,yDAAyD;gBACzD,OAAO,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,WAAW,GAAG,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;oBAC1D,MAAM,EAAE,CAAC;gBACX,CAAC;gBAED,SAAS,GAAG,WAAW,CAAC;YAC1B,CAAC;YAED,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE;gBACxB,GAAG,GAAG;gBACN,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;OAOG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
|
@@ -21,16 +21,28 @@ export declare class FileCommandLoader implements ICommandLoader {
|
|
21
21
|
private readonly projectRoot;
|
22
22
|
constructor(config: Config | null);
|
23
23
|
/**
|
24
|
-
* Loads all commands
|
25
|
-
* commands
|
24
|
+
* Loads all commands from user, project, and extension directories.
|
25
|
+
* Returns commands in order: user → project → extensions (alphabetically).
|
26
|
+
*
|
27
|
+
* Order is important for conflict resolution in CommandService:
|
28
|
+
* - User/project commands (without extensionName) use "last wins" strategy
|
29
|
+
* - Extension commands (with extensionName) get renamed if conflicts exist
|
30
|
+
*
|
26
31
|
* @param signal An AbortSignal to cancel the loading process.
|
27
|
-
* @returns A promise that resolves to an array of loaded SlashCommands.
|
32
|
+
* @returns A promise that resolves to an array of all loaded SlashCommands.
|
28
33
|
*/
|
29
34
|
loadCommands(signal: AbortSignal): Promise<SlashCommand[]>;
|
35
|
+
/**
|
36
|
+
* Get all command directories in order for loading.
|
37
|
+
* User commands → Project commands → Extension commands
|
38
|
+
* This order ensures extension commands can detect all conflicts.
|
39
|
+
*/
|
40
|
+
private getCommandDirectories;
|
30
41
|
/**
|
31
42
|
* Parses a single .toml file and transforms it into a SlashCommand object.
|
32
43
|
* @param filePath The absolute path to the .toml file.
|
33
44
|
* @param baseDir The root command directory for name calculation.
|
45
|
+
* @param extensionName Optional extension name to prefix commands with.
|
34
46
|
* @returns A promise resolving to a SlashCommand, or null if the file is invalid.
|
35
47
|
*/
|
36
48
|
private parseAndAdaptFile;
|