@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,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { processImports, validateImportPath } from './memoryImportProcessor.js';
|
|
10
|
+
// Mock fs/promises
|
|
11
|
+
vi.mock('fs/promises');
|
|
12
|
+
const mockedFs = vi.mocked(fs);
|
|
13
|
+
// Mock console methods to capture warnings
|
|
14
|
+
const originalConsoleWarn = console.warn;
|
|
15
|
+
const originalConsoleError = console.error;
|
|
16
|
+
const originalConsoleDebug = console.debug;
|
|
17
|
+
describe('memoryImportProcessor', () => {
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
vi.clearAllMocks();
|
|
20
|
+
// Mock console methods
|
|
21
|
+
console.warn = vi.fn();
|
|
22
|
+
console.error = vi.fn();
|
|
23
|
+
console.debug = vi.fn();
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
// Restore console methods
|
|
27
|
+
console.warn = originalConsoleWarn;
|
|
28
|
+
console.error = originalConsoleError;
|
|
29
|
+
console.debug = originalConsoleDebug;
|
|
30
|
+
});
|
|
31
|
+
describe('processImports', () => {
|
|
32
|
+
it('should process basic md file imports', async () => {
|
|
33
|
+
const content = 'Some content @./test.md more content';
|
|
34
|
+
const basePath = '/test/path';
|
|
35
|
+
const importedContent = '# Imported Content\nThis is imported.';
|
|
36
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
37
|
+
mockedFs.readFile.mockResolvedValue(importedContent);
|
|
38
|
+
const result = await processImports(content, basePath, true);
|
|
39
|
+
expect(result).toContain('<!-- Imported from: ./test.md -->');
|
|
40
|
+
expect(result).toContain(importedContent);
|
|
41
|
+
expect(result).toContain('<!-- End of import from: ./test.md -->');
|
|
42
|
+
expect(mockedFs.readFile).toHaveBeenCalledWith(path.resolve(basePath, './test.md'), 'utf-8');
|
|
43
|
+
});
|
|
44
|
+
it('should warn and fail for non-md file imports', async () => {
|
|
45
|
+
const content = 'Some content @./instructions.txt more content';
|
|
46
|
+
const basePath = '/test/path';
|
|
47
|
+
const result = await processImports(content, basePath, true);
|
|
48
|
+
expect(console.warn).toHaveBeenCalledWith('[WARN] [ImportProcessor]', 'Import processor only supports .md files. Attempting to import non-md file: ./instructions.txt. This will fail.');
|
|
49
|
+
expect(result).toContain('<!-- Import failed: ./instructions.txt - Only .md files are supported -->');
|
|
50
|
+
expect(mockedFs.readFile).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it('should handle circular imports', async () => {
|
|
53
|
+
const content = 'Content @./circular.md more content';
|
|
54
|
+
const basePath = '/test/path';
|
|
55
|
+
const circularContent = 'Circular @./main.md content';
|
|
56
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
57
|
+
mockedFs.readFile.mockResolvedValue(circularContent);
|
|
58
|
+
// Set up the import state to simulate we're already processing main.md
|
|
59
|
+
const importState = {
|
|
60
|
+
processedFiles: new Set(),
|
|
61
|
+
maxDepth: 10,
|
|
62
|
+
currentDepth: 0,
|
|
63
|
+
currentFile: '/test/path/main.md', // Simulate we're processing main.md
|
|
64
|
+
};
|
|
65
|
+
const result = await processImports(content, basePath, true, importState);
|
|
66
|
+
// The circular import should be detected when processing the nested import
|
|
67
|
+
expect(result).toContain('<!-- Circular import detected: ./main.md -->');
|
|
68
|
+
});
|
|
69
|
+
it('should handle file not found errors', async () => {
|
|
70
|
+
const content = 'Content @./nonexistent.md more content';
|
|
71
|
+
const basePath = '/test/path';
|
|
72
|
+
mockedFs.access.mockRejectedValue(new Error('File not found'));
|
|
73
|
+
const result = await processImports(content, basePath, true);
|
|
74
|
+
expect(result).toContain('<!-- Import failed: ./nonexistent.md - File not found -->');
|
|
75
|
+
expect(console.error).toHaveBeenCalledWith('[ERROR] [ImportProcessor]', 'Failed to import ./nonexistent.md: File not found');
|
|
76
|
+
});
|
|
77
|
+
it('should respect max depth limit', async () => {
|
|
78
|
+
const content = 'Content @./deep.md more content';
|
|
79
|
+
const basePath = '/test/path';
|
|
80
|
+
const deepContent = 'Deep @./deeper.md content';
|
|
81
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
82
|
+
mockedFs.readFile.mockResolvedValue(deepContent);
|
|
83
|
+
const importState = {
|
|
84
|
+
processedFiles: new Set(),
|
|
85
|
+
maxDepth: 1,
|
|
86
|
+
currentDepth: 1,
|
|
87
|
+
};
|
|
88
|
+
const result = await processImports(content, basePath, true, importState);
|
|
89
|
+
expect(console.warn).toHaveBeenCalledWith('[WARN] [ImportProcessor]', 'Maximum import depth (1) reached. Stopping import processing.');
|
|
90
|
+
expect(result).toBe(content);
|
|
91
|
+
});
|
|
92
|
+
it('should handle nested imports recursively', async () => {
|
|
93
|
+
const content = 'Main @./nested.md content';
|
|
94
|
+
const basePath = '/test/path';
|
|
95
|
+
const nestedContent = 'Nested @./inner.md content';
|
|
96
|
+
const innerContent = 'Inner content';
|
|
97
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
98
|
+
mockedFs.readFile
|
|
99
|
+
.mockResolvedValueOnce(nestedContent)
|
|
100
|
+
.mockResolvedValueOnce(innerContent);
|
|
101
|
+
const result = await processImports(content, basePath, true);
|
|
102
|
+
expect(result).toContain('<!-- Imported from: ./nested.md -->');
|
|
103
|
+
expect(result).toContain('<!-- Imported from: ./inner.md -->');
|
|
104
|
+
expect(result).toContain(innerContent);
|
|
105
|
+
});
|
|
106
|
+
it('should handle absolute paths in imports', async () => {
|
|
107
|
+
const content = 'Content @/absolute/path/file.md more content';
|
|
108
|
+
const basePath = '/test/path';
|
|
109
|
+
const importedContent = 'Absolute path content';
|
|
110
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
111
|
+
mockedFs.readFile.mockResolvedValue(importedContent);
|
|
112
|
+
const result = await processImports(content, basePath, true);
|
|
113
|
+
expect(result).toContain('<!-- Import failed: /absolute/path/file.md - Path traversal attempt -->');
|
|
114
|
+
});
|
|
115
|
+
it('should handle multiple imports in same content', async () => {
|
|
116
|
+
const content = 'Start @./first.md middle @./second.md end';
|
|
117
|
+
const basePath = '/test/path';
|
|
118
|
+
const firstContent = 'First content';
|
|
119
|
+
const secondContent = 'Second content';
|
|
120
|
+
mockedFs.access.mockResolvedValue(undefined);
|
|
121
|
+
mockedFs.readFile
|
|
122
|
+
.mockResolvedValueOnce(firstContent)
|
|
123
|
+
.mockResolvedValueOnce(secondContent);
|
|
124
|
+
const result = await processImports(content, basePath, true);
|
|
125
|
+
expect(result).toContain('<!-- Imported from: ./first.md -->');
|
|
126
|
+
expect(result).toContain('<!-- Imported from: ./second.md -->');
|
|
127
|
+
expect(result).toContain(firstContent);
|
|
128
|
+
expect(result).toContain(secondContent);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('validateImportPath', () => {
|
|
132
|
+
it('should reject URLs', () => {
|
|
133
|
+
expect(validateImportPath('https://example.com/file.md', '/base', [
|
|
134
|
+
'/allowed',
|
|
135
|
+
])).toBe(false);
|
|
136
|
+
expect(validateImportPath('http://example.com/file.md', '/base', ['/allowed'])).toBe(false);
|
|
137
|
+
expect(validateImportPath('file:///path/to/file.md', '/base', ['/allowed'])).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('should allow paths within allowed directories', () => {
|
|
140
|
+
expect(validateImportPath('./file.md', '/base', ['/base'])).toBe(true);
|
|
141
|
+
expect(validateImportPath('../file.md', '/base', ['/allowed'])).toBe(false);
|
|
142
|
+
expect(validateImportPath('/allowed/sub/file.md', '/base', ['/allowed'])).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
it('should reject paths outside allowed directories', () => {
|
|
145
|
+
expect(validateImportPath('/forbidden/file.md', '/base', ['/allowed'])).toBe(false);
|
|
146
|
+
expect(validateImportPath('../../../file.md', '/base', ['/base'])).toBe(false);
|
|
147
|
+
});
|
|
148
|
+
it('should handle multiple allowed directories', () => {
|
|
149
|
+
expect(validateImportPath('./file.md', '/base', ['/allowed1', '/allowed2'])).toBe(false);
|
|
150
|
+
expect(validateImportPath('/allowed1/file.md', '/base', [
|
|
151
|
+
'/allowed1',
|
|
152
|
+
'/allowed2',
|
|
153
|
+
])).toBe(true);
|
|
154
|
+
expect(validateImportPath('/allowed2/file.md', '/base', [
|
|
155
|
+
'/allowed1',
|
|
156
|
+
'/allowed2',
|
|
157
|
+
])).toBe(true);
|
|
158
|
+
});
|
|
159
|
+
it('should handle relative paths correctly', () => {
|
|
160
|
+
expect(validateImportPath('file.md', '/base', ['/base'])).toBe(true);
|
|
161
|
+
expect(validateImportPath('./file.md', '/base', ['/base'])).toBe(true);
|
|
162
|
+
expect(validateImportPath('../file.md', '/base', ['/parent'])).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
it('should handle absolute paths correctly', () => {
|
|
165
|
+
expect(validateImportPath('/allowed/file.md', '/base', ['/allowed'])).toBe(true);
|
|
166
|
+
expect(validateImportPath('/forbidden/file.md', '/base', ['/allowed'])).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=memoryImportProcessor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryImportProcessor.test.js","sourceRoot":"","sources":["../../../src/utils/memoryImportProcessor.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,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,mBAAmB;AACnB,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/B,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;AACzC,MAAM,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC;AAC3C,MAAM,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC;AAE3C,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,uBAAuB;QACvB,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B;QAC1B,OAAO,CAAC,IAAI,GAAG,mBAAmB,CAAC;QACnC,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAC;QACrC,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,sCAAsC,CAAC;YACvD,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,eAAe,GAAG,uCAAuC,CAAC;YAEhE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAC5C,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,EACnC,OAAO,CACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,+CAA+C,CAAC;YAChE,MAAM,QAAQ,GAAG,YAAY,CAAC;YAE9B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACvC,0BAA0B,EAC1B,iHAAiH,CAClH,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,2EAA2E,CAC5E,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,qCAAqC,CAAC;YACtD,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,eAAe,GAAG,6BAA6B,CAAC;YAEtD,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAErD,uEAAuE;YACvE,MAAM,WAAW,GAAG;gBAClB,cAAc,EAAE,IAAI,GAAG,EAAU;gBACjC,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,oBAAoB,EAAE,oCAAoC;aACxE,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAE1E,2EAA2E;YAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,wCAAwC,CAAC;YACzD,MAAM,QAAQ,GAAG,YAAY,CAAC;YAE9B,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,2DAA2D,CAC5D,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACxC,2BAA2B,EAC3B,mDAAmD,CACpD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,OAAO,GAAG,iCAAiC,CAAC;YAClD,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,WAAW,GAAG,2BAA2B,CAAC;YAEhD,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAEjD,MAAM,WAAW,GAAG;gBAClB,cAAc,EAAE,IAAI,GAAG,EAAU;gBACjC,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,CAAC;aAChB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAE1E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAoB,CACvC,0BAA0B,EAC1B,+DAA+D,CAChE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,GAAG,2BAA2B,CAAC;YAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,aAAa,GAAG,4BAA4B,CAAC;YACnD,MAAM,YAAY,GAAG,eAAe,CAAC;YAErC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ;iBACd,qBAAqB,CAAC,aAAa,CAAC;iBACpC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAEvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,8CAA8C,CAAC;YAC/D,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,eAAe,GAAG,uBAAuB,CAAC;YAEhD,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACtB,yEAAyE,CAC1E,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,OAAO,GAAG,2CAA2C,CAAC;YAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC;YAC9B,MAAM,YAAY,GAAG,eAAe,CAAC;YACrC,MAAM,aAAa,GAAG,gBAAgB,CAAC;YAEvC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7C,QAAQ,CAAC,QAAQ;iBACd,qBAAqB,CAAC,YAAY,CAAC;iBACnC,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAExC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,CACJ,kBAAkB,CAAC,6BAA6B,EAAE,OAAO,EAAE;gBACzD,UAAU;aACX,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,kBAAkB,CAAC,4BAA4B,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CACxE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,kBAAkB,CAAC,yBAAyB,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CACrE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAClE,KAAK,CACN,CAAC;YACF,MAAM,CACJ,kBAAkB,CAAC,sBAAsB,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CACJ,kBAAkB,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAChE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CACrE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,CACJ,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CACrE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CACJ,kBAAkB,CAAC,mBAAmB,EAAE,OAAO,EAAE;gBAC/C,WAAW;gBACX,WAAW;aACZ,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CACJ,kBAAkB,CAAC,mBAAmB,EAAE,OAAO,EAAE;gBAC/C,WAAW;gBACX,WAAW;aACZ,CAAC,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,CAAC,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CACjE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CACJ,kBAAkB,CAAC,kBAAkB,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CACJ,kBAAkB,CAAC,oBAAoB,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAChE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Content } from '@google/genai';
|
|
7
|
+
export declare function isFunctionResponse(content: Content): boolean;
|
|
8
|
+
export declare function isFunctionCall(content: Content): boolean;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export function isFunctionResponse(content) {
|
|
7
|
+
return (content.role === 'user' &&
|
|
8
|
+
!!content.parts &&
|
|
9
|
+
content.parts.every((part) => !!part.functionResponse));
|
|
10
|
+
}
|
|
11
|
+
export function isFunctionCall(content) {
|
|
12
|
+
return (content.role === 'model' &&
|
|
13
|
+
!!content.parts &&
|
|
14
|
+
content.parts.every((part) => !!part.functionCall));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=messageInspectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageInspectors.js","sourceRoot":"","sources":["../../../src/utils/messageInspectors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,MAAM;QACvB,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,CACL,OAAO,CAAC,IAAI,KAAK,OAAO;QACxB,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { GeminiClient } from '../core/client.js';
|
|
7
|
+
import { GeminiChat } from '../core/geminiChat.js';
|
|
8
|
+
export interface NextSpeakerResponse {
|
|
9
|
+
reasoning: string;
|
|
10
|
+
next_speaker: 'user' | 'model';
|
|
11
|
+
}
|
|
12
|
+
export declare function checkNextSpeaker(chat: GeminiChat, geminiClient: GeminiClient, abortSignal: AbortSignal, providerName?: string): Promise<NextSpeakerResponse | null>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Type } from '@google/genai';
|
|
7
|
+
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
8
|
+
import { isFunctionResponse } from './messageInspectors.js';
|
|
9
|
+
const CHECK_PROMPT = `Analyze *only* the content and structure of your immediately preceding response (your last turn in the conversation history). Based *strictly* on that response, determine who should logically speak next: the 'user' or the 'model' (you).
|
|
10
|
+
[... existing rules ...]
|
|
11
|
+
**Output Format:**
|
|
12
|
+
Respond with a raw JSON object only. Do not use markdown formatting, code blocks, backticks, or any other wrapper. Your entire response must be valid JSON that starts with { and ends with }.
|
|
13
|
+
|
|
14
|
+
Example of correct response:
|
|
15
|
+
{"reasoning": "The model asked a question", "next_speaker": "user"}
|
|
16
|
+
|
|
17
|
+
Schema:
|
|
18
|
+
{
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"reasoning": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Brief explanation justifying the 'next_speaker' choice based *strictly* on the applicable rule and the content/structure of the preceding turn."
|
|
24
|
+
},
|
|
25
|
+
"next_speaker": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": ["user", "model"],
|
|
28
|
+
"description": "Who should speak next based *only* on the preceding turn and the decision rules."
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"required": ["next_speaker", "reasoning"]
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
const RESPONSE_SCHEMA = {
|
|
35
|
+
type: Type.OBJECT,
|
|
36
|
+
properties: {
|
|
37
|
+
reasoning: {
|
|
38
|
+
type: Type.STRING,
|
|
39
|
+
description: "Brief explanation justifying the 'next_speaker' choice based *strictly* on the applicable rule and the content/structure of the preceding turn.",
|
|
40
|
+
},
|
|
41
|
+
next_speaker: {
|
|
42
|
+
type: Type.STRING,
|
|
43
|
+
enum: ['user', 'model'],
|
|
44
|
+
description: 'Who should speak next based *only* on the preceding turn and the decision rules',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['reasoning', 'next_speaker'],
|
|
48
|
+
};
|
|
49
|
+
export async function checkNextSpeaker(chat, geminiClient, abortSignal, providerName) {
|
|
50
|
+
// We need to capture the curated history because there are many moments when the model will return invalid turns
|
|
51
|
+
// that when passed back up to the endpoint will break subsequent calls. An example of this is when the model decides
|
|
52
|
+
// to respond with an empty part collection if you were to send that message back to the server it will respond with
|
|
53
|
+
// a 400 indicating that model part collections MUST have content.
|
|
54
|
+
const curatedHistory = chat.getHistory(/* curated */ true);
|
|
55
|
+
// Ensure there's a model response to analyze
|
|
56
|
+
if (curatedHistory.length === 0) {
|
|
57
|
+
// Cannot determine next speaker if history is empty.
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const comprehensiveHistory = chat.getHistory();
|
|
61
|
+
// If comprehensiveHistory is empty, there is no last message to check.
|
|
62
|
+
// This case should ideally be caught by the curatedHistory.length check earlier,
|
|
63
|
+
// but as a safeguard:
|
|
64
|
+
if (comprehensiveHistory.length === 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const lastComprehensiveMessage = comprehensiveHistory[comprehensiveHistory.length - 1];
|
|
68
|
+
// If the last message is a user message containing only function_responses,
|
|
69
|
+
// then the model should speak next.
|
|
70
|
+
if (lastComprehensiveMessage &&
|
|
71
|
+
isFunctionResponse(lastComprehensiveMessage)) {
|
|
72
|
+
return {
|
|
73
|
+
reasoning: 'The last message was a function response, so the model should speak next.',
|
|
74
|
+
next_speaker: 'model',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (lastComprehensiveMessage &&
|
|
78
|
+
lastComprehensiveMessage.role === 'model' &&
|
|
79
|
+
lastComprehensiveMessage.parts &&
|
|
80
|
+
lastComprehensiveMessage.parts.length === 0) {
|
|
81
|
+
lastComprehensiveMessage.parts.push({ text: '' });
|
|
82
|
+
return {
|
|
83
|
+
reasoning: 'The last message was a filler model message with no content (nothing for user to act on), model should speak next.',
|
|
84
|
+
next_speaker: 'model',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Things checked out. Let's proceed to potentially making an LLM request.
|
|
88
|
+
const lastMessage = curatedHistory[curatedHistory.length - 1];
|
|
89
|
+
if (!lastMessage || lastMessage.role !== 'model') {
|
|
90
|
+
// Cannot determine next speaker if the last turn wasn't from the model
|
|
91
|
+
// or if history is empty.
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const contents = [
|
|
95
|
+
...curatedHistory,
|
|
96
|
+
{ role: 'user', parts: [{ text: CHECK_PROMPT }] },
|
|
97
|
+
];
|
|
98
|
+
try {
|
|
99
|
+
const parsedResponse = (await geminiClient.generateJson(contents, RESPONSE_SCHEMA, abortSignal, DEFAULT_GEMINI_FLASH_MODEL));
|
|
100
|
+
if (parsedResponse &&
|
|
101
|
+
parsedResponse.next_speaker &&
|
|
102
|
+
['user', 'model'].includes(parsedResponse.next_speaker)) {
|
|
103
|
+
return parsedResponse;
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const provider = providerName || 'provider';
|
|
109
|
+
console.warn(`Failed to talk to ${provider} endpoint when seeing if conversation should continue.`, error);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=nextSpeakerChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextSpeakerChecker.js","sourceRoot":"","sources":["../../../src/utils/nextSpeakerChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
8
|
+
import { GeminiClient } from '../core/client.js';
|
|
9
|
+
import { Config } from '../config/config.js';
|
|
10
|
+
import { checkNextSpeaker } from './nextSpeakerChecker.js';
|
|
11
|
+
import { GeminiChat } from '../core/geminiChat.js';
|
|
12
|
+
// Mock GeminiClient and Config constructor
|
|
13
|
+
vi.mock('../core/client.js');
|
|
14
|
+
vi.mock('../config/config.js');
|
|
15
|
+
// Define mocks for GoogleGenAI and Models instances that will be used across tests
|
|
16
|
+
const mockModelsInstance = {
|
|
17
|
+
generateContent: vi.fn(),
|
|
18
|
+
generateContentStream: vi.fn(),
|
|
19
|
+
countTokens: vi.fn(),
|
|
20
|
+
embedContent: vi.fn(),
|
|
21
|
+
batchEmbedContents: vi.fn(),
|
|
22
|
+
};
|
|
23
|
+
const mockGoogleGenAIInstance = {
|
|
24
|
+
getGenerativeModel: vi.fn().mockReturnValue(mockModelsInstance),
|
|
25
|
+
// Add other methods of GoogleGenAI if they are directly used by GeminiChat constructor or its methods
|
|
26
|
+
};
|
|
27
|
+
vi.mock('@google/genai', async () => {
|
|
28
|
+
const actualGenAI = await vi.importActual('@google/genai');
|
|
29
|
+
return {
|
|
30
|
+
...actualGenAI,
|
|
31
|
+
GoogleGenAI: vi.fn(() => mockGoogleGenAIInstance), // Mock constructor to return the predefined instance
|
|
32
|
+
// If Models is instantiated directly in GeminiChat, mock its constructor too
|
|
33
|
+
// For now, assuming Models instance is obtained via getGenerativeModel
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
describe('checkNextSpeaker', () => {
|
|
37
|
+
let chatInstance;
|
|
38
|
+
let mockGeminiClient;
|
|
39
|
+
let MockConfig;
|
|
40
|
+
const abortSignal = new AbortController().signal;
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
MockConfig = vi.mocked(Config);
|
|
43
|
+
const mockConfigInstance = new MockConfig('test-api-key', 'gemini-pro', false, '.', false, undefined, false, undefined, undefined, undefined);
|
|
44
|
+
mockGeminiClient = new GeminiClient(mockConfigInstance);
|
|
45
|
+
// Reset mocks before each test to ensure test isolation
|
|
46
|
+
vi.mocked(mockModelsInstance.generateContent).mockReset();
|
|
47
|
+
vi.mocked(mockModelsInstance.generateContentStream).mockReset();
|
|
48
|
+
// GeminiChat will receive the mocked instances via the mocked GoogleGenAI constructor
|
|
49
|
+
chatInstance = new GeminiChat(mockConfigInstance, mockModelsInstance, // This is the instance returned by mockGoogleGenAIInstance.getGenerativeModel
|
|
50
|
+
{}, []);
|
|
51
|
+
// Spy on getHistory for chatInstance
|
|
52
|
+
vi.spyOn(chatInstance, 'getHistory');
|
|
53
|
+
});
|
|
54
|
+
afterEach(() => {
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
});
|
|
57
|
+
it('should return null if history is empty', async () => {
|
|
58
|
+
chatInstance.getHistory.mockReturnValue([]);
|
|
59
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
60
|
+
expect(result).toBeNull();
|
|
61
|
+
expect(mockGeminiClient.generateJson).not.toHaveBeenCalled();
|
|
62
|
+
});
|
|
63
|
+
it('should return null if the last speaker was the user', async () => {
|
|
64
|
+
chatInstance.getHistory.mockReturnValue([
|
|
65
|
+
{ role: 'user', parts: [{ text: 'Hello' }] },
|
|
66
|
+
]);
|
|
67
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
68
|
+
expect(result).toBeNull();
|
|
69
|
+
expect(mockGeminiClient.generateJson).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
it("should return { next_speaker: 'model' } when model intends to continue", async () => {
|
|
72
|
+
chatInstance.getHistory.mockReturnValue([
|
|
73
|
+
{ role: 'model', parts: [{ text: 'I will now do something.' }] },
|
|
74
|
+
]);
|
|
75
|
+
const mockApiResponse = {
|
|
76
|
+
reasoning: 'Model stated it will do something.',
|
|
77
|
+
next_speaker: 'model',
|
|
78
|
+
};
|
|
79
|
+
mockGeminiClient.generateJson.mockResolvedValue(mockApiResponse);
|
|
80
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
81
|
+
expect(result).toEqual(mockApiResponse);
|
|
82
|
+
expect(mockGeminiClient.generateJson).toHaveBeenCalledTimes(1);
|
|
83
|
+
});
|
|
84
|
+
it("should return { next_speaker: 'user' } when model asks a question", async () => {
|
|
85
|
+
chatInstance.getHistory.mockReturnValue([
|
|
86
|
+
{ role: 'model', parts: [{ text: 'What would you like to do?' }] },
|
|
87
|
+
]);
|
|
88
|
+
const mockApiResponse = {
|
|
89
|
+
reasoning: 'Model asked a question.',
|
|
90
|
+
next_speaker: 'user',
|
|
91
|
+
};
|
|
92
|
+
mockGeminiClient.generateJson.mockResolvedValue(mockApiResponse);
|
|
93
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
94
|
+
expect(result).toEqual(mockApiResponse);
|
|
95
|
+
});
|
|
96
|
+
it("should return { next_speaker: 'user' } when model makes a statement", async () => {
|
|
97
|
+
chatInstance.getHistory.mockReturnValue([
|
|
98
|
+
{ role: 'model', parts: [{ text: 'This is a statement.' }] },
|
|
99
|
+
]);
|
|
100
|
+
const mockApiResponse = {
|
|
101
|
+
reasoning: 'Model made a statement, awaiting user input.',
|
|
102
|
+
next_speaker: 'user',
|
|
103
|
+
};
|
|
104
|
+
mockGeminiClient.generateJson.mockResolvedValue(mockApiResponse);
|
|
105
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
106
|
+
expect(result).toEqual(mockApiResponse);
|
|
107
|
+
});
|
|
108
|
+
it('should return null if geminiClient.generateJson throws an error', async () => {
|
|
109
|
+
const consoleWarnSpy = vi
|
|
110
|
+
.spyOn(console, 'warn')
|
|
111
|
+
.mockImplementation(() => { });
|
|
112
|
+
chatInstance.getHistory.mockReturnValue([
|
|
113
|
+
{ role: 'model', parts: [{ text: 'Some model output.' }] },
|
|
114
|
+
]);
|
|
115
|
+
mockGeminiClient.generateJson.mockRejectedValue(new Error('API Error'));
|
|
116
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
117
|
+
expect(result).toBeNull();
|
|
118
|
+
consoleWarnSpy.mockRestore();
|
|
119
|
+
});
|
|
120
|
+
it('should return null if geminiClient.generateJson returns invalid JSON (missing next_speaker)', async () => {
|
|
121
|
+
chatInstance.getHistory.mockReturnValue([
|
|
122
|
+
{ role: 'model', parts: [{ text: 'Some model output.' }] },
|
|
123
|
+
]);
|
|
124
|
+
mockGeminiClient.generateJson.mockResolvedValue({
|
|
125
|
+
reasoning: 'This is incomplete.',
|
|
126
|
+
}); // Type assertion to simulate invalid response
|
|
127
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
128
|
+
expect(result).toBeNull();
|
|
129
|
+
});
|
|
130
|
+
it('should return null if geminiClient.generateJson returns a non-string next_speaker', async () => {
|
|
131
|
+
chatInstance.getHistory.mockReturnValue([
|
|
132
|
+
{ role: 'model', parts: [{ text: 'Some model output.' }] },
|
|
133
|
+
]);
|
|
134
|
+
mockGeminiClient.generateJson.mockResolvedValue({
|
|
135
|
+
reasoning: 'Model made a statement, awaiting user input.',
|
|
136
|
+
next_speaker: 123, // Invalid type
|
|
137
|
+
});
|
|
138
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
139
|
+
expect(result).toBeNull();
|
|
140
|
+
});
|
|
141
|
+
it('should return null if geminiClient.generateJson returns an invalid next_speaker string value', async () => {
|
|
142
|
+
chatInstance.getHistory.mockReturnValue([
|
|
143
|
+
{ role: 'model', parts: [{ text: 'Some model output.' }] },
|
|
144
|
+
]);
|
|
145
|
+
mockGeminiClient.generateJson.mockResolvedValue({
|
|
146
|
+
reasoning: 'Model made a statement, awaiting user input.',
|
|
147
|
+
next_speaker: 'neither', // Invalid enum value
|
|
148
|
+
});
|
|
149
|
+
const result = await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
150
|
+
expect(result).toBeNull();
|
|
151
|
+
});
|
|
152
|
+
it('should call generateJson with DEFAULT_GEMINI_FLASH_MODEL', async () => {
|
|
153
|
+
chatInstance.getHistory.mockReturnValue([
|
|
154
|
+
{ role: 'model', parts: [{ text: 'Some model output.' }] },
|
|
155
|
+
]);
|
|
156
|
+
const mockApiResponse = {
|
|
157
|
+
reasoning: 'Model made a statement, awaiting user input.',
|
|
158
|
+
next_speaker: 'user',
|
|
159
|
+
};
|
|
160
|
+
mockGeminiClient.generateJson.mockResolvedValue(mockApiResponse);
|
|
161
|
+
await checkNextSpeaker(chatInstance, mockGeminiClient, abortSignal);
|
|
162
|
+
expect(mockGeminiClient.generateJson).toHaveBeenCalled();
|
|
163
|
+
const generateJsonCall = mockGeminiClient.generateJson.mock
|
|
164
|
+
.calls[0];
|
|
165
|
+
expect(generateJsonCall[3]).toBe(DEFAULT_GEMINI_FLASH_MODEL);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=nextSpeakerChecker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextSpeakerChecker.test.js","sourceRoot":"","sources":["../../../src/utils/nextSpeakerChecker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare const LLXPRT_DIR = ".llxprt";
|
|
7
|
+
export declare const GOOGLE_ACCOUNTS_FILENAME = "google_accounts.json";
|
|
8
|
+
export declare function ensureLlxprtDirExists(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Replaces the home directory with a tilde.
|
|
11
|
+
* @param path - The path to tildeify.
|
|
12
|
+
* @returns The tildeified path.
|
|
13
|
+
*/
|
|
14
|
+
export declare function tildeifyPath(path: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Shortens a path string if it exceeds maxLen, prioritizing the start and end segments.
|
|
17
|
+
* Example: /path/to/a/very/long/file.txt -> /path/.../long/file.txt
|
|
18
|
+
*/
|
|
19
|
+
export declare function shortenPath(filePath: string, maxLen?: number): string;
|
|
20
|
+
/**
|
|
21
|
+
* Calculates the relative path from a root directory to a target path.
|
|
22
|
+
* Ensures both paths are resolved before calculating.
|
|
23
|
+
* Returns '.' if the target path is the same as the root directory.
|
|
24
|
+
*
|
|
25
|
+
* @param targetPath The absolute or relative path to make relative.
|
|
26
|
+
* @param rootDirectory The absolute path of the directory to make the target path relative to.
|
|
27
|
+
* @returns The relative path from rootDirectory to targetPath.
|
|
28
|
+
*/
|
|
29
|
+
export declare function makeRelative(targetPath: string, rootDirectory: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Escapes spaces in a file path.
|
|
32
|
+
*/
|
|
33
|
+
export declare function escapePath(filePath: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Unescapes spaces in a file path.
|
|
36
|
+
*/
|
|
37
|
+
export declare function unescapePath(filePath: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Generates a unique hash for a project based on its root path.
|
|
40
|
+
* @param projectRoot The absolute path to the project's root directory.
|
|
41
|
+
* @returns A SHA256 hash of the project root path.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getProjectHash(projectRoot: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Generates a unique temporary directory path for a project.
|
|
46
|
+
* @param projectRoot The absolute path to the project's root directory.
|
|
47
|
+
* @returns The path to the project's temporary directory.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getProjectTempDir(projectRoot: string): string;
|