@vybestack/llxprt-code-tools 0.10.0-nightly.260613.1adad3b34
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/LICENSE +202 -0
- package/README.md +294 -0
- package/dist/.last_build +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.d.ts +29 -0
- package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.js +30 -0
- package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.js.map +1 -0
- package/dist/src/__tests__/fixtures/key-storage-fixtures.d.ts +39 -0
- package/dist/src/__tests__/fixtures/key-storage-fixtures.js +53 -0
- package/dist/src/__tests__/fixtures/key-storage-fixtures.js.map +1 -0
- package/dist/src/__tests__/fixtures/provider-formatting-fixtures.d.ts +140 -0
- package/dist/src/__tests__/fixtures/provider-formatting-fixtures.js +157 -0
- package/dist/src/__tests__/fixtures/provider-formatting-fixtures.js.map +1 -0
- package/dist/src/__tests__/red-test-helpers.d.ts +14 -0
- package/dist/src/__tests__/red-test-helpers.js +18 -0
- package/dist/src/__tests__/red-test-helpers.js.map +1 -0
- package/dist/src/formatters/IToolFormatter.d.ts +84 -0
- package/dist/src/formatters/IToolFormatter.js +6 -0
- package/dist/src/formatters/IToolFormatter.js.map +1 -0
- package/dist/src/formatters/ToolFormatter.d.ts +94 -0
- package/dist/src/formatters/ToolFormatter.js +379 -0
- package/dist/src/formatters/ToolFormatter.js.map +1 -0
- package/dist/src/formatters/ToolIdStrategy.d.ts +79 -0
- package/dist/src/formatters/ToolIdStrategy.js +173 -0
- package/dist/src/formatters/ToolIdStrategy.js.map +1 -0
- package/dist/src/formatters/doubleEscapeUtils.d.ts +46 -0
- package/dist/src/formatters/doubleEscapeUtils.js +223 -0
- package/dist/src/formatters/doubleEscapeUtils.js.map +1 -0
- package/dist/src/formatters/index.d.ts +21 -0
- package/dist/src/formatters/index.js +12 -0
- package/dist/src/formatters/index.js.map +1 -0
- package/dist/src/formatters/toolIdNormalization.d.ts +28 -0
- package/dist/src/formatters/toolIdNormalization.js +97 -0
- package/dist/src/formatters/toolIdNormalization.js.map +1 -0
- package/dist/src/formatters/toolNameUtils.d.ts +43 -0
- package/dist/src/formatters/toolNameUtils.js +143 -0
- package/dist/src/formatters/toolNameUtils.js.map +1 -0
- package/dist/src/index.d.ts +88 -0
- package/dist/src/index.js +68 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interfaces/IAsyncTaskService.d.ts +57 -0
- package/dist/src/interfaces/IAsyncTaskService.js +6 -0
- package/dist/src/interfaces/IAsyncTaskService.js.map +1 -0
- package/dist/src/interfaces/IIdeService.d.ts +62 -0
- package/dist/src/interfaces/IIdeService.js +6 -0
- package/dist/src/interfaces/IIdeService.js.map +1 -0
- package/dist/src/interfaces/ILspService.d.ts +54 -0
- package/dist/src/interfaces/ILspService.js +6 -0
- package/dist/src/interfaces/ILspService.js.map +1 -0
- package/dist/src/interfaces/IMcpToolService.d.ts +47 -0
- package/dist/src/interfaces/IMcpToolService.js +6 -0
- package/dist/src/interfaces/IMcpToolService.js.map +1 -0
- package/dist/src/interfaces/IPromptRegistryService.d.ts +51 -0
- package/dist/src/interfaces/IPromptRegistryService.js +6 -0
- package/dist/src/interfaces/IPromptRegistryService.js.map +1 -0
- package/dist/src/interfaces/ISettingsService.d.ts +50 -0
- package/dist/src/interfaces/ISettingsService.js +6 -0
- package/dist/src/interfaces/ISettingsService.js.map +1 -0
- package/dist/src/interfaces/IShellExecutionService.d.ts +55 -0
- package/dist/src/interfaces/IShellExecutionService.js +6 -0
- package/dist/src/interfaces/IShellExecutionService.js.map +1 -0
- package/dist/src/interfaces/IShellToolHost.d.ts +176 -0
- package/dist/src/interfaces/IShellToolHost.js +6 -0
- package/dist/src/interfaces/IShellToolHost.js.map +1 -0
- package/dist/src/interfaces/ISkillService.d.ts +69 -0
- package/dist/src/interfaces/ISkillService.js +6 -0
- package/dist/src/interfaces/ISkillService.js.map +1 -0
- package/dist/src/interfaces/IStorageService.d.ts +42 -0
- package/dist/src/interfaces/IStorageService.js +6 -0
- package/dist/src/interfaces/IStorageService.js.map +1 -0
- package/dist/src/interfaces/ISubagentService.d.ts +112 -0
- package/dist/src/interfaces/ISubagentService.js +6 -0
- package/dist/src/interfaces/ISubagentService.js.map +1 -0
- package/dist/src/interfaces/ITaskToolHost.d.ts +185 -0
- package/dist/src/interfaces/ITaskToolHost.js +6 -0
- package/dist/src/interfaces/ITaskToolHost.js.map +1 -0
- package/dist/src/interfaces/ITodoService.d.ts +79 -0
- package/dist/src/interfaces/ITodoService.js +6 -0
- package/dist/src/interfaces/ITodoService.js.map +1 -0
- package/dist/src/interfaces/IToolHost.d.ts +91 -0
- package/dist/src/interfaces/IToolHost.js +6 -0
- package/dist/src/interfaces/IToolHost.js.map +1 -0
- package/dist/src/interfaces/IToolKeyStorage.d.ts +62 -0
- package/dist/src/interfaces/IToolKeyStorage.js +6 -0
- package/dist/src/interfaces/IToolKeyStorage.js.map +1 -0
- package/dist/src/interfaces/IToolMessageBus.d.ts +63 -0
- package/dist/src/interfaces/IToolMessageBus.js +6 -0
- package/dist/src/interfaces/IToolMessageBus.js.map +1 -0
- package/dist/src/interfaces/IToolRegistryHost.d.ts +43 -0
- package/dist/src/interfaces/IToolRegistryHost.js +6 -0
- package/dist/src/interfaces/IToolRegistryHost.js.map +1 -0
- package/dist/src/interfaces/IWebSearchService.d.ts +16 -0
- package/dist/src/interfaces/IWebSearchService.js +7 -0
- package/dist/src/interfaces/IWebSearchService.js.map +1 -0
- package/dist/src/interfaces/index.d.ts +33 -0
- package/dist/src/interfaces/index.js +6 -0
- package/dist/src/interfaces/index.js.map +1 -0
- package/dist/src/tools/activate-skill.d.ts +26 -0
- package/dist/src/tools/activate-skill.js +121 -0
- package/dist/src/tools/activate-skill.js.map +1 -0
- package/dist/src/tools/apply-patch.d.ts +65 -0
- package/dist/src/tools/apply-patch.js +528 -0
- package/dist/src/tools/apply-patch.js.map +1 -0
- package/dist/src/tools/ast-edit/ast-config.d.ts +67 -0
- package/dist/src/tools/ast-edit/ast-config.js +72 -0
- package/dist/src/tools/ast-edit/ast-config.js.map +1 -0
- package/dist/src/tools/ast-edit/ast-edit-invocation.d.ts +40 -0
- package/dist/src/tools/ast-edit/ast-edit-invocation.js +410 -0
- package/dist/src/tools/ast-edit/ast-edit-invocation.js.map +1 -0
- package/dist/src/tools/ast-edit/ast-query-extractor.d.ts +21 -0
- package/dist/src/tools/ast-edit/ast-query-extractor.js +178 -0
- package/dist/src/tools/ast-edit/ast-query-extractor.js.map +1 -0
- package/dist/src/tools/ast-edit/ast-read-file-invocation.d.ts +26 -0
- package/dist/src/tools/ast-edit/ast-read-file-invocation.js +149 -0
- package/dist/src/tools/ast-edit/ast-read-file-invocation.js.map +1 -0
- package/dist/src/tools/ast-edit/constants.d.ts +30 -0
- package/dist/src/tools/ast-edit/constants.js +36 -0
- package/dist/src/tools/ast-edit/constants.js.map +1 -0
- package/dist/src/tools/ast-edit/context-collector.d.ts +25 -0
- package/dist/src/tools/ast-edit/context-collector.js +115 -0
- package/dist/src/tools/ast-edit/context-collector.js.map +1 -0
- package/dist/src/tools/ast-edit/context-optimizer.d.ts +29 -0
- package/dist/src/tools/ast-edit/context-optimizer.js +86 -0
- package/dist/src/tools/ast-edit/context-optimizer.js.map +1 -0
- package/dist/src/tools/ast-edit/cross-file-analyzer.d.ts +41 -0
- package/dist/src/tools/ast-edit/cross-file-analyzer.js +294 -0
- package/dist/src/tools/ast-edit/cross-file-analyzer.js.map +1 -0
- package/dist/src/tools/ast-edit/edit-calculator.d.ts +71 -0
- package/dist/src/tools/ast-edit/edit-calculator.js +249 -0
- package/dist/src/tools/ast-edit/edit-calculator.js.map +1 -0
- package/dist/src/tools/ast-edit/edit-helpers.d.ts +22 -0
- package/dist/src/tools/ast-edit/edit-helpers.js +36 -0
- package/dist/src/tools/ast-edit/edit-helpers.js.map +1 -0
- package/dist/src/tools/ast-edit/language-analysis.d.ts +19 -0
- package/dist/src/tools/ast-edit/language-analysis.js +123 -0
- package/dist/src/tools/ast-edit/language-analysis.js.map +1 -0
- package/dist/src/tools/ast-edit/local-context-analyzer.d.ts +84 -0
- package/dist/src/tools/ast-edit/local-context-analyzer.js +267 -0
- package/dist/src/tools/ast-edit/local-context-analyzer.js.map +1 -0
- package/dist/src/tools/ast-edit/repository-context-provider.d.ts +22 -0
- package/dist/src/tools/ast-edit/repository-context-provider.js +139 -0
- package/dist/src/tools/ast-edit/repository-context-provider.js.map +1 -0
- package/dist/src/tools/ast-edit/types.d.ts +155 -0
- package/dist/src/tools/ast-edit/types.js +7 -0
- package/dist/src/tools/ast-edit/types.js.map +1 -0
- package/dist/src/tools/ast-edit/workspace-context-provider.d.ts +22 -0
- package/dist/src/tools/ast-edit/workspace-context-provider.js +39 -0
- package/dist/src/tools/ast-edit/workspace-context-provider.js.map +1 -0
- package/dist/src/tools/ast-edit.d.ts +43 -0
- package/dist/src/tools/ast-edit.js +183 -0
- package/dist/src/tools/ast-edit.js.map +1 -0
- package/dist/src/tools/ast-grep.d.ts +22 -0
- package/dist/src/tools/ast-grep.js +291 -0
- package/dist/src/tools/ast-grep.js.map +1 -0
- package/dist/src/tools/check-async-tasks.d.ts +46 -0
- package/dist/src/tools/check-async-tasks.js +241 -0
- package/dist/src/tools/check-async-tasks.js.map +1 -0
- package/dist/src/tools/codesearch.d.ts +25 -0
- package/dist/src/tools/codesearch.js +153 -0
- package/dist/src/tools/codesearch.js.map +1 -0
- package/dist/src/tools/delete_line_range.d.ts +41 -0
- package/dist/src/tools/delete_line_range.js +238 -0
- package/dist/src/tools/delete_line_range.js.map +1 -0
- package/dist/src/tools/direct-web-fetch.d.ts +22 -0
- package/dist/src/tools/direct-web-fetch.js +215 -0
- package/dist/src/tools/direct-web-fetch.js.map +1 -0
- package/dist/src/tools/edit-utils.d.ts +53 -0
- package/dist/src/tools/edit-utils.js +250 -0
- package/dist/src/tools/edit-utils.js.map +1 -0
- package/dist/src/tools/edit.d.ts +70 -0
- package/dist/src/tools/edit.js +816 -0
- package/dist/src/tools/edit.js.map +1 -0
- package/dist/src/tools/exa-web-search.d.ts +27 -0
- package/dist/src/tools/exa-web-search.js +153 -0
- package/dist/src/tools/exa-web-search.js.map +1 -0
- package/dist/src/tools/glob.d.ts +55 -0
- package/dist/src/tools/glob.js +284 -0
- package/dist/src/tools/glob.js.map +1 -0
- package/dist/src/tools/google-web-fetch.d.ts +34 -0
- package/dist/src/tools/google-web-fetch.js +417 -0
- package/dist/src/tools/google-web-fetch.js.map +1 -0
- package/dist/src/tools/google-web-search-invocation.d.ts +53 -0
- package/dist/src/tools/google-web-search-invocation.js +180 -0
- package/dist/src/tools/google-web-search-invocation.js.map +1 -0
- package/dist/src/tools/google-web-search.d.ts +16 -0
- package/dist/src/tools/google-web-search.js +34 -0
- package/dist/src/tools/google-web-search.js.map +1 -0
- package/dist/src/tools/grep.d.ts +56 -0
- package/dist/src/tools/grep.js +883 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/insert_at_line.d.ts +41 -0
- package/dist/src/tools/insert_at_line.js +287 -0
- package/dist/src/tools/insert_at_line.js.map +1 -0
- package/dist/src/tools/list-subagents.d.ts +31 -0
- package/dist/src/tools/list-subagents.js +122 -0
- package/dist/src/tools/list-subagents.js.map +1 -0
- package/dist/src/tools/ls.d.ts +71 -0
- package/dist/src/tools/ls.js +238 -0
- package/dist/src/tools/ls.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +66 -0
- package/dist/src/tools/memoryTool.js +435 -0
- package/dist/src/tools/memoryTool.js.map +1 -0
- package/dist/src/tools/modifiable-tool.d.ts +37 -0
- package/dist/src/tools/modifiable-tool.js +120 -0
- package/dist/src/tools/modifiable-tool.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +49 -0
- package/dist/src/tools/read-file.js +279 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/read-many-files.d.ts +60 -0
- package/dist/src/tools/read-many-files.js +529 -0
- package/dist/src/tools/read-many-files.js.map +1 -0
- package/dist/src/tools/read_line_range.d.ts +47 -0
- package/dist/src/tools/read_line_range.js +248 -0
- package/dist/src/tools/read_line_range.js.map +1 -0
- package/dist/src/tools/ripGrep.d.ts +41 -0
- package/dist/src/tools/ripGrep.js +395 -0
- package/dist/src/tools/ripGrep.js.map +1 -0
- package/dist/src/tools/shell.d.ts +60 -0
- package/dist/src/tools/shell.js +735 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/structural-analysis.d.ts +27 -0
- package/dist/src/tools/structural-analysis.js +1089 -0
- package/dist/src/tools/structural-analysis.js.map +1 -0
- package/dist/src/tools/stubs.d.ts +10 -0
- package/dist/src/tools/stubs.js +6 -0
- package/dist/src/tools/stubs.js.map +1 -0
- package/dist/src/tools/task.d.ts +41 -0
- package/dist/src/tools/task.js +195 -0
- package/dist/src/tools/task.js.map +1 -0
- package/dist/src/tools/todo-events.d.ts +22 -0
- package/dist/src/tools/todo-events.js +24 -0
- package/dist/src/tools/todo-events.js.map +1 -0
- package/dist/src/tools/todo-pause.d.ts +29 -0
- package/dist/src/tools/todo-pause.js +172 -0
- package/dist/src/tools/todo-pause.js.map +1 -0
- package/dist/src/tools/todo-read.d.ts +18 -0
- package/dist/src/tools/todo-read.js +98 -0
- package/dist/src/tools/todo-read.js.map +1 -0
- package/dist/src/tools/todo-store.d.ts +35 -0
- package/dist/src/tools/todo-store.js +124 -0
- package/dist/src/tools/todo-store.js.map +1 -0
- package/dist/src/tools/todo-write.d.ts +29 -0
- package/dist/src/tools/todo-write.js +366 -0
- package/dist/src/tools/todo-write.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +156 -0
- package/dist/src/tools/tool-registry.js +623 -0
- package/dist/src/tools/tool-registry.js.map +1 -0
- package/dist/src/tools/tools.d.ts +403 -0
- package/dist/src/tools/tools.js +519 -0
- package/dist/src/tools/tools.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +45 -0
- package/dist/src/tools/write-file.js +320 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/types/index.d.ts +17 -0
- package/dist/src/types/index.js +9 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/provider-content-types.d.ts +56 -0
- package/dist/src/types/provider-content-types.js +6 -0
- package/dist/src/types/provider-content-types.js.map +1 -0
- package/dist/src/types/todo-schemas.d.ts +263 -0
- package/dist/src/types/todo-schemas.js +32 -0
- package/dist/src/types/todo-schemas.js.map +1 -0
- package/dist/src/types/tool-confirmation-types.d.ts +34 -0
- package/dist/src/types/tool-confirmation-types.js +29 -0
- package/dist/src/types/tool-confirmation-types.js.map +1 -0
- package/dist/src/types/tool-context.d.ts +31 -0
- package/dist/src/types/tool-context.js +6 -0
- package/dist/src/types/tool-context.js.map +1 -0
- package/dist/src/types/tool-error.d.ts +69 -0
- package/dist/src/types/tool-error.js +94 -0
- package/dist/src/types/tool-error.js.map +1 -0
- package/dist/src/types/tool-names.d.ts +57 -0
- package/dist/src/types/tool-names.js +64 -0
- package/dist/src/types/tool-names.js.map +1 -0
- package/dist/src/utils/EmojiFilter.d.ts +134 -0
- package/dist/src/utils/EmojiFilter.js +370 -0
- package/dist/src/utils/EmojiFilter.js.map +1 -0
- package/dist/src/utils/ast-grep-utils.d.ts +42 -0
- package/dist/src/utils/ast-grep-utils.js +140 -0
- package/dist/src/utils/ast-grep-utils.js.map +1 -0
- package/dist/src/utils/debugLogger.d.ts +11 -0
- package/dist/src/utils/debugLogger.js +16 -0
- package/dist/src/utils/debugLogger.js.map +1 -0
- package/dist/src/utils/diffOptions.d.ts +14 -0
- package/dist/src/utils/diffOptions.js +46 -0
- package/dist/src/utils/diffOptions.js.map +1 -0
- package/dist/src/utils/editor.d.ts +39 -0
- package/dist/src/utils/editor.js +212 -0
- package/dist/src/utils/editor.js.map +1 -0
- package/dist/src/utils/ensure-dirs.d.ts +10 -0
- package/dist/src/utils/ensure-dirs.js +16 -0
- package/dist/src/utils/ensure-dirs.js.map +1 -0
- package/dist/src/utils/errors.d.ts +59 -0
- package/dist/src/utils/errors.js +178 -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 +74 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/fileUtils.d.ts +32 -0
- package/dist/src/utils/fileUtils.js +363 -0
- package/dist/src/utils/fileUtils.js.map +1 -0
- package/dist/src/utils/fuzzy-replacer.d.ts +61 -0
- package/dist/src/utils/fuzzy-replacer.js +492 -0
- package/dist/src/utils/fuzzy-replacer.js.map +1 -0
- package/dist/src/utils/gitLineChanges.d.ts +12 -0
- package/dist/src/utils/gitLineChanges.js +171 -0
- package/dist/src/utils/gitLineChanges.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +6 -0
- package/dist/src/utils/gitUtils.js +31 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/lsp-diagnostics-helper.d.ts +27 -0
- package/dist/src/utils/lsp-diagnostics-helper.js +62 -0
- package/dist/src/utils/lsp-diagnostics-helper.js.map +1 -0
- package/dist/src/utils/mediaUtils.d.ts +38 -0
- package/dist/src/utils/mediaUtils.js +22 -0
- package/dist/src/utils/mediaUtils.js.map +1 -0
- package/dist/src/utils/pathValidation.d.ts +7 -0
- package/dist/src/utils/pathValidation.js +39 -0
- package/dist/src/utils/pathValidation.js.map +1 -0
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +158 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/resolveTextSearchTarget.d.ts +17 -0
- package/dist/src/utils/resolveTextSearchTarget.js +45 -0
- package/dist/src/utils/resolveTextSearchTarget.js.map +1 -0
- package/dist/src/utils/retry.d.ts +17 -0
- package/dist/src/utils/retry.js +185 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/ripgrepPathResolver.d.ts +23 -0
- package/dist/src/utils/ripgrepPathResolver.js +179 -0
- package/dist/src/utils/ripgrepPathResolver.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.d.ts +9 -0
- package/dist/src/utils/safeJsonStringify.js +21 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/schemaValidator.d.ts +13 -0
- package/dist/src/utils/schemaValidator.js +275 -0
- package/dist/src/utils/schemaValidator.js.map +1 -0
- package/dist/src/utils/terminalSerializer.d.ts +33 -0
- package/dist/src/utils/terminalSerializer.js +6 -0
- package/dist/src/utils/terminalSerializer.js.map +1 -0
- package/dist/src/utils/todoContextTracker.d.ts +12 -0
- package/dist/src/utils/todoContextTracker.js +28 -0
- package/dist/src/utils/todoContextTracker.js.map +1 -0
- package/dist/src/utils/todoFormatter.d.ts +24 -0
- package/dist/src/utils/todoFormatter.js +157 -0
- package/dist/src/utils/todoFormatter.js.map +1 -0
- package/dist/src/utils/todoReminderService.d.ts +22 -0
- package/dist/src/utils/todoReminderService.js +43 -0
- package/dist/src/utils/todoReminderService.js.map +1 -0
- package/dist/src/utils/tool-key-storage-facade.d.ts +32 -0
- package/dist/src/utils/tool-key-storage-facade.js +56 -0
- package/dist/src/utils/tool-key-storage-facade.js.map +1 -0
- package/dist/src/utils/tool-key-storage-types.d.ts +56 -0
- package/dist/src/utils/tool-key-storage-types.js +56 -0
- package/dist/src/utils/tool-key-storage-types.js.map +1 -0
- package/dist/src/utils/toolOutputLimiter.d.ts +29 -0
- package/dist/src/utils/toolOutputLimiter.js +107 -0
- package/dist/src/utils/toolOutputLimiter.js.map +1 -0
- package/dist/src/utils/unicodeUtils.d.ts +55 -0
- package/dist/src/utils/unicodeUtils.js +129 -0
- package/dist/src/utils/unicodeUtils.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import * as Diff from 'diff';
|
|
9
|
+
import { makeRelative, shortenPath } from '../utils/paths.js';
|
|
10
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, ToolConfirmationOutcome, } from './tools.js';
|
|
11
|
+
import { ToolErrorType } from '../types/tool-error.js';
|
|
12
|
+
import { getSpecificMimeType } from '../utils/fileUtils.js';
|
|
13
|
+
import { DEFAULT_CREATE_PATCH_OPTIONS } from '../utils/diffOptions.js';
|
|
14
|
+
import { collectLspDiagnosticsBlock } from '../utils/lsp-diagnostics-helper.js';
|
|
15
|
+
import { validatePathWithinWorkspace } from '../utils/pathValidation.js';
|
|
16
|
+
class DeleteLineRangeToolInvocation extends BaseToolInvocation {
|
|
17
|
+
host;
|
|
18
|
+
ideService;
|
|
19
|
+
lspService;
|
|
20
|
+
constructor(host, ideService, lspService, params, messageBus) {
|
|
21
|
+
super(params, messageBus);
|
|
22
|
+
this.host = host;
|
|
23
|
+
this.ideService = ideService;
|
|
24
|
+
this.lspService = lspService;
|
|
25
|
+
}
|
|
26
|
+
getFilePath() {
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty string paths are invalid, fall back to file_path
|
|
28
|
+
return this.params.absolute_path || this.params.file_path || '';
|
|
29
|
+
}
|
|
30
|
+
getDescription() {
|
|
31
|
+
const relativePath = makeRelative(this.getFilePath(), this.host.getTargetDir());
|
|
32
|
+
return `Delete lines ${this.params.start_line}-${this.params.end_line} from ${shortenPath(relativePath)}`;
|
|
33
|
+
}
|
|
34
|
+
toolLocations() {
|
|
35
|
+
return [{ path: this.getFilePath(), line: this.params.start_line }];
|
|
36
|
+
}
|
|
37
|
+
async shouldConfirmExecute(_abortSignal) {
|
|
38
|
+
const approvalMode = this.host.getApprovalMode();
|
|
39
|
+
if (approvalMode === 'auto' || approvalMode === 'yolo') {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const filePath = this.getFilePath();
|
|
43
|
+
let originalContent;
|
|
44
|
+
try {
|
|
45
|
+
originalContent = await fs.readFile(filePath, 'utf8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const lines = originalContent.split('\n');
|
|
51
|
+
const totalLines = lines.length;
|
|
52
|
+
if (this.params.start_line > totalLines) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const startIndex = this.params.start_line - 1;
|
|
56
|
+
const count = this.params.end_line - this.params.start_line + 1;
|
|
57
|
+
const newLines = [...lines];
|
|
58
|
+
newLines.splice(startIndex, count);
|
|
59
|
+
const newContent = newLines.join('\n');
|
|
60
|
+
const relativePath = makeRelative(filePath, this.host.getTargetDir());
|
|
61
|
+
const fileName = path.basename(filePath);
|
|
62
|
+
const fileDiff = Diff.createPatch(fileName, originalContent, newContent, 'Current', 'Proposed', DEFAULT_CREATE_PATCH_OPTIONS);
|
|
63
|
+
const ideConfirmation = this.ideService?.getConnectionStatus() === 'connected'
|
|
64
|
+
? this.ideService.applyDiff({ filePath, diff: newContent })
|
|
65
|
+
: undefined;
|
|
66
|
+
const confirmationDetails = {
|
|
67
|
+
type: 'edit',
|
|
68
|
+
title: `Confirm Delete: ${shortenPath(relativePath)} (lines ${this.params.start_line}-${this.params.end_line})`,
|
|
69
|
+
fileName,
|
|
70
|
+
filePath,
|
|
71
|
+
fileDiff,
|
|
72
|
+
originalContent,
|
|
73
|
+
newContent,
|
|
74
|
+
onConfirm: async (outcome) => {
|
|
75
|
+
if (outcome === ToolConfirmationOutcome.ProceedAlways) {
|
|
76
|
+
this.host.setApprovalMode('auto');
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
ideConfirmation,
|
|
80
|
+
};
|
|
81
|
+
return confirmationDetails;
|
|
82
|
+
}
|
|
83
|
+
async execute() {
|
|
84
|
+
const filePath = this.getFilePath();
|
|
85
|
+
let content;
|
|
86
|
+
try {
|
|
87
|
+
content = await fs.readFile(filePath, 'utf8');
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
91
|
+
return {
|
|
92
|
+
llmContent: `Error reading file: ${message}`,
|
|
93
|
+
returnDisplay: `Error reading file: ${message}`,
|
|
94
|
+
error: {
|
|
95
|
+
message,
|
|
96
|
+
type: ToolErrorType.FILE_NOT_FOUND,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const lines = content.split('\n');
|
|
101
|
+
const totalLines = lines.length;
|
|
102
|
+
if (this.params.start_line > totalLines) {
|
|
103
|
+
return {
|
|
104
|
+
llmContent: `Cannot delete lines: start_line ${this.params.start_line} is beyond the total number of lines (${totalLines})`,
|
|
105
|
+
returnDisplay: `Cannot delete lines: start_line ${this.params.start_line} is beyond the total number of lines (${totalLines})`,
|
|
106
|
+
error: {
|
|
107
|
+
message: `start_line ${this.params.start_line} exceeds file length (${totalLines})`,
|
|
108
|
+
type: ToolErrorType.INVALID_TOOL_PARAMS,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const startIndex = this.params.start_line - 1;
|
|
113
|
+
const count = this.params.end_line - this.params.start_line + 1;
|
|
114
|
+
const deletedContent = lines
|
|
115
|
+
.slice(startIndex, startIndex + count)
|
|
116
|
+
.join('\n');
|
|
117
|
+
lines.splice(startIndex, count);
|
|
118
|
+
const newContent = lines.join('\n');
|
|
119
|
+
try {
|
|
120
|
+
await fs.writeFile(filePath, newContent, 'utf8');
|
|
121
|
+
this.recordMetrics(filePath, count);
|
|
122
|
+
const llmSuccessMessageParts = [
|
|
123
|
+
`Successfully deleted lines ${this.params.start_line}-${this.params.end_line} from ${filePath}`,
|
|
124
|
+
deletedContent,
|
|
125
|
+
];
|
|
126
|
+
try {
|
|
127
|
+
const diagBlock = this.lspService === undefined
|
|
128
|
+
? null
|
|
129
|
+
: await collectLspDiagnosticsBlock(this.lspService, this.host, filePath);
|
|
130
|
+
if (diagBlock) {
|
|
131
|
+
llmSuccessMessageParts.push(diagBlock);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// LSP failure must never fail the edit (REQ-GRACE-050, REQ-GRACE-055)
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
llmContent: llmSuccessMessageParts.join('\n\n'),
|
|
139
|
+
returnDisplay: `Deleted ${count} lines (${this.params.start_line}-${this.params.end_line})`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
144
|
+
return {
|
|
145
|
+
llmContent: `Error writing file: ${message}`,
|
|
146
|
+
returnDisplay: `Error writing file: ${message}`,
|
|
147
|
+
error: {
|
|
148
|
+
message,
|
|
149
|
+
type: ToolErrorType.FILE_WRITE_FAILURE,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
recordMetrics(filePath, linesDeleted) {
|
|
155
|
+
const mimetype = getSpecificMimeType(filePath);
|
|
156
|
+
const extension = path.extname(filePath);
|
|
157
|
+
void linesDeleted;
|
|
158
|
+
void mimetype;
|
|
159
|
+
void extension;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Implementation of the DeleteLineRange tool logic
|
|
164
|
+
*/
|
|
165
|
+
export class DeleteLineRangeTool extends BaseDeclarativeTool {
|
|
166
|
+
host;
|
|
167
|
+
ideService;
|
|
168
|
+
lspService;
|
|
169
|
+
static Name = 'delete_line_range';
|
|
170
|
+
constructor(host, ideService, lspService) {
|
|
171
|
+
super(DeleteLineRangeTool.Name, 'DeleteLineRange', `Deletes a specific range of lines from a file. This is the preferred way to delete large blocks, as it avoids using a massive, brittle 'old_string' in the 'replace' tool. Always read the file or use 'get_file_outline' first to get the exact line numbers before deleting.`, Kind.Edit, {
|
|
172
|
+
properties: {
|
|
173
|
+
absolute_path: {
|
|
174
|
+
description: "The absolute path to the file to modify. Must start with '/' and be within the workspace.",
|
|
175
|
+
type: 'string',
|
|
176
|
+
},
|
|
177
|
+
file_path: {
|
|
178
|
+
description: 'Alternative parameter name for absolute_path (for backward compatibility). The absolute path to the file to modify.',
|
|
179
|
+
type: 'string',
|
|
180
|
+
},
|
|
181
|
+
start_line: {
|
|
182
|
+
description: 'The 1-based line number to start deleting from (inclusive).',
|
|
183
|
+
type: 'number',
|
|
184
|
+
minimum: 1,
|
|
185
|
+
},
|
|
186
|
+
end_line: {
|
|
187
|
+
description: 'The 1-based line number to end deleting at (inclusive). Must be >= start_line.',
|
|
188
|
+
type: 'number',
|
|
189
|
+
minimum: 1,
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
required: ['start_line', 'end_line'],
|
|
193
|
+
type: 'object',
|
|
194
|
+
});
|
|
195
|
+
this.host = host;
|
|
196
|
+
this.ideService = ideService;
|
|
197
|
+
this.lspService = lspService;
|
|
198
|
+
}
|
|
199
|
+
validateToolParamValues(params) {
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty string paths are invalid
|
|
201
|
+
const filePath = params.absolute_path || params.file_path || '';
|
|
202
|
+
if (filePath.trim() === '') {
|
|
203
|
+
return "Either 'absolute_path' or 'file_path' parameter must be provided and non-empty.";
|
|
204
|
+
}
|
|
205
|
+
if (!path.isAbsolute(filePath)) {
|
|
206
|
+
return `File path must be absolute: ${filePath}`;
|
|
207
|
+
}
|
|
208
|
+
const pathError = validatePathWithinWorkspace(this.host.getWorkspaceRoots(), filePath);
|
|
209
|
+
if (pathError) {
|
|
210
|
+
return pathError;
|
|
211
|
+
}
|
|
212
|
+
if (params.start_line < 1) {
|
|
213
|
+
return 'start_line must be a positive integer (>= 1)';
|
|
214
|
+
}
|
|
215
|
+
if (params.end_line < 1) {
|
|
216
|
+
return 'end_line must be a positive integer (>= 1)';
|
|
217
|
+
}
|
|
218
|
+
if (params.end_line < params.start_line) {
|
|
219
|
+
return 'end_line must be greater than or equal to start_line';
|
|
220
|
+
}
|
|
221
|
+
const fileService = this.host.getFileService();
|
|
222
|
+
if (fileService.shouldLlxprtIgnoreFile(filePath)) {
|
|
223
|
+
return `File path '${filePath}' is ignored by .llxprtignore pattern(s).`;
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
createInvocation(params, messageBus) {
|
|
228
|
+
const normalizedParams = { ...params };
|
|
229
|
+
if (!normalizedParams.absolute_path && normalizedParams.file_path) {
|
|
230
|
+
normalizedParams.absolute_path = normalizedParams.file_path;
|
|
231
|
+
}
|
|
232
|
+
return new DeleteLineRangeToolInvocation(this.host, this.ideService, this.lspService, normalizedParams, messageBus);
|
|
233
|
+
}
|
|
234
|
+
async execute(params, signal = new AbortController().signal) {
|
|
235
|
+
return this.build(params).execute(signal);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=delete_line_range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete_line_range.js","sourceRoot":"","sources":["../../../src/tools/delete_line_range.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Portions of this code are derived from opencode (https://github.com/sst/opencode)
|
|
7
|
+
* Copyright (c) 2025 opencode
|
|
8
|
+
* Licensed under the MIT License.
|
|
9
|
+
*/
|
|
10
|
+
import { BaseDeclarativeTool, type ToolInvocation, type ToolResult } from './tools.js';
|
|
11
|
+
import type { IToolHost, IToolMessageBus } from '../interfaces/index.js';
|
|
12
|
+
export interface DirectWebFetchToolParams {
|
|
13
|
+
url: string;
|
|
14
|
+
format: 'text' | 'markdown' | 'html';
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class DirectWebFetchTool extends BaseDeclarativeTool<DirectWebFetchToolParams, ToolResult> {
|
|
18
|
+
private readonly host;
|
|
19
|
+
static readonly Name = "direct_web_fetch";
|
|
20
|
+
constructor(host: IToolHost);
|
|
21
|
+
protected createInvocation(params: DirectWebFetchToolParams, messageBus: IToolMessageBus): ToolInvocation<DirectWebFetchToolParams, ToolResult>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Portions of this code are derived from opencode (https://github.com/sst/opencode)
|
|
7
|
+
* Copyright (c) 2025 opencode
|
|
8
|
+
* Licensed under the MIT License.
|
|
9
|
+
*/
|
|
10
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
|
|
11
|
+
import { DIRECT_WEB_FETCH_TOOL } from '../types/tool-names.js';
|
|
12
|
+
import { ToolErrorType } from '../types/tool-error.js';
|
|
13
|
+
import fetch from 'node-fetch';
|
|
14
|
+
import TurndownService from 'turndown';
|
|
15
|
+
import * as cheerio from 'cheerio';
|
|
16
|
+
import { retryWithBackoff } from '../utils/retry.js';
|
|
17
|
+
import { ensureJsonSafe } from '../utils/unicodeUtils.js';
|
|
18
|
+
const MAX_RESPONSE_SIZE = 5 * 1024 * 1024; // 5MB
|
|
19
|
+
const DEFAULT_TIMEOUT = 30 * 1000; // 30 seconds
|
|
20
|
+
const MAX_TIMEOUT = 120 * 1000; // 2 minutes
|
|
21
|
+
const ACCEPT_HEADERS = {
|
|
22
|
+
markdown: 'text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1',
|
|
23
|
+
text: 'text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1',
|
|
24
|
+
html: 'text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1',
|
|
25
|
+
};
|
|
26
|
+
export class DirectWebFetchTool extends BaseDeclarativeTool {
|
|
27
|
+
host;
|
|
28
|
+
static Name = DIRECT_WEB_FETCH_TOOL;
|
|
29
|
+
constructor(host) {
|
|
30
|
+
super(DirectWebFetchTool.Name, 'DirectWebFetch', 'Fetches content from a specified URL and converts it to the requested format (text, markdown, or html).', Kind.Search, {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
url: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'The URL to fetch content from',
|
|
36
|
+
},
|
|
37
|
+
format: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
enum: ['text', 'markdown', 'html'],
|
|
40
|
+
description: 'The format to return the content in (text, markdown, or html)',
|
|
41
|
+
},
|
|
42
|
+
timeout: {
|
|
43
|
+
type: 'number',
|
|
44
|
+
description: 'Optional timeout in seconds (max 120)',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['url', 'format'],
|
|
48
|
+
});
|
|
49
|
+
this.host = host;
|
|
50
|
+
}
|
|
51
|
+
createInvocation(params, messageBus) {
|
|
52
|
+
return new DirectWebFetchToolInvocation(this.host, params, messageBus);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
class DirectWebFetchToolInvocation extends BaseToolInvocation {
|
|
56
|
+
constructor(_host, params, messageBus) {
|
|
57
|
+
super(params, messageBus);
|
|
58
|
+
}
|
|
59
|
+
getDescription() {
|
|
60
|
+
return `Fetch content from ${this.params.url}`;
|
|
61
|
+
}
|
|
62
|
+
async execute(signal, _updateOutput) {
|
|
63
|
+
const protocolError = this.validateUrlProtocol();
|
|
64
|
+
if (protocolError)
|
|
65
|
+
return protocolError;
|
|
66
|
+
const controller = new AbortController();
|
|
67
|
+
const timeoutId = setTimeout(() => controller.abort(), this.getTimeoutMs());
|
|
68
|
+
const onAbort = () => controller.abort();
|
|
69
|
+
signal.addEventListener('abort', onAbort);
|
|
70
|
+
try {
|
|
71
|
+
if (signal.aborted)
|
|
72
|
+
return this.createAbortResult();
|
|
73
|
+
const response = await this.fetchResponse(controller.signal);
|
|
74
|
+
const arrayBuffer = await this.readBoundedResponse(response);
|
|
75
|
+
const content = new TextDecoder().decode(arrayBuffer);
|
|
76
|
+
const output = this.convertContent(content,
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Preserve prior empty-string fallback for missing/blank content-type.
|
|
78
|
+
response.headers.get('content-type') || '');
|
|
79
|
+
return {
|
|
80
|
+
llmContent: ensureJsonSafe(output),
|
|
81
|
+
returnDisplay: `Fetched ${this.params.url} as ${this.params.format}`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return this.createFetchErrorResult(error);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
clearTimeout(timeoutId);
|
|
89
|
+
signal.removeEventListener('abort', onAbort);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
validateUrlProtocol() {
|
|
93
|
+
if (this.params.url.startsWith('http://') ||
|
|
94
|
+
this.params.url.startsWith('https://')) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
llmContent: 'URL must start with http:// or https://',
|
|
99
|
+
returnDisplay: 'Invalid URL',
|
|
100
|
+
error: {
|
|
101
|
+
message: 'Invalid URL protocol',
|
|
102
|
+
type: ToolErrorType.INVALID_ARGUMENT,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
getTimeoutMs() {
|
|
107
|
+
return Math.min((this.params.timeout ?? DEFAULT_TIMEOUT / 1000) * 1000, MAX_TIMEOUT);
|
|
108
|
+
}
|
|
109
|
+
createAbortResult() {
|
|
110
|
+
return {
|
|
111
|
+
llmContent: 'Request was aborted before it could start',
|
|
112
|
+
returnDisplay: 'Request aborted',
|
|
113
|
+
error: {
|
|
114
|
+
message: 'Request was aborted before it could start',
|
|
115
|
+
type: ToolErrorType.FETCH_ERROR,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async fetchResponse(signal) {
|
|
120
|
+
return retryWithBackoff(async () => {
|
|
121
|
+
const resp = await fetch(this.params.url, {
|
|
122
|
+
signal,
|
|
123
|
+
headers: {
|
|
124
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
125
|
+
Accept: ACCEPT_HEADERS[this.params.format],
|
|
126
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
if (!resp.ok) {
|
|
130
|
+
const error = new Error(`Request failed with status code: ${resp.status}`);
|
|
131
|
+
error.status = resp.status;
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
return resp;
|
|
135
|
+
}, {
|
|
136
|
+
maxAttempts: 3,
|
|
137
|
+
initialDelayMs: 500,
|
|
138
|
+
retryFetchErrors: true,
|
|
139
|
+
signal,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async readBoundedResponse(response) {
|
|
143
|
+
const contentLength = response.headers.get('content-length');
|
|
144
|
+
if (contentLength && parseInt(contentLength, 10) > MAX_RESPONSE_SIZE) {
|
|
145
|
+
throw new Error('Response too large (exceeds 5MB limit)');
|
|
146
|
+
}
|
|
147
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
148
|
+
if (arrayBuffer.byteLength > MAX_RESPONSE_SIZE) {
|
|
149
|
+
throw new Error('Response too large (exceeds 5MB limit)');
|
|
150
|
+
}
|
|
151
|
+
return arrayBuffer;
|
|
152
|
+
}
|
|
153
|
+
convertContent(content, contentType) {
|
|
154
|
+
if (this.params.format === 'markdown' &&
|
|
155
|
+
contentType.includes('text/html')) {
|
|
156
|
+
return this.convertHTMLToMarkdown(content);
|
|
157
|
+
}
|
|
158
|
+
if (this.params.format === 'text' && contentType.includes('text/html')) {
|
|
159
|
+
return this.extractTextFromHTML(content);
|
|
160
|
+
}
|
|
161
|
+
return content;
|
|
162
|
+
}
|
|
163
|
+
createFetchErrorResult(error) {
|
|
164
|
+
const errorMessage = this.formatErrorMessage(error);
|
|
165
|
+
return {
|
|
166
|
+
llmContent: `Error fetching URL: ${errorMessage}`,
|
|
167
|
+
returnDisplay: `Error: ${errorMessage}`,
|
|
168
|
+
error: {
|
|
169
|
+
message: errorMessage,
|
|
170
|
+
type: ToolErrorType.FETCH_ERROR,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
formatErrorMessage(error) {
|
|
175
|
+
if (!(error instanceof Error))
|
|
176
|
+
return String(error);
|
|
177
|
+
let errorMessage = error.message;
|
|
178
|
+
const err = error;
|
|
179
|
+
if (this.hasTruthyCause(err)) {
|
|
180
|
+
const causeMessage = err.cause instanceof Error ? err.cause.message : String(err.cause);
|
|
181
|
+
errorMessage += `: ${causeMessage}`;
|
|
182
|
+
}
|
|
183
|
+
return errorMessage;
|
|
184
|
+
}
|
|
185
|
+
hasTruthyCause(error) {
|
|
186
|
+
if (!('cause' in error))
|
|
187
|
+
return false;
|
|
188
|
+
return this.isTruthyCause(error.cause);
|
|
189
|
+
}
|
|
190
|
+
isTruthyCause(cause) {
|
|
191
|
+
if (cause === undefined || cause === null)
|
|
192
|
+
return false;
|
|
193
|
+
if (cause === false || cause === 0 || cause === '')
|
|
194
|
+
return false;
|
|
195
|
+
return !Number.isNaN(cause);
|
|
196
|
+
}
|
|
197
|
+
extractTextFromHTML(html) {
|
|
198
|
+
const $ = cheerio.load(html);
|
|
199
|
+
// Remove scripts, styles, etc.
|
|
200
|
+
$('script, style, noscript, iframe, object, embed').remove();
|
|
201
|
+
return $.text().trim();
|
|
202
|
+
}
|
|
203
|
+
convertHTMLToMarkdown(html) {
|
|
204
|
+
const turndownService = new TurndownService({
|
|
205
|
+
headingStyle: 'atx',
|
|
206
|
+
hr: '---',
|
|
207
|
+
bulletListMarker: '-',
|
|
208
|
+
codeBlockStyle: 'fenced',
|
|
209
|
+
emDelimiter: '*',
|
|
210
|
+
});
|
|
211
|
+
turndownService.remove(['script', 'style', 'meta', 'link']);
|
|
212
|
+
return turndownService.turndown(html);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=direct-web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-web-fetch.js","sourceRoot":"","sources":["../../../src/tools/direct-web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { IToolHost } from '../interfaces/index.js';
|
|
7
|
+
import { EmojiFilter } from '../utils/EmojiFilter.js';
|
|
8
|
+
import { ToolErrorType } from '../types/tool-error.js';
|
|
9
|
+
import type { EditToolParams } from './edit.js';
|
|
10
|
+
/**
|
|
11
|
+
* Counts occurrences of oldString that start within the line range
|
|
12
|
+
* [replaceLine, replaceLine+1) — i.e., occurrences whose start position
|
|
13
|
+
* falls on the specified 1-based line number.
|
|
14
|
+
* Returns 0 if replaceLine is out of range.
|
|
15
|
+
*/
|
|
16
|
+
export declare function countLineGuardedOccurrences(currentContent: string, oldString: string, replaceLine: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Applies replacement of oldString with newString, but only for occurrences
|
|
19
|
+
* whose start position falls within the line range [replaceLine, replaceLine+1).
|
|
20
|
+
* Replaces up to expectedReplacements eligible occurrences.
|
|
21
|
+
* Returns the resulting content string.
|
|
22
|
+
*
|
|
23
|
+
* Deterministic approach: collect all eligible match offsets from the original
|
|
24
|
+
* content first, then build the output string from original content slices.
|
|
25
|
+
* This avoids the stale-bounds bug that arises when searching a mutated result
|
|
26
|
+
* string with offsets computed from the original content.
|
|
27
|
+
*/
|
|
28
|
+
export declare function applyLineGuardedReplacement(currentContent: string, oldString: string, newString: string, expectedReplacements: number, replaceLine: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Gets emoji filter instance based on configuration
|
|
31
|
+
*/
|
|
32
|
+
export declare function getEmojiFilter(host: IToolHost): EmojiFilter;
|
|
33
|
+
/**
|
|
34
|
+
* Applies a replacement to content.
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyReplacement(currentContent: string | null, oldString: string, newString: string, isNewFile: boolean, expectedReplacements?: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Error information for edit operations.
|
|
39
|
+
*/
|
|
40
|
+
export interface EditErrorInfo {
|
|
41
|
+
display: string;
|
|
42
|
+
raw: string;
|
|
43
|
+
type: ToolErrorType;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builds the error object when zero occurrences are found.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildNoOccurrenceError(filteredParams: EditToolParams, currentContent: string | null, filePath: string): EditErrorInfo;
|
|
49
|
+
/**
|
|
50
|
+
* Validates the edit parameters after reading file content and builds the
|
|
51
|
+
* appropriate error object if any validation fails.
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateEditState(filteredParams: EditToolParams, currentContent: string | null, fileExists: boolean, filePath: string, occurrences: number, expectedReplacements: number, finalOldString: string, finalNewString: string): EditErrorInfo | undefined;
|