@gguf/coder 0.3.0 → 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/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,228 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AISDKCoreTool,
|
|
3
|
+
ToolEntry,
|
|
4
|
+
ToolFormatter,
|
|
5
|
+
ToolHandler,
|
|
6
|
+
ToolValidator,
|
|
7
|
+
} from '@/types/index';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Helper class to encapsulate tool registry management
|
|
11
|
+
*
|
|
12
|
+
* This class provides structured access to tool metadata and eliminates
|
|
13
|
+
* the need to manage multiple separate registries manually.
|
|
14
|
+
*
|
|
15
|
+
* Benefits:
|
|
16
|
+
* - Single source of truth for all tool metadata
|
|
17
|
+
* - Type-safe access to tool components
|
|
18
|
+
* - Cleaner API for tool registration and lookup
|
|
19
|
+
* - Easier to extend with future metadata
|
|
20
|
+
*/
|
|
21
|
+
export class ToolRegistry {
|
|
22
|
+
private tools: Map<string, ToolEntry> = new Map();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Register a complete tool entry
|
|
26
|
+
* @param entry - The ToolEntry containing all tool metadata
|
|
27
|
+
*/
|
|
28
|
+
register(entry: ToolEntry): void {
|
|
29
|
+
this.tools.set(entry.name, entry);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Register multiple tool entries at once
|
|
34
|
+
* @param entries - Array of ToolEntry objects
|
|
35
|
+
*/
|
|
36
|
+
registerMany(entries: ToolEntry[]): void {
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
this.register(entry);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Unregister a tool by name
|
|
44
|
+
* @param name - The tool name
|
|
45
|
+
*/
|
|
46
|
+
unregister(name: string): void {
|
|
47
|
+
this.tools.delete(name);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Unregister multiple tools by name
|
|
52
|
+
* @param names - Array of tool names
|
|
53
|
+
*/
|
|
54
|
+
unregisterMany(names: string[]): void {
|
|
55
|
+
for (const name of names) {
|
|
56
|
+
this.unregister(name);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get a complete tool entry by name
|
|
62
|
+
* @param name - The tool name
|
|
63
|
+
* @returns The ToolEntry or undefined if not found
|
|
64
|
+
*/
|
|
65
|
+
getEntry(name: string): ToolEntry | undefined {
|
|
66
|
+
return this.tools.get(name);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Get a tool handler by name
|
|
71
|
+
* @param name - The tool name
|
|
72
|
+
* @returns The ToolHandler or undefined if not found
|
|
73
|
+
*/
|
|
74
|
+
getHandler(name: string): ToolHandler | undefined {
|
|
75
|
+
return this.tools.get(name)?.handler;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get a tool formatter by name
|
|
80
|
+
* @param name - The tool name
|
|
81
|
+
* @returns The ToolFormatter or undefined if not found
|
|
82
|
+
*/
|
|
83
|
+
getFormatter(name: string): ToolFormatter | undefined {
|
|
84
|
+
return this.tools.get(name)?.formatter;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get a tool validator by name
|
|
89
|
+
* @param name - The tool name
|
|
90
|
+
* @returns The ToolValidator or undefined if not found
|
|
91
|
+
*/
|
|
92
|
+
getValidator(name: string): ToolValidator | undefined {
|
|
93
|
+
return this.tools.get(name)?.validator;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Get the native AI SDK tool by name
|
|
98
|
+
* @param name - The tool name
|
|
99
|
+
* @returns The AISDKCoreTool or undefined if not found
|
|
100
|
+
*/
|
|
101
|
+
getTool(name: string): AISDKCoreTool | undefined {
|
|
102
|
+
return this.tools.get(name)?.tool;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get all handler entries as a record (compatible with old API)
|
|
107
|
+
* @returns Record mapping tool names to handlers
|
|
108
|
+
*/
|
|
109
|
+
getHandlers(): Record<string, ToolHandler> {
|
|
110
|
+
const handlers: Record<string, ToolHandler> = {};
|
|
111
|
+
for (const [name, entry] of this.tools) {
|
|
112
|
+
handlers[name] = entry.handler;
|
|
113
|
+
}
|
|
114
|
+
return handlers;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get all formatter entries as a record (compatible with old API)
|
|
119
|
+
* @returns Record mapping tool names to formatters
|
|
120
|
+
*/
|
|
121
|
+
getFormatters(): Record<string, ToolFormatter> {
|
|
122
|
+
const formatters: Record<string, ToolFormatter> = {};
|
|
123
|
+
for (const [name, entry] of this.tools) {
|
|
124
|
+
if (entry.formatter) {
|
|
125
|
+
formatters[name] = entry.formatter;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return formatters;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get all validator entries as a record (compatible with old API)
|
|
133
|
+
* @returns Record mapping tool names to validators
|
|
134
|
+
*/
|
|
135
|
+
getValidators(): Record<string, ToolValidator> {
|
|
136
|
+
const validators: Record<string, ToolValidator> = {};
|
|
137
|
+
for (const [name, entry] of this.tools) {
|
|
138
|
+
if (entry.validator) {
|
|
139
|
+
validators[name] = entry.validator;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return validators;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Get all native AI SDK tools as a record (compatible with old API)
|
|
147
|
+
* @returns Record mapping tool names to AISDKCoreTool objects
|
|
148
|
+
*/
|
|
149
|
+
getNativeTools(): Record<string, AISDKCoreTool> {
|
|
150
|
+
const nativeTools: Record<string, AISDKCoreTool> = {};
|
|
151
|
+
for (const [name, entry] of this.tools) {
|
|
152
|
+
nativeTools[name] = entry.tool;
|
|
153
|
+
}
|
|
154
|
+
return nativeTools;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get all tool entries
|
|
159
|
+
* @returns Array of all ToolEntry objects
|
|
160
|
+
*/
|
|
161
|
+
getAllEntries(): ToolEntry[] {
|
|
162
|
+
return Array.from(this.tools.values());
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get all tool names
|
|
167
|
+
* @returns Array of all registered tool names
|
|
168
|
+
*/
|
|
169
|
+
getToolNames(): string[] {
|
|
170
|
+
return Array.from(this.tools.keys());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check if a tool is registered
|
|
175
|
+
* @param name - The tool name
|
|
176
|
+
* @returns True if the tool exists, false otherwise
|
|
177
|
+
*/
|
|
178
|
+
hasTool(name: string): boolean {
|
|
179
|
+
return this.tools.has(name);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Get the number of registered tools
|
|
184
|
+
* @returns The count of registered tools
|
|
185
|
+
*/
|
|
186
|
+
getToolCount(): number {
|
|
187
|
+
return this.tools.size;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Clear all registered tools
|
|
192
|
+
*/
|
|
193
|
+
clear(): void {
|
|
194
|
+
this.tools.clear();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Create a new registry from static registries (backward compatibility helper)
|
|
199
|
+
* @param handlers - Record of tool handlers
|
|
200
|
+
* @param tools - Record of native AI SDK tools
|
|
201
|
+
* @param formatters - Optional record of tool formatters
|
|
202
|
+
* @param validators - Optional record of tool validators
|
|
203
|
+
* @returns New ToolRegistry instance
|
|
204
|
+
*/
|
|
205
|
+
static fromRegistries(
|
|
206
|
+
handlers: Record<string, ToolHandler>,
|
|
207
|
+
tools: Record<string, AISDKCoreTool>,
|
|
208
|
+
formatters?: Record<string, ToolFormatter>,
|
|
209
|
+
validators?: Record<string, ToolValidator>,
|
|
210
|
+
): ToolRegistry {
|
|
211
|
+
const registry = new ToolRegistry();
|
|
212
|
+
|
|
213
|
+
for (const [name, handler] of Object.entries(handlers)) {
|
|
214
|
+
const tool = tools[name];
|
|
215
|
+
if (tool) {
|
|
216
|
+
registry.register({
|
|
217
|
+
name,
|
|
218
|
+
handler,
|
|
219
|
+
tool,
|
|
220
|
+
formatter: formatters?.[name],
|
|
221
|
+
validator: validators?.[name],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return registry;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import * as cheerio from 'cheerio';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { fetch } from 'undici';
|
|
5
|
+
|
|
6
|
+
import ToolMessage from '@/components/tool-message';
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_WEB_SEARCH_RESULTS,
|
|
9
|
+
MAX_WEB_SEARCH_QUERY_LENGTH,
|
|
10
|
+
TIMEOUT_WEB_SEARCH_MS,
|
|
11
|
+
WEB_SEARCH_DISPLAY_RESULTS,
|
|
12
|
+
} from '@/constants';
|
|
13
|
+
import { ThemeContext } from '@/hooks/useTheme';
|
|
14
|
+
import { jsonSchema, tool } from '@/types/core';
|
|
15
|
+
import type { CoderToolExport } from '@/types/core';
|
|
16
|
+
|
|
17
|
+
interface SearchArgs {
|
|
18
|
+
query: string;
|
|
19
|
+
max_results?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface SearchResult {
|
|
23
|
+
title: string;
|
|
24
|
+
url: string;
|
|
25
|
+
snippet: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const executeWebSearch = async (args: SearchArgs): Promise<string> => {
|
|
29
|
+
const maxResults = args.max_results ?? DEFAULT_WEB_SEARCH_RESULTS;
|
|
30
|
+
const encodedQuery = encodeURIComponent(args.query);
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
// Use Brave Search - scraper-friendly, no CAPTCHA
|
|
34
|
+
const searchUrl = `https://search.brave.com/search?q=${encodedQuery}`;
|
|
35
|
+
|
|
36
|
+
const response = await fetch(searchUrl, {
|
|
37
|
+
headers: {
|
|
38
|
+
'User-Agent':
|
|
39
|
+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
|
|
40
|
+
Accept: 'text/html',
|
|
41
|
+
},
|
|
42
|
+
signal: AbortSignal.timeout(TIMEOUT_WEB_SEARCH_MS),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const html = await response.text();
|
|
50
|
+
const $ = cheerio.load(html);
|
|
51
|
+
|
|
52
|
+
const results: SearchResult[] = [];
|
|
53
|
+
|
|
54
|
+
// Brave Search uses specific result containers
|
|
55
|
+
$('[data-type="web"]').each((_i, elem) => {
|
|
56
|
+
if (results.length >= maxResults) return;
|
|
57
|
+
|
|
58
|
+
const $elem = $(elem);
|
|
59
|
+
|
|
60
|
+
// Extract title and URL
|
|
61
|
+
const titleLink = $elem.find('a[href^="http"]').first();
|
|
62
|
+
const url = titleLink.attr('href');
|
|
63
|
+
const title = titleLink.text().trim();
|
|
64
|
+
|
|
65
|
+
// Extract snippet
|
|
66
|
+
const snippet = $elem.find('.snippet-description').text().trim();
|
|
67
|
+
|
|
68
|
+
if (url && title) {
|
|
69
|
+
results.push({
|
|
70
|
+
title: title || 'No title',
|
|
71
|
+
url,
|
|
72
|
+
snippet: snippet || '',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
if (results.length === 0) {
|
|
78
|
+
return `No results found for query: "${args.query}"`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Format results as markdown for easier LLM reading
|
|
82
|
+
let formattedResults = `# Web Search Results: "${args.query}"\n\n`;
|
|
83
|
+
|
|
84
|
+
for (let i = 0; i < results.length; i++) {
|
|
85
|
+
const result = results[i];
|
|
86
|
+
formattedResults += `## ${i + 1}. ${result.title}\n\n`;
|
|
87
|
+
formattedResults += `**URL:** ${result.url}\n\n`;
|
|
88
|
+
if (result.snippet) {
|
|
89
|
+
formattedResults += `${result.snippet}\n\n`;
|
|
90
|
+
}
|
|
91
|
+
formattedResults += '---\n\n';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return formattedResults;
|
|
95
|
+
} catch (error: unknown) {
|
|
96
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
97
|
+
throw new Error('Search request timeout');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const errorMessage =
|
|
101
|
+
error instanceof Error ? error.message : 'Unknown error';
|
|
102
|
+
throw new Error(`Web search failed: ${errorMessage}`);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const webSearchCoreTool = tool({
|
|
107
|
+
description:
|
|
108
|
+
'Search the web for information (scrapes Brave Search, returns markdown)',
|
|
109
|
+
inputSchema: jsonSchema<SearchArgs>({
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
query: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
description: 'The search query.',
|
|
115
|
+
},
|
|
116
|
+
max_results: {
|
|
117
|
+
type: 'number',
|
|
118
|
+
description:
|
|
119
|
+
'Maximum number of search results to return (default: 10).',
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
required: ['query'],
|
|
123
|
+
}),
|
|
124
|
+
// Low risk: read-only operation, never requires approval
|
|
125
|
+
needsApproval: false,
|
|
126
|
+
execute: async (args, _options) => {
|
|
127
|
+
return await executeWebSearch(args);
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Create a component that will re-render when theme changes
|
|
132
|
+
const WebSearchFormatter = React.memo(
|
|
133
|
+
({ args, result }: { args: SearchArgs; result?: string }) => {
|
|
134
|
+
const themeContext = React.useContext(ThemeContext);
|
|
135
|
+
if (!themeContext) {
|
|
136
|
+
throw new Error('ThemeContext not found');
|
|
137
|
+
}
|
|
138
|
+
const { colors } = themeContext;
|
|
139
|
+
const query = args.query || 'unknown';
|
|
140
|
+
const maxResults = args.max_results ?? WEB_SEARCH_DISPLAY_RESULTS;
|
|
141
|
+
|
|
142
|
+
// Parse result to count actual results
|
|
143
|
+
let resultCount = 0;
|
|
144
|
+
let estimatedTokens = 0;
|
|
145
|
+
if (result) {
|
|
146
|
+
const matches = result.match(/^## \d+\./gm);
|
|
147
|
+
resultCount = matches ? matches.length : 0;
|
|
148
|
+
estimatedTokens = Math.ceil(result.length / 4);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const messageContent = (
|
|
152
|
+
<Box flexDirection="column">
|
|
153
|
+
<Text color={colors.tool}>☕︎ web_search</Text>
|
|
154
|
+
|
|
155
|
+
<Box>
|
|
156
|
+
<Text color={colors.secondary}>Query: </Text>
|
|
157
|
+
<Text color={colors.white}>{query}</Text>
|
|
158
|
+
</Box>
|
|
159
|
+
|
|
160
|
+
<Box>
|
|
161
|
+
<Text color={colors.secondary}>Engine: </Text>
|
|
162
|
+
<Text color={colors.white}>Brave Search</Text>
|
|
163
|
+
</Box>
|
|
164
|
+
|
|
165
|
+
{result && (
|
|
166
|
+
<>
|
|
167
|
+
<Box>
|
|
168
|
+
<Text color={colors.secondary}>Results: </Text>
|
|
169
|
+
<Text color={colors.white}>
|
|
170
|
+
{resultCount} / {maxResults} results
|
|
171
|
+
</Text>
|
|
172
|
+
</Box>
|
|
173
|
+
|
|
174
|
+
<Box>
|
|
175
|
+
<Text color={colors.secondary}>Output: </Text>
|
|
176
|
+
<Text color={colors.white}>~{estimatedTokens} tokens</Text>
|
|
177
|
+
</Box>
|
|
178
|
+
</>
|
|
179
|
+
)}
|
|
180
|
+
</Box>
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
return <ToolMessage message={messageContent} hideBox={true} />;
|
|
184
|
+
},
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
const webSearchFormatter = (
|
|
188
|
+
args: SearchArgs,
|
|
189
|
+
result?: string,
|
|
190
|
+
): React.ReactElement => {
|
|
191
|
+
return <WebSearchFormatter args={args} result={result} />;
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
const webSearchValidator = (
|
|
195
|
+
args: SearchArgs,
|
|
196
|
+
): Promise<{ valid: true } | { valid: false; error: string }> => {
|
|
197
|
+
const query = args.query?.trim();
|
|
198
|
+
|
|
199
|
+
// Check if query is empty
|
|
200
|
+
if (!query) {
|
|
201
|
+
return Promise.resolve({
|
|
202
|
+
valid: false,
|
|
203
|
+
error: '☕︎ Search query cannot be empty',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Check query length (reasonable limit)
|
|
208
|
+
if (query.length > MAX_WEB_SEARCH_QUERY_LENGTH) {
|
|
209
|
+
return Promise.resolve({
|
|
210
|
+
valid: false,
|
|
211
|
+
error: `☕︎ Search query is too long (${query.length} characters). Maximum length is ${MAX_WEB_SEARCH_QUERY_LENGTH} characters.`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return Promise.resolve({ valid: true });
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
export const webSearchTool: CoderToolExport = {
|
|
219
|
+
name: 'web_search' as const,
|
|
220
|
+
tool: webSearchCoreTool,
|
|
221
|
+
formatter: webSearchFormatter,
|
|
222
|
+
validator: webSearchValidator,
|
|
223
|
+
};
|