@vybestack/llxprt-code-core 0.1.14 → 0.1.16
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 +90 -2
- package/dist/src/code_assist/converter.d.ts +2 -1
- package/dist/src/code_assist/converter.js +2 -1
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js +13 -10
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.d.ts +1 -1
- package/dist/src/code_assist/oauth2.test.js +15 -15
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +2 -2
- package/dist/src/code_assist/server.js +4 -4
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +9 -9
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.js +1 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +2 -2
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +37 -5
- package/dist/src/config/config.js +85 -15
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +33 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +23 -47
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -0
- package/dist/src/config/models.js +1 -0
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/profileManager.d.ts +42 -0
- package/dist/src/config/profileManager.js +114 -0
- package/dist/src/config/profileManager.js.map +1 -0
- package/dist/src/core/client.d.ts +15 -1
- package/dist/src/core/client.js +161 -45
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +291 -42
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +2 -2
- package/dist/src/core/contentGenerator.js +2 -7
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +6 -2
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +1 -3
- package/dist/src/core/coreToolScheduler.js +48 -19
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +90 -18
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +35 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +2 -2
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/googleGenAIWrapper.d.ts +21 -0
- package/dist/src/core/googleGenAIWrapper.js +36 -0
- package/dist/src/core/googleGenAIWrapper.js.map +1 -0
- package/dist/src/core/googleGenAIWrapper.test.d.ts +6 -0
- package/dist/src/core/googleGenAIWrapper.test.js +104 -0
- package/dist/src/core/googleGenAIWrapper.test.js.map +1 -0
- package/dist/src/core/logger.d.ts +1 -0
- package/dist/src/core/logger.js +22 -8
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +60 -9
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +19 -4
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -3
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts-async.test.d.ts +6 -0
- package/dist/src/core/prompts-async.test.js +115 -0
- package/dist/src/core/prompts-async.test.js.map +1 -0
- package/dist/src/core/prompts.d.ts +8 -1
- package/dist/src/core/prompts.js +97 -377
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +46 -192
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/tokenLimits.d.ts +1 -1
- package/dist/src/core/tokenLimits.js +6 -1
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/turn.d.ts +5 -1
- package/dist/src/core/turn.js +7 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +2 -2
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +10 -0
- package/dist/src/ide/detect-ide.js +24 -0
- package/dist/src/ide/detect-ide.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +19 -7
- package/dist/src/ide/ide-client.js +110 -37
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.d.ts +15 -0
- package/dist/src/ide/ide-installer.js +111 -0
- package/dist/src/ide/ide-installer.js.map +1 -0
- package/dist/src/ide/ide-installer.test.d.ts +6 -0
- package/dist/src/ide/ide-installer.test.js +78 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +212 -107
- package/dist/src/ide/ideContext.js +45 -44
- package/dist/src/ide/ideContext.js.map +1 -1
- package/dist/src/ide/ideContext.test.js +254 -100
- package/dist/src/ide/ideContext.test.js.map +1 -1
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/{providers/IProviderConfig.js → integration-tests/todo-system.test.d.ts} +0 -1
- package/dist/src/integration-tests/todo-system.test.js +610 -0
- package/dist/src/integration-tests/todo-system.test.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +5 -1
- package/dist/src/mcp/oauth-provider.js +39 -14
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +11 -10
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
- package/dist/src/mcp/oauth-token-storage.js +3 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-utils.js +2 -2
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +1 -1
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/parsers/TextToolCallParser.d.ts +1 -0
- package/dist/src/parsers/TextToolCallParser.js +45 -3
- package/dist/src/parsers/TextToolCallParser.js.map +1 -1
- package/dist/src/parsers/TextToolCallParser.multibyte.test.d.ts +1 -0
- package/dist/src/parsers/TextToolCallParser.multibyte.test.js +42 -0
- package/dist/src/parsers/TextToolCallParser.multibyte.test.js.map +1 -0
- package/dist/src/prompt-config/TemplateEngine.d.ts +35 -0
- package/dist/src/prompt-config/TemplateEngine.js +149 -0
- package/dist/src/prompt-config/TemplateEngine.js.map +1 -0
- package/dist/src/prompt-config/TemplateEngine.test.d.ts +1 -0
- package/dist/src/prompt-config/TemplateEngine.test.js +494 -0
- package/dist/src/prompt-config/TemplateEngine.test.js.map +1 -0
- package/dist/src/prompt-config/defaults/compression.md +58 -0
- package/dist/src/prompt-config/defaults/core-defaults.d.ts +5 -0
- package/dist/src/prompt-config/defaults/core-defaults.js +332 -0
- package/dist/src/prompt-config/defaults/core-defaults.js.map +1 -0
- package/dist/src/prompt-config/defaults/core.md +267 -0
- package/dist/src/prompt-config/defaults/env/git-repository.md +15 -0
- package/dist/src/prompt-config/defaults/env/ide-mode.md +3 -0
- package/dist/src/prompt-config/defaults/env/macos-seatbelt.md +3 -0
- package/dist/src/prompt-config/defaults/env/outside-of-sandbox.md +3 -0
- package/dist/src/prompt-config/defaults/env/sandbox.md +3 -0
- package/dist/src/prompt-config/defaults/index.d.ts +14 -0
- package/dist/src/prompt-config/defaults/index.js +21 -0
- package/dist/src/prompt-config/defaults/index.js.map +1 -0
- package/dist/src/prompt-config/defaults/provider-defaults.d.ts +5 -0
- package/dist/src/prompt-config/defaults/provider-defaults.js +26 -0
- package/dist/src/prompt-config/defaults/provider-defaults.js.map +1 -0
- package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +10 -0
- package/dist/src/prompt-config/defaults/service-defaults.d.ts +5 -0
- package/dist/src/prompt-config/defaults/service-defaults.js +52 -0
- package/dist/src/prompt-config/defaults/service-defaults.js.map +1 -0
- package/dist/src/prompt-config/defaults/tool-defaults.d.ts +5 -0
- package/dist/src/prompt-config/defaults/tool-defaults.js +81 -0
- package/dist/src/prompt-config/defaults/tool-defaults.js.map +1 -0
- package/dist/src/prompt-config/defaults/tools/edit.md +2 -0
- package/dist/src/prompt-config/defaults/tools/glob.md +2 -0
- package/dist/src/prompt-config/defaults/tools/grep.md +2 -0
- package/dist/src/prompt-config/defaults/tools/ls.md +1 -0
- package/dist/src/prompt-config/defaults/tools/memory.md +1 -0
- package/dist/src/prompt-config/defaults/tools/read-file.md +4 -0
- package/dist/src/prompt-config/defaults/tools/read-many-files.md +2 -0
- package/dist/src/prompt-config/defaults/tools/shell.md +5 -0
- package/dist/src/prompt-config/defaults/tools/todo-read.md +3 -0
- package/dist/src/prompt-config/defaults/tools/todo-write.md +50 -0
- package/dist/src/prompt-config/defaults/tools/web-fetch.md +3 -0
- package/dist/src/prompt-config/defaults/tools/web-search.md +3 -0
- package/dist/src/prompt-config/defaults/tools/write-file.md +4 -0
- package/dist/src/prompt-config/index.d.ts +16 -0
- package/dist/src/prompt-config/index.js +11 -0
- package/dist/src/prompt-config/index.js.map +1 -0
- package/dist/src/prompt-config/prompt-cache.d.ts +72 -0
- package/dist/src/prompt-config/prompt-cache.js +271 -0
- package/dist/src/prompt-config/prompt-cache.js.map +1 -0
- package/dist/src/prompt-config/prompt-cache.test.d.ts +6 -0
- package/dist/src/prompt-config/prompt-cache.test.js +437 -0
- package/dist/src/prompt-config/prompt-cache.test.js.map +1 -0
- package/dist/src/prompt-config/prompt-installer.d.ts +118 -0
- package/dist/src/prompt-config/prompt-installer.js +723 -0
- package/dist/src/prompt-config/prompt-installer.js.map +1 -0
- package/dist/src/prompt-config/prompt-installer.test.d.ts +7 -0
- package/dist/src/prompt-config/prompt-installer.test.js +503 -0
- package/dist/src/prompt-config/prompt-installer.test.js.map +1 -0
- package/dist/src/prompt-config/prompt-loader.d.ts +49 -0
- package/dist/src/prompt-config/prompt-loader.js +331 -0
- package/dist/src/prompt-config/prompt-loader.js.map +1 -0
- package/dist/src/prompt-config/prompt-loader.test.d.ts +5 -0
- package/dist/src/prompt-config/prompt-loader.test.js +413 -0
- package/dist/src/prompt-config/prompt-loader.test.js.map +1 -0
- package/dist/src/prompt-config/prompt-resolver.d.ts +74 -0
- package/dist/src/prompt-config/prompt-resolver.js +600 -0
- package/dist/src/prompt-config/prompt-resolver.js.map +1 -0
- package/dist/src/prompt-config/prompt-resolver.test.d.ts +1 -0
- package/dist/src/prompt-config/prompt-resolver.test.js +529 -0
- package/dist/src/prompt-config/prompt-resolver.test.js.map +1 -0
- package/dist/src/prompt-config/prompt-service.d.ts +108 -0
- package/dist/src/prompt-config/prompt-service.js +435 -0
- package/dist/src/prompt-config/prompt-service.js.map +1 -0
- package/dist/src/prompt-config/prompt-service.test.d.ts +1 -0
- package/dist/src/prompt-config/prompt-service.test.js +811 -0
- package/dist/src/prompt-config/prompt-service.test.js.map +1 -0
- package/dist/src/prompt-config/types.d.ts +30 -0
- package/dist/src/prompt-config/types.js +10 -0
- package/dist/src/prompt-config/types.js.map +1 -0
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +26 -0
- package/dist/src/prompts/prompt-registry.js +47 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/providers/IProvider.d.ts +10 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +24 -9
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +1 -1
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +14 -1
- package/dist/src/providers/anthropic/AnthropicProvider.js +28 -2
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.d.ts +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js +48 -0
- package/dist/src/providers/anthropic/AnthropicProvider.modelParams.test.js.map +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.test.js +2 -1
- package/dist/src/providers/anthropic/AnthropicProvider.test.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +11 -2
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js +1 -1
- package/dist/src/providers/gemini/GeminiProvider.js +42 -25
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.d.ts +11 -0
- package/dist/src/providers/openai/OpenAIProvider.js +141 -24
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js +27 -3
- package/dist/src/providers/openai/OpenAIProvider.responses.test.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js +2 -1
- package/dist/src/providers/openai/OpenAIProvider.shouldUseResponses.test.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.test.js +307 -7
- package/dist/src/providers/openai/OpenAIProvider.test.js.map +1 -1
- package/dist/src/providers/openai/buildResponsesRequest.js +19 -2
- package/dist/src/providers/openai/buildResponsesRequest.js.map +1 -1
- package/dist/src/providers/test-utils/providerTestConfig.d.ts +21 -0
- package/dist/src/providers/test-utils/providerTestConfig.js +23 -0
- package/dist/src/providers/test-utils/providerTestConfig.js.map +1 -0
- package/dist/src/providers/types/IProviderConfig.d.ts +6 -0
- package/dist/src/services/complexity-analyzer.d.ts +92 -0
- package/dist/src/services/complexity-analyzer.js +287 -0
- package/dist/src/services/complexity-analyzer.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.js +101 -60
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.test.d.ts +1 -1
- package/dist/src/services/gitService.test.js +65 -102
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/index.d.ts +9 -0
- package/dist/src/services/index.js +8 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/loopDetectionService.d.ts +12 -0
- package/dist/src/services/loopDetectionService.js +62 -12
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +90 -11
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +34 -0
- package/dist/src/services/shellExecutionService.js +121 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/shellExecutionService.multibyte.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.multibyte.test.js +72 -0
- package/dist/src/services/shellExecutionService.multibyte.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.test.js +264 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.windows.multibyte.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.windows.multibyte.test.js +98 -0
- package/dist/src/services/shellExecutionService.windows.multibyte.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.windows.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.windows.test.js +79 -0
- package/dist/src/services/shellExecutionService.windows.test.js.map +1 -0
- package/dist/src/services/todo-reminder-service.d.ts +42 -0
- package/dist/src/services/todo-reminder-service.js +77 -0
- package/dist/src/services/todo-reminder-service.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +81 -34
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +6 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +19 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +2 -1
- package/dist/src/telemetry/constants.js +2 -1
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +2 -2
- package/dist/src/telemetry/file-exporters.js +47 -20
- package/dist/src/telemetry/file-exporters.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +3 -2
- package/dist/src/telemetry/loggers.js +30 -6
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +2 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +13 -3
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/sdk.d.ts +1 -1
- package/dist/src/telemetry/sdk.js +71 -73
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/telemetry.test.js +7 -5
- package/dist/src/telemetry/telemetry.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +19 -4
- package/dist/src/telemetry/types.js +30 -4
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +3 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
- package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
- package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
- package/dist/src/tools/edit.js +29 -4
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +104 -1
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.js +53 -17
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +32 -6
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +1 -1
- package/dist/src/tools/grep.js +81 -29
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +76 -9
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.js +4 -3
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.d.ts +6 -0
- package/dist/src/tools/ls.test.js +356 -0
- package/dist/src/tools/ls.test.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +26 -2
- package/dist/src/tools/mcp-client.js +72 -24
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +87 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +17 -2
- package/dist/src/tools/memoryTool.js +130 -13
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +88 -3
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +51 -62
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +8 -6
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +30 -2
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +22 -12
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +35 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +8 -3
- package/dist/src/tools/shell.js +185 -114
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.multibyte.test.d.ts +6 -0
- package/dist/src/tools/shell.multibyte.test.js +74 -0
- package/dist/src/tools/shell.multibyte.test.js.map +1 -0
- package/dist/src/tools/shell.test.d.ts +1 -1
- package/dist/src/tools/shell.test.js +323 -138
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/todo-read.d.ts +4 -1
- package/dist/src/tools/todo-read.js +136 -20
- package/dist/src/tools/todo-read.js.map +1 -1
- package/dist/src/tools/todo-read.test.js +10 -6
- package/dist/src/tools/todo-read.test.js.map +1 -1
- package/dist/src/tools/todo-schemas.d.ts +4 -4
- package/dist/src/tools/todo-write.d.ts +3 -0
- package/dist/src/tools/todo-write.js +96 -9
- package/dist/src/tools/todo-write.js.map +1 -1
- package/dist/src/tools/todo-write.test.js +17 -13
- package/dist/src/tools/todo-write.test.js.map +1 -1
- package/dist/src/tools/tool-context.d.ts +14 -0
- package/dist/src/tools/tool-context.js +7 -0
- package/dist/src/tools/tool-context.js.map +1 -0
- package/dist/src/tools/tool-error.d.ts +22 -0
- package/dist/src/tools/tool-error.js +27 -0
- package/dist/src/tools/tool-error.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +4 -1
- package/dist/src/tools/tool-registry.js +14 -5
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +10 -2
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +16 -1
- package/dist/src/tools/tools.js +2 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +18 -4
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/write-file.js +5 -3
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +36 -2
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/types/modelParams.d.ts +62 -0
- package/dist/src/types/modelParams.js +7 -0
- package/dist/src/types/modelParams.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.js +51 -27
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +59 -0
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +2 -2
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.d.ts +1 -1
- package/dist/src/utils/editor.js +9 -0
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +21 -1
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +12 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +29 -1
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/flashFallback.integration.test.js +8 -0
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
- package/dist/src/utils/formatters.d.ts +6 -0
- package/dist/src/utils/formatters.js +16 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +1 -1
- package/dist/src/utils/memoryDiscovery.js +61 -73
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +4 -3
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.d.ts +19 -12
- package/dist/src/utils/memoryImportProcessor.js +241 -82
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +595 -50
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.js +12 -27
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +8 -4
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/sanitization.d.ts +20 -0
- package/dist/src/utils/sanitization.js +66 -0
- package/dist/src/utils/sanitization.js.map +1 -0
- package/dist/src/utils/sanitization.test.d.ts +6 -0
- package/dist/src/utils/sanitization.test.js +81 -0
- package/dist/src/utils/sanitization.test.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
- package/dist/src/utils/secure-browser-launcher.js +164 -0
- package/dist/src/utils/secure-browser-launcher.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
- package/dist/src/utils/secure-browser-launcher.test.js +149 -0
- package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +37 -3
- package/dist/src/utils/shell-utils.js +110 -47
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +146 -396
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/summarizer.js +2 -2
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +13 -0
- package/dist/src/utils/textUtils.js +28 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/src/utils/unicodeUtils.d.ts +44 -0
- package/dist/src/utils/unicodeUtils.js +93 -0
- package/dist/src/utils/unicodeUtils.js.map +1 -0
- package/dist/src/utils/unicodeUtils.test.d.ts +6 -0
- package/dist/src/utils/unicodeUtils.test.js +120 -0
- package/dist/src/utils/unicodeUtils.test.js.map +1 -0
- package/dist/src/utils/workspaceContext.d.ts +47 -0
- package/dist/src/utils/workspaceContext.js +106 -0
- package/dist/src/utils/workspaceContext.js.map +1 -0
- package/dist/src/utils/workspaceContext.test.d.ts +6 -0
- package/dist/src/utils/workspaceContext.test.js +209 -0
- package/dist/src/utils/workspaceContext.test.js.map +1 -0
- package/package.json +3 -2
- package/dist/src/providers/IProviderConfig.d.ts +0 -31
- package/dist/src/providers/IProviderConfig.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -4,23 +4,50 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
// Mock prompts module before imports
|
|
8
|
+
vi.mock('./prompts.js', () => ({
|
|
9
|
+
getCoreSystemPromptAsync: vi
|
|
10
|
+
.fn()
|
|
11
|
+
.mockResolvedValue('Test system instruction'),
|
|
12
|
+
getCompressionPrompt: vi.fn().mockReturnValue('Test compression prompt'),
|
|
13
|
+
initializePromptSystem: vi.fn().mockResolvedValue(undefined),
|
|
14
|
+
}));
|
|
7
15
|
import { GoogleGenAI, } from '@google/genai';
|
|
8
16
|
import { findIndexAfterFraction, GeminiClient } from './client.js';
|
|
9
|
-
import {
|
|
17
|
+
import { getCoreSystemPromptAsync } from './prompts.js';
|
|
18
|
+
import { AuthType, } from './contentGenerator.js';
|
|
10
19
|
import { Config } from '../config/config.js';
|
|
11
20
|
import { GeminiEventType, Turn } from './turn.js';
|
|
12
|
-
import { getCoreSystemPrompt } from './prompts.js';
|
|
13
21
|
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
14
22
|
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
|
|
15
23
|
import { setSimulate429 } from '../utils/testUtils.js';
|
|
16
24
|
import { tokenLimit } from './tokenLimits.js';
|
|
17
25
|
import { ideContext } from '../ide/ideContext.js';
|
|
26
|
+
import { ComplexityAnalyzer } from '../services/complexity-analyzer.js';
|
|
27
|
+
import { TodoReminderService } from '../services/todo-reminder-service.js';
|
|
18
28
|
// --- Mocks ---
|
|
19
29
|
const mockChatCreateFn = vi.fn();
|
|
20
30
|
const mockGenerateContentFn = vi.fn();
|
|
21
31
|
const mockEmbedContentFn = vi.fn();
|
|
22
32
|
const mockTurnRunFn = vi.fn();
|
|
23
33
|
vi.mock('@google/genai');
|
|
34
|
+
vi.mock('../services/complexity-analyzer.js', () => ({
|
|
35
|
+
ComplexityAnalyzer: vi.fn().mockImplementation(() => ({
|
|
36
|
+
analyzeComplexity: vi.fn().mockReturnValue({
|
|
37
|
+
complexityScore: 0.2,
|
|
38
|
+
isComplex: false,
|
|
39
|
+
detectedTasks: [],
|
|
40
|
+
sequentialIndicators: [],
|
|
41
|
+
questionCount: 0,
|
|
42
|
+
shouldSuggestTodos: false,
|
|
43
|
+
}),
|
|
44
|
+
})),
|
|
45
|
+
}));
|
|
46
|
+
vi.mock('../services/todo-reminder-service.js', () => ({
|
|
47
|
+
TodoReminderService: vi.fn().mockImplementation(() => ({
|
|
48
|
+
getComplexTaskSuggestion: vi.fn(),
|
|
49
|
+
})),
|
|
50
|
+
}));
|
|
24
51
|
vi.mock('./turn', () => {
|
|
25
52
|
// Define a mock class that has the same shape as the real Turn
|
|
26
53
|
class MockTurn {
|
|
@@ -41,14 +68,10 @@ vi.mock('./turn', () => {
|
|
|
41
68
|
};
|
|
42
69
|
});
|
|
43
70
|
vi.mock('../config/config.js');
|
|
44
|
-
vi.mock('./prompts');
|
|
45
71
|
vi.mock('../utils/getFolderStructure', () => ({
|
|
46
72
|
getFolderStructure: vi.fn().mockResolvedValue('Mock Folder Structure'),
|
|
47
73
|
}));
|
|
48
74
|
vi.mock('../utils/errorReporting', () => ({ reportError: vi.fn() }));
|
|
49
|
-
vi.mock('../utils/nextSpeakerChecker', () => ({
|
|
50
|
-
checkNextSpeaker: vi.fn().mockResolvedValue(null),
|
|
51
|
-
}));
|
|
52
75
|
vi.mock('../utils/generateContentResponseUtilities', () => ({
|
|
53
76
|
getResponseText: (result) => result.candidates?.[0]?.content?.parts?.map((part) => part.text).join('') ||
|
|
54
77
|
undefined,
|
|
@@ -112,6 +135,22 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
112
135
|
let client;
|
|
113
136
|
beforeEach(async () => {
|
|
114
137
|
vi.resetAllMocks();
|
|
138
|
+
// Re-setup prompts mocks after reset
|
|
139
|
+
vi.mocked(getCoreSystemPromptAsync).mockResolvedValue('Test system instruction');
|
|
140
|
+
// Re-setup mocks after reset
|
|
141
|
+
vi.mocked(ComplexityAnalyzer).mockImplementation(() => ({
|
|
142
|
+
analyzeComplexity: vi.fn().mockReturnValue({
|
|
143
|
+
complexityScore: 0.2,
|
|
144
|
+
isComplex: false,
|
|
145
|
+
detectedTasks: [],
|
|
146
|
+
sequentialIndicators: [],
|
|
147
|
+
questionCount: 0,
|
|
148
|
+
shouldSuggestTodos: false,
|
|
149
|
+
}),
|
|
150
|
+
}));
|
|
151
|
+
vi.mocked(TodoReminderService).mockImplementation(() => ({
|
|
152
|
+
getComplexTaskSuggestion: vi.fn(),
|
|
153
|
+
}));
|
|
115
154
|
// Disable 429 simulation for tests
|
|
116
155
|
setSimulate429(false);
|
|
117
156
|
// Set up the mock for GoogleGenAI constructor and its methods
|
|
@@ -172,14 +211,26 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
172
211
|
setQuotaErrorOccurred: vi.fn(),
|
|
173
212
|
getNoBrowser: vi.fn().mockReturnValue(false),
|
|
174
213
|
getUsageStatisticsEnabled: vi.fn().mockReturnValue(true),
|
|
175
|
-
|
|
214
|
+
getIdeModeFeature: vi.fn().mockReturnValue(false),
|
|
215
|
+
getIdeMode: vi.fn().mockReturnValue(true),
|
|
216
|
+
getWorkspaceContext: vi.fn().mockReturnValue({
|
|
217
|
+
getDirectories: vi.fn().mockReturnValue(['/test/dir']),
|
|
218
|
+
}),
|
|
176
219
|
getGeminiClient: vi.fn(),
|
|
177
220
|
getDebugMode: vi.fn().mockReturnValue(false),
|
|
221
|
+
setFallbackMode: vi.fn(),
|
|
222
|
+
getComplexityAnalyzerSettings: vi.fn().mockReturnValue({
|
|
223
|
+
complexityThreshold: 0.6,
|
|
224
|
+
minTasksForSuggestion: 3,
|
|
225
|
+
suggestionCooldownMs: 300000,
|
|
226
|
+
}),
|
|
178
227
|
};
|
|
179
228
|
MockedConfig.mockImplementation(() => mockConfigObject);
|
|
180
229
|
// We can instantiate the client here since Config is mocked
|
|
181
230
|
// and the constructor will use the mocked GoogleGenAI
|
|
182
|
-
const mockConfig = new Config({
|
|
231
|
+
const mockConfig = new Config({
|
|
232
|
+
sessionId: 'test-session-id',
|
|
233
|
+
});
|
|
183
234
|
client = new GeminiClient(mockConfig);
|
|
184
235
|
await client.initialize(contentGeneratorConfig);
|
|
185
236
|
// Update the mock to return the client
|
|
@@ -308,12 +359,12 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
308
359
|
model: 'test-model',
|
|
309
360
|
config: {
|
|
310
361
|
abortSignal,
|
|
311
|
-
systemInstruction:
|
|
362
|
+
systemInstruction: 'Test system instruction',
|
|
312
363
|
temperature: 0.5,
|
|
313
364
|
topP: 1,
|
|
314
365
|
},
|
|
315
366
|
contents,
|
|
316
|
-
});
|
|
367
|
+
}, 'test-session-id');
|
|
317
368
|
});
|
|
318
369
|
});
|
|
319
370
|
describe('generateJson', () => {
|
|
@@ -321,20 +372,45 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
321
372
|
const contents = [{ role: 'user', parts: [{ text: 'hello' }] }];
|
|
322
373
|
const schema = { type: 'string' };
|
|
323
374
|
const abortSignal = new AbortController().signal;
|
|
324
|
-
// Mock
|
|
375
|
+
// Mock lazyInitialize to prevent it from overriding our mock
|
|
376
|
+
client['lazyInitialize'] = vi.fn().mockResolvedValue(undefined);
|
|
377
|
+
// Track the arguments manually
|
|
378
|
+
let capturedRequest;
|
|
379
|
+
let capturedPromptId;
|
|
325
380
|
const mockGenerator = {
|
|
326
381
|
countTokens: vi.fn().mockResolvedValue({ totalTokens: 1 }),
|
|
327
|
-
generateContent:
|
|
382
|
+
generateContent: vi.fn(async (request, promptId) => {
|
|
383
|
+
capturedRequest = request;
|
|
384
|
+
capturedPromptId = promptId;
|
|
385
|
+
return {
|
|
386
|
+
candidates: [
|
|
387
|
+
{
|
|
388
|
+
content: {
|
|
389
|
+
parts: [{ text: '{"key": "value"}' }],
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
};
|
|
394
|
+
}),
|
|
328
395
|
generateContentStream: vi.fn(),
|
|
329
396
|
embedContent: vi.fn(),
|
|
330
397
|
};
|
|
331
398
|
client['contentGenerator'] = mockGenerator;
|
|
332
|
-
|
|
333
|
-
|
|
399
|
+
try {
|
|
400
|
+
await client.generateJson(contents, schema, abortSignal);
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
console.error('Error in generateJson:', error);
|
|
404
|
+
throw error;
|
|
405
|
+
}
|
|
406
|
+
// Check the captured arguments
|
|
407
|
+
expect(capturedRequest).toBeDefined();
|
|
408
|
+
expect(capturedPromptId).toBe('test-session-id');
|
|
409
|
+
expect(capturedRequest).toMatchObject({
|
|
334
410
|
model: 'test-model', // Should use current model from config
|
|
335
411
|
config: {
|
|
336
412
|
abortSignal,
|
|
337
|
-
systemInstruction:
|
|
413
|
+
systemInstruction: 'Test system instruction',
|
|
338
414
|
temperature: 0,
|
|
339
415
|
topP: 1,
|
|
340
416
|
responseSchema: schema,
|
|
@@ -349,17 +425,37 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
349
425
|
const abortSignal = new AbortController().signal;
|
|
350
426
|
const customModel = 'custom-json-model';
|
|
351
427
|
const customConfig = { temperature: 0.9, topK: 20 };
|
|
428
|
+
// Mock lazyInitialize to prevent it from overriding our mock
|
|
429
|
+
client['lazyInitialize'] = vi.fn().mockResolvedValue(undefined);
|
|
430
|
+
// Track the arguments manually
|
|
431
|
+
let capturedRequest;
|
|
432
|
+
let capturedPromptId;
|
|
352
433
|
const mockGenerator = {
|
|
353
434
|
countTokens: vi.fn().mockResolvedValue({ totalTokens: 1 }),
|
|
354
|
-
generateContent:
|
|
435
|
+
generateContent: vi.fn(async (request, promptId) => {
|
|
436
|
+
capturedRequest = request;
|
|
437
|
+
capturedPromptId = promptId;
|
|
438
|
+
return {
|
|
439
|
+
candidates: [
|
|
440
|
+
{
|
|
441
|
+
content: {
|
|
442
|
+
parts: [{ text: '{"key": "value"}' }],
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
],
|
|
446
|
+
};
|
|
447
|
+
}),
|
|
355
448
|
};
|
|
356
449
|
client['contentGenerator'] = mockGenerator;
|
|
357
450
|
await client.generateJson(contents, schema, abortSignal, customModel, customConfig);
|
|
358
|
-
|
|
451
|
+
// Check the captured arguments
|
|
452
|
+
expect(capturedRequest).toBeDefined();
|
|
453
|
+
expect(capturedPromptId).toBe('test-session-id');
|
|
454
|
+
expect(capturedRequest).toMatchObject({
|
|
359
455
|
model: customModel,
|
|
360
456
|
config: {
|
|
361
457
|
abortSignal,
|
|
362
|
-
systemInstruction:
|
|
458
|
+
systemInstruction: 'Test system instruction',
|
|
363
459
|
temperature: 0.9,
|
|
364
460
|
topP: 1, // from default
|
|
365
461
|
topK: 20,
|
|
@@ -585,18 +681,114 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
585
681
|
});
|
|
586
682
|
});
|
|
587
683
|
describe('sendMessageStream', () => {
|
|
588
|
-
it('should include IDE context when
|
|
684
|
+
it('should include IDE context when ideModeFeature is enabled', async () => {
|
|
589
685
|
// Arrange
|
|
590
|
-
vi.mocked(ideContext.
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
686
|
+
vi.mocked(ideContext.getIdeContext).mockReturnValue({
|
|
687
|
+
workspaceState: {
|
|
688
|
+
openFiles: [
|
|
689
|
+
{
|
|
690
|
+
path: '/path/to/active/file.ts',
|
|
691
|
+
timestamp: Date.now(),
|
|
692
|
+
isActive: true,
|
|
693
|
+
selectedText: 'hello',
|
|
694
|
+
cursor: { line: 5, character: 10 },
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
path: '/path/to/recent/file1.ts',
|
|
698
|
+
timestamp: Date.now(),
|
|
699
|
+
},
|
|
700
|
+
{
|
|
701
|
+
path: '/path/to/recent/file2.ts',
|
|
702
|
+
timestamp: Date.now(),
|
|
703
|
+
},
|
|
704
|
+
],
|
|
705
|
+
},
|
|
706
|
+
});
|
|
707
|
+
vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
|
|
708
|
+
const mockStream = (async function* () {
|
|
709
|
+
yield { type: 'content', value: 'Hello' };
|
|
710
|
+
})();
|
|
711
|
+
mockTurnRunFn.mockReturnValue(mockStream);
|
|
712
|
+
const mockChat = {
|
|
713
|
+
addHistory: vi.fn(),
|
|
714
|
+
getHistory: vi.fn().mockReturnValue([]),
|
|
715
|
+
};
|
|
716
|
+
client['chat'] = mockChat;
|
|
717
|
+
const mockGenerator = {
|
|
718
|
+
countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
|
|
719
|
+
generateContent: mockGenerateContentFn,
|
|
720
|
+
};
|
|
721
|
+
client['contentGenerator'] = mockGenerator;
|
|
722
|
+
const initialRequest = [{ text: 'Hi' }];
|
|
723
|
+
// Act
|
|
724
|
+
const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
|
|
725
|
+
for await (const _ of stream) {
|
|
726
|
+
// consume stream
|
|
727
|
+
}
|
|
728
|
+
// Assert
|
|
729
|
+
expect(ideContext.getIdeContext).toHaveBeenCalled();
|
|
730
|
+
const expectedContext = `
|
|
731
|
+
This is the file that the user is looking at:
|
|
732
|
+
- Path: /path/to/active/file.ts
|
|
733
|
+
This is the cursor position in the file:
|
|
734
|
+
- Cursor Position: Line 5, Character 10
|
|
735
|
+
This is the selected text in the file:
|
|
736
|
+
- hello
|
|
737
|
+
Here are some other files the user has open, with the most recent at the top:
|
|
738
|
+
- /path/to/recent/file1.ts
|
|
739
|
+
- /path/to/recent/file2.ts
|
|
740
|
+
`.trim();
|
|
741
|
+
const expectedRequest = [{ text: expectedContext }, ...initialRequest];
|
|
742
|
+
expect(mockTurnRunFn).toHaveBeenCalledWith(expectedRequest, expect.any(Object));
|
|
743
|
+
});
|
|
744
|
+
it('should not add context if ideModeFeature is enabled but no open files', async () => {
|
|
745
|
+
// Arrange
|
|
746
|
+
vi.mocked(ideContext.getIdeContext).mockReturnValue({
|
|
747
|
+
workspaceState: {
|
|
748
|
+
openFiles: [],
|
|
749
|
+
},
|
|
750
|
+
});
|
|
751
|
+
vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
|
|
752
|
+
const mockStream = (async function* () {
|
|
753
|
+
yield { type: 'content', value: 'Hello' };
|
|
754
|
+
})();
|
|
755
|
+
mockTurnRunFn.mockReturnValue(mockStream);
|
|
756
|
+
const mockChat = {
|
|
757
|
+
addHistory: vi.fn(),
|
|
758
|
+
getHistory: vi.fn().mockReturnValue([]),
|
|
759
|
+
};
|
|
760
|
+
client['chat'] = mockChat;
|
|
761
|
+
const mockGenerator = {
|
|
762
|
+
countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
|
|
763
|
+
generateContent: mockGenerateContentFn,
|
|
764
|
+
};
|
|
765
|
+
client['contentGenerator'] = mockGenerator;
|
|
766
|
+
const initialRequest = [{ text: 'Hi' }];
|
|
767
|
+
// Act
|
|
768
|
+
const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
|
|
769
|
+
for await (const _ of stream) {
|
|
770
|
+
// consume stream
|
|
771
|
+
}
|
|
772
|
+
// Assert
|
|
773
|
+
expect(ideContext.getIdeContext).toHaveBeenCalled();
|
|
774
|
+
expect(mockTurnRunFn).toHaveBeenCalledWith(initialRequest, expect.any(Object));
|
|
775
|
+
});
|
|
776
|
+
it('should add context if ideModeFeature is enabled and there is one active file', async () => {
|
|
777
|
+
// Arrange
|
|
778
|
+
vi.mocked(ideContext.getIdeContext).mockReturnValue({
|
|
779
|
+
workspaceState: {
|
|
780
|
+
openFiles: [
|
|
781
|
+
{
|
|
782
|
+
path: '/path/to/active/file.ts',
|
|
783
|
+
timestamp: Date.now(),
|
|
784
|
+
isActive: true,
|
|
785
|
+
selectedText: 'hello',
|
|
786
|
+
cursor: { line: 5, character: 10 },
|
|
787
|
+
},
|
|
788
|
+
],
|
|
789
|
+
},
|
|
598
790
|
});
|
|
599
|
-
vi.spyOn(client['config'], '
|
|
791
|
+
vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
|
|
600
792
|
const mockStream = (async function* () {
|
|
601
793
|
yield { type: 'content', value: 'Hello' };
|
|
602
794
|
})();
|
|
@@ -618,15 +810,59 @@ describe('Gemini Client (client.ts)', () => {
|
|
|
618
810
|
// consume stream
|
|
619
811
|
}
|
|
620
812
|
// Assert
|
|
621
|
-
expect(ideContext.
|
|
813
|
+
expect(ideContext.getIdeContext).toHaveBeenCalled();
|
|
622
814
|
const expectedContext = `
|
|
623
|
-
This is the file that the user
|
|
815
|
+
This is the file that the user is looking at:
|
|
624
816
|
- Path: /path/to/active/file.ts
|
|
625
817
|
This is the cursor position in the file:
|
|
626
818
|
- Cursor Position: Line 5, Character 10
|
|
627
|
-
This is the selected text in the
|
|
819
|
+
This is the selected text in the file:
|
|
628
820
|
- hello
|
|
629
|
-
|
|
821
|
+
`.trim();
|
|
822
|
+
const expectedRequest = [{ text: expectedContext }, ...initialRequest];
|
|
823
|
+
expect(mockTurnRunFn).toHaveBeenCalledWith(expectedRequest, expect.any(Object));
|
|
824
|
+
});
|
|
825
|
+
it('should add context if ideModeFeature is enabled and there are open files but no active file', async () => {
|
|
826
|
+
// Arrange
|
|
827
|
+
vi.mocked(ideContext.getIdeContext).mockReturnValue({
|
|
828
|
+
workspaceState: {
|
|
829
|
+
openFiles: [
|
|
830
|
+
{
|
|
831
|
+
path: '/path/to/recent/file1.ts',
|
|
832
|
+
timestamp: Date.now(),
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
path: '/path/to/recent/file2.ts',
|
|
836
|
+
timestamp: Date.now(),
|
|
837
|
+
},
|
|
838
|
+
],
|
|
839
|
+
},
|
|
840
|
+
});
|
|
841
|
+
vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true);
|
|
842
|
+
const mockStream = (async function* () {
|
|
843
|
+
yield { type: 'content', value: 'Hello' };
|
|
844
|
+
})();
|
|
845
|
+
mockTurnRunFn.mockReturnValue(mockStream);
|
|
846
|
+
const mockChat = {
|
|
847
|
+
addHistory: vi.fn(),
|
|
848
|
+
getHistory: vi.fn().mockReturnValue([]),
|
|
849
|
+
};
|
|
850
|
+
client['chat'] = mockChat;
|
|
851
|
+
const mockGenerator = {
|
|
852
|
+
countTokens: vi.fn().mockResolvedValue({ totalTokens: 0 }),
|
|
853
|
+
generateContent: mockGenerateContentFn,
|
|
854
|
+
};
|
|
855
|
+
client['contentGenerator'] = mockGenerator;
|
|
856
|
+
const initialRequest = [{ text: 'Hi' }];
|
|
857
|
+
// Act
|
|
858
|
+
const stream = client.sendMessageStream(initialRequest, new AbortController().signal, 'prompt-id-ide');
|
|
859
|
+
for await (const _ of stream) {
|
|
860
|
+
// consume stream
|
|
861
|
+
}
|
|
862
|
+
// Assert
|
|
863
|
+
expect(ideContext.getIdeContext).toHaveBeenCalled();
|
|
864
|
+
const expectedContext = `
|
|
865
|
+
Here are some files the user has open, with the most recent at the top:
|
|
630
866
|
- /path/to/recent/file1.ts
|
|
631
867
|
- /path/to/recent/file2.ts
|
|
632
868
|
`.trim();
|
|
@@ -665,7 +901,7 @@ Here are files the user has recently opened, with the most recent at the top:
|
|
|
665
901
|
// Assert
|
|
666
902
|
expect(finalResult).toBeInstanceOf(Turn);
|
|
667
903
|
});
|
|
668
|
-
it('should stop infinite loop after MAX_TURNS when nextSpeaker always returns model', async () => {
|
|
904
|
+
it.skip('should stop infinite loop after MAX_TURNS when nextSpeaker always returns model', async () => {
|
|
669
905
|
// Get the mocked checkNextSpeaker function and configure it to trigger infinite loop
|
|
670
906
|
const { checkNextSpeaker } = await import('../utils/nextSpeakerChecker.js');
|
|
671
907
|
const mockCheckNextSpeaker = vi.mocked(checkNextSpeaker);
|
|
@@ -673,6 +909,16 @@ Here are files the user has recently opened, with the most recent at the top:
|
|
|
673
909
|
next_speaker: 'model',
|
|
674
910
|
reasoning: 'Test case - always continue',
|
|
675
911
|
});
|
|
912
|
+
// Mock provider manager to return 'gemini' provider
|
|
913
|
+
const mockProviderManager = {
|
|
914
|
+
getActiveProviderName: vi.fn().mockReturnValue('gemini'),
|
|
915
|
+
getActiveProvider: vi.fn().mockReturnValue(null),
|
|
916
|
+
};
|
|
917
|
+
const mockContentGenConfig = {
|
|
918
|
+
model: 'test-model',
|
|
919
|
+
providerManager: mockProviderManager,
|
|
920
|
+
};
|
|
921
|
+
vi.spyOn(client['config'], 'getContentGeneratorConfig').mockReturnValue(mockContentGenConfig);
|
|
676
922
|
// Mock Turn to have no pending tool calls (which would allow nextSpeaker check)
|
|
677
923
|
const mockStream = (async function* () {
|
|
678
924
|
yield { type: 'content', value: 'Continue...' };
|
|
@@ -771,7 +1017,7 @@ Here are files the user has recently opened, with the most recent at the top:
|
|
|
771
1017
|
expect(events).toEqual([{ type: GeminiEventType.MaxSessionTurns }]);
|
|
772
1018
|
expect(mockTurnRunFn).toHaveBeenCalledTimes(MAX_SESSION_TURNS);
|
|
773
1019
|
});
|
|
774
|
-
it('should respect MAX_TURNS limit even when turns parameter is set to a large value', async () => {
|
|
1020
|
+
it.skip('should respect MAX_TURNS limit even when turns parameter is set to a large value', async () => {
|
|
775
1021
|
// This test verifies that the infinite loop protection works even when
|
|
776
1022
|
// someone tries to bypass it by calling with a very large turns value
|
|
777
1023
|
// Get the mocked checkNextSpeaker function and configure it to trigger infinite loop
|
|
@@ -866,15 +1112,17 @@ Here are files the user has recently opened, with the most recent at the top:
|
|
|
866
1112
|
// Verify the mock was called
|
|
867
1113
|
expect(mockContentGeneratorGenerateContent).toHaveBeenCalledTimes(1);
|
|
868
1114
|
// Get the actual call arguments
|
|
869
|
-
const actualCall = mockContentGeneratorGenerateContent.mock.calls[0]
|
|
1115
|
+
const actualCall = mockContentGeneratorGenerateContent.mock.calls[0];
|
|
870
1116
|
// Assert on the model specifically
|
|
871
|
-
expect(actualCall.model).toBe(currentModel);
|
|
872
|
-
expect(actualCall.model).not.toBe(initialModel);
|
|
1117
|
+
expect(actualCall[0].model).toBe(currentModel);
|
|
1118
|
+
expect(actualCall[0].model).not.toBe(initialModel);
|
|
873
1119
|
// Verify other expected properties exist
|
|
874
|
-
expect(actualCall).toHaveProperty('contents', contents);
|
|
875
|
-
expect(actualCall).toHaveProperty('config');
|
|
876
|
-
expect(actualCall.config).toHaveProperty('abortSignal');
|
|
877
|
-
expect(actualCall.config).toHaveProperty('systemInstruction');
|
|
1120
|
+
expect(actualCall[0]).toHaveProperty('contents', contents);
|
|
1121
|
+
expect(actualCall[0]).toHaveProperty('config');
|
|
1122
|
+
expect(actualCall[0].config).toHaveProperty('abortSignal');
|
|
1123
|
+
expect(actualCall[0].config).toHaveProperty('systemInstruction');
|
|
1124
|
+
// Verify prompt_id was passed
|
|
1125
|
+
expect(actualCall[1]).toBe('test-session-id');
|
|
878
1126
|
});
|
|
879
1127
|
});
|
|
880
1128
|
describe('tryCompressChat model usage', () => {
|
|
@@ -928,7 +1176,8 @@ Here are files the user has recently opened, with the most recent at the top:
|
|
|
928
1176
|
const fallbackModel = DEFAULT_GEMINI_FLASH_MODEL;
|
|
929
1177
|
// mock config been changed
|
|
930
1178
|
const currentModel = initialModel + '-changed';
|
|
931
|
-
vi.spyOn(client['config'], 'getModel')
|
|
1179
|
+
const getModelSpy = vi.spyOn(client['config'], 'getModel');
|
|
1180
|
+
getModelSpy.mockReturnValue(currentModel);
|
|
932
1181
|
const mockFallbackHandler = vi.fn().mockResolvedValue(true);
|
|
933
1182
|
client['config'].flashFallbackHandler = mockFallbackHandler;
|
|
934
1183
|
client['config'].setModel = vi.fn();
|