@vybestack/llxprt-code-core 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.last_build +0 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/src/__mocks__/fs/promises.d.ts +11 -0
- package/dist/src/__mocks__/fs/promises.js +17 -0
- package/dist/src/__mocks__/fs/promises.js.map +1 -0
- package/dist/src/code_assist/codeAssist.d.ts +9 -0
- package/dist/src/code_assist/codeAssist.js +19 -0
- package/dist/src/code_assist/codeAssist.js.map +1 -0
- package/dist/src/code_assist/converter.d.ts +68 -0
- package/dist/src/code_assist/converter.js +125 -0
- package/dist/src/code_assist/converter.js.map +1 -0
- package/dist/src/code_assist/converter.test.d.ts +6 -0
- package/dist/src/code_assist/converter.test.js +229 -0
- package/dist/src/code_assist/converter.test.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +20 -0
- package/dist/src/code_assist/oauth2.js +339 -0
- package/dist/src/code_assist/oauth2.js.map +1 -0
- package/dist/src/code_assist/oauth2.test.d.ts +6 -0
- package/dist/src/code_assist/oauth2.test.js +249 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -0
- package/dist/src/code_assist/server.d.ts +39 -0
- package/dist/src/code_assist/server.js +191 -0
- package/dist/src/code_assist/server.js.map +1 -0
- package/dist/src/code_assist/server.test.d.ts +6 -0
- package/dist/src/code_assist/server.test.js +123 -0
- package/dist/src/code_assist/server.test.js.map +1 -0
- package/dist/src/code_assist/setup.d.ts +15 -0
- package/dist/src/code_assist/setup.js +67 -0
- package/dist/src/code_assist/setup.js.map +1 -0
- package/dist/src/code_assist/setup.test.d.ts +6 -0
- package/dist/src/code_assist/setup.test.js +62 -0
- package/dist/src/code_assist/setup.test.js.map +1 -0
- package/dist/src/code_assist/types.d.ts +148 -0
- package/dist/src/code_assist/types.js +46 -0
- package/dist/src/code_assist/types.js.map +1 -0
- package/dist/src/config/config.d.ts +212 -0
- package/dist/src/config/config.js +454 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/config.test.d.ts +6 -0
- package/dist/src/config/config.test.js +291 -0
- package/dist/src/config/config.test.js.map +1 -0
- package/dist/src/config/flashFallback.test.d.ts +6 -0
- package/dist/src/config/flashFallback.test.js +115 -0
- package/dist/src/config/flashFallback.test.js.map +1 -0
- package/dist/src/config/models.d.ts +8 -0
- package/dist/src/config/models.js +9 -0
- package/dist/src/config/models.js.map +1 -0
- package/dist/src/core/client.d.ts +59 -0
- package/dist/src/core/client.js +503 -0
- package/dist/src/core/client.js.map +1 -0
- package/dist/src/core/client.test.d.ts +6 -0
- package/dist/src/core/client.test.js +1006 -0
- package/dist/src/core/client.test.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +36 -0
- package/dist/src/core/contentGenerator.js +79 -0
- package/dist/src/core/contentGenerator.js.map +1 -0
- package/dist/src/core/contentGenerator.test.d.ts +6 -0
- package/dist/src/core/contentGenerator.test.js +92 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -0
- package/dist/src/core/coreToolScheduler.d.ts +104 -0
- package/dist/src/core/coreToolScheduler.js +413 -0
- package/dist/src/core/coreToolScheduler.js.map +1 -0
- package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
- package/dist/src/core/coreToolScheduler.test.js +347 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -0
- package/dist/src/core/geminiChat.d.ts +116 -0
- package/dist/src/core/geminiChat.js +513 -0
- package/dist/src/core/geminiChat.js.map +1 -0
- package/dist/src/core/geminiChat.test.d.ts +6 -0
- package/dist/src/core/geminiChat.test.js +424 -0
- package/dist/src/core/geminiChat.test.js.map +1 -0
- package/dist/src/core/geminiRequest.d.ts +13 -0
- package/dist/src/core/geminiRequest.js +45 -0
- package/dist/src/core/geminiRequest.js.map +1 -0
- package/dist/src/core/geminiRequest.test.d.ts +6 -0
- package/dist/src/core/geminiRequest.test.js +72 -0
- package/dist/src/core/geminiRequest.test.js.map +1 -0
- package/dist/src/core/logger.d.ts +38 -0
- package/dist/src/core/logger.js +237 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/logger.test.d.ts +6 -0
- package/dist/src/core/logger.test.js +387 -0
- package/dist/src/core/logger.test.js.map +1 -0
- package/dist/src/core/modelCheck.d.ts +14 -0
- package/dist/src/core/modelCheck.js +55 -0
- package/dist/src/core/modelCheck.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.d.ts +12 -0
- package/dist/src/core/nonInteractiveToolExecutor.js +93 -0
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js +180 -0
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
- package/dist/src/core/prompts.d.ts +12 -0
- package/dist/src/core/prompts.js +418 -0
- package/dist/src/core/prompts.js.map +1 -0
- package/dist/src/core/prompts.test.d.ts +6 -0
- package/dist/src/core/prompts.test.js +97 -0
- package/dist/src/core/prompts.test.js.map +1 -0
- package/dist/src/core/tokenLimits.d.ts +10 -0
- package/dist/src/core/tokenLimits.js +75 -0
- package/dist/src/core/tokenLimits.js.map +1 -0
- package/dist/src/core/tokenLimits.test.d.ts +6 -0
- package/dist/src/core/tokenLimits.test.js +66 -0
- package/dist/src/core/tokenLimits.test.js.map +1 -0
- package/dist/src/core/turn.d.ts +116 -0
- package/dist/src/core/turn.js +131 -0
- package/dist/src/core/turn.js.map +1 -0
- package/dist/src/core/turn.test.d.ts +6 -0
- package/dist/src/core/turn.test.js +237 -0
- package/dist/src/core/turn.test.js.map +1 -0
- package/dist/src/index.d.ts +57 -0
- package/dist/src/index.js +64 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +6 -0
- package/dist/src/index.test.js +12 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/providers/ProviderContentGenerator.d.ts +21 -0
- package/dist/src/providers/ProviderContentGenerator.js +52 -0
- package/dist/src/providers/ProviderContentGenerator.js.map +1 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +68 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +549 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +6 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +253 -0
- package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -0
- package/dist/src/providers/types.d.ts +82 -0
- package/dist/src/providers/types.js +7 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.d.ts +35 -0
- package/dist/src/services/fileDiscoveryService.js +91 -0
- package/dist/src/services/fileDiscoveryService.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/fileDiscoveryService.test.js +102 -0
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
- package/dist/src/services/gitService.d.ts +21 -0
- package/dist/src/services/gitService.js +102 -0
- package/dist/src/services/gitService.js.map +1 -0
- package/dist/src/services/gitService.test.d.ts +6 -0
- package/dist/src/services/gitService.test.js +246 -0
- package/dist/src/services/gitService.test.js.map +1 -0
- package/dist/src/services/ideContext.d.ts +124 -0
- package/dist/src/services/ideContext.js +90 -0
- package/dist/src/services/ideContext.js.map +1 -0
- package/dist/src/services/ideContext.test.d.ts +6 -0
- package/dist/src/services/ideContext.test.js +101 -0
- package/dist/src/services/ideContext.test.js.map +1 -0
- package/dist/src/services/loopDetectionService.d.ts +35 -0
- package/dist/src/services/loopDetectionService.js +117 -0
- package/dist/src/services/loopDetectionService.js.map +1 -0
- package/dist/src/services/loopDetectionService.test.d.ts +6 -0
- package/dist/src/services/loopDetectionService.test.js +232 -0
- package/dist/src/services/loopDetectionService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +35 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +424 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +47 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +123 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
- package/dist/src/telemetry/constants.d.ts +20 -0
- package/dist/src/telemetry/constants.js +21 -0
- package/dist/src/telemetry/constants.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +18 -0
- package/dist/src/telemetry/index.js +20 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
- package/dist/src/telemetry/integration.test.circular.js +53 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +15 -0
- package/dist/src/telemetry/loggers.js +229 -0
- package/dist/src/telemetry/loggers.js.map +1 -0
- package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.circular.js +100 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
- package/dist/src/telemetry/loggers.test.d.ts +6 -0
- package/dist/src/telemetry/loggers.test.js +558 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +19 -0
- package/dist/src/telemetry/metrics.js +144 -0
- package/dist/src/telemetry/metrics.js.map +1 -0
- package/dist/src/telemetry/metrics.test.d.ts +6 -0
- package/dist/src/telemetry/metrics.test.js +162 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -0
- package/dist/src/telemetry/sdk.d.ts +9 -0
- package/dist/src/telemetry/sdk.js +120 -0
- package/dist/src/telemetry/sdk.js.map +1 -0
- package/dist/src/telemetry/telemetry.test.d.ts +6 -0
- package/dist/src/telemetry/telemetry.test.js +52 -0
- package/dist/src/telemetry/telemetry.test.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +115 -0
- package/dist/src/telemetry/types.js +217 -0
- package/dist/src/telemetry/types.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
- package/dist/src/telemetry/uiTelemetry.js +131 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
- package/dist/src/telemetry/uiTelemetry.test.js +412 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
- package/dist/src/tools/diffOptions.d.ts +7 -0
- package/dist/src/tools/diffOptions.js +10 -0
- package/dist/src/tools/diffOptions.js.map +1 -0
- package/dist/src/tools/edit.d.ts +73 -0
- package/dist/src/tools/edit.js +343 -0
- package/dist/src/tools/edit.js.map +1 -0
- package/dist/src/tools/edit.test.d.ts +6 -0
- package/dist/src/tools/edit.test.js +500 -0
- package/dist/src/tools/edit.test.js.map +1 -0
- package/dist/src/tools/glob.d.ts +58 -0
- package/dist/src/tools/glob.js +193 -0
- package/dist/src/tools/glob.js.map +1 -0
- package/dist/src/tools/glob.test.d.ts +6 -0
- package/dist/src/tools/glob.test.js +294 -0
- package/dist/src/tools/glob.test.js.map +1 -0
- package/dist/src/tools/grep.d.ts +78 -0
- package/dist/src/tools/grep.js +422 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/grep.test.d.ts +6 -0
- package/dist/src/tools/grep.test.js +188 -0
- package/dist/src/tools/grep.test.js.map +1 -0
- package/dist/src/tools/ls.d.ts +83 -0
- package/dist/src/tools/ls.js +194 -0
- package/dist/src/tools/ls.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +112 -0
- package/dist/src/tools/mcp-client.js +332 -0
- package/dist/src/tools/mcp-client.js.map +1 -0
- package/dist/src/tools/mcp-client.test.d.ts +6 -0
- package/dist/src/tools/mcp-client.test.js +227 -0
- package/dist/src/tools/mcp-client.test.js.map +1 -0
- package/dist/src/tools/mcp-tool.d.ts +23 -0
- package/dist/src/tools/mcp-tool.js +119 -0
- package/dist/src/tools/mcp-tool.js.map +1 -0
- package/dist/src/tools/mcp-tool.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool.test.js +173 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +28 -0
- package/dist/src/tools/memoryTool.js +172 -0
- package/dist/src/tools/memoryTool.js.map +1 -0
- package/dist/src/tools/memoryTool.test.d.ts +6 -0
- package/dist/src/tools/memoryTool.test.js +181 -0
- package/dist/src/tools/memoryTool.test.js.map +1 -0
- package/dist/src/tools/modifiable-tool.d.ts +29 -0
- package/dist/src/tools/modifiable-tool.js +85 -0
- package/dist/src/tools/modifiable-tool.js.map +1 -0
- package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
- package/dist/src/tools/modifiable-tool.test.js +204 -0
- package/dist/src/tools/modifiable-tool.test.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +35 -0
- package/dist/src/tools/read-file.js +106 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/read-file.test.d.ts +6 -0
- package/dist/src/tools/read-file.test.js +181 -0
- package/dist/src/tools/read-file.test.js.map +1 -0
- package/dist/src/tools/read-many-files.d.ts +59 -0
- package/dist/src/tools/read-many-files.js +321 -0
- package/dist/src/tools/read-many-files.js.map +1 -0
- package/dist/src/tools/read-many-files.test.d.ts +6 -0
- package/dist/src/tools/read-many-files.test.js +312 -0
- package/dist/src/tools/read-many-files.test.js.map +1 -0
- package/dist/src/tools/shell.d.ts +43 -0
- package/dist/src/tools/shell.js +435 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/shell.test.d.ts +6 -0
- package/dist/src/tools/shell.test.js +407 -0
- package/dist/src/tools/shell.test.js.map +1 -0
- package/dist/src/tools/todo-read.d.ts +15 -0
- package/dist/src/tools/todo-read.js +66 -0
- package/dist/src/tools/todo-read.js.map +1 -0
- package/dist/src/tools/todo-read.test.d.ts +6 -0
- package/dist/src/tools/todo-read.test.js +158 -0
- package/dist/src/tools/todo-read.test.js.map +1 -0
- package/dist/src/tools/todo-schemas.d.ts +43 -0
- package/dist/src/tools/todo-schemas.js +16 -0
- package/dist/src/tools/todo-schemas.js.map +1 -0
- package/dist/src/tools/todo-schemas.test.d.ts +6 -0
- package/dist/src/tools/todo-schemas.test.js +152 -0
- package/dist/src/tools/todo-schemas.test.js.map +1 -0
- package/dist/src/tools/todo-store.d.ts +15 -0
- package/dist/src/tools/todo-store.js +59 -0
- package/dist/src/tools/todo-store.js.map +1 -0
- package/dist/src/tools/todo-store.test.d.ts +6 -0
- package/dist/src/tools/todo-store.test.js +175 -0
- package/dist/src/tools/todo-store.test.js.map +1 -0
- package/dist/src/tools/todo-write.d.ts +17 -0
- package/dist/src/tools/todo-write.js +98 -0
- package/dist/src/tools/todo-write.js.map +1 -0
- package/dist/src/tools/todo-write.test.d.ts +6 -0
- package/dist/src/tools/todo-write.test.js +208 -0
- package/dist/src/tools/todo-write.test.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +67 -0
- package/dist/src/tools/tool-registry.js +326 -0
- package/dist/src/tools/tool-registry.js.map +1 -0
- package/dist/src/tools/tool-registry.test.d.ts +6 -0
- package/dist/src/tools/tool-registry.test.js +398 -0
- package/dist/src/tools/tool-registry.test.js.map +1 -0
- package/dist/src/tools/tools.d.ts +184 -0
- package/dist/src/tools/tools.js +88 -0
- package/dist/src/tools/tools.js.map +1 -0
- package/dist/src/tools/web-fetch.d.ts +29 -0
- package/dist/src/tools/web-fetch.js +243 -0
- package/dist/src/tools/web-fetch.js.map +1 -0
- package/dist/src/tools/web-fetch.test.d.ts +6 -0
- package/dist/src/tools/web-fetch.test.js +70 -0
- package/dist/src/tools/web-fetch.test.js.map +1 -0
- package/dist/src/tools/web-search.d.ts +49 -0
- package/dist/src/tools/web-search.js +120 -0
- package/dist/src/tools/web-search.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +42 -0
- package/dist/src/tools/write-file.js +248 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/tools/write-file.test.d.ts +6 -0
- package/dist/src/tools/write-file.test.js +413 -0
- package/dist/src/tools/write-file.test.js.map +1 -0
- package/dist/src/utils/LruCache.d.ts +13 -0
- package/dist/src/utils/LruCache.js +38 -0
- package/dist/src/utils/LruCache.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.d.ts +22 -0
- package/dist/src/utils/bfsFileSearch.js +62 -0
- package/dist/src/utils/bfsFileSearch.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
- package/dist/src/utils/bfsFileSearch.test.js +129 -0
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
- package/dist/src/utils/editCorrector.d.ts +53 -0
- package/dist/src/utils/editCorrector.js +546 -0
- package/dist/src/utils/editCorrector.js.map +1 -0
- package/dist/src/utils/editCorrector.test.d.ts +6 -0
- package/dist/src/utils/editCorrector.test.js +564 -0
- package/dist/src/utils/editCorrector.test.js.map +1 -0
- package/dist/src/utils/editor.d.ts +28 -0
- package/dist/src/utils/editor.js +163 -0
- package/dist/src/utils/editor.js.map +1 -0
- package/dist/src/utils/editor.test.d.ts +6 -0
- package/dist/src/utils/editor.test.js +293 -0
- package/dist/src/utils/editor.test.js.map +1 -0
- package/dist/src/utils/errorReporting.d.ts +14 -0
- package/dist/src/utils/errorReporting.js +88 -0
- package/dist/src/utils/errorReporting.js.map +1 -0
- package/dist/src/utils/errorReporting.test.d.ts +6 -0
- package/dist/src/utils/errorReporting.test.js +124 -0
- package/dist/src/utils/errorReporting.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +14 -0
- package/dist/src/utils/errors.js +54 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +11 -0
- package/dist/src/utils/fetch.js +51 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/fileUtils.d.ts +49 -0
- package/dist/src/utils/fileUtils.js +286 -0
- package/dist/src/utils/fileUtils.js.map +1 -0
- package/dist/src/utils/fileUtils.test.d.ts +6 -0
- package/dist/src/utils/fileUtils.test.js +321 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -0
- package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
- package/dist/src/utils/flashFallback.integration.test.js +112 -0
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
- package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
- package/dist/src/utils/generateContentResponseUtilities.js +92 -0
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
- package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
- package/dist/src/utils/getFolderStructure.d.ts +30 -0
- package/dist/src/utils/getFolderStructure.js +247 -0
- package/dist/src/utils/getFolderStructure.js.map +1 -0
- package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
- package/dist/src/utils/getFolderStructure.test.js +298 -0
- package/dist/src/utils/getFolderStructure.test.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
- package/dist/src/utils/gitIgnoreParser.js +64 -0
- package/dist/src/utils/gitIgnoreParser.js.map +1 -0
- package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
- package/dist/src/utils/gitIgnoreParser.test.js +145 -0
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +17 -0
- package/dist/src/utils/gitUtils.js +61 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +14 -0
- package/dist/src/utils/memoryDiscovery.js +219 -0
- package/dist/src/utils/memoryDiscovery.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
- package/dist/src/utils/memoryDiscovery.test.js +432 -0
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
- package/dist/src/utils/memoryImportProcessor.js +141 -0
- package/dist/src/utils/memoryImportProcessor.js.map +1 -0
- package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
- package/dist/src/utils/memoryImportProcessor.test.js +170 -0
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
- package/dist/src/utils/messageInspectors.d.ts +8 -0
- package/dist/src/utils/messageInspectors.js +16 -0
- package/dist/src/utils/messageInspectors.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
- package/dist/src/utils/nextSpeakerChecker.js +113 -0
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
- package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
- package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +49 -0
- package/dist/src/utils/paths.js +145 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/quotaErrorDetection.d.ts +22 -0
- package/dist/src/utils/quotaErrorDetection.js +67 -0
- package/dist/src/utils/quotaErrorDetection.js.map +1 -0
- package/dist/src/utils/retry.d.ts +21 -0
- package/dist/src/utils/retry.js +276 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/retry.test.d.ts +6 -0
- package/dist/src/utils/retry.test.js +322 -0
- package/dist/src/utils/retry.test.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.d.ts +13 -0
- package/dist/src/utils/safeJsonStringify.js +25 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
- package/dist/src/utils/safeJsonStringify.test.js +61 -0
- package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
- package/dist/src/utils/schemaValidator.d.ts +23 -0
- package/dist/src/utils/schemaValidator.js +142 -0
- package/dist/src/utils/schemaValidator.js.map +1 -0
- package/dist/src/utils/schemaValidator.test.d.ts +6 -0
- package/dist/src/utils/schemaValidator.test.js +146 -0
- package/dist/src/utils/schemaValidator.test.js.map +1 -0
- package/dist/src/utils/session.d.ts +6 -0
- package/dist/src/utils/session.js +8 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/summarizer.d.ts +25 -0
- package/dist/src/utils/summarizer.js +80 -0
- package/dist/src/utils/summarizer.js.map +1 -0
- package/dist/src/utils/summarizer.test.d.ts +6 -0
- package/dist/src/utils/summarizer.test.js +131 -0
- package/dist/src/utils/summarizer.test.js.map +1 -0
- package/dist/src/utils/testUtils.d.ts +29 -0
- package/dist/src/utils/testUtils.js +70 -0
- package/dist/src/utils/testUtils.js.map +1 -0
- package/dist/src/utils/user_account.d.ts +9 -0
- package/dist/src/utils/user_account.js +99 -0
- package/dist/src/utils/user_account.js.map +1 -0
- package/dist/src/utils/user_account.test.d.ts +6 -0
- package/dist/src/utils/user_account.test.js +153 -0
- package/dist/src/utils/user_account.test.js.map +1 -0
- package/dist/src/utils/user_id.d.ts +11 -0
- package/dist/src/utils/user_id.js +49 -0
- package/dist/src/utils/user_id.js.map +1 -0
- package/dist/src/utils/user_id.test.d.ts +6 -0
- package/dist/src/utils/user_id.test.js +21 -0
- package/dist/src/utils/user_id.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
- package/package.json +62 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
|
7
|
+
import * as fsPromises from 'fs/promises';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { loadServerHierarchicalMemory } from './memoryDiscovery.js';
|
|
11
|
+
import { LLXPRT_CONFIG_DIR, setLlxprtMdFilename, getCurrentLlxprtMdFilename, DEFAULT_CONTEXT_FILENAME, } from '../tools/memoryTool.js';
|
|
12
|
+
import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
|
|
13
|
+
const ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST = DEFAULT_CONTEXT_FILENAME;
|
|
14
|
+
// Mock the entire fs/promises module
|
|
15
|
+
vi.mock('fs/promises');
|
|
16
|
+
// Mock the parts of fsSync we might use (like constants or existsSync if needed)
|
|
17
|
+
vi.mock('fs', async (importOriginal) => {
|
|
18
|
+
const actual = await importOriginal();
|
|
19
|
+
return {
|
|
20
|
+
...actual, // Spread actual to get all exports, including Stats and Dirent if they are classes/constructors
|
|
21
|
+
constants: { ...actual.constants }, // Preserve constants
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
vi.mock('os');
|
|
25
|
+
describe('loadServerHierarchicalMemory', () => {
|
|
26
|
+
const mockFs = fsPromises;
|
|
27
|
+
const mockOs = os;
|
|
28
|
+
const CWD = '/test/project/src';
|
|
29
|
+
const PROJECT_ROOT = '/test/project';
|
|
30
|
+
const USER_HOME = '/test/userhome';
|
|
31
|
+
let GLOBAL_LLXPRT_DIR;
|
|
32
|
+
let GLOBAL_GEMINI_FILE; // Defined in beforeEach
|
|
33
|
+
const fileService = new FileDiscoveryService(PROJECT_ROOT);
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
vi.resetAllMocks();
|
|
36
|
+
// Set environment variables to indicate test environment
|
|
37
|
+
process.env.NODE_ENV = 'test';
|
|
38
|
+
process.env.VITEST = 'true';
|
|
39
|
+
setLlxprtMdFilename(DEFAULT_CONTEXT_FILENAME); // Use defined const
|
|
40
|
+
mockOs.homedir.mockReturnValue(USER_HOME);
|
|
41
|
+
// Define these here to use potentially reset/updated values from imports
|
|
42
|
+
GLOBAL_LLXPRT_DIR = path.join(USER_HOME, LLXPRT_CONFIG_DIR);
|
|
43
|
+
GLOBAL_GEMINI_FILE = path.join(GLOBAL_LLXPRT_DIR, getCurrentLlxprtMdFilename());
|
|
44
|
+
mockFs.stat.mockRejectedValue(new Error('File not found'));
|
|
45
|
+
mockFs.readdir.mockResolvedValue([]);
|
|
46
|
+
mockFs.readFile.mockRejectedValue(new Error('File not found'));
|
|
47
|
+
mockFs.access.mockRejectedValue(new Error('File not found'));
|
|
48
|
+
});
|
|
49
|
+
it('should return empty memory and count if no context files are found', async () => {
|
|
50
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
51
|
+
expect(memoryContent).toBe('');
|
|
52
|
+
expect(fileCount).toBe(0);
|
|
53
|
+
});
|
|
54
|
+
it('should load only the global context file if present and others are not (default filename)', async () => {
|
|
55
|
+
const globalDefaultFile = path.join(GLOBAL_LLXPRT_DIR, DEFAULT_CONTEXT_FILENAME);
|
|
56
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
57
|
+
if (p === globalDefaultFile) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('File not found');
|
|
61
|
+
});
|
|
62
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
63
|
+
if (p === globalDefaultFile) {
|
|
64
|
+
return 'Global memory content';
|
|
65
|
+
}
|
|
66
|
+
throw new Error('File not found');
|
|
67
|
+
});
|
|
68
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
69
|
+
expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalDefaultFile)} ---\nGlobal memory content\n--- End of Context from: ${path.relative(CWD, globalDefaultFile)} ---`);
|
|
70
|
+
expect(fileCount).toBe(1);
|
|
71
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(globalDefaultFile, 'utf-8');
|
|
72
|
+
});
|
|
73
|
+
it('should load only the global custom context file if present and filename is changed', async () => {
|
|
74
|
+
const customFilename = 'CUSTOM_AGENTS.md';
|
|
75
|
+
setLlxprtMdFilename(customFilename);
|
|
76
|
+
const globalCustomFile = path.join(GLOBAL_LLXPRT_DIR, customFilename);
|
|
77
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
78
|
+
if (p === globalCustomFile) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
throw new Error('File not found');
|
|
82
|
+
});
|
|
83
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
84
|
+
if (p === globalCustomFile) {
|
|
85
|
+
return 'Global custom memory';
|
|
86
|
+
}
|
|
87
|
+
throw new Error('File not found');
|
|
88
|
+
});
|
|
89
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
90
|
+
expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalCustomFile)} ---\nGlobal custom memory\n--- End of Context from: ${path.relative(CWD, globalCustomFile)} ---`);
|
|
91
|
+
expect(fileCount).toBe(1);
|
|
92
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(globalCustomFile, 'utf-8');
|
|
93
|
+
});
|
|
94
|
+
it('should load context files by upward traversal with custom filename', async () => {
|
|
95
|
+
const customFilename = 'PROJECT_CONTEXT.md';
|
|
96
|
+
setLlxprtMdFilename(customFilename);
|
|
97
|
+
const projectRootCustomFile = path.join(PROJECT_ROOT, customFilename);
|
|
98
|
+
const srcCustomFile = path.join(CWD, customFilename);
|
|
99
|
+
mockFs.stat.mockImplementation(async (p) => {
|
|
100
|
+
if (p === path.join(PROJECT_ROOT, '.git')) {
|
|
101
|
+
return { isDirectory: () => true };
|
|
102
|
+
}
|
|
103
|
+
throw new Error('File not found');
|
|
104
|
+
});
|
|
105
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
106
|
+
if (p === projectRootCustomFile || p === srcCustomFile) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
throw new Error('File not found');
|
|
110
|
+
});
|
|
111
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
112
|
+
if (p === projectRootCustomFile) {
|
|
113
|
+
return 'Project root custom memory';
|
|
114
|
+
}
|
|
115
|
+
if (p === srcCustomFile) {
|
|
116
|
+
return 'Src directory custom memory';
|
|
117
|
+
}
|
|
118
|
+
throw new Error('File not found');
|
|
119
|
+
});
|
|
120
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
121
|
+
const expectedContent = `--- Context from: ${path.relative(CWD, projectRootCustomFile)} ---\nProject root custom memory\n--- End of Context from: ${path.relative(CWD, projectRootCustomFile)} ---\n\n` +
|
|
122
|
+
`--- Context from: ${customFilename} ---\nSrc directory custom memory\n--- End of Context from: ${customFilename} ---`;
|
|
123
|
+
expect(memoryContent).toBe(expectedContent);
|
|
124
|
+
expect(fileCount).toBe(2);
|
|
125
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(projectRootCustomFile, 'utf-8');
|
|
126
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(srcCustomFile, 'utf-8');
|
|
127
|
+
});
|
|
128
|
+
it('should load context files by downward traversal with custom filename', async () => {
|
|
129
|
+
const customFilename = 'LOCAL_CONTEXT.md';
|
|
130
|
+
setLlxprtMdFilename(customFilename);
|
|
131
|
+
const subDir = path.join(CWD, 'subdir');
|
|
132
|
+
const subDirCustomFile = path.join(subDir, customFilename);
|
|
133
|
+
const cwdCustomFile = path.join(CWD, customFilename);
|
|
134
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
135
|
+
if (p === cwdCustomFile || p === subDirCustomFile)
|
|
136
|
+
return undefined;
|
|
137
|
+
throw new Error('File not found');
|
|
138
|
+
});
|
|
139
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
140
|
+
if (p === cwdCustomFile)
|
|
141
|
+
return 'CWD custom memory';
|
|
142
|
+
if (p === subDirCustomFile)
|
|
143
|
+
return 'Subdir custom memory';
|
|
144
|
+
throw new Error('File not found');
|
|
145
|
+
});
|
|
146
|
+
mockFs.readdir.mockImplementation((async (p) => {
|
|
147
|
+
if (p === CWD) {
|
|
148
|
+
return [
|
|
149
|
+
{
|
|
150
|
+
name: customFilename,
|
|
151
|
+
isFile: () => true,
|
|
152
|
+
isDirectory: () => false,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'subdir',
|
|
156
|
+
isFile: () => false,
|
|
157
|
+
isDirectory: () => true,
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
if (p === subDir) {
|
|
162
|
+
return [
|
|
163
|
+
{
|
|
164
|
+
name: customFilename,
|
|
165
|
+
isFile: () => true,
|
|
166
|
+
isDirectory: () => false,
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
return [];
|
|
171
|
+
}));
|
|
172
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
173
|
+
const expectedContent = `--- Context from: ${customFilename} ---\nCWD custom memory\n--- End of Context from: ${customFilename} ---\n\n` +
|
|
174
|
+
`--- Context from: ${path.join('subdir', customFilename)} ---\nSubdir custom memory\n--- End of Context from: ${path.join('subdir', customFilename)} ---`;
|
|
175
|
+
expect(memoryContent).toBe(expectedContent);
|
|
176
|
+
expect(fileCount).toBe(2);
|
|
177
|
+
});
|
|
178
|
+
it('should load ORIGINAL_GEMINI_MD_FILENAME files by upward traversal from CWD to project root', async () => {
|
|
179
|
+
const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
180
|
+
const srcGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
181
|
+
mockFs.stat.mockImplementation(async (p) => {
|
|
182
|
+
if (p === path.join(PROJECT_ROOT, '.git')) {
|
|
183
|
+
return { isDirectory: () => true };
|
|
184
|
+
}
|
|
185
|
+
throw new Error('File not found');
|
|
186
|
+
});
|
|
187
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
188
|
+
if (p === projectRootGeminiFile || p === srcGeminiFile) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
throw new Error('File not found');
|
|
192
|
+
});
|
|
193
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
194
|
+
if (p === projectRootGeminiFile) {
|
|
195
|
+
return 'Project root memory';
|
|
196
|
+
}
|
|
197
|
+
if (p === srcGeminiFile) {
|
|
198
|
+
return 'Src directory memory';
|
|
199
|
+
}
|
|
200
|
+
throw new Error('File not found');
|
|
201
|
+
});
|
|
202
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
203
|
+
const expectedContent = `--- Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\nProject root memory\n--- End of Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\n\n` +
|
|
204
|
+
`--- Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\nSrc directory memory\n--- End of Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---`;
|
|
205
|
+
expect(memoryContent).toBe(expectedContent);
|
|
206
|
+
expect(fileCount).toBe(2);
|
|
207
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(projectRootGeminiFile, 'utf-8');
|
|
208
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(srcGeminiFile, 'utf-8');
|
|
209
|
+
});
|
|
210
|
+
it('should load ORIGINAL_GEMINI_MD_FILENAME files by downward traversal from CWD', async () => {
|
|
211
|
+
const subDir = path.join(CWD, 'subdir');
|
|
212
|
+
const subDirGeminiFile = path.join(subDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
213
|
+
const cwdGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
214
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
215
|
+
if (p === cwdGeminiFile || p === subDirGeminiFile)
|
|
216
|
+
return undefined;
|
|
217
|
+
throw new Error('File not found');
|
|
218
|
+
});
|
|
219
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
220
|
+
if (p === cwdGeminiFile)
|
|
221
|
+
return 'CWD memory';
|
|
222
|
+
if (p === subDirGeminiFile)
|
|
223
|
+
return 'Subdir memory';
|
|
224
|
+
throw new Error('File not found');
|
|
225
|
+
});
|
|
226
|
+
mockFs.readdir.mockImplementation((async (p) => {
|
|
227
|
+
if (p === CWD) {
|
|
228
|
+
return [
|
|
229
|
+
{
|
|
230
|
+
name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
|
|
231
|
+
isFile: () => true,
|
|
232
|
+
isDirectory: () => false,
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
name: 'subdir',
|
|
236
|
+
isFile: () => false,
|
|
237
|
+
isDirectory: () => true,
|
|
238
|
+
},
|
|
239
|
+
];
|
|
240
|
+
}
|
|
241
|
+
if (p === subDir) {
|
|
242
|
+
return [
|
|
243
|
+
{
|
|
244
|
+
name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
|
|
245
|
+
isFile: () => true,
|
|
246
|
+
isDirectory: () => false,
|
|
247
|
+
},
|
|
248
|
+
];
|
|
249
|
+
}
|
|
250
|
+
return [];
|
|
251
|
+
}));
|
|
252
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
253
|
+
const expectedContent = `--- Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\nCWD memory\n--- End of Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\n\n` +
|
|
254
|
+
`--- Context from: ${path.join('subdir', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---\nSubdir memory\n--- End of Context from: ${path.join('subdir', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---`;
|
|
255
|
+
expect(memoryContent).toBe(expectedContent);
|
|
256
|
+
expect(fileCount).toBe(2);
|
|
257
|
+
});
|
|
258
|
+
it('should load and correctly order global, upward, and downward ORIGINAL_GEMINI_MD_FILENAME files', async () => {
|
|
259
|
+
setLlxprtMdFilename(ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST); // Explicitly set for this test
|
|
260
|
+
const globalFileToUse = path.join(GLOBAL_LLXPRT_DIR, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
261
|
+
const projectParentDir = path.dirname(PROJECT_ROOT);
|
|
262
|
+
const projectParentGeminiFile = path.join(projectParentDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
263
|
+
const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
264
|
+
const cwdGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
265
|
+
const subDir = path.join(CWD, 'sub');
|
|
266
|
+
const subDirGeminiFile = path.join(subDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
267
|
+
mockFs.stat.mockImplementation(async (p) => {
|
|
268
|
+
if (p === path.join(PROJECT_ROOT, '.git')) {
|
|
269
|
+
return { isDirectory: () => true };
|
|
270
|
+
}
|
|
271
|
+
else if (p === path.join(PROJECT_ROOT, '.llxprt')) {
|
|
272
|
+
return { isDirectory: () => true };
|
|
273
|
+
}
|
|
274
|
+
throw new Error('File not found');
|
|
275
|
+
});
|
|
276
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
277
|
+
if (p === globalFileToUse || // Use the dynamically set global file path
|
|
278
|
+
p === projectParentGeminiFile ||
|
|
279
|
+
p === projectRootGeminiFile ||
|
|
280
|
+
p === cwdGeminiFile ||
|
|
281
|
+
p === subDirGeminiFile) {
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
throw new Error('File not found');
|
|
285
|
+
});
|
|
286
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
287
|
+
if (p === globalFileToUse)
|
|
288
|
+
return 'Global memory'; // Use the dynamically set global file path
|
|
289
|
+
if (p === projectParentGeminiFile)
|
|
290
|
+
return 'Project parent memory';
|
|
291
|
+
if (p === projectRootGeminiFile)
|
|
292
|
+
return 'Project root memory';
|
|
293
|
+
if (p === cwdGeminiFile)
|
|
294
|
+
return 'CWD memory';
|
|
295
|
+
if (p === subDirGeminiFile)
|
|
296
|
+
return 'Subdir memory';
|
|
297
|
+
throw new Error('File not found');
|
|
298
|
+
});
|
|
299
|
+
mockFs.readdir.mockImplementation((async (p) => {
|
|
300
|
+
if (p === CWD) {
|
|
301
|
+
return [
|
|
302
|
+
{
|
|
303
|
+
name: 'sub',
|
|
304
|
+
isFile: () => false,
|
|
305
|
+
isDirectory: () => true,
|
|
306
|
+
},
|
|
307
|
+
];
|
|
308
|
+
}
|
|
309
|
+
if (p === subDir) {
|
|
310
|
+
return [
|
|
311
|
+
{
|
|
312
|
+
name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
|
|
313
|
+
isFile: () => true,
|
|
314
|
+
isDirectory: () => false,
|
|
315
|
+
},
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
return [];
|
|
319
|
+
}));
|
|
320
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
321
|
+
const relPathGlobal = path.relative(CWD, GLOBAL_GEMINI_FILE);
|
|
322
|
+
const relPathProjectParent = path.relative(CWD, projectParentGeminiFile);
|
|
323
|
+
const relPathProjectRoot = path.relative(CWD, projectRootGeminiFile);
|
|
324
|
+
const relPathCwd = ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST;
|
|
325
|
+
const relPathSubDir = path.join('sub', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
326
|
+
const expectedContent = [
|
|
327
|
+
`--- Context from: ${relPathGlobal} ---\nGlobal memory\n--- End of Context from: ${relPathGlobal} ---`,
|
|
328
|
+
`--- Context from: ${relPathProjectParent} ---\nProject parent memory\n--- End of Context from: ${relPathProjectParent} ---`,
|
|
329
|
+
`--- Context from: ${relPathProjectRoot} ---\nProject root memory\n--- End of Context from: ${relPathProjectRoot} ---`,
|
|
330
|
+
`--- Context from: ${relPathCwd} ---\nCWD memory\n--- End of Context from: ${relPathCwd} ---`,
|
|
331
|
+
`--- Context from: ${relPathSubDir} ---\nSubdir memory\n--- End of Context from: ${relPathSubDir} ---`,
|
|
332
|
+
].join('\n\n');
|
|
333
|
+
expect(memoryContent).toBe(expectedContent);
|
|
334
|
+
expect(fileCount).toBe(5);
|
|
335
|
+
});
|
|
336
|
+
it('should ignore specified directories during downward scan', async () => {
|
|
337
|
+
const ignoredDir = path.join(CWD, 'node_modules');
|
|
338
|
+
const ignoredDirGeminiFile = path.join(ignoredDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST); // Corrected
|
|
339
|
+
const regularSubDir = path.join(CWD, 'my_code');
|
|
340
|
+
const regularSubDirGeminiFile = path.join(regularSubDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
|
|
341
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
342
|
+
if (p === regularSubDirGeminiFile)
|
|
343
|
+
return undefined;
|
|
344
|
+
if (p === ignoredDirGeminiFile)
|
|
345
|
+
throw new Error('Should not access ignored file');
|
|
346
|
+
throw new Error('File not found');
|
|
347
|
+
});
|
|
348
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
349
|
+
if (p === regularSubDirGeminiFile)
|
|
350
|
+
return 'My code memory';
|
|
351
|
+
throw new Error('File not found');
|
|
352
|
+
});
|
|
353
|
+
mockFs.readdir.mockImplementation((async (p) => {
|
|
354
|
+
if (p === CWD) {
|
|
355
|
+
return [
|
|
356
|
+
{
|
|
357
|
+
name: 'node_modules',
|
|
358
|
+
isFile: () => false,
|
|
359
|
+
isDirectory: () => true,
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
name: 'my_code',
|
|
363
|
+
isFile: () => false,
|
|
364
|
+
isDirectory: () => true,
|
|
365
|
+
},
|
|
366
|
+
];
|
|
367
|
+
}
|
|
368
|
+
if (p === regularSubDir) {
|
|
369
|
+
return [
|
|
370
|
+
{
|
|
371
|
+
name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
|
|
372
|
+
isFile: () => true,
|
|
373
|
+
isDirectory: () => false,
|
|
374
|
+
},
|
|
375
|
+
];
|
|
376
|
+
}
|
|
377
|
+
if (p === ignoredDir) {
|
|
378
|
+
return [];
|
|
379
|
+
}
|
|
380
|
+
return [];
|
|
381
|
+
}));
|
|
382
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
|
|
383
|
+
const expectedContent = `--- Context from: ${path.join('my_code', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---\nMy code memory\n--- End of Context from: ${path.join('my_code', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---`;
|
|
384
|
+
expect(memoryContent).toBe(expectedContent);
|
|
385
|
+
expect(fileCount).toBe(1);
|
|
386
|
+
expect(mockFs.readFile).not.toHaveBeenCalledWith(ignoredDirGeminiFile, 'utf-8');
|
|
387
|
+
});
|
|
388
|
+
it('should respect MAX_DIRECTORIES_TO_SCAN_FOR_MEMORY during downward scan', async () => {
|
|
389
|
+
const consoleDebugSpy = vi
|
|
390
|
+
.spyOn(console, 'debug')
|
|
391
|
+
.mockImplementation(() => { });
|
|
392
|
+
const dirNames = [];
|
|
393
|
+
for (let i = 0; i < 250; i++) {
|
|
394
|
+
dirNames.push({
|
|
395
|
+
name: `deep_dir_${i}`,
|
|
396
|
+
isFile: () => false,
|
|
397
|
+
isDirectory: () => true,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
mockFs.readdir.mockImplementation((async (p) => {
|
|
401
|
+
if (p === CWD)
|
|
402
|
+
return dirNames;
|
|
403
|
+
if (p.toString().startsWith(path.join(CWD, 'deep_dir_')))
|
|
404
|
+
return [];
|
|
405
|
+
return [];
|
|
406
|
+
}));
|
|
407
|
+
mockFs.access.mockRejectedValue(new Error('not found'));
|
|
408
|
+
await loadServerHierarchicalMemory(CWD, true, fileService);
|
|
409
|
+
expect(consoleDebugSpy).toHaveBeenCalledWith(expect.stringContaining('[DEBUG] [BfsFileSearch]'), expect.stringContaining('Scanning [200/200]:'));
|
|
410
|
+
consoleDebugSpy.mockRestore();
|
|
411
|
+
});
|
|
412
|
+
it('should load extension context file paths', async () => {
|
|
413
|
+
const extensionFilePath = '/test/extensions/ext1/LLXPRT.md';
|
|
414
|
+
mockFs.access.mockImplementation(async (p) => {
|
|
415
|
+
if (p === extensionFilePath) {
|
|
416
|
+
return undefined;
|
|
417
|
+
}
|
|
418
|
+
throw new Error('File not found');
|
|
419
|
+
});
|
|
420
|
+
mockFs.readFile.mockImplementation(async (p) => {
|
|
421
|
+
if (p === extensionFilePath) {
|
|
422
|
+
return 'Extension memory content';
|
|
423
|
+
}
|
|
424
|
+
throw new Error('File not found');
|
|
425
|
+
});
|
|
426
|
+
const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService, [extensionFilePath]);
|
|
427
|
+
expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, extensionFilePath)} ---\nExtension memory content\n--- End of Context from: ${path.relative(CWD, extensionFilePath)} ---`);
|
|
428
|
+
expect(fileCount).toBe(1);
|
|
429
|
+
expect(mockFs.readFile).toHaveBeenCalledWith(extensionFilePath, 'utf-8');
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
//# sourceMappingURL=memoryDiscovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryDiscovery.test.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Interface for tracking import processing state to prevent circular imports
|
|
8
|
+
*/
|
|
9
|
+
interface ImportState {
|
|
10
|
+
processedFiles: Set<string>;
|
|
11
|
+
maxDepth: number;
|
|
12
|
+
currentDepth: number;
|
|
13
|
+
currentFile?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Processes import statements in LLXPRT.md content
|
|
17
|
+
* Supports @path/to/file.md syntax for importing content from other files
|
|
18
|
+
*
|
|
19
|
+
* @param content - The content to process for imports
|
|
20
|
+
* @param basePath - The directory path where the current file is located
|
|
21
|
+
* @param debugMode - Whether to enable debug logging
|
|
22
|
+
* @param importState - State tracking for circular import prevention
|
|
23
|
+
* @returns Processed content with imports resolved
|
|
24
|
+
*/
|
|
25
|
+
export declare function processImports(content: string, basePath: string, debugMode?: boolean, importState?: ImportState): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Validates import paths to ensure they are safe and within allowed directories
|
|
28
|
+
*
|
|
29
|
+
* @param importPath - The import path to validate
|
|
30
|
+
* @param basePath - The base directory for resolving relative paths
|
|
31
|
+
* @param allowedDirectories - Array of allowed directory paths
|
|
32
|
+
* @returns Whether the import path is valid
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateImportPath(importPath: string, basePath: string, allowedDirectories: string[]): boolean;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
// Simple console logger for import processing
|
|
9
|
+
const logger = {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
debug: (...args) => console.debug('[DEBUG] [ImportProcessor]', ...args),
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
warn: (...args) => console.warn('[WARN] [ImportProcessor]', ...args),
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
error: (...args) => console.error('[ERROR] [ImportProcessor]', ...args),
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Processes import statements in LLXPRT.md content
|
|
19
|
+
* Supports @path/to/file.md syntax for importing content from other files
|
|
20
|
+
*
|
|
21
|
+
* @param content - The content to process for imports
|
|
22
|
+
* @param basePath - The directory path where the current file is located
|
|
23
|
+
* @param debugMode - Whether to enable debug logging
|
|
24
|
+
* @param importState - State tracking for circular import prevention
|
|
25
|
+
* @returns Processed content with imports resolved
|
|
26
|
+
*/
|
|
27
|
+
export async function processImports(content, basePath, debugMode = false, importState = {
|
|
28
|
+
processedFiles: new Set(),
|
|
29
|
+
maxDepth: 10,
|
|
30
|
+
currentDepth: 0,
|
|
31
|
+
}) {
|
|
32
|
+
if (importState.currentDepth >= importState.maxDepth) {
|
|
33
|
+
if (debugMode) {
|
|
34
|
+
logger.warn(`Maximum import depth (${importState.maxDepth}) reached. Stopping import processing.`);
|
|
35
|
+
}
|
|
36
|
+
return content;
|
|
37
|
+
}
|
|
38
|
+
// Regex to match @path/to/file imports (supports any file extension)
|
|
39
|
+
// Supports both @path/to/file.md and @./path/to/file.md syntax
|
|
40
|
+
const importRegex = /@([./]?[^\s\n]+\.[^\s\n]+)/g;
|
|
41
|
+
let processedContent = content;
|
|
42
|
+
let match;
|
|
43
|
+
// Process all imports in the content
|
|
44
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
45
|
+
const importPath = match[1];
|
|
46
|
+
// Validate import path to prevent path traversal attacks
|
|
47
|
+
if (!validateImportPath(importPath, basePath, [basePath])) {
|
|
48
|
+
processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Path traversal attempt -->`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Check if the import is for a non-md file and warn
|
|
52
|
+
if (!importPath.endsWith('.md')) {
|
|
53
|
+
logger.warn(`Import processor only supports .md files. Attempting to import non-md file: ${importPath}. This will fail.`);
|
|
54
|
+
// Replace the import with a warning comment
|
|
55
|
+
processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Only .md files are supported -->`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const fullPath = path.resolve(basePath, importPath);
|
|
59
|
+
if (debugMode) {
|
|
60
|
+
logger.debug(`Processing import: ${importPath} -> ${fullPath}`);
|
|
61
|
+
}
|
|
62
|
+
// Check for circular imports - if we're already processing this file
|
|
63
|
+
if (importState.currentFile === fullPath) {
|
|
64
|
+
if (debugMode) {
|
|
65
|
+
logger.warn(`Circular import detected: ${importPath}`);
|
|
66
|
+
}
|
|
67
|
+
// Replace the import with a warning comment
|
|
68
|
+
processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Check if we've already processed this file in this import chain
|
|
72
|
+
if (importState.processedFiles.has(fullPath)) {
|
|
73
|
+
if (debugMode) {
|
|
74
|
+
logger.warn(`File already processed in this chain: ${importPath}`);
|
|
75
|
+
}
|
|
76
|
+
// Replace the import with a warning comment
|
|
77
|
+
processedContent = processedContent.replace(match[0], `<!-- File already processed: ${importPath} -->`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Check for potential circular imports by looking at the import chain
|
|
81
|
+
if (importState.currentFile) {
|
|
82
|
+
const currentFileDir = path.dirname(importState.currentFile);
|
|
83
|
+
const potentialCircularPath = path.resolve(currentFileDir, importPath);
|
|
84
|
+
if (potentialCircularPath === importState.currentFile) {
|
|
85
|
+
if (debugMode) {
|
|
86
|
+
logger.warn(`Circular import detected: ${importPath}`);
|
|
87
|
+
}
|
|
88
|
+
// Replace the import with a warning comment
|
|
89
|
+
processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Check if the file exists
|
|
95
|
+
await fs.access(fullPath);
|
|
96
|
+
// Read the imported file content
|
|
97
|
+
const importedContent = await fs.readFile(fullPath, 'utf-8');
|
|
98
|
+
if (debugMode) {
|
|
99
|
+
logger.debug(`Successfully read imported file: ${fullPath}`);
|
|
100
|
+
}
|
|
101
|
+
// Recursively process imports in the imported content
|
|
102
|
+
const processedImportedContent = await processImports(importedContent, path.dirname(fullPath), debugMode, {
|
|
103
|
+
...importState,
|
|
104
|
+
processedFiles: new Set([...importState.processedFiles, fullPath]),
|
|
105
|
+
currentDepth: importState.currentDepth + 1,
|
|
106
|
+
currentFile: fullPath, // Set the current file being processed
|
|
107
|
+
});
|
|
108
|
+
// Replace the import statement with the processed content
|
|
109
|
+
processedContent = processedContent.replace(match[0], `<!-- Imported from: ${importPath} -->\n${processedImportedContent}\n<!-- End of import from: ${importPath} -->`);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
113
|
+
if (debugMode) {
|
|
114
|
+
logger.error(`Failed to import ${importPath}: ${errorMessage}`);
|
|
115
|
+
}
|
|
116
|
+
// Replace the import with an error comment
|
|
117
|
+
processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - ${errorMessage} -->`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return processedContent;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validates import paths to ensure they are safe and within allowed directories
|
|
124
|
+
*
|
|
125
|
+
* @param importPath - The import path to validate
|
|
126
|
+
* @param basePath - The base directory for resolving relative paths
|
|
127
|
+
* @param allowedDirectories - Array of allowed directory paths
|
|
128
|
+
* @returns Whether the import path is valid
|
|
129
|
+
*/
|
|
130
|
+
export function validateImportPath(importPath, basePath, allowedDirectories) {
|
|
131
|
+
// Reject URLs
|
|
132
|
+
if (/^(file|https?):\/\//.test(importPath)) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const resolvedPath = path.resolve(basePath, importPath);
|
|
136
|
+
return allowedDirectories.some((allowedDir) => {
|
|
137
|
+
const normalizedAllowedDir = path.resolve(allowedDir);
|
|
138
|
+
return resolvedPath.startsWith(normalizedAllowedDir);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=memoryImportProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryImportProcessor.js","sourceRoot":"","sources":["../../../src/utils/memoryImportProcessor.ts"],"names":[],"mappings":"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"}
|