@vybestack/llxprt-code-core 0.1.12 → 0.1.13-hotfix1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/adapters/IStreamAdapter.d.ts +18 -0
- package/dist/src/adapters/IStreamAdapter.js +7 -0
- package/dist/src/adapters/IStreamAdapter.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/oauth2.js +51 -29
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +36 -7
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.test.js +10 -2
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +28 -5
- package/dist/src/config/config.js +29 -4
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +2 -3
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +4 -2
- package/dist/src/core/client.js +68 -7
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +8 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +3 -2
- package/dist/src/core/contentGenerator.js +6 -8
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +12 -5
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +4 -2
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +50 -3
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/modelCheck.d.ts +1 -1
- package/dist/src/core/modelCheck.js +10 -3
- package/dist/src/core/modelCheck.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.d.ts +1 -1
- package/dist/src/core/prompts.js +14 -2
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.js +6 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/index.d.ts +29 -1
- package/dist/src/index.js +33 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +142 -0
- package/dist/src/mcp/oauth-provider.js +446 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -0
- package/dist/src/mcp/oauth-provider.test.js +520 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
- package/dist/src/mcp/oauth-token-storage.js +149 -0
- package/dist/src/mcp/oauth-token-storage.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
- package/dist/src/mcp/oauth-token-storage.test.js +205 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
- package/dist/src/mcp/oauth-utils.d.ts +109 -0
- package/dist/src/mcp/oauth-utils.js +183 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -0
- package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
- package/dist/src/mcp/oauth-utils.test.js +144 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -0
- package/dist/src/parsers/TextToolCallParser.d.ts +35 -0
- package/dist/src/parsers/TextToolCallParser.js +248 -0
- package/dist/src/parsers/TextToolCallParser.js.map +1 -0
- package/dist/src/parsers/TextToolCallParser.test.d.ts +1 -0
- package/dist/src/parsers/TextToolCallParser.test.js +225 -0
- package/dist/src/parsers/TextToolCallParser.test.js.map +1 -0
- package/dist/src/providers/ContentGeneratorRole.d.ts +14 -0
- package/dist/src/providers/ContentGeneratorRole.js +16 -0
- package/dist/src/providers/ContentGeneratorRole.js.map +1 -0
- package/dist/src/providers/IMessage.d.ts +38 -0
- package/dist/src/providers/IMessage.js +17 -0
- package/dist/src/providers/IMessage.js.map +1 -0
- package/dist/src/providers/IModel.d.ts +23 -0
- package/dist/src/providers/IModel.js +17 -0
- package/dist/src/providers/IModel.js.map +1 -0
- package/dist/src/providers/IProvider.d.ts +36 -0
- package/dist/src/providers/IProvider.js +17 -0
- package/dist/src/providers/IProvider.js.map +1 -0
- package/dist/src/providers/IProviderConfig.d.ts +31 -0
- package/dist/src/providers/IProviderConfig.js +7 -0
- package/dist/src/providers/IProviderConfig.js.map +1 -0
- package/dist/src/providers/IProviderManager.d.ts +53 -0
- package/dist/src/providers/IProviderManager.js +7 -0
- package/dist/src/providers/IProviderManager.js.map +1 -0
- package/dist/src/providers/ITool.d.ts +23 -0
- package/dist/src/providers/ITool.js +17 -0
- package/dist/src/providers/ITool.js.map +1 -0
- package/dist/src/providers/ProviderContentGenerator.d.ts +1 -1
- package/dist/src/providers/ProviderManager.d.ts +24 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +6 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.js +57 -0
- package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +1 -0
- package/dist/src/providers/ProviderManager.js +116 -0
- package/dist/src/providers/ProviderManager.js.map +1 -0
- package/dist/src/providers/ProviderManager.test.d.ts +6 -0
- package/dist/src/providers/ProviderManager.test.js +284 -0
- package/dist/src/providers/ProviderManager.test.js.map +1 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +2 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +15 -2
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +20 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +57 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js +490 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.js +486 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -0
- package/dist/src/providers/errors.d.ts +13 -0
- package/dist/src/providers/errors.js +19 -0
- package/dist/src/providers/errors.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.d.ts +97 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +6 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js +90 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.js +937 -0
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -0
- package/dist/src/providers/gemini/GeminiProvider.test.d.ts +6 -0
- package/dist/src/providers/gemini/GeminiProvider.test.js +136 -0
- package/dist/src/providers/gemini/GeminiProvider.test.js.map +1 -0
- package/dist/src/providers/integration/TEST_INSTRUCTIONS.md +197 -0
- package/dist/src/providers/integration/multi-provider.integration.test.d.ts +6 -0
- package/dist/src/providers/integration/multi-provider.integration.test.js +292 -0
- package/dist/src/providers/integration/multi-provider.integration.test.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +1 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +97 -0
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.d.ts +20 -0
- package/dist/src/providers/openai/ConversationCache.js +109 -0
- package/dist/src/providers/openai/ConversationCache.js.map +1 -0
- package/dist/src/providers/openai/ConversationCache.test.d.ts +1 -0
- package/dist/src/providers/openai/ConversationCache.test.js +113 -0
- package/dist/src/providers/openai/ConversationCache.test.js.map +1 -0
- package/dist/src/providers/openai/IChatGenerateParams.d.ts +11 -0
- package/dist/src/providers/openai/IChatGenerateParams.js +2 -0
- package/dist/src/providers/openai/IChatGenerateParams.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +189 -0
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.d.ts +80 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +6 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js +125 -0
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.js +523 -0
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js +326 -0
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +213 -0
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +58 -0
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +6 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +105 -0
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +1 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js +256 -0
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.test.d.ts +16 -0
- package/dist/src/providers/openai/OpenAIProvider.test.js +214 -0
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +2 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js +14 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +1 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +210 -0
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +1 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +1 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +65 -0
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.d.ts +73 -0
- package/dist/src/providers/openai/buildResponsesRequest.js +165 -0
- package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +129 -0
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.js +406 -0
- package/dist/src/providers/openai/buildResponsesRequest.test.js.map +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +1 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +50 -0
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +1 -0
- package/dist/src/providers/openai/docs/accessing-provider-info.md +172 -0
- package/dist/src/providers/openai/docs/params-mapping.md +91 -0
- package/dist/src/providers/openai/docs/responses-api-tool-calls.md +96 -0
- package/dist/src/providers/openai/estimateRemoteTokens.d.ts +26 -0
- package/dist/src/providers/openai/estimateRemoteTokens.js +75 -0
- package/dist/src/providers/openai/estimateRemoteTokens.js.map +1 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +1 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.js +125 -0
- package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +1 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.d.ts +46 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.js +75 -0
- package/dist/src/providers/openai/getOpenAIProviderInfo.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.d.ts +3 -0
- package/dist/src/providers/openai/parseResponsesStream.js +462 -0
- package/dist/src/providers/openai/parseResponsesStream.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +1 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +192 -0
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +1 -0
- package/dist/src/providers/openai/parseResponsesStream.test.d.ts +1 -0
- package/dist/src/providers/openai/parseResponsesStream.test.js +151 -0
- package/dist/src/providers/openai/parseResponsesStream.test.js.map +1 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.d.ts +19 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js +37 -0
- package/dist/src/providers/tokenizers/AnthropicTokenizer.js.map +1 -0
- package/dist/src/providers/tokenizers/ITokenizer.d.ts +18 -0
- package/dist/src/providers/tokenizers/ITokenizer.js +17 -0
- package/dist/src/providers/tokenizers/ITokenizer.js.map +1 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +24 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js +56 -0
- package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -0
- package/dist/src/providers/types/IProviderConfig.d.ts +102 -0
- package/dist/src/providers/types/IProviderConfig.js +17 -0
- package/dist/src/providers/types/IProviderConfig.js.map +1 -0
- package/dist/src/providers/types.d.ts +4 -69
- package/dist/src/services/ideContext.d.ts +2 -0
- package/dist/src/services/ideContext.js +8 -0
- package/dist/src/services/ideContext.js.map +1 -1
- package/dist/src/services/ideContext.test.js +10 -0
- package/dist/src/services/ideContext.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +17 -1
- package/dist/src/services/loopDetectionService.js +117 -2
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +109 -2
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/sdk.js +0 -2
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +2 -1
- package/dist/src/telemetry/types.js +1 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
- package/dist/src/telemetry/uiTelemetry.js +7 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +92 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/IToolFormatter.d.ts +40 -0
- package/dist/src/tools/IToolFormatter.js +17 -0
- package/dist/src/tools/IToolFormatter.js.map +1 -0
- package/dist/src/tools/ToolFormatter.d.ts +45 -0
- package/dist/src/tools/ToolFormatter.js +216 -0
- package/dist/src/tools/ToolFormatter.js.map +1 -0
- package/dist/src/tools/ToolFormatter.test.d.ts +16 -0
- package/dist/src/tools/ToolFormatter.test.js +349 -0
- package/dist/src/tools/ToolFormatter.test.js.map +1 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +1 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +241 -0
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +7 -1
- package/dist/src/tools/edit.js +19 -7
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/glob.js +2 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.js +2 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +0 -2
- package/dist/src/tools/mcp-client.js +8 -20
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +1 -72
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +11 -5
- package/dist/src/tools/mcp-tool.js +33 -9
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +40 -24
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.js +2 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -1
- package/dist/src/tools/read-file.js +5 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.js +2 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/shell.js +2 -2
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/todo-read.js +2 -2
- package/dist/src/tools/todo-read.js.map +1 -1
- package/dist/src/tools/todo-write.js +2 -2
- package/dist/src/tools/todo-write.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +0 -1
- package/dist/src/tools/tool-registry.js +11 -8
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +36 -10
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +37 -2
- package/dist/src/tools/tools.js +25 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.integration.test.d.ts +6 -0
- package/dist/src/tools/web-fetch.integration.test.js +532 -0
- package/dist/src/tools/web-fetch.integration.test.js.map +1 -0
- package/dist/src/tools/web-fetch.js +57 -50
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-search.js +34 -6
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +229 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.js +12 -5
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/utils/browser.d.ts +13 -0
- package/dist/src/utils/browser.js +49 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/errors.js +4 -4
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +5 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +0 -2
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +6 -0
- package/dist/src/utils/retry.js +1 -1
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/user_account.js +6 -1
- package/dist/src/utils/user_account.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -3
- package/dist/src/tools/web-fetch.test.js +0 -70
- package/dist/src/tools/web-fetch.test.js.map +0 -1
- package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
- /package/dist/src/{tools/web-fetch.test.d.ts → mcp/oauth-provider.test.d.ts} +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
7
|
+
/**
|
|
8
|
+
* Utility class for common OAuth operations.
|
|
9
|
+
*/
|
|
10
|
+
export class OAuthUtils {
|
|
11
|
+
/**
|
|
12
|
+
* Construct well-known OAuth endpoint URLs.
|
|
13
|
+
*/
|
|
14
|
+
static buildWellKnownUrls(baseUrl) {
|
|
15
|
+
const serverUrl = new URL(baseUrl);
|
|
16
|
+
const base = `${serverUrl.protocol}//${serverUrl.host}`;
|
|
17
|
+
return {
|
|
18
|
+
protectedResource: new URL('/.well-known/oauth-protected-resource', base).toString(),
|
|
19
|
+
authorizationServer: new URL('/.well-known/oauth-authorization-server', base).toString(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fetch OAuth protected resource metadata.
|
|
24
|
+
*
|
|
25
|
+
* @param resourceMetadataUrl The protected resource metadata URL
|
|
26
|
+
* @returns The protected resource metadata or null if not available
|
|
27
|
+
*/
|
|
28
|
+
static async fetchProtectedResourceMetadata(resourceMetadataUrl) {
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(resourceMetadataUrl);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return (await response.json());
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.debug(`Failed to fetch protected resource metadata from ${resourceMetadataUrl}: ${getErrorMessage(error)}`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fetch OAuth authorization server metadata.
|
|
43
|
+
*
|
|
44
|
+
* @param authServerMetadataUrl The authorization server metadata URL
|
|
45
|
+
* @returns The authorization server metadata or null if not available
|
|
46
|
+
*/
|
|
47
|
+
static async fetchAuthorizationServerMetadata(authServerMetadataUrl) {
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(authServerMetadataUrl);
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return (await response.json());
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.debug(`Failed to fetch authorization server metadata from ${authServerMetadataUrl}: ${getErrorMessage(error)}`);
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Convert authorization server metadata to OAuth configuration.
|
|
62
|
+
*
|
|
63
|
+
* @param metadata The authorization server metadata
|
|
64
|
+
* @returns The OAuth configuration
|
|
65
|
+
*/
|
|
66
|
+
static metadataToOAuthConfig(metadata) {
|
|
67
|
+
return {
|
|
68
|
+
authorizationUrl: metadata.authorization_endpoint,
|
|
69
|
+
tokenUrl: metadata.token_endpoint,
|
|
70
|
+
scopes: metadata.scopes_supported || [],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Discover OAuth configuration using the standard well-known endpoints.
|
|
75
|
+
*
|
|
76
|
+
* @param serverUrl The base URL of the server
|
|
77
|
+
* @returns The discovered OAuth configuration or null if not available
|
|
78
|
+
*/
|
|
79
|
+
static async discoverOAuthConfig(serverUrl) {
|
|
80
|
+
try {
|
|
81
|
+
const wellKnownUrls = this.buildWellKnownUrls(serverUrl);
|
|
82
|
+
// First, try to get the protected resource metadata
|
|
83
|
+
const resourceMetadata = await this.fetchProtectedResourceMetadata(wellKnownUrls.protectedResource);
|
|
84
|
+
if (resourceMetadata?.authorization_servers?.length) {
|
|
85
|
+
// Use the first authorization server
|
|
86
|
+
const authServerUrl = resourceMetadata.authorization_servers[0];
|
|
87
|
+
const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
|
|
88
|
+
const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
|
|
89
|
+
if (authServerMetadata) {
|
|
90
|
+
const config = this.metadataToOAuthConfig(authServerMetadata);
|
|
91
|
+
if (authServerMetadata.registration_endpoint) {
|
|
92
|
+
console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
|
|
93
|
+
}
|
|
94
|
+
return config;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Fallback: try /.well-known/oauth-authorization-server at the base URL
|
|
98
|
+
console.debug(`Trying OAuth discovery fallback at ${wellKnownUrls.authorizationServer}`);
|
|
99
|
+
const authServerMetadata = await this.fetchAuthorizationServerMetadata(wellKnownUrls.authorizationServer);
|
|
100
|
+
if (authServerMetadata) {
|
|
101
|
+
const config = this.metadataToOAuthConfig(authServerMetadata);
|
|
102
|
+
if (authServerMetadata.registration_endpoint) {
|
|
103
|
+
console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
|
|
104
|
+
}
|
|
105
|
+
return config;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.debug(`Failed to discover OAuth configuration: ${getErrorMessage(error)}`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parse WWW-Authenticate header to extract OAuth information.
|
|
116
|
+
*
|
|
117
|
+
* @param header The WWW-Authenticate header value
|
|
118
|
+
* @returns The resource metadata URI if found
|
|
119
|
+
*/
|
|
120
|
+
static parseWWWAuthenticateHeader(header) {
|
|
121
|
+
// Parse Bearer realm and resource_metadata_uri
|
|
122
|
+
const match = header.match(/resource_metadata_uri="([^"]+)"/);
|
|
123
|
+
if (match) {
|
|
124
|
+
return match[1];
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Discover OAuth configuration from WWW-Authenticate header.
|
|
130
|
+
*
|
|
131
|
+
* @param wwwAuthenticate The WWW-Authenticate header value
|
|
132
|
+
* @returns The discovered OAuth configuration or null if not available
|
|
133
|
+
*/
|
|
134
|
+
static async discoverOAuthFromWWWAuthenticate(wwwAuthenticate) {
|
|
135
|
+
const resourceMetadataUri = this.parseWWWAuthenticateHeader(wwwAuthenticate);
|
|
136
|
+
if (!resourceMetadataUri) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
console.log(`Found resource metadata URI from www-authenticate header: ${resourceMetadataUri}`);
|
|
140
|
+
const resourceMetadata = await this.fetchProtectedResourceMetadata(resourceMetadataUri);
|
|
141
|
+
if (!resourceMetadata?.authorization_servers?.length) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const authServerUrl = resourceMetadata.authorization_servers[0];
|
|
145
|
+
const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
|
|
146
|
+
const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
|
|
147
|
+
if (authServerMetadata) {
|
|
148
|
+
console.log('OAuth configuration discovered successfully from www-authenticate header');
|
|
149
|
+
return this.metadataToOAuthConfig(authServerMetadata);
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Extract base URL from an MCP server URL.
|
|
155
|
+
*
|
|
156
|
+
* @param mcpServerUrl The MCP server URL
|
|
157
|
+
* @returns The base URL
|
|
158
|
+
*/
|
|
159
|
+
static extractBaseUrl(mcpServerUrl) {
|
|
160
|
+
const serverUrl = new URL(mcpServerUrl);
|
|
161
|
+
return `${serverUrl.protocol}//${serverUrl.host}`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if a URL is an SSE endpoint.
|
|
165
|
+
*
|
|
166
|
+
* @param url The URL to check
|
|
167
|
+
* @returns True if the URL appears to be an SSE endpoint
|
|
168
|
+
*/
|
|
169
|
+
static isSSEEndpoint(url) {
|
|
170
|
+
return url.includes('/sse') || !url.includes('/mcp');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Build a resource parameter for OAuth requests.
|
|
174
|
+
*
|
|
175
|
+
* @param endpointUrl The endpoint URL
|
|
176
|
+
* @returns The resource parameter value
|
|
177
|
+
*/
|
|
178
|
+
static buildResourceParameter(endpointUrl) {
|
|
179
|
+
const url = new URL(endpointUrl);
|
|
180
|
+
return `${url.protocol}//${url.host}`;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=oauth-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { OAuthUtils, } from './oauth-utils.js';
|
|
8
|
+
// Mock fetch globally
|
|
9
|
+
const mockFetch = vi.fn();
|
|
10
|
+
global.fetch = mockFetch;
|
|
11
|
+
describe('OAuthUtils', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.clearAllMocks();
|
|
14
|
+
vi.spyOn(console, 'debug').mockImplementation(() => { });
|
|
15
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
16
|
+
vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
vi.restoreAllMocks();
|
|
20
|
+
});
|
|
21
|
+
describe('buildWellKnownUrls', () => {
|
|
22
|
+
it('should build correct well-known URLs', () => {
|
|
23
|
+
const urls = OAuthUtils.buildWellKnownUrls('https://example.com/path');
|
|
24
|
+
expect(urls.protectedResource).toBe('https://example.com/.well-known/oauth-protected-resource');
|
|
25
|
+
expect(urls.authorizationServer).toBe('https://example.com/.well-known/oauth-authorization-server');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('fetchProtectedResourceMetadata', () => {
|
|
29
|
+
const mockResourceMetadata = {
|
|
30
|
+
resource: 'https://api.example.com',
|
|
31
|
+
authorization_servers: ['https://auth.example.com'],
|
|
32
|
+
bearer_methods_supported: ['header'],
|
|
33
|
+
};
|
|
34
|
+
it('should fetch protected resource metadata successfully', async () => {
|
|
35
|
+
mockFetch.mockResolvedValueOnce({
|
|
36
|
+
ok: true,
|
|
37
|
+
json: () => Promise.resolve(mockResourceMetadata),
|
|
38
|
+
});
|
|
39
|
+
const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
|
|
40
|
+
expect(result).toEqual(mockResourceMetadata);
|
|
41
|
+
});
|
|
42
|
+
it('should return null when fetch fails', async () => {
|
|
43
|
+
mockFetch.mockResolvedValueOnce({
|
|
44
|
+
ok: false,
|
|
45
|
+
});
|
|
46
|
+
const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
|
|
47
|
+
expect(result).toBeNull();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('fetchAuthorizationServerMetadata', () => {
|
|
51
|
+
const mockAuthServerMetadata = {
|
|
52
|
+
issuer: 'https://auth.example.com',
|
|
53
|
+
authorization_endpoint: 'https://auth.example.com/authorize',
|
|
54
|
+
token_endpoint: 'https://auth.example.com/token',
|
|
55
|
+
scopes_supported: ['read', 'write'],
|
|
56
|
+
};
|
|
57
|
+
it('should fetch authorization server metadata successfully', async () => {
|
|
58
|
+
mockFetch.mockResolvedValueOnce({
|
|
59
|
+
ok: true,
|
|
60
|
+
json: () => Promise.resolve(mockAuthServerMetadata),
|
|
61
|
+
});
|
|
62
|
+
const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
|
|
63
|
+
expect(result).toEqual(mockAuthServerMetadata);
|
|
64
|
+
});
|
|
65
|
+
it('should return null when fetch fails', async () => {
|
|
66
|
+
mockFetch.mockResolvedValueOnce({
|
|
67
|
+
ok: false,
|
|
68
|
+
});
|
|
69
|
+
const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
|
|
70
|
+
expect(result).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('metadataToOAuthConfig', () => {
|
|
74
|
+
it('should convert metadata to OAuth config', () => {
|
|
75
|
+
const metadata = {
|
|
76
|
+
issuer: 'https://auth.example.com',
|
|
77
|
+
authorization_endpoint: 'https://auth.example.com/authorize',
|
|
78
|
+
token_endpoint: 'https://auth.example.com/token',
|
|
79
|
+
scopes_supported: ['read', 'write'],
|
|
80
|
+
};
|
|
81
|
+
const config = OAuthUtils.metadataToOAuthConfig(metadata);
|
|
82
|
+
expect(config).toEqual({
|
|
83
|
+
authorizationUrl: 'https://auth.example.com/authorize',
|
|
84
|
+
tokenUrl: 'https://auth.example.com/token',
|
|
85
|
+
scopes: ['read', 'write'],
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it('should handle empty scopes', () => {
|
|
89
|
+
const metadata = {
|
|
90
|
+
issuer: 'https://auth.example.com',
|
|
91
|
+
authorization_endpoint: 'https://auth.example.com/authorize',
|
|
92
|
+
token_endpoint: 'https://auth.example.com/token',
|
|
93
|
+
};
|
|
94
|
+
const config = OAuthUtils.metadataToOAuthConfig(metadata);
|
|
95
|
+
expect(config.scopes).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('parseWWWAuthenticateHeader', () => {
|
|
99
|
+
it('should parse resource metadata URI from WWW-Authenticate header', () => {
|
|
100
|
+
const header = 'Bearer realm="example", resource_metadata_uri="https://example.com/.well-known/oauth-protected-resource"';
|
|
101
|
+
const result = OAuthUtils.parseWWWAuthenticateHeader(header);
|
|
102
|
+
expect(result).toBe('https://example.com/.well-known/oauth-protected-resource');
|
|
103
|
+
});
|
|
104
|
+
it('should return null when no resource metadata URI is found', () => {
|
|
105
|
+
const header = 'Bearer realm="example"';
|
|
106
|
+
const result = OAuthUtils.parseWWWAuthenticateHeader(header);
|
|
107
|
+
expect(result).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('extractBaseUrl', () => {
|
|
111
|
+
it('should extract base URL from MCP server URL', () => {
|
|
112
|
+
const result = OAuthUtils.extractBaseUrl('https://example.com/mcp/v1');
|
|
113
|
+
expect(result).toBe('https://example.com');
|
|
114
|
+
});
|
|
115
|
+
it('should handle URLs with ports', () => {
|
|
116
|
+
const result = OAuthUtils.extractBaseUrl('https://example.com:8080/mcp/v1');
|
|
117
|
+
expect(result).toBe('https://example.com:8080');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('isSSEEndpoint', () => {
|
|
121
|
+
it('should return true for SSE endpoints', () => {
|
|
122
|
+
expect(OAuthUtils.isSSEEndpoint('https://example.com/sse')).toBe(true);
|
|
123
|
+
expect(OAuthUtils.isSSEEndpoint('https://example.com/api/v1/sse')).toBe(true);
|
|
124
|
+
});
|
|
125
|
+
it('should return true for non-MCP endpoints', () => {
|
|
126
|
+
expect(OAuthUtils.isSSEEndpoint('https://example.com/api')).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it('should return false for MCP endpoints', () => {
|
|
129
|
+
expect(OAuthUtils.isSSEEndpoint('https://example.com/mcp')).toBe(false);
|
|
130
|
+
expect(OAuthUtils.isSSEEndpoint('https://example.com/api/mcp/v1')).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('buildResourceParameter', () => {
|
|
134
|
+
it('should build resource parameter from endpoint URL', () => {
|
|
135
|
+
const result = OAuthUtils.buildResourceParameter('https://example.com/oauth/token');
|
|
136
|
+
expect(result).toBe('https://example.com');
|
|
137
|
+
});
|
|
138
|
+
it('should handle URLs with ports', () => {
|
|
139
|
+
const result = OAuthUtils.buildResourceParameter('https://example.com:8080/oauth/token');
|
|
140
|
+
expect(result).toBe('https://example.com:8080');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=oauth-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-utils.test.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export interface TextToolCall {
|
|
17
|
+
name: string;
|
|
18
|
+
arguments: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export interface ITextToolCallParser {
|
|
21
|
+
parse(content: string): {
|
|
22
|
+
cleanedContent: string;
|
|
23
|
+
toolCalls: TextToolCall[];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare class GemmaToolCallParser implements ITextToolCallParser {
|
|
27
|
+
private readonly patterns;
|
|
28
|
+
parse(content: string): {
|
|
29
|
+
cleanedContent: string;
|
|
30
|
+
toolCalls: TextToolCall[];
|
|
31
|
+
};
|
|
32
|
+
private parseKeyValuePairs;
|
|
33
|
+
private parseXMLParameters;
|
|
34
|
+
private parseValue;
|
|
35
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2025 Vybestack LLC
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export class GemmaToolCallParser {
|
|
17
|
+
// Support multiple tool call formats
|
|
18
|
+
patterns = [
|
|
19
|
+
// Format 1: [TOOL_REQUEST] toolName {args} [TOOL_REQUEST_END]
|
|
20
|
+
/\[TOOL_REQUEST\]\s*(\w+)\s+({.*?})\s*\[TOOL_REQUEST_END\]/gs,
|
|
21
|
+
// Format 2: ✦ tool_call: toolName for key value pairs (more specific to avoid false positives)
|
|
22
|
+
/✦\s*tool_call:\s*(\w+)\s+for\s+(.+?)(?=\n|✦|$)/gs,
|
|
23
|
+
// Format 3: JSON object with name/arguments followed by [END_TOOL_REQUEST]
|
|
24
|
+
/(\d+\s+)?{"name":\s*"(\w+)",\s*"arguments":\s*({.*?})}\s*(?:\n\s*\d+\s+)?\[END_TOOL_REQUEST\]/gs,
|
|
25
|
+
// Format 4: Hermes format with <tool_call> tags
|
|
26
|
+
/<tool_call>\s*({.*?"name":\s*"(\w+)".*?})\s*<\/tool_call>/gs,
|
|
27
|
+
// Format 5: XML with <invoke> tags (Claude-style)
|
|
28
|
+
/<invoke\s+name="(\w+)">(.*?)<\/invoke>/gs,
|
|
29
|
+
// Format 6: Generic XML tool format
|
|
30
|
+
/<tool>\s*<name>(\w+)<\/name>\s*<arguments>(.*?)<\/arguments>\s*<\/tool>/gs,
|
|
31
|
+
];
|
|
32
|
+
parse(content) {
|
|
33
|
+
const toolCalls = [];
|
|
34
|
+
let cleanedContent = content;
|
|
35
|
+
const matches = [];
|
|
36
|
+
// Quick check: if content doesn't contain any tool call markers, return early
|
|
37
|
+
if (!content.includes('[TOOL_REQUEST') &&
|
|
38
|
+
!content.includes('tool_call:') &&
|
|
39
|
+
!content.includes('[END_TOOL_REQUEST]') &&
|
|
40
|
+
!content.includes('{"name":') &&
|
|
41
|
+
!content.includes('<tool_call>') &&
|
|
42
|
+
!content.includes('<invoke') &&
|
|
43
|
+
!content.includes('<tool>')) {
|
|
44
|
+
return { cleanedContent: content, toolCalls: [] };
|
|
45
|
+
}
|
|
46
|
+
// Try each pattern
|
|
47
|
+
for (const pattern of this.patterns) {
|
|
48
|
+
let match;
|
|
49
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
50
|
+
if (pattern === this.patterns[1]) {
|
|
51
|
+
// Format 2: Parse key-value pairs from "for key value key2 value2" format
|
|
52
|
+
const [fullMatch, toolName, argsStr] = match;
|
|
53
|
+
const args = this.parseKeyValuePairs(argsStr);
|
|
54
|
+
matches.push({ fullMatch, toolName, args });
|
|
55
|
+
}
|
|
56
|
+
else if (pattern === this.patterns[2]) {
|
|
57
|
+
// Format 3: JSON object format {"name": "tool", "arguments": {...}}
|
|
58
|
+
const [fullMatch, , toolName, jsonArgs] = match;
|
|
59
|
+
matches.push({ fullMatch, toolName, args: jsonArgs });
|
|
60
|
+
}
|
|
61
|
+
else if (pattern === this.patterns[3]) {
|
|
62
|
+
// Format 4: Hermes format <tool_call>{"arguments": {...}, "name": "tool"}</tool_call>
|
|
63
|
+
const [fullMatch, hermesJson, toolName] = match;
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse(hermesJson);
|
|
66
|
+
matches.push({
|
|
67
|
+
fullMatch,
|
|
68
|
+
toolName,
|
|
69
|
+
args: JSON.stringify(parsed.arguments || {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error(`[GemmaToolCallParser] Failed to parse Hermes format: ${error}`);
|
|
74
|
+
// Still need to track the match to remove it from content
|
|
75
|
+
matches.push({ fullMatch, toolName: '', args: '' });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (pattern === this.patterns[4]) {
|
|
79
|
+
// Format 5: XML with <invoke> tags (Claude-style)
|
|
80
|
+
const [fullMatch, toolName, xmlContent] = match;
|
|
81
|
+
matches.push({ fullMatch, toolName, args: xmlContent });
|
|
82
|
+
}
|
|
83
|
+
else if (pattern === this.patterns[5]) {
|
|
84
|
+
// Format 6: Generic XML tool format
|
|
85
|
+
const [fullMatch, toolName, xmlArgs] = match;
|
|
86
|
+
matches.push({ fullMatch, toolName, args: xmlArgs });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Format 1: tool name followed by JSON arguments
|
|
90
|
+
const [fullMatch, toolName, jsonArgs] = match;
|
|
91
|
+
matches.push({ fullMatch, toolName, args: jsonArgs });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Reset the regex state for next use
|
|
95
|
+
pattern.lastIndex = 0;
|
|
96
|
+
}
|
|
97
|
+
// Process each match
|
|
98
|
+
for (const { fullMatch, toolName, args } of matches) {
|
|
99
|
+
// Remove the tool call pattern from the content regardless of parsing success so markers are always stripped
|
|
100
|
+
cleanedContent = cleanedContent.replace(fullMatch, '');
|
|
101
|
+
// Skip if toolName is empty (failed parsing)
|
|
102
|
+
if (!toolName) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
let parsedArgs;
|
|
107
|
+
if (typeof args === 'string') {
|
|
108
|
+
// Check if it's XML content (Claude-style or generic)
|
|
109
|
+
if (args.includes('<parameter') ||
|
|
110
|
+
(args.includes('<') && args.includes('>'))) {
|
|
111
|
+
parsedArgs = this.parseXMLParameters(args);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// Handle JSON string arguments
|
|
115
|
+
parsedArgs = JSON.parse(args);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Already parsed (from key-value format)
|
|
120
|
+
parsedArgs = args;
|
|
121
|
+
}
|
|
122
|
+
toolCalls.push({
|
|
123
|
+
name: toolName,
|
|
124
|
+
arguments: parsedArgs,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (typeof args === 'string') {
|
|
129
|
+
// Try to extract a simpler JSON pattern if the full match fails
|
|
130
|
+
const simpleJsonMatch = args.match(/^{[^{]*}$/);
|
|
131
|
+
if (simpleJsonMatch) {
|
|
132
|
+
try {
|
|
133
|
+
const parsedArgs = JSON.parse(simpleJsonMatch[0]);
|
|
134
|
+
toolCalls.push({
|
|
135
|
+
name: toolName,
|
|
136
|
+
arguments: parsedArgs,
|
|
137
|
+
});
|
|
138
|
+
cleanedContent = cleanedContent.replace(fullMatch, '');
|
|
139
|
+
}
|
|
140
|
+
catch (_secondError) {
|
|
141
|
+
console.error(`[GemmaToolCallParser] Failed to parse tool arguments for ${toolName}:`, error);
|
|
142
|
+
console.error(`[GemmaToolCallParser] Raw arguments: ${args}`);
|
|
143
|
+
// Keep the original text if we can't parse it
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.error(`[GemmaToolCallParser] Failed to parse tool arguments for ${toolName}:`, error);
|
|
148
|
+
console.error(`[GemmaToolCallParser] Raw arguments: ${args}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Clean up any extra whitespace and stray markers that were not matched (best effort)
|
|
154
|
+
cleanedContent = cleanedContent
|
|
155
|
+
.replace(/\[TOOL_REQUEST(?:_END)?]/g, '')
|
|
156
|
+
.replace(/<\|im_start\|>assistant/g, '')
|
|
157
|
+
.replace(/<\|im_end\|>/g, '')
|
|
158
|
+
.replace(/<tool_call>[\s\S]*?<\/tool_call>/g, '') // Remove any remaining tool_call tags
|
|
159
|
+
.replace(/<function_calls>[\s\S]*?<\/function_calls>/g, '') // Remove function_calls wrapper
|
|
160
|
+
.replace(/<invoke[\s\S]*?<\/invoke>/g, '') // Remove any remaining invoke tags
|
|
161
|
+
.replace(/<tool>[\s\S]*?<\/tool>/g, '') // Remove any remaining tool tags
|
|
162
|
+
// .replace(/<think>[\s\S]*?<\/think>/g, '') // Keep think tags visible by default
|
|
163
|
+
.replace(/<tool_call>\s*\{[^}]*$/gm, '') // Remove incomplete tool calls
|
|
164
|
+
.replace(/\{"name"\s*:\s*"[^"]*"\s*,?\s*"arguments"\s*:\s*\{[^}]*$/gm, '') // Remove incomplete JSON tool calls
|
|
165
|
+
.replace(/✦\s*<think>/g, '') // Remove ✦ symbol followed by think tag
|
|
166
|
+
.replace(/\s+/g, ' ')
|
|
167
|
+
.trim();
|
|
168
|
+
return {
|
|
169
|
+
cleanedContent,
|
|
170
|
+
toolCalls,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
parseKeyValuePairs(str) {
|
|
174
|
+
const args = {};
|
|
175
|
+
// Parse "key value key2 value2" format
|
|
176
|
+
// Example: "path /Users/acoliver/projects/gemini-code/gemini-cli/docs"
|
|
177
|
+
const parts = str.trim().split(/\s+/);
|
|
178
|
+
for (let i = 0; i < parts.length; i += 2) {
|
|
179
|
+
if (i + 1 < parts.length) {
|
|
180
|
+
const key = parts[i];
|
|
181
|
+
let value = parts[i + 1];
|
|
182
|
+
// Handle quoted strings that might contain spaces
|
|
183
|
+
if (value.startsWith('"') || value.startsWith("'")) {
|
|
184
|
+
const quote = value[0];
|
|
185
|
+
let endIndex = i + 1;
|
|
186
|
+
// Find the closing quote
|
|
187
|
+
while (endIndex < parts.length && !parts[endIndex].endsWith(quote)) {
|
|
188
|
+
endIndex++;
|
|
189
|
+
}
|
|
190
|
+
if (endIndex < parts.length) {
|
|
191
|
+
value = parts.slice(i + 1, endIndex + 1).join(' ');
|
|
192
|
+
value = value.slice(1, -1); // Remove quotes
|
|
193
|
+
i = endIndex - 1; // Adjust loop counter
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Try to parse as number or boolean
|
|
197
|
+
if (!isNaN(Number(value))) {
|
|
198
|
+
args[key] = Number(value);
|
|
199
|
+
}
|
|
200
|
+
else if (value === 'true' || value === 'false') {
|
|
201
|
+
args[key] = value === 'true';
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
args[key] = value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return args;
|
|
209
|
+
}
|
|
210
|
+
parseXMLParameters(xmlContent) {
|
|
211
|
+
const args = {};
|
|
212
|
+
// Parse Claude-style <parameter name="key">value</parameter>
|
|
213
|
+
const parameterPattern = /<parameter\s+name="([^"]+)">([^<]*)<\/parameter>/g;
|
|
214
|
+
let match;
|
|
215
|
+
while ((match = parameterPattern.exec(xmlContent)) !== null) {
|
|
216
|
+
const [, key, value] = match;
|
|
217
|
+
args[key] = this.parseValue(value.trim());
|
|
218
|
+
}
|
|
219
|
+
// If no parameter tags found, try generic XML <key>value</key>
|
|
220
|
+
if (Object.keys(args).length === 0) {
|
|
221
|
+
// Match any XML tag pair
|
|
222
|
+
const genericPattern = /<(\w+)>([^<]*)<\/\1>/g;
|
|
223
|
+
while ((match = genericPattern.exec(xmlContent)) !== null) {
|
|
224
|
+
const [, key, value] = match;
|
|
225
|
+
args[key] = this.parseValue(value.trim());
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return args;
|
|
229
|
+
}
|
|
230
|
+
parseValue(value) {
|
|
231
|
+
// Try to parse as number
|
|
232
|
+
if (!isNaN(Number(value)) && value !== '') {
|
|
233
|
+
return Number(value);
|
|
234
|
+
}
|
|
235
|
+
// Try to parse as boolean
|
|
236
|
+
if (value === 'true' || value === 'false') {
|
|
237
|
+
return value === 'true';
|
|
238
|
+
}
|
|
239
|
+
// Handle HTML entities
|
|
240
|
+
return value
|
|
241
|
+
.replace(/</g, '<')
|
|
242
|
+
.replace(/>/g, '>')
|
|
243
|
+
.replace(/&/g, '&')
|
|
244
|
+
.replace(/"/g, '"')
|
|
245
|
+
.replace(/'/g, "'");
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=TextToolCallParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextToolCallParser.js","sourceRoot":"","sources":["../../../src/parsers/TextToolCallParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,OAAO,mBAAmB;IAC9B,qCAAqC;IACpB,QAAQ,GAAG;QAC1B,8DAA8D;QAC9D,6DAA6D;QAC7D,+FAA+F;QAC/F,kDAAkD;QAClD,2EAA2E;QAC3E,iGAAiG;QACjG,gDAAgD;QAChD,6DAA6D;QAC7D,kDAAkD;QAClD,0CAA0C;QAC1C,oCAAoC;QACpC,2EAA2E;KAC5E,CAAC;IAEF,KAAK,CAAC,OAAe;QAInB,MAAM,SAAS,GAAmB,EAAE,CAAC;QACrC,IAAI,cAAc,GAAG,OAAO,CAAC;QAC7B,MAAM,OAAO,GAIR,EAAE,CAAC;QAER,8EAA8E;QAC9E,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YAClC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/B,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACvC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7B,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAChC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;YACD,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACpD,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjC,0EAA0E;oBAC1E,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;oBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,CAAC;qBAAM,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,oEAAoE;oBACpE,MAAM,CAAC,SAAS,EAAE,AAAD,EAAG,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,CAAC;qBAAM,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,sFAAsF;oBACtF,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;oBAChD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACtC,OAAO,CAAC,IAAI,CAAC;4BACX,SAAS;4BACT,QAAQ;4BACR,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;yBAC7C,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CACX,wDAAwD,KAAK,EAAE,CAChE,CAAC;wBACF,0DAA0D;wBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;qBAAM,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,kDAAkD;oBAClD,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC1D,CAAC;qBAAM,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,oCAAoC;oBACpC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,iDAAiD;oBACjD,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;oBAC9C,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YACD,qCAAqC;YACrC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACpD,6GAA6G;YAC7G,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAEvD,6CAA6C;YAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,UAAmC,CAAC;gBAExC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,sDAAsD;oBACtD,IACE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;wBAC3B,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC;wBACD,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC7C,CAAC;yBAAM,CAAC;wBACN,+BAA+B;wBAC/B,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,yCAAyC;oBACzC,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;gBAED,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,UAAU;iBACtB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,gEAAgE;oBAChE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAChD,IAAI,eAAe,EAAE,CAAC;wBACpB,IAAI,CAAC;4BACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;4BAClD,SAAS,CAAC,IAAI,CAAC;gCACb,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,UAAU;6BACtB,CAAC,CAAC;4BACH,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;wBACzD,CAAC;wBAAC,OAAO,YAAY,EAAE,CAAC;4BACtB,OAAO,CAAC,KAAK,CACX,4DAA4D,QAAQ,GAAG,EACvE,KAAK,CACN,CAAC;4BACF,OAAO,CAAC,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;4BAC9D,8CAA8C;wBAChD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CACX,4DAA4D,QAAQ,GAAG,EACvE,KAAK,CACN,CAAC;wBACF,OAAO,CAAC,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;oBAChE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,sFAAsF;QACtF,cAAc,GAAG,cAAc;aAC5B,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;aACxC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;aACvC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC,sCAAsC;aACvF,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC,gCAAgC;aAC3F,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC,mCAAmC;aAC7E,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,iCAAiC;YACzE,kFAAkF;aACjF,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,+BAA+B;aACvE,OAAO,CAAC,4DAA4D,EAAE,EAAE,CAAC,CAAC,oCAAoC;aAC9G,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,wCAAwC;aACpE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,IAAI,EAAE,CAAC;QAEV,OAAO;YACL,cAAc;YACd,SAAS;SACV,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,GAAW;QACpC,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,uCAAuC;QACvC,uEAAuE;QACvE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,KAAK,GAA8B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEpD,kDAAkD;gBAClD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;oBAErB,yBAAyB;oBACzB,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnE,QAAQ,EAAE,CAAC;oBACb,CAAC;oBAED,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC5B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACnD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;wBAC5C,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,sBAAsB;oBAC1C,CAAC;gBACH,CAAC;gBAED,oCAAoC;gBACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;oBACjD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,UAAkB;QAC3C,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,6DAA6D;QAC7D,MAAM,gBAAgB,GACpB,mDAAmD,CAAC;QACtD,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,+DAA+D;QAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,yBAAyB;YACzB,MAAM,cAAc,GAAG,uBAAuB,CAAC;YAC/C,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1D,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,yBAAyB;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,0BAA0B;QAC1B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC1C,OAAO,KAAK,KAAK,MAAM,CAAC;QAC1B,CAAC;QACD,uBAAuB;QACvB,OAAO,KAAK;aACT,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|