@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,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { WebFetchTool } from './web-fetch.js';
|
|
8
|
+
import * as fetchUtils from '../utils/fetch.js';
|
|
9
|
+
describe('WebFetchTool Integration Tests', () => {
|
|
10
|
+
let webFetchTool;
|
|
11
|
+
let mockConfig;
|
|
12
|
+
let mockAbortSignal;
|
|
13
|
+
let mockProviderManager;
|
|
14
|
+
let mockGeminiProvider;
|
|
15
|
+
let mockOpenAIProvider;
|
|
16
|
+
let mockAnthropicProvider;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
vi.clearAllMocks();
|
|
19
|
+
// Create mock providers
|
|
20
|
+
mockGeminiProvider = {
|
|
21
|
+
name: 'gemini',
|
|
22
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
23
|
+
generateChatCompletion: vi.fn(),
|
|
24
|
+
getServerTools: vi.fn().mockReturnValue(['web_fetch', 'web_search']),
|
|
25
|
+
invokeServerTool: vi.fn(),
|
|
26
|
+
};
|
|
27
|
+
mockOpenAIProvider = {
|
|
28
|
+
name: 'openai',
|
|
29
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
30
|
+
generateChatCompletion: vi.fn(),
|
|
31
|
+
getServerTools: vi.fn().mockReturnValue([]), // OpenAI doesn't have server tools
|
|
32
|
+
invokeServerTool: vi.fn(),
|
|
33
|
+
};
|
|
34
|
+
mockAnthropicProvider = {
|
|
35
|
+
name: 'anthropic',
|
|
36
|
+
getModels: vi.fn().mockResolvedValue([]),
|
|
37
|
+
generateChatCompletion: vi.fn(),
|
|
38
|
+
getServerTools: vi.fn().mockReturnValue([]), // Anthropic doesn't have server tools
|
|
39
|
+
invokeServerTool: vi.fn(),
|
|
40
|
+
};
|
|
41
|
+
// Create mock provider manager
|
|
42
|
+
mockProviderManager = {
|
|
43
|
+
registerProvider: vi.fn(),
|
|
44
|
+
setActiveProvider: vi.fn(),
|
|
45
|
+
clearActiveProvider: vi.fn(),
|
|
46
|
+
hasActiveProvider: vi.fn().mockReturnValue(true),
|
|
47
|
+
getActiveProvider: vi.fn().mockReturnValue(mockGeminiProvider),
|
|
48
|
+
getActiveProviderName: vi.fn().mockReturnValue('gemini'),
|
|
49
|
+
getAvailableModels: vi.fn().mockResolvedValue([]),
|
|
50
|
+
listProviders: vi.fn().mockReturnValue(['gemini', 'openai', 'anthropic']),
|
|
51
|
+
getServerToolsProvider: vi.fn().mockReturnValue(mockGeminiProvider),
|
|
52
|
+
setServerToolsProvider: vi.fn(),
|
|
53
|
+
};
|
|
54
|
+
// Create mock config with provider manager
|
|
55
|
+
mockConfig = {
|
|
56
|
+
getContentGeneratorConfig: vi.fn().mockReturnValue({
|
|
57
|
+
providerManager: mockProviderManager,
|
|
58
|
+
}),
|
|
59
|
+
getApprovalMode: vi.fn().mockReturnValue('auto_edit'),
|
|
60
|
+
setApprovalMode: vi.fn(),
|
|
61
|
+
getProxy: vi.fn().mockReturnValue(null),
|
|
62
|
+
};
|
|
63
|
+
webFetchTool = new WebFetchTool(mockConfig);
|
|
64
|
+
mockAbortSignal = new AbortController().signal;
|
|
65
|
+
});
|
|
66
|
+
describe('Web-fetch with Gemini as active provider', () => {
|
|
67
|
+
it('should successfully fetch content when Gemini is active', async () => {
|
|
68
|
+
// Mock successful web fetch response
|
|
69
|
+
const mockResponse = {
|
|
70
|
+
candidates: [
|
|
71
|
+
{
|
|
72
|
+
content: {
|
|
73
|
+
parts: [{ text: 'This is the fetched content from example.com' }],
|
|
74
|
+
role: 'model',
|
|
75
|
+
},
|
|
76
|
+
urlContextMetadata: {
|
|
77
|
+
urlMetadata: [
|
|
78
|
+
{
|
|
79
|
+
retrievedUrl: 'https://example.com',
|
|
80
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
groundingMetadata: {
|
|
85
|
+
groundingChunks: [
|
|
86
|
+
{
|
|
87
|
+
web: {
|
|
88
|
+
title: 'Example Page',
|
|
89
|
+
uri: 'https://example.com',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
98
|
+
const result = await webFetchTool.execute({ prompt: 'Summarize the content from https://example.com' }, mockAbortSignal);
|
|
99
|
+
expect(mockGeminiProvider.invokeServerTool).toHaveBeenCalledWith('web_fetch', { prompt: 'Summarize the content from https://example.com' }, { signal: mockAbortSignal });
|
|
100
|
+
expect(result.llmContent).toContain('This is the fetched content from example.com');
|
|
101
|
+
expect(result.llmContent).toContain('Sources:');
|
|
102
|
+
expect(result.llmContent).toContain('[1] Example Page (https://example.com)');
|
|
103
|
+
expect(result.returnDisplay).toBe('Content processed from prompt.');
|
|
104
|
+
});
|
|
105
|
+
it('should handle multiple URLs in prompt', async () => {
|
|
106
|
+
const mockResponse = {
|
|
107
|
+
candidates: [
|
|
108
|
+
{
|
|
109
|
+
content: {
|
|
110
|
+
parts: [{ text: 'Summary of both pages' }],
|
|
111
|
+
role: 'model',
|
|
112
|
+
},
|
|
113
|
+
urlContextMetadata: {
|
|
114
|
+
urlMetadata: [
|
|
115
|
+
{
|
|
116
|
+
retrievedUrl: 'https://example1.com',
|
|
117
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
retrievedUrl: 'https://example2.com',
|
|
121
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
129
|
+
const result = await webFetchTool.execute({ prompt: 'Compare https://example1.com and https://example2.com' }, mockAbortSignal);
|
|
130
|
+
expect(result.llmContent).toContain('Summary of both pages');
|
|
131
|
+
expect(result.returnDisplay).toBe('Content processed from prompt.');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('Web-fetch with OpenAI as active provider', () => {
|
|
135
|
+
beforeEach(() => {
|
|
136
|
+
// Set OpenAI as active provider, but Gemini remains server tools provider
|
|
137
|
+
mockProviderManager.getActiveProvider.mockReturnValue(mockOpenAIProvider);
|
|
138
|
+
mockProviderManager.getActiveProviderName.mockReturnValue('openai');
|
|
139
|
+
// Server tools provider should still be Gemini
|
|
140
|
+
mockProviderManager.getServerToolsProvider.mockReturnValue(mockGeminiProvider);
|
|
141
|
+
});
|
|
142
|
+
it('should use Gemini for web-fetch even when OpenAI is active', async () => {
|
|
143
|
+
const mockResponse = {
|
|
144
|
+
candidates: [
|
|
145
|
+
{
|
|
146
|
+
content: {
|
|
147
|
+
parts: [{ text: 'Content fetched via Gemini' }],
|
|
148
|
+
role: 'model',
|
|
149
|
+
},
|
|
150
|
+
urlContextMetadata: {
|
|
151
|
+
urlMetadata: [
|
|
152
|
+
{
|
|
153
|
+
retrievedUrl: 'https://example.com',
|
|
154
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
162
|
+
const result = await webFetchTool.execute({ prompt: 'Get content from https://example.com' }, mockAbortSignal);
|
|
163
|
+
// Should call Gemini's invokeServerTool, not OpenAI's
|
|
164
|
+
expect(mockGeminiProvider.invokeServerTool).toHaveBeenCalled();
|
|
165
|
+
expect(mockOpenAIProvider.invokeServerTool).not.toHaveBeenCalled();
|
|
166
|
+
expect(result.llmContent).toContain('Content fetched via Gemini');
|
|
167
|
+
expect(result.returnDisplay).toBe('Content processed from prompt.');
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('Web-fetch with Anthropic as active provider', () => {
|
|
171
|
+
beforeEach(() => {
|
|
172
|
+
// Set Anthropic as active provider, but Gemini remains server tools provider
|
|
173
|
+
mockProviderManager.getActiveProvider.mockReturnValue(mockAnthropicProvider);
|
|
174
|
+
mockProviderManager.getActiveProviderName.mockReturnValue('anthropic');
|
|
175
|
+
// Server tools provider should still be Gemini
|
|
176
|
+
mockProviderManager.getServerToolsProvider.mockReturnValue(mockGeminiProvider);
|
|
177
|
+
});
|
|
178
|
+
it('should use Gemini for web-fetch even when Anthropic is active', async () => {
|
|
179
|
+
const mockResponse = {
|
|
180
|
+
candidates: [
|
|
181
|
+
{
|
|
182
|
+
content: {
|
|
183
|
+
parts: [{ text: 'Anthropic user but Gemini fetched this' }],
|
|
184
|
+
role: 'model',
|
|
185
|
+
},
|
|
186
|
+
urlContextMetadata: {
|
|
187
|
+
urlMetadata: [
|
|
188
|
+
{
|
|
189
|
+
retrievedUrl: 'https://example.com',
|
|
190
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
};
|
|
197
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
198
|
+
const result = await webFetchTool.execute({ prompt: 'Analyze https://example.com' }, mockAbortSignal);
|
|
199
|
+
// Should call Gemini's invokeServerTool, not Anthropic's
|
|
200
|
+
expect(mockGeminiProvider.invokeServerTool).toHaveBeenCalled();
|
|
201
|
+
expect(mockAnthropicProvider.invokeServerTool).not.toHaveBeenCalled();
|
|
202
|
+
expect(result.llmContent).toContain('Anthropic user but Gemini fetched this');
|
|
203
|
+
expect(result.returnDisplay).toBe('Content processed from prompt.');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('Missing Gemini authentication error handling', () => {
|
|
207
|
+
it('should return error when no provider manager is available', async () => {
|
|
208
|
+
// Mock config to return no provider manager
|
|
209
|
+
mockConfig.getContentGeneratorConfig.mockReturnValue({
|
|
210
|
+
providerManager: null,
|
|
211
|
+
});
|
|
212
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
213
|
+
expect(result.llmContent).toContain('Web fetch requires a provider. Please use --provider gemini with authentication.');
|
|
214
|
+
expect(result.returnDisplay).toBe('Web fetch requires a provider.');
|
|
215
|
+
});
|
|
216
|
+
it('should return error when no server tools provider is configured', async () => {
|
|
217
|
+
// Mock provider manager to return null for server tools provider
|
|
218
|
+
mockProviderManager.getServerToolsProvider.mockReturnValue(null);
|
|
219
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
220
|
+
expect(result.llmContent).toContain('Web fetch requires Gemini provider to be configured. Please ensure Gemini is available with authentication.');
|
|
221
|
+
expect(result.returnDisplay).toBe('Web fetch requires Gemini provider.');
|
|
222
|
+
});
|
|
223
|
+
it('should return error when server tools provider does not support web_fetch', async () => {
|
|
224
|
+
// Mock Gemini provider to not support web_fetch
|
|
225
|
+
mockGeminiProvider.getServerTools.mockReturnValue(['web_search']); // Only web_search, no web_fetch
|
|
226
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
227
|
+
expect(result.llmContent).toContain('Web fetch is not available. The server tools provider does not support web fetch.');
|
|
228
|
+
expect(result.returnDisplay).toBe('Web fetch not available.');
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
describe('Fallback to direct fetch for private IPs', () => {
|
|
232
|
+
it('should fallback to direct fetch for localhost URLs', async () => {
|
|
233
|
+
// Mock isPrivateIp to return true for localhost
|
|
234
|
+
vi.spyOn(fetchUtils, 'isPrivateIp').mockReturnValue(true);
|
|
235
|
+
// Mock fetchWithTimeout
|
|
236
|
+
vi.spyOn(fetchUtils, 'fetchWithTimeout').mockResolvedValue({
|
|
237
|
+
ok: true,
|
|
238
|
+
status: 200,
|
|
239
|
+
statusText: 'OK',
|
|
240
|
+
text: vi
|
|
241
|
+
.fn()
|
|
242
|
+
.mockResolvedValue('<html><body>Local content</body></html>'),
|
|
243
|
+
});
|
|
244
|
+
const result = await webFetchTool.execute({ prompt: 'Get content from http://localhost:3000' }, mockAbortSignal);
|
|
245
|
+
// Should not call Gemini's invokeServerTool
|
|
246
|
+
expect(mockGeminiProvider.invokeServerTool).not.toHaveBeenCalled();
|
|
247
|
+
// Should contain error message about fallback
|
|
248
|
+
expect(result.llmContent).toContain('Private/local URLs cannot be processed with AI');
|
|
249
|
+
expect(result.llmContent).toContain('Content from http://localhost:3000');
|
|
250
|
+
expect(result.llmContent).toContain('Local content');
|
|
251
|
+
});
|
|
252
|
+
it('should fallback to direct fetch for private IP ranges', async () => {
|
|
253
|
+
// Mock isPrivateIp to return true for private IPs
|
|
254
|
+
vi.spyOn(fetchUtils, 'isPrivateIp').mockReturnValue(true);
|
|
255
|
+
// Mock fetchWithTimeout
|
|
256
|
+
vi.spyOn(fetchUtils, 'fetchWithTimeout').mockResolvedValue({
|
|
257
|
+
ok: true,
|
|
258
|
+
status: 200,
|
|
259
|
+
statusText: 'OK',
|
|
260
|
+
text: vi
|
|
261
|
+
.fn()
|
|
262
|
+
.mockResolvedValue('<html><body>Private network content</body></html>'),
|
|
263
|
+
});
|
|
264
|
+
const result = await webFetchTool.execute({ prompt: 'Get content from http://192.168.1.100:8080' }, mockAbortSignal);
|
|
265
|
+
// Should not call Gemini's invokeServerTool
|
|
266
|
+
expect(mockGeminiProvider.invokeServerTool).not.toHaveBeenCalled();
|
|
267
|
+
// Should contain error message about fallback
|
|
268
|
+
expect(result.llmContent).toContain('Private/local URLs cannot be processed with AI');
|
|
269
|
+
expect(result.llmContent).toContain('Content from http://192.168.1.100:8080');
|
|
270
|
+
expect(result.llmContent).toContain('Private network content');
|
|
271
|
+
});
|
|
272
|
+
it('should handle fallback fetch errors gracefully', async () => {
|
|
273
|
+
// Mock isPrivateIp to return true
|
|
274
|
+
vi.spyOn(fetchUtils, 'isPrivateIp').mockReturnValue(true);
|
|
275
|
+
// Mock fetchWithTimeout to fail
|
|
276
|
+
vi.spyOn(fetchUtils, 'fetchWithTimeout').mockRejectedValue(new Error('Network error'));
|
|
277
|
+
const result = await webFetchTool.execute({ prompt: 'Get content from http://localhost:3000' }, mockAbortSignal);
|
|
278
|
+
expect(result.llmContent).toContain('Error: Error during fallback fetch for http://localhost:3000: Network error');
|
|
279
|
+
expect(result.returnDisplay).toContain('Error: Error during fallback fetch');
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
describe('Error handling', () => {
|
|
283
|
+
it('should handle server tool invocation errors', async () => {
|
|
284
|
+
mockGeminiProvider.invokeServerTool.mockRejectedValue(new Error('API key not configured'));
|
|
285
|
+
// Mock isPrivateIp to return false so it doesn't fallback
|
|
286
|
+
vi.spyOn(fetchUtils, 'isPrivateIp').mockReturnValue(false);
|
|
287
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
288
|
+
expect(result.llmContent).toContain('Error processing web content');
|
|
289
|
+
expect(result.llmContent).toContain('API key not configured');
|
|
290
|
+
});
|
|
291
|
+
it('should handle URL retrieval failures', async () => {
|
|
292
|
+
const mockResponse = {
|
|
293
|
+
candidates: [
|
|
294
|
+
{
|
|
295
|
+
content: {
|
|
296
|
+
parts: [{ text: '' }],
|
|
297
|
+
role: 'model',
|
|
298
|
+
},
|
|
299
|
+
urlContextMetadata: {
|
|
300
|
+
urlMetadata: [
|
|
301
|
+
{
|
|
302
|
+
retrievedUrl: 'https://example.com',
|
|
303
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_FAILED',
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
};
|
|
310
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
311
|
+
// Mock isPrivateIp to return false (not private, so should use server tool)
|
|
312
|
+
vi.spyOn(fetchUtils, 'isPrivateIp').mockReturnValue(false);
|
|
313
|
+
// Mock fetchWithTimeout for fallback
|
|
314
|
+
vi.spyOn(fetchUtils, 'fetchWithTimeout').mockResolvedValue({
|
|
315
|
+
ok: false,
|
|
316
|
+
status: 404,
|
|
317
|
+
statusText: 'Not Found',
|
|
318
|
+
text: vi.fn().mockResolvedValue(''),
|
|
319
|
+
});
|
|
320
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
321
|
+
// Should return no content found
|
|
322
|
+
expect(result.llmContent).toContain('No content found');
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
describe('Validation', () => {
|
|
326
|
+
it('should reject empty prompt', async () => {
|
|
327
|
+
const result = await webFetchTool.execute({ prompt: '' }, mockAbortSignal);
|
|
328
|
+
expect(result.llmContent).toContain('Error: Invalid parameters');
|
|
329
|
+
expect(result.llmContent).toContain('cannot be empty');
|
|
330
|
+
});
|
|
331
|
+
it('should reject prompt without URLs', async () => {
|
|
332
|
+
const result = await webFetchTool.execute({ prompt: 'Just some text without any URLs' }, mockAbortSignal);
|
|
333
|
+
expect(result.llmContent).toContain('Error: Invalid parameters');
|
|
334
|
+
expect(result.llmContent).toContain('must contain at least one valid URL');
|
|
335
|
+
});
|
|
336
|
+
it('should accept prompt with multiple URLs', async () => {
|
|
337
|
+
const mockResponse = {
|
|
338
|
+
candidates: [
|
|
339
|
+
{
|
|
340
|
+
content: {
|
|
341
|
+
parts: [{ text: 'Processed multiple URLs' }],
|
|
342
|
+
role: 'model',
|
|
343
|
+
},
|
|
344
|
+
urlContextMetadata: {
|
|
345
|
+
urlMetadata: [
|
|
346
|
+
{
|
|
347
|
+
retrievedUrl: 'https://example1.com',
|
|
348
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
retrievedUrl: 'https://example2.com',
|
|
352
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
};
|
|
359
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
360
|
+
const result = await webFetchTool.execute({ prompt: 'Compare https://example1.com and https://example2.com' }, mockAbortSignal);
|
|
361
|
+
expect(result.llmContent).toContain('Processed multiple URLs');
|
|
362
|
+
expect(result.returnDisplay).toBe('Content processed from prompt.');
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
describe('GitHub URL handling', () => {
|
|
366
|
+
it('should convert GitHub blob URLs to raw URLs', async () => {
|
|
367
|
+
const mockResponse = {
|
|
368
|
+
candidates: [
|
|
369
|
+
{
|
|
370
|
+
content: {
|
|
371
|
+
parts: [{ text: 'GitHub file content' }],
|
|
372
|
+
role: 'model',
|
|
373
|
+
},
|
|
374
|
+
urlContextMetadata: {
|
|
375
|
+
urlMetadata: [
|
|
376
|
+
{
|
|
377
|
+
retrievedUrl: 'https://raw.githubusercontent.com/user/repo/main/file.js',
|
|
378
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
],
|
|
384
|
+
};
|
|
385
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
386
|
+
const result = await webFetchTool.execute({
|
|
387
|
+
prompt: 'Get content from https://github.com/user/repo/blob/main/file.js',
|
|
388
|
+
}, mockAbortSignal);
|
|
389
|
+
// The tool should still pass the original prompt to the server
|
|
390
|
+
expect(mockGeminiProvider.invokeServerTool).toHaveBeenCalledWith('web_fetch', {
|
|
391
|
+
prompt: 'Get content from https://github.com/user/repo/blob/main/file.js',
|
|
392
|
+
}, { signal: mockAbortSignal });
|
|
393
|
+
expect(result.llmContent).toContain('GitHub file content');
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
describe('Grounding metadata and citations', () => {
|
|
397
|
+
it('should insert citation markers when grounding supports are provided', async () => {
|
|
398
|
+
const mockResponse = {
|
|
399
|
+
candidates: [
|
|
400
|
+
{
|
|
401
|
+
content: {
|
|
402
|
+
parts: [{ text: 'This is cited content from the webpage.' }],
|
|
403
|
+
role: 'model',
|
|
404
|
+
},
|
|
405
|
+
groundingMetadata: {
|
|
406
|
+
groundingChunks: [
|
|
407
|
+
{
|
|
408
|
+
web: {
|
|
409
|
+
title: 'Source Page',
|
|
410
|
+
uri: 'https://example.com/source',
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
],
|
|
414
|
+
groundingSupports: [
|
|
415
|
+
{
|
|
416
|
+
segment: {
|
|
417
|
+
startIndex: 0,
|
|
418
|
+
endIndex: 12,
|
|
419
|
+
},
|
|
420
|
+
groundingChunkIndices: [0],
|
|
421
|
+
},
|
|
422
|
+
],
|
|
423
|
+
},
|
|
424
|
+
urlContextMetadata: {
|
|
425
|
+
urlMetadata: [
|
|
426
|
+
{
|
|
427
|
+
retrievedUrl: 'https://example.com/source',
|
|
428
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
429
|
+
},
|
|
430
|
+
],
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
],
|
|
434
|
+
};
|
|
435
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
436
|
+
const result = await webFetchTool.execute({ prompt: 'Extract info from https://example.com/source' }, mockAbortSignal);
|
|
437
|
+
// Should have citation marker inserted after 'cite' (at index 12)
|
|
438
|
+
expect(result.llmContent).toContain('This is cite[1]d content');
|
|
439
|
+
expect(result.llmContent).toContain('from the webpage.');
|
|
440
|
+
expect(result.llmContent).toContain('Sources:');
|
|
441
|
+
expect(result.llmContent).toContain('[1] Source Page (https://example.com/source)');
|
|
442
|
+
});
|
|
443
|
+
it('should handle response with null parts gracefully', async () => {
|
|
444
|
+
const mockResponse = {
|
|
445
|
+
candidates: [
|
|
446
|
+
{
|
|
447
|
+
content: {
|
|
448
|
+
parts: [
|
|
449
|
+
null,
|
|
450
|
+
{ text: 'Valid content' },
|
|
451
|
+
undefined,
|
|
452
|
+
{ text: ' continues' },
|
|
453
|
+
],
|
|
454
|
+
role: 'model',
|
|
455
|
+
},
|
|
456
|
+
urlContextMetadata: {
|
|
457
|
+
urlMetadata: [
|
|
458
|
+
{
|
|
459
|
+
retrievedUrl: 'https://example.com',
|
|
460
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
461
|
+
},
|
|
462
|
+
],
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
],
|
|
466
|
+
};
|
|
467
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(mockResponse);
|
|
468
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
469
|
+
// getResponseText throws on null parts, so we get an error
|
|
470
|
+
expect(result.llmContent).toContain('Error processing web content');
|
|
471
|
+
expect(result.llmContent).toContain('Cannot read properties of null');
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
describe('Multiple providers edge cases', () => {
|
|
475
|
+
it('should handle when provider manager has no server tools provider but active provider exists', async () => {
|
|
476
|
+
// Set active provider to OpenAI, but no server tools provider
|
|
477
|
+
mockProviderManager.getActiveProvider.mockReturnValue(mockOpenAIProvider);
|
|
478
|
+
mockProviderManager.getServerToolsProvider.mockReturnValue(null);
|
|
479
|
+
const result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
480
|
+
expect(result.llmContent).toContain('Web fetch requires Gemini provider to be configured');
|
|
481
|
+
expect(result.returnDisplay).toBe('Web fetch requires Gemini provider.');
|
|
482
|
+
});
|
|
483
|
+
it('should work correctly when switching between providers', async () => {
|
|
484
|
+
// First request with Gemini active
|
|
485
|
+
const geminiResponse = {
|
|
486
|
+
candidates: [
|
|
487
|
+
{
|
|
488
|
+
content: {
|
|
489
|
+
parts: [{ text: 'Gemini fetched content' }],
|
|
490
|
+
role: 'model',
|
|
491
|
+
},
|
|
492
|
+
urlContextMetadata: {
|
|
493
|
+
urlMetadata: [
|
|
494
|
+
{
|
|
495
|
+
retrievedUrl: 'https://example.com',
|
|
496
|
+
urlRetrievalStatus: 'URL_RETRIEVAL_STATUS_SUCCESS',
|
|
497
|
+
},
|
|
498
|
+
],
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
],
|
|
502
|
+
};
|
|
503
|
+
mockGeminiProvider.invokeServerTool.mockResolvedValue(geminiResponse);
|
|
504
|
+
let result = await webFetchTool.execute({ prompt: 'Fetch https://example.com' }, mockAbortSignal);
|
|
505
|
+
expect(result.llmContent).toContain('Gemini fetched content');
|
|
506
|
+
// Switch to OpenAI as active provider
|
|
507
|
+
mockProviderManager.getActiveProvider.mockReturnValue(mockOpenAIProvider);
|
|
508
|
+
mockProviderManager.getActiveProviderName.mockReturnValue('openai');
|
|
509
|
+
// Second request should still use Gemini for server tools
|
|
510
|
+
result = await webFetchTool.execute({ prompt: 'Fetch https://example.com again' }, mockAbortSignal);
|
|
511
|
+
// Should still call Gemini's invokeServerTool
|
|
512
|
+
expect(mockGeminiProvider.invokeServerTool).toHaveBeenCalledTimes(2);
|
|
513
|
+
expect(mockOpenAIProvider.invokeServerTool).not.toHaveBeenCalled();
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
describe('Tool description and getDescription', () => {
|
|
517
|
+
it('should truncate long prompts in description', () => {
|
|
518
|
+
const longPrompt = 'Fetch and analyze ' +
|
|
519
|
+
'https://example.com/very/long/url/path '.repeat(10);
|
|
520
|
+
const description = webFetchTool.getDescription({ prompt: longPrompt });
|
|
521
|
+
expect(description).toContain('Processing URLs and instructions from prompt:');
|
|
522
|
+
expect(description).toContain('...');
|
|
523
|
+
expect(description.length).toBeLessThan(150);
|
|
524
|
+
});
|
|
525
|
+
it('should show full prompt for short prompts', () => {
|
|
526
|
+
const shortPrompt = 'Fetch https://example.com';
|
|
527
|
+
const description = webFetchTool.getDescription({ prompt: shortPrompt });
|
|
528
|
+
expect(description).toBe(`Processing URLs and instructions from prompt: "${shortPrompt}"`);
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
//# sourceMappingURL=web-fetch.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.integration.test.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.integration.test.ts"],"names":[],"mappings":"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"}
|