@vybestack/llxprt-code-core 0.1.18-nightly.250807.306d1939 → 0.1.18-nightly.250811.b0db22c6
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 +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/src/auth/auth-integration.spec.d.ts +6 -0
- package/dist/src/auth/auth-integration.spec.js +384 -0
- package/dist/src/auth/auth-integration.spec.js.map +1 -0
- package/dist/src/auth/precedence.d.ts +55 -0
- package/dist/src/auth/precedence.js +211 -0
- package/dist/src/auth/precedence.js.map +1 -0
- package/dist/src/auth/precedence.test.d.ts +6 -0
- package/dist/src/auth/precedence.test.js +374 -0
- package/dist/src/auth/precedence.test.js.map +1 -0
- package/dist/src/auth/qwen-device-flow.d.ts +45 -0
- package/dist/src/auth/qwen-device-flow.js +179 -0
- package/dist/src/auth/qwen-device-flow.js.map +1 -0
- package/dist/src/auth/qwen-device-flow.spec.d.ts +6 -0
- package/dist/src/auth/qwen-device-flow.spec.js +793 -0
- package/dist/src/auth/qwen-device-flow.spec.js.map +1 -0
- package/dist/src/auth/token-store.d.ts +66 -0
- package/dist/src/auth/token-store.js +147 -0
- package/dist/src/auth/token-store.js.map +1 -0
- package/dist/src/auth/token-store.spec.d.ts +6 -0
- package/dist/src/auth/token-store.spec.js +405 -0
- package/dist/src/auth/token-store.spec.js.map +1 -0
- package/dist/src/auth/types.d.ts +130 -0
- package/dist/src/auth/types.js +60 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +2 -1
- package/dist/src/code_assist/converter.js +1 -1
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js +48 -1
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +2 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/server.test.js +4 -1
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.alwaysAllow.test.d.ts +6 -0
- package/dist/src/config/config.alwaysAllow.test.js +84 -0
- package/dist/src/config/config.alwaysAllow.test.js.map +1 -0
- package/dist/src/config/config.d.ts +80 -1
- package/dist/src/config/config.ephemeral.test.d.ts +6 -0
- package/dist/src/config/config.ephemeral.test.js +152 -0
- package/dist/src/config/config.ephemeral.test.js.map +1 -0
- package/dist/src/config/config.js +135 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +8 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/endpoints.d.ts +60 -0
- package/dist/src/config/endpoints.js +126 -0
- package/dist/src/config/endpoints.js.map +1 -0
- package/dist/src/config/endpoints.test.d.ts +6 -0
- package/dist/src/config/endpoints.test.js +196 -0
- package/dist/src/config/endpoints.test.js.map +1 -0
- package/dist/src/core/client.d.ts +0 -2
- package/dist/src/core/client.js +19 -97
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +13 -7
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -1
- package/dist/src/core/contentGenerator.js +3 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +17 -7
- package/dist/src/core/coreToolScheduler.js +121 -18
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +25 -37
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +3 -0
- package/dist/src/core/geminiChat.js +17 -13
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/logger.d.ts +1 -0
- package/dist/src/core/logger.js +18 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +29 -0
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +24 -0
- package/dist/src/core/loggingContentGenerator.js +89 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.js +21 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -31
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/subagent.d.ts +230 -0
- package/dist/src/core/subagent.js +455 -0
- package/dist/src/core/subagent.js.map +1 -0
- package/dist/src/core/subagent.test.d.ts +6 -0
- package/dist/src/core/subagent.test.js +510 -0
- package/dist/src/core/subagent.test.js.map +1 -0
- package/dist/src/hooks/tool-render-suppression-hook.d.ts +16 -0
- package/dist/src/hooks/tool-render-suppression-hook.js +26 -0
- package/dist/src/hooks/tool-render-suppression-hook.js.map +1 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +6 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.js +59 -0
- package/dist/src/hooks/tool-render-suppression-hook.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +22 -1
- package/dist/src/ide/ide-client.js +161 -17
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ideContext.d.ts +127 -32
- package/dist/src/ide/ideContext.js +45 -0
- package/dist/src/ide/ideContext.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/integration-tests/oauth-integration.spec.d.ts +6 -0
- package/dist/src/integration-tests/oauth-integration.spec.js +518 -0
- package/dist/src/integration-tests/oauth-integration.spec.js.map +1 -0
- package/dist/src/integration-tests/oauth-simple-test.spec.d.ts +1 -0
- package/dist/src/integration-tests/oauth-simple-test.spec.js +88 -0
- package/dist/src/integration-tests/oauth-simple-test.spec.js.map +1 -0
- package/dist/src/integration-tests/todo-system.test.js +38 -602
- package/dist/src/integration-tests/todo-system.test.js.map +1 -1
- package/dist/src/providers/BaseProvider.d.ts +98 -0
- package/dist/src/providers/BaseProvider.js +180 -0
- package/dist/src/providers/BaseProvider.js.map +1 -0
- package/dist/src/providers/BaseProvider.test.d.ts +6 -0
- package/dist/src/providers/BaseProvider.test.js +472 -0
- package/dist/src/providers/BaseProvider.test.js.map +1 -0
- package/dist/src/providers/IProviderManager.d.ts +5 -0
- package/dist/src/providers/LoggingProviderWrapper.d.ts +53 -0
- package/dist/src/providers/LoggingProviderWrapper.js +347 -0
- package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
- package/dist/src/providers/ProviderManager.d.ts +20 -0
- package/dist/src/providers/ProviderManager.js +214 -1
- package/dist/src/providers/ProviderManager.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +12 -7
- package/dist/src/providers/gemini/GeminiProvider.js +135 -152
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/integration/multi-provider.integration.test.js +18 -2
- package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -1
- package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
- package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
- package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.d.ts +21 -6
- package/dist/src/providers/openai/OpenAIProvider.js +180 -27
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.test.js +109 -2
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
- package/dist/src/providers/openai/openai-oauth.spec.d.ts +16 -0
- package/dist/src/providers/openai/openai-oauth.spec.js +544 -0
- package/dist/src/providers/openai/openai-oauth.spec.js.map +1 -0
- package/dist/src/providers/types/IProviderConfig.d.ts +5 -0
- package/dist/src/providers/types.d.ts +47 -0
- package/dist/src/services/git-stats-service.d.ts +32 -0
- package/dist/src/services/git-stats-service.js +22 -0
- package/dist/src/services/git-stats-service.js.map +1 -0
- package/dist/src/services/loopDetectionService.js +10 -6
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +139 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +69 -9
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +8 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/todo-context-tracker.d.ts +31 -0
- package/dist/src/services/todo-context-tracker.js +45 -0
- package/dist/src/services/todo-context-tracker.js.map +1 -0
- package/dist/src/services/tool-call-tracker-service.d.ts +52 -0
- package/dist/src/services/tool-call-tracker-service.js +170 -0
- package/dist/src/services/tool-call-tracker-service.js.map +1 -0
- package/dist/src/services/tool-call-tracker-service.test.d.ts +6 -0
- package/dist/src/services/tool-call-tracker-service.test.js +99 -0
- package/dist/src/services/tool-call-tracker-service.test.js.map +1 -0
- package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
- package/dist/src/storage/ConversationFileWriter.js +69 -0
- package/dist/src/storage/ConversationFileWriter.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +6 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +187 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +5 -0
- package/dist/src/telemetry/constants.js +5 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +5 -1
- package/dist/src/telemetry/loggers.js +87 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +7 -2
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +7 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +3 -2
- package/dist/src/telemetry/metrics.js +7 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +50 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +29 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +58 -2
- package/dist/src/telemetry/types.js +126 -1
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +4 -1
- package/dist/src/telemetry/uiTelemetry.js +3 -1
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +13 -2
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +23 -0
- package/dist/src/test-utils/tools.js +41 -0
- package/dist/src/test-utils/tools.js.map +1 -0
- package/dist/src/tools/diffOptions.d.ts +2 -0
- package/dist/src/tools/diffOptions.js +28 -0
- package/dist/src/tools/diffOptions.js.map +1 -1
- package/dist/src/tools/diffOptions.test.d.ts +6 -0
- package/dist/src/tools/diffOptions.test.js +119 -0
- package/dist/src/tools/diffOptions.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +9 -33
- package/dist/src/tools/edit.js +167 -132
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +124 -50
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +3 -10
- package/dist/src/tools/glob.js +97 -99
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +37 -26
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +3 -35
- package/dist/src/tools/grep.js +117 -88
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +36 -22
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +14 -3
- package/dist/src/tools/mcp-client.js +82 -6
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +337 -2
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +2 -2
- package/dist/src/tools/memoryTool.js +1 -0
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +8 -5
- package/dist/src/tools/modifiable-tool.js +4 -1
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +3 -3
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +4 -6
- package/dist/src/tools/read-file.js +87 -46
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +207 -126
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +8 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +16 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.test.js +17 -0
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/todo-events.d.ts +22 -0
- package/dist/src/tools/todo-events.js +24 -0
- package/dist/src/tools/todo-events.js.map +1 -0
- package/dist/src/tools/todo-pause.d.ts +22 -0
- package/dist/src/tools/todo-pause.js +93 -0
- package/dist/src/tools/todo-pause.js.map +1 -0
- package/dist/src/tools/todo-pause.spec.d.ts +6 -0
- package/dist/src/tools/todo-pause.spec.js +287 -0
- package/dist/src/tools/todo-pause.spec.js.map +1 -0
- package/dist/src/tools/todo-read.js.map +1 -1
- package/dist/src/tools/todo-schemas.d.ts +232 -4
- package/dist/src/tools/todo-schemas.js +13 -0
- package/dist/src/tools/todo-schemas.js.map +1 -1
- package/dist/src/tools/todo-schemas.test.js +190 -1
- package/dist/src/tools/todo-schemas.test.js.map +1 -1
- package/dist/src/tools/todo-store.d.ts +1 -4
- package/dist/src/tools/todo-store.js +41 -40
- package/dist/src/tools/todo-store.js.map +1 -1
- package/dist/src/tools/todo-store.test.js +34 -40
- package/dist/src/tools/todo-store.test.js.map +1 -1
- package/dist/src/tools/todo-write.d.ts +1 -1
- package/dist/src/tools/todo-write.js +84 -47
- package/dist/src/tools/todo-write.js.map +1 -1
- package/dist/src/tools/todo-write.test.js +23 -9
- package/dist/src/tools/todo-write.test.js.map +1 -1
- package/dist/src/tools/tool-context.d.ts +2 -0
- package/dist/src/tools/tool-error.d.ts +4 -0
- package/dist/src/tools/tool-error.js +4 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +12 -6
- package/dist/src/tools/tool-registry.js +19 -4
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +3 -20
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +134 -39
- package/dist/src/tools/tools.js +115 -10
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-search.test.js +1 -0
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +6 -2
- package/dist/src/tools/write-file.js +106 -16
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +25 -7
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +4 -0
- package/dist/src/utils/environmentContext.d.ts +21 -0
- package/dist/src/utils/environmentContext.js +90 -0
- package/dist/src/utils/environmentContext.js.map +1 -0
- package/dist/src/utils/environmentContext.test.d.ts +6 -0
- package/dist/src/utils/environmentContext.test.js +139 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +7 -0
- package/dist/src/utils/fileUtils.js +11 -10
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +1 -4
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
- package/dist/src/utils/filesearch/fileSearch.js +27 -5
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +21 -1
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +4 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/shell-utils.js +14 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.shellReplacement.test.js +149 -0
- package/dist/src/utils/shell-utils.shellReplacement.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { BaseProvider } from './BaseProvider.js';
|
|
8
|
+
import { ContentGeneratorRole } from './ContentGeneratorRole.js';
|
|
9
|
+
// Mock OAuth manager for testing
|
|
10
|
+
const mockOAuthManager = {
|
|
11
|
+
getToken: vi.fn(),
|
|
12
|
+
isAuthenticated: vi.fn(),
|
|
13
|
+
};
|
|
14
|
+
// Concrete implementation of BaseProvider for testing
|
|
15
|
+
class TestProvider extends BaseProvider {
|
|
16
|
+
constructor(config) {
|
|
17
|
+
super(config);
|
|
18
|
+
}
|
|
19
|
+
supportsOAuth() {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
async getModels() {
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
id: 'test-model',
|
|
26
|
+
name: 'Test Model',
|
|
27
|
+
provider: 'test',
|
|
28
|
+
supportedToolFormats: [],
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
async *generateChatCompletion(_messages, _tools, _toolFormat) {
|
|
33
|
+
// Use the base auth token to ensure it's resolved
|
|
34
|
+
const token = await this.getAuthToken();
|
|
35
|
+
yield {
|
|
36
|
+
role: 'assistant',
|
|
37
|
+
content: `Response using token: ${token.substring(0, 10)}...`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Non-OAuth provider for testing
|
|
42
|
+
class NonOAuthTestProvider extends BaseProvider {
|
|
43
|
+
supportsOAuth() {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
async getModels() {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
async *generateChatCompletion(_messages, _tools) {
|
|
50
|
+
const token = await this.getAuthToken();
|
|
51
|
+
yield { role: 'assistant', content: `Non-OAuth response: ${token}` };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
describe('BaseProvider', () => {
|
|
55
|
+
let originalEnv;
|
|
56
|
+
beforeEach(() => {
|
|
57
|
+
vi.clearAllMocks();
|
|
58
|
+
originalEnv = { ...process.env };
|
|
59
|
+
// Clear test environment variables
|
|
60
|
+
delete process.env.TEST_API_KEY;
|
|
61
|
+
delete process.env.ANOTHER_API_KEY;
|
|
62
|
+
});
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
process.env = originalEnv;
|
|
65
|
+
vi.restoreAllMocks();
|
|
66
|
+
});
|
|
67
|
+
describe('Authentication Precedence', () => {
|
|
68
|
+
it('should prioritize command key over all other methods', async () => {
|
|
69
|
+
const config = {
|
|
70
|
+
name: 'test',
|
|
71
|
+
commandKey: 'command-key-123',
|
|
72
|
+
cliKey: 'cli-key-456',
|
|
73
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
74
|
+
isOAuthEnabled: true,
|
|
75
|
+
oauthProvider: 'test',
|
|
76
|
+
oauthManager: mockOAuthManager,
|
|
77
|
+
};
|
|
78
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
79
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
80
|
+
const provider = new TestProvider(config);
|
|
81
|
+
// When: Generate chat completion (triggers lazy auth)
|
|
82
|
+
const response = await provider
|
|
83
|
+
.generateChatCompletion([
|
|
84
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
85
|
+
])
|
|
86
|
+
.next();
|
|
87
|
+
// Then: Should use command key
|
|
88
|
+
expect(response.value).toMatchObject({
|
|
89
|
+
content: expect.stringContaining('command-ke'),
|
|
90
|
+
});
|
|
91
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
92
|
+
});
|
|
93
|
+
it('should fall back to CLI key when no command key', async () => {
|
|
94
|
+
const config = {
|
|
95
|
+
name: 'test',
|
|
96
|
+
cliKey: 'cli-key-456',
|
|
97
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
98
|
+
isOAuthEnabled: true,
|
|
99
|
+
oauthProvider: 'test',
|
|
100
|
+
oauthManager: mockOAuthManager,
|
|
101
|
+
};
|
|
102
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
103
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
104
|
+
const provider = new TestProvider(config);
|
|
105
|
+
const response = await provider
|
|
106
|
+
.generateChatCompletion([
|
|
107
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
108
|
+
])
|
|
109
|
+
.next();
|
|
110
|
+
expect(response.value).toMatchObject({
|
|
111
|
+
content: expect.stringContaining('cli-key-45'),
|
|
112
|
+
});
|
|
113
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
114
|
+
});
|
|
115
|
+
it('should fall back to environment variable', async () => {
|
|
116
|
+
const config = {
|
|
117
|
+
name: 'test',
|
|
118
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
119
|
+
isOAuthEnabled: true,
|
|
120
|
+
oauthProvider: 'test',
|
|
121
|
+
oauthManager: mockOAuthManager,
|
|
122
|
+
};
|
|
123
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
124
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
125
|
+
const provider = new TestProvider(config);
|
|
126
|
+
const response = await provider
|
|
127
|
+
.generateChatCompletion([
|
|
128
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
129
|
+
])
|
|
130
|
+
.next();
|
|
131
|
+
expect(response.value).toMatchObject({
|
|
132
|
+
content: expect.stringContaining('env-key-78'),
|
|
133
|
+
});
|
|
134
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
135
|
+
});
|
|
136
|
+
it('should fall back to OAuth when enabled and no other auth available', async () => {
|
|
137
|
+
const config = {
|
|
138
|
+
name: 'test',
|
|
139
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
140
|
+
isOAuthEnabled: true,
|
|
141
|
+
oauthProvider: 'test',
|
|
142
|
+
oauthManager: mockOAuthManager,
|
|
143
|
+
};
|
|
144
|
+
// No environment variables set
|
|
145
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
146
|
+
const provider = new TestProvider(config);
|
|
147
|
+
const response = await provider
|
|
148
|
+
.generateChatCompletion([
|
|
149
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
150
|
+
])
|
|
151
|
+
.next();
|
|
152
|
+
expect(response.value).toMatchObject({
|
|
153
|
+
content: expect.stringContaining('oauth-toke'),
|
|
154
|
+
});
|
|
155
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledWith('test');
|
|
156
|
+
});
|
|
157
|
+
it('should throw error when no authentication available', async () => {
|
|
158
|
+
const config = {
|
|
159
|
+
name: 'test',
|
|
160
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
161
|
+
isOAuthEnabled: false, // OAuth disabled
|
|
162
|
+
oauthProvider: 'test',
|
|
163
|
+
};
|
|
164
|
+
// No environment variables set
|
|
165
|
+
const provider = new TestProvider(config);
|
|
166
|
+
await expect(provider
|
|
167
|
+
.generateChatCompletion([
|
|
168
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
169
|
+
])
|
|
170
|
+
.next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('OAuth Support Validation', () => {
|
|
174
|
+
it('should not attempt OAuth when provider does not support it', async () => {
|
|
175
|
+
const config = {
|
|
176
|
+
name: 'non-oauth-test',
|
|
177
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
178
|
+
isOAuthEnabled: true, // Enabled but provider doesn't support it
|
|
179
|
+
oauthProvider: 'test',
|
|
180
|
+
oauthManager: mockOAuthManager,
|
|
181
|
+
};
|
|
182
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
183
|
+
const provider = new NonOAuthTestProvider(config);
|
|
184
|
+
await expect(provider
|
|
185
|
+
.generateChatCompletion([
|
|
186
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
187
|
+
])
|
|
188
|
+
.next()).rejects.toThrow('No authentication method available');
|
|
189
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
it('should provide helpful error message when OAuth is only available option', async () => {
|
|
192
|
+
const config = {
|
|
193
|
+
name: 'test',
|
|
194
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
195
|
+
isOAuthEnabled: true,
|
|
196
|
+
oauthProvider: 'test',
|
|
197
|
+
// No OAuth manager provided
|
|
198
|
+
};
|
|
199
|
+
const provider = new TestProvider(config);
|
|
200
|
+
await expect(provider
|
|
201
|
+
.generateChatCompletion([
|
|
202
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
203
|
+
])
|
|
204
|
+
.next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('Lazy OAuth Triggering', () => {
|
|
208
|
+
it('should only trigger OAuth when making API calls, not during initialization', async () => {
|
|
209
|
+
const config = {
|
|
210
|
+
name: 'test',
|
|
211
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
212
|
+
isOAuthEnabled: true,
|
|
213
|
+
oauthProvider: 'test',
|
|
214
|
+
oauthManager: mockOAuthManager,
|
|
215
|
+
};
|
|
216
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
217
|
+
// When: Initialize provider
|
|
218
|
+
const provider = new TestProvider(config);
|
|
219
|
+
// Then: OAuth should not be called during initialization
|
|
220
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
221
|
+
// When: Make API call
|
|
222
|
+
await provider
|
|
223
|
+
.generateChatCompletion([
|
|
224
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
225
|
+
])
|
|
226
|
+
.next();
|
|
227
|
+
// Then: OAuth should be called
|
|
228
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledWith('test');
|
|
229
|
+
});
|
|
230
|
+
it('should cache auth token to avoid repeated OAuth calls', async () => {
|
|
231
|
+
const config = {
|
|
232
|
+
name: 'test',
|
|
233
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
234
|
+
isOAuthEnabled: true,
|
|
235
|
+
oauthProvider: 'test',
|
|
236
|
+
oauthManager: mockOAuthManager,
|
|
237
|
+
};
|
|
238
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
239
|
+
const provider = new TestProvider(config);
|
|
240
|
+
// When: Make multiple API calls
|
|
241
|
+
await provider
|
|
242
|
+
.generateChatCompletion([
|
|
243
|
+
{ role: ContentGeneratorRole.USER, content: 'test 1' },
|
|
244
|
+
])
|
|
245
|
+
.next();
|
|
246
|
+
await provider
|
|
247
|
+
.generateChatCompletion([
|
|
248
|
+
{ role: ContentGeneratorRole.USER, content: 'test 2' },
|
|
249
|
+
])
|
|
250
|
+
.next();
|
|
251
|
+
// Then: OAuth should be called once and cached for the second call
|
|
252
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledTimes(1); // Called once, cached for second call
|
|
253
|
+
});
|
|
254
|
+
it('should re-resolve auth after cache expires', async () => {
|
|
255
|
+
const config = {
|
|
256
|
+
name: 'test',
|
|
257
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
258
|
+
isOAuthEnabled: true,
|
|
259
|
+
oauthProvider: 'test',
|
|
260
|
+
oauthManager: mockOAuthManager,
|
|
261
|
+
};
|
|
262
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
263
|
+
// Mock Date.now to control cache expiration
|
|
264
|
+
const originalNow = Date.now;
|
|
265
|
+
let mockTime = 1000;
|
|
266
|
+
vi.spyOn(Date, 'now').mockImplementation(() => mockTime);
|
|
267
|
+
const provider = new TestProvider(config);
|
|
268
|
+
// First call
|
|
269
|
+
await provider
|
|
270
|
+
.generateChatCompletion([
|
|
271
|
+
{ role: ContentGeneratorRole.USER, content: 'test 1' },
|
|
272
|
+
])
|
|
273
|
+
.next();
|
|
274
|
+
// Advance time beyond cache duration (1 minute)
|
|
275
|
+
mockTime += 61000;
|
|
276
|
+
// Second call after cache expiry
|
|
277
|
+
await provider
|
|
278
|
+
.generateChatCompletion([
|
|
279
|
+
{ role: ContentGeneratorRole.USER, content: 'test 2' },
|
|
280
|
+
])
|
|
281
|
+
.next();
|
|
282
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledTimes(2);
|
|
283
|
+
// Restore Date.now
|
|
284
|
+
Date.now = originalNow;
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
describe('Utility Methods', () => {
|
|
288
|
+
it('should correctly identify when non-OAuth auth is available', async () => {
|
|
289
|
+
const config = {
|
|
290
|
+
name: 'test',
|
|
291
|
+
cliKey: 'cli-key-456',
|
|
292
|
+
isOAuthEnabled: true,
|
|
293
|
+
oauthProvider: 'test',
|
|
294
|
+
oauthManager: mockOAuthManager,
|
|
295
|
+
};
|
|
296
|
+
const provider = new TestProvider(config);
|
|
297
|
+
const hasNonOAuth = await provider.hasNonOAuthAuthentication();
|
|
298
|
+
expect(hasNonOAuth).toBe(true);
|
|
299
|
+
});
|
|
300
|
+
it('should correctly identify OAuth-only scenarios', async () => {
|
|
301
|
+
const config = {
|
|
302
|
+
name: 'test',
|
|
303
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
304
|
+
isOAuthEnabled: true,
|
|
305
|
+
oauthProvider: 'test',
|
|
306
|
+
oauthManager: mockOAuthManager,
|
|
307
|
+
};
|
|
308
|
+
// No environment variables set
|
|
309
|
+
const provider = new TestProvider(config);
|
|
310
|
+
const isOAuthOnly = await provider.isOAuthOnlyAvailable();
|
|
311
|
+
expect(isOAuthOnly).toBe(true);
|
|
312
|
+
});
|
|
313
|
+
it('should get correct auth method name', async () => {
|
|
314
|
+
const config = {
|
|
315
|
+
name: 'test',
|
|
316
|
+
cliKey: 'cli-key-456',
|
|
317
|
+
};
|
|
318
|
+
const provider = new TestProvider(config);
|
|
319
|
+
const methodName = await provider.getAuthMethodName();
|
|
320
|
+
expect(methodName).toBe('cli-key');
|
|
321
|
+
});
|
|
322
|
+
it('should check authentication status correctly', async () => {
|
|
323
|
+
const config = {
|
|
324
|
+
name: 'test',
|
|
325
|
+
cliKey: 'cli-key-456',
|
|
326
|
+
};
|
|
327
|
+
const provider = new TestProvider(config);
|
|
328
|
+
const isAuthenticated = await provider.isAuthenticated();
|
|
329
|
+
expect(isAuthenticated).toBe(true);
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
describe('Configuration Updates', () => {
|
|
333
|
+
it('should update API key correctly', async () => {
|
|
334
|
+
const config = {
|
|
335
|
+
name: 'test',
|
|
336
|
+
cliKey: 'old-key',
|
|
337
|
+
};
|
|
338
|
+
const provider = new TestProvider(config);
|
|
339
|
+
// When: Update API key
|
|
340
|
+
provider.setApiKey?.('new-key');
|
|
341
|
+
// Then: Should use new key
|
|
342
|
+
const response = await provider
|
|
343
|
+
.generateChatCompletion([
|
|
344
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
345
|
+
])
|
|
346
|
+
.next();
|
|
347
|
+
expect(response.value).toMatchObject({
|
|
348
|
+
content: expect.stringContaining('new-key'),
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
it('should clear auth cache when API key is updated', async () => {
|
|
352
|
+
const config = {
|
|
353
|
+
name: 'test',
|
|
354
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
355
|
+
isOAuthEnabled: true,
|
|
356
|
+
oauthProvider: 'test',
|
|
357
|
+
oauthManager: mockOAuthManager,
|
|
358
|
+
};
|
|
359
|
+
vi.mocked(mockOAuthManager.getToken)
|
|
360
|
+
.mockResolvedValueOnce('oauth-token-1')
|
|
361
|
+
.mockResolvedValueOnce('oauth-token-2');
|
|
362
|
+
const provider = new TestProvider(config);
|
|
363
|
+
// First call uses OAuth
|
|
364
|
+
await provider
|
|
365
|
+
.generateChatCompletion([
|
|
366
|
+
{ role: ContentGeneratorRole.USER, content: 'test 1' },
|
|
367
|
+
])
|
|
368
|
+
.next();
|
|
369
|
+
// Update to use API key
|
|
370
|
+
provider.setApiKey?.('new-api-key');
|
|
371
|
+
// Second call should use new API key, not cached OAuth
|
|
372
|
+
const response = await provider
|
|
373
|
+
.generateChatCompletion([
|
|
374
|
+
{ role: ContentGeneratorRole.USER, content: 'test 2' },
|
|
375
|
+
])
|
|
376
|
+
.next();
|
|
377
|
+
expect(response.value).toMatchObject({
|
|
378
|
+
content: expect.stringContaining('new-api-ke'),
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
it('should update OAuth configuration correctly', async () => {
|
|
382
|
+
const config = {
|
|
383
|
+
name: 'test',
|
|
384
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
385
|
+
isOAuthEnabled: false,
|
|
386
|
+
oauthProvider: 'test',
|
|
387
|
+
};
|
|
388
|
+
const provider = new TestProvider(config);
|
|
389
|
+
// Initially should fail due to no auth
|
|
390
|
+
await expect(provider
|
|
391
|
+
.generateChatCompletion([
|
|
392
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
393
|
+
])
|
|
394
|
+
.next()).rejects.toThrow();
|
|
395
|
+
// Enable OAuth
|
|
396
|
+
provider.updateOAuthConfig(true, 'test', mockOAuthManager);
|
|
397
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token');
|
|
398
|
+
// Should now work with OAuth
|
|
399
|
+
const response = await provider
|
|
400
|
+
.generateChatCompletion([
|
|
401
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
402
|
+
])
|
|
403
|
+
.next();
|
|
404
|
+
expect(response.value).toMatchObject({
|
|
405
|
+
content: expect.stringContaining('oauth-toke'),
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
describe('Error Handling', () => {
|
|
410
|
+
it('should handle OAuth errors gracefully', async () => {
|
|
411
|
+
const config = {
|
|
412
|
+
name: 'test',
|
|
413
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
414
|
+
isOAuthEnabled: true,
|
|
415
|
+
oauthProvider: 'test',
|
|
416
|
+
oauthManager: mockOAuthManager,
|
|
417
|
+
};
|
|
418
|
+
vi.mocked(mockOAuthManager.getToken).mockRejectedValue(new Error('OAuth failed'));
|
|
419
|
+
const provider = new TestProvider(config);
|
|
420
|
+
await expect(provider
|
|
421
|
+
.generateChatCompletion([
|
|
422
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
423
|
+
])
|
|
424
|
+
.next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
|
|
425
|
+
});
|
|
426
|
+
it('should handle missing OAuth provider gracefully', async () => {
|
|
427
|
+
const config = {
|
|
428
|
+
name: 'test',
|
|
429
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
430
|
+
isOAuthEnabled: true,
|
|
431
|
+
// No oauthProvider specified
|
|
432
|
+
oauthManager: mockOAuthManager,
|
|
433
|
+
};
|
|
434
|
+
const provider = new TestProvider(config);
|
|
435
|
+
await expect(provider
|
|
436
|
+
.generateChatCompletion([
|
|
437
|
+
{ role: ContentGeneratorRole.USER, content: 'test' },
|
|
438
|
+
])
|
|
439
|
+
.next()).rejects.toThrow('No API key found and OAuth is available but not authenticated for test provider');
|
|
440
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
describe('Default Implementations', () => {
|
|
444
|
+
it('should provide default implementations for optional methods', () => {
|
|
445
|
+
const config = {
|
|
446
|
+
name: 'test',
|
|
447
|
+
cliKey: 'test-key',
|
|
448
|
+
};
|
|
449
|
+
const provider = new TestProvider(config);
|
|
450
|
+
// These should not throw
|
|
451
|
+
expect(provider.setModel?.('new-model')).toBeUndefined();
|
|
452
|
+
expect(provider.getCurrentModel?.()).toBe('default');
|
|
453
|
+
expect(provider.getToolFormat?.()).toBe('default');
|
|
454
|
+
expect(provider.setToolFormatOverride?.(null)).toBeUndefined();
|
|
455
|
+
expect(provider.isPaidMode?.()).toBe(false);
|
|
456
|
+
expect(provider.clearState?.()).toBeUndefined();
|
|
457
|
+
expect(provider.setConfig?.({})).toBeUndefined();
|
|
458
|
+
expect(provider.getServerTools()).toEqual([]);
|
|
459
|
+
expect(provider.setModelParams?.(undefined)).toBeUndefined();
|
|
460
|
+
expect(provider.getModelParams?.()).toBeUndefined();
|
|
461
|
+
});
|
|
462
|
+
it('should throw error for unsupported server tools', async () => {
|
|
463
|
+
const config = {
|
|
464
|
+
name: 'test',
|
|
465
|
+
cliKey: 'test-key',
|
|
466
|
+
};
|
|
467
|
+
const provider = new TestProvider(config);
|
|
468
|
+
await expect(provider.invokeServerTool('unsupported-tool', {})).rejects.toThrow("Server tool 'unsupported-tool' not supported by test provider");
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
//# sourceMappingURL=BaseProvider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseProvider.test.js","sourceRoot":"","sources":["../../../src/providers/BaseProvider.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AAKrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,iCAAiC;AACjC,MAAM,gBAAgB,GAAiB;IACrC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC;AAEF,sDAAsD;AACtD,MAAM,YAAa,SAAQ,YAAY;IACrC,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO;YACL;gBACE,EAAE,EAAE,YAAY;gBAChB,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,MAAM;gBAChB,oBAAoB,EAAE,EAAE;aACzB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,sBAAsB,CAC3B,SAAqB,EACrB,MAAgB,EAChB,WAAoB;QAEpB,kDAAkD;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM;YACJ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,yBAAyB,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK;SAC9D,CAAC;IACJ,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,oBAAqB,SAAQ,YAAY;IACnC,aAAa;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,CAAC,sBAAsB,CAC3B,SAAqB,EACrB,MAAgB;QAEhB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,uBAAuB,KAAK,EAAE,EAAE,CAAC;IACvE,CAAC;CACF;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,WAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,mCAAmC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,UAAU,EAAE,iBAAiB;gBAC7B,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,sDAAsD;YACtD,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,+BAA+B;YAC/B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC;YACzC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,+BAA+B;YAC/B,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;YAE1E,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,KAAK,EAAE,iBAAiB;gBACxC,aAAa,EAAE,MAAM;aACtB,CAAC;YAEF,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI,EAAE,0CAA0C;gBAChE,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAElD,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAExD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,4BAA4B;aAC7B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,yDAAyD;YACzD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAEzD,sBAAsB;YACtB,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,+BAA+B;YAC/B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,gCAAgC;YAChC,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YACV,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,mEAAmE;YACnE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;QACpG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,4CAA4C;YAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;YAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,aAAa;YACb,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,gDAAgD;YAChD,QAAQ,IAAI,KAAK,CAAC;YAElB,iCAAiC;YACjC,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAE3D,mBAAmB;YACnB,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;gBACrB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,yBAAyB,EAAE,CAAC;YAC/D,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtD,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,aAAa;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;YACzD,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;aAClB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,uBAAuB;YACvB,QAAQ,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;YAEhC,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC;aAC5C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;iBACjC,qBAAqB,CAAC,eAAe,CAAC;iBACtC,qBAAqB,CAAC,eAAe,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,wBAAwB;YACxB,MAAM,QAAQ;iBACX,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,wBAAwB;YACxB,QAAQ,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;YAEpC,uDAAuD;YACvD,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;aACvD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,MAAM;aACtB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,uCAAuC;YACvC,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAEpB,eAAe;YAEb,QAOD,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACpD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAEtE,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,QAAQ;iBAC5B,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CAAC;YAEV,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,MAAM;gBACrB,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACpD,IAAI,KAAK,CAAC,cAAc,CAAC,CAC1B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,CAAC,cAAc,CAAC;gBAC7B,cAAc,EAAE,IAAI;gBACpB,6BAA6B;gBAC7B,YAAY,EAAE,gBAAgB;aAC/B,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ;iBACL,sBAAsB,CAAC;gBACtB,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;aACrD,CAAC;iBACD,IAAI,EAAE,CACV,CAAC,OAAO,CAAC,OAAO,CACf,iFAAiF,CAClF,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,UAAU;aACnB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,yBAAyB;YACzB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAuB;gBACjC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,UAAU;aACnB,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,MAAM,CACV,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAClD,CAAC,OAAO,CAAC,OAAO,CACf,+DAA+D,CAChE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -5,10 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { IProvider } from './IProvider.js';
|
|
7
7
|
import { IModel } from './IModel.js';
|
|
8
|
+
import { Config } from '../config/config.js';
|
|
8
9
|
/**
|
|
9
10
|
* Manager for handling multiple providers
|
|
10
11
|
*/
|
|
11
12
|
export interface IProviderManager {
|
|
13
|
+
/**
|
|
14
|
+
* Set the configuration for the provider manager
|
|
15
|
+
*/
|
|
16
|
+
setConfig(config: Config): void;
|
|
12
17
|
/**
|
|
13
18
|
* Register a provider
|
|
14
19
|
*/
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { IProvider, IModel, ITool, IMessage } from './IProvider.js';
|
|
7
|
+
import { Config } from '../config/config.js';
|
|
8
|
+
export interface ConversationDataRedactor {
|
|
9
|
+
redactMessage(message: IMessage, provider: string): IMessage;
|
|
10
|
+
redactToolCall(tool: ITool): ITool;
|
|
11
|
+
redactResponseContent(content: string, provider: string): string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A minimal logging wrapper that acts as a transparent passthrough to the wrapped provider.
|
|
15
|
+
* Only intercepts generateChatCompletion to log conversations while forwarding all other
|
|
16
|
+
* methods directly to the wrapped provider without modification.
|
|
17
|
+
*/
|
|
18
|
+
export declare class LoggingProviderWrapper implements IProvider {
|
|
19
|
+
private readonly wrapped;
|
|
20
|
+
private readonly config;
|
|
21
|
+
private conversationId;
|
|
22
|
+
private turnNumber;
|
|
23
|
+
private redactor;
|
|
24
|
+
constructor(wrapped: IProvider, config: Config, redactor?: ConversationDataRedactor);
|
|
25
|
+
/**
|
|
26
|
+
* Access to the wrapped provider for unwrapping if needed
|
|
27
|
+
*/
|
|
28
|
+
get wrappedProvider(): IProvider;
|
|
29
|
+
get name(): string;
|
|
30
|
+
get isDefault(): boolean | undefined;
|
|
31
|
+
getModels(): Promise<IModel[]>;
|
|
32
|
+
generateChatCompletion(messages: IMessage[], tools?: ITool[], toolFormat?: string): AsyncIterableIterator<unknown>;
|
|
33
|
+
private logRequest;
|
|
34
|
+
private logResponseStream;
|
|
35
|
+
private extractSimpleContent;
|
|
36
|
+
private logResponse;
|
|
37
|
+
private generateConversationId;
|
|
38
|
+
private generatePromptId;
|
|
39
|
+
private logToolCall;
|
|
40
|
+
setModel?(modelId: string): void;
|
|
41
|
+
getCurrentModel?(): string;
|
|
42
|
+
setApiKey?(apiKey: string): void;
|
|
43
|
+
setBaseUrl?(baseUrl?: string): void;
|
|
44
|
+
getToolFormat?(): string;
|
|
45
|
+
setToolFormatOverride?(format: string | null): void;
|
|
46
|
+
isPaidMode?(): boolean;
|
|
47
|
+
clearState?(): void;
|
|
48
|
+
setConfig?(config: unknown): void;
|
|
49
|
+
getServerTools(): string[];
|
|
50
|
+
invokeServerTool(toolName: string, params: unknown, config?: unknown): Promise<unknown>;
|
|
51
|
+
setModelParams?(params: Record<string, unknown> | undefined): void;
|
|
52
|
+
getModelParams?(): Record<string, unknown> | undefined;
|
|
53
|
+
}
|