@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,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Edit calculation logic for ast-edit tool.
|
|
7
|
+
* Contains calculateEdit, validation, and helper functions.
|
|
8
|
+
*/
|
|
9
|
+
/* eslint-disable complexity, sonarjs/cognitive-complexity -- Phase 5: legacy core boundary retained while larger decomposition continues. */
|
|
10
|
+
import { promises as fsPromises } from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { parse } from '@ast-grep/napi';
|
|
13
|
+
import { ToolErrorType } from '../../types/tool-error.js';
|
|
14
|
+
import { isNodeError } from '../../utils/errors.js';
|
|
15
|
+
import { LANGUAGE_MAP } from '../../utils/ast-grep-utils.js';
|
|
16
|
+
import { applyReplacement } from './edit-helpers.js';
|
|
17
|
+
/**
|
|
18
|
+
* Calculates the edit to be applied, including validation and freshness checks.
|
|
19
|
+
*
|
|
20
|
+
* @param params - Edit parameters
|
|
21
|
+
* @param host - Tool host interface
|
|
22
|
+
* @param _abortSignal - Abort signal (currently unused)
|
|
23
|
+
* @returns Calculated edit result with validation info
|
|
24
|
+
*/
|
|
25
|
+
export async function calculateEdit(params, host, _abortSignal) {
|
|
26
|
+
// Normalize all string parameters to LF for consistent matching
|
|
27
|
+
const normalizedOldString = params.old_string.replace(/\r\n/g, '\n');
|
|
28
|
+
const normalizedNewString = params.new_string.replace(/\r\n/g, '\n');
|
|
29
|
+
const { currentContent, fileExists } = await readFileState(params, host);
|
|
30
|
+
// Freshness Check (moved before old_string validation to ensure it runs first)
|
|
31
|
+
const currentMtime = await getFileLastModified(params.file_path);
|
|
32
|
+
const freshnessError = checkFreshness(params, currentMtime, fileExists, currentContent);
|
|
33
|
+
if (freshnessError) {
|
|
34
|
+
return freshnessError;
|
|
35
|
+
}
|
|
36
|
+
const { occurrences, error, isNewFile } = validateEditParams(params, currentContent, fileExists, normalizedOldString, normalizedNewString);
|
|
37
|
+
const newContent = !error
|
|
38
|
+
? applyReplacement(currentContent, normalizedOldString, normalizedNewString, isNewFile)
|
|
39
|
+
: (currentContent ?? '');
|
|
40
|
+
const noChangeError = checkNoChange(error, fileExists, currentContent, newContent, params.file_path);
|
|
41
|
+
let astValidation;
|
|
42
|
+
if (!noChangeError) {
|
|
43
|
+
astValidation = validateASTSyntax(params.file_path, newContent);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
currentContent,
|
|
47
|
+
newContent,
|
|
48
|
+
occurrences,
|
|
49
|
+
error: noChangeError,
|
|
50
|
+
isNewFile,
|
|
51
|
+
astValidation,
|
|
52
|
+
fileFreshness: currentMtime,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function readFileState(params, host) {
|
|
56
|
+
let currentContent = null;
|
|
57
|
+
let fileExists = false;
|
|
58
|
+
try {
|
|
59
|
+
const fileSystemService = host.getFileSystemService?.();
|
|
60
|
+
currentContent = fileSystemService?.readTextFile
|
|
61
|
+
? await fileSystemService.readTextFile(params.file_path)
|
|
62
|
+
: await fsPromises.readFile(params.file_path, 'utf-8');
|
|
63
|
+
currentContent = currentContent.replace(/\r\n/g, '\n');
|
|
64
|
+
fileExists = true;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (!isNodeError(err) || err.code !== 'ENOENT') {
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
fileExists = false;
|
|
71
|
+
}
|
|
72
|
+
return { currentContent, fileExists };
|
|
73
|
+
}
|
|
74
|
+
function checkFreshness(params, currentMtime, fileExists, currentContent) {
|
|
75
|
+
if (
|
|
76
|
+
// eslint-disable-next-line sonarjs/expression-complexity -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
77
|
+
params.last_modified != null &&
|
|
78
|
+
((fileExists && currentMtime == null) ||
|
|
79
|
+
(currentMtime != null && currentMtime > params.last_modified))) {
|
|
80
|
+
return {
|
|
81
|
+
currentContent,
|
|
82
|
+
newContent: currentContent ?? '',
|
|
83
|
+
occurrences: 0,
|
|
84
|
+
error: {
|
|
85
|
+
display: `File has been modified since it was last read. Please read the file again to get the latest content.`,
|
|
86
|
+
raw: JSON.stringify({
|
|
87
|
+
message: `File ${params.file_path} mismatch. Expected mtime <= ${params.last_modified}, but found ${currentMtime}.`,
|
|
88
|
+
current_mtime: currentMtime,
|
|
89
|
+
your_mtime: params.last_modified,
|
|
90
|
+
}),
|
|
91
|
+
type: ToolErrorType.FILE_MODIFIED_CONFLICT,
|
|
92
|
+
},
|
|
93
|
+
isNewFile: false,
|
|
94
|
+
astValidation: undefined,
|
|
95
|
+
fileFreshness: currentMtime,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
function validateEditParams(params, currentContent, fileExists, normalizedOldString, normalizedNewString) {
|
|
101
|
+
let occurrences = 0;
|
|
102
|
+
let error = undefined;
|
|
103
|
+
let isNewFile = false;
|
|
104
|
+
if (params.old_string === '' && !fileExists) {
|
|
105
|
+
isNewFile = true;
|
|
106
|
+
}
|
|
107
|
+
else if (!fileExists) {
|
|
108
|
+
error = {
|
|
109
|
+
display: `File not found. Cannot apply edit. Use an empty old_string to create a new file.`,
|
|
110
|
+
raw: `File not found: ${params.file_path}`,
|
|
111
|
+
type: ToolErrorType.FILE_NOT_FOUND,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else if (currentContent !== null) {
|
|
115
|
+
occurrences = countOccurrences(currentContent, normalizedOldString);
|
|
116
|
+
if (occurrences === 0) {
|
|
117
|
+
error = {
|
|
118
|
+
display: `Failed to edit, could not find string to replace.`,
|
|
119
|
+
raw: `Failed to edit, 0 occurrences found for old_string in ${params.file_path}. No edits made.`,
|
|
120
|
+
type: ToolErrorType.EDIT_NO_OCCURRENCE_FOUND,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else if (normalizedOldString === normalizedNewString) {
|
|
124
|
+
error = {
|
|
125
|
+
display: `No changes to apply. The old_string and new_string are identical.`,
|
|
126
|
+
raw: `No changes to apply. The old_string and new_string are identical in file: ${params.file_path}`,
|
|
127
|
+
type: ToolErrorType.EDIT_NO_CHANGE,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { occurrences, error, isNewFile };
|
|
132
|
+
}
|
|
133
|
+
function checkNoChange(error, fileExists, currentContent, newContent, filePath) {
|
|
134
|
+
if (!error && fileExists && currentContent === newContent) {
|
|
135
|
+
return {
|
|
136
|
+
display: 'No changes to apply. The new content is identical to the current content.',
|
|
137
|
+
raw: `No changes to apply. The new content is identical to the current content in file: ${filePath}`,
|
|
138
|
+
type: ToolErrorType.EDIT_NO_CHANGE,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return error;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Counts occurrences that will be replaced (0 or 1).
|
|
145
|
+
* Returns 0/1 not true count, aligned with String.replace() single-replacement semantics.
|
|
146
|
+
*
|
|
147
|
+
* @param content - File content
|
|
148
|
+
* @param searchString - String to search for
|
|
149
|
+
* @returns 0 if not found, 1 if found
|
|
150
|
+
*/
|
|
151
|
+
export function countOccurrences(content, searchString) {
|
|
152
|
+
if (!searchString)
|
|
153
|
+
return 0;
|
|
154
|
+
// Since applyReplacement uses String.replace (single replacement),
|
|
155
|
+
// count occurrences that will actually be replaced (0 or 1)
|
|
156
|
+
return content.includes(searchString) ? 1 : 0;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Validates AST syntax for the given file path and content.
|
|
160
|
+
* Inspects the tree-sitter parse tree for ERROR nodes and zero-width
|
|
161
|
+
* phantom nodes (MISSING tokens inserted by error recovery) rather than
|
|
162
|
+
* relying on thrown exceptions (tree-sitter is error-recovering and
|
|
163
|
+
* never throws on syntax errors).
|
|
164
|
+
*
|
|
165
|
+
* @param filePath - File path (used to detect language)
|
|
166
|
+
* @param content - File content to validate
|
|
167
|
+
* @returns Validation result
|
|
168
|
+
*/
|
|
169
|
+
export function validateASTSyntax(filePath, content) {
|
|
170
|
+
const extension = path.extname(filePath).substring(1).toLowerCase();
|
|
171
|
+
const lang = LANGUAGE_MAP[extension];
|
|
172
|
+
if (!lang) {
|
|
173
|
+
return { valid: true, errors: [] };
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const tree = parse(lang, content);
|
|
177
|
+
const root = tree.root();
|
|
178
|
+
// Check for explicit ERROR nodes (garbled/unparseable tokens)
|
|
179
|
+
const errorNode = root.find({ rule: { kind: 'ERROR' } });
|
|
180
|
+
if (errorNode) {
|
|
181
|
+
const pos = errorNode.range().start;
|
|
182
|
+
return {
|
|
183
|
+
valid: false,
|
|
184
|
+
errors: [
|
|
185
|
+
`Syntax error at line ${pos.line + 1}, column ${pos.column + 1}`,
|
|
186
|
+
],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Check for zero-width phantom nodes (MISSING tokens from error recovery).
|
|
190
|
+
// Tree-sitter inserts these when expected delimiters are absent (e.g., missing }).
|
|
191
|
+
// ast-grep doesn't expose isMissing() or kind:'MISSING', but zero-width leaf
|
|
192
|
+
// nodes in non-empty content reliably indicate recovered syntax errors.
|
|
193
|
+
if (content.length > 0) {
|
|
194
|
+
const missingNode = findZeroWidthNode(root);
|
|
195
|
+
if (missingNode) {
|
|
196
|
+
return {
|
|
197
|
+
valid: false,
|
|
198
|
+
errors: [
|
|
199
|
+
`Syntax error at line ${missingNode.line + 1}, column ${missingNode.column + 1}`,
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return { valid: true, errors: [] };
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return {
|
|
208
|
+
valid: false,
|
|
209
|
+
errors: [error instanceof Error ? error.message : String(error)],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Walks the parse tree to find zero-width leaf nodes, which indicate
|
|
215
|
+
* MISSING tokens inserted by tree-sitter's error recovery (e.g., a phantom
|
|
216
|
+
* closing brace). Skips the root node to avoid false positives on empty content.
|
|
217
|
+
*/
|
|
218
|
+
function findZeroWidthNode(node) {
|
|
219
|
+
for (const child of node.children()) {
|
|
220
|
+
const range = child.range();
|
|
221
|
+
if (range.start.index === range.end.index && child.isLeaf()) {
|
|
222
|
+
return { line: range.start.line, column: range.start.column };
|
|
223
|
+
}
|
|
224
|
+
const found = findZeroWidthNode(child);
|
|
225
|
+
if (found)
|
|
226
|
+
return found;
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Gets the last modified timestamp of a file.
|
|
232
|
+
* Returns null if file doesn't exist.
|
|
233
|
+
*
|
|
234
|
+
* @param filePath - Path to the file
|
|
235
|
+
* @returns Timestamp in milliseconds or null
|
|
236
|
+
*/
|
|
237
|
+
export async function getFileLastModified(filePath) {
|
|
238
|
+
try {
|
|
239
|
+
const stats = await fsPromises.stat(filePath);
|
|
240
|
+
return stats.mtime.getTime();
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
if (isNodeError(error) && error.code === 'ENOENT') {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=edit-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-calculator.js","sourceRoot":"","sources":["../../../../src/tools/ast-edit/edit-calculator.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
|
+
* Edit helper functions for ast-edit tool.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Applies a replacement to file content.
|
|
10
|
+
* This is the core replacement logic used by ASTEditTool.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: This differs from edit.ts applyReplacement - they are intentionally separate.
|
|
13
|
+
* edit.ts supports multiple occurrences and fuzzy matching; ast-edit.ts uses simple single-replace.
|
|
14
|
+
* These are different domain behaviors and must NOT be unified.
|
|
15
|
+
*
|
|
16
|
+
* @param currentContent - The current file content (null if file doesn't exist)
|
|
17
|
+
* @param oldString - The string to replace
|
|
18
|
+
* @param newString - The replacement string
|
|
19
|
+
* @param isNewFile - Whether this is a new file creation
|
|
20
|
+
* @returns The modified content
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyReplacement(currentContent: string | null, oldString: string, newString: string, isNewFile: boolean): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Edit helper functions for ast-edit tool.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Applies a replacement to file content.
|
|
10
|
+
* This is the core replacement logic used by ASTEditTool.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: This differs from edit.ts applyReplacement - they are intentionally separate.
|
|
13
|
+
* edit.ts supports multiple occurrences and fuzzy matching; ast-edit.ts uses simple single-replace.
|
|
14
|
+
* These are different domain behaviors and must NOT be unified.
|
|
15
|
+
*
|
|
16
|
+
* @param currentContent - The current file content (null if file doesn't exist)
|
|
17
|
+
* @param oldString - The string to replace
|
|
18
|
+
* @param newString - The replacement string
|
|
19
|
+
* @param isNewFile - Whether this is a new file creation
|
|
20
|
+
* @returns The modified content
|
|
21
|
+
*/
|
|
22
|
+
export function applyReplacement(currentContent, oldString, newString, isNewFile) {
|
|
23
|
+
if (isNewFile) {
|
|
24
|
+
return newString;
|
|
25
|
+
}
|
|
26
|
+
if (currentContent === null) {
|
|
27
|
+
return oldString === '' ? newString : '';
|
|
28
|
+
}
|
|
29
|
+
if (oldString === '') {
|
|
30
|
+
return currentContent;
|
|
31
|
+
}
|
|
32
|
+
// For single replacement, use callback form to treat newString literally
|
|
33
|
+
// (avoids $&, $$, $1 etc. being interpreted as special replacement patterns)
|
|
34
|
+
return currentContent.replace(oldString, () => newString);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=edit-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-helpers.js","sourceRoot":"","sources":["../../../../src/tools/ast-edit/edit-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAA6B,EAC7B,SAAiB,EACjB,SAAiB,EACjB,SAAkB;IAElB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,yEAAyE;IACzE,6EAA6E;IAC7E,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Import } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detects the programming language from a file path based on its extension.
|
|
9
|
+
* @param filePath - The file path to analyze
|
|
10
|
+
* @returns The detected language (e.g., 'typescript', 'python') or 'unknown'
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectLanguage(filePath: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Extracts import statements from source code.
|
|
15
|
+
* @param content - The source code content
|
|
16
|
+
* @param language - The programming language (typescript, javascript, python, etc.)
|
|
17
|
+
* @returns Array of import declarations with module paths and imported items
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractImports(content: string, language: string): Import[];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { ASTConfig } from './ast-config.js';
|
|
8
|
+
import { KEYWORDS, REGEX } from './constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Detects the programming language from a file path based on its extension.
|
|
11
|
+
* @param filePath - The file path to analyze
|
|
12
|
+
* @returns The detected language (e.g., 'typescript', 'python') or 'unknown'
|
|
13
|
+
*/
|
|
14
|
+
export function detectLanguage(filePath) {
|
|
15
|
+
const extension = path.extname(filePath).substring(1);
|
|
16
|
+
return (ASTConfig.SUPPORTED_LANGUAGES[extension] || 'unknown');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extracts import statements from source code.
|
|
20
|
+
* @param content - The source code content
|
|
21
|
+
* @param language - The programming language (typescript, javascript, python, etc.)
|
|
22
|
+
* @returns Array of import declarations with module paths and imported items
|
|
23
|
+
*/
|
|
24
|
+
export function extractImports(content, language) {
|
|
25
|
+
const imports = [];
|
|
26
|
+
const lines = content.split('\n');
|
|
27
|
+
lines.forEach((line, index) => {
|
|
28
|
+
const trimmed = line.trim();
|
|
29
|
+
if ((language === 'typescript' || language === 'javascript') &&
|
|
30
|
+
trimmed.startsWith(KEYWORDS.IMPORT)) {
|
|
31
|
+
imports.push({
|
|
32
|
+
module: extractImportModule(trimmed),
|
|
33
|
+
items: extractImportItems(trimmed),
|
|
34
|
+
line: index + 1,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if (language === 'python' &&
|
|
38
|
+
(trimmed.startsWith(KEYWORDS.IMPORT) || trimmed.startsWith(KEYWORDS.FROM))) {
|
|
39
|
+
imports.push({
|
|
40
|
+
module: extractPythonImportModule(trimmed),
|
|
41
|
+
items: extractPythonImportItems(trimmed),
|
|
42
|
+
line: index + 1,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return imports;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extracts the module path from an import statement.
|
|
50
|
+
* @param line - The import statement line
|
|
51
|
+
* @returns The module path or 'unknown' if not found
|
|
52
|
+
*/
|
|
53
|
+
function extractImportModule(line) {
|
|
54
|
+
const match = line.match(REGEX.IMPORT_MODULE);
|
|
55
|
+
return match ? match[1] : 'unknown';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Extracts the list of imported items from an import statement.
|
|
59
|
+
* @param line - The import statement line
|
|
60
|
+
* @returns Array of imported item names
|
|
61
|
+
*/
|
|
62
|
+
function extractImportItems(line) {
|
|
63
|
+
// Extract the contents of the first { ... } block using index scanning to
|
|
64
|
+
// avoid polynomial backtracking on braces-heavy input.
|
|
65
|
+
const open = line.indexOf('{');
|
|
66
|
+
if (open !== -1) {
|
|
67
|
+
const close = line.indexOf('}', open + 1);
|
|
68
|
+
if (close > open + 1) {
|
|
69
|
+
return line
|
|
70
|
+
.slice(open + 1, close)
|
|
71
|
+
.split(',')
|
|
72
|
+
.map((item) => item.trim());
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extracts the module path from a Python import statement.
|
|
79
|
+
* Handles: `import os`, `from pathlib import Path`, `from os.path import join`
|
|
80
|
+
*/
|
|
81
|
+
function extractPythonImportModule(line) {
|
|
82
|
+
// eslint-disable-next-line sonarjs/regular-expr -- Static regex reviewed for lint hardening; behavior preserved.
|
|
83
|
+
const fromMatch = line.match(/^from\s+([\w.]+)\s+import/);
|
|
84
|
+
if (fromMatch) {
|
|
85
|
+
return fromMatch[1];
|
|
86
|
+
}
|
|
87
|
+
// eslint-disable-next-line sonarjs/regular-expr -- Static regex reviewed for lint hardening; behavior preserved.
|
|
88
|
+
const importMatch = line.match(/^import\s+([\w.]+)/);
|
|
89
|
+
if (importMatch) {
|
|
90
|
+
return importMatch[1];
|
|
91
|
+
}
|
|
92
|
+
return 'unknown';
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Strips a trailing ` as <alias>` from a single import item using linear token
|
|
96
|
+
* scanning (avoids regex backtracking on whitespace-heavy input).
|
|
97
|
+
* Example: `join as j` -> `join`.
|
|
98
|
+
*/
|
|
99
|
+
function stripImportAlias(item) {
|
|
100
|
+
const tokens = item.split(/\s+/);
|
|
101
|
+
if (tokens.length >= 3 &&
|
|
102
|
+
tokens[tokens.length - 2] === 'as' &&
|
|
103
|
+
/^\w+$/.test(tokens[tokens.length - 1])) {
|
|
104
|
+
return tokens.slice(0, tokens.length - 2).join(' ');
|
|
105
|
+
}
|
|
106
|
+
return item;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extracts imported items from a Python import statement.
|
|
110
|
+
* Handles: `from typing import List, Dict`, `from os.path import join, exists`
|
|
111
|
+
*/
|
|
112
|
+
function extractPythonImportItems(line) {
|
|
113
|
+
// eslint-disable-next-line sonarjs/regular-expr -- Static regex reviewed for lint hardening; behavior preserved.
|
|
114
|
+
const fromImportMatch = line.match(/^from\s+[\w.]+\s+import\s+(.+)/);
|
|
115
|
+
if (fromImportMatch) {
|
|
116
|
+
return fromImportMatch[1]
|
|
117
|
+
.split(',')
|
|
118
|
+
.map((item) => stripImportAlias(item.trim()))
|
|
119
|
+
.filter((item) => item);
|
|
120
|
+
}
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=language-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-analysis.js","sourceRoot":"","sources":["../../../../src/tools/ast-edit/language-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*
|
|
6
|
+
* Local context analysis functions for AST parsing and code snippet collection.
|
|
7
|
+
*/
|
|
8
|
+
import type { ASTNode, CodeSnippet, Declaration, FunctionInfo, ClassInfo, VariableInfo, ASTContext } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse AST from content using basic line-by-line analysis.
|
|
11
|
+
* @param content - Source code content
|
|
12
|
+
* @param language - Programming language
|
|
13
|
+
* @returns Array of AST nodes
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseAST(content: string, language: string): Promise<ASTNode[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Extract AST nodes from content by analyzing significant lines.
|
|
18
|
+
* @param content - Source code content
|
|
19
|
+
* @param language - Programming language
|
|
20
|
+
* @returns Array of AST nodes
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractASTNodes(content: string, language: string): ASTNode[];
|
|
23
|
+
/**
|
|
24
|
+
* Collect code snippets from content, filtering out comments and short lines.
|
|
25
|
+
* @param content - Source code content
|
|
26
|
+
* @returns Array of code snippets sorted by relevance
|
|
27
|
+
*/
|
|
28
|
+
export declare function collectSnippets(content: string): CodeSnippet[];
|
|
29
|
+
/**
|
|
30
|
+
* Build language-specific context by extracting functions, classes, and variables.
|
|
31
|
+
* @param content - Source code content
|
|
32
|
+
* @param language - Programming language
|
|
33
|
+
* @returns Language context with extracted elements
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildLanguageContext(content: string, language: string): ASTContext['languageContext'];
|
|
36
|
+
/**
|
|
37
|
+
* Check if a line is significant (non-comment, non-empty).
|
|
38
|
+
* @param line - Source code line
|
|
39
|
+
* @param _language - Programming language (unused but kept for signature compatibility)
|
|
40
|
+
* @returns True if the line is significant
|
|
41
|
+
*/
|
|
42
|
+
export declare function isSignificantLine(line: string, _language: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Infer the AST node type from a line of code.
|
|
45
|
+
* @param line - Source code line
|
|
46
|
+
* @param _language - Programming language (unused but kept for signature compatibility)
|
|
47
|
+
* @returns Node type (function, class, control, return, statement)
|
|
48
|
+
*/
|
|
49
|
+
export declare function inferNodeType(line: string, _language: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Calculate the relevance score of a code line.
|
|
52
|
+
* @param line - Source code line
|
|
53
|
+
* @returns Relevance score
|
|
54
|
+
*/
|
|
55
|
+
export declare function calculateRelevance(line: string): number;
|
|
56
|
+
/**
|
|
57
|
+
* Extract function declarations from content using regex.
|
|
58
|
+
* @param content - Source code content
|
|
59
|
+
* @param _language - Programming language
|
|
60
|
+
* @returns Array of function information
|
|
61
|
+
*/
|
|
62
|
+
export declare function extractFunctions(content: string, _language: string): FunctionInfo[];
|
|
63
|
+
/**
|
|
64
|
+
* Extract class declarations from content using regex.
|
|
65
|
+
* @param content - Source code content
|
|
66
|
+
* @param _language - Programming language
|
|
67
|
+
* @returns Array of class information
|
|
68
|
+
*/
|
|
69
|
+
export declare function extractClasses(content: string, _language: string): ClassInfo[];
|
|
70
|
+
/**
|
|
71
|
+
* Extract variable declarations from content using regex.
|
|
72
|
+
* @param content - Source code content
|
|
73
|
+
* @param _language - Programming language
|
|
74
|
+
* @returns Array of variable information
|
|
75
|
+
*/
|
|
76
|
+
export declare function extractVariables(content: string, _language: string): VariableInfo[];
|
|
77
|
+
/**
|
|
78
|
+
* Optimize context collection by gathering declaration and local snippets.
|
|
79
|
+
* @param declarations - Array of declarations
|
|
80
|
+
* @param content - Source code content
|
|
81
|
+
* @param _workspaceRoot - Workspace root path (unused but kept for signature compatibility)
|
|
82
|
+
* @returns Optimized array of code snippets
|
|
83
|
+
*/
|
|
84
|
+
export declare function optimizeContextCollection(declarations: Declaration[], content: string, _workspaceRoot: string): CodeSnippet[];
|