@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
|
@@ -1,27 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
|
-
* Copyright 2025
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
7
|
import { GitService } from './gitService.js';
|
|
8
8
|
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
import { getProjectHash, LLXPRT_DIR } from '../utils/paths.js';
|
|
9
12
|
const hoistedMockExec = vi.hoisted(() => vi.fn());
|
|
10
13
|
vi.mock('node:child_process', () => ({
|
|
11
14
|
exec: hoistedMockExec,
|
|
12
15
|
}));
|
|
13
|
-
const hoistedMockMkdir = vi.hoisted(() => vi.fn());
|
|
14
|
-
const hoistedMockReadFile = vi.hoisted(() => vi.fn());
|
|
15
|
-
const hoistedMockWriteFile = vi.hoisted(() => vi.fn());
|
|
16
|
-
vi.mock('fs/promises', async (importOriginal) => {
|
|
17
|
-
const actual = (await importOriginal());
|
|
18
|
-
return {
|
|
19
|
-
...actual,
|
|
20
|
-
mkdir: hoistedMockMkdir,
|
|
21
|
-
readFile: hoistedMockReadFile,
|
|
22
|
-
writeFile: hoistedMockWriteFile,
|
|
23
|
-
};
|
|
24
|
-
});
|
|
25
16
|
const hoistedMockEnv = vi.hoisted(() => vi.fn());
|
|
26
17
|
const hoistedMockSimpleGit = vi.hoisted(() => vi.fn());
|
|
27
18
|
const hoistedMockCheckIsRepo = vi.hoisted(() => vi.fn());
|
|
@@ -44,50 +35,26 @@ const hoistedIsGitRepositoryMock = vi.hoisted(() => vi.fn());
|
|
|
44
35
|
vi.mock('../utils/gitUtils.js', () => ({
|
|
45
36
|
isGitRepository: hoistedIsGitRepositoryMock,
|
|
46
37
|
}));
|
|
47
|
-
const hoistedMockIsNodeError = vi.hoisted(() => vi.fn());
|
|
48
|
-
vi.mock('../utils/errors.js', () => ({
|
|
49
|
-
isNodeError: hoistedMockIsNodeError,
|
|
50
|
-
}));
|
|
51
|
-
const hoistedMockExistsSync = vi.hoisted(() => vi.fn());
|
|
52
|
-
const hoistedMockMkdirSync = vi.hoisted(() => vi.fn());
|
|
53
|
-
vi.mock('fs', async (importOriginal) => {
|
|
54
|
-
const actual = (await importOriginal());
|
|
55
|
-
return {
|
|
56
|
-
...actual,
|
|
57
|
-
default: actual,
|
|
58
|
-
existsSync: hoistedMockExistsSync,
|
|
59
|
-
mkdirSync: hoistedMockMkdirSync,
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
38
|
const hoistedMockHomedir = vi.hoisted(() => vi.fn());
|
|
63
39
|
vi.mock('os', async (importOriginal) => {
|
|
64
|
-
const actual =
|
|
40
|
+
const actual = await importOriginal();
|
|
65
41
|
return {
|
|
66
42
|
...actual,
|
|
67
|
-
default: actual,
|
|
68
43
|
homedir: hoistedMockHomedir,
|
|
69
44
|
};
|
|
70
45
|
});
|
|
71
|
-
const hoistedMockCreateHash = vi.hoisted(() => {
|
|
72
|
-
const mockUpdate = vi.fn().mockReturnThis();
|
|
73
|
-
const mockDigest = vi.fn();
|
|
74
|
-
return {
|
|
75
|
-
createHash: vi.fn(() => ({
|
|
76
|
-
update: mockUpdate,
|
|
77
|
-
digest: mockDigest,
|
|
78
|
-
})),
|
|
79
|
-
mockUpdate,
|
|
80
|
-
mockDigest,
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
vi.mock('crypto', () => ({
|
|
84
|
-
createHash: hoistedMockCreateHash.createHash,
|
|
85
|
-
}));
|
|
86
46
|
describe('GitService', () => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
47
|
+
let testRootDir;
|
|
48
|
+
let projectRoot;
|
|
49
|
+
let homedir;
|
|
50
|
+
let hash;
|
|
51
|
+
beforeEach(async () => {
|
|
52
|
+
testRootDir = await fs.mkdtemp(path.join(os.tmpdir(), 'git-service-test-'));
|
|
53
|
+
projectRoot = path.join(testRootDir, 'project');
|
|
54
|
+
homedir = path.join(testRootDir, 'home');
|
|
55
|
+
await fs.mkdir(projectRoot, { recursive: true });
|
|
56
|
+
await fs.mkdir(homedir, { recursive: true });
|
|
57
|
+
hash = getProjectHash(projectRoot);
|
|
91
58
|
vi.clearAllMocks();
|
|
92
59
|
hoistedIsGitRepositoryMock.mockReturnValue(true);
|
|
93
60
|
hoistedMockExec.mockImplementation((command, callback) => {
|
|
@@ -99,15 +66,7 @@ describe('GitService', () => {
|
|
|
99
66
|
}
|
|
100
67
|
return {};
|
|
101
68
|
});
|
|
102
|
-
|
|
103
|
-
hoistedMockReadFile.mockResolvedValue('');
|
|
104
|
-
hoistedMockWriteFile.mockResolvedValue(undefined);
|
|
105
|
-
hoistedMockIsNodeError.mockImplementation((e) => e instanceof Error);
|
|
106
|
-
hoistedMockHomedir.mockReturnValue(mockHomedir);
|
|
107
|
-
hoistedMockExistsSync.mockReturnValue(false);
|
|
108
|
-
hoistedMockMkdirSync.mockReturnValue(undefined);
|
|
109
|
-
hoistedMockCreateHash.mockUpdate.mockReturnThis();
|
|
110
|
-
hoistedMockCreateHash.mockDigest.mockReturnValue(mockHash);
|
|
69
|
+
hoistedMockHomedir.mockReturnValue(homedir);
|
|
111
70
|
hoistedMockEnv.mockImplementation(() => ({
|
|
112
71
|
checkIsRepo: hoistedMockCheckIsRepo,
|
|
113
72
|
init: hoistedMockInit,
|
|
@@ -131,17 +90,18 @@ describe('GitService', () => {
|
|
|
131
90
|
commit: 'initial',
|
|
132
91
|
});
|
|
133
92
|
});
|
|
134
|
-
afterEach(() => {
|
|
93
|
+
afterEach(async () => {
|
|
135
94
|
vi.restoreAllMocks();
|
|
95
|
+
await fs.rm(testRootDir, { recursive: true, force: true });
|
|
136
96
|
});
|
|
137
97
|
describe('constructor', () => {
|
|
138
|
-
it('should successfully create an instance
|
|
139
|
-
expect(() => new GitService(
|
|
98
|
+
it('should successfully create an instance', () => {
|
|
99
|
+
expect(() => new GitService(projectRoot)).not.toThrow();
|
|
140
100
|
});
|
|
141
101
|
});
|
|
142
102
|
describe('verifyGitAvailability', () => {
|
|
143
103
|
it('should resolve true if git --version command succeeds', async () => {
|
|
144
|
-
const service = new GitService(
|
|
104
|
+
const service = new GitService(projectRoot);
|
|
145
105
|
await expect(service.verifyGitAvailability()).resolves.toBe(true);
|
|
146
106
|
});
|
|
147
107
|
it('should resolve false if git --version command fails', async () => {
|
|
@@ -149,7 +109,7 @@ describe('GitService', () => {
|
|
|
149
109
|
callback(new Error('git not found'));
|
|
150
110
|
return {};
|
|
151
111
|
});
|
|
152
|
-
const service = new GitService(
|
|
112
|
+
const service = new GitService(projectRoot);
|
|
153
113
|
await expect(service.verifyGitAvailability()).resolves.toBe(false);
|
|
154
114
|
});
|
|
155
115
|
});
|
|
@@ -159,11 +119,11 @@ describe('GitService', () => {
|
|
|
159
119
|
callback(new Error('git not found'));
|
|
160
120
|
return {};
|
|
161
121
|
});
|
|
162
|
-
const service = new GitService(
|
|
122
|
+
const service = new GitService(projectRoot);
|
|
163
123
|
await expect(service.initialize()).rejects.toThrow('Checkpointing is enabled, but Git is not installed. Please install Git or disable checkpointing to continue.');
|
|
164
124
|
});
|
|
165
125
|
it('should call setupShadowGitRepository if Git is available', async () => {
|
|
166
|
-
const service = new GitService(
|
|
126
|
+
const service = new GitService(projectRoot);
|
|
167
127
|
const setupSpy = vi
|
|
168
128
|
.spyOn(service, 'setupShadowGitRepository')
|
|
169
129
|
.mockResolvedValue(undefined);
|
|
@@ -172,64 +132,67 @@ describe('GitService', () => {
|
|
|
172
132
|
});
|
|
173
133
|
});
|
|
174
134
|
describe('setupShadowGitRepository', () => {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const service = new GitService(mockProjectRoot);
|
|
181
|
-
await service.setupShadowGitRepository();
|
|
182
|
-
const expectedConfigContent = '[user]\n name = llxprt-code\n email = llxprt-code-bot@users.noreply.github.com\n[commit]\n gpgsign = false\n';
|
|
183
|
-
expect(hoistedMockWriteFile).toHaveBeenCalledWith(gitConfigPath, expectedConfigContent);
|
|
135
|
+
let repoDir;
|
|
136
|
+
let gitConfigPath;
|
|
137
|
+
beforeEach(() => {
|
|
138
|
+
repoDir = path.join(homedir, LLXPRT_DIR, 'history', hash);
|
|
139
|
+
gitConfigPath = path.join(repoDir, '.gitconfig');
|
|
184
140
|
});
|
|
185
141
|
it('should create history and repository directories', async () => {
|
|
186
|
-
const service = new GitService(
|
|
142
|
+
const service = new GitService(projectRoot);
|
|
187
143
|
await service.setupShadowGitRepository();
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
144
|
+
const stats = await fs.stat(repoDir);
|
|
145
|
+
expect(stats.isDirectory()).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it('should create a .gitconfig file with the correct content', async () => {
|
|
148
|
+
const service = new GitService(projectRoot);
|
|
149
|
+
await service.setupShadowGitRepository();
|
|
150
|
+
const expectedConfigContent = '[user]\n name = llxprt-code\n email = llxprt-code-bot@users.noreply.github.com\n[commit]\n gpgsign = false\n';
|
|
151
|
+
const actualConfigContent = await fs.readFile(gitConfigPath, 'utf-8');
|
|
152
|
+
expect(actualConfigContent).toBe(expectedConfigContent);
|
|
191
153
|
});
|
|
192
154
|
it('should initialize git repo in historyDir if not already initialized', async () => {
|
|
193
155
|
hoistedMockCheckIsRepo.mockResolvedValue(false);
|
|
194
|
-
const service = new GitService(
|
|
156
|
+
const service = new GitService(projectRoot);
|
|
195
157
|
await service.setupShadowGitRepository();
|
|
196
158
|
expect(hoistedMockSimpleGit).toHaveBeenCalledWith(repoDir);
|
|
197
159
|
expect(hoistedMockInit).toHaveBeenCalled();
|
|
198
160
|
});
|
|
199
161
|
it('should not initialize git repo if already initialized', async () => {
|
|
200
162
|
hoistedMockCheckIsRepo.mockResolvedValue(true);
|
|
201
|
-
const service = new GitService(
|
|
163
|
+
const service = new GitService(projectRoot);
|
|
202
164
|
await service.setupShadowGitRepository();
|
|
203
165
|
expect(hoistedMockInit).not.toHaveBeenCalled();
|
|
204
166
|
});
|
|
205
167
|
it('should copy .gitignore from projectRoot if it exists', async () => {
|
|
206
|
-
const gitignoreContent =
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
return '';
|
|
212
|
-
});
|
|
213
|
-
const service = new GitService(mockProjectRoot);
|
|
168
|
+
const gitignoreContent = 'node_modules/\n.env';
|
|
169
|
+
const visibleGitIgnorePath = path.join(projectRoot, '.gitignore');
|
|
170
|
+
await fs.writeFile(visibleGitIgnorePath, gitignoreContent);
|
|
171
|
+
const service = new GitService(projectRoot);
|
|
214
172
|
await service.setupShadowGitRepository();
|
|
215
|
-
|
|
216
|
-
|
|
173
|
+
const hiddenGitIgnorePath = path.join(repoDir, '.gitignore');
|
|
174
|
+
const copiedContent = await fs.readFile(hiddenGitIgnorePath, 'utf-8');
|
|
175
|
+
expect(copiedContent).toBe(gitignoreContent);
|
|
176
|
+
});
|
|
177
|
+
it('should not create a .gitignore in shadow repo if project .gitignore does not exist', async () => {
|
|
178
|
+
const service = new GitService(projectRoot);
|
|
179
|
+
await service.setupShadowGitRepository();
|
|
180
|
+
const hiddenGitIgnorePath = path.join(repoDir, '.gitignore');
|
|
181
|
+
// An empty string is written if the file doesn't exist.
|
|
182
|
+
const content = await fs.readFile(hiddenGitIgnorePath, 'utf-8');
|
|
183
|
+
expect(content).toBe('');
|
|
217
184
|
});
|
|
218
185
|
it('should throw an error if reading projectRoot .gitignore fails with other errors', async () => {
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
});
|
|
226
|
-
hoistedMockIsNodeError.mockImplementation((e) => e instanceof Error);
|
|
227
|
-
const service = new GitService(mockProjectRoot);
|
|
228
|
-
await expect(service.setupShadowGitRepository()).rejects.toThrow('Read permission denied');
|
|
186
|
+
const visibleGitIgnorePath = path.join(projectRoot, '.gitignore');
|
|
187
|
+
// Create a directory instead of a file to cause a read error
|
|
188
|
+
await fs.mkdir(visibleGitIgnorePath);
|
|
189
|
+
const service = new GitService(projectRoot);
|
|
190
|
+
// EISDIR is the expected error code on Unix-like systems
|
|
191
|
+
await expect(service.setupShadowGitRepository()).rejects.toThrow(/EISDIR: illegal operation on a directory, read|EBUSY: resource busy or locked, read/);
|
|
229
192
|
});
|
|
230
193
|
it('should make an initial commit if no commits exist in history repo', async () => {
|
|
231
194
|
hoistedMockCheckIsRepo.mockResolvedValue(false);
|
|
232
|
-
const service = new GitService(
|
|
195
|
+
const service = new GitService(projectRoot);
|
|
233
196
|
await service.setupShadowGitRepository();
|
|
234
197
|
expect(hoistedMockCommit).toHaveBeenCalledWith('Initial commit', {
|
|
235
198
|
'--allow-empty': null,
|
|
@@ -237,7 +200,7 @@ describe('GitService', () => {
|
|
|
237
200
|
});
|
|
238
201
|
it('should not make an initial commit if commits already exist', async () => {
|
|
239
202
|
hoistedMockCheckIsRepo.mockResolvedValue(true);
|
|
240
|
-
const service = new GitService(
|
|
203
|
+
const service = new GitService(projectRoot);
|
|
241
204
|
await service.setupShadowGitRepository();
|
|
242
205
|
expect(hoistedMockCommit).not.toHaveBeenCalled();
|
|
243
206
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitService.test.js","sourceRoot":"","sources":["../../../src/services/gitService.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gitService.test.js","sourceRoot":"","sources":["../../../src/services/gitService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export { TodoReminderService } from './todo-reminder-service.js';
|
|
7
|
+
export type { TodoStateChange } from './todo-reminder-service.js';
|
|
8
|
+
export { ComplexityAnalyzer } from './complexity-analyzer.js';
|
|
9
|
+
export type { ComplexityAnalysisResult, ComplexityAnalyzerOptions, AnalysisStats, } from './complexity-analyzer.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -12,16 +12,26 @@ import { Config } from '../config/config.js';
|
|
|
12
12
|
export declare class LoopDetectionService {
|
|
13
13
|
private readonly config;
|
|
14
14
|
private promptId;
|
|
15
|
+
private promptService;
|
|
15
16
|
private lastToolCallKey;
|
|
16
17
|
private toolCallRepetitionCount;
|
|
17
18
|
private streamContentHistory;
|
|
18
19
|
private contentStats;
|
|
19
20
|
private lastContentIndex;
|
|
20
21
|
private loopDetected;
|
|
22
|
+
private inCodeBlock;
|
|
21
23
|
private turnsInCurrentPrompt;
|
|
22
24
|
private llmCheckInterval;
|
|
23
25
|
private lastCheckTurn;
|
|
24
26
|
constructor(config: Config);
|
|
27
|
+
/**
|
|
28
|
+
* Get the loop detection prompt from the prompt service
|
|
29
|
+
*/
|
|
30
|
+
private getLoopDetectionPrompt;
|
|
31
|
+
/**
|
|
32
|
+
* Fallback prompt if the prompt service is not available
|
|
33
|
+
*/
|
|
34
|
+
private getFallbackLoopDetectionPrompt;
|
|
25
35
|
private getToolCallKey;
|
|
26
36
|
/**
|
|
27
37
|
* Processes a stream event and checks for loop conditions.
|
|
@@ -49,6 +59,8 @@ export declare class LoopDetectionService {
|
|
|
49
59
|
* 2. Truncating history if it exceeds the maximum length
|
|
50
60
|
* 3. Analyzing content chunks for repetitive patterns using hashing
|
|
51
61
|
* 4. Detecting loops when identical chunks appear frequently within a short distance
|
|
62
|
+
* 5. Disabling loop detection within code blocks to prevent false positives,
|
|
63
|
+
* as repetitive code structures are common and not necessarily loops.
|
|
52
64
|
*/
|
|
53
65
|
private checkContentLoop;
|
|
54
66
|
/**
|
|
@@ -9,6 +9,9 @@ import { logLoopDetected } from '../telemetry/loggers.js';
|
|
|
9
9
|
import { LoopDetectedEvent, LoopType } from '../telemetry/types.js';
|
|
10
10
|
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/config.js';
|
|
11
11
|
import { Type } from '@google/genai';
|
|
12
|
+
import { PromptService } from '../prompt-config/prompt-service.js';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import os from 'node:os';
|
|
12
15
|
const TOOL_CALL_LOOP_THRESHOLD = 10;
|
|
13
16
|
const CONTENT_LOOP_THRESHOLD = 15;
|
|
14
17
|
const CONTENT_CHUNK_SIZE = 50;
|
|
@@ -43,6 +46,7 @@ const MAX_LLM_CHECK_INTERVAL = 15;
|
|
|
43
46
|
export class LoopDetectionService {
|
|
44
47
|
config;
|
|
45
48
|
promptId = '';
|
|
49
|
+
promptService = null;
|
|
46
50
|
// Tool call tracking
|
|
47
51
|
lastToolCallKey = null;
|
|
48
52
|
toolCallRepetitionCount = 0;
|
|
@@ -51,6 +55,7 @@ export class LoopDetectionService {
|
|
|
51
55
|
contentStats = new Map();
|
|
52
56
|
lastContentIndex = 0;
|
|
53
57
|
loopDetected = false;
|
|
58
|
+
inCodeBlock = false;
|
|
54
59
|
// LLM loop track tracking
|
|
55
60
|
turnsInCurrentPrompt = 0;
|
|
56
61
|
llmCheckInterval = DEFAULT_LLM_CHECK_INTERVAL;
|
|
@@ -58,6 +63,45 @@ export class LoopDetectionService {
|
|
|
58
63
|
constructor(config) {
|
|
59
64
|
this.config = config;
|
|
60
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Get the loop detection prompt from the prompt service
|
|
68
|
+
*/
|
|
69
|
+
async getLoopDetectionPrompt() {
|
|
70
|
+
if (!this.promptService) {
|
|
71
|
+
const baseDir = process.env.LLXPRT_PROMPTS_DIR ||
|
|
72
|
+
path.join(os.homedir(), '.llxprt', 'prompts');
|
|
73
|
+
this.promptService = new PromptService({
|
|
74
|
+
baseDir,
|
|
75
|
+
debugMode: process.env.DEBUG === 'true',
|
|
76
|
+
});
|
|
77
|
+
await this.promptService.initialize();
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return await this.promptService.loadPrompt('services/loop-detection.md');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// Fall back to default if file loading fails
|
|
84
|
+
console.warn('Failed to load loop detection prompt from file, using fallback:', error);
|
|
85
|
+
return this.getFallbackLoopDetectionPrompt();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fallback prompt if the prompt service is not available
|
|
90
|
+
*/
|
|
91
|
+
getFallbackLoopDetectionPrompt() {
|
|
92
|
+
return `You are a sophisticated AI diagnostic agent specializing in identifying when a conversational AI is stuck in an unproductive state. Your task is to analyze the provided conversation history and determine if the assistant has ceased to make meaningful progress.
|
|
93
|
+
|
|
94
|
+
An unproductive state is characterized by one or more of the following patterns over the last 5 or more assistant turns:
|
|
95
|
+
|
|
96
|
+
Repetitive Actions: The assistant repeats the same tool calls or conversational responses a decent number of times. This includes simple loops (e.g., tool_A, tool_A, tool_A) and alternating patterns (e.g., tool_A, tool_B, tool_A, tool_B, ...).
|
|
97
|
+
|
|
98
|
+
Cognitive Loop: The assistant seems unable to determine the next logical step. It might express confusion, repeatedly ask the same questions, or generate responses that don't logically follow from the previous turns, indicating it's stuck and not advancing the task.
|
|
99
|
+
|
|
100
|
+
Crucially, differentiate between a true unproductive state and legitimate, incremental progress.
|
|
101
|
+
For example, a series of 'tool_A' or 'tool_B' tool calls that make small, distinct changes to the same file (like adding docstrings to functions one by one) is considered forward progress and is NOT a loop. A loop would be repeatedly replacing the same text with the same content, or cycling between a small set of files with no net change.
|
|
102
|
+
|
|
103
|
+
Please analyze the conversation history to determine the possibility that the conversation is stuck in a repetitive, non-productive state.`;
|
|
104
|
+
}
|
|
61
105
|
getToolCallKey(toolCall) {
|
|
62
106
|
const argsString = JSON.stringify(toolCall.args);
|
|
63
107
|
const keyString = `${toolCall.name}:${argsString}`;
|
|
@@ -129,8 +173,25 @@ export class LoopDetectionService {
|
|
|
129
173
|
* 2. Truncating history if it exceeds the maximum length
|
|
130
174
|
* 3. Analyzing content chunks for repetitive patterns using hashing
|
|
131
175
|
* 4. Detecting loops when identical chunks appear frequently within a short distance
|
|
176
|
+
* 5. Disabling loop detection within code blocks to prevent false positives,
|
|
177
|
+
* as repetitive code structures are common and not necessarily loops.
|
|
132
178
|
*/
|
|
133
179
|
checkContentLoop(content) {
|
|
180
|
+
// Code blocks can often contain repetitive syntax that is not indicative of a loop.
|
|
181
|
+
// To avoid false positives, we detect when we are inside a code block and
|
|
182
|
+
// temporarily disable loop detection.
|
|
183
|
+
const numFences = (content.match(/```/g) ?? []).length;
|
|
184
|
+
if (numFences) {
|
|
185
|
+
// Reset tracking when a code fence is detected to avoid analyzing content
|
|
186
|
+
// that spans across code block boundaries.
|
|
187
|
+
this.resetContentTracking();
|
|
188
|
+
}
|
|
189
|
+
const wasInCodeBlock = this.inCodeBlock;
|
|
190
|
+
this.inCodeBlock =
|
|
191
|
+
numFences % 2 === 0 ? this.inCodeBlock : !this.inCodeBlock;
|
|
192
|
+
if (wasInCodeBlock) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
134
195
|
this.streamContentHistory += content;
|
|
135
196
|
this.truncateAndUpdate();
|
|
136
197
|
return this.analyzeContentChunksForLoop();
|
|
@@ -231,18 +292,7 @@ export class LoopDetectionService {
|
|
|
231
292
|
.getGeminiClient()
|
|
232
293
|
.getHistory()
|
|
233
294
|
.slice(-LLM_LOOP_CHECK_HISTORY_COUNT);
|
|
234
|
-
const prompt =
|
|
235
|
-
|
|
236
|
-
An unproductive state is characterized by one or more of the following patterns over the last 5 or more assistant turns:
|
|
237
|
-
|
|
238
|
-
Repetitive Actions: The assistant repeats the same tool calls or conversational responses a decent number of times. This includes simple loops (e.g., tool_A, tool_A, tool_A) and alternating patterns (e.g., tool_A, tool_B, tool_A, tool_B, ...).
|
|
239
|
-
|
|
240
|
-
Cognitive Loop: The assistant seems unable to determine the next logical step. It might express confusion, repeatedly ask the same questions, or generate responses that don't logically follow from the previous turns, indicating it's stuck and not advancing the task.
|
|
241
|
-
|
|
242
|
-
Crucially, differentiate between a true unproductive state and legitimate, incremental progress.
|
|
243
|
-
For example, a series of 'tool_A' or 'tool_B' tool calls that make small, distinct changes to the same file (like adding docstrings to functions one by one) is considered forward progress and is NOT a loop. A loop would be repeatedly replacing the same text with the same content, or cycling between a small set of files with no net change.
|
|
244
|
-
|
|
245
|
-
Please analyze the conversation history to determine the possibility that the conversation is stuck in a repetitive, non-productive state.`;
|
|
295
|
+
const prompt = await this.getLoopDetectionPrompt();
|
|
246
296
|
const contents = [
|
|
247
297
|
...recentHistory,
|
|
248
298
|
{ role: 'user', parts: [{ text: prompt }] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loopDetectionService.js","sourceRoot":"","sources":["../../../src/services/loopDetectionService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,eAAe,EAA2B,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAU,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAe,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"loopDetectionService.js","sourceRoot":"","sources":["../../../src/services/loopDetectionService.ts"],"names":[],"mappings":"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"}
|