@vybestack/llxprt-code-core 0.1.19-alpha → 0.1.19-gamma
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/src/auth/anthropic-device-flow.d.ts +53 -0
- package/dist/src/auth/anthropic-device-flow.js +208 -0
- package/dist/src/auth/anthropic-device-flow.js.map +1 -0
- package/dist/src/auth/precedence.d.ts +55 -0
- package/dist/src/auth/precedence.js +211 -0
- package/dist/src/auth/precedence.js.map +1 -0
- package/dist/src/auth/qwen-device-flow.d.ts +45 -0
- package/dist/src/auth/qwen-device-flow.js +179 -0
- package/dist/src/auth/qwen-device-flow.js.map +1 -0
- package/dist/src/auth/token-store.d.ts +66 -0
- package/dist/src/auth/token-store.js +151 -0
- package/dist/src/auth/token-store.js.map +1 -0
- package/dist/src/auth/types.d.ts +130 -0
- package/dist/src/auth/types.js +60 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +2 -1
- package/dist/src/code_assist/converter.js +1 -1
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +2 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/config/config.d.ts +61 -2
- package/dist/src/config/config.js +134 -4
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/endpoints.d.ts +60 -0
- package/dist/src/config/endpoints.js +126 -0
- package/dist/src/config/endpoints.js.map +1 -0
- package/dist/src/config/profileManager.d.ts +14 -4
- package/dist/src/config/profileManager.js +90 -11
- package/dist/src/config/profileManager.js.map +1 -1
- package/dist/src/core/client.js +9 -12
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +4 -1
- package/dist/src/core/contentGenerator.js +3 -0
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/logger.d.ts +1 -0
- package/dist/src/core/logger.js +18 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +24 -0
- package/dist/src/core/loggingContentGenerator.js +89 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.js +17 -0
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/subagent.js +12 -10
- package/dist/src/core/subagent.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +1 -1
- package/dist/src/ide/ide-client.js +21 -7
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/providers/BaseProvider.d.ts +149 -0
- package/dist/src/providers/BaseProvider.js +315 -0
- package/dist/src/providers/BaseProvider.js.map +1 -0
- package/dist/src/providers/IProvider.d.ts +1 -0
- package/dist/src/providers/IProviderManager.d.ts +5 -0
- package/dist/src/providers/LoggingProviderWrapper.d.ts +54 -0
- package/dist/src/providers/LoggingProviderWrapper.js +350 -0
- package/dist/src/providers/LoggingProviderWrapper.js.map +1 -0
- package/dist/src/providers/ProviderManager.d.ts +20 -1
- package/dist/src/providers/ProviderManager.js +236 -14
- package/dist/src/providers/ProviderManager.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +20 -6
- package/dist/src/providers/anthropic/AnthropicProvider.js +172 -26
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +16 -7
- package/dist/src/providers/gemini/GeminiProvider.js +163 -148
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/logging/ProviderContentExtractor.d.ts +27 -0
- package/dist/src/providers/logging/ProviderContentExtractor.js +198 -0
- package/dist/src/providers/logging/ProviderContentExtractor.js.map +1 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.d.ts +43 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.js +98 -0
- package/dist/src/providers/logging/ProviderPerformanceTracker.js.map +1 -0
- package/dist/src/providers/openai/OpenAIProvider.d.ts +53 -6
- package/dist/src/providers/openai/OpenAIProvider.js +373 -40
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/RESPONSES_API_MODELS.d.ts +1 -1
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js +1 -0
- package/dist/src/providers/openai/RESPONSES_API_MODELS.js.map +1 -1
- package/dist/src/providers/openai/syntheticToolResponses.d.ts +52 -0
- package/dist/src/providers/openai/syntheticToolResponses.js +129 -0
- package/dist/src/providers/openai/syntheticToolResponses.js.map +1 -0
- package/dist/src/providers/types.d.ts +47 -0
- package/dist/src/services/git-stats-service.d.ts +32 -0
- package/dist/src/services/git-stats-service.js +22 -0
- package/dist/src/services/git-stats-service.js.map +1 -0
- package/dist/src/services/loopDetectionService.js +10 -6
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +44 -8
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/settings/SettingsService.d.ts +32 -0
- package/dist/src/settings/SettingsService.js +204 -0
- package/dist/src/settings/SettingsService.js.map +1 -0
- package/dist/src/settings/settingsServiceInstance.d.ts +12 -0
- package/dist/src/settings/settingsServiceInstance.js +24 -0
- package/dist/src/settings/settingsServiceInstance.js.map +1 -0
- package/dist/src/settings/types.d.ts +141 -0
- package/dist/src/settings/types.js +5 -0
- package/dist/src/settings/types.js.map +1 -0
- package/dist/src/storage/ConversationFileWriter.d.ts +16 -0
- package/dist/src/storage/ConversationFileWriter.js +69 -0
- package/dist/src/storage/ConversationFileWriter.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +8 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +56 -3
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +11 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +5 -0
- package/dist/src/telemetry/constants.js +5 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +5 -1
- package/dist/src/telemetry/loggers.js +87 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +2 -1
- package/dist/src/telemetry/metrics.js +7 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +29 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +56 -1
- package/dist/src/telemetry/types.js +123 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +2 -1
- package/dist/src/telemetry/uiTelemetry.js +1 -1
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/tools/diffOptions.d.ts +2 -0
- package/dist/src/tools/diffOptions.js +28 -0
- package/dist/src/tools/diffOptions.js.map +1 -1
- package/dist/src/tools/edit.d.ts +4 -0
- package/dist/src/tools/edit.js +38 -8
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -3
- package/dist/src/tools/mcp-client.js +23 -6
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/read-file.js +34 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/todo-pause.d.ts +22 -0
- package/dist/src/tools/todo-pause.js +93 -0
- package/dist/src/tools/todo-pause.js.map +1 -0
- package/dist/src/tools/tool-error.d.ts +4 -0
- package/dist/src/tools/tool-error.js +4 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.js +3 -3
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +7 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +4 -0
- package/dist/src/tools/write-file.js +90 -16
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +2 -0
- package/dist/src/utils/environmentContext.js +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +7 -0
- package/dist/src/utils/fileUtils.js +9 -0
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/package.json +4 -2
- package/dist/src/code_assist/converter.test.d.ts +0 -6
- package/dist/src/code_assist/converter.test.js +0 -232
- package/dist/src/code_assist/converter.test.js.map +0 -1
- package/dist/src/code_assist/oauth2.test.d.ts +0 -6
- package/dist/src/code_assist/oauth2.test.js +0 -370
- package/dist/src/code_assist/oauth2.test.js.map +0 -1
- package/dist/src/code_assist/server.test.d.ts +0 -6
- package/dist/src/code_assist/server.test.js +0 -131
- package/dist/src/code_assist/server.test.js.map +0 -1
- package/dist/src/code_assist/setup.test.d.ts +0 -6
- package/dist/src/code_assist/setup.test.js +0 -65
- package/dist/src/code_assist/setup.test.js.map +0 -1
- package/dist/src/config/config.alwaysAllow.test.d.ts +0 -6
- package/dist/src/config/config.alwaysAllow.test.js +0 -84
- package/dist/src/config/config.alwaysAllow.test.js.map +0 -1
- package/dist/src/config/config.test.d.ts +0 -6
- package/dist/src/config/config.test.js +0 -369
- package/dist/src/config/config.test.js.map +0 -1
- package/dist/src/config/flashFallback.test.d.ts +0 -6
- package/dist/src/config/flashFallback.test.js +0 -91
- package/dist/src/config/flashFallback.test.js.map +0 -1
- package/dist/src/core/client.test.d.ts +0 -6
- package/dist/src/core/client.test.js +0 -1322
- package/dist/src/core/client.test.js.map +0 -1
- package/dist/src/core/contentGenerator.test.d.ts +0 -6
- package/dist/src/core/contentGenerator.test.js +0 -103
- package/dist/src/core/contentGenerator.test.js.map +0 -1
- package/dist/src/core/coreToolScheduler.test.d.ts +0 -6
- package/dist/src/core/coreToolScheduler.test.js +0 -637
- package/dist/src/core/coreToolScheduler.test.js.map +0 -1
- package/dist/src/core/geminiChat.test.d.ts +0 -6
- package/dist/src/core/geminiChat.test.js +0 -425
- package/dist/src/core/geminiChat.test.js.map +0 -1
- package/dist/src/core/googleGenAIWrapper.test.d.ts +0 -6
- package/dist/src/core/googleGenAIWrapper.test.js +0 -104
- package/dist/src/core/googleGenAIWrapper.test.js.map +0 -1
- package/dist/src/core/logger.test.d.ts +0 -6
- package/dist/src/core/logger.test.js +0 -438
- package/dist/src/core/logger.test.js.map +0 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +0 -6
- package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -165
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +0 -1
- package/dist/src/core/prompts-async.test.d.ts +0 -6
- package/dist/src/core/prompts-async.test.js +0 -115
- package/dist/src/core/prompts-async.test.js.map +0 -1
- package/dist/src/core/prompts.test.d.ts +0 -6
- package/dist/src/core/prompts.test.js +0 -68
- package/dist/src/core/prompts.test.js.map +0 -1
- package/dist/src/core/subagent.test.d.ts +0 -6
- package/dist/src/core/subagent.test.js +0 -519
- package/dist/src/core/subagent.test.js.map +0 -1
- package/dist/src/core/tokenLimits.test.d.ts +0 -6
- package/dist/src/core/tokenLimits.test.js +0 -66
- package/dist/src/core/tokenLimits.test.js.map +0 -1
- package/dist/src/core/turn.test.d.ts +0 -6
- package/dist/src/core/turn.test.js +0 -366
- package/dist/src/core/turn.test.js.map +0 -1
- package/dist/src/hooks/tool-render-suppression-hook.test.d.ts +0 -6
- package/dist/src/hooks/tool-render-suppression-hook.test.js +0 -59
- package/dist/src/hooks/tool-render-suppression-hook.test.js.map +0 -1
- package/dist/src/ide/ide-installer.test.d.ts +0 -6
- package/dist/src/ide/ide-installer.test.js +0 -55
- package/dist/src/ide/ide-installer.test.js.map +0 -1
- package/dist/src/ide/ideContext.test.d.ts +0 -6
- package/dist/src/ide/ideContext.test.js +0 -265
- package/dist/src/ide/ideContext.test.js.map +0 -1
- package/dist/src/index.test.d.ts +0 -6
- package/dist/src/index.test.js +0 -12
- package/dist/src/index.test.js.map +0 -1
- package/dist/src/integration-tests/todo-system.test.d.ts +0 -6
- package/dist/src/integration-tests/todo-system.test.js +0 -46
- package/dist/src/integration-tests/todo-system.test.js.map +0 -1
- package/dist/src/mcp/google-auth-provider.test.d.ts +0 -6
- package/dist/src/mcp/google-auth-provider.test.js +0 -54
- package/dist/src/mcp/google-auth-provider.test.js.map +0 -1
- package/dist/src/mcp/oauth-provider.test.d.ts +0 -6
- package/dist/src/mcp/oauth-provider.test.js +0 -602
- package/dist/src/mcp/oauth-provider.test.js.map +0 -1
- package/dist/src/mcp/oauth-token-storage.test.d.ts +0 -6
- package/dist/src/mcp/oauth-token-storage.test.js +0 -205
- package/dist/src/mcp/oauth-token-storage.test.js.map +0 -1
- package/dist/src/mcp/oauth-utils.test.d.ts +0 -6
- package/dist/src/mcp/oauth-utils.test.js +0 -144
- package/dist/src/mcp/oauth-utils.test.js.map +0 -1
- package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +0 -1
- package/dist/src/parsers/TextToolCallParser.multibyte.test.js +0 -42
- package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +0 -1
- package/dist/src/parsers/TextToolCallParser.test.d.ts +0 -1
- package/dist/src/parsers/TextToolCallParser.test.js +0 -225
- package/dist/src/parsers/TextToolCallParser.test.js.map +0 -1
- package/dist/src/prompt-config/TemplateEngine.test.d.ts +0 -1
- package/dist/src/prompt-config/TemplateEngine.test.js +0 -494
- package/dist/src/prompt-config/TemplateEngine.test.js.map +0 -1
- package/dist/src/prompt-config/prompt-cache.test.d.ts +0 -6
- package/dist/src/prompt-config/prompt-cache.test.js +0 -437
- package/dist/src/prompt-config/prompt-cache.test.js.map +0 -1
- package/dist/src/prompt-config/prompt-installer.test.d.ts +0 -7
- package/dist/src/prompt-config/prompt-installer.test.js +0 -503
- package/dist/src/prompt-config/prompt-installer.test.js.map +0 -1
- package/dist/src/prompt-config/prompt-loader.test.d.ts +0 -5
- package/dist/src/prompt-config/prompt-loader.test.js +0 -413
- package/dist/src/prompt-config/prompt-loader.test.js.map +0 -1
- package/dist/src/prompt-config/prompt-resolver.test.d.ts +0 -1
- package/dist/src/prompt-config/prompt-resolver.test.js +0 -529
- package/dist/src/prompt-config/prompt-resolver.test.js.map +0 -1
- package/dist/src/prompt-config/prompt-service.test.d.ts +0 -1
- package/dist/src/prompt-config/prompt-service.test.js +0 -811
- package/dist/src/prompt-config/prompt-service.test.js.map +0 -1
- package/dist/src/providers/ProviderManager.gemini-switch.test.d.ts +0 -6
- package/dist/src/providers/ProviderManager.gemini-switch.test.js +0 -57
- package/dist/src/providers/ProviderManager.gemini-switch.test.js.map +0 -1
- package/dist/src/providers/ProviderManager.test.d.ts +0 -6
- package/dist/src/providers/ProviderManager.test.js +0 -284
- package/dist/src/providers/ProviderManager.test.js.map +0 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +0 -6
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +0 -273
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +0 -1
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +0 -1
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +0 -48
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +0 -1
- package/dist/src/providers/anthropic/AnthropicProvider.test.d.ts +0 -1
- package/dist/src/providers/anthropic/AnthropicProvider.test.js +0 -487
- package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +0 -1
- package/dist/src/providers/gemini/GeminiProvider.integration.test.d.ts +0 -6
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js +0 -126
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +0 -1
- package/dist/src/providers/gemini/GeminiProvider.test.d.ts +0 -6
- package/dist/src/providers/gemini/GeminiProvider.test.js +0 -136
- package/dist/src/providers/gemini/GeminiProvider.test.js.map +0 -1
- package/dist/src/providers/integration/multi-provider.integration.test.d.ts +0 -6
- package/dist/src/providers/integration/multi-provider.integration.test.js +0 -292
- package/dist/src/providers/integration/multi-provider.integration.test.js.map +0 -1
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.d.ts +0 -1
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js +0 -97
- package/dist/src/providers/openai/ConversationCache.accumTokens.test.js.map +0 -1
- package/dist/src/providers/openai/ConversationCache.test.d.ts +0 -1
- package/dist/src/providers/openai/ConversationCache.test.js +0 -113
- package/dist/src/providers/openai/ConversationCache.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.d.ts +0 -1
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js +0 -189
- package/dist/src/providers/openai/OpenAIProvider.callResponses.stateless.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.integration.test.d.ts +0 -6
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js +0 -125
- package/dist/src/providers/openai/OpenAIProvider.integration.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.responses.test.d.ts +0 -1
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js +0 -350
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.d.ts +0 -1
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js +0 -213
- package/dist/src/providers/openai/OpenAIProvider.responsesIntegration.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.d.ts +0 -1
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +0 -59
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.d.ts +0 -6
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js +0 -105
- package/dist/src/providers/openai/OpenAIProvider.stateful.integration.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.switch.test.d.ts +0 -1
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js +0 -256
- package/dist/src/providers/openai/OpenAIProvider.switch.test.js.map +0 -1
- package/dist/src/providers/openai/OpenAIProvider.test.d.ts +0 -16
- package/dist/src/providers/openai/OpenAIProvider.test.js +0 -620
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +0 -1
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.d.ts +0 -1
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js +0 -210
- package/dist/src/providers/openai/ResponsesContextTrim.integration.test.js.map +0 -1
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.d.ts +0 -1
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js +0 -65
- package/dist/src/providers/openai/__tests__/formatArrayResponse.test.js.map +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.d.ts +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js +0 -129
- package/dist/src/providers/openai/buildResponsesRequest.stripToolCalls.test.js.map +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.test.d.ts +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.test.js +0 -406
- package/dist/src/providers/openai/buildResponsesRequest.test.js.map +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.d.ts +0 -1
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js +0 -50
- package/dist/src/providers/openai/buildResponsesRequest.undefined.test.js.map +0 -1
- package/dist/src/providers/openai/estimateRemoteTokens.test.d.ts +0 -1
- package/dist/src/providers/openai/estimateRemoteTokens.test.js +0 -125
- package/dist/src/providers/openai/estimateRemoteTokens.test.js.map +0 -1
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.d.ts +0 -1
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js +0 -192
- package/dist/src/providers/openai/parseResponsesStream.responsesToolCalls.test.js.map +0 -1
- package/dist/src/providers/openai/parseResponsesStream.test.d.ts +0 -1
- package/dist/src/providers/openai/parseResponsesStream.test.js +0 -151
- package/dist/src/providers/openai/parseResponsesStream.test.js.map +0 -1
- package/dist/src/services/fileDiscoveryService.test.d.ts +0 -6
- package/dist/src/services/fileDiscoveryService.test.js +0 -143
- package/dist/src/services/fileDiscoveryService.test.js.map +0 -1
- package/dist/src/services/gitService.test.d.ts +0 -6
- package/dist/src/services/gitService.test.js +0 -209
- package/dist/src/services/gitService.test.js.map +0 -1
- package/dist/src/services/loopDetectionService.test.d.ts +0 -6
- package/dist/src/services/loopDetectionService.test.js +0 -345
- package/dist/src/services/loopDetectionService.test.js.map +0 -1
- package/dist/src/services/shellExecutionService.multibyte.test.d.ts +0 -6
- package/dist/src/services/shellExecutionService.multibyte.test.js +0 -72
- package/dist/src/services/shellExecutionService.multibyte.test.js.map +0 -1
- package/dist/src/services/shellExecutionService.test.d.ts +0 -6
- package/dist/src/services/shellExecutionService.test.js +0 -272
- package/dist/src/services/shellExecutionService.test.js.map +0 -1
- package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +0 -6
- package/dist/src/services/shellExecutionService.windows.multibyte.test.js +0 -98
- package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +0 -1
- package/dist/src/services/shellExecutionService.windows.test.d.ts +0 -6
- package/dist/src/services/shellExecutionService.windows.test.js +0 -79
- package/dist/src/services/shellExecutionService.windows.test.js.map +0 -1
- package/dist/src/services/tool-call-tracker-service.test.d.ts +0 -6
- package/dist/src/services/tool-call-tracker-service.test.js +0 -99
- package/dist/src/services/tool-call-tracker-service.test.js.map +0 -1
- package/dist/src/telemetry/loggers.test.d.ts +0 -6
- package/dist/src/telemetry/loggers.test.js +0 -572
- package/dist/src/telemetry/loggers.test.js.map +0 -1
- package/dist/src/telemetry/metrics.test.d.ts +0 -6
- package/dist/src/telemetry/metrics.test.js +0 -162
- package/dist/src/telemetry/metrics.test.js.map +0 -1
- package/dist/src/telemetry/telemetry.test.d.ts +0 -6
- package/dist/src/telemetry/telemetry.test.js +0 -54
- package/dist/src/telemetry/telemetry.test.js.map +0 -1
- package/dist/src/telemetry/uiTelemetry.test.d.ts +0 -6
- package/dist/src/telemetry/uiTelemetry.test.js +0 -517
- package/dist/src/telemetry/uiTelemetry.test.js.map +0 -1
- package/dist/src/tools/ToolFormatter.test.d.ts +0 -16
- package/dist/src/tools/ToolFormatter.test.js +0 -349
- package/dist/src/tools/ToolFormatter.test.js.map +0 -1
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.d.ts +0 -1
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js +0 -241
- package/dist/src/tools/ToolFormatter.toResponsesTool.test.js.map +0 -1
- package/dist/src/tools/edit.test.d.ts +0 -6
- package/dist/src/tools/edit.test.js +0 -688
- package/dist/src/tools/edit.test.js.map +0 -1
- package/dist/src/tools/glob.test.d.ts +0 -6
- package/dist/src/tools/glob.test.js +0 -332
- package/dist/src/tools/glob.test.js.map +0 -1
- package/dist/src/tools/grep.test.d.ts +0 -6
- package/dist/src/tools/grep.test.js +0 -272
- package/dist/src/tools/grep.test.js.map +0 -1
- package/dist/src/tools/ls.test.d.ts +0 -6
- package/dist/src/tools/ls.test.js +0 -357
- package/dist/src/tools/ls.test.js.map +0 -1
- package/dist/src/tools/mcp-client.test.d.ts +0 -6
- package/dist/src/tools/mcp-client.test.js +0 -575
- package/dist/src/tools/mcp-client.test.js.map +0 -1
- package/dist/src/tools/mcp-tool.test.d.ts +0 -6
- package/dist/src/tools/mcp-tool.test.js +0 -501
- package/dist/src/tools/mcp-tool.test.js.map +0 -1
- package/dist/src/tools/memoryTool.test.d.ts +0 -6
- package/dist/src/tools/memoryTool.test.js +0 -266
- package/dist/src/tools/memoryTool.test.js.map +0 -1
- package/dist/src/tools/modifiable-tool.test.d.ts +0 -6
- package/dist/src/tools/modifiable-tool.test.js +0 -193
- package/dist/src/tools/modifiable-tool.test.js.map +0 -1
- package/dist/src/tools/read-file.test.d.ts +0 -6
- package/dist/src/tools/read-file.test.js +0 -313
- package/dist/src/tools/read-file.test.js.map +0 -1
- package/dist/src/tools/read-many-files.test.d.ts +0 -6
- package/dist/src/tools/read-many-files.test.js +0 -644
- package/dist/src/tools/read-many-files.test.js.map +0 -1
- package/dist/src/tools/shell.multibyte.test.d.ts +0 -6
- package/dist/src/tools/shell.multibyte.test.js +0 -75
- package/dist/src/tools/shell.multibyte.test.js.map +0 -1
- package/dist/src/tools/shell.test.d.ts +0 -6
- package/dist/src/tools/shell.test.js +0 -350
- package/dist/src/tools/shell.test.js.map +0 -1
- package/dist/src/tools/todo-read.test.d.ts +0 -6
- package/dist/src/tools/todo-read.test.js +0 -162
- package/dist/src/tools/todo-read.test.js.map +0 -1
- package/dist/src/tools/todo-schemas.test.d.ts +0 -6
- package/dist/src/tools/todo-schemas.test.js +0 -341
- package/dist/src/tools/todo-schemas.test.js.map +0 -1
- package/dist/src/tools/todo-store.test.d.ts +0 -6
- package/dist/src/tools/todo-store.test.js +0 -169
- package/dist/src/tools/todo-store.test.js.map +0 -1
- package/dist/src/tools/todo-write.test.d.ts +0 -6
- package/dist/src/tools/todo-write.test.js +0 -226
- package/dist/src/tools/todo-write.test.js.map +0 -1
- package/dist/src/tools/tool-registry.test.d.ts +0 -6
- package/dist/src/tools/tool-registry.test.js +0 -468
- package/dist/src/tools/tool-registry.test.js.map +0 -1
- package/dist/src/tools/tools.test.d.ts +0 -6
- package/dist/src/tools/tools.test.js +0 -117
- package/dist/src/tools/tools.test.js.map +0 -1
- package/dist/src/tools/web-fetch.integration.test.d.ts +0 -6
- package/dist/src/tools/web-fetch.integration.test.js +0 -532
- package/dist/src/tools/web-fetch.integration.test.js.map +0 -1
- package/dist/src/tools/web-search.test.d.ts +0 -6
- package/dist/src/tools/web-search.test.js +0 -229
- package/dist/src/tools/web-search.test.js.map +0 -1
- package/dist/src/tools/write-file.test.d.ts +0 -6
- package/dist/src/tools/write-file.test.js +0 -464
- package/dist/src/tools/write-file.test.js.map +0 -1
- package/dist/src/utils/bfsFileSearch.test.d.ts +0 -6
- package/dist/src/utils/bfsFileSearch.test.js +0 -191
- package/dist/src/utils/bfsFileSearch.test.js.map +0 -1
- package/dist/src/utils/editCorrector.test.d.ts +0 -6
- package/dist/src/utils/editCorrector.test.js +0 -564
- package/dist/src/utils/editCorrector.test.js.map +0 -1
- package/dist/src/utils/editor.test.d.ts +0 -6
- package/dist/src/utils/editor.test.js +0 -445
- package/dist/src/utils/editor.test.js.map +0 -1
- package/dist/src/utils/environmentContext.test.d.ts +0 -6
- package/dist/src/utils/environmentContext.test.js +0 -139
- package/dist/src/utils/environmentContext.test.js.map +0 -1
- package/dist/src/utils/errorReporting.test.d.ts +0 -6
- package/dist/src/utils/errorReporting.test.js +0 -130
- package/dist/src/utils/errorReporting.test.js.map +0 -1
- package/dist/src/utils/fileUtils.test.d.ts +0 -6
- package/dist/src/utils/fileUtils.test.js +0 -363
- package/dist/src/utils/fileUtils.test.js.map +0 -1
- package/dist/src/utils/filesearch/crawlCache.test.d.ts +0 -6
- package/dist/src/utils/filesearch/crawlCache.test.js +0 -103
- package/dist/src/utils/filesearch/crawlCache.test.js.map +0 -1
- package/dist/src/utils/filesearch/fileSearch.test.d.ts +0 -6
- package/dist/src/utils/filesearch/fileSearch.test.js +0 -654
- package/dist/src/utils/filesearch/fileSearch.test.js.map +0 -1
- package/dist/src/utils/filesearch/ignore.test.d.ts +0 -6
- package/dist/src/utils/filesearch/ignore.test.js +0 -57
- package/dist/src/utils/filesearch/ignore.test.js.map +0 -1
- package/dist/src/utils/filesearch/result-cache.test.d.ts +0 -6
- package/dist/src/utils/filesearch/result-cache.test.js +0 -47
- package/dist/src/utils/filesearch/result-cache.test.js.map +0 -1
- package/dist/src/utils/flashFallback.integration.test.d.ts +0 -6
- package/dist/src/utils/flashFallback.integration.test.js +0 -120
- package/dist/src/utils/flashFallback.integration.test.js.map +0 -1
- package/dist/src/utils/generateContentResponseUtilities.test.d.ts +0 -6
- package/dist/src/utils/generateContentResponseUtilities.test.js +0 -273
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +0 -1
- package/dist/src/utils/getFolderStructure.test.d.ts +0 -6
- package/dist/src/utils/getFolderStructure.test.js +0 -282
- package/dist/src/utils/getFolderStructure.test.js.map +0 -1
- package/dist/src/utils/gitIgnoreParser.test.d.ts +0 -6
- package/dist/src/utils/gitIgnoreParser.test.js +0 -154
- package/dist/src/utils/gitIgnoreParser.test.js.map +0 -1
- package/dist/src/utils/memoryDiscovery.test.d.ts +0 -6
- package/dist/src/utils/memoryDiscovery.test.js +0 -181
- package/dist/src/utils/memoryDiscovery.test.js.map +0 -1
- package/dist/src/utils/memoryImportProcessor.test.d.ts +0 -6
- package/dist/src/utils/memoryImportProcessor.test.js +0 -715
- package/dist/src/utils/memoryImportProcessor.test.js.map +0 -1
- package/dist/src/utils/nextSpeakerChecker.test.d.ts +0 -6
- package/dist/src/utils/nextSpeakerChecker.test.js +0 -172
- package/dist/src/utils/nextSpeakerChecker.test.js.map +0 -1
- package/dist/src/utils/partUtils.test.d.ts +0 -6
- package/dist/src/utils/partUtils.test.js +0 -130
- package/dist/src/utils/partUtils.test.js.map +0 -1
- package/dist/src/utils/paths.test.d.ts +0 -6
- package/dist/src/utils/paths.test.js +0 -153
- package/dist/src/utils/paths.test.js.map +0 -1
- package/dist/src/utils/retry.test.d.ts +0 -6
- package/dist/src/utils/retry.test.js +0 -322
- package/dist/src/utils/retry.test.js.map +0 -1
- package/dist/src/utils/safeJsonStringify.test.d.ts +0 -6
- package/dist/src/utils/safeJsonStringify.test.js +0 -61
- package/dist/src/utils/safeJsonStringify.test.js.map +0 -1
- package/dist/src/utils/sanitization.test.d.ts +0 -6
- package/dist/src/utils/sanitization.test.js +0 -81
- package/dist/src/utils/sanitization.test.js.map +0 -1
- package/dist/src/utils/schemaValidator.test.d.ts +0 -6
- package/dist/src/utils/schemaValidator.test.js +0 -146
- package/dist/src/utils/schemaValidator.test.js.map +0 -1
- package/dist/src/utils/secure-browser-launcher.test.d.ts +0 -6
- package/dist/src/utils/secure-browser-launcher.test.js +0 -149
- package/dist/src/utils/secure-browser-launcher.test.js.map +0 -1
- package/dist/src/utils/shell-utils.shellReplacement.test.d.ts +0 -6
- package/dist/src/utils/shell-utils.shellReplacement.test.js +0 -149
- package/dist/src/utils/shell-utils.shellReplacement.test.js.map +0 -1
- package/dist/src/utils/shell-utils.test.d.ts +0 -6
- package/dist/src/utils/shell-utils.test.js +0 -200
- package/dist/src/utils/shell-utils.test.js.map +0 -1
- package/dist/src/utils/summarizer.test.d.ts +0 -6
- package/dist/src/utils/summarizer.test.js +0 -131
- package/dist/src/utils/summarizer.test.js.map +0 -1
- package/dist/src/utils/systemEncoding.test.d.ts +0 -6
- package/dist/src/utils/systemEncoding.test.js +0 -368
- package/dist/src/utils/systemEncoding.test.js.map +0 -1
- package/dist/src/utils/toolOutputLimiter.test.d.ts +0 -6
- package/dist/src/utils/toolOutputLimiter.test.js +0 -164
- package/dist/src/utils/toolOutputLimiter.test.js.map +0 -1
- package/dist/src/utils/unicodeUtils.test.d.ts +0 -6
- package/dist/src/utils/unicodeUtils.test.js +0 -120
- package/dist/src/utils/unicodeUtils.test.js.map +0 -1
- package/dist/src/utils/user_account.test.d.ts +0 -6
- package/dist/src/utils/user_account.test.js +0 -153
- package/dist/src/utils/user_account.test.js.map +0 -1
- package/dist/src/utils/user_id.test.d.ts +0 -6
- package/dist/src/utils/user_id.test.js +0 -21
- package/dist/src/utils/user_id.test.js.map +0 -1
- package/dist/src/utils/workspaceContext.test.d.ts +0 -6
- package/dist/src/utils/workspaceContext.test.js +0 -209
- package/dist/src/utils/workspaceContext.test.js.map +0 -1
|
@@ -1,644 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { mockControl } from '../__mocks__/fs/promises.js';
|
|
8
|
-
import { ReadManyFilesTool } from './read-many-files.js';
|
|
9
|
-
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
|
|
10
|
-
import path from 'path';
|
|
11
|
-
import fs from 'fs'; // Actual fs for setup
|
|
12
|
-
import os from 'os';
|
|
13
|
-
import { WorkspaceContext } from '../utils/workspaceContext.js';
|
|
14
|
-
vi.mock('mime-types', () => {
|
|
15
|
-
const lookup = (filename) => {
|
|
16
|
-
if (filename.endsWith('.ts') || filename.endsWith('.js')) {
|
|
17
|
-
return 'text/plain';
|
|
18
|
-
}
|
|
19
|
-
if (filename.endsWith('.png')) {
|
|
20
|
-
return 'image/png';
|
|
21
|
-
}
|
|
22
|
-
if (filename.endsWith('.pdf')) {
|
|
23
|
-
return 'application/pdf';
|
|
24
|
-
}
|
|
25
|
-
if (filename.endsWith('.mp3') || filename.endsWith('.wav')) {
|
|
26
|
-
return 'audio/mpeg';
|
|
27
|
-
}
|
|
28
|
-
if (filename.endsWith('.mp4') || filename.endsWith('.mov')) {
|
|
29
|
-
return 'video/mp4';
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
32
|
-
};
|
|
33
|
-
return {
|
|
34
|
-
default: {
|
|
35
|
-
lookup,
|
|
36
|
-
},
|
|
37
|
-
lookup,
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
describe('ReadManyFilesTool', () => {
|
|
41
|
-
let tool;
|
|
42
|
-
let tempRootDir;
|
|
43
|
-
let tempDirOutsideRoot;
|
|
44
|
-
let mockReadFileFn;
|
|
45
|
-
beforeEach(async () => {
|
|
46
|
-
tempRootDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'read-many-files-root-')));
|
|
47
|
-
tempDirOutsideRoot = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'read-many-files-external-')));
|
|
48
|
-
fs.writeFileSync(path.join(tempRootDir, '.llxprtignore'), 'foo.*');
|
|
49
|
-
const fileService = new FileDiscoveryService(tempRootDir);
|
|
50
|
-
const mockConfig = {
|
|
51
|
-
getFileService: () => fileService,
|
|
52
|
-
getFileFilteringOptions: () => ({
|
|
53
|
-
respectGitIgnore: true,
|
|
54
|
-
respectLlxprtIgnore: true,
|
|
55
|
-
}),
|
|
56
|
-
getTargetDir: () => tempRootDir,
|
|
57
|
-
getWorkspaceDirs: () => [tempRootDir],
|
|
58
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
59
|
-
getEphemeralSettings: () => ({}), // Return empty settings for default behavior
|
|
60
|
-
};
|
|
61
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
62
|
-
mockReadFileFn = mockControl.mockReadFile;
|
|
63
|
-
mockReadFileFn.mockReset();
|
|
64
|
-
mockReadFileFn.mockImplementation(async (filePath, options) => {
|
|
65
|
-
const fp = typeof filePath === 'string'
|
|
66
|
-
? filePath
|
|
67
|
-
: filePath.toString();
|
|
68
|
-
if (fs.existsSync(fp)) {
|
|
69
|
-
const originalFs = await vi.importActual('fs');
|
|
70
|
-
return originalFs.promises.readFile(fp, options);
|
|
71
|
-
}
|
|
72
|
-
if (fp.endsWith('nonexistent-file.txt')) {
|
|
73
|
-
const err = new Error(`ENOENT: no such file or directory, open '${fp}'`);
|
|
74
|
-
err.code = 'ENOENT';
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
if (fp.endsWith('unreadable.txt')) {
|
|
78
|
-
const err = new Error(`EACCES: permission denied, open '${fp}'`);
|
|
79
|
-
err.code = 'EACCES';
|
|
80
|
-
throw err;
|
|
81
|
-
}
|
|
82
|
-
if (fp.endsWith('.png'))
|
|
83
|
-
return Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); // PNG header
|
|
84
|
-
if (fp.endsWith('.pdf'))
|
|
85
|
-
return Buffer.from('%PDF-1.4...'); // PDF start
|
|
86
|
-
if (fp.endsWith('binary.bin'))
|
|
87
|
-
return Buffer.from([0x00, 0x01, 0x02, 0x00, 0x03]);
|
|
88
|
-
const err = new Error(`ENOENT: no such file or directory, open '${fp}' (unmocked path)`);
|
|
89
|
-
err.code = 'ENOENT';
|
|
90
|
-
throw err;
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
afterEach(() => {
|
|
94
|
-
if (fs.existsSync(tempRootDir)) {
|
|
95
|
-
fs.rmSync(tempRootDir, { recursive: true, force: true });
|
|
96
|
-
}
|
|
97
|
-
if (fs.existsSync(tempDirOutsideRoot)) {
|
|
98
|
-
fs.rmSync(tempDirOutsideRoot, { recursive: true, force: true });
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
describe('validateParams', () => {
|
|
102
|
-
it('should return null for valid relative paths within root', () => {
|
|
103
|
-
const params = { paths: ['file1.txt', 'subdir/file2.txt'] };
|
|
104
|
-
expect(tool.validateParams(params)).toBeNull();
|
|
105
|
-
});
|
|
106
|
-
it('should return null for valid glob patterns within root', () => {
|
|
107
|
-
const params = { paths: ['*.txt', 'subdir/**/*.js'] };
|
|
108
|
-
expect(tool.validateParams(params)).toBeNull();
|
|
109
|
-
});
|
|
110
|
-
it('should return null for paths trying to escape the root (e.g., ../) as execute handles this', () => {
|
|
111
|
-
const params = { paths: ['../outside.txt'] };
|
|
112
|
-
expect(tool.validateParams(params)).toBeNull();
|
|
113
|
-
});
|
|
114
|
-
it('should return null for absolute paths as execute handles this', () => {
|
|
115
|
-
const params = { paths: [path.join(tempDirOutsideRoot, 'absolute.txt')] };
|
|
116
|
-
expect(tool.validateParams(params)).toBeNull();
|
|
117
|
-
});
|
|
118
|
-
it('should return error if paths array is empty', () => {
|
|
119
|
-
const params = { paths: [] };
|
|
120
|
-
expect(tool.validateParams(params)).toBe('params/paths must NOT have fewer than 1 items');
|
|
121
|
-
});
|
|
122
|
-
it('should return null for valid exclude and include patterns', () => {
|
|
123
|
-
const params = {
|
|
124
|
-
paths: ['src/**/*.ts'],
|
|
125
|
-
exclude: ['**/*.test.ts'],
|
|
126
|
-
include: ['src/utils/*.ts'],
|
|
127
|
-
};
|
|
128
|
-
expect(tool.validateParams(params)).toBeNull();
|
|
129
|
-
});
|
|
130
|
-
it('should return error if paths array contains an empty string', () => {
|
|
131
|
-
const params = { paths: ['file1.txt', ''] };
|
|
132
|
-
expect(tool.validateParams(params)).toBe('params/paths/1 must NOT have fewer than 1 characters');
|
|
133
|
-
});
|
|
134
|
-
it('should return error if include array contains non-string elements', () => {
|
|
135
|
-
const params = {
|
|
136
|
-
paths: ['file1.txt'],
|
|
137
|
-
include: ['*.ts', 123],
|
|
138
|
-
};
|
|
139
|
-
expect(tool.validateParams(params)).toBe('params/include/1 must be string');
|
|
140
|
-
});
|
|
141
|
-
it('should return error if exclude array contains non-string elements', () => {
|
|
142
|
-
const params = {
|
|
143
|
-
paths: ['file1.txt'],
|
|
144
|
-
exclude: ['*.log', {}],
|
|
145
|
-
};
|
|
146
|
-
expect(tool.validateParams(params)).toBe('params/exclude/1 must be string');
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
describe('execute', () => {
|
|
150
|
-
const createFile = (filePath, content = '') => {
|
|
151
|
-
const fullPath = path.join(tempRootDir, filePath);
|
|
152
|
-
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
153
|
-
fs.writeFileSync(fullPath, content);
|
|
154
|
-
};
|
|
155
|
-
const createBinaryFile = (filePath, data) => {
|
|
156
|
-
const fullPath = path.join(tempRootDir, filePath);
|
|
157
|
-
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
158
|
-
fs.writeFileSync(fullPath, data);
|
|
159
|
-
};
|
|
160
|
-
it('should read a single specified file', async () => {
|
|
161
|
-
createFile('file1.txt', 'Content of file1');
|
|
162
|
-
const params = { paths: ['file1.txt'] };
|
|
163
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
164
|
-
const expectedPath = path.join(tempRootDir, 'file1.txt');
|
|
165
|
-
expect(result.llmContent).toEqual([
|
|
166
|
-
`--- ${expectedPath} ---\n\nContent of file1\n\n`,
|
|
167
|
-
]);
|
|
168
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **1 file(s)**');
|
|
169
|
-
});
|
|
170
|
-
it('should read multiple specified files', async () => {
|
|
171
|
-
createFile('file1.txt', 'Content1');
|
|
172
|
-
createFile('subdir/file2.js', 'Content2');
|
|
173
|
-
const params = { paths: ['file1.txt', 'subdir/file2.js'] };
|
|
174
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
175
|
-
const content = result.llmContent;
|
|
176
|
-
const expectedPath1 = path.join(tempRootDir, 'file1.txt');
|
|
177
|
-
const expectedPath2 = path.join(tempRootDir, 'subdir/file2.js');
|
|
178
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath1} ---\n\nContent1\n\n`))).toBe(true);
|
|
179
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath2} ---\n\nContent2\n\n`))).toBe(true);
|
|
180
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
181
|
-
});
|
|
182
|
-
it('should handle glob patterns', async () => {
|
|
183
|
-
createFile('file.txt', 'Text file');
|
|
184
|
-
createFile('another.txt', 'Another text');
|
|
185
|
-
createFile('sub/data.json', '{}');
|
|
186
|
-
const params = { paths: ['*.txt'] };
|
|
187
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
188
|
-
const content = result.llmContent;
|
|
189
|
-
const expectedPath1 = path.join(tempRootDir, 'file.txt');
|
|
190
|
-
const expectedPath2 = path.join(tempRootDir, 'another.txt');
|
|
191
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath1} ---\n\nText file\n\n`))).toBe(true);
|
|
192
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath2} ---\n\nAnother text\n\n`))).toBe(true);
|
|
193
|
-
expect(content.find((c) => c.includes('sub/data.json'))).toBeUndefined();
|
|
194
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
195
|
-
});
|
|
196
|
-
it('should respect exclude patterns', async () => {
|
|
197
|
-
createFile('src/main.ts', 'Main content');
|
|
198
|
-
createFile('src/main.test.ts', 'Test content');
|
|
199
|
-
const params = { paths: ['src/**/*.ts'], exclude: ['**/*.test.ts'] };
|
|
200
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
201
|
-
const content = result.llmContent;
|
|
202
|
-
const expectedPath = path.join(tempRootDir, 'src/main.ts');
|
|
203
|
-
expect(content).toEqual([`--- ${expectedPath} ---\n\nMain content\n\n`]);
|
|
204
|
-
expect(content.find((c) => c.includes('src/main.test.ts'))).toBeUndefined();
|
|
205
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **1 file(s)**');
|
|
206
|
-
});
|
|
207
|
-
it('should handle nonexistent specific files gracefully', async () => {
|
|
208
|
-
const params = { paths: ['nonexistent-file.txt'] };
|
|
209
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
210
|
-
expect(result.llmContent).toEqual([
|
|
211
|
-
'No files matching the criteria were found or all were skipped.',
|
|
212
|
-
]);
|
|
213
|
-
expect(result.returnDisplay).toContain('No files were read and concatenated based on the criteria.');
|
|
214
|
-
});
|
|
215
|
-
it('should use default excludes', async () => {
|
|
216
|
-
createFile('node_modules/some-lib/index.js', 'lib code');
|
|
217
|
-
createFile('src/app.js', 'app code');
|
|
218
|
-
const params = { paths: ['**/*.js'] };
|
|
219
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
220
|
-
const content = result.llmContent;
|
|
221
|
-
const expectedPath = path.join(tempRootDir, 'src/app.js');
|
|
222
|
-
expect(content).toEqual([`--- ${expectedPath} ---\n\napp code\n\n`]);
|
|
223
|
-
expect(content.find((c) => c.includes('node_modules/some-lib/index.js'))).toBeUndefined();
|
|
224
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **1 file(s)**');
|
|
225
|
-
});
|
|
226
|
-
it('should NOT use default excludes if useDefaultExcludes is false', async () => {
|
|
227
|
-
createFile('node_modules/some-lib/index.js', 'lib code');
|
|
228
|
-
createFile('src/app.js', 'app code');
|
|
229
|
-
const params = { paths: ['**/*.js'], useDefaultExcludes: false };
|
|
230
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
231
|
-
const content = result.llmContent;
|
|
232
|
-
const expectedPath1 = path.join(tempRootDir, 'node_modules/some-lib/index.js');
|
|
233
|
-
const expectedPath2 = path.join(tempRootDir, 'src/app.js');
|
|
234
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath1} ---\n\nlib code\n\n`))).toBe(true);
|
|
235
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath2} ---\n\napp code\n\n`))).toBe(true);
|
|
236
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
237
|
-
});
|
|
238
|
-
it('should include images as inlineData parts if explicitly requested by extension', async () => {
|
|
239
|
-
createBinaryFile('image.png', Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]));
|
|
240
|
-
const params = { paths: ['*.png'] }; // Explicitly requesting .png
|
|
241
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
242
|
-
expect(result.llmContent).toEqual([
|
|
243
|
-
{
|
|
244
|
-
inlineData: {
|
|
245
|
-
data: Buffer.from([
|
|
246
|
-
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
|
|
247
|
-
]).toString('base64'),
|
|
248
|
-
mimeType: 'image/png',
|
|
249
|
-
},
|
|
250
|
-
},
|
|
251
|
-
]);
|
|
252
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **1 file(s)**');
|
|
253
|
-
});
|
|
254
|
-
it('should include images as inlineData parts if explicitly requested by name', async () => {
|
|
255
|
-
createBinaryFile('myExactImage.png', Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]));
|
|
256
|
-
const params = { paths: ['myExactImage.png'] }; // Explicitly requesting by full name
|
|
257
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
258
|
-
expect(result.llmContent).toEqual([
|
|
259
|
-
{
|
|
260
|
-
inlineData: {
|
|
261
|
-
data: Buffer.from([
|
|
262
|
-
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
|
|
263
|
-
]).toString('base64'),
|
|
264
|
-
mimeType: 'image/png',
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
]);
|
|
268
|
-
});
|
|
269
|
-
it('should skip PDF files if not explicitly requested by extension or name', async () => {
|
|
270
|
-
createBinaryFile('document.pdf', Buffer.from('%PDF-1.4...'));
|
|
271
|
-
createFile('notes.txt', 'text notes');
|
|
272
|
-
const params = { paths: ['*'] }; // Generic glob, not specific to .pdf
|
|
273
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
274
|
-
const content = result.llmContent;
|
|
275
|
-
const expectedPath = path.join(tempRootDir, 'notes.txt');
|
|
276
|
-
expect(content.some((c) => typeof c === 'string' &&
|
|
277
|
-
c.includes(`--- ${expectedPath} ---\n\ntext notes\n\n`))).toBe(true);
|
|
278
|
-
expect(result.returnDisplay).toContain('**Skipped 1 item(s):**');
|
|
279
|
-
expect(result.returnDisplay).toContain('- `document.pdf` (Reason: asset file (image/pdf) was not explicitly requested by name or extension)');
|
|
280
|
-
});
|
|
281
|
-
it('should include PDF files as inlineData parts if explicitly requested by extension', async () => {
|
|
282
|
-
createBinaryFile('important.pdf', Buffer.from('%PDF-1.4...'));
|
|
283
|
-
const params = { paths: ['*.pdf'] }; // Explicitly requesting .pdf files
|
|
284
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
285
|
-
expect(result.llmContent).toEqual([
|
|
286
|
-
{
|
|
287
|
-
inlineData: {
|
|
288
|
-
data: Buffer.from('%PDF-1.4...').toString('base64'),
|
|
289
|
-
mimeType: 'application/pdf',
|
|
290
|
-
},
|
|
291
|
-
},
|
|
292
|
-
]);
|
|
293
|
-
});
|
|
294
|
-
it('should include PDF files as inlineData parts if explicitly requested by name', async () => {
|
|
295
|
-
createBinaryFile('report-final.pdf', Buffer.from('%PDF-1.4...'));
|
|
296
|
-
const params = { paths: ['report-final.pdf'] };
|
|
297
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
298
|
-
expect(result.llmContent).toEqual([
|
|
299
|
-
{
|
|
300
|
-
inlineData: {
|
|
301
|
-
data: Buffer.from('%PDF-1.4...').toString('base64'),
|
|
302
|
-
mimeType: 'application/pdf',
|
|
303
|
-
},
|
|
304
|
-
},
|
|
305
|
-
]);
|
|
306
|
-
});
|
|
307
|
-
it('should return error if path is ignored by a .llxprtignore pattern', async () => {
|
|
308
|
-
createFile('foo.bar', '');
|
|
309
|
-
createFile('bar.ts', '');
|
|
310
|
-
createFile('foo.quux', '');
|
|
311
|
-
const params = { paths: ['foo.bar', 'bar.ts', 'foo.quux'] };
|
|
312
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
313
|
-
expect(result.returnDisplay).not.toContain('foo.bar');
|
|
314
|
-
expect(result.returnDisplay).not.toContain('foo.quux');
|
|
315
|
-
expect(result.returnDisplay).toContain('bar.ts');
|
|
316
|
-
});
|
|
317
|
-
it('should read files from multiple workspace directories', async () => {
|
|
318
|
-
const tempDir1 = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'multi-dir-1-')));
|
|
319
|
-
const tempDir2 = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'multi-dir-2-')));
|
|
320
|
-
const fileService = new FileDiscoveryService(tempDir1);
|
|
321
|
-
const mockConfig = {
|
|
322
|
-
getFileService: () => fileService,
|
|
323
|
-
getFileFilteringOptions: () => ({
|
|
324
|
-
respectGitIgnore: true,
|
|
325
|
-
respectLlxprtIgnore: true,
|
|
326
|
-
}),
|
|
327
|
-
getWorkspaceContext: () => new WorkspaceContext(tempDir1, [tempDir2]),
|
|
328
|
-
getTargetDir: () => tempDir1,
|
|
329
|
-
getEphemeralSettings: () => ({}), // Return empty settings for default behavior
|
|
330
|
-
};
|
|
331
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
332
|
-
fs.writeFileSync(path.join(tempDir1, 'file1.txt'), 'Content1');
|
|
333
|
-
fs.writeFileSync(path.join(tempDir2, 'file2.txt'), 'Content2');
|
|
334
|
-
const params = { paths: ['*.txt'] };
|
|
335
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
336
|
-
const content = result.llmContent;
|
|
337
|
-
if (!Array.isArray(content)) {
|
|
338
|
-
throw new Error(`llmContent is not an array: ${content}`);
|
|
339
|
-
}
|
|
340
|
-
const expectedPath1 = path.join(tempDir1, 'file1.txt');
|
|
341
|
-
const expectedPath2 = path.join(tempDir2, 'file2.txt');
|
|
342
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath1} ---\n\nContent1\n\n`))).toBe(true);
|
|
343
|
-
expect(content.some((c) => c.includes(`--- ${expectedPath2} ---\n\nContent2\n\n`))).toBe(true);
|
|
344
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
345
|
-
fs.rmSync(tempDir1, { recursive: true, force: true });
|
|
346
|
-
fs.rmSync(tempDir2, { recursive: true, force: true });
|
|
347
|
-
});
|
|
348
|
-
it('should add a warning for truncated files', async () => {
|
|
349
|
-
createFile('file1.txt', 'Content1');
|
|
350
|
-
// Create a file that will be "truncated" by making it long
|
|
351
|
-
const longContent = Array.from({ length: 2500 }, (_, i) => `L${i}`).join('\n');
|
|
352
|
-
createFile('large-file.txt', longContent);
|
|
353
|
-
const params = { paths: ['*.txt'] };
|
|
354
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
355
|
-
const content = result.llmContent;
|
|
356
|
-
const normalFileContent = content.find((c) => c.includes('file1.txt'));
|
|
357
|
-
const truncatedFileContent = content.find((c) => c.includes('large-file.txt'));
|
|
358
|
-
expect(normalFileContent).not.toContain('[WARNING: This file was truncated.');
|
|
359
|
-
expect(truncatedFileContent).toContain("[WARNING: This file was truncated. To view the full content, use the 'read_file' tool on this specific file.]");
|
|
360
|
-
// Check that the actual content is still there but truncated
|
|
361
|
-
expect(truncatedFileContent).toContain('L200');
|
|
362
|
-
expect(truncatedFileContent).not.toContain('L2400');
|
|
363
|
-
});
|
|
364
|
-
});
|
|
365
|
-
describe('limits functionality', () => {
|
|
366
|
-
const createFile = (filePath, content = '') => {
|
|
367
|
-
const fullPath = path.join(tempRootDir, filePath);
|
|
368
|
-
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
369
|
-
fs.writeFileSync(fullPath, content);
|
|
370
|
-
};
|
|
371
|
-
describe('file count limits', () => {
|
|
372
|
-
it('should warn and stop when exceeding file count limit in warn mode', async () => {
|
|
373
|
-
// Create 60 files (limit is 50 by default)
|
|
374
|
-
for (let i = 1; i <= 60; i++) {
|
|
375
|
-
createFile(`file${i}.txt`, `Content of file ${i}`);
|
|
376
|
-
}
|
|
377
|
-
const mockConfig = {
|
|
378
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
379
|
-
getFileFilteringOptions: () => ({
|
|
380
|
-
respectGitIgnore: true,
|
|
381
|
-
respectLlxprtIgnore: true,
|
|
382
|
-
}),
|
|
383
|
-
getTargetDir: () => tempRootDir,
|
|
384
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
385
|
-
getEphemeralSettings: () => ({
|
|
386
|
-
'tool-output-max-items': 50,
|
|
387
|
-
'tool-output-truncate-mode': 'warn',
|
|
388
|
-
}),
|
|
389
|
-
};
|
|
390
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
391
|
-
const params = { paths: ['*.txt'] };
|
|
392
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
393
|
-
expect(result.llmContent).toBe('Found 60 files matching your pattern, but limiting to 50 files. Please use more specific patterns to narrow your search.');
|
|
394
|
-
expect(result.returnDisplay).toContain('## File Count Limit Exceeded');
|
|
395
|
-
expect(result.returnDisplay).toContain('**Matched files:** 60');
|
|
396
|
-
expect(result.returnDisplay).toContain('**Limit:** 50');
|
|
397
|
-
});
|
|
398
|
-
it('should truncate files when exceeding limit in truncate mode', async () => {
|
|
399
|
-
// Create 10 files
|
|
400
|
-
for (let i = 1; i <= 10; i++) {
|
|
401
|
-
createFile(`file${i}.txt`, `Content of file ${i}`);
|
|
402
|
-
}
|
|
403
|
-
const mockConfig = {
|
|
404
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
405
|
-
getFileFilteringOptions: () => ({
|
|
406
|
-
respectGitIgnore: true,
|
|
407
|
-
respectLlxprtIgnore: true,
|
|
408
|
-
}),
|
|
409
|
-
getTargetDir: () => tempRootDir,
|
|
410
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
411
|
-
getEphemeralSettings: () => ({
|
|
412
|
-
'tool-output-max-items': 5,
|
|
413
|
-
'tool-output-truncate-mode': 'truncate',
|
|
414
|
-
}),
|
|
415
|
-
};
|
|
416
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
417
|
-
const params = { paths: ['*.txt'] };
|
|
418
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
419
|
-
const content = result.llmContent;
|
|
420
|
-
expect(content.length).toBe(5); // Only 5 files processed
|
|
421
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **5 file(s)**');
|
|
422
|
-
expect(result.returnDisplay).toContain('**Skipped 1 item(s):**');
|
|
423
|
-
expect(result.returnDisplay).toContain('`5 file(s)` (Reason: truncated to stay within 5 file limit)');
|
|
424
|
-
});
|
|
425
|
-
it('should sample files evenly when exceeding limit in sample mode', async () => {
|
|
426
|
-
// Create 20 files
|
|
427
|
-
for (let i = 1; i <= 20; i++) {
|
|
428
|
-
createFile(`file${i.toString().padStart(2, '0')}.txt`, `Content of file ${i}`);
|
|
429
|
-
}
|
|
430
|
-
const mockConfig = {
|
|
431
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
432
|
-
getFileFilteringOptions: () => ({
|
|
433
|
-
respectGitIgnore: true,
|
|
434
|
-
respectLlxprtIgnore: true,
|
|
435
|
-
}),
|
|
436
|
-
getTargetDir: () => tempRootDir,
|
|
437
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
438
|
-
getEphemeralSettings: () => ({
|
|
439
|
-
'tool-output-max-items': 5,
|
|
440
|
-
'tool-output-truncate-mode': 'sample',
|
|
441
|
-
}),
|
|
442
|
-
};
|
|
443
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
444
|
-
const params = { paths: ['*.txt'] };
|
|
445
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
446
|
-
const content = result.llmContent;
|
|
447
|
-
expect(content.length).toBe(5); // Only 5 files processed
|
|
448
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **5 file(s)**');
|
|
449
|
-
expect(result.returnDisplay).toContain('**Skipped 1 item(s):**');
|
|
450
|
-
expect(result.returnDisplay).toContain('`15 file(s)` (Reason: sampling to stay within 5 file limit)');
|
|
451
|
-
// Check that we sampled evenly (should get files 1, 5, 9, 13, 17 approximately)
|
|
452
|
-
const processedFiles = result.returnDisplay.match(/file\d+\.txt/g) || [];
|
|
453
|
-
expect(processedFiles.length).toBe(5);
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
describe('token limits', () => {
|
|
457
|
-
it('should warn and stop when exceeding token limit in warn mode', async () => {
|
|
458
|
-
// Create files with enough content to exceed token limit
|
|
459
|
-
createFile('file1.txt', 'a'.repeat(1000)); // ~250 tokens
|
|
460
|
-
createFile('file2.txt', 'b'.repeat(1000)); // ~250 tokens
|
|
461
|
-
createFile('file3.txt', 'c'.repeat(1000)); // ~250 tokens
|
|
462
|
-
createFile('file4.txt', 'd'.repeat(1000)); // ~250 tokens
|
|
463
|
-
const mockConfig = {
|
|
464
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
465
|
-
getFileFilteringOptions: () => ({
|
|
466
|
-
respectGitIgnore: true,
|
|
467
|
-
respectLlxprtIgnore: true,
|
|
468
|
-
}),
|
|
469
|
-
getTargetDir: () => tempRootDir,
|
|
470
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
471
|
-
getEphemeralSettings: () => ({
|
|
472
|
-
'tool-output-max-tokens': 500, // Very low token limit
|
|
473
|
-
'tool-output-truncate-mode': 'warn',
|
|
474
|
-
}),
|
|
475
|
-
};
|
|
476
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
477
|
-
const params = { paths: ['*.txt'] };
|
|
478
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
479
|
-
const content = result.llmContent;
|
|
480
|
-
expect(content.length).toBeLessThan(4); // Should stop before processing all files
|
|
481
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from');
|
|
482
|
-
expect(result.returnDisplay).toContain('**Skipped');
|
|
483
|
-
expect(result.returnDisplay).toContain('would exceed token limit of 500');
|
|
484
|
-
});
|
|
485
|
-
it('should truncate content when exceeding token limit in truncate mode', async () => {
|
|
486
|
-
// Create a file with long content
|
|
487
|
-
const longContent = 'This is a very long content. '.repeat(200); // ~1600 tokens
|
|
488
|
-
createFile('file1.txt', longContent);
|
|
489
|
-
createFile('file2.txt', 'Short content');
|
|
490
|
-
const mockConfig = {
|
|
491
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
492
|
-
getFileFilteringOptions: () => ({
|
|
493
|
-
respectGitIgnore: true,
|
|
494
|
-
respectLlxprtIgnore: true,
|
|
495
|
-
}),
|
|
496
|
-
getTargetDir: () => tempRootDir,
|
|
497
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
498
|
-
getEphemeralSettings: () => ({
|
|
499
|
-
'tool-output-max-tokens': 500,
|
|
500
|
-
'tool-output-truncate-mode': 'truncate',
|
|
501
|
-
}),
|
|
502
|
-
};
|
|
503
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
504
|
-
const params = { paths: ['*.txt'] };
|
|
505
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
506
|
-
const content = result.llmContent;
|
|
507
|
-
expect(content.some((c) => c.includes('[CONTENT TRUNCATED DUE TO TOKEN LIMIT]'))).toBe(true);
|
|
508
|
-
expect(result.returnDisplay).toContain('content truncated to fit token limit');
|
|
509
|
-
});
|
|
510
|
-
it('should skip files when exceeding token limit in sample mode', async () => {
|
|
511
|
-
// Create multiple files
|
|
512
|
-
for (let i = 1; i <= 5; i++) {
|
|
513
|
-
createFile(`file${i}.txt`, 'Content '.repeat(200)); // ~400 tokens each
|
|
514
|
-
}
|
|
515
|
-
const mockConfig = {
|
|
516
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
517
|
-
getFileFilteringOptions: () => ({
|
|
518
|
-
respectGitIgnore: true,
|
|
519
|
-
respectLlxprtIgnore: true,
|
|
520
|
-
}),
|
|
521
|
-
getTargetDir: () => tempRootDir,
|
|
522
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
523
|
-
getEphemeralSettings: () => ({
|
|
524
|
-
'tool-output-max-tokens': 1000,
|
|
525
|
-
'tool-output-truncate-mode': 'sample',
|
|
526
|
-
}),
|
|
527
|
-
};
|
|
528
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
529
|
-
const params = { paths: ['*.txt'] };
|
|
530
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
531
|
-
expect(result.returnDisplay).toContain('skipped to stay within token limit');
|
|
532
|
-
const content = result.llmContent;
|
|
533
|
-
// Should have processed some files but not all
|
|
534
|
-
expect(content.length).toBeGreaterThan(0);
|
|
535
|
-
expect(content.length).toBeLessThan(5);
|
|
536
|
-
});
|
|
537
|
-
});
|
|
538
|
-
describe('file size limits', () => {
|
|
539
|
-
it('should skip files exceeding size limit', async () => {
|
|
540
|
-
// Create a small file and a large file
|
|
541
|
-
createFile('small.txt', 'Small content');
|
|
542
|
-
const largeContent = 'x'.repeat(600 * 1024); // 600KB
|
|
543
|
-
createFile('large.txt', largeContent);
|
|
544
|
-
const mockConfig = {
|
|
545
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
546
|
-
getFileFilteringOptions: () => ({
|
|
547
|
-
respectGitIgnore: true,
|
|
548
|
-
respectLlxprtIgnore: true,
|
|
549
|
-
}),
|
|
550
|
-
getTargetDir: () => tempRootDir,
|
|
551
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
552
|
-
getEphemeralSettings: () => ({
|
|
553
|
-
'tool-output-item-size-limit': 524288, // 512KB
|
|
554
|
-
}),
|
|
555
|
-
};
|
|
556
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
557
|
-
const params = { paths: ['*.txt'] };
|
|
558
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
559
|
-
const content = result.llmContent;
|
|
560
|
-
expect(content.length).toBe(1); // Only small file processed
|
|
561
|
-
expect(content[0]).toContain('Small content');
|
|
562
|
-
expect(result.returnDisplay).toContain('file size (600KB) exceeds limit (512KB)');
|
|
563
|
-
});
|
|
564
|
-
it('should respect custom file size limit from ephemeral settings', async () => {
|
|
565
|
-
// Create files of various sizes
|
|
566
|
-
createFile('tiny.txt', 'x'.repeat(10));
|
|
567
|
-
createFile('medium.txt', 'x'.repeat(200 * 1024)); // 200KB
|
|
568
|
-
createFile('large.txt', 'x'.repeat(300 * 1024)); // 300KB
|
|
569
|
-
const mockConfig = {
|
|
570
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
571
|
-
getFileFilteringOptions: () => ({
|
|
572
|
-
respectGitIgnore: true,
|
|
573
|
-
respectLlxprtIgnore: true,
|
|
574
|
-
}),
|
|
575
|
-
getTargetDir: () => tempRootDir,
|
|
576
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
577
|
-
getEphemeralSettings: () => ({
|
|
578
|
-
'tool-output-item-size-limit': 256 * 1024, // 256KB
|
|
579
|
-
}),
|
|
580
|
-
};
|
|
581
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
582
|
-
const params = { paths: ['*.txt'] };
|
|
583
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
584
|
-
expect(result.returnDisplay).toContain('Successfully read and concatenated content from **2 file(s)**');
|
|
585
|
-
expect(result.returnDisplay).toContain('file size (300KB) exceeds limit (256KB)');
|
|
586
|
-
});
|
|
587
|
-
});
|
|
588
|
-
describe('combined limits', () => {
|
|
589
|
-
it('should handle multiple limits simultaneously', async () => {
|
|
590
|
-
// Create many files with varying sizes
|
|
591
|
-
for (let i = 1; i <= 10; i++) {
|
|
592
|
-
const content = 'x'.repeat(i * 100); // Increasing sizes
|
|
593
|
-
createFile(`file${i}.txt`, content);
|
|
594
|
-
}
|
|
595
|
-
const mockConfig = {
|
|
596
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
597
|
-
getFileFilteringOptions: () => ({
|
|
598
|
-
respectGitIgnore: true,
|
|
599
|
-
respectLlxprtIgnore: true,
|
|
600
|
-
}),
|
|
601
|
-
getTargetDir: () => tempRootDir,
|
|
602
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
603
|
-
getEphemeralSettings: () => ({
|
|
604
|
-
'tool-output-max-items': 5,
|
|
605
|
-
'tool-output-max-tokens': 500,
|
|
606
|
-
'tool-output-item-size-limit': 512,
|
|
607
|
-
'tool-output-truncate-mode': 'sample',
|
|
608
|
-
}),
|
|
609
|
-
};
|
|
610
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
611
|
-
const params = { paths: ['*.txt'] };
|
|
612
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
613
|
-
// Should be limited by multiple factors
|
|
614
|
-
const content = result.llmContent;
|
|
615
|
-
expect(content.length).toBeLessThanOrEqual(5); // File count limit
|
|
616
|
-
expect(result.returnDisplay).toMatch(/Successfully read and concatenated content from \*\*\d+ file\(s\)\*\*/);
|
|
617
|
-
});
|
|
618
|
-
});
|
|
619
|
-
describe('default values', () => {
|
|
620
|
-
it('should use default limits when ephemeral settings are not provided', async () => {
|
|
621
|
-
// Create 55 files (default limit is 50)
|
|
622
|
-
for (let i = 1; i <= 55; i++) {
|
|
623
|
-
createFile(`file${i}.txt`, `Content ${i}`);
|
|
624
|
-
}
|
|
625
|
-
const mockConfig = {
|
|
626
|
-
getFileService: () => new FileDiscoveryService(tempRootDir),
|
|
627
|
-
getFileFilteringOptions: () => ({
|
|
628
|
-
respectGitIgnore: true,
|
|
629
|
-
respectLlxprtIgnore: true,
|
|
630
|
-
}),
|
|
631
|
-
getTargetDir: () => tempRootDir,
|
|
632
|
-
getWorkspaceContext: () => new WorkspaceContext(tempRootDir),
|
|
633
|
-
getEphemeralSettings: () => ({}), // Empty settings
|
|
634
|
-
};
|
|
635
|
-
tool = new ReadManyFilesTool(mockConfig);
|
|
636
|
-
const params = { paths: ['*.txt'] };
|
|
637
|
-
const result = await tool.execute(params, new AbortController().signal);
|
|
638
|
-
// Should use default warn mode and stop at 50 files
|
|
639
|
-
expect(result.llmContent).toContain('Found 55 files matching your pattern, but limiting to 50 files');
|
|
640
|
-
});
|
|
641
|
-
});
|
|
642
|
-
});
|
|
643
|
-
});
|
|
644
|
-
//# sourceMappingURL=read-many-files.test.js.map
|