@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,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base implementation for tools with common functionality
|
|
8
|
+
*/
|
|
9
|
+
export class BaseTool {
|
|
10
|
+
name;
|
|
11
|
+
displayName;
|
|
12
|
+
description;
|
|
13
|
+
parameterSchema;
|
|
14
|
+
isOutputMarkdown;
|
|
15
|
+
canUpdateOutput;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new instance of BaseTool
|
|
18
|
+
* @param name Internal name of the tool (used for API calls)
|
|
19
|
+
* @param displayName User-friendly display name of the tool
|
|
20
|
+
* @param description Description of what the tool does
|
|
21
|
+
* @param isOutputMarkdown Whether the tool's output should be rendered as markdown
|
|
22
|
+
* @param canUpdateOutput Whether the tool supports live (streaming) output
|
|
23
|
+
* @param parameterSchema JSON Schema defining the parameters
|
|
24
|
+
*/
|
|
25
|
+
constructor(name, displayName, description, parameterSchema, isOutputMarkdown = true, canUpdateOutput = false) {
|
|
26
|
+
this.name = name;
|
|
27
|
+
this.displayName = displayName;
|
|
28
|
+
this.description = description;
|
|
29
|
+
this.parameterSchema = parameterSchema;
|
|
30
|
+
this.isOutputMarkdown = isOutputMarkdown;
|
|
31
|
+
this.canUpdateOutput = canUpdateOutput;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Function declaration schema computed from name, description, and parameterSchema
|
|
35
|
+
*/
|
|
36
|
+
get schema() {
|
|
37
|
+
return {
|
|
38
|
+
name: this.name,
|
|
39
|
+
description: this.description,
|
|
40
|
+
parameters: this.parameterSchema,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validates the parameters for the tool
|
|
45
|
+
* This is a placeholder implementation and should be overridden
|
|
46
|
+
* Should be called from both `shouldConfirmExecute` and `execute`
|
|
47
|
+
* `shouldConfirmExecute` should return false immediately if invalid
|
|
48
|
+
* @param params Parameters to validate
|
|
49
|
+
* @returns An error message string if invalid, null otherwise
|
|
50
|
+
*/
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
52
|
+
validateToolParams(params) {
|
|
53
|
+
// Implementation would typically use a JSON Schema validator
|
|
54
|
+
// This is a placeholder that should be implemented by derived classes
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Gets a pre-execution description of the tool operation
|
|
59
|
+
* Default implementation that should be overridden by derived classes
|
|
60
|
+
* @param params Parameters for the tool execution
|
|
61
|
+
* @returns A markdown string describing what the tool will do
|
|
62
|
+
*/
|
|
63
|
+
getDescription(params) {
|
|
64
|
+
return JSON.stringify(params);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Determines if the tool should prompt for confirmation before execution
|
|
68
|
+
* @param params Parameters for the tool execution
|
|
69
|
+
* @returns Whether or not execute should be confirmed by the user.
|
|
70
|
+
*/
|
|
71
|
+
shouldConfirmExecute(
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
73
|
+
params,
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
+
abortSignal) {
|
|
76
|
+
return Promise.resolve(false);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export var ToolConfirmationOutcome;
|
|
80
|
+
(function (ToolConfirmationOutcome) {
|
|
81
|
+
ToolConfirmationOutcome["ProceedOnce"] = "proceed_once";
|
|
82
|
+
ToolConfirmationOutcome["ProceedAlways"] = "proceed_always";
|
|
83
|
+
ToolConfirmationOutcome["ProceedAlwaysServer"] = "proceed_always_server";
|
|
84
|
+
ToolConfirmationOutcome["ProceedAlwaysTool"] = "proceed_always_tool";
|
|
85
|
+
ToolConfirmationOutcome["ModifyWithEditor"] = "modify_with_editor";
|
|
86
|
+
ToolConfirmationOutcome["Cancel"] = "cancel";
|
|
87
|
+
})(ToolConfirmationOutcome || (ToolConfirmationOutcome = {}));
|
|
88
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgFH;;GAEG;AACH,MAAM,OAAgB,QAAQ;IAejB;IACA;IACA;IACA;IACA;IACA;IAfX;;;;;;;;OAQG;IACH,YACW,IAAY,EACZ,WAAmB,EACnB,WAAmB,EACnB,eAAuB,EACvB,mBAA4B,IAAI,EAChC,kBAA2B,KAAK;QALhC,SAAI,GAAJ,IAAI,CAAQ;QACZ,gBAAW,GAAX,WAAW,CAAQ;QACnB,gBAAW,GAAX,WAAW,CAAQ;QACnB,oBAAe,GAAf,eAAe,CAAQ;QACvB,qBAAgB,GAAhB,gBAAgB,CAAgB;QAChC,oBAAe,GAAf,eAAe,CAAiB;IACxC,CAAC;IAEJ;;OAEG;IACH,IAAI,MAAM;QACR,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,eAAe;SACjC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,6DAA6D;IAC7D,kBAAkB,CAAC,MAAe;QAChC,6DAA6D;QAC7D,sEAAsE;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,MAAe;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,oBAAoB;IAClB,6DAA6D;IAC7D,MAAe;IACf,6DAA6D;IAC7D,WAAwB;QAExB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CAcF;AAgFD,MAAM,CAAN,IAAY,uBAOX;AAPD,WAAY,uBAAuB;IACjC,uDAA4B,CAAA;IAC5B,2DAAgC,CAAA;IAChC,wEAA6C,CAAA;IAC7C,oEAAyC,CAAA;IACzC,kEAAuC,CAAA;IACvC,4CAAiB,CAAA;AACnB,CAAC,EAPW,uBAAuB,KAAvB,uBAAuB,QAOlC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseTool, ToolResult, ToolCallConfirmationDetails } from './tools.js';
|
|
7
|
+
import { Config } from '../config/config.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parameters for the WebFetch tool
|
|
10
|
+
*/
|
|
11
|
+
export interface WebFetchToolParams {
|
|
12
|
+
/**
|
|
13
|
+
* The prompt containing URL(s) (up to 20) and instructions for processing their content.
|
|
14
|
+
*/
|
|
15
|
+
prompt: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Implementation of the WebFetch tool logic
|
|
19
|
+
*/
|
|
20
|
+
export declare class WebFetchTool extends BaseTool<WebFetchToolParams, ToolResult> {
|
|
21
|
+
private readonly config;
|
|
22
|
+
static readonly Name: string;
|
|
23
|
+
constructor(config: Config);
|
|
24
|
+
private executeFallback;
|
|
25
|
+
validateParams(params: WebFetchToolParams): string | null;
|
|
26
|
+
getDescription(params: WebFetchToolParams): string;
|
|
27
|
+
shouldConfirmExecute(params: WebFetchToolParams): Promise<ToolCallConfirmationDetails | false>;
|
|
28
|
+
execute(params: WebFetchToolParams, signal: AbortSignal): Promise<ToolResult>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
7
|
+
import { BaseTool, ToolConfirmationOutcome, } from './tools.js';
|
|
8
|
+
import { Type } from '@google/genai';
|
|
9
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
10
|
+
import { ApprovalMode } from '../config/config.js';
|
|
11
|
+
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
12
|
+
import { fetchWithTimeout, isPrivateIp } from '../utils/fetch.js';
|
|
13
|
+
import { convert } from 'html-to-text';
|
|
14
|
+
const URL_FETCH_TIMEOUT_MS = 10000;
|
|
15
|
+
const MAX_CONTENT_LENGTH = 100000;
|
|
16
|
+
// Helper function to extract URLs from a string
|
|
17
|
+
function extractUrls(text) {
|
|
18
|
+
const urlRegex = /(https?:\/\/[^\s]+)/g;
|
|
19
|
+
return text.match(urlRegex) || [];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Implementation of the WebFetch tool logic
|
|
23
|
+
*/
|
|
24
|
+
export class WebFetchTool extends BaseTool {
|
|
25
|
+
config;
|
|
26
|
+
static Name = 'web_fetch';
|
|
27
|
+
constructor(config) {
|
|
28
|
+
super(WebFetchTool.Name, 'WebFetch', "Processes content from URL(s), including local and private network addresses (e.g., localhost), embedded in a prompt. Include up to 20 URLs and instructions (e.g., summarize, extract specific data) directly in the 'prompt' parameter.", {
|
|
29
|
+
properties: {
|
|
30
|
+
prompt: {
|
|
31
|
+
description: 'A comprehensive prompt that includes the URL(s) (up to 20) to fetch and specific instructions on how to process their content (e.g., "Summarize https://example.com/article and extract key points from https://another.com/data"). Must contain as least one URL starting with http:// or https://.',
|
|
32
|
+
type: Type.STRING,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ['prompt'],
|
|
36
|
+
type: Type.OBJECT,
|
|
37
|
+
});
|
|
38
|
+
this.config = config;
|
|
39
|
+
}
|
|
40
|
+
async executeFallback(params, signal) {
|
|
41
|
+
const urls = extractUrls(params.prompt);
|
|
42
|
+
if (urls.length === 0) {
|
|
43
|
+
return {
|
|
44
|
+
llmContent: 'Error: No URL found in the prompt for fallback.',
|
|
45
|
+
returnDisplay: 'Error: No URL found in the prompt for fallback.',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// For now, we only support one URL for fallback
|
|
49
|
+
let url = urls[0];
|
|
50
|
+
// Convert GitHub blob URL to raw URL
|
|
51
|
+
if (url.includes('github.com') && url.includes('/blob/')) {
|
|
52
|
+
url = url
|
|
53
|
+
.replace('github.com', 'raw.githubusercontent.com')
|
|
54
|
+
.replace('/blob/', '/');
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetchWithTimeout(url, URL_FETCH_TIMEOUT_MS);
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
throw new Error(`Request failed with status code ${response.status} ${response.statusText}`);
|
|
60
|
+
}
|
|
61
|
+
const html = await response.text();
|
|
62
|
+
const textContent = convert(html, {
|
|
63
|
+
wordwrap: false,
|
|
64
|
+
selectors: [
|
|
65
|
+
{ selector: 'a', options: { ignoreHref: true } },
|
|
66
|
+
{ selector: 'img', format: 'skip' },
|
|
67
|
+
],
|
|
68
|
+
}).substring(0, MAX_CONTENT_LENGTH);
|
|
69
|
+
const geminiClient = this.config.getGeminiClient();
|
|
70
|
+
const fallbackPrompt = `The user requested the following: "${params.prompt}".
|
|
71
|
+
|
|
72
|
+
I was unable to access the URL directly. Instead, I have fetched the raw content of the page. Please use the following content to answer the user's request. Do not attempt to access the URL again.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
${textContent}
|
|
76
|
+
---`;
|
|
77
|
+
const result = await geminiClient.generateContent([{ role: 'user', parts: [{ text: fallbackPrompt }] }], {}, signal);
|
|
78
|
+
const resultText = getResponseText(result) || '';
|
|
79
|
+
return {
|
|
80
|
+
llmContent: resultText,
|
|
81
|
+
returnDisplay: `Content for ${url} processed using fallback fetch.`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
const error = e;
|
|
86
|
+
const errorMessage = `Error during fallback fetch for ${url}: ${error.message}`;
|
|
87
|
+
return {
|
|
88
|
+
llmContent: `Error: ${errorMessage}`,
|
|
89
|
+
returnDisplay: `Error: ${errorMessage}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
validateParams(params) {
|
|
94
|
+
const errors = SchemaValidator.validate(this.schema.parameters, params);
|
|
95
|
+
if (errors) {
|
|
96
|
+
return errors;
|
|
97
|
+
}
|
|
98
|
+
if (!params.prompt || params.prompt.trim() === '') {
|
|
99
|
+
return "The 'prompt' parameter cannot be empty and must contain URL(s) and instructions.";
|
|
100
|
+
}
|
|
101
|
+
if (!params.prompt.includes('http://') &&
|
|
102
|
+
!params.prompt.includes('https://')) {
|
|
103
|
+
return "The 'prompt' must contain at least one valid URL (starting with http:// or https://).";
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
getDescription(params) {
|
|
108
|
+
const displayPrompt = params.prompt.length > 100
|
|
109
|
+
? params.prompt.substring(0, 97) + '...'
|
|
110
|
+
: params.prompt;
|
|
111
|
+
return `Processing URLs and instructions from prompt: "${displayPrompt}"`;
|
|
112
|
+
}
|
|
113
|
+
async shouldConfirmExecute(params) {
|
|
114
|
+
const approvalMode = this.config.getApprovalMode();
|
|
115
|
+
if (approvalMode === ApprovalMode.AUTO_EDIT ||
|
|
116
|
+
approvalMode === ApprovalMode.YOLO) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const validationError = this.validateParams(params);
|
|
120
|
+
if (validationError) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
// Perform GitHub URL conversion here to differentiate between user-provided
|
|
124
|
+
// URL and the actual URL to be fetched.
|
|
125
|
+
const urls = extractUrls(params.prompt).map((url) => {
|
|
126
|
+
if (url.includes('github.com') && url.includes('/blob/')) {
|
|
127
|
+
return url
|
|
128
|
+
.replace('github.com', 'raw.githubusercontent.com')
|
|
129
|
+
.replace('/blob/', '/');
|
|
130
|
+
}
|
|
131
|
+
return url;
|
|
132
|
+
});
|
|
133
|
+
const confirmationDetails = {
|
|
134
|
+
type: 'info',
|
|
135
|
+
title: `Confirm Web Fetch`,
|
|
136
|
+
prompt: params.prompt,
|
|
137
|
+
urls,
|
|
138
|
+
onConfirm: async (outcome) => {
|
|
139
|
+
if (outcome === ToolConfirmationOutcome.ProceedAlways) {
|
|
140
|
+
this.config.setApprovalMode(ApprovalMode.AUTO_EDIT);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
return confirmationDetails;
|
|
145
|
+
}
|
|
146
|
+
async execute(params, signal) {
|
|
147
|
+
const validationError = this.validateParams(params);
|
|
148
|
+
if (validationError) {
|
|
149
|
+
return {
|
|
150
|
+
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
151
|
+
returnDisplay: validationError,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const userPrompt = params.prompt;
|
|
155
|
+
const urls = extractUrls(userPrompt);
|
|
156
|
+
const url = urls[0];
|
|
157
|
+
const isPrivate = isPrivateIp(url);
|
|
158
|
+
if (isPrivate) {
|
|
159
|
+
return this.executeFallback(params, signal);
|
|
160
|
+
}
|
|
161
|
+
const geminiClient = this.config.getGeminiClient();
|
|
162
|
+
try {
|
|
163
|
+
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: userPrompt }] }], { tools: [{ urlContext: {} }] }, signal);
|
|
164
|
+
console.debug(`[WebFetchTool] Full response for prompt "${userPrompt.substring(0, 50)}...":`, JSON.stringify(response, null, 2));
|
|
165
|
+
let responseText = getResponseText(response) || '';
|
|
166
|
+
const urlContextMeta = response.candidates?.[0]?.urlContextMetadata;
|
|
167
|
+
const groundingMetadata = response.candidates?.[0]?.groundingMetadata;
|
|
168
|
+
const sources = groundingMetadata?.groundingChunks;
|
|
169
|
+
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
170
|
+
// Error Handling
|
|
171
|
+
let processingError = false;
|
|
172
|
+
if (urlContextMeta?.urlMetadata &&
|
|
173
|
+
urlContextMeta.urlMetadata.length > 0) {
|
|
174
|
+
const allStatuses = urlContextMeta.urlMetadata.map((m) => m.urlRetrievalStatus);
|
|
175
|
+
if (allStatuses.every((s) => s !== 'URL_RETRIEVAL_STATUS_SUCCESS')) {
|
|
176
|
+
processingError = true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (!responseText.trim() && !sources?.length) {
|
|
180
|
+
// No URL metadata and no content/sources
|
|
181
|
+
processingError = true;
|
|
182
|
+
}
|
|
183
|
+
if (!processingError &&
|
|
184
|
+
!responseText.trim() &&
|
|
185
|
+
(!sources || sources.length === 0)) {
|
|
186
|
+
// Successfully retrieved some URL (or no specific error from urlContextMeta), but no usable text or grounding data.
|
|
187
|
+
processingError = true;
|
|
188
|
+
}
|
|
189
|
+
if (processingError) {
|
|
190
|
+
return this.executeFallback(params, signal);
|
|
191
|
+
}
|
|
192
|
+
const sourceListFormatted = [];
|
|
193
|
+
if (sources && sources.length > 0) {
|
|
194
|
+
sources.forEach((source, index) => {
|
|
195
|
+
const title = source.web?.title || 'Untitled';
|
|
196
|
+
const uri = source.web?.uri || 'Unknown URI'; // Fallback if URI is missing
|
|
197
|
+
sourceListFormatted.push(`[${index + 1}] ${title} (${uri})`);
|
|
198
|
+
});
|
|
199
|
+
if (groundingSupports && groundingSupports.length > 0) {
|
|
200
|
+
const insertions = [];
|
|
201
|
+
groundingSupports.forEach((support) => {
|
|
202
|
+
if (support.segment && support.groundingChunkIndices) {
|
|
203
|
+
const citationMarker = support.groundingChunkIndices
|
|
204
|
+
.map((chunkIndex) => `[${chunkIndex + 1}]`)
|
|
205
|
+
.join('');
|
|
206
|
+
insertions.push({
|
|
207
|
+
index: support.segment.endIndex,
|
|
208
|
+
marker: citationMarker,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
insertions.sort((a, b) => b.index - a.index);
|
|
213
|
+
const responseChars = responseText.split('');
|
|
214
|
+
insertions.forEach((insertion) => {
|
|
215
|
+
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
216
|
+
});
|
|
217
|
+
responseText = responseChars.join('');
|
|
218
|
+
}
|
|
219
|
+
if (sourceListFormatted.length > 0) {
|
|
220
|
+
responseText += `
|
|
221
|
+
|
|
222
|
+
Sources:
|
|
223
|
+
${sourceListFormatted.join('\n')}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const llmContent = responseText;
|
|
227
|
+
console.debug(`[WebFetchTool] Formatted tool response for prompt "${userPrompt}:\n\n":`, llmContent);
|
|
228
|
+
return {
|
|
229
|
+
llmContent,
|
|
230
|
+
returnDisplay: `Content processed from prompt.`,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
const errorMessage = `Error processing web content for prompt "${userPrompt.substring(0, 50)}...": ${getErrorMessage(error)}`;
|
|
235
|
+
console.error(errorMessage, error);
|
|
236
|
+
return {
|
|
237
|
+
llmContent: `Error: ${errorMessage}`,
|
|
238
|
+
returnDisplay: `Error: ${errorMessage}`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
+
import { WebFetchTool } from './web-fetch.js';
|
|
8
|
+
import { ApprovalMode } from '../config/config.js';
|
|
9
|
+
import { ToolConfirmationOutcome } from './tools.js';
|
|
10
|
+
describe('WebFetchTool', () => {
|
|
11
|
+
const mockConfig = {
|
|
12
|
+
getApprovalMode: vi.fn(),
|
|
13
|
+
setApprovalMode: vi.fn(),
|
|
14
|
+
};
|
|
15
|
+
describe('shouldConfirmExecute', () => {
|
|
16
|
+
it('should return confirmation details with the correct prompt and urls', async () => {
|
|
17
|
+
const tool = new WebFetchTool(mockConfig);
|
|
18
|
+
const params = { prompt: 'fetch https://example.com' };
|
|
19
|
+
const confirmationDetails = await tool.shouldConfirmExecute(params);
|
|
20
|
+
expect(confirmationDetails).toEqual({
|
|
21
|
+
type: 'info',
|
|
22
|
+
title: 'Confirm Web Fetch',
|
|
23
|
+
prompt: 'fetch https://example.com',
|
|
24
|
+
urls: ['https://example.com'],
|
|
25
|
+
onConfirm: expect.any(Function),
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it('should convert github urls to raw format', async () => {
|
|
29
|
+
const tool = new WebFetchTool(mockConfig);
|
|
30
|
+
const params = {
|
|
31
|
+
prompt: 'fetch https://github.com/google/gemini-react/blob/main/README.md',
|
|
32
|
+
};
|
|
33
|
+
const confirmationDetails = await tool.shouldConfirmExecute(params);
|
|
34
|
+
expect(confirmationDetails).toEqual({
|
|
35
|
+
type: 'info',
|
|
36
|
+
title: 'Confirm Web Fetch',
|
|
37
|
+
prompt: 'fetch https://github.com/google/gemini-react/blob/main/README.md',
|
|
38
|
+
urls: [
|
|
39
|
+
'https://raw.githubusercontent.com/google/gemini-react/main/README.md',
|
|
40
|
+
],
|
|
41
|
+
onConfirm: expect.any(Function),
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('should return false if approval mode is AUTO_EDIT', async () => {
|
|
45
|
+
const tool = new WebFetchTool({
|
|
46
|
+
...mockConfig,
|
|
47
|
+
getApprovalMode: () => ApprovalMode.AUTO_EDIT,
|
|
48
|
+
});
|
|
49
|
+
const params = { prompt: 'fetch https://example.com' };
|
|
50
|
+
const confirmationDetails = await tool.shouldConfirmExecute(params);
|
|
51
|
+
expect(confirmationDetails).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
it('should call setApprovalMode when onConfirm is called with ProceedAlways', async () => {
|
|
54
|
+
const setApprovalMode = vi.fn();
|
|
55
|
+
const tool = new WebFetchTool({
|
|
56
|
+
...mockConfig,
|
|
57
|
+
setApprovalMode,
|
|
58
|
+
});
|
|
59
|
+
const params = { prompt: 'fetch https://example.com' };
|
|
60
|
+
const confirmationDetails = await tool.shouldConfirmExecute(params);
|
|
61
|
+
if (confirmationDetails &&
|
|
62
|
+
typeof confirmationDetails === 'object' &&
|
|
63
|
+
'onConfirm' in confirmationDetails) {
|
|
64
|
+
await confirmationDetails.onConfirm(ToolConfirmationOutcome.ProceedAlways);
|
|
65
|
+
}
|
|
66
|
+
expect(setApprovalMode).toHaveBeenCalledWith(ApprovalMode.AUTO_EDIT);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=web-fetch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.test.js","sourceRoot":"","sources":["../../../src/tools/web-fetch.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
|
+
import { GroundingMetadata } from '@google/genai';
|
|
7
|
+
import { BaseTool, ToolResult } from './tools.js';
|
|
8
|
+
import { Config } from '../config/config.js';
|
|
9
|
+
interface GroundingChunkWeb {
|
|
10
|
+
uri?: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
}
|
|
13
|
+
interface GroundingChunkItem {
|
|
14
|
+
web?: GroundingChunkWeb;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parameters for the WebSearchTool.
|
|
18
|
+
*/
|
|
19
|
+
export interface WebSearchToolParams {
|
|
20
|
+
/**
|
|
21
|
+
* The search query.
|
|
22
|
+
*/
|
|
23
|
+
query: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extends ToolResult to include sources for web search.
|
|
27
|
+
*/
|
|
28
|
+
export interface WebSearchToolResult extends ToolResult {
|
|
29
|
+
sources?: GroundingMetadata extends {
|
|
30
|
+
groundingChunks: GroundingChunkItem[];
|
|
31
|
+
} ? GroundingMetadata['groundingChunks'] : GroundingChunkItem[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A tool to perform web searches using Google Search via the Gemini API.
|
|
35
|
+
*/
|
|
36
|
+
export declare class WebSearchTool extends BaseTool<WebSearchToolParams, WebSearchToolResult> {
|
|
37
|
+
private readonly config;
|
|
38
|
+
static readonly Name: string;
|
|
39
|
+
constructor(config: Config);
|
|
40
|
+
/**
|
|
41
|
+
* Validates the parameters for the WebSearchTool.
|
|
42
|
+
* @param params The parameters to validate
|
|
43
|
+
* @returns An error message string if validation fails, null if valid
|
|
44
|
+
*/
|
|
45
|
+
validateParams(params: WebSearchToolParams): string | null;
|
|
46
|
+
getDescription(params: WebSearchToolParams): string;
|
|
47
|
+
execute(params: WebSearchToolParams, signal: AbortSignal): Promise<WebSearchToolResult>;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseTool } from './tools.js';
|
|
7
|
+
import { Type } from '@google/genai';
|
|
8
|
+
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
9
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
10
|
+
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
11
|
+
/**
|
|
12
|
+
* A tool to perform web searches using Google Search via the Gemini API.
|
|
13
|
+
*/
|
|
14
|
+
export class WebSearchTool extends BaseTool {
|
|
15
|
+
config;
|
|
16
|
+
static Name = 'google_web_search';
|
|
17
|
+
constructor(config) {
|
|
18
|
+
super(WebSearchTool.Name, 'GoogleSearch', 'Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.', {
|
|
19
|
+
type: Type.OBJECT,
|
|
20
|
+
properties: {
|
|
21
|
+
query: {
|
|
22
|
+
type: Type.STRING,
|
|
23
|
+
description: 'The search query to find information on the web.',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
required: ['query'],
|
|
27
|
+
});
|
|
28
|
+
this.config = config;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validates the parameters for the WebSearchTool.
|
|
32
|
+
* @param params The parameters to validate
|
|
33
|
+
* @returns An error message string if validation fails, null if valid
|
|
34
|
+
*/
|
|
35
|
+
validateParams(params) {
|
|
36
|
+
const errors = SchemaValidator.validate(this.schema.parameters, params);
|
|
37
|
+
if (errors) {
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
if (!params.query || params.query.trim() === '') {
|
|
41
|
+
return "The 'query' parameter cannot be empty.";
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
getDescription(params) {
|
|
46
|
+
return `Searching the web for: "${params.query}"`;
|
|
47
|
+
}
|
|
48
|
+
async execute(params, signal) {
|
|
49
|
+
const validationError = this.validateToolParams(params);
|
|
50
|
+
if (validationError) {
|
|
51
|
+
return {
|
|
52
|
+
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
53
|
+
returnDisplay: validationError,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const geminiClient = this.config.getGeminiClient();
|
|
57
|
+
try {
|
|
58
|
+
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: params.query }] }], { tools: [{ googleSearch: {} }] }, signal);
|
|
59
|
+
const responseText = getResponseText(response);
|
|
60
|
+
const groundingMetadata = response.candidates?.[0]?.groundingMetadata;
|
|
61
|
+
const sources = groundingMetadata?.groundingChunks;
|
|
62
|
+
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
63
|
+
if (!responseText || !responseText.trim()) {
|
|
64
|
+
return {
|
|
65
|
+
llmContent: `No search results or information found for query: "${params.query}"`,
|
|
66
|
+
returnDisplay: 'No information found.',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
let modifiedResponseText = responseText;
|
|
70
|
+
const sourceListFormatted = [];
|
|
71
|
+
if (sources && sources.length > 0) {
|
|
72
|
+
sources.forEach((source, index) => {
|
|
73
|
+
const title = source.web?.title || 'Untitled';
|
|
74
|
+
const uri = source.web?.uri || 'No URI';
|
|
75
|
+
sourceListFormatted.push(`[${index + 1}] ${title} (${uri})`);
|
|
76
|
+
});
|
|
77
|
+
if (groundingSupports && groundingSupports.length > 0) {
|
|
78
|
+
const insertions = [];
|
|
79
|
+
groundingSupports.forEach((support) => {
|
|
80
|
+
if (support.segment && support.groundingChunkIndices) {
|
|
81
|
+
const citationMarker = support.groundingChunkIndices
|
|
82
|
+
.map((chunkIndex) => `[${chunkIndex + 1}]`)
|
|
83
|
+
.join('');
|
|
84
|
+
insertions.push({
|
|
85
|
+
index: support.segment.endIndex,
|
|
86
|
+
marker: citationMarker,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// Sort insertions by index in descending order to avoid shifting subsequent indices
|
|
91
|
+
insertions.sort((a, b) => b.index - a.index);
|
|
92
|
+
const responseChars = modifiedResponseText.split(''); // Use new variable
|
|
93
|
+
insertions.forEach((insertion) => {
|
|
94
|
+
// Fixed arrow function syntax
|
|
95
|
+
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
96
|
+
});
|
|
97
|
+
modifiedResponseText = responseChars.join(''); // Assign back to modifiedResponseText
|
|
98
|
+
}
|
|
99
|
+
if (sourceListFormatted.length > 0) {
|
|
100
|
+
modifiedResponseText +=
|
|
101
|
+
'\n\nSources:\n' + sourceListFormatted.join('\n'); // Fixed string concatenation
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
llmContent: `Web search results for "${params.query}":\n\n${modifiedResponseText}`,
|
|
106
|
+
returnDisplay: `Search results for "${params.query}" returned.`,
|
|
107
|
+
sources,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const errorMessage = `Error during web search for query "${params.query}": ${getErrorMessage(error)}`;
|
|
112
|
+
console.error(errorMessage, error);
|
|
113
|
+
return {
|
|
114
|
+
llmContent: `Error: ${errorMessage}`,
|
|
115
|
+
returnDisplay: `Error performing web search.`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=web-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
|