@vybestack/llxprt-code 0.4.8 → 0.5.0-nightly.251102.6bb3db7a
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 +5 -3
- 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 +11 -0
- package/dist/src/auth/oauth-manager.js +62 -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/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 +6 -2
- package/dist/src/config/config.js +219 -18
- package/dist/src/config/config.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/gemini.js +68 -23
- 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/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 +59 -38
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/authCommand.js +7 -9
- 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 +45 -191
- package/dist/src/ui/commands/diagnosticsCommand.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 +674 -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 +598 -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/AuthDialog.js +16 -55
- package/dist/src/ui/components/AuthDialog.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/InputPrompt.js +1 -1
- package/dist/src/ui/components/InputPrompt.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/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/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 +27 -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/types.d.ts +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/utils/sandbox.js +7 -5
- 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 +5 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -3,87 +3,76 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect,
|
|
7
|
-
import {
|
|
8
|
-
import { AuthType } from '@vybestack/llxprt-code-core';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
name: 'test-provider',
|
|
15
|
-
async getModels() {
|
|
16
|
-
return [
|
|
17
|
-
{
|
|
18
|
-
id: 'model-1',
|
|
19
|
-
name: 'Test Model 1',
|
|
20
|
-
provider: 'test-provider',
|
|
21
|
-
supportedToolFormats: ['json'],
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
id: 'model-2',
|
|
25
|
-
name: 'Test Model 2',
|
|
26
|
-
provider: 'test-provider',
|
|
27
|
-
supportedToolFormats: ['json'],
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
},
|
|
31
|
-
async *generateChatCompletion() {
|
|
32
|
-
yield {
|
|
33
|
-
speaker: 'ai',
|
|
34
|
-
blocks: [{ type: 'text', text: 'test response' }],
|
|
35
|
-
};
|
|
36
|
-
},
|
|
37
|
-
getCurrentModel() {
|
|
38
|
-
return 'model-1';
|
|
39
|
-
},
|
|
40
|
-
getDefaultModel() {
|
|
41
|
-
return 'model-1';
|
|
42
|
-
},
|
|
43
|
-
setModel(model) {
|
|
44
|
-
console.log(`Provider model set to: ${model}`);
|
|
45
|
-
},
|
|
46
|
-
getServerTools() {
|
|
47
|
-
return [];
|
|
48
|
-
},
|
|
49
|
-
async invokeServerTool() {
|
|
50
|
-
return {};
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
});
|
|
54
|
-
afterEach(() => {
|
|
55
|
-
resetProviderManager();
|
|
6
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
+
import { createProviderManager } from './providerManagerInstance.js';
|
|
8
|
+
import { AuthType, SettingsService, createProviderRuntimeContext, } from '@vybestack/llxprt-code-core';
|
|
9
|
+
function createManager() {
|
|
10
|
+
const settingsService = new SettingsService();
|
|
11
|
+
const runtime = createProviderRuntimeContext({ settingsService });
|
|
12
|
+
const { manager } = createProviderManager(runtime, {
|
|
13
|
+
allowBrowserEnvironment: true,
|
|
56
14
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
15
|
+
return manager;
|
|
16
|
+
}
|
|
17
|
+
function createMockProvider() {
|
|
18
|
+
return {
|
|
19
|
+
name: 'test-provider',
|
|
20
|
+
async getModels() {
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
id: 'model-1',
|
|
24
|
+
name: 'Test Model 1',
|
|
25
|
+
provider: 'test-provider',
|
|
26
|
+
supportedToolFormats: ['json'],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'model-2',
|
|
30
|
+
name: 'Test Model 2',
|
|
31
|
+
provider: 'test-provider',
|
|
32
|
+
supportedToolFormats: ['json'],
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
},
|
|
36
|
+
async *generateChatCompletion() {
|
|
37
|
+
yield {
|
|
38
|
+
speaker: 'ai',
|
|
39
|
+
blocks: [{ type: 'text', text: 'test response' }],
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
getDefaultModel() {
|
|
43
|
+
return 'model-1';
|
|
44
|
+
},
|
|
45
|
+
getServerTools() {
|
|
46
|
+
return [];
|
|
47
|
+
},
|
|
48
|
+
async invokeServerTool() {
|
|
49
|
+
return {};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
describe('Provider-Gemini Switching', () => {
|
|
54
|
+
it('uses Gemini when no provider is active', async () => {
|
|
55
|
+
const manager = createManager();
|
|
60
56
|
if (manager.hasActiveProvider()) {
|
|
61
57
|
manager.clearActiveProvider();
|
|
62
58
|
}
|
|
63
|
-
// Register provider but don't activate it
|
|
64
|
-
manager.registerProvider(mockProvider);
|
|
65
|
-
// Should not have an active provider
|
|
66
59
|
expect(manager.hasActiveProvider()).toBe(false);
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
manager.registerProvider(createMockProvider());
|
|
61
|
+
expect(manager.hasActiveProvider()).toBe(false);
|
|
69
62
|
const config = {
|
|
70
|
-
refreshAuth:
|
|
63
|
+
refreshAuth: vi.fn().mockResolvedValue(undefined),
|
|
71
64
|
getGeminiClient: vi.fn().mockReturnValue(null),
|
|
72
65
|
getModel: vi.fn().mockReturnValue('gemini-2.5-flash'),
|
|
73
66
|
};
|
|
74
|
-
// Call refreshAuth
|
|
75
67
|
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
76
|
-
|
|
77
|
-
expect(originalRefreshAuth).toHaveBeenCalled();
|
|
68
|
+
expect(config.refreshAuth).toHaveBeenCalledWith(AuthType.USE_GEMINI);
|
|
78
69
|
});
|
|
79
|
-
it('
|
|
80
|
-
const manager =
|
|
81
|
-
|
|
82
|
-
manager.registerProvider(
|
|
70
|
+
it('respects active provider configuration when set', async () => {
|
|
71
|
+
const manager = createManager();
|
|
72
|
+
const provider = createMockProvider();
|
|
73
|
+
manager.registerProvider(provider);
|
|
83
74
|
manager.setActiveProvider('test-provider');
|
|
84
|
-
// Should have an active provider
|
|
85
75
|
expect(manager.hasActiveProvider()).toBe(true);
|
|
86
|
-
// Create a mock config with a mock GeminiClient
|
|
87
76
|
const mockGeminiClient = {
|
|
88
77
|
chat: {
|
|
89
78
|
contentGenerator: null,
|
|
@@ -94,39 +83,28 @@ describe('Provider-Gemini Switching', () => {
|
|
|
94
83
|
getGeminiClient: vi.fn().mockReturnValue(mockGeminiClient),
|
|
95
84
|
getModel: vi.fn().mockReturnValue('gemini-2.5-flash'),
|
|
96
85
|
};
|
|
97
|
-
// Store original refreshAuth
|
|
98
|
-
const originalRefreshAuth = config.refreshAuth;
|
|
99
|
-
// refreshAuth should remain the same (no wrapping in new implementation)
|
|
100
|
-
expect(config.refreshAuth).toBe(originalRefreshAuth);
|
|
101
|
-
// Call refreshAuth
|
|
102
86
|
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
103
|
-
|
|
87
|
+
expect(config.refreshAuth).toHaveBeenCalledWith(AuthType.USE_GEMINI);
|
|
104
88
|
expect(mockGeminiClient.chat.contentGenerator).toBeNull();
|
|
105
89
|
});
|
|
106
|
-
it('
|
|
107
|
-
const manager =
|
|
108
|
-
|
|
109
|
-
manager.registerProvider(mockProvider);
|
|
90
|
+
it('falls back to Gemini when clearing the active provider', async () => {
|
|
91
|
+
const manager = createManager();
|
|
92
|
+
manager.registerProvider(createMockProvider());
|
|
110
93
|
manager.setActiveProvider('test-provider');
|
|
111
94
|
expect(manager.hasActiveProvider()).toBe(true);
|
|
112
|
-
// Clear provider (switch back to Gemini)
|
|
113
95
|
manager.clearActiveProvider();
|
|
114
96
|
expect(manager.hasActiveProvider()).toBe(false);
|
|
115
|
-
// Create a mock config
|
|
116
|
-
const mockGeminiClient = {
|
|
117
|
-
chat: {
|
|
118
|
-
contentGenerator: null,
|
|
119
|
-
},
|
|
120
|
-
};
|
|
121
97
|
const config = {
|
|
122
98
|
refreshAuth: vi.fn().mockResolvedValue(undefined),
|
|
123
|
-
getGeminiClient: vi.fn().mockReturnValue(
|
|
99
|
+
getGeminiClient: vi.fn().mockReturnValue({
|
|
100
|
+
chat: {
|
|
101
|
+
contentGenerator: null,
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
124
104
|
getModel: vi.fn().mockReturnValue('gemini-2.5-flash'),
|
|
125
105
|
};
|
|
126
|
-
// Call refreshAuth
|
|
127
106
|
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
128
|
-
|
|
129
|
-
expect(mockGeminiClient.chat.contentGenerator).toBeNull();
|
|
107
|
+
expect(config.refreshAuth).toHaveBeenCalled();
|
|
130
108
|
});
|
|
131
109
|
});
|
|
132
110
|
//# sourceMappingURL=provider-gemini-switching.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-gemini-switching.test.js","sourceRoot":"","sources":["../../../src/providers/provider-gemini-switching.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-gemini-switching.test.js","sourceRoot":"","sources":["../../../src/providers/provider-gemini-switching.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,116 +3,60 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { createProviderManager } from './providerManagerInstance.js';
|
|
8
|
+
import { createProviderRuntimeContext, SettingsService, } from '@vybestack/llxprt-code-core';
|
|
9
|
+
function createManager() {
|
|
10
|
+
const settingsService = new SettingsService();
|
|
11
|
+
const runtime = createProviderRuntimeContext({ settingsService });
|
|
12
|
+
const { manager } = createProviderManager(runtime, {
|
|
13
|
+
allowBrowserEnvironment: true,
|
|
14
14
|
});
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
return manager;
|
|
16
|
+
}
|
|
17
|
+
function createMockProvider(name) {
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
async getModels() {
|
|
21
|
+
return [];
|
|
22
|
+
},
|
|
23
|
+
async *generateChatCompletion() {
|
|
24
|
+
yield {
|
|
25
|
+
speaker: 'ai',
|
|
26
|
+
blocks: [{ type: 'text', text: `${name}-response` }],
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
getDefaultModel() {
|
|
30
|
+
return `${name}-model`;
|
|
31
|
+
},
|
|
32
|
+
getServerTools() {
|
|
33
|
+
return [];
|
|
34
|
+
},
|
|
35
|
+
async invokeServerTool() {
|
|
36
|
+
return {};
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
describe('Provider Switching Integration', () => {
|
|
41
|
+
it('supports switching between providers and back to Gemini', () => {
|
|
42
|
+
const manager = createManager();
|
|
18
43
|
if (manager.hasActiveProvider()) {
|
|
19
44
|
manager.clearActiveProvider();
|
|
20
45
|
}
|
|
21
|
-
// Now no active provider (Gemini is default)
|
|
22
46
|
expect(manager.hasActiveProvider()).toBe(false);
|
|
23
|
-
|
|
24
|
-
const mockProvider = {
|
|
25
|
-
name: 'test-provider',
|
|
26
|
-
async getModels() {
|
|
27
|
-
return [
|
|
28
|
-
{
|
|
29
|
-
id: 'test-model',
|
|
30
|
-
name: 'Test Model',
|
|
31
|
-
provider: 'test-provider',
|
|
32
|
-
supportedToolFormats: ['json'],
|
|
33
|
-
},
|
|
34
|
-
];
|
|
35
|
-
},
|
|
36
|
-
async *generateChatCompletion() {
|
|
37
|
-
yield {
|
|
38
|
-
speaker: 'ai',
|
|
39
|
-
blocks: [{ type: 'text', text: 'test response' }],
|
|
40
|
-
};
|
|
41
|
-
},
|
|
42
|
-
getDefaultModel() {
|
|
43
|
-
return 'test-model';
|
|
44
|
-
},
|
|
45
|
-
getServerTools() {
|
|
46
|
-
return [];
|
|
47
|
-
},
|
|
48
|
-
async invokeServerTool() {
|
|
49
|
-
return {};
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
manager.registerProvider(mockProvider);
|
|
53
|
-
// Switch to the test provider
|
|
47
|
+
manager.registerProvider(createMockProvider('test-provider'));
|
|
54
48
|
manager.setActiveProvider('test-provider');
|
|
55
|
-
expect(manager.hasActiveProvider()).toBe(true);
|
|
56
49
|
expect(manager.getActiveProviderName()).toBe('test-provider');
|
|
57
|
-
// Switch back to Gemini
|
|
58
50
|
manager.clearActiveProvider();
|
|
59
51
|
expect(manager.hasActiveProvider()).toBe(false);
|
|
60
52
|
expect(manager.getActiveProviderName()).toBe('');
|
|
61
53
|
});
|
|
62
|
-
it('
|
|
63
|
-
const manager =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
name: 'provider1',
|
|
67
|
-
async getModels() {
|
|
68
|
-
return [];
|
|
69
|
-
},
|
|
70
|
-
async *generateChatCompletion() {
|
|
71
|
-
yield {
|
|
72
|
-
speaker: 'ai',
|
|
73
|
-
blocks: [{ type: 'text', text: '' }],
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
getDefaultModel() {
|
|
77
|
-
return 'default';
|
|
78
|
-
},
|
|
79
|
-
getServerTools() {
|
|
80
|
-
return [];
|
|
81
|
-
},
|
|
82
|
-
async invokeServerTool() {
|
|
83
|
-
return {};
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
const provider2 = {
|
|
87
|
-
name: 'provider2',
|
|
88
|
-
async getModels() {
|
|
89
|
-
return [];
|
|
90
|
-
},
|
|
91
|
-
async *generateChatCompletion() {
|
|
92
|
-
yield {
|
|
93
|
-
speaker: 'ai',
|
|
94
|
-
blocks: [{ type: 'text', text: '' }],
|
|
95
|
-
};
|
|
96
|
-
},
|
|
97
|
-
getDefaultModel() {
|
|
98
|
-
return 'default';
|
|
99
|
-
},
|
|
100
|
-
getServerTools() {
|
|
101
|
-
return [];
|
|
102
|
-
},
|
|
103
|
-
async invokeServerTool() {
|
|
104
|
-
return {};
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
manager.registerProvider(provider1);
|
|
108
|
-
manager.registerProvider(provider2);
|
|
109
|
-
// List providers - should not include 'gemini' as it's not a registered provider
|
|
54
|
+
it('maintains custom providers in list without auto-registering gemini', () => {
|
|
55
|
+
const manager = createManager();
|
|
56
|
+
manager.registerProvider(createMockProvider('provider1'));
|
|
57
|
+
manager.registerProvider(createMockProvider('provider2'));
|
|
110
58
|
const providers = manager.listProviders();
|
|
111
|
-
|
|
112
|
-
const testProviders = providers.filter((p) => p.startsWith('provider'));
|
|
113
|
-
expect(testProviders).toEqual(['provider1', 'provider2']);
|
|
114
|
-
expect(providers).not.toContain('gemini');
|
|
115
|
-
// But we can still clear to go back to Gemini
|
|
59
|
+
expect(providers).toEqual(expect.arrayContaining(['provider1', 'provider2']));
|
|
116
60
|
manager.setActiveProvider('provider1');
|
|
117
61
|
expect(manager.getActiveProviderName()).toBe('provider1');
|
|
118
62
|
manager.clearActiveProvider();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-switching.integration.test.js","sourceRoot":"","sources":["../../../src/providers/provider-switching.integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-switching.integration.test.js","sourceRoot":"","sources":["../../../src/providers/provider-switching.integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,19 +3,24 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { ProviderManager, Config } from '@vybestack/llxprt-code-core';
|
|
7
|
-
import { LoadedSettings } from '../config/settings.js';
|
|
8
6
|
export interface ProviderConfigResult {
|
|
9
7
|
success: boolean;
|
|
10
8
|
message: string;
|
|
11
9
|
isPaidMode?: boolean;
|
|
12
|
-
requiresAuthRefresh?: boolean;
|
|
13
10
|
}
|
|
14
11
|
/**
|
|
15
|
-
* Sets or removes the API key for the active provider
|
|
12
|
+
* Sets or removes the API key for the active provider.
|
|
13
|
+
*
|
|
14
|
+
* @plan:PLAN-20250218-STATELESSPROVIDER.P07
|
|
15
|
+
* @requirement:REQ-SP-005
|
|
16
|
+
* @pseudocode:cli-runtime.md lines 9-15
|
|
16
17
|
*/
|
|
17
|
-
export declare function setProviderApiKey(
|
|
18
|
+
export declare function setProviderApiKey(apiKey: string | undefined): Promise<ProviderConfigResult>;
|
|
18
19
|
/**
|
|
19
|
-
* Sets or clears the base URL for the active provider
|
|
20
|
+
* Sets or clears the base URL for the active provider.
|
|
21
|
+
*
|
|
22
|
+
* @plan:PLAN-20250218-STATELESSPROVIDER.P07
|
|
23
|
+
* @requirement:REQ-SP-005
|
|
24
|
+
* @pseudocode:cli-runtime.md lines 9-15
|
|
20
25
|
*/
|
|
21
|
-
export declare function setProviderBaseUrl(
|
|
26
|
+
export declare function setProviderBaseUrl(baseUrl: string | undefined): Promise<ProviderConfigResult>;
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { sanitizeForByteString, needsSanitization, } from '@vybestack/llxprt-code-core';
|
|
7
|
+
import { updateActiveProviderApiKey, updateActiveProviderBaseUrl, } from '../runtime/runtimeSettings.js';
|
|
7
8
|
/**
|
|
8
9
|
* Sanitizes API keys to remove problematic characters that cause ByteString errors.
|
|
9
10
|
* This handles cases where API key files have encoding issues or contain
|
|
@@ -18,70 +19,24 @@ function sanitizeApiKey(key) {
|
|
|
18
19
|
return sanitized;
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
21
|
-
* Sets or removes the API key for the active provider
|
|
22
|
+
* Sets or removes the API key for the active provider.
|
|
23
|
+
*
|
|
24
|
+
* @plan:PLAN-20250218-STATELESSPROVIDER.P07
|
|
25
|
+
* @requirement:REQ-SP-005
|
|
26
|
+
* @pseudocode:cli-runtime.md lines 9-15
|
|
22
27
|
*/
|
|
23
|
-
export async function setProviderApiKey(
|
|
28
|
+
export async function setProviderApiKey(apiKey) {
|
|
24
29
|
try {
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const requiresAuthRefresh = providerName === 'gemini' && !!config;
|
|
36
|
-
if (requiresAuthRefresh && config) {
|
|
37
|
-
await config.refreshAuth(AuthType.LOGIN_WITH_GOOGLE);
|
|
38
|
-
}
|
|
39
|
-
// Check payment mode after auth refresh
|
|
40
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
|
41
|
-
const paymentMessage = !isPaidMode && providerName === 'gemini'
|
|
42
|
-
? '\n✅ You are now in FREE MODE - using OAuth authentication'
|
|
43
|
-
: '';
|
|
44
|
-
return {
|
|
45
|
-
success: true,
|
|
46
|
-
message: `API key removed for provider '${providerName}'${paymentMessage}`,
|
|
47
|
-
isPaidMode,
|
|
48
|
-
requiresAuthRefresh,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
message: `Provider '${providerName}' does not support API key updates`,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// Update the provider's API key (sanitized) - this will store in SettingsService
|
|
59
|
-
if (activeProvider.setApiKey) {
|
|
60
|
-
const sanitizedKey = sanitizeApiKey(apiKey);
|
|
61
|
-
activeProvider.setApiKey(sanitizedKey);
|
|
62
|
-
// If this is the Gemini provider, we need to refresh auth to use API key mode
|
|
63
|
-
const requiresAuthRefresh = providerName === 'gemini' && !!config;
|
|
64
|
-
if (requiresAuthRefresh && config) {
|
|
65
|
-
await config.refreshAuth(AuthType.USE_GEMINI);
|
|
66
|
-
}
|
|
67
|
-
// Check if we're now in paid mode
|
|
68
|
-
const isPaidMode = activeProvider.isPaidMode?.() ?? true;
|
|
69
|
-
const paymentWarning = isPaidMode
|
|
70
|
-
? '\nWARNING: You are now in PAID MODE - API usage will be charged to your account'
|
|
71
|
-
: '';
|
|
72
|
-
return {
|
|
73
|
-
success: true,
|
|
74
|
-
message: `API key updated for provider '${providerName}'${paymentWarning}`,
|
|
75
|
-
isPaidMode,
|
|
76
|
-
requiresAuthRefresh,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
return {
|
|
81
|
-
success: false,
|
|
82
|
-
message: `Provider '${providerName}' does not support API key updates`,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
30
|
+
const trimmed = apiKey?.trim();
|
|
31
|
+
const normalized = trimmed && trimmed.toLowerCase() !== 'none' && trimmed !== ''
|
|
32
|
+
? sanitizeApiKey(trimmed)
|
|
33
|
+
: null;
|
|
34
|
+
const result = await updateActiveProviderApiKey(normalized);
|
|
35
|
+
return {
|
|
36
|
+
success: true,
|
|
37
|
+
message: result.message,
|
|
38
|
+
isPaidMode: result.isPaidMode,
|
|
39
|
+
};
|
|
85
40
|
}
|
|
86
41
|
catch (error) {
|
|
87
42
|
return {
|
|
@@ -91,44 +46,21 @@ export async function setProviderApiKey(providerManager, settings, apiKey, confi
|
|
|
91
46
|
}
|
|
92
47
|
}
|
|
93
48
|
/**
|
|
94
|
-
* Sets or clears the base URL for the active provider
|
|
49
|
+
* Sets or clears the base URL for the active provider.
|
|
50
|
+
*
|
|
51
|
+
* @plan:PLAN-20250218-STATELESSPROVIDER.P07
|
|
52
|
+
* @requirement:REQ-SP-005
|
|
53
|
+
* @pseudocode:cli-runtime.md lines 9-15
|
|
95
54
|
*/
|
|
96
|
-
export async function setProviderBaseUrl(
|
|
55
|
+
export async function setProviderBaseUrl(baseUrl) {
|
|
97
56
|
try {
|
|
98
|
-
const
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
success: true,
|
|
107
|
-
message: `Base URL cleared, provider '${providerName}' now uses default URL`,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return {
|
|
112
|
-
success: false,
|
|
113
|
-
message: `Provider '${providerName}' does not support base URL updates`,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Update the provider's base URL
|
|
118
|
-
if (activeProvider.setBaseUrl) {
|
|
119
|
-
activeProvider.setBaseUrl(baseUrl);
|
|
120
|
-
// Don't save base URLs to settings - they should only be in profiles or ephemeral
|
|
121
|
-
return {
|
|
122
|
-
success: true,
|
|
123
|
-
message: `Base URL updated to '${baseUrl}' for provider '${providerName}'`,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
return {
|
|
128
|
-
success: false,
|
|
129
|
-
message: `Provider '${providerName}' does not support base URL updates`,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
57
|
+
const trimmed = baseUrl?.trim() ?? '';
|
|
58
|
+
const normalized = trimmed === '' || trimmed.toLowerCase() === 'none' ? null : trimmed;
|
|
59
|
+
const result = await updateActiveProviderBaseUrl(normalized);
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
message: result.message,
|
|
63
|
+
};
|
|
132
64
|
}
|
|
133
65
|
catch (error) {
|
|
134
66
|
return {
|
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AAEvC;;;;GAIG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CACV,wFAAwF;YACtF,wEAAwE,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/B,MAAM,UAAU,GACd,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,OAAO,KAAK,EAAE;YAC3D,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,UAAU,GACd,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC7F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -3,15 +3,31 @@
|
|
|
3
3
|
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Config, ProviderManager } from '@vybestack/llxprt-code-core';
|
|
6
|
+
import { Config, ProviderManager, SettingsService } from '@vybestack/llxprt-code-core';
|
|
7
7
|
import { IFileSystem } from './IFileSystem.js';
|
|
8
8
|
import { LoadedSettings } from '../config/settings.js';
|
|
9
9
|
import { OAuthManager } from '../auth/oauth-manager.js';
|
|
10
10
|
import { HistoryItemWithoutId } from '../ui/types.js';
|
|
11
|
+
interface ProviderManagerFactoryOptions {
|
|
12
|
+
config?: Config;
|
|
13
|
+
allowBrowserEnvironment?: boolean;
|
|
14
|
+
settings?: LoadedSettings;
|
|
15
|
+
addItem?: (itemData: Omit<HistoryItemWithoutId, 'id'>, baseTimestamp: number) => number;
|
|
16
|
+
}
|
|
17
|
+
type RuntimeContextShape = {
|
|
18
|
+
settingsService: SettingsService;
|
|
19
|
+
config?: Config;
|
|
20
|
+
runtimeId?: string;
|
|
21
|
+
metadata?: Record<string, unknown>;
|
|
22
|
+
};
|
|
11
23
|
/**
|
|
12
24
|
* Set a custom file system implementation (mainly for testing).
|
|
13
25
|
*/
|
|
14
26
|
export declare function setFileSystem(fs: IFileSystem): void;
|
|
27
|
+
export declare function createProviderManager(context: RuntimeContextShape, options?: ProviderManagerFactoryOptions): {
|
|
28
|
+
manager: ProviderManager;
|
|
29
|
+
oauthManager: OAuthManager;
|
|
30
|
+
};
|
|
15
31
|
export declare function getProviderManager(config?: Config, allowBrowserEnvironment?: boolean, settings?: LoadedSettings, addItem?: (itemData: Omit<HistoryItemWithoutId, 'id'>, baseTimestamp: number) => number): ProviderManager;
|
|
16
32
|
export declare function resetProviderManager(): void;
|
|
17
33
|
export declare function getOAuthManager(): OAuthManager | null;
|