@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,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Authentication precedence utility for providers
|
|
8
|
+
*
|
|
9
|
+
* Implements the authentication precedence chain:
|
|
10
|
+
* 1. /key command key
|
|
11
|
+
* 2. /keyfile command keyfile
|
|
12
|
+
* 3. --key CLI argument
|
|
13
|
+
* 4. --keyfile CLI argument
|
|
14
|
+
* 5. Environment variables
|
|
15
|
+
* 6. OAuth (if enabled)
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'node:fs/promises';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
export class AuthPrecedenceResolver {
|
|
20
|
+
config;
|
|
21
|
+
oauthManager;
|
|
22
|
+
constructor(config, oauthManager) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
this.oauthManager = oauthManager;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves authentication using the full precedence chain
|
|
28
|
+
* Returns the first available authentication method or null if none found
|
|
29
|
+
*/
|
|
30
|
+
async resolveAuthentication() {
|
|
31
|
+
// 1. Check /key command key (highest priority)
|
|
32
|
+
if (this.config.commandKey && this.config.commandKey.trim() !== '') {
|
|
33
|
+
return this.config.commandKey;
|
|
34
|
+
}
|
|
35
|
+
// 2. Check /keyfile command keyfile
|
|
36
|
+
if (this.config.commandKeyfile) {
|
|
37
|
+
try {
|
|
38
|
+
const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
|
|
39
|
+
if (keyFromFile) {
|
|
40
|
+
return keyFromFile;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (process.env.DEBUG) {
|
|
45
|
+
console.warn(`Failed to read command keyfile ${this.config.commandKeyfile}:`, error);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 3. Check --key CLI argument
|
|
50
|
+
if (this.config.cliKey && this.config.cliKey.trim() !== '') {
|
|
51
|
+
return this.config.cliKey;
|
|
52
|
+
}
|
|
53
|
+
// 4. Check --keyfile CLI argument
|
|
54
|
+
if (this.config.cliKeyfile) {
|
|
55
|
+
try {
|
|
56
|
+
const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
|
|
57
|
+
if (keyFromFile) {
|
|
58
|
+
return keyFromFile;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (process.env.DEBUG) {
|
|
63
|
+
console.warn(`Failed to read CLI keyfile ${this.config.cliKeyfile}:`, error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 5. Check environment variables
|
|
68
|
+
if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
|
|
69
|
+
for (const envVarName of this.config.envKeyNames) {
|
|
70
|
+
const envValue = process.env[envVarName];
|
|
71
|
+
if (envValue && envValue.trim() !== '') {
|
|
72
|
+
return envValue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 6. OAuth (if enabled and supported)
|
|
77
|
+
if (this.config.isOAuthEnabled &&
|
|
78
|
+
this.config.supportsOAuth &&
|
|
79
|
+
this.oauthManager &&
|
|
80
|
+
this.config.oauthProvider) {
|
|
81
|
+
try {
|
|
82
|
+
const token = await this.oauthManager.getToken(this.config.oauthProvider);
|
|
83
|
+
if (token) {
|
|
84
|
+
return token;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (process.env.DEBUG) {
|
|
89
|
+
console.warn(`Failed to get OAuth token for ${this.config.oauthProvider}:`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// No authentication method available
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if any authentication method is available without triggering OAuth
|
|
98
|
+
*/
|
|
99
|
+
async hasNonOAuthAuthentication() {
|
|
100
|
+
// Check all precedence levels except OAuth
|
|
101
|
+
const tempConfig = { ...this.config, isOAuthEnabled: false };
|
|
102
|
+
const tempResolver = new AuthPrecedenceResolver(tempConfig, undefined);
|
|
103
|
+
const auth = await tempResolver.resolveAuthentication();
|
|
104
|
+
return auth !== null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if OAuth is the only available authentication method
|
|
108
|
+
*/
|
|
109
|
+
async isOAuthOnlyAvailable() {
|
|
110
|
+
const hasNonOAuth = await this.hasNonOAuthAuthentication();
|
|
111
|
+
return (!hasNonOAuth &&
|
|
112
|
+
this.config.isOAuthEnabled === true &&
|
|
113
|
+
this.config.supportsOAuth === true);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get authentication method name for debugging/logging
|
|
117
|
+
*/
|
|
118
|
+
async getAuthMethodName() {
|
|
119
|
+
// Check precedence levels and return method name
|
|
120
|
+
if (this.config.commandKey && this.config.commandKey.trim() !== '') {
|
|
121
|
+
return 'command-key';
|
|
122
|
+
}
|
|
123
|
+
if (this.config.commandKeyfile) {
|
|
124
|
+
try {
|
|
125
|
+
const keyFromFile = await this.readKeyFile(this.config.commandKeyfile);
|
|
126
|
+
if (keyFromFile) {
|
|
127
|
+
return 'command-keyfile';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Ignore errors for method detection
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (this.config.cliKey && this.config.cliKey.trim() !== '') {
|
|
135
|
+
return 'cli-key';
|
|
136
|
+
}
|
|
137
|
+
if (this.config.cliKeyfile) {
|
|
138
|
+
try {
|
|
139
|
+
const keyFromFile = await this.readKeyFile(this.config.cliKeyfile);
|
|
140
|
+
if (keyFromFile) {
|
|
141
|
+
return 'cli-keyfile';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Ignore errors for method detection
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.config.envKeyNames && this.config.envKeyNames.length > 0) {
|
|
149
|
+
for (const envVarName of this.config.envKeyNames) {
|
|
150
|
+
const envValue = process.env[envVarName];
|
|
151
|
+
if (envValue && envValue.trim() !== '') {
|
|
152
|
+
return `env-${envVarName.toLowerCase()}`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (this.config.isOAuthEnabled &&
|
|
157
|
+
this.config.supportsOAuth &&
|
|
158
|
+
this.oauthManager &&
|
|
159
|
+
this.config.oauthProvider) {
|
|
160
|
+
try {
|
|
161
|
+
const isAuthenticated = await this.oauthManager.isAuthenticated(this.config.oauthProvider);
|
|
162
|
+
if (isAuthenticated) {
|
|
163
|
+
return `oauth-${this.config.oauthProvider}`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore errors for method detection
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Reads API key from a file path, handling both absolute and relative paths
|
|
174
|
+
*/
|
|
175
|
+
async readKeyFile(filePath) {
|
|
176
|
+
try {
|
|
177
|
+
// Handle relative paths from current working directory
|
|
178
|
+
const resolvedPath = path.isAbsolute(filePath)
|
|
179
|
+
? filePath
|
|
180
|
+
: path.resolve(process.cwd(), filePath);
|
|
181
|
+
const content = await fs.readFile(resolvedPath, 'utf-8');
|
|
182
|
+
const key = content.trim();
|
|
183
|
+
if (key === '') {
|
|
184
|
+
if (process.env.DEBUG) {
|
|
185
|
+
console.warn(`Key file ${filePath} is empty`);
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
return key;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
if (process.env.DEBUG) {
|
|
193
|
+
console.warn(`Failed to read key file ${filePath}:`, error);
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Updates the configuration
|
|
200
|
+
*/
|
|
201
|
+
updateConfig(newConfig) {
|
|
202
|
+
this.config = { ...this.config, ...newConfig };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Updates the OAuth manager
|
|
206
|
+
*/
|
|
207
|
+
updateOAuthManager(oauthManager) {
|
|
208
|
+
this.oauthManager = oauthManager;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=precedence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precedence.js","sourceRoot":"","sources":["../../../src/auth/precedence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,374 @@
|
|
|
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 { AuthPrecedenceResolver, } from './precedence.js';
|
|
8
|
+
// Mock fs module
|
|
9
|
+
vi.mock('node:fs/promises', () => ({
|
|
10
|
+
readFile: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
const mockFs = await import('node:fs/promises');
|
|
13
|
+
// Mock OAuth manager for testing
|
|
14
|
+
const mockOAuthManager = {
|
|
15
|
+
getToken: vi.fn(),
|
|
16
|
+
isAuthenticated: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
describe('AuthPrecedenceResolver', () => {
|
|
19
|
+
let originalEnv;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
vi.clearAllMocks();
|
|
22
|
+
originalEnv = { ...process.env };
|
|
23
|
+
// Clear environment variables
|
|
24
|
+
delete process.env.TEST_API_KEY;
|
|
25
|
+
delete process.env.ANOTHER_API_KEY;
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
process.env = originalEnv;
|
|
29
|
+
vi.restoreAllMocks();
|
|
30
|
+
});
|
|
31
|
+
describe('Authentication Precedence Chain', () => {
|
|
32
|
+
it('should prioritize command key over all other methods', async () => {
|
|
33
|
+
// Given: All auth methods available
|
|
34
|
+
const config = {
|
|
35
|
+
commandKey: 'command-key-123',
|
|
36
|
+
commandKeyfile: '/path/to/command/keyfile',
|
|
37
|
+
cliKey: 'cli-key-456',
|
|
38
|
+
cliKeyfile: '/path/to/cli/keyfile',
|
|
39
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
40
|
+
isOAuthEnabled: true,
|
|
41
|
+
supportsOAuth: true,
|
|
42
|
+
oauthProvider: 'qwen',
|
|
43
|
+
};
|
|
44
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
45
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
46
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
47
|
+
// When: Resolve authentication
|
|
48
|
+
const result = await resolver.resolveAuthentication();
|
|
49
|
+
// Then: Should use command key (highest priority)
|
|
50
|
+
expect(result).toBe('command-key-123');
|
|
51
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
it('should fall back to command keyfile when no command key', async () => {
|
|
54
|
+
// Given: Command keyfile and other methods available
|
|
55
|
+
const keyFileContent = 'keyfile-content-123';
|
|
56
|
+
vi.mocked(mockFs.readFile).mockResolvedValue(keyFileContent);
|
|
57
|
+
const config = {
|
|
58
|
+
commandKeyfile: '/path/to/command/keyfile',
|
|
59
|
+
cliKey: 'cli-key-456',
|
|
60
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
61
|
+
isOAuthEnabled: true,
|
|
62
|
+
supportsOAuth: true,
|
|
63
|
+
oauthProvider: 'qwen',
|
|
64
|
+
};
|
|
65
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
66
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
67
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
68
|
+
// When: Resolve authentication
|
|
69
|
+
const result = await resolver.resolveAuthentication();
|
|
70
|
+
// Then: Should use command keyfile (second priority)
|
|
71
|
+
expect(result).toBe('keyfile-content-123');
|
|
72
|
+
expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/command/keyfile', 'utf-8');
|
|
73
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
it('should fall back to CLI key when no command methods', async () => {
|
|
76
|
+
// Given: CLI key and other methods available
|
|
77
|
+
const config = {
|
|
78
|
+
cliKey: 'cli-key-456',
|
|
79
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
80
|
+
isOAuthEnabled: true,
|
|
81
|
+
supportsOAuth: true,
|
|
82
|
+
oauthProvider: 'qwen',
|
|
83
|
+
};
|
|
84
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
85
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
86
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
87
|
+
// When: Resolve authentication
|
|
88
|
+
const result = await resolver.resolveAuthentication();
|
|
89
|
+
// Then: Should use CLI key (third priority)
|
|
90
|
+
expect(result).toBe('cli-key-456');
|
|
91
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
92
|
+
});
|
|
93
|
+
it('should fall back to CLI keyfile when no command or CLI key', async () => {
|
|
94
|
+
// Given: CLI keyfile and other methods available
|
|
95
|
+
const keyFileContent = 'cli-keyfile-content-456';
|
|
96
|
+
vi.mocked(mockFs.readFile).mockResolvedValue(keyFileContent);
|
|
97
|
+
const config = {
|
|
98
|
+
cliKeyfile: '/path/to/cli/keyfile',
|
|
99
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
100
|
+
isOAuthEnabled: true,
|
|
101
|
+
supportsOAuth: true,
|
|
102
|
+
oauthProvider: 'qwen',
|
|
103
|
+
};
|
|
104
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
105
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
106
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
107
|
+
// When: Resolve authentication
|
|
108
|
+
const result = await resolver.resolveAuthentication();
|
|
109
|
+
// Then: Should use CLI keyfile (fourth priority)
|
|
110
|
+
expect(result).toBe('cli-keyfile-content-456');
|
|
111
|
+
expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/cli/keyfile', 'utf-8');
|
|
112
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
it('should fall back to environment variables when no file or explicit keys', async () => {
|
|
115
|
+
// Given: Environment variable and OAuth available
|
|
116
|
+
const config = {
|
|
117
|
+
envKeyNames: ['TEST_API_KEY', 'ANOTHER_API_KEY'],
|
|
118
|
+
isOAuthEnabled: true,
|
|
119
|
+
supportsOAuth: true,
|
|
120
|
+
oauthProvider: 'qwen',
|
|
121
|
+
};
|
|
122
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
123
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
124
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
125
|
+
// When: Resolve authentication
|
|
126
|
+
const result = await resolver.resolveAuthentication();
|
|
127
|
+
// Then: Should use environment variable (fifth priority)
|
|
128
|
+
expect(result).toBe('env-key-789');
|
|
129
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
130
|
+
});
|
|
131
|
+
it('should check multiple environment variables in order', async () => {
|
|
132
|
+
// Given: Multiple environment variables, only second one set
|
|
133
|
+
const config = {
|
|
134
|
+
envKeyNames: ['FIRST_API_KEY', 'SECOND_API_KEY'],
|
|
135
|
+
isOAuthEnabled: true,
|
|
136
|
+
supportsOAuth: true,
|
|
137
|
+
oauthProvider: 'qwen',
|
|
138
|
+
};
|
|
139
|
+
// Only second env var is set
|
|
140
|
+
process.env.SECOND_API_KEY = 'second-env-key-789';
|
|
141
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
142
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
143
|
+
// When: Resolve authentication
|
|
144
|
+
const result = await resolver.resolveAuthentication();
|
|
145
|
+
// Then: Should use second environment variable
|
|
146
|
+
expect(result).toBe('second-env-key-789');
|
|
147
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
it('should fall back to OAuth when no other methods available', async () => {
|
|
150
|
+
// Given: Only OAuth available
|
|
151
|
+
const config = {
|
|
152
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
153
|
+
isOAuthEnabled: true,
|
|
154
|
+
supportsOAuth: true,
|
|
155
|
+
oauthProvider: 'qwen',
|
|
156
|
+
};
|
|
157
|
+
// No environment variables set
|
|
158
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
159
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
160
|
+
// When: Resolve authentication
|
|
161
|
+
const result = await resolver.resolveAuthentication();
|
|
162
|
+
// Then: Should use OAuth (lowest priority)
|
|
163
|
+
expect(result).toBe('oauth-token-abc');
|
|
164
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledWith('qwen');
|
|
165
|
+
});
|
|
166
|
+
it('should return null when no authentication methods available', async () => {
|
|
167
|
+
// Given: No auth methods available
|
|
168
|
+
const config = {
|
|
169
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
170
|
+
isOAuthEnabled: false, // OAuth disabled
|
|
171
|
+
supportsOAuth: true,
|
|
172
|
+
oauthProvider: 'qwen',
|
|
173
|
+
};
|
|
174
|
+
// No environment variables set
|
|
175
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
176
|
+
// When: Resolve authentication
|
|
177
|
+
const result = await resolver.resolveAuthentication();
|
|
178
|
+
// Then: Should return null
|
|
179
|
+
expect(result).toBe(null);
|
|
180
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe('OAuth Enablement Checks', () => {
|
|
184
|
+
it('should not use OAuth when disabled', async () => {
|
|
185
|
+
// Given: OAuth disabled but OAuth manager available
|
|
186
|
+
const config = {
|
|
187
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
188
|
+
isOAuthEnabled: false,
|
|
189
|
+
supportsOAuth: true,
|
|
190
|
+
oauthProvider: 'qwen',
|
|
191
|
+
};
|
|
192
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
193
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
194
|
+
// When: Resolve authentication
|
|
195
|
+
const result = await resolver.resolveAuthentication();
|
|
196
|
+
// Then: Should not use OAuth
|
|
197
|
+
expect(result).toBe(null);
|
|
198
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
it('should not use OAuth when not supported', async () => {
|
|
201
|
+
// Given: OAuth enabled but not supported
|
|
202
|
+
const config = {
|
|
203
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
204
|
+
isOAuthEnabled: true,
|
|
205
|
+
supportsOAuth: false, // Not supported
|
|
206
|
+
oauthProvider: 'qwen',
|
|
207
|
+
};
|
|
208
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('oauth-token-abc');
|
|
209
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
210
|
+
// When: Resolve authentication
|
|
211
|
+
const result = await resolver.resolveAuthentication();
|
|
212
|
+
// Then: Should not use OAuth
|
|
213
|
+
expect(result).toBe(null);
|
|
214
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
it('should not use OAuth when no OAuth manager', async () => {
|
|
217
|
+
// Given: OAuth enabled and supported but no manager
|
|
218
|
+
const config = {
|
|
219
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
220
|
+
isOAuthEnabled: true,
|
|
221
|
+
supportsOAuth: true,
|
|
222
|
+
oauthProvider: 'qwen',
|
|
223
|
+
};
|
|
224
|
+
const resolver = new AuthPrecedenceResolver(config, undefined); // No OAuth manager
|
|
225
|
+
// When: Resolve authentication
|
|
226
|
+
const result = await resolver.resolveAuthentication();
|
|
227
|
+
// Then: Should not use OAuth
|
|
228
|
+
expect(result).toBe(null);
|
|
229
|
+
});
|
|
230
|
+
it('should not use OAuth when no provider specified', async () => {
|
|
231
|
+
// Given: OAuth enabled and supported but no provider
|
|
232
|
+
const config = {
|
|
233
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
234
|
+
isOAuthEnabled: true,
|
|
235
|
+
supportsOAuth: true,
|
|
236
|
+
oauthProvider: undefined, // No provider
|
|
237
|
+
};
|
|
238
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
239
|
+
// When: Resolve authentication
|
|
240
|
+
const result = await resolver.resolveAuthentication();
|
|
241
|
+
// Then: Should not use OAuth
|
|
242
|
+
expect(result).toBe(null);
|
|
243
|
+
expect(mockOAuthManager.getToken).not.toHaveBeenCalled();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('Utility Methods', () => {
|
|
247
|
+
it('should correctly identify when non-OAuth auth is available', async () => {
|
|
248
|
+
// Given: API key available
|
|
249
|
+
const config = {
|
|
250
|
+
cliKey: 'cli-key-456',
|
|
251
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
252
|
+
isOAuthEnabled: true,
|
|
253
|
+
supportsOAuth: true,
|
|
254
|
+
oauthProvider: 'qwen',
|
|
255
|
+
};
|
|
256
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
257
|
+
// When: Check for non-OAuth auth
|
|
258
|
+
const hasNonOAuth = await resolver.hasNonOAuthAuthentication();
|
|
259
|
+
// Then: Should return true
|
|
260
|
+
expect(hasNonOAuth).toBe(true);
|
|
261
|
+
});
|
|
262
|
+
it('should correctly identify when only OAuth is available', async () => {
|
|
263
|
+
// Given: Only OAuth available
|
|
264
|
+
const config = {
|
|
265
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
266
|
+
isOAuthEnabled: true,
|
|
267
|
+
supportsOAuth: true,
|
|
268
|
+
oauthProvider: 'qwen',
|
|
269
|
+
};
|
|
270
|
+
const resolver = new AuthPrecedenceResolver(config, mockOAuthManager);
|
|
271
|
+
// When: Check if OAuth only
|
|
272
|
+
const isOAuthOnly = await resolver.isOAuthOnlyAvailable();
|
|
273
|
+
// Then: Should return true
|
|
274
|
+
expect(isOAuthOnly).toBe(true);
|
|
275
|
+
});
|
|
276
|
+
it('should get correct auth method name for CLI key', async () => {
|
|
277
|
+
// Given: CLI key configured
|
|
278
|
+
const config = {
|
|
279
|
+
cliKey: 'cli-key-456',
|
|
280
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
281
|
+
};
|
|
282
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
283
|
+
// When: Get auth method name
|
|
284
|
+
const methodName = await resolver.getAuthMethodName();
|
|
285
|
+
// Then: Should return cli-key
|
|
286
|
+
expect(methodName).toBe('cli-key');
|
|
287
|
+
});
|
|
288
|
+
it('should get correct auth method name for environment variable', async () => {
|
|
289
|
+
// Given: Environment variable configured
|
|
290
|
+
const config = {
|
|
291
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
292
|
+
};
|
|
293
|
+
process.env.TEST_API_KEY = 'env-key-789';
|
|
294
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
295
|
+
// When: Get auth method name
|
|
296
|
+
const methodName = await resolver.getAuthMethodName();
|
|
297
|
+
// Then: Should return env-test_api_key
|
|
298
|
+
expect(methodName).toBe('env-test_api_key');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
describe('File Handling', () => {
|
|
302
|
+
it('should handle keyfile read errors gracefully', async () => {
|
|
303
|
+
// Given: Keyfile that cannot be read
|
|
304
|
+
vi.mocked(mockFs.readFile).mockRejectedValue(new Error('File not found'));
|
|
305
|
+
const config = {
|
|
306
|
+
commandKeyfile: '/nonexistent/keyfile',
|
|
307
|
+
cliKey: 'cli-key-456',
|
|
308
|
+
};
|
|
309
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
310
|
+
// When: Resolve authentication
|
|
311
|
+
const result = await resolver.resolveAuthentication();
|
|
312
|
+
// Then: Should fall back to CLI key
|
|
313
|
+
expect(result).toBe('cli-key-456');
|
|
314
|
+
});
|
|
315
|
+
it('should handle empty keyfile gracefully', async () => {
|
|
316
|
+
// Given: Empty keyfile
|
|
317
|
+
vi.mocked(mockFs.readFile).mockResolvedValue(' \n \t '); // Whitespace only
|
|
318
|
+
const config = {
|
|
319
|
+
commandKeyfile: '/path/to/empty/keyfile',
|
|
320
|
+
cliKey: 'cli-key-456',
|
|
321
|
+
};
|
|
322
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
323
|
+
// When: Resolve authentication
|
|
324
|
+
const result = await resolver.resolveAuthentication();
|
|
325
|
+
// Then: Should fall back to CLI key
|
|
326
|
+
expect(result).toBe('cli-key-456');
|
|
327
|
+
});
|
|
328
|
+
it('should handle keyfile with valid content', async () => {
|
|
329
|
+
// Given: Keyfile with valid content
|
|
330
|
+
vi.mocked(mockFs.readFile).mockResolvedValue(' valid-key-content \n');
|
|
331
|
+
const config = {
|
|
332
|
+
commandKeyfile: '/path/to/valid/keyfile',
|
|
333
|
+
cliKey: 'cli-key-456',
|
|
334
|
+
};
|
|
335
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
336
|
+
// When: Resolve authentication
|
|
337
|
+
const result = await resolver.resolveAuthentication();
|
|
338
|
+
// Then: Should use keyfile content (trimmed)
|
|
339
|
+
expect(result).toBe('valid-key-content');
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
describe('Configuration Updates', () => {
|
|
343
|
+
it('should update configuration correctly', async () => {
|
|
344
|
+
// Given: Initial configuration
|
|
345
|
+
const config = {
|
|
346
|
+
cliKey: 'old-key',
|
|
347
|
+
envKeyNames: ['TEST_API_KEY'],
|
|
348
|
+
};
|
|
349
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
350
|
+
// When: Update configuration
|
|
351
|
+
resolver.updateConfig({ cliKey: 'new-key' });
|
|
352
|
+
// Then: Should use updated configuration
|
|
353
|
+
const result = await resolver.resolveAuthentication();
|
|
354
|
+
expect(result).toBe('new-key');
|
|
355
|
+
});
|
|
356
|
+
it('should update OAuth manager correctly', async () => {
|
|
357
|
+
// Given: Initial resolver without OAuth manager
|
|
358
|
+
const config = {
|
|
359
|
+
isOAuthEnabled: true,
|
|
360
|
+
supportsOAuth: true,
|
|
361
|
+
oauthProvider: 'qwen',
|
|
362
|
+
};
|
|
363
|
+
const resolver = new AuthPrecedenceResolver(config);
|
|
364
|
+
// When: Update OAuth manager
|
|
365
|
+
resolver.updateOAuthManager(mockOAuthManager);
|
|
366
|
+
vi.mocked(mockOAuthManager.getToken).mockResolvedValue('new-oauth-token');
|
|
367
|
+
// Then: Should use updated OAuth manager
|
|
368
|
+
const result = await resolver.resolveAuthentication();
|
|
369
|
+
expect(result).toBe('new-oauth-token');
|
|
370
|
+
expect(mockOAuthManager.getToken).toHaveBeenCalledWith('qwen');
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
//# sourceMappingURL=precedence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"precedence.test.js","sourceRoot":"","sources":["../../../src/auth/precedence.test.ts"],"names":[],"mappings":"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"}
|