@vybestack/llxprt-code 0.4.7 → 0.5.0-nightly.251102.f115237d
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/dist/package.json +7 -5
- package/dist/src/auth/__tests__/oauthManager.safety.test.d.ts +6 -0
- package/dist/src/auth/__tests__/oauthManager.safety.test.js +49 -0
- package/dist/src/auth/__tests__/oauthManager.safety.test.js.map +1 -0
- package/dist/src/auth/oauth-manager.d.ts +16 -0
- package/dist/src/auth/oauth-manager.js +81 -29
- package/dist/src/auth/oauth-manager.js.map +1 -1
- package/dist/src/auth/oauth-manager.spec.js +7 -2
- package/dist/src/auth/oauth-manager.spec.js.map +1 -1
- package/dist/src/commands/extensions.js +1 -1
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/config/__tests__/nonInteractiveTools.test.d.ts +6 -0
- package/dist/src/config/__tests__/nonInteractiveTools.test.js +13 -0
- package/dist/src/config/__tests__/nonInteractiveTools.test.js.map +1 -0
- package/dist/src/config/__tests__/profileBootstrap.test.d.ts +6 -0
- package/dist/src/config/__tests__/profileBootstrap.test.js +91 -0
- package/dist/src/config/__tests__/profileBootstrap.test.js.map +1 -0
- package/dist/src/config/config.d.ts +7 -2
- package/dist/src/config/config.js +225 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.loadMemory.test.js +1 -0
- package/dist/src/config/config.loadMemory.test.js.map +1 -1
- package/dist/src/config/profileBootstrap.d.ts +64 -0
- package/dist/src/config/profileBootstrap.js +140 -0
- package/dist/src/config/profileBootstrap.js.map +1 -0
- package/dist/src/config/settings.env.test.d.ts +6 -0
- package/dist/src/config/settings.env.test.js +38 -0
- package/dist/src/config/settings.env.test.js.map +1 -0
- package/dist/src/config/settings.js +2 -2
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/gemini.js +70 -25
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -2
- 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/integration-tests/base-url-behavior.integration.test.js +110 -450
- package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -1
- package/dist/src/integration-tests/model-params-isolation.integration.test.js +101 -539
- package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -1
- package/dist/src/integration-tests/modelParams.integration.test.js +86 -761
- package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -1
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.js +198 -0
- package/dist/src/integration-tests/provider-multi-runtime.integration.test.js.map +1 -0
- package/dist/src/integration-tests/provider-switching.integration.test.js +97 -151
- package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -1
- package/dist/src/integration-tests/runtime-isolation.test.d.ts +13 -0
- package/dist/src/integration-tests/runtime-isolation.test.js +170 -0
- package/dist/src/integration-tests/runtime-isolation.test.js.map +1 -0
- package/dist/src/integration-tests/test-utils.js +19 -2
- package/dist/src/integration-tests/test-utils.js.map +1 -1
- package/dist/src/integration-tests/test-utils.test.js +9 -8
- package/dist/src/integration-tests/test-utils.test.js.map +1 -1
- package/dist/src/integration-tests/todo-continuation.integration.test.js +5 -2
- package/dist/src/integration-tests/todo-continuation.integration.test.js.map +1 -1
- package/dist/src/integration-tests/tools-governance.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/tools-governance.integration.test.js +98 -0
- package/dist/src/integration-tests/tools-governance.integration.test.js.map +1 -0
- package/dist/src/nonInteractiveCli.js +36 -11
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/providers/logging/git-stats.test.js +11 -1
- package/dist/src/providers/logging/git-stats.test.js.map +1 -1
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js +1 -2
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -1
- package/dist/src/providers/logging/performance.test.js +1 -1
- package/dist/src/providers/logging/performance.test.js.map +1 -1
- package/dist/src/providers/oauth-provider-registration.d.ts +2 -2
- package/dist/src/providers/oauth-provider-registration.js +25 -9
- package/dist/src/providers/oauth-provider-registration.js.map +1 -1
- package/dist/src/providers/provider-gemini-switching.test.js +67 -89
- package/dist/src/providers/provider-gemini-switching.test.js.map +1 -1
- package/dist/src/providers/provider-switching.integration.test.js +42 -98
- package/dist/src/providers/provider-switching.integration.test.js.map +1 -1
- package/dist/src/providers/providerConfigUtils.d.ts +12 -7
- package/dist/src/providers/providerConfigUtils.js +31 -99
- package/dist/src/providers/providerConfigUtils.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.d.ts +17 -1
- package/dist/src/providers/providerManagerInstance.js +157 -175
- package/dist/src/providers/providerManagerInstance.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js +19 -15
- package/dist/src/providers/providerManagerInstance.oauthRegistration.test.js.map +1 -1
- package/dist/src/providers/providerManagerInstance.test.js +2 -5
- package/dist/src/providers/providerManagerInstance.test.js.map +1 -1
- package/dist/src/runtime/__tests__/profileApplication.test.d.ts +5 -0
- package/dist/src/runtime/__tests__/profileApplication.test.js +232 -0
- package/dist/src/runtime/__tests__/profileApplication.test.js.map +1 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.d.ts +5 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.js +376 -0
- package/dist/src/runtime/__tests__/runtimeIsolation.test.js.map +1 -0
- package/dist/src/runtime/agentRuntimeAdapter.d.ts +249 -0
- package/dist/src/runtime/agentRuntimeAdapter.js +506 -0
- package/dist/src/runtime/agentRuntimeAdapter.js.map +1 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.d.ts +6 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.js +866 -0
- package/dist/src/runtime/agentRuntimeAdapter.spec.js.map +1 -0
- package/dist/src/runtime/messages.d.ts +28 -0
- package/dist/src/runtime/messages.js +64 -0
- package/dist/src/runtime/messages.js.map +1 -0
- package/dist/src/runtime/profileApplication.d.ts +33 -0
- package/dist/src/runtime/profileApplication.js +191 -0
- package/dist/src/runtime/profileApplication.js.map +1 -0
- package/dist/src/runtime/providerConfigUtils.test.d.ts +1 -0
- package/dist/src/runtime/providerConfigUtils.test.js +68 -0
- package/dist/src/runtime/providerConfigUtils.test.js.map +1 -0
- package/dist/src/runtime/runtimeContextFactory.d.ts +102 -0
- package/dist/src/runtime/runtimeContextFactory.js +190 -0
- package/dist/src/runtime/runtimeContextFactory.js.map +1 -0
- package/dist/src/runtime/runtimeSettings.d.ts +217 -0
- package/dist/src/runtime/runtimeSettings.js +1094 -0
- package/dist/src/runtime/runtimeSettings.js.map +1 -0
- package/dist/src/runtime/runtimeSettings.test.d.ts +1 -0
- package/dist/src/runtime/runtimeSettings.test.js +320 -0
- package/dist/src/runtime/runtimeSettings.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.d.ts +13 -4
- package/dist/src/services/BuiltinCommandLoader.js +17 -4
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.js +34 -13
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/settings/ephemeralSettings.js +3 -2
- package/dist/src/settings/ephemeralSettings.js.map +1 -1
- package/dist/src/test-utils/mockCommandContext.js +5 -2
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/ui/App.js +29 -49
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +29 -0
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/authCommand.js +15 -12
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/baseurlCommand.js +8 -44
- package/dist/src/ui/commands/baseurlCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +28 -12
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.d.ts +0 -3
- package/dist/src/ui/commands/diagnosticsCommand.js +40 -191
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/docsCommand.js +1 -1
- package/dist/src/ui/commands/docsCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.js +9 -58
- package/dist/src/ui/commands/keyCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.test.js +48 -102
- package/dist/src/ui/commands/keyCommand.test.js.map +1 -1
- package/dist/src/ui/commands/keyfileCommand.js +42 -93
- package/dist/src/ui/commands/keyfileCommand.js.map +1 -1
- package/dist/src/ui/commands/logoutCommand.js +2 -2
- package/dist/src/ui/commands/logoutCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +29 -7
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +8 -59
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.js +151 -267
- package/dist/src/ui/commands/profileCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.test.js +88 -344
- package/dist/src/ui/commands/profileCommand.test.js.map +1 -1
- package/dist/src/ui/commands/providerCommand.js +9 -3
- package/dist/src/ui/commands/providerCommand.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +38 -18
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/schema/argumentResolver.test.d.ts +6 -0
- package/dist/src/ui/commands/schema/argumentResolver.test.js +619 -0
- package/dist/src/ui/commands/schema/argumentResolver.test.js.map +1 -0
- package/dist/src/ui/commands/schema/index.d.ts +15 -0
- package/dist/src/ui/commands/schema/index.js +320 -0
- package/dist/src/ui/commands/schema/index.js.map +1 -0
- package/dist/src/ui/commands/schema/types.d.ts +61 -0
- package/dist/src/ui/commands/schema/types.js +12 -0
- package/dist/src/ui/commands/schema/types.js.map +1 -0
- package/dist/src/ui/commands/setCommand.js +641 -325
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- package/dist/src/ui/commands/setCommand.test.js +92 -388
- package/dist/src/ui/commands/setCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statusCommand.js +2 -2
- package/dist/src/ui/commands/statusCommand.js.map +1 -1
- package/dist/src/ui/commands/subagentCommand.d.ts +16 -0
- package/dist/src/ui/commands/subagentCommand.js +656 -0
- package/dist/src/ui/commands/subagentCommand.js.map +1 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.d.ts +6 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.js +132 -0
- package/dist/src/ui/commands/test/setCommand.mutation.test.js.map +1 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.d.ts +6 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.js +222 -0
- package/dist/src/ui/commands/test/setCommand.phase09.test.js.map +1 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.d.ts +6 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.js +125 -0
- package/dist/src/ui/commands/test/subagentCommand.schema.test.js.map +1 -0
- package/dist/src/ui/commands/test/subagentCommand.test.d.ts +1 -0
- package/dist/src/ui/commands/test/subagentCommand.test.js +589 -0
- package/dist/src/ui/commands/test/subagentCommand.test.js.map +1 -0
- package/dist/src/ui/commands/toolformatCommand.js +25 -98
- package/dist/src/ui/commands/toolformatCommand.js.map +1 -1
- package/dist/src/ui/commands/toolformatCommand.test.js +56 -102
- package/dist/src/ui/commands/toolformatCommand.test.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +187 -31
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +11 -2
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AboutBox.d.ts +4 -0
- package/dist/src/ui/components/AboutBox.js +1 -1
- package/dist/src/ui/components/AboutBox.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.js +4 -3
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.test.js +67 -1
- package/dist/src/ui/components/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +4 -5
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +2 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +18 -6
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +1 -1
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.js +6 -11
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.d.ts +13 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +22 -3
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.js +14 -14
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +4 -1
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/containers/SessionController.js +61 -117
- package/dist/src/ui/containers/SessionController.js.map +1 -1
- package/dist/src/ui/contexts/RuntimeContext.d.ts +61 -0
- package/dist/src/ui/contexts/RuntimeContext.js +118 -0
- package/dist/src/ui/contexts/RuntimeContext.js.map +1 -0
- package/dist/src/ui/contexts/TodoProvider.d.ts +1 -0
- package/dist/src/ui/contexts/TodoProvider.js +10 -8
- package/dist/src/ui/contexts/TodoProvider.js.map +1 -1
- package/dist/src/ui/contexts/ToolCallProvider.d.ts +1 -0
- package/dist/src/ui/contexts/ToolCallProvider.js +10 -9
- package/dist/src/ui/contexts/ToolCallProvider.js.map +1 -1
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.d.ts +6 -0
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js +39 -0
- package/dist/src/ui/hooks/__tests__/useSlashCompletion.set.phase09.test.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +11 -3
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +3 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +4 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +29 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAuthCommand.js +11 -3
- package/dist/src/ui/hooks/useAuthCommand.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -0
- package/dist/src/ui/hooks/useCommandCompletion.js +2 -0
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +37 -11
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.d.ts +6 -0
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js +232 -0
- package/dist/src/ui/hooks/useGeminiStream.subagent.spec.js.map +1 -0
- package/dist/src/ui/hooks/useLoadProfileDialog.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadProfileDialog.js +18 -57
- package/dist/src/ui/hooks/useLoadProfileDialog.js.map +1 -1
- package/dist/src/ui/hooks/useOpenAIProviderInfo.d.ts +1 -1
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js +12 -7
- package/dist/src/ui/hooks/useOpenAIProviderInfo.js.map +1 -1
- package/dist/src/ui/hooks/useProviderDialog.d.ts +1 -1
- package/dist/src/ui/hooks/useProviderDialog.js +17 -90
- package/dist/src/ui/hooks/useProviderDialog.js.map +1 -1
- package/dist/src/ui/hooks/useProviderModelDialog.d.ts +2 -2
- package/dist/src/ui/hooks/useProviderModelDialog.js +11 -12
- package/dist/src/ui/hooks/useProviderModelDialog.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +144 -34
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +32 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +154 -77
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +39 -14
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +108 -79
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +1 -1
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
- package/dist/src/ui/types.d.ts +5 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +16 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/TableRenderer.js +213 -40
- package/dist/src/ui/utils/TableRenderer.js.map +1 -1
- package/dist/src/utils/sandbox.js +1 -1
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.js +4 -2
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +30 -30
- package/dist/src/zed-integration/zedIntegration.js +112 -39
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +7 -5
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -4,67 +4,17 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { CommandKind, } from './types.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getRuntimeApi } from '../contexts/RuntimeContext.js';
|
|
8
8
|
export const keyCommand = {
|
|
9
9
|
name: 'key',
|
|
10
10
|
description: 'set or remove API key for the current provider',
|
|
11
11
|
kind: CommandKind.BUILT_IN,
|
|
12
12
|
action: async (context, args) => {
|
|
13
|
-
const config = context.services.config;
|
|
14
|
-
if (!config) {
|
|
15
|
-
return {
|
|
16
|
-
type: 'message',
|
|
17
|
-
messageType: 'error',
|
|
18
|
-
content: 'No configuration available',
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
// Settings service not needed for command-level auth
|
|
22
|
-
const providerManager = config.getProviderManager();
|
|
23
|
-
if (!providerManager) {
|
|
24
|
-
return {
|
|
25
|
-
type: 'message',
|
|
26
|
-
messageType: 'error',
|
|
27
|
-
content: 'No provider manager available',
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
const activeProvider = providerManager.getActiveProvider();
|
|
31
|
-
const providerName = activeProvider.name;
|
|
32
13
|
const apiKey = args?.trim();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
activeProvider.setApiKey('');
|
|
38
|
-
}
|
|
39
|
-
// If this is the Gemini provider, we might need to switch auth mode
|
|
40
|
-
const requiresAuthRefresh = providerName === 'gemini';
|
|
41
|
-
if (requiresAuthRefresh) {
|
|
42
|
-
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
|
43
|
-
}
|
|
44
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
|
45
|
-
const paymentMessage = !isPaidMode && providerName === 'gemini'
|
|
46
|
-
? '\n✅ You are now in FREE MODE - using OAuth authentication'
|
|
47
|
-
: '';
|
|
48
|
-
return {
|
|
49
|
-
type: 'message',
|
|
50
|
-
messageType: 'info',
|
|
51
|
-
content: `API key removed for provider '${providerName}'${paymentMessage}`,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
// Set the API key using the provider's method (which now stores in SettingsService)
|
|
55
|
-
if (activeProvider.setApiKey) {
|
|
56
|
-
activeProvider.setApiKey(apiKey);
|
|
57
|
-
// If this is the Gemini provider, we need to refresh auth to use API key mode
|
|
58
|
-
const requiresAuthRefresh = providerName === 'gemini';
|
|
59
|
-
if (requiresAuthRefresh) {
|
|
60
|
-
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
61
|
-
}
|
|
62
|
-
// Check if we're now in paid mode
|
|
63
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
|
64
|
-
const paymentWarning = isPaidMode
|
|
65
|
-
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
|
66
|
-
: '';
|
|
67
|
-
// Trigger payment mode check if available
|
|
14
|
+
const runtime = getRuntimeApi();
|
|
15
|
+
try {
|
|
16
|
+
const targetKey = !apiKey || apiKey.toLowerCase() === 'none' ? null : apiKey;
|
|
17
|
+
const result = await runtime.updateActiveProviderApiKey(targetKey);
|
|
68
18
|
const extendedContext = context;
|
|
69
19
|
if (extendedContext.checkPaymentModeChange) {
|
|
70
20
|
setTimeout(extendedContext.checkPaymentModeChange, 100);
|
|
@@ -72,14 +22,15 @@ export const keyCommand = {
|
|
|
72
22
|
return {
|
|
73
23
|
type: 'message',
|
|
74
24
|
messageType: 'info',
|
|
75
|
-
content:
|
|
25
|
+
content: result.message,
|
|
76
26
|
};
|
|
77
27
|
}
|
|
78
|
-
|
|
28
|
+
catch (error) {
|
|
29
|
+
const status = runtime.getActiveProviderStatus();
|
|
79
30
|
return {
|
|
80
31
|
type: 'message',
|
|
81
32
|
messageType: 'error',
|
|
82
|
-
content: `
|
|
33
|
+
content: `Failed to update API key for provider '${status.providerName ?? 'unknown'}': ${error instanceof Error ? error.message : String(error)}`,
|
|
83
34
|
};
|
|
84
35
|
}
|
|
85
36
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"keyCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,SAAS,GACb,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAEnE,MAAM,eAAe,GAAG,OAEvB,CAAC;YACF,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;gBAC3C,UAAU,CAAC,eAAe,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;YACjD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,0CAA0C,MAAM,CAAC,YAAY,IAAI,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAClJ,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -3,125 +3,71 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
7
|
import { keyCommand } from './keyCommand.js';
|
|
8
8
|
import { createMockCommandContext } from '../../test-utils/mockCommandContext.js';
|
|
9
|
+
const mockRuntime = vi.hoisted(() => ({
|
|
10
|
+
updateActiveProviderApiKey: vi.fn(),
|
|
11
|
+
getActiveProviderStatus: vi.fn(),
|
|
12
|
+
}));
|
|
13
|
+
vi.mock('../contexts/RuntimeContext.js', () => ({
|
|
14
|
+
getRuntimeApi: () => mockRuntime,
|
|
15
|
+
}));
|
|
9
16
|
describe('keyCommand', () => {
|
|
10
|
-
let
|
|
11
|
-
let mockActiveProvider;
|
|
12
|
-
let mockProviderManager;
|
|
13
|
-
let mockConfig;
|
|
17
|
+
let context;
|
|
14
18
|
beforeEach(() => {
|
|
15
19
|
vi.clearAllMocks();
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
};
|
|
22
|
-
// Create mock provider manager
|
|
23
|
-
mockProviderManager = {
|
|
24
|
-
getActiveProvider: vi.fn().mockReturnValue(mockActiveProvider),
|
|
25
|
-
getActiveProviderName: vi.fn().mockReturnValue('test-provider'),
|
|
26
|
-
};
|
|
27
|
-
// Create mock config with provider manager
|
|
28
|
-
mockConfig = {
|
|
29
|
-
getProviderManager: vi.fn().mockReturnValue(mockProviderManager),
|
|
30
|
-
setEphemeralSetting: vi.fn(),
|
|
31
|
-
refreshAuth: vi.fn(),
|
|
32
|
-
getSettingsService: vi.fn().mockReturnValue(null), // Return null to use fallback behavior
|
|
33
|
-
};
|
|
34
|
-
mockContext = createMockCommandContext({
|
|
35
|
-
services: {
|
|
36
|
-
config: mockConfig,
|
|
37
|
-
},
|
|
20
|
+
context = createMockCommandContext();
|
|
21
|
+
mockRuntime.getActiveProviderStatus.mockReturnValue({
|
|
22
|
+
providerName: 'test-provider',
|
|
23
|
+
modelName: 'model-x',
|
|
24
|
+
displayLabel: 'test-provider:model-x',
|
|
38
25
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const testApiKey = 'test-api-key-12345';
|
|
45
|
-
const result = await keyCommand.action(mockContext, testApiKey);
|
|
46
|
-
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith(testApiKey);
|
|
47
|
-
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
|
48
|
-
expect(result).toEqual({
|
|
49
|
-
type: 'message',
|
|
50
|
-
messageType: 'info',
|
|
51
|
-
content: `API key updated for provider 'test-provider'\nWARNING: You are now in PAID MODE - API usage will be charged to your account`,
|
|
26
|
+
mockRuntime.updateActiveProviderApiKey.mockResolvedValue({
|
|
27
|
+
changed: true,
|
|
28
|
+
providerName: 'test-provider',
|
|
29
|
+
message: 'API key updated for provider',
|
|
30
|
+
isPaidMode: true,
|
|
52
31
|
});
|
|
53
32
|
});
|
|
54
|
-
it('
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const result = await keyCommand.action(mockContext, '');
|
|
59
|
-
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
|
|
60
|
-
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
|
61
|
-
expect(result).toEqual({
|
|
62
|
-
type: 'message',
|
|
63
|
-
messageType: 'info',
|
|
64
|
-
content: `API key removed for provider 'test-provider'`,
|
|
65
|
-
});
|
|
33
|
+
it('updates API key when value provided', async () => {
|
|
34
|
+
const result = await keyCommand.action(context, 'abc123');
|
|
35
|
+
expect(mockRuntime.updateActiveProviderApiKey).toHaveBeenCalledWith('abc123');
|
|
36
|
+
expect(result?.type).toBe('message');
|
|
66
37
|
});
|
|
67
|
-
it('
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
expect(mockActiveProvider.setApiKey).toHaveBeenCalledWith('');
|
|
73
|
-
// setEphemeralSetting is no longer called - auth is stored via SettingsService through activeProvider.setApiKey()
|
|
74
|
-
expect(result).toEqual({
|
|
75
|
-
type: 'message',
|
|
76
|
-
messageType: 'info',
|
|
77
|
-
content: `API key removed for provider 'test-provider'`,
|
|
38
|
+
it('removes API key when argument is none', async () => {
|
|
39
|
+
mockRuntime.updateActiveProviderApiKey.mockResolvedValue({
|
|
40
|
+
changed: true,
|
|
41
|
+
providerName: 'test-provider',
|
|
42
|
+
message: 'API key removed',
|
|
78
43
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
44
|
+
const result = await keyCommand.action(context, 'none');
|
|
45
|
+
expect(mockRuntime.updateActiveProviderApiKey).toHaveBeenCalledWith(null);
|
|
46
|
+
expect(result?.type).toBe('message');
|
|
47
|
+
if (result?.type === 'message') {
|
|
48
|
+
expect(result.content).toContain('API key removed');
|
|
83
49
|
}
|
|
84
|
-
// Mock a provider that doesn't support setApiKey
|
|
85
|
-
mockActiveProvider.setApiKey = undefined;
|
|
86
|
-
const result = await keyCommand.action(mockContext, 'invalid-key');
|
|
87
|
-
expect(result).toEqual({
|
|
88
|
-
type: 'message',
|
|
89
|
-
messageType: 'error',
|
|
90
|
-
content: `Provider 'test-provider' does not support API key updates`,
|
|
91
|
-
});
|
|
92
50
|
});
|
|
93
|
-
it('
|
|
94
|
-
|
|
95
|
-
|
|
51
|
+
it('returns error when updateActiveProviderApiKey throws', async () => {
|
|
52
|
+
mockRuntime.updateActiveProviderApiKey.mockRejectedValue(new Error('unsupported'));
|
|
53
|
+
const result = await keyCommand.action(context, 'abc123');
|
|
54
|
+
expect(result?.type).toBe('message');
|
|
55
|
+
if (result?.type === 'message') {
|
|
56
|
+
expect(result.messageType).toBe('error');
|
|
57
|
+
expect(result.content).toContain('unsupported');
|
|
96
58
|
}
|
|
97
|
-
const mockCheckPaymentModeChange = vi.fn();
|
|
98
|
-
const extendedContext = {
|
|
99
|
-
...mockContext,
|
|
100
|
-
checkPaymentModeChange: mockCheckPaymentModeChange,
|
|
101
|
-
};
|
|
102
|
-
vi.useFakeTimers();
|
|
103
|
-
await keyCommand.action(extendedContext, 'api-key-123');
|
|
104
|
-
expect(mockCheckPaymentModeChange).not.toHaveBeenCalled();
|
|
105
|
-
// Fast-forward the timer
|
|
106
|
-
vi.advanceTimersByTime(100);
|
|
107
|
-
expect(mockCheckPaymentModeChange).toHaveBeenCalledTimes(1);
|
|
108
|
-
vi.useRealTimers();
|
|
109
59
|
});
|
|
110
|
-
it('
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
// Mock a provider that doesn't support setApiKey
|
|
115
|
-
mockActiveProvider.setApiKey = undefined;
|
|
116
|
-
const mockCheckPaymentModeChange = vi.fn();
|
|
60
|
+
it('invokes payment mode callback asynchronously', async () => {
|
|
61
|
+
vi.useFakeTimers();
|
|
62
|
+
const checkPaymentModeChange = vi.fn();
|
|
117
63
|
const extendedContext = {
|
|
118
|
-
...
|
|
119
|
-
checkPaymentModeChange
|
|
64
|
+
...context,
|
|
65
|
+
checkPaymentModeChange,
|
|
120
66
|
};
|
|
121
|
-
|
|
122
|
-
|
|
67
|
+
await keyCommand.action(extendedContext, 'abc123');
|
|
68
|
+
expect(checkPaymentModeChange).not.toHaveBeenCalled();
|
|
123
69
|
vi.advanceTimersByTime(100);
|
|
124
|
-
expect(
|
|
70
|
+
expect(checkPaymentModeChange).toHaveBeenCalledTimes(1);
|
|
125
71
|
vi.useRealTimers();
|
|
126
72
|
});
|
|
127
73
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"keyCommand.test.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyCommand.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,29 +4,33 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { CommandKind, } from './types.js';
|
|
7
|
-
import { getProviderManager } from '../../providers/providerManagerInstance.js';
|
|
8
7
|
import { promises as fs } from 'fs';
|
|
9
8
|
import path from 'path';
|
|
10
9
|
import { homedir } from 'os';
|
|
10
|
+
import { getRuntimeApi } from '../contexts/RuntimeContext.js';
|
|
11
11
|
export const keyfileCommand = {
|
|
12
12
|
name: 'keyfile',
|
|
13
13
|
description: 'manage API key file for the current provider',
|
|
14
14
|
kind: CommandKind.BUILT_IN,
|
|
15
15
|
action: async (context, args) => {
|
|
16
|
-
const providerManager = getProviderManager();
|
|
17
16
|
const filePath = args?.trim();
|
|
17
|
+
const runtime = getRuntimeApi();
|
|
18
|
+
const status = runtime.getActiveProviderStatus();
|
|
19
|
+
const providerName = status.providerName;
|
|
20
|
+
if (!providerName) {
|
|
21
|
+
return {
|
|
22
|
+
type: 'message',
|
|
23
|
+
messageType: 'error',
|
|
24
|
+
content: 'No active provider available. Set a provider with /provider first.',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
18
27
|
try {
|
|
19
|
-
const activeProvider = providerManager.getActiveProvider();
|
|
20
|
-
const providerName = activeProvider.name;
|
|
21
|
-
// If no path provided, check for existing keyfile
|
|
22
28
|
if (!filePath || filePath === '') {
|
|
23
|
-
// Check common keyfile locations
|
|
24
29
|
const keyfilePaths = [
|
|
25
30
|
path.join(homedir(), `.${providerName}_key`),
|
|
26
31
|
path.join(homedir(), `.${providerName}-key`),
|
|
27
32
|
path.join(homedir(), `.${providerName}_api_key`),
|
|
28
33
|
];
|
|
29
|
-
// For specific providers, check their known keyfile locations
|
|
30
34
|
if (providerName === 'openai') {
|
|
31
35
|
keyfilePaths.unshift(path.join(homedir(), '.openai_key'));
|
|
32
36
|
}
|
|
@@ -34,14 +38,14 @@ export const keyfileCommand = {
|
|
|
34
38
|
keyfilePaths.unshift(path.join(homedir(), '.anthropic_key'));
|
|
35
39
|
}
|
|
36
40
|
let foundKeyfile = null;
|
|
37
|
-
for (const
|
|
41
|
+
for (const candidate of keyfilePaths) {
|
|
38
42
|
try {
|
|
39
|
-
await fs.access(
|
|
40
|
-
foundKeyfile =
|
|
43
|
+
await fs.access(candidate);
|
|
44
|
+
foundKeyfile = candidate;
|
|
41
45
|
break;
|
|
42
46
|
}
|
|
43
47
|
catch {
|
|
44
|
-
//
|
|
48
|
+
// continue searching
|
|
45
49
|
}
|
|
46
50
|
}
|
|
47
51
|
if (foundKeyfile) {
|
|
@@ -51,108 +55,53 @@ export const keyfileCommand = {
|
|
|
51
55
|
content: `Current keyfile for provider '${providerName}': ${foundKeyfile}\nTo remove: /keyfile none\nTo change: /keyfile <new_path>`,
|
|
52
56
|
};
|
|
53
57
|
}
|
|
54
|
-
else {
|
|
55
|
-
return {
|
|
56
|
-
type: 'message',
|
|
57
|
-
messageType: 'info',
|
|
58
|
-
content: `No keyfile found for provider '${providerName}'\nTo set: /keyfile <path>`,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// Handle removal
|
|
63
|
-
if (filePath === 'none') {
|
|
64
|
-
const removedPath = context.services.settings.getProviderKeyfile(providerName);
|
|
65
|
-
// Clear authentication using the provider's method (which now stores in SettingsService)
|
|
66
|
-
if ('clearAuth' in activeProvider &&
|
|
67
|
-
typeof activeProvider.clearAuth === 'function') {
|
|
68
|
-
activeProvider.clearAuth();
|
|
69
|
-
}
|
|
70
|
-
else if (activeProvider.setApiKey) {
|
|
71
|
-
// Fallback to clearing just the API key if clearAuth is not available
|
|
72
|
-
activeProvider.setApiKey('');
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
return {
|
|
76
|
-
type: 'message',
|
|
77
|
-
messageType: 'error',
|
|
78
|
-
content: `Provider '${providerName}' does not support keyfile commands`,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// Remove from saved settings
|
|
82
|
-
if (removedPath) {
|
|
83
|
-
context.services.settings.removeProviderKeyfile(providerName);
|
|
84
|
-
}
|
|
85
58
|
return {
|
|
86
59
|
type: 'message',
|
|
87
60
|
messageType: 'info',
|
|
88
|
-
content: `
|
|
61
|
+
content: `No keyfile found for provider '${providerName}'\nTo set: /keyfile <path>`,
|
|
89
62
|
};
|
|
90
63
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
await fs.access(resolvedPath);
|
|
96
|
-
// Verify the file is not empty
|
|
97
|
-
const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
|
|
98
|
-
if (!apiKey) {
|
|
99
|
-
return {
|
|
100
|
-
type: 'message',
|
|
101
|
-
messageType: 'error',
|
|
102
|
-
content: 'The specified file is empty',
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
// Get the active provider
|
|
106
|
-
const activeProvider = providerManager.getActiveProvider();
|
|
107
|
-
const providerName = activeProvider.name;
|
|
108
|
-
// Set the API key directly on the provider
|
|
109
|
-
if (activeProvider.setApiKey) {
|
|
110
|
-
activeProvider.setApiKey(apiKey);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
return {
|
|
114
|
-
type: 'message',
|
|
115
|
-
messageType: 'error',
|
|
116
|
-
content: `Provider '${providerName}' does not support API key authentication`,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
// Store the keyfile PATH in ephemeral settings for reference
|
|
120
|
-
// This helps track that we're using a keyfile vs direct key
|
|
121
|
-
if (context.services.config) {
|
|
122
|
-
context.services.config.setEphemeralSetting('auth-keyfile', resolvedPath);
|
|
123
|
-
// Don't clear auth-key - we just set it via setApiKey above!
|
|
124
|
-
// The auth-key will be used immediately, and auth-keyfile is stored
|
|
125
|
-
// for future reference (e.g., when reloading profiles)
|
|
126
|
-
}
|
|
127
|
-
// Check if we're now in paid mode
|
|
128
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
|
129
|
-
const paymentWarning = isPaidMode
|
|
130
|
-
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
|
131
|
-
: '';
|
|
132
|
-
// Trigger payment mode check if available
|
|
133
|
-
const extendedContext = context;
|
|
134
|
-
if (extendedContext.checkPaymentModeChange) {
|
|
135
|
-
setTimeout(extendedContext.checkPaymentModeChange, 100);
|
|
136
|
-
}
|
|
64
|
+
if (filePath === 'none') {
|
|
65
|
+
await runtime.updateActiveProviderApiKey(null);
|
|
66
|
+
runtime.setEphemeralSetting('auth-keyfile', undefined);
|
|
67
|
+
context.services.settings.removeProviderKeyfile?.(providerName);
|
|
137
68
|
return {
|
|
138
69
|
type: 'message',
|
|
139
70
|
messageType: 'info',
|
|
140
|
-
content: `
|
|
71
|
+
content: `Cleared keyfile and API key for provider '${providerName}'`,
|
|
141
72
|
};
|
|
142
73
|
}
|
|
143
|
-
|
|
74
|
+
const resolvedPath = filePath.replace(/^~/, homedir());
|
|
75
|
+
await fs.access(resolvedPath);
|
|
76
|
+
const apiKey = (await fs.readFile(resolvedPath, 'utf-8')).trim();
|
|
77
|
+
if (!apiKey) {
|
|
144
78
|
return {
|
|
145
79
|
type: 'message',
|
|
146
80
|
messageType: 'error',
|
|
147
|
-
content:
|
|
81
|
+
content: 'The specified file is empty',
|
|
148
82
|
};
|
|
149
83
|
}
|
|
84
|
+
const result = await runtime.updateActiveProviderApiKey(apiKey);
|
|
85
|
+
runtime.setEphemeralSetting('auth-keyfile', resolvedPath);
|
|
86
|
+
context.services.settings.setProviderKeyfile?.(providerName, resolvedPath);
|
|
87
|
+
const extendedContext = context;
|
|
88
|
+
if (extendedContext.checkPaymentModeChange) {
|
|
89
|
+
setTimeout(extendedContext.checkPaymentModeChange, 100);
|
|
90
|
+
}
|
|
91
|
+
const paymentWarning = result.isPaidMode
|
|
92
|
+
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
|
93
|
+
: '';
|
|
94
|
+
return {
|
|
95
|
+
type: 'message',
|
|
96
|
+
messageType: 'info',
|
|
97
|
+
content: `API key loaded from ${resolvedPath} for provider '${providerName}'${paymentWarning}`,
|
|
98
|
+
};
|
|
150
99
|
}
|
|
151
100
|
catch (error) {
|
|
152
101
|
return {
|
|
153
102
|
type: 'message',
|
|
154
103
|
messageType: 'error',
|
|
155
|
-
content: `Failed to
|
|
104
|
+
content: `Failed to manage keyfile: ${error instanceof Error ? error.message : String(error)}`,
|
|
156
105
|
};
|
|
157
106
|
}
|
|
158
107
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"keyfileCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/keyfileCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { CommandKind, } from './types.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getRuntimeApi } from '../contexts/RuntimeContext.js';
|
|
8
8
|
export const logoutCommand = {
|
|
9
9
|
name: 'logout',
|
|
10
10
|
description: 'logout from OAuth authentication for a provider (gemini, qwen, anthropic)',
|
|
@@ -20,7 +20,7 @@ export const logoutCommand = {
|
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
try {
|
|
23
|
-
const oauthManager =
|
|
23
|
+
const oauthManager = getRuntimeApi().getCliOAuthManager();
|
|
24
24
|
if (!oauthManager) {
|
|
25
25
|
return {
|
|
26
26
|
type: 'message',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logoutCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/logoutCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"logoutCommand.js","sourceRoot":"","sources":["../../../../src/ui/commands/logoutCommand.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,2EAA2E;IAC7E,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,MAAM,EAAE,KAAK,EACX,OAAuB,EACvB,IAAY,EACkB,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAE9B,uCAAuC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EACL,4GAA4G;aAC/G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,gDAAgD;iBAC1D,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAChE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3C,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,OAAO;oBACpB,OAAO,EAAE,qBAAqB,QAAQ,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAChG,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAErE,kFAAkF;YAClF,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,8BAA8B,QAAQ,EAAE;iBAClD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,MAAM;oBACnB,OAAO,EAAE,uCAAuC,QAAQ,0BAA0B;iBACnF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO;gBACpB,OAAO,EAAE,yBAAyB,QAAQ,KAAK,YAAY,EAAE;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -11,6 +11,34 @@ const COLOR_RED = '\u001b[31m';
|
|
|
11
11
|
const COLOR_CYAN = '\u001b[36m';
|
|
12
12
|
const COLOR_GREY = '\u001b[90m';
|
|
13
13
|
const RESET_COLOR = '\u001b[0m';
|
|
14
|
+
const mcpAuthSchema = [
|
|
15
|
+
{
|
|
16
|
+
kind: 'value',
|
|
17
|
+
name: 'server',
|
|
18
|
+
description: 'Select MCP server to authenticate',
|
|
19
|
+
/**
|
|
20
|
+
* @plan:PLAN-20251013-AUTOCOMPLETE.P11
|
|
21
|
+
* @requirement:REQ-004
|
|
22
|
+
* Schema completer replaces legacy server list.
|
|
23
|
+
*/
|
|
24
|
+
completer: async (ctx, partialArg) => {
|
|
25
|
+
const { config } = ctx.services;
|
|
26
|
+
if (!config) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const mcpServers = config.getMcpServers() || {};
|
|
30
|
+
const normalizedPartial = partialArg.toLowerCase();
|
|
31
|
+
return Object.keys(mcpServers)
|
|
32
|
+
.filter((name) => normalizedPartial.length === 0
|
|
33
|
+
? true
|
|
34
|
+
: name.toLowerCase().startsWith(normalizedPartial))
|
|
35
|
+
.map((name) => ({
|
|
36
|
+
value: name,
|
|
37
|
+
description: 'Configured MCP server',
|
|
38
|
+
}));
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
];
|
|
14
42
|
const getMcpStatus = async (context, showDescriptions, showSchema, showTips = false) => {
|
|
15
43
|
const { config } = context.services;
|
|
16
44
|
if (!config) {
|
|
@@ -268,6 +296,7 @@ const authCommand = {
|
|
|
268
296
|
name: 'auth',
|
|
269
297
|
description: 'Authenticate with an OAuth-enabled MCP server',
|
|
270
298
|
kind: CommandKind.BUILT_IN,
|
|
299
|
+
schema: mcpAuthSchema,
|
|
271
300
|
action: async (context, args) => {
|
|
272
301
|
const serverName = args.trim();
|
|
273
302
|
const { config } = context.services;
|
|
@@ -355,13 +384,6 @@ const authCommand = {
|
|
|
355
384
|
};
|
|
356
385
|
}
|
|
357
386
|
},
|
|
358
|
-
completion: async (context, partialArg) => {
|
|
359
|
-
const { config } = context.services;
|
|
360
|
-
if (!config)
|
|
361
|
-
return [];
|
|
362
|
-
const mcpServers = config.getMcpServers() || {};
|
|
363
|
-
return Object.keys(mcpServers).filter((name) => name.startsWith(partialArg));
|
|
364
|
-
},
|
|
365
387
|
};
|
|
366
388
|
const listCommand = {
|
|
367
389
|
name: 'list',
|