@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,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { isNodeError } from './errors.js';
|
|
9
|
+
import { validatePathWithinWorkspace } from './pathValidation.js';
|
|
10
|
+
export function resolveTextSearchTarget(targetDir, workspaceRoots, relativePath) {
|
|
11
|
+
if (!relativePath) {
|
|
12
|
+
return { kind: 'all-workspaces' };
|
|
13
|
+
}
|
|
14
|
+
const targetPath = path.resolve(targetDir, relativePath);
|
|
15
|
+
const pathError = validatePathWithinWorkspace(workspaceRoots, targetPath, 'Path');
|
|
16
|
+
if (pathError) {
|
|
17
|
+
throw new Error('Path validation failed: ' + pathError);
|
|
18
|
+
}
|
|
19
|
+
let stats;
|
|
20
|
+
try {
|
|
21
|
+
stats = fs.statSync(targetPath);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (isNodeError(error) && error.code === 'ENOENT') {
|
|
25
|
+
throw new Error(`Path does not exist: ${targetPath}`);
|
|
26
|
+
}
|
|
27
|
+
if (isNodeError(error) && error.code === 'EACCES') {
|
|
28
|
+
throw new Error(`Permission denied: ${targetPath}`);
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Failed to access path stats for ${targetPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
}
|
|
32
|
+
if (stats.isDirectory()) {
|
|
33
|
+
return { kind: 'directory', searchDir: targetPath };
|
|
34
|
+
}
|
|
35
|
+
if (stats.isFile()) {
|
|
36
|
+
return {
|
|
37
|
+
kind: 'file',
|
|
38
|
+
filePath: targetPath,
|
|
39
|
+
parentDir: path.dirname(targetPath),
|
|
40
|
+
basename: path.basename(targetPath),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Path is neither a file nor a directory: ${targetPath}`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=resolveTextSearchTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveTextSearchTarget.js","sourceRoot":"","sources":["../../../src/utils/resolveTextSearchTarget.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAYlE,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,cAAiC,EACjC,YAAqB;IAErB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,2BAA2B,CAC3C,cAAc,EACd,UAAU,EACV,MAAM,CACP,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mCAAmC,UAAU,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export interface RetryOptions {
|
|
7
|
+
maxAttempts: number;
|
|
8
|
+
initialDelayMs: number;
|
|
9
|
+
maxDelayMs: number;
|
|
10
|
+
shouldRetryOnError: (error: Error, retryFetchErrors?: boolean) => boolean;
|
|
11
|
+
retryFetchErrors?: boolean;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
export declare function isNetworkTransientError(error: unknown): boolean;
|
|
15
|
+
export declare function getErrorStatus(error: unknown): number | undefined;
|
|
16
|
+
export declare function isRetryableError(error: Error | unknown, retryFetchErrors?: boolean): boolean;
|
|
17
|
+
export declare function retryWithBackoff<T>(fn: () => Promise<T>, options?: Partial<RetryOptions>): Promise<T>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_RETRY_OPTIONS = {
|
|
7
|
+
maxAttempts: 5,
|
|
8
|
+
initialDelayMs: 5000,
|
|
9
|
+
maxDelayMs: 30000,
|
|
10
|
+
shouldRetryOnError: isRetryableError,
|
|
11
|
+
};
|
|
12
|
+
const TRANSIENT_ERROR_PHRASES = [
|
|
13
|
+
'connection error',
|
|
14
|
+
'connection terminated',
|
|
15
|
+
'terminated',
|
|
16
|
+
'connection reset',
|
|
17
|
+
'socket hang up',
|
|
18
|
+
'socket hung up',
|
|
19
|
+
'socket closed',
|
|
20
|
+
'socket timeout',
|
|
21
|
+
'network timeout',
|
|
22
|
+
'network error',
|
|
23
|
+
'request aborted',
|
|
24
|
+
'request timeout',
|
|
25
|
+
'stream closed',
|
|
26
|
+
'stream prematurely closed',
|
|
27
|
+
'read econnreset',
|
|
28
|
+
'write econnreset',
|
|
29
|
+
];
|
|
30
|
+
const TRANSIENT_ERROR_REGEXES = [
|
|
31
|
+
/econn(reset|refused|aborted)/i,
|
|
32
|
+
/etimedout/i,
|
|
33
|
+
/und_err_(socket|connect|headers_timeout|body_timeout)/i,
|
|
34
|
+
/tcp connection.*(reset|closed)/i,
|
|
35
|
+
];
|
|
36
|
+
const TRANSIENT_ERROR_CODES = new Set([
|
|
37
|
+
'ECONNRESET',
|
|
38
|
+
'ECONNREFUSED',
|
|
39
|
+
'ECONNABORTED',
|
|
40
|
+
'ENETUNREACH',
|
|
41
|
+
'EHOSTUNREACH',
|
|
42
|
+
'ENOTFOUND',
|
|
43
|
+
'ETIMEDOUT',
|
|
44
|
+
'EPIPE',
|
|
45
|
+
'EAI_AGAIN',
|
|
46
|
+
'UND_ERR_SOCKET',
|
|
47
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
48
|
+
'UND_ERR_HEADERS_TIMEOUT',
|
|
49
|
+
'UND_ERR_BODY_TIMEOUT',
|
|
50
|
+
]);
|
|
51
|
+
function createAbortError() {
|
|
52
|
+
const error = new Error('The operation was aborted');
|
|
53
|
+
error.name = 'AbortError';
|
|
54
|
+
return error;
|
|
55
|
+
}
|
|
56
|
+
async function delay(ms, signal) {
|
|
57
|
+
if (signal?.aborted === true) {
|
|
58
|
+
throw createAbortError();
|
|
59
|
+
}
|
|
60
|
+
await new Promise((resolve, reject) => {
|
|
61
|
+
const timeout = setTimeout(resolve, ms);
|
|
62
|
+
const onAbort = () => {
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
reject(createAbortError());
|
|
65
|
+
};
|
|
66
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function collectErrorDetails(error) {
|
|
70
|
+
const messages = [];
|
|
71
|
+
const codes = [];
|
|
72
|
+
const stack = [error];
|
|
73
|
+
const visited = new Set();
|
|
74
|
+
while (stack.length > 0) {
|
|
75
|
+
const current = stack.pop();
|
|
76
|
+
if (current === null || current === undefined) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (typeof current === 'string') {
|
|
80
|
+
messages.push(current);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (typeof current !== 'object' || visited.has(current)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
visited.add(current);
|
|
87
|
+
const errorObject = current;
|
|
88
|
+
if (typeof errorObject.message === 'string') {
|
|
89
|
+
messages.push(errorObject.message);
|
|
90
|
+
}
|
|
91
|
+
if (typeof errorObject.code === 'string') {
|
|
92
|
+
codes.push(errorObject.code);
|
|
93
|
+
}
|
|
94
|
+
for (const nested of [
|
|
95
|
+
errorObject.cause,
|
|
96
|
+
errorObject.originalError,
|
|
97
|
+
errorObject.error,
|
|
98
|
+
]) {
|
|
99
|
+
if (nested !== undefined && nested !== null && nested !== current) {
|
|
100
|
+
stack.push(nested);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { messages, codes };
|
|
105
|
+
}
|
|
106
|
+
export function isNetworkTransientError(error) {
|
|
107
|
+
const { messages, codes } = collectErrorDetails(error);
|
|
108
|
+
const lowerMessages = messages.map((msg) => msg.toLowerCase());
|
|
109
|
+
if (lowerMessages.some((msg) => TRANSIENT_ERROR_PHRASES.some((phrase) => msg.includes(phrase)))) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (messages.some((msg) => TRANSIENT_ERROR_REGEXES.some((regex) => regex.test(msg)))) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return codes
|
|
116
|
+
.map((code) => code.toUpperCase())
|
|
117
|
+
.some((code) => TRANSIENT_ERROR_CODES.has(code));
|
|
118
|
+
}
|
|
119
|
+
export function getErrorStatus(error) {
|
|
120
|
+
if (typeof error === 'object' && error !== null) {
|
|
121
|
+
if ('status' in error && typeof error.status === 'number') {
|
|
122
|
+
return error.status;
|
|
123
|
+
}
|
|
124
|
+
if ('response' in error &&
|
|
125
|
+
typeof error.response === 'object' &&
|
|
126
|
+
error.response !== null) {
|
|
127
|
+
const response = error.response;
|
|
128
|
+
if (typeof response.status === 'number') {
|
|
129
|
+
return response.status;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
export function isRetryableError(error, retryFetchErrors) {
|
|
136
|
+
if (isNetworkTransientError(error)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
if (retryFetchErrors === true) {
|
|
140
|
+
const { messages } = collectErrorDetails(error);
|
|
141
|
+
if (messages.some((msg) => msg.toLowerCase().includes('fetch failed'))) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const status = getErrorStatus(error);
|
|
146
|
+
return (status === 401 ||
|
|
147
|
+
status === 403 ||
|
|
148
|
+
status === 429 ||
|
|
149
|
+
(status !== undefined && status >= 500 && status < 600));
|
|
150
|
+
}
|
|
151
|
+
export async function retryWithBackoff(fn, options) {
|
|
152
|
+
if (options?.signal?.aborted === true) {
|
|
153
|
+
throw createAbortError();
|
|
154
|
+
}
|
|
155
|
+
const { maxAttempts, initialDelayMs, maxDelayMs, shouldRetryOnError, retryFetchErrors, signal, } = {
|
|
156
|
+
...DEFAULT_RETRY_OPTIONS,
|
|
157
|
+
...options,
|
|
158
|
+
};
|
|
159
|
+
let currentDelay = initialDelayMs;
|
|
160
|
+
let lastError;
|
|
161
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
162
|
+
if (signal?.aborted === true) {
|
|
163
|
+
throw createAbortError();
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
return await fn();
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
lastError = error;
|
|
170
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
if (attempt >= maxAttempts ||
|
|
174
|
+
!shouldRetryOnError(error, retryFetchErrors)) {
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
await delay(currentDelay, signal);
|
|
178
|
+
currentDelay = Math.min(maxDelayMs, currentDelay * 2);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
throw lastError instanceof Error
|
|
182
|
+
? lastError
|
|
183
|
+
: new Error('Retry attempts exhausted');
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if ripgrep is available on the system.
|
|
8
|
+
* This is a non-throwing wrapper around getRipgrepPath that returns a boolean.
|
|
9
|
+
* Results are cached for performance.
|
|
10
|
+
*
|
|
11
|
+
* @returns true if ripgrep is available, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
export declare function isRipgrepAvailable(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Clear the ripgrep availability cache.
|
|
16
|
+
* Useful for testing or when configuration changes.
|
|
17
|
+
*/
|
|
18
|
+
export declare function clearRipgrepAvailabilityCache(): void;
|
|
19
|
+
export declare function getRipgrepPath(): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Create Windows-specific symlink or copy if needed
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureWindowsShortcut(source: string, target: string): boolean;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import os from 'os';
|
|
9
|
+
import { debugLogger } from './debugLogger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Cross-platform ripgrep path resolution
|
|
12
|
+
* Implements the robust solution described in issue 483
|
|
13
|
+
*/
|
|
14
|
+
let ripgrepAvailabilityCache = null;
|
|
15
|
+
/**
|
|
16
|
+
* Check if ripgrep is available on the system.
|
|
17
|
+
* This is a non-throwing wrapper around getRipgrepPath that returns a boolean.
|
|
18
|
+
* Results are cached for performance.
|
|
19
|
+
*
|
|
20
|
+
* @returns true if ripgrep is available, false otherwise
|
|
21
|
+
*/
|
|
22
|
+
export async function isRipgrepAvailable() {
|
|
23
|
+
if (ripgrepAvailabilityCache !== null) {
|
|
24
|
+
return ripgrepAvailabilityCache;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
await getRipgrepPath();
|
|
28
|
+
ripgrepAvailabilityCache = true;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
ripgrepAvailabilityCache = false;
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Clear the ripgrep availability cache.
|
|
38
|
+
* Useful for testing or when configuration changes.
|
|
39
|
+
*/
|
|
40
|
+
export function clearRipgrepAvailabilityCache() {
|
|
41
|
+
ripgrepAvailabilityCache = null;
|
|
42
|
+
}
|
|
43
|
+
async function tryPackagedRipgrep() {
|
|
44
|
+
try {
|
|
45
|
+
const { rgPath } = await import('@lvce-editor/ripgrep');
|
|
46
|
+
if (fs.existsSync(rgPath)) {
|
|
47
|
+
return rgPath;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Package not available or binary doesn't exist
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
async function trySystemRipgrep(isWindows) {
|
|
56
|
+
try {
|
|
57
|
+
const { execSync } = await import('child_process');
|
|
58
|
+
const checkCmd = isWindows ? 'where rg' : 'which rg';
|
|
59
|
+
const systemPath = execSync(checkCmd, { encoding: 'utf8' }).trim();
|
|
60
|
+
if (fs.existsSync(systemPath)) {
|
|
61
|
+
return systemPath;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// System ripgrep not found
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function findFirstExistingPath(paths) {
|
|
70
|
+
for (const p of paths) {
|
|
71
|
+
if (fs.existsSync(p))
|
|
72
|
+
return p;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function tryWindowsPaths() {
|
|
77
|
+
const envPaths = [
|
|
78
|
+
path.join(
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: env var fallback for path
|
|
80
|
+
process.env.PROGRAMFILES || 'C:\\Program Files', 'ripgrep', 'rg.exe'),
|
|
81
|
+
path.join(
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: env var fallback for path
|
|
83
|
+
process.env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)', 'ripgrep', 'rg.exe'),
|
|
84
|
+
];
|
|
85
|
+
const result = findFirstExistingPath(envPaths);
|
|
86
|
+
if (result)
|
|
87
|
+
return result;
|
|
88
|
+
const commonPaths = [
|
|
89
|
+
'C:\\Program Files\\ripgrep\\rg.exe',
|
|
90
|
+
'C:\\Program Files (x86)\\ripgrep\\rg.exe',
|
|
91
|
+
'C:\\tools\\ripgrep\\rg.exe',
|
|
92
|
+
];
|
|
93
|
+
return findFirstExistingPath(commonPaths);
|
|
94
|
+
}
|
|
95
|
+
function tryUnixPaths() {
|
|
96
|
+
const unixPaths = [
|
|
97
|
+
'/usr/local/bin/rg',
|
|
98
|
+
'/usr/bin/rg',
|
|
99
|
+
'/opt/homebrew/bin/rg',
|
|
100
|
+
'/home/linuxbrew/.linuxbrew/bin/rg',
|
|
101
|
+
];
|
|
102
|
+
return findFirstExistingPath(unixPaths);
|
|
103
|
+
}
|
|
104
|
+
function tryBundledPath(isWindows) {
|
|
105
|
+
const projectRoot = process.cwd();
|
|
106
|
+
const pkgEntrypoint = process.pkg?.entrypoint;
|
|
107
|
+
const nodeModulesExists = fs.existsSync(path.join(projectRoot, 'node_modules'));
|
|
108
|
+
const isBundled =
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: string property may be empty, check node_modules as fallback
|
|
110
|
+
Boolean(pkgEntrypoint || !nodeModulesExists);
|
|
111
|
+
if (isBundled) {
|
|
112
|
+
const bundleDir = path.join(projectRoot, 'bundle');
|
|
113
|
+
const bundledRgPath = path.join(bundleDir, isWindows ? 'rg.exe' : 'rg');
|
|
114
|
+
if (fs.existsSync(bundledRgPath)) {
|
|
115
|
+
return bundledRgPath;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
export async function getRipgrepPath() {
|
|
121
|
+
const isWindows = os.platform() === 'win32';
|
|
122
|
+
const packaged = await tryPackagedRipgrep();
|
|
123
|
+
if (packaged)
|
|
124
|
+
return packaged;
|
|
125
|
+
const system = await trySystemRipgrep(isWindows);
|
|
126
|
+
if (system)
|
|
127
|
+
return system;
|
|
128
|
+
if (isWindows) {
|
|
129
|
+
const windowsResult = tryWindowsPaths();
|
|
130
|
+
if (windowsResult)
|
|
131
|
+
return windowsResult;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const unixResult = tryUnixPaths();
|
|
135
|
+
if (unixResult)
|
|
136
|
+
return unixResult;
|
|
137
|
+
}
|
|
138
|
+
const bundled = tryBundledPath(isWindows);
|
|
139
|
+
if (bundled)
|
|
140
|
+
return bundled;
|
|
141
|
+
throw new Error(`ripgrep not found. Please install @lvce-editor/ripgrep or system ripgrep.\n` +
|
|
142
|
+
`Installation options:\n` +
|
|
143
|
+
`- npm install @lvce-editor/ripgrep\n` +
|
|
144
|
+
`- brew install ripgrep (macOS)\n` +
|
|
145
|
+
`- choco install ripgrep (Windows)\n` +
|
|
146
|
+
`- apt install ripgrep (Ubuntu/Debian)`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create Windows-specific symlink or copy if needed
|
|
150
|
+
*/
|
|
151
|
+
export function ensureWindowsShortcut(source, target) {
|
|
152
|
+
if (os.platform() !== 'win32') {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
// On Windows, try creating a hard link first
|
|
157
|
+
if (fs.existsSync(source) && !fs.existsSync(target)) {
|
|
158
|
+
// Create target directory if it doesn't exist
|
|
159
|
+
const targetDir = path.dirname(target);
|
|
160
|
+
if (!fs.existsSync(targetDir)) {
|
|
161
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
fs.linkSync(source, target);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Hard link failed (common on Windows without admin); copy instead.
|
|
169
|
+
fs.copyFileSync(source, target);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
debugLogger.warn('Failed to create Windows shortcut for ripgrep:', error);
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ripgrepPathResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ripgrepPathResolver.js","sourceRoot":"","sources":["../../../src/utils/ripgrepPathResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Safely stringifies an object to JSON, replacing circular references.
|
|
8
|
+
*/
|
|
9
|
+
export declare function safeJsonStringify(obj: unknown, space?: string | number): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Safely stringifies an object to JSON, replacing circular references.
|
|
8
|
+
*/
|
|
9
|
+
export function safeJsonStringify(obj, space) {
|
|
10
|
+
const seen = new WeakSet();
|
|
11
|
+
return JSON.stringify(obj, (_key, value) => {
|
|
12
|
+
if (typeof value === 'object' && value !== null) {
|
|
13
|
+
if (seen.has(value)) {
|
|
14
|
+
return '[Circular]';
|
|
15
|
+
}
|
|
16
|
+
seen.add(value);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}, space);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=safeJsonStringify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeJsonStringify.js","sourceRoot":"","sources":["../../../src/utils/safeJsonStringify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAY,EACZ,KAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,OAAO,IAAI,CAAC,SAAS,CACnB,GAAG,EACH,CAAC,IAAI,EAAE,KAAc,EAAE,EAAE;QACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EACD,KAAK,CACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan:PLAN-20260608-ISSUE1585.P11
|
|
3
|
+
* @requirement:REQ-PKG-BOUNDARY
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Package-local SchemaValidator utility for tool parameter validation.
|
|
7
|
+
* Zero core imports — uses ajv directly.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SchemaValidator {
|
|
10
|
+
static validate(schema: unknown | undefined, data: unknown): string | null;
|
|
11
|
+
private static formatPath;
|
|
12
|
+
private static formatErrors;
|
|
13
|
+
}
|