@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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
const DEFAULT_GIT_COMMAND_TIMEOUT_MS = 30_000;
|
|
10
|
+
function runGit(args, cwd, options) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const child = spawn('git', args, {
|
|
13
|
+
cwd,
|
|
14
|
+
windowsHide: true,
|
|
15
|
+
});
|
|
16
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_GIT_COMMAND_TIMEOUT_MS;
|
|
17
|
+
const stdoutChunks = [];
|
|
18
|
+
const stderrChunks = [];
|
|
19
|
+
let settled = false;
|
|
20
|
+
const settle = (fn) => {
|
|
21
|
+
if (settled)
|
|
22
|
+
return;
|
|
23
|
+
settled = true;
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
child.removeAllListeners();
|
|
26
|
+
child.stdout.removeAllListeners();
|
|
27
|
+
child.stderr.removeAllListeners();
|
|
28
|
+
fn();
|
|
29
|
+
};
|
|
30
|
+
const timer = setTimeout(() => {
|
|
31
|
+
try {
|
|
32
|
+
child.kill();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
settle(() => reject(new Error(`git command timed out after ${timeoutMs}ms: git ${args.join(' ')}`)));
|
|
36
|
+
}
|
|
37
|
+
}, timeoutMs);
|
|
38
|
+
child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
|
|
39
|
+
child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
|
|
40
|
+
child.on('error', (err) => settle(() => reject(new Error(`Failed to start git: ${err.message}`))));
|
|
41
|
+
child.on('close', (code) => {
|
|
42
|
+
const stdout = Buffer.concat(stdoutChunks).toString('utf8');
|
|
43
|
+
const stderr = Buffer.concat(stderrChunks).toString('utf8').trim();
|
|
44
|
+
if (code === 0) {
|
|
45
|
+
settle(() => resolve(stdout));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
settle(() => reject(new Error(stderr || `git exited with code ${code}`)));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function findGitRoot(startDir) {
|
|
53
|
+
let current = path.resolve(startDir);
|
|
54
|
+
while (true) {
|
|
55
|
+
if (existsSync(path.join(current, '.git')))
|
|
56
|
+
return current;
|
|
57
|
+
const parent = path.dirname(current);
|
|
58
|
+
if (parent === current)
|
|
59
|
+
return undefined;
|
|
60
|
+
current = parent;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function fileExistsInHead(relToGitRoot, gitRoot) {
|
|
64
|
+
try {
|
|
65
|
+
await runGit(['cat-file', '-e', `HEAD:${relToGitRoot}`], gitRoot);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function parseUnifiedZeroDiff(diffText) {
|
|
73
|
+
const markersByLine = new Map();
|
|
74
|
+
const deletionAfterLines = new Set();
|
|
75
|
+
const lines = diffText.split(/\r?\n/);
|
|
76
|
+
const hunkHeaderRe = /^@@\s+-(\d+)(?:,(\d+))?\s+\+(\d+)(?:,(\d+))?\s+@@/;
|
|
77
|
+
for (const line of lines) {
|
|
78
|
+
const m = hunkHeaderRe.exec(line);
|
|
79
|
+
if (!m)
|
|
80
|
+
continue;
|
|
81
|
+
const oldCount = m[2] ? Number(m[2]) : 1;
|
|
82
|
+
const newStart = Number(m[3]);
|
|
83
|
+
const newCount = m[4] ? Number(m[4]) : 1;
|
|
84
|
+
if (oldCount === 0) {
|
|
85
|
+
for (let i = 0; i < newCount; i++) {
|
|
86
|
+
markersByLine.set(newStart + i, 'N');
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (newCount === 0 && oldCount > 0) {
|
|
91
|
+
const oldStart = Number(m[1]);
|
|
92
|
+
deletionAfterLines.add(Math.max(0, oldStart - 1));
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (oldCount > 0 && newCount > 0) {
|
|
96
|
+
for (let i = 0; i < newCount; i++) {
|
|
97
|
+
markersByLine.set(newStart + i, 'M');
|
|
98
|
+
}
|
|
99
|
+
if (oldCount > newCount) {
|
|
100
|
+
deletionAfterLines.add(newStart + newCount - 1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { markersByLine, deletionAfterLines };
|
|
105
|
+
}
|
|
106
|
+
function buildUntrackedFileResult(relToGitRoot, gitRoot) {
|
|
107
|
+
return runGit(['show', `:${relToGitRoot}`], gitRoot)
|
|
108
|
+
.catch(() => '')
|
|
109
|
+
.then((content) => {
|
|
110
|
+
if (content === '') {
|
|
111
|
+
return {
|
|
112
|
+
markersByLine: new Map(),
|
|
113
|
+
deletionAfterLines: new Set(),
|
|
114
|
+
warning: 'File is not present in HEAD (untracked), but failed to read its content from git index',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const normalizedContent = content.replace(/\r?\n$/, '');
|
|
118
|
+
const lineCount = normalizedContent === '' ? 0 : normalizedContent.split(/\r?\n/).length;
|
|
119
|
+
const markersByLine = new Map();
|
|
120
|
+
for (let i = 1; i <= lineCount; i++) {
|
|
121
|
+
markersByLine.set(i, 'N');
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
markersByLine,
|
|
125
|
+
deletionAfterLines: new Set(),
|
|
126
|
+
warning: 'File is not present in HEAD (untracked); marked all lines as new',
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
export async function getGitLineChanges(absolutePath) {
|
|
131
|
+
try {
|
|
132
|
+
if (!path.isAbsolute(absolutePath)) {
|
|
133
|
+
return {
|
|
134
|
+
markersByLine: new Map(),
|
|
135
|
+
deletionAfterLines: new Set(),
|
|
136
|
+
warning: `Path is not absolute: ${absolutePath}`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const fileDir = path.dirname(absolutePath);
|
|
140
|
+
const gitRoot = findGitRoot(fileDir);
|
|
141
|
+
if (!gitRoot) {
|
|
142
|
+
return {
|
|
143
|
+
markersByLine: new Map(),
|
|
144
|
+
deletionAfterLines: new Set(),
|
|
145
|
+
warning: 'Not a git repository',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const relToGitRoot = path.relative(gitRoot, absolutePath);
|
|
149
|
+
const diffText = await runGit(['diff', '--no-color', '--unified=0', 'HEAD', '--', relToGitRoot], gitRoot);
|
|
150
|
+
if (diffText.trim() === '') {
|
|
151
|
+
const existsInHead = await fileExistsInHead(relToGitRoot, gitRoot);
|
|
152
|
+
if (!existsInHead) {
|
|
153
|
+
return await buildUntrackedFileResult(relToGitRoot, gitRoot);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const parsed = parseUnifiedZeroDiff(diffText);
|
|
157
|
+
return {
|
|
158
|
+
markersByLine: parsed.markersByLine,
|
|
159
|
+
deletionAfterLines: parsed.deletionAfterLines,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
return {
|
|
165
|
+
markersByLine: new Map(),
|
|
166
|
+
deletionAfterLines: new Set(),
|
|
167
|
+
warning: msg,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=gitLineChanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitLineChanges.js","sourceRoot":"","sources":["../../../src/utils/gitLineChanges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
export function isGitRepository(directory) {
|
|
9
|
+
try {
|
|
10
|
+
let currentDir = path.resolve(directory);
|
|
11
|
+
let searching = true;
|
|
12
|
+
while (searching) {
|
|
13
|
+
const gitDir = path.join(currentDir, '.git');
|
|
14
|
+
if (fs.existsSync(gitDir)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
const parentDir = path.dirname(currentDir);
|
|
18
|
+
if (parentDir === currentDir) {
|
|
19
|
+
searching = false;
|
|
20
|
+
}
|
|
21
|
+
if (searching) {
|
|
22
|
+
currentDir = parentDir;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=gitUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitUtils.js","sourceRoot":"","sources":["../../../src/utils/gitUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAC;QACH,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,OAAO,SAAS,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { ILspService, IToolHost } from '../interfaces/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Collects LSP diagnostics for a file and formats them for LLM consumption.
|
|
9
|
+
*
|
|
10
|
+
* @plan PLAN-20250212-LSP.P31
|
|
11
|
+
* @requirement REQ-DIAG-010
|
|
12
|
+
*
|
|
13
|
+
* This helper:
|
|
14
|
+
* - Checks if LSP client is alive
|
|
15
|
+
* - Calls checkFile() with a timeout to prevent hangs
|
|
16
|
+
* - Filters diagnostics by configured severities
|
|
17
|
+
* - Limits diagnostics per maxDiagnosticsPerFile
|
|
18
|
+
* - Formats with <diagnostics> XML tags
|
|
19
|
+
* - Returns null if no diagnostics or LSP unavailable
|
|
20
|
+
*
|
|
21
|
+
* The caller should wrap this in try-catch to satisfy REQ-GRACE-050/055.
|
|
22
|
+
*
|
|
23
|
+
* @param config - The Config instance to get LSP client and settings
|
|
24
|
+
* @param absolutePath - The absolute path of the file to check
|
|
25
|
+
* @returns Formatted diagnostics block or null if none
|
|
26
|
+
*/
|
|
27
|
+
export declare function collectLspDiagnosticsBlock(lspService: ILspService, host: IToolHost, absolutePath: string): Promise<string | null>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Timeout for LSP diagnostics collection to prevent hanging on unresponsive LSP servers.
|
|
9
|
+
*/
|
|
10
|
+
const LSP_DIAGNOSTICS_TIMEOUT_MS = 5000;
|
|
11
|
+
/**
|
|
12
|
+
* Collects LSP diagnostics for a file and formats them for LLM consumption.
|
|
13
|
+
*
|
|
14
|
+
* @plan PLAN-20250212-LSP.P31
|
|
15
|
+
* @requirement REQ-DIAG-010
|
|
16
|
+
*
|
|
17
|
+
* This helper:
|
|
18
|
+
* - Checks if LSP client is alive
|
|
19
|
+
* - Calls checkFile() with a timeout to prevent hangs
|
|
20
|
+
* - Filters diagnostics by configured severities
|
|
21
|
+
* - Limits diagnostics per maxDiagnosticsPerFile
|
|
22
|
+
* - Formats with <diagnostics> XML tags
|
|
23
|
+
* - Returns null if no diagnostics or LSP unavailable
|
|
24
|
+
*
|
|
25
|
+
* The caller should wrap this in try-catch to satisfy REQ-GRACE-050/055.
|
|
26
|
+
*
|
|
27
|
+
* @param config - The Config instance to get LSP client and settings
|
|
28
|
+
* @param absolutePath - The absolute path of the file to check
|
|
29
|
+
* @returns Formatted diagnostics block or null if none
|
|
30
|
+
*/
|
|
31
|
+
export async function collectLspDiagnosticsBlock(lspService, host, absolutePath) {
|
|
32
|
+
const diagnostics = await lspService.waitForDiagnostics(absolutePath, LSP_DIAGNOSTICS_TIMEOUT_MS);
|
|
33
|
+
const lspConfig = lspService.getLspConfig();
|
|
34
|
+
const includeSeverities = lspConfig?.includeSeverities ?? ['error'];
|
|
35
|
+
const filtered = diagnostics.filter((d) => includeSeverities.includes(d.severity));
|
|
36
|
+
if (filtered.length === 0) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const maxPerFile = lspConfig?.maxDiagnosticsPerFile ?? 20;
|
|
40
|
+
const relPath = path.relative(host.getTargetDir(), absolutePath);
|
|
41
|
+
const limited = filtered
|
|
42
|
+
.sort((a, b) => {
|
|
43
|
+
const lineDiff = (a.line ?? 0) - (b.line ?? 0);
|
|
44
|
+
return lineDiff !== 0 ? lineDiff : (a.column ?? 0) - (b.column ?? 0);
|
|
45
|
+
})
|
|
46
|
+
.slice(0, maxPerFile);
|
|
47
|
+
// Build severity-reflective header based on actual severities present
|
|
48
|
+
const severitiesPresent = [...new Set(limited.map((d) => d.severity))];
|
|
49
|
+
const severityLabel = severitiesPresent.length === 1 ? `${severitiesPresent[0]}s` : 'diagnostics';
|
|
50
|
+
const diagLines = limited
|
|
51
|
+
.map((d) => {
|
|
52
|
+
const codeStr = d.code !== undefined ? ` (${d.code})` : '';
|
|
53
|
+
return `${d.severity.toUpperCase()} [${d.line ?? 1}:${d.column ?? 1}] ${d.message}${codeStr}`;
|
|
54
|
+
})
|
|
55
|
+
.join('\n');
|
|
56
|
+
const suffix = filtered.length > maxPerFile
|
|
57
|
+
? `\n... and ${filtered.length - maxPerFile} more`
|
|
58
|
+
: '';
|
|
59
|
+
// Return without leading \n\n - caller uses join('\n\n') to separate parts
|
|
60
|
+
return `LSP ${severityLabel} detected in this file, please fix:\n<diagnostics file="${relPath}">\n${diagLines}${suffix}\n</diagnostics>`;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=lsp-diagnostics-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-diagnostics-helper.js","sourceRoot":"","sources":["../../../src/utils/lsp-diagnostics-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;GAEG;AACH,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,UAAuB,EACvB,IAAe,EACf,YAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,kBAAkB,CACrD,YAAY,EACZ,0BAA0B,CAC3B,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;IAE5C,MAAM,iBAAiB,GAAG,SAAS,EAAE,iBAAiB,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CACvC,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,EAAE,qBAAqB,IAAI,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,QAAQ;SACrB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC/C,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAExB,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GACjB,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;IAE9E,MAAM,SAAS,GAAG,OAAO;SACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;IAChG,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,GAAG,UAAU;QAC1B,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,UAAU,OAAO;QAClD,CAAC,CAAC,EAAE,CAAC;IAET,2EAA2E;IAC3E,OAAO,OAAO,aAAa,2DAA2D,OAAO,OAAO,SAAS,GAAG,MAAM,kBAAkB,CAAC;AAC3I,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan:PLAN-20260608-ISSUE1585.P05
|
|
3
|
+
* @requirement:REQ-API-001, REQ-TEMPORARY-INTERFACES
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @license
|
|
7
|
+
* Copyright 2025 Google LLC
|
|
8
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Package-local media classification utilities.
|
|
12
|
+
*
|
|
13
|
+
* Provides media block classification using a package-local MediaBlock
|
|
14
|
+
* type instead of importing from core. Self-contained with zero core imports.
|
|
15
|
+
*/
|
|
16
|
+
/** Package-local media block representation. */
|
|
17
|
+
export interface MediaBlock {
|
|
18
|
+
/** Media block discriminator. */
|
|
19
|
+
type?: 'media';
|
|
20
|
+
/** MIME type of the media. */
|
|
21
|
+
mimeType: string;
|
|
22
|
+
/** Base64-encoded data or URL. */
|
|
23
|
+
data?: string;
|
|
24
|
+
/** Whether data is a URL or base64. */
|
|
25
|
+
encoding?: 'url' | 'base64';
|
|
26
|
+
/** Optional caption or alt text. */
|
|
27
|
+
caption?: string;
|
|
28
|
+
/** Original filename if applicable. */
|
|
29
|
+
filename?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Category of media content. */
|
|
32
|
+
export type MediaCategory = 'image' | 'pdf' | 'audio' | 'video' | 'unknown';
|
|
33
|
+
/**
|
|
34
|
+
* Classifies a media block by its MIME type.
|
|
35
|
+
* @param media - The media block to classify.
|
|
36
|
+
* @returns The media category.
|
|
37
|
+
*/
|
|
38
|
+
export declare function classifyMediaBlock(media: MediaBlock): MediaCategory;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan:PLAN-20260608-ISSUE1585.P05
|
|
3
|
+
* @requirement:REQ-API-001, REQ-TEMPORARY-INTERFACES
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Classifies a media block by its MIME type.
|
|
7
|
+
* @param media - The media block to classify.
|
|
8
|
+
* @returns The media category.
|
|
9
|
+
*/
|
|
10
|
+
export function classifyMediaBlock(media) {
|
|
11
|
+
const mime = media.mimeType.toLowerCase();
|
|
12
|
+
if (mime.startsWith('image/'))
|
|
13
|
+
return 'image';
|
|
14
|
+
if (mime === 'application/pdf')
|
|
15
|
+
return 'pdf';
|
|
16
|
+
if (mime.startsWith('audio/'))
|
|
17
|
+
return 'audio';
|
|
18
|
+
if (mime.startsWith('video/'))
|
|
19
|
+
return 'video';
|
|
20
|
+
return 'unknown';
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mediaUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaUtils.js","sourceRoot":"","sources":["../../../src/utils/mediaUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9C,IAAI,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare function isPathWithinWorkspace(workspaceRoots: readonly string[], inputPath: string): boolean;
|
|
7
|
+
export declare function validatePathWithinWorkspace(workspaceRoots: readonly string[], inputPath: string, pathTypeLabel?: string): string | null;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
function normalizeWorkspacePath(candidatePath) {
|
|
9
|
+
const resolvedPath = path.resolve(candidatePath);
|
|
10
|
+
try {
|
|
11
|
+
return fs.realpathSync.native(resolvedPath);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
const parentPath = path.dirname(resolvedPath);
|
|
15
|
+
if (parentPath === resolvedPath) {
|
|
16
|
+
return resolvedPath;
|
|
17
|
+
}
|
|
18
|
+
const normalizedParent = normalizeWorkspacePath(parentPath);
|
|
19
|
+
return path.join(normalizedParent, path.basename(resolvedPath));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function isPathWithinWorkspace(workspaceRoots, inputPath) {
|
|
23
|
+
const resolvedInput = normalizeWorkspacePath(inputPath);
|
|
24
|
+
return workspaceRoots.some((root) => {
|
|
25
|
+
const resolvedRoot = normalizeWorkspacePath(root);
|
|
26
|
+
const relative = path.relative(resolvedRoot, resolvedInput);
|
|
27
|
+
return (relative === '' ||
|
|
28
|
+
(!relative.startsWith(`..${path.sep}`) &&
|
|
29
|
+
relative !== '..' &&
|
|
30
|
+
!path.isAbsolute(relative)));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export function validatePathWithinWorkspace(workspaceRoots, inputPath, pathTypeLabel = 'File path') {
|
|
34
|
+
if (isPathWithinWorkspace(workspaceRoots, inputPath)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return `${pathTypeLabel} must be within one of the workspace directories: ${workspaceRoots.join(', ')}`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=pathValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathValidation.js","sourceRoot":"","sources":["../../../src/utils/pathValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,sBAAsB,CAAC,aAAqB;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,cAAiC,EACjC,SAAiB;IAEjB,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACxD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,OAAO,CACL,QAAQ,KAAK,EAAE;YACf,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpC,QAAQ,KAAK,IAAI;gBACjB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,cAAiC,EACjC,SAAiB,EACjB,gBAAwB,WAAW;IAEnC,IAAI,qBAAqB,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,aAAa,qDAAqD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1G,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
function simpleTruncate(filePath, maxLen) {
|
|
8
|
+
const keepLen = Math.floor((maxLen - 3) / 2);
|
|
9
|
+
if (keepLen <= 0) {
|
|
10
|
+
return filePath.substring(0, maxLen - 3) + '...';
|
|
11
|
+
}
|
|
12
|
+
const start = filePath.substring(0, keepLen);
|
|
13
|
+
const end = filePath.substring(filePath.length - keepLen);
|
|
14
|
+
return `${start}...${end}`;
|
|
15
|
+
}
|
|
16
|
+
function truncateComponent(component, targetLength, mode) {
|
|
17
|
+
if (component.length <= targetLength)
|
|
18
|
+
return component;
|
|
19
|
+
if (targetLength <= 0)
|
|
20
|
+
return '';
|
|
21
|
+
if (targetLength <= 3) {
|
|
22
|
+
if (mode === 'end')
|
|
23
|
+
return component.slice(-targetLength);
|
|
24
|
+
return component.slice(0, targetLength);
|
|
25
|
+
}
|
|
26
|
+
if (mode === 'start') {
|
|
27
|
+
return `${component.slice(0, targetLength - 3)}...`;
|
|
28
|
+
}
|
|
29
|
+
if (mode === 'end') {
|
|
30
|
+
return `...${component.slice(component.length - (targetLength - 3))}`;
|
|
31
|
+
}
|
|
32
|
+
const front = Math.ceil((targetLength - 3) / 2);
|
|
33
|
+
const back = targetLength - 3 - front;
|
|
34
|
+
return `${component.slice(0, front)}...${component.slice(component.length - back)}`;
|
|
35
|
+
}
|
|
36
|
+
function trailingFallback(root, separator, lastSegment, maxLen, filePath) {
|
|
37
|
+
const ellipsisTail = `...${separator}${lastSegment}`;
|
|
38
|
+
if (ellipsisTail.length <= maxLen)
|
|
39
|
+
return ellipsisTail;
|
|
40
|
+
if (root) {
|
|
41
|
+
const rootEllipsisTail = `${root}...${separator}${lastSegment}`;
|
|
42
|
+
if (rootEllipsisTail.length <= maxLen)
|
|
43
|
+
return rootEllipsisTail;
|
|
44
|
+
}
|
|
45
|
+
if (root && `${root}${lastSegment}`.length <= maxLen) {
|
|
46
|
+
return `${root}${lastSegment}`;
|
|
47
|
+
}
|
|
48
|
+
if (lastSegment.length <= maxLen)
|
|
49
|
+
return lastSegment;
|
|
50
|
+
return simpleTruncate(filePath, maxLen);
|
|
51
|
+
}
|
|
52
|
+
function computeEndPartSegments(segments, startComponent, separator, maxLen) {
|
|
53
|
+
const lastSegment = segments[segments.length - 1];
|
|
54
|
+
const endPartSegments = [lastSegment];
|
|
55
|
+
let endPartLength = lastSegment.length;
|
|
56
|
+
for (let i = segments.length - 2; i > 0; i--) {
|
|
57
|
+
const segment = segments[i];
|
|
58
|
+
const newLength = startComponent.length +
|
|
59
|
+
separator.length +
|
|
60
|
+
3 +
|
|
61
|
+
separator.length +
|
|
62
|
+
endPartLength +
|
|
63
|
+
separator.length +
|
|
64
|
+
segment.length;
|
|
65
|
+
if (newLength <= maxLen) {
|
|
66
|
+
endPartSegments.unshift(segment);
|
|
67
|
+
endPartLength += separator.length + segment.length;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return endPartSegments;
|
|
74
|
+
}
|
|
75
|
+
function computeBudgets(components, minLengths, availableForComponents) {
|
|
76
|
+
const budgets = components.map((component) => component.length);
|
|
77
|
+
let currentTotal = budgets.reduce((sum, len) => sum + len, 0);
|
|
78
|
+
while (currentTotal > availableForComponents) {
|
|
79
|
+
let bestIndex = -1;
|
|
80
|
+
let bestScore = -Infinity;
|
|
81
|
+
for (let i = 0; i < budgets.length; i++) {
|
|
82
|
+
if (budgets[i] <= minLengths[i])
|
|
83
|
+
continue;
|
|
84
|
+
const isLast = i === budgets.length - 1;
|
|
85
|
+
const score = (isLast ? 0 : 1_000_000) + budgets[i];
|
|
86
|
+
if (score > bestScore) {
|
|
87
|
+
bestScore = score;
|
|
88
|
+
bestIndex = i;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (bestIndex === -1)
|
|
92
|
+
return null;
|
|
93
|
+
budgets[bestIndex]--;
|
|
94
|
+
currentTotal--;
|
|
95
|
+
}
|
|
96
|
+
return budgets;
|
|
97
|
+
}
|
|
98
|
+
export function shortenPath(filePath, maxLen = 35) {
|
|
99
|
+
if (filePath.length <= maxLen) {
|
|
100
|
+
return filePath;
|
|
101
|
+
}
|
|
102
|
+
const parsedPath = path.parse(filePath);
|
|
103
|
+
const root = parsedPath.root;
|
|
104
|
+
const separator = path.sep;
|
|
105
|
+
const relativePath = filePath.substring(root.length);
|
|
106
|
+
const segments = relativePath.split(separator).filter((s) => s !== '');
|
|
107
|
+
if (segments.length <= 1) {
|
|
108
|
+
return simpleTruncate(filePath, maxLen);
|
|
109
|
+
}
|
|
110
|
+
const firstDir = segments[0];
|
|
111
|
+
const lastSegment = segments[segments.length - 1];
|
|
112
|
+
const startComponent = root + firstDir;
|
|
113
|
+
const endPartSegments = computeEndPartSegments(segments, startComponent, separator, maxLen);
|
|
114
|
+
const components = [firstDir, ...endPartSegments];
|
|
115
|
+
const componentModes = components.map((_, index) => {
|
|
116
|
+
if (index === 0)
|
|
117
|
+
return 'start';
|
|
118
|
+
if (index === components.length - 1)
|
|
119
|
+
return 'end';
|
|
120
|
+
return 'center';
|
|
121
|
+
});
|
|
122
|
+
const separatorsCount = endPartSegments.length + 1;
|
|
123
|
+
const fixedLen = root.length + separatorsCount * separator.length + 3;
|
|
124
|
+
const availableForComponents = maxLen - fixedLen;
|
|
125
|
+
if (availableForComponents <= 0) {
|
|
126
|
+
return trailingFallback(root, separator, lastSegment, maxLen, filePath);
|
|
127
|
+
}
|
|
128
|
+
const minLengths = components.map((component, index) => {
|
|
129
|
+
if (index === 0)
|
|
130
|
+
return Math.min(component.length, 1);
|
|
131
|
+
if (index === components.length - 1)
|
|
132
|
+
return component.length;
|
|
133
|
+
return Math.min(component.length, 1);
|
|
134
|
+
});
|
|
135
|
+
const minTotal = minLengths.reduce((sum, len) => sum + len, 0);
|
|
136
|
+
if (availableForComponents < minTotal) {
|
|
137
|
+
return trailingFallback(root, separator, lastSegment, maxLen, filePath);
|
|
138
|
+
}
|
|
139
|
+
const budgets = computeBudgets(components, minLengths, availableForComponents);
|
|
140
|
+
if (budgets === null) {
|
|
141
|
+
return trailingFallback(root, separator, lastSegment, maxLen, filePath);
|
|
142
|
+
}
|
|
143
|
+
const truncatedComponents = components.map((component, index) => truncateComponent(component, budgets[index], componentModes[index]));
|
|
144
|
+
const truncatedFirst = truncatedComponents[0];
|
|
145
|
+
const truncatedEnd = truncatedComponents.slice(1).join(separator);
|
|
146
|
+
const result = `${root}${truncatedFirst}${separator}...${separator}${truncatedEnd}`;
|
|
147
|
+
if (result.length > maxLen) {
|
|
148
|
+
return trailingFallback(root, separator, lastSegment, maxLen, filePath);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
export function makeRelative(targetPath, rootDirectory) {
|
|
153
|
+
const resolvedTargetPath = path.resolve(targetPath);
|
|
154
|
+
const resolvedRootDirectory = path.resolve(rootDirectory);
|
|
155
|
+
const relativePath = path.relative(resolvedRootDirectory, resolvedTargetPath);
|
|
156
|
+
return relativePath || '.';
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export type ResolvedSearchTarget = {
|
|
7
|
+
readonly kind: 'all-workspaces';
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'directory';
|
|
10
|
+
readonly searchDir: string;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'file';
|
|
13
|
+
readonly filePath: string;
|
|
14
|
+
readonly parentDir: string;
|
|
15
|
+
readonly basename: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function resolveTextSearchTarget(targetDir: string, workspaceRoots: readonly string[], relativePath?: string): ResolvedSearchTarget;
|