@gguf/coder 0.2.9 → 0.3.1
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/.editorconfig +16 -0
- package/.env.example +63 -0
- package/.gitattributes +1 -0
- package/.semgrepignore +19 -0
- package/coder-dummy-file.ts +52 -0
- package/coder.config.example.json +59 -0
- package/coder.config.json +13 -0
- package/color_picker.html +36 -0
- package/dist/tools/execute-bash.js +3 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/fetch-url.js +3 -3
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +1 -1
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +1 -1
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +6 -6
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +1 -1
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/string-replace.js +11 -11
- package/dist/tools/string-replace.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +3 -3
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write-file.js +4 -4
- package/dist/tools/write-file.js.map +1 -1
- package/dist/utils/tool-result-display.d.ts.map +1 -1
- package/dist/utils/tool-result-display.js +3 -3
- package/dist/utils/tool-result-display.js.map +1 -1
- package/package.json +2 -14
- package/scripts/extract-changelog.js +73 -0
- package/scripts/fetch-models.js +143 -0
- package/scripts/test.sh +40 -0
- package/scripts/update-homebrew-formula.sh +125 -0
- package/scripts/update-nix-version.sh +157 -0
- package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
- package/source/ai-sdk-client/AISDKClient.ts +155 -0
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
- package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
- package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
- package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
- package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
- package/source/ai-sdk-client/converters/message-converter.ts +113 -0
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
- package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
- package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
- package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
- package/source/ai-sdk-client/index.ts +7 -0
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
- package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
- package/source/ai-sdk-client/types.ts +9 -0
- package/source/ai-sdk-client-empty-message.spec.ts +141 -0
- package/source/ai-sdk-client-error-handling.spec.ts +186 -0
- package/source/ai-sdk-client-maxretries.spec.ts +114 -0
- package/source/ai-sdk-client-preparestep.spec.ts +279 -0
- package/source/app/App.spec.tsx +32 -0
- package/source/app/App.tsx +480 -0
- package/source/app/components/AppContainer.spec.tsx +96 -0
- package/source/app/components/AppContainer.tsx +56 -0
- package/source/app/components/ChatInterface.spec.tsx +163 -0
- package/source/app/components/ChatInterface.tsx +144 -0
- package/source/app/components/ModalSelectors.spec.tsx +141 -0
- package/source/app/components/ModalSelectors.tsx +135 -0
- package/source/app/helpers.spec.ts +97 -0
- package/source/app/helpers.ts +63 -0
- package/source/app/index.ts +4 -0
- package/source/app/types.ts +39 -0
- package/source/app/utils/appUtils.ts +294 -0
- package/source/app/utils/conversationState.ts +310 -0
- package/source/app.spec.tsx +244 -0
- package/source/cli.spec.ts +73 -0
- package/source/cli.tsx +51 -0
- package/source/client-factory.spec.ts +48 -0
- package/source/client-factory.ts +178 -0
- package/source/command-parser.spec.ts +127 -0
- package/source/command-parser.ts +36 -0
- package/source/commands/checkpoint.spec.tsx +277 -0
- package/source/commands/checkpoint.tsx +366 -0
- package/source/commands/clear.tsx +22 -0
- package/source/commands/custom-commands.tsx +121 -0
- package/source/commands/exit.ts +21 -0
- package/source/commands/export.spec.tsx +131 -0
- package/source/commands/export.tsx +79 -0
- package/source/commands/help.tsx +120 -0
- package/source/commands/index.ts +17 -0
- package/source/commands/init.tsx +339 -0
- package/source/commands/lsp-command.spec.tsx +281 -0
- package/source/commands/lsp.tsx +120 -0
- package/source/commands/mcp-command.spec.tsx +313 -0
- package/source/commands/mcp.tsx +162 -0
- package/source/commands/model-database.spec.tsx +758 -0
- package/source/commands/model-database.tsx +418 -0
- package/source/commands/model.ts +12 -0
- package/source/commands/provider.ts +12 -0
- package/source/commands/setup-config.tsx +16 -0
- package/source/commands/simple-commands.spec.tsx +175 -0
- package/source/commands/status.ts +12 -0
- package/source/commands/theme.ts +12 -0
- package/source/commands/update.spec.tsx +261 -0
- package/source/commands/update.tsx +201 -0
- package/source/commands/usage.spec.tsx +495 -0
- package/source/commands/usage.tsx +100 -0
- package/source/commands.spec.ts +436 -0
- package/source/commands.ts +83 -0
- package/source/components/assistant-message.spec.tsx +796 -0
- package/source/components/assistant-message.tsx +34 -0
- package/source/components/bash-execution-indicator.tsx +21 -0
- package/source/components/cancelling-indicator.tsx +16 -0
- package/source/components/chat-queue.spec.tsx +83 -0
- package/source/components/chat-queue.tsx +36 -0
- package/source/components/checkpoint-display.spec.tsx +219 -0
- package/source/components/checkpoint-display.tsx +126 -0
- package/source/components/checkpoint-selector.spec.tsx +173 -0
- package/source/components/checkpoint-selector.tsx +173 -0
- package/source/components/development-mode-indicator.spec.tsx +268 -0
- package/source/components/development-mode-indicator.tsx +38 -0
- package/source/components/message-box.spec.tsx +427 -0
- package/source/components/message-box.tsx +87 -0
- package/source/components/model-selector.tsx +132 -0
- package/source/components/provider-selector.tsx +75 -0
- package/source/components/random-spinner.tsx +19 -0
- package/source/components/security-disclaimer.tsx +73 -0
- package/source/components/status-connection-display.spec.tsx +133 -0
- package/source/components/status.tsx +267 -0
- package/source/components/theme-selector.tsx +126 -0
- package/source/components/tool-confirmation.tsx +190 -0
- package/source/components/tool-execution-indicator.tsx +33 -0
- package/source/components/tool-message.tsx +85 -0
- package/source/components/ui/titled-box.spec.tsx +207 -0
- package/source/components/ui/titled-box.tsx +57 -0
- package/source/components/usage/progress-bar.spec.tsx +398 -0
- package/source/components/usage/progress-bar.tsx +30 -0
- package/source/components/usage/usage-display.spec.tsx +780 -0
- package/source/components/usage/usage-display.tsx +291 -0
- package/source/components/user-input.spec.tsx +327 -0
- package/source/components/user-input.tsx +533 -0
- package/source/components/user-message.spec.tsx +230 -0
- package/source/components/user-message.tsx +84 -0
- package/source/components/welcome-message.tsx +76 -0
- package/source/config/env-substitution.ts +65 -0
- package/source/config/index.spec.ts +171 -0
- package/source/config/index.ts +154 -0
- package/source/config/paths.spec.ts +241 -0
- package/source/config/paths.ts +55 -0
- package/source/config/preferences.ts +51 -0
- package/source/config/themes.ts +315 -0
- package/source/constants.ts +130 -0
- package/source/context/mode-context.spec.ts +79 -0
- package/source/context/mode-context.ts +24 -0
- package/source/custom-commands/executor.spec.ts +142 -0
- package/source/custom-commands/executor.ts +64 -0
- package/source/custom-commands/loader.spec.ts +314 -0
- package/source/custom-commands/loader.ts +153 -0
- package/source/custom-commands/parser.ts +196 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
- package/source/hooks/chat-handler/index.ts +12 -0
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
- package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
- package/source/hooks/chat-handler/types.ts +38 -0
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
- package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
- package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
- package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
- package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
- package/source/hooks/useAppHandlers.tsx +291 -0
- package/source/hooks/useAppInitialization.tsx +422 -0
- package/source/hooks/useAppState.tsx +311 -0
- package/source/hooks/useDirectoryTrust.tsx +98 -0
- package/source/hooks/useInputState.ts +414 -0
- package/source/hooks/useModeHandlers.tsx +302 -0
- package/source/hooks/useNonInteractiveMode.ts +140 -0
- package/source/hooks/useTerminalWidth.tsx +81 -0
- package/source/hooks/useTheme.ts +18 -0
- package/source/hooks/useToolHandler.tsx +349 -0
- package/source/hooks/useUIState.ts +61 -0
- package/source/init/agents-template-generator.ts +421 -0
- package/source/init/existing-rules-extractor.ts +319 -0
- package/source/init/file-scanner.spec.ts +227 -0
- package/source/init/file-scanner.ts +238 -0
- package/source/init/framework-detector.ts +382 -0
- package/source/init/language-detector.ts +269 -0
- package/source/init/project-analyzer.spec.ts +231 -0
- package/source/init/project-analyzer.ts +458 -0
- package/source/lsp/index.ts +31 -0
- package/source/lsp/lsp-client.spec.ts +508 -0
- package/source/lsp/lsp-client.ts +487 -0
- package/source/lsp/lsp-manager.spec.ts +477 -0
- package/source/lsp/lsp-manager.ts +419 -0
- package/source/lsp/protocol.spec.ts +502 -0
- package/source/lsp/protocol.ts +360 -0
- package/source/lsp/server-discovery.spec.ts +654 -0
- package/source/lsp/server-discovery.ts +515 -0
- package/source/markdown-parser/html-entities.spec.ts +88 -0
- package/source/markdown-parser/html-entities.ts +45 -0
- package/source/markdown-parser/index.spec.ts +281 -0
- package/source/markdown-parser/index.ts +126 -0
- package/source/markdown-parser/table-parser.spec.ts +133 -0
- package/source/markdown-parser/table-parser.ts +114 -0
- package/source/markdown-parser/utils.spec.ts +70 -0
- package/source/markdown-parser/utils.ts +13 -0
- package/source/mcp/mcp-client.spec.ts +81 -0
- package/source/mcp/mcp-client.ts +625 -0
- package/source/mcp/transport-factory.spec.ts +406 -0
- package/source/mcp/transport-factory.ts +312 -0
- package/source/message-handler.ts +67 -0
- package/source/model-database/database-engine.spec.ts +494 -0
- package/source/model-database/database-engine.ts +50 -0
- package/source/model-database/model-database.spec.ts +363 -0
- package/source/model-database/model-database.ts +91 -0
- package/source/model-database/model-engine.spec.ts +447 -0
- package/source/model-database/model-engine.ts +65 -0
- package/source/model-database/model-fetcher.spec.ts +583 -0
- package/source/model-database/model-fetcher.ts +330 -0
- package/source/models/index.ts +1 -0
- package/source/models/models-cache.spec.ts +214 -0
- package/source/models/models-cache.ts +78 -0
- package/source/models/models-dev-client.spec.ts +379 -0
- package/source/models/models-dev-client.ts +329 -0
- package/source/models/models-types.ts +68 -0
- package/source/prompt-history.ts +155 -0
- package/source/security/command-injection.spec.ts +240 -0
- package/source/services/checkpoint-manager.spec.ts +523 -0
- package/source/services/checkpoint-manager.ts +466 -0
- package/source/services/file-snapshot.spec.ts +569 -0
- package/source/services/file-snapshot.ts +220 -0
- package/source/test-utils/render-with-theme.tsx +48 -0
- package/source/tokenization/index.ts +1 -0
- package/source/tokenization/tokenizer-factory.spec.ts +170 -0
- package/source/tokenization/tokenizer-factory.ts +125 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
- package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
- package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
- package/source/tool-calling/index.ts +5 -0
- package/source/tool-calling/json-parser.spec.ts +639 -0
- package/source/tool-calling/json-parser.ts +247 -0
- package/source/tool-calling/tool-parser.spec.ts +395 -0
- package/source/tool-calling/tool-parser.ts +120 -0
- package/source/tool-calling/xml-parser.spec.ts +662 -0
- package/source/tool-calling/xml-parser.ts +289 -0
- package/source/tools/execute-bash.spec.tsx +353 -0
- package/source/tools/execute-bash.tsx +219 -0
- package/source/tools/execute-function.spec.ts +130 -0
- package/source/tools/fetch-url.spec.tsx +342 -0
- package/source/tools/fetch-url.tsx +172 -0
- package/source/tools/find-files.spec.tsx +924 -0
- package/source/tools/find-files.tsx +293 -0
- package/source/tools/index.ts +102 -0
- package/source/tools/lsp-get-diagnostics.tsx +192 -0
- package/source/tools/needs-approval.spec.ts +282 -0
- package/source/tools/read-file.spec.tsx +801 -0
- package/source/tools/read-file.tsx +387 -0
- package/source/tools/search-file-contents.spec.tsx +1273 -0
- package/source/tools/search-file-contents.tsx +293 -0
- package/source/tools/string-replace.spec.tsx +730 -0
- package/source/tools/string-replace.tsx +548 -0
- package/source/tools/tool-manager.ts +210 -0
- package/source/tools/tool-registry.spec.ts +415 -0
- package/source/tools/tool-registry.ts +228 -0
- package/source/tools/web-search.tsx +223 -0
- package/source/tools/write-file.spec.tsx +559 -0
- package/source/tools/write-file.tsx +228 -0
- package/source/types/app.ts +37 -0
- package/source/types/checkpoint.ts +48 -0
- package/source/types/commands.ts +46 -0
- package/source/types/components.ts +27 -0
- package/source/types/config.ts +103 -0
- package/source/types/core-connection-status.spec.ts +67 -0
- package/source/types/core.ts +181 -0
- package/source/types/hooks.ts +50 -0
- package/source/types/index.ts +12 -0
- package/source/types/markdown-parser.ts +11 -0
- package/source/types/mcp.ts +52 -0
- package/source/types/system.ts +16 -0
- package/source/types/tokenization.ts +41 -0
- package/source/types/ui.ts +40 -0
- package/source/types/usage.ts +58 -0
- package/source/types/utils.ts +16 -0
- package/source/usage/calculator.spec.ts +385 -0
- package/source/usage/calculator.ts +104 -0
- package/source/usage/storage.spec.ts +703 -0
- package/source/usage/storage.ts +238 -0
- package/source/usage/tracker.spec.ts +456 -0
- package/source/usage/tracker.ts +102 -0
- package/source/utils/atomic-deletion.spec.ts +194 -0
- package/source/utils/atomic-deletion.ts +127 -0
- package/source/utils/bounded-map.spec.ts +300 -0
- package/source/utils/bounded-map.ts +193 -0
- package/source/utils/checkpoint-utils.spec.ts +222 -0
- package/source/utils/checkpoint-utils.ts +92 -0
- package/source/utils/error-formatter.spec.ts +169 -0
- package/source/utils/error-formatter.ts +194 -0
- package/source/utils/file-autocomplete.spec.ts +173 -0
- package/source/utils/file-autocomplete.ts +196 -0
- package/source/utils/file-cache.spec.ts +309 -0
- package/source/utils/file-cache.ts +195 -0
- package/source/utils/file-content-loader.spec.ts +180 -0
- package/source/utils/file-content-loader.ts +179 -0
- package/source/utils/file-mention-handler.spec.ts +261 -0
- package/source/utils/file-mention-handler.ts +84 -0
- package/source/utils/file-mention-parser.spec.ts +182 -0
- package/source/utils/file-mention-parser.ts +170 -0
- package/source/utils/fuzzy-matching.spec.ts +149 -0
- package/source/utils/fuzzy-matching.ts +146 -0
- package/source/utils/indentation-normalizer.spec.ts +216 -0
- package/source/utils/indentation-normalizer.ts +76 -0
- package/source/utils/installation-detector.spec.ts +178 -0
- package/source/utils/installation-detector.ts +153 -0
- package/source/utils/logging/config.spec.ts +311 -0
- package/source/utils/logging/config.ts +210 -0
- package/source/utils/logging/console-facade.spec.ts +184 -0
- package/source/utils/logging/console-facade.ts +384 -0
- package/source/utils/logging/correlation.spec.ts +679 -0
- package/source/utils/logging/correlation.ts +474 -0
- package/source/utils/logging/formatters.spec.ts +464 -0
- package/source/utils/logging/formatters.ts +207 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
- package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
- package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
- package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
- package/source/utils/logging/health-monitor/index.ts +15 -0
- package/source/utils/logging/health-monitor/instances.ts +48 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
- package/source/utils/logging/health-monitor/types.ts +126 -0
- package/source/utils/logging/index.spec.ts +284 -0
- package/source/utils/logging/index.ts +236 -0
- package/source/utils/logging/integration.spec.ts +441 -0
- package/source/utils/logging/log-method-factory.spec.ts +573 -0
- package/source/utils/logging/log-method-factory.ts +233 -0
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
- package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
- package/source/utils/logging/log-query/index.ts +23 -0
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
- package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
- package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
- package/source/utils/logging/log-query/query/query-builder.ts +151 -0
- package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
- package/source/utils/logging/log-query/query/query-engine.ts +45 -0
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
- package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
- package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
- package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
- package/source/utils/logging/log-query/types.ts +163 -0
- package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
- package/source/utils/logging/log-query/utils/helpers.ts +72 -0
- package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
- package/source/utils/logging/log-query/utils/sorting.ts +61 -0
- package/source/utils/logging/logger-provider.spec.ts +262 -0
- package/source/utils/logging/logger-provider.ts +362 -0
- package/source/utils/logging/performance.spec.ts +209 -0
- package/source/utils/logging/performance.ts +757 -0
- package/source/utils/logging/pino-logger.spec.ts +425 -0
- package/source/utils/logging/pino-logger.ts +514 -0
- package/source/utils/logging/redaction.spec.ts +490 -0
- package/source/utils/logging/redaction.ts +267 -0
- package/source/utils/logging/request-tracker.spec.ts +1198 -0
- package/source/utils/logging/request-tracker.ts +803 -0
- package/source/utils/logging/transports.spec.ts +505 -0
- package/source/utils/logging/transports.ts +305 -0
- package/source/utils/logging/types.ts +216 -0
- package/source/utils/message-builder.spec.ts +179 -0
- package/source/utils/message-builder.ts +101 -0
- package/source/utils/message-queue.tsx +486 -0
- package/source/utils/paste-detection.spec.ts +69 -0
- package/source/utils/paste-detection.ts +124 -0
- package/source/utils/paste-roundtrip.spec.ts +442 -0
- package/source/utils/paste-utils.spec.ts +128 -0
- package/source/utils/paste-utils.ts +52 -0
- package/source/utils/programming-language-helper.spec.ts +74 -0
- package/source/utils/programming-language-helper.ts +32 -0
- package/source/utils/prompt-assembly.spec.ts +221 -0
- package/source/utils/prompt-processor.ts +173 -0
- package/source/utils/tool-args-parser.spec.ts +136 -0
- package/source/utils/tool-args-parser.ts +54 -0
- package/source/utils/tool-cancellation.spec.ts +230 -0
- package/source/utils/tool-cancellation.ts +28 -0
- package/source/utils/tool-result-display.spec.tsx +469 -0
- package/source/utils/tool-result-display.tsx +90 -0
- package/source/utils/update-checker.spec.ts +383 -0
- package/source/utils/update-checker.ts +183 -0
- package/source/wizard/config-wizard.spec.tsx +103 -0
- package/source/wizard/config-wizard.tsx +382 -0
- package/source/wizard/steps/location-step.spec.tsx +186 -0
- package/source/wizard/steps/location-step.tsx +147 -0
- package/source/wizard/steps/mcp-step.spec.tsx +607 -0
- package/source/wizard/steps/mcp-step.tsx +632 -0
- package/source/wizard/steps/provider-step.spec.tsx +342 -0
- package/source/wizard/steps/provider-step.tsx +957 -0
- package/source/wizard/steps/summary-step.spec.tsx +749 -0
- package/source/wizard/steps/summary-step.tsx +228 -0
- package/source/wizard/templates/mcp-templates.spec.ts +613 -0
- package/source/wizard/templates/mcp-templates.ts +570 -0
- package/source/wizard/templates/provider-templates.spec.ts +152 -0
- package/source/wizard/templates/provider-templates.ts +485 -0
- package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
- package/source/wizard/utils/fetch-cloud-models.ts +223 -0
- package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
- package/source/wizard/utils/fetch-local-models.ts +192 -0
- package/source/wizard/validation-array.spec.ts +264 -0
- package/source/wizard/validation.spec.ts +373 -0
- package/source/wizard/validation.ts +232 -0
- package/source/app/prompts/main-prompt.md +0 -122
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import ignore from 'ignore';
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
|
|
9
|
+
import ToolMessage from '@/components/tool-message';
|
|
10
|
+
import {
|
|
11
|
+
BUFFER_FIND_FILES_BYTES,
|
|
12
|
+
DEFAULT_FIND_FILES_RESULTS,
|
|
13
|
+
MAX_FIND_FILES_RESULTS,
|
|
14
|
+
} from '@/constants';
|
|
15
|
+
import { ThemeContext } from '@/hooks/useTheme';
|
|
16
|
+
import { jsonSchema, tool } from '@/types/core';
|
|
17
|
+
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Load and parse .gitignore file, returns an ignore instance
|
|
22
|
+
*/
|
|
23
|
+
function loadGitignore(cwd: string): ReturnType<typeof ignore> {
|
|
24
|
+
const ig = ignore();
|
|
25
|
+
const gitignorePath = join(cwd, '.gitignore');
|
|
26
|
+
|
|
27
|
+
// Always ignore common directories
|
|
28
|
+
ig.add([
|
|
29
|
+
'node_modules',
|
|
30
|
+
'.git',
|
|
31
|
+
'dist',
|
|
32
|
+
'build',
|
|
33
|
+
'coverage',
|
|
34
|
+
'.next',
|
|
35
|
+
'.nuxt',
|
|
36
|
+
'out',
|
|
37
|
+
'.cache',
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
// Load .gitignore if it exists
|
|
41
|
+
if (existsSync(gitignorePath)) {
|
|
42
|
+
try {
|
|
43
|
+
const gitignoreContent = readFileSync(gitignorePath, 'utf-8');
|
|
44
|
+
ig.add(gitignoreContent);
|
|
45
|
+
} catch {
|
|
46
|
+
// Silently fail if we can't read .gitignore
|
|
47
|
+
// The hardcoded ignores above will still apply
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return ig;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Find files matching a glob pattern using find command
|
|
56
|
+
*/
|
|
57
|
+
async function findFilesByPattern(
|
|
58
|
+
pattern: string,
|
|
59
|
+
cwd: string,
|
|
60
|
+
maxResults: number,
|
|
61
|
+
): Promise<{ files: string[]; truncated: boolean }> {
|
|
62
|
+
try {
|
|
63
|
+
const ig = loadGitignore(cwd);
|
|
64
|
+
|
|
65
|
+
// Build find arguments array to prevent command injection
|
|
66
|
+
const findArgs: string[] = ['.'];
|
|
67
|
+
|
|
68
|
+
if (pattern.includes('{') && pattern.includes('}')) {
|
|
69
|
+
// Handle brace expansion like *.{ts,tsx}
|
|
70
|
+
const braceMatch = pattern.match(/\{([^}]+)\}/);
|
|
71
|
+
if (braceMatch) {
|
|
72
|
+
const extensions = braceMatch[1].split(',');
|
|
73
|
+
// Build: ( -name "*.ext1" -o -name "*.ext2" )
|
|
74
|
+
findArgs.push('(');
|
|
75
|
+
for (let i = 0; i < extensions.length; i++) {
|
|
76
|
+
if (i > 0) {
|
|
77
|
+
findArgs.push('-o');
|
|
78
|
+
}
|
|
79
|
+
findArgs.push('-name', `*.${extensions[i].trim()}`);
|
|
80
|
+
}
|
|
81
|
+
findArgs.push(')');
|
|
82
|
+
}
|
|
83
|
+
} else if (pattern.startsWith('**/')) {
|
|
84
|
+
// Pattern like **/*.ts - search everywhere
|
|
85
|
+
const namePattern = pattern.replace('**/', '');
|
|
86
|
+
findArgs.push('-name', namePattern);
|
|
87
|
+
} else if (pattern.includes('/**')) {
|
|
88
|
+
// Pattern like scripts/** or scripts/**/*.ts - search within a directory
|
|
89
|
+
const parts = pattern.split('/**');
|
|
90
|
+
const pathPrefix = `./${parts[0]}`;
|
|
91
|
+
const namePattern = parts[1] ? parts[1].replace(/^\//, '') : '*';
|
|
92
|
+
|
|
93
|
+
// Replace the starting '.' with pathPrefix
|
|
94
|
+
findArgs[0] = pathPrefix;
|
|
95
|
+
|
|
96
|
+
if (namePattern !== '*' && namePattern !== '') {
|
|
97
|
+
findArgs.push('-name', namePattern);
|
|
98
|
+
}
|
|
99
|
+
} else if (pattern.includes('/') && pattern.includes('*')) {
|
|
100
|
+
// Pattern like source/tools/*.ts - has both path and wildcard
|
|
101
|
+
// Split into directory path and filename pattern
|
|
102
|
+
const lastSlashIndex = pattern.lastIndexOf('/');
|
|
103
|
+
const dirPath = pattern.substring(0, lastSlashIndex);
|
|
104
|
+
const filePattern = pattern.substring(lastSlashIndex + 1);
|
|
105
|
+
|
|
106
|
+
// Start search from the directory
|
|
107
|
+
findArgs[0] = `./${dirPath}`;
|
|
108
|
+
// Only descend one level (maxdepth 1) to match the specific directory
|
|
109
|
+
findArgs.push('-maxdepth', '1', '-name', filePattern);
|
|
110
|
+
} else if (pattern.includes('*')) {
|
|
111
|
+
// Simple pattern like *.ts
|
|
112
|
+
findArgs.push('-name', pattern);
|
|
113
|
+
} else {
|
|
114
|
+
// Exact path or directory name
|
|
115
|
+
findArgs.push('-name', pattern);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Add exclusions
|
|
119
|
+
const exclusions = [
|
|
120
|
+
'*/node_modules/*',
|
|
121
|
+
'*/.git/*',
|
|
122
|
+
'*/dist/*',
|
|
123
|
+
'*/build/*',
|
|
124
|
+
'*/coverage/*',
|
|
125
|
+
'*/.next/*',
|
|
126
|
+
'*/.nuxt/*',
|
|
127
|
+
'*/out/*',
|
|
128
|
+
'*/.cache/*',
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
for (const exclusion of exclusions) {
|
|
132
|
+
findArgs.push('-not', '-path', exclusion);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Execute find command with array-based arguments
|
|
136
|
+
const { stdout } = await execFileAsync('find', findArgs, {
|
|
137
|
+
cwd,
|
|
138
|
+
maxBuffer: BUFFER_FIND_FILES_BYTES,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const allPaths = stdout
|
|
142
|
+
.trim()
|
|
143
|
+
.split('\n')
|
|
144
|
+
.filter(Boolean)
|
|
145
|
+
.map(line => line.replace(/^\.\//, ''))
|
|
146
|
+
.filter(path => path && path !== '.');
|
|
147
|
+
|
|
148
|
+
// Filter using gitignore and limit results
|
|
149
|
+
const paths: string[] = [];
|
|
150
|
+
for (const path of allPaths) {
|
|
151
|
+
if (!ig.ignores(path)) {
|
|
152
|
+
paths.push(path);
|
|
153
|
+
|
|
154
|
+
if (paths.length >= maxResults) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
files: paths,
|
|
162
|
+
truncated: allPaths.length >= maxResults || paths.length >= maxResults,
|
|
163
|
+
};
|
|
164
|
+
} catch (error: unknown) {
|
|
165
|
+
if (error instanceof Error && 'code' in error && error.code === 1) {
|
|
166
|
+
return { files: [], truncated: false };
|
|
167
|
+
}
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
interface FindFilesArgs {
|
|
173
|
+
pattern: string;
|
|
174
|
+
maxResults?: number;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const executeFindFiles = async (args: FindFilesArgs): Promise<string> => {
|
|
178
|
+
const cwd = process.cwd();
|
|
179
|
+
const maxResults = Math.min(
|
|
180
|
+
args.maxResults || DEFAULT_FIND_FILES_RESULTS,
|
|
181
|
+
MAX_FIND_FILES_RESULTS,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
const { files, truncated } = await findFilesByPattern(
|
|
186
|
+
args.pattern,
|
|
187
|
+
cwd,
|
|
188
|
+
maxResults,
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
if (files.length === 0) {
|
|
192
|
+
return `No files or directories found matching pattern "${args.pattern}"`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
let output = `Found ${files.length} match${files.length === 1 ? '' : 'es'}${truncated ? ` (showing first ${maxResults})` : ''
|
|
196
|
+
}:\n\n`;
|
|
197
|
+
output += files.join('\n');
|
|
198
|
+
|
|
199
|
+
return output;
|
|
200
|
+
} catch (error: unknown) {
|
|
201
|
+
const errorMessage =
|
|
202
|
+
error instanceof Error ? error.message : 'Unknown error';
|
|
203
|
+
throw new Error(`File search failed: ${errorMessage}`);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const findFilesCoreTool = tool({
|
|
208
|
+
description:
|
|
209
|
+
'Find files and directories by path pattern or name. Use glob patterns like "*.tsx", "**/*.ts", "src/**/*.js", or "*.{ts,tsx}". Returns a list of matching file and directory paths. Does NOT search file contents - use search_file_contents for that.',
|
|
210
|
+
inputSchema: jsonSchema<FindFilesArgs>({
|
|
211
|
+
type: 'object',
|
|
212
|
+
properties: {
|
|
213
|
+
pattern: {
|
|
214
|
+
type: 'string',
|
|
215
|
+
description:
|
|
216
|
+
'Glob pattern to match file and directory paths. Examples: "*.tsx" (all .tsx files), "src/**/*.ts" (all .ts in src/), "components/**" (all files/dirs in components/), "*.{ts,tsx}" (multiple extensions)',
|
|
217
|
+
},
|
|
218
|
+
maxResults: {
|
|
219
|
+
type: 'number',
|
|
220
|
+
description:
|
|
221
|
+
'Maximum number of results to return (default: 50, max: 100)',
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
required: ['pattern'],
|
|
225
|
+
}),
|
|
226
|
+
// Low risk: read-only operation, never requires approval
|
|
227
|
+
needsApproval: false,
|
|
228
|
+
execute: async (args, _options) => {
|
|
229
|
+
return await executeFindFiles(args);
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
interface FindFilesFormatterProps {
|
|
234
|
+
args: {
|
|
235
|
+
pattern: string;
|
|
236
|
+
maxResults?: number;
|
|
237
|
+
};
|
|
238
|
+
result?: string;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const FindFilesFormatter = React.memo(
|
|
242
|
+
({ args, result }: FindFilesFormatterProps) => {
|
|
243
|
+
const themeContext = React.useContext(ThemeContext);
|
|
244
|
+
if (!themeContext) {
|
|
245
|
+
throw new Error('ThemeContext not found');
|
|
246
|
+
}
|
|
247
|
+
const { colors } = themeContext;
|
|
248
|
+
|
|
249
|
+
// Parse result to get file count
|
|
250
|
+
let fileCount = 0;
|
|
251
|
+
if (result && !result.startsWith('Error:')) {
|
|
252
|
+
const firstLine = result.split('\n')[0];
|
|
253
|
+
const matchFound = firstLine.match(/Found (\d+)/);
|
|
254
|
+
if (matchFound) {
|
|
255
|
+
fileCount = parseInt(matchFound[1], 10);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const messageContent = (
|
|
260
|
+
<Box flexDirection="column">
|
|
261
|
+
<Text color={colors.tool}>☕︎ find_files</Text>
|
|
262
|
+
|
|
263
|
+
<Box>
|
|
264
|
+
<Text color={colors.secondary}>Pattern: </Text>
|
|
265
|
+
<Text color={colors.white}>{args.pattern}</Text>
|
|
266
|
+
</Box>
|
|
267
|
+
|
|
268
|
+
<Box>
|
|
269
|
+
<Text color={colors.secondary}>Results: </Text>
|
|
270
|
+
<Text color={colors.white}>{fileCount}</Text>
|
|
271
|
+
</Box>
|
|
272
|
+
</Box>
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
return <ToolMessage message={messageContent} hideBox={true} />;
|
|
276
|
+
},
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
const findFilesFormatter = (
|
|
280
|
+
args: FindFilesFormatterProps['args'],
|
|
281
|
+
result?: string,
|
|
282
|
+
): React.ReactElement => {
|
|
283
|
+
if (result && result.startsWith('Error:')) {
|
|
284
|
+
return <></>;
|
|
285
|
+
}
|
|
286
|
+
return <FindFilesFormatter args={args} result={result} />;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export const findFilesTool = {
|
|
290
|
+
name: 'find_files' as const,
|
|
291
|
+
tool: findFilesCoreTool,
|
|
292
|
+
formatter: findFilesFormatter,
|
|
293
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import {executeBashTool} from '@/tools/execute-bash';
|
|
2
|
+
import {fetchUrlTool} from '@/tools/fetch-url';
|
|
3
|
+
import {findFilesTool} from '@/tools/find-files';
|
|
4
|
+
import {getDiagnosticsTool} from '@/tools/lsp-get-diagnostics';
|
|
5
|
+
import {readFileTool} from '@/tools/read-file';
|
|
6
|
+
import {searchFileContentsTool} from '@/tools/search-file-contents';
|
|
7
|
+
import {stringReplaceTool} from '@/tools/string-replace';
|
|
8
|
+
import {webSearchTool} from '@/tools/web-search';
|
|
9
|
+
import {writeFileTool} from '@/tools/write-file';
|
|
10
|
+
import type {
|
|
11
|
+
AISDKCoreTool,
|
|
12
|
+
CoderToolExport,
|
|
13
|
+
ToolHandler,
|
|
14
|
+
} from '@/types/index';
|
|
15
|
+
import React from 'react';
|
|
16
|
+
|
|
17
|
+
// Array of all tool exports from individual tool files
|
|
18
|
+
// Each tool exports: { name, tool, formatter?, validator? }
|
|
19
|
+
const allTools: CoderToolExport[] = [
|
|
20
|
+
readFileTool,
|
|
21
|
+
writeFileTool,
|
|
22
|
+
stringReplaceTool,
|
|
23
|
+
executeBashTool,
|
|
24
|
+
webSearchTool,
|
|
25
|
+
fetchUrlTool,
|
|
26
|
+
findFilesTool,
|
|
27
|
+
searchFileContentsTool,
|
|
28
|
+
getDiagnosticsTool,
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
// Export native AI SDK tools registry (for passing directly to AI SDK)
|
|
32
|
+
export const nativeToolsRegistry: Record<string, AISDKCoreTool> =
|
|
33
|
+
Object.fromEntries(allTools.map(t => [t.name, t.tool]));
|
|
34
|
+
|
|
35
|
+
// Export handlers for manual execution (human-in-the-loop)
|
|
36
|
+
// These are extracted from the AI SDK tools' execute functions
|
|
37
|
+
export const toolRegistry: Record<string, ToolHandler> = Object.fromEntries(
|
|
38
|
+
allTools.map(t => [
|
|
39
|
+
t.name,
|
|
40
|
+
// Extract the execute function from the AI SDK tool
|
|
41
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
42
|
+
async (args: any) => {
|
|
43
|
+
// Call the tool's execute function with a dummy options object
|
|
44
|
+
// The actual options will be provided by AI SDK during automatic execution
|
|
45
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
46
|
+
return await (t.tool as any).execute(args, {
|
|
47
|
+
toolCallId: 'manual',
|
|
48
|
+
messages: [],
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
]),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Export formatter registry for the UI
|
|
55
|
+
export const toolFormatters: Record<
|
|
56
|
+
string,
|
|
57
|
+
(
|
|
58
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
59
|
+
args: any,
|
|
60
|
+
) =>
|
|
61
|
+
| string
|
|
62
|
+
| Promise<string>
|
|
63
|
+
| React.ReactElement
|
|
64
|
+
| Promise<React.ReactElement>
|
|
65
|
+
> = allTools.reduce(
|
|
66
|
+
(acc, t) => {
|
|
67
|
+
if ('formatter' in t && t.formatter) {
|
|
68
|
+
acc[t.name] = t.formatter;
|
|
69
|
+
}
|
|
70
|
+
return acc;
|
|
71
|
+
},
|
|
72
|
+
{} as Record<
|
|
73
|
+
string,
|
|
74
|
+
(
|
|
75
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
76
|
+
args: any,
|
|
77
|
+
) =>
|
|
78
|
+
| string
|
|
79
|
+
| Promise<string>
|
|
80
|
+
| React.ReactElement
|
|
81
|
+
| Promise<React.ReactElement>
|
|
82
|
+
>,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Export validator registry
|
|
86
|
+
export const toolValidators: Record<
|
|
87
|
+
string,
|
|
88
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
89
|
+
(args: any) => Promise<{valid: true} | {valid: false; error: string}>
|
|
90
|
+
> = allTools.reduce(
|
|
91
|
+
(acc, t) => {
|
|
92
|
+
if ('validator' in t && t.validator) {
|
|
93
|
+
acc[t.name] = t.validator;
|
|
94
|
+
}
|
|
95
|
+
return acc;
|
|
96
|
+
},
|
|
97
|
+
{} as Record<
|
|
98
|
+
string,
|
|
99
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic typing required
|
|
100
|
+
(args: any) => Promise<{valid: true} | {valid: false; error: string}>
|
|
101
|
+
>,
|
|
102
|
+
);
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { resolve as resolvePath } from 'node:path';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
import ToolMessage from '@/components/tool-message';
|
|
6
|
+
import { TIMEOUT_LSP_DIAGNOSTICS_MS } from '@/constants';
|
|
7
|
+
import { ThemeContext } from '@/hooks/useTheme';
|
|
8
|
+
import { DiagnosticSeverity, getLSPManager } from '@/lsp/index';
|
|
9
|
+
import { jsonSchema, tool } from '@/types/core';
|
|
10
|
+
|
|
11
|
+
interface GetDiagnosticsArgs {
|
|
12
|
+
path?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Request diagnostics from VS Code with timeout
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
// Handler function
|
|
19
|
+
const executeGetDiagnostics = async (
|
|
20
|
+
args: GetDiagnosticsArgs,
|
|
21
|
+
): Promise<string> => {
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
// Fall back to local LSP
|
|
25
|
+
const lspManager = getLSPManager();
|
|
26
|
+
|
|
27
|
+
if (!lspManager.isInitialized()) {
|
|
28
|
+
return 'No diagnostics source available. Please install a language server.';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// If path is provided, get diagnostics for that file
|
|
32
|
+
if (args.path) {
|
|
33
|
+
// Check if we have LSP support for this file type
|
|
34
|
+
if (!lspManager.hasLanguageSupport(args.path)) {
|
|
35
|
+
return `No language server available for file type: ${args.path}.`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Open the document if not already open
|
|
39
|
+
await lspManager.openDocument(args.path);
|
|
40
|
+
|
|
41
|
+
// Get diagnostics
|
|
42
|
+
const diagnostics = await lspManager.getDiagnostics(args.path);
|
|
43
|
+
|
|
44
|
+
if (diagnostics.length === 0) {
|
|
45
|
+
return `No diagnostics found for ${args.path}`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Format diagnostics
|
|
49
|
+
const lines: string[] = [`Diagnostics for ${args.path}:`, ''];
|
|
50
|
+
|
|
51
|
+
for (const diag of diagnostics) {
|
|
52
|
+
const severity =
|
|
53
|
+
diag.severity === DiagnosticSeverity.Error
|
|
54
|
+
? 'ERROR'
|
|
55
|
+
: diag.severity === DiagnosticSeverity.Warning
|
|
56
|
+
? 'WARNING'
|
|
57
|
+
: diag.severity === DiagnosticSeverity.Information
|
|
58
|
+
? 'INFO'
|
|
59
|
+
: 'HINT';
|
|
60
|
+
|
|
61
|
+
const line = diag.range.start.line + 1;
|
|
62
|
+
const char = diag.range.start.character + 1;
|
|
63
|
+
const source = diag.source ? `[${diag.source}] ` : '';
|
|
64
|
+
|
|
65
|
+
lines.push(
|
|
66
|
+
`${severity} at line ${line}:${char}: ${source}${diag.message}`,
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Get all diagnostics from all open documents
|
|
74
|
+
const allDiagnostics = lspManager.getAllDiagnostics();
|
|
75
|
+
|
|
76
|
+
if (allDiagnostics.length === 0) {
|
|
77
|
+
return 'No diagnostics found in any open documents.';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const lines: string[] = ['Diagnostics from all open documents:', ''];
|
|
81
|
+
|
|
82
|
+
for (const { uri, diagnostics } of allDiagnostics) {
|
|
83
|
+
// Convert URI to path
|
|
84
|
+
const path = uri.startsWith('file://') ? uri.slice(7) : uri;
|
|
85
|
+
lines.push(`\n${path}:`);
|
|
86
|
+
|
|
87
|
+
for (const diag of diagnostics) {
|
|
88
|
+
const severity =
|
|
89
|
+
diag.severity === DiagnosticSeverity.Error
|
|
90
|
+
? 'ERROR'
|
|
91
|
+
: diag.severity === DiagnosticSeverity.Warning
|
|
92
|
+
? 'WARNING'
|
|
93
|
+
: diag.severity === DiagnosticSeverity.Information
|
|
94
|
+
? 'INFO'
|
|
95
|
+
: 'HINT';
|
|
96
|
+
|
|
97
|
+
const line = diag.range.start.line + 1;
|
|
98
|
+
const char = diag.range.start.character + 1;
|
|
99
|
+
const source = diag.source ? `[${diag.source}] ` : '';
|
|
100
|
+
|
|
101
|
+
lines.push(
|
|
102
|
+
` ${severity} at line ${line}:${char}: ${source}${diag.message}`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return lines.join('\n');
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const getDiagnosticsCoreTool = tool({
|
|
111
|
+
description:
|
|
112
|
+
'Get errors and warnings for a file or project from the language server. Returns type errors, linting issues, and other diagnostics. Use this to check for problems before or after making code changes.',
|
|
113
|
+
inputSchema: jsonSchema<GetDiagnosticsArgs>({
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: {
|
|
116
|
+
path: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description:
|
|
119
|
+
'Optional path to a specific file. If omitted, returns diagnostics for all open documents.',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
required: [],
|
|
123
|
+
}),
|
|
124
|
+
// Low risk: read-only operation, never requires approval
|
|
125
|
+
needsApproval: false,
|
|
126
|
+
execute: async (args, _options) => {
|
|
127
|
+
return await executeGetDiagnostics(args);
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Formatter component
|
|
132
|
+
const GetDiagnosticsFormatter = React.memo(
|
|
133
|
+
({ args, result }: { args: GetDiagnosticsArgs; result?: string }) => {
|
|
134
|
+
const themeContext = React.useContext(ThemeContext);
|
|
135
|
+
if (!themeContext) {
|
|
136
|
+
throw new Error(
|
|
137
|
+
'GetDiagnosticsFormatter must be used within a ThemeProvider',
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
const { colors } = themeContext;
|
|
141
|
+
|
|
142
|
+
// Count diagnostics from result
|
|
143
|
+
const errorCount = (result?.match(/ERROR/g) || []).length;
|
|
144
|
+
const warningCount = (result?.match(/WARNING/g) || []).length;
|
|
145
|
+
|
|
146
|
+
const messageContent = (
|
|
147
|
+
<Box flexDirection="column">
|
|
148
|
+
<Text color={colors.tool}>☕︎ get_diagnostics</Text>
|
|
149
|
+
|
|
150
|
+
{args.path ? (
|
|
151
|
+
<Box>
|
|
152
|
+
<Text color={colors.secondary}>Path: </Text>
|
|
153
|
+
<Text color={colors.white}>{args.path}</Text>
|
|
154
|
+
</Box>
|
|
155
|
+
) : (
|
|
156
|
+
<Box>
|
|
157
|
+
<Text color={colors.secondary}>Scope: </Text>
|
|
158
|
+
<Text color={colors.white}>All open documents</Text>
|
|
159
|
+
</Box>
|
|
160
|
+
)}
|
|
161
|
+
|
|
162
|
+
{result && (
|
|
163
|
+
<Box>
|
|
164
|
+
<Text color={colors.secondary}>Found: </Text>
|
|
165
|
+
<Text color={errorCount > 0 ? colors.error : colors.white}>
|
|
166
|
+
{errorCount} errors
|
|
167
|
+
</Text>
|
|
168
|
+
<Text color={colors.secondary}>, </Text>
|
|
169
|
+
<Text color={warningCount > 0 ? colors.warning : colors.white}>
|
|
170
|
+
{warningCount} warnings
|
|
171
|
+
</Text>
|
|
172
|
+
</Box>
|
|
173
|
+
)}
|
|
174
|
+
</Box>
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
return <ToolMessage message={messageContent} hideBox={true} />;
|
|
178
|
+
},
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const getDiagnosticsFormatter = (
|
|
182
|
+
args: GetDiagnosticsArgs,
|
|
183
|
+
result?: string,
|
|
184
|
+
): React.ReactElement => {
|
|
185
|
+
return <GetDiagnosticsFormatter args={args} result={result} />;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
export const getDiagnosticsTool = {
|
|
189
|
+
name: 'lsp_get_diagnostics' as const,
|
|
190
|
+
tool: getDiagnosticsCoreTool,
|
|
191
|
+
formatter: getDiagnosticsFormatter,
|
|
192
|
+
};
|