@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
package/scripts/test.sh
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Test script that runs all test:all commands
|
|
4
|
+
# Exit on first error
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🧪 Running all tests..."
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
echo "📝 Checking code formatting..."
|
|
11
|
+
pnpm test:format
|
|
12
|
+
echo ""
|
|
13
|
+
echo "✅ Format check passed"
|
|
14
|
+
echo ""
|
|
15
|
+
|
|
16
|
+
echo "🔍 Checking TypeScript types..."
|
|
17
|
+
pnpm test:types
|
|
18
|
+
echo ""
|
|
19
|
+
echo "✅ Type check passed"
|
|
20
|
+
echo ""
|
|
21
|
+
|
|
22
|
+
echo "🔎 Running linter..."
|
|
23
|
+
pnpm test:lint
|
|
24
|
+
echo ""
|
|
25
|
+
echo "✅ Lint check passed"
|
|
26
|
+
echo ""
|
|
27
|
+
|
|
28
|
+
echo "🧩 Running AVA tests..."
|
|
29
|
+
pnpm test:ava
|
|
30
|
+
echo ""
|
|
31
|
+
echo "✅ AVA tests passed"
|
|
32
|
+
echo ""
|
|
33
|
+
|
|
34
|
+
echo "🗑️ Checking for unused code..."
|
|
35
|
+
pnpm test:knip
|
|
36
|
+
echo ""
|
|
37
|
+
echo "✅ Knip check passed"
|
|
38
|
+
echo ""
|
|
39
|
+
|
|
40
|
+
echo "✅ Everything passes!"
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Update Homebrew formula version and SHA256 hash for a new release
|
|
3
|
+
# Usage: ./scripts/update-homebrew-formula.sh <version>
|
|
4
|
+
# Example: ./scripts/update-homebrew-formula.sh 1.15.0
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
VERSION=$1
|
|
9
|
+
# FORMULA_FILE="Formula/coder.rb"
|
|
10
|
+
NPM_PACKAGE="@gguf/coder"
|
|
11
|
+
|
|
12
|
+
# Color codes for output
|
|
13
|
+
RED='\033[0;31m'
|
|
14
|
+
GREEN='\033[0;32m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
NC='\033[0m' # No Color
|
|
17
|
+
|
|
18
|
+
if [ -z "$VERSION" ]; then
|
|
19
|
+
echo -e "${RED}Error: Version number required${NC}"
|
|
20
|
+
echo "Usage: $0 <version>"
|
|
21
|
+
echo "Example: $0 1.15.0"
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
echo -e "${YELLOW}Updating Homebrew formula to version ${VERSION}...${NC}"
|
|
26
|
+
echo ""
|
|
27
|
+
|
|
28
|
+
# Step 1: Update version in formula file
|
|
29
|
+
echo "Step 1: Updating version number in ${FORMULA_FILE}..."
|
|
30
|
+
NPM_URL="https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-${VERSION}.tgz"
|
|
31
|
+
|
|
32
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
33
|
+
# macOS requires -i '' for in-place editing
|
|
34
|
+
sed -i '' "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
|
|
35
|
+
else
|
|
36
|
+
# Linux
|
|
37
|
+
sed -i "s|url \"https://registry.npmjs.org/${NPM_PACKAGE}/-/coder-.*\.tgz\"|url \"${NPM_URL}\"|" "$FORMULA_FILE"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Step 2: Download tarball and calculate SHA256
|
|
41
|
+
echo "Step 2: Downloading tarball from NPM..."
|
|
42
|
+
echo "URL: ${NPM_URL}"
|
|
43
|
+
|
|
44
|
+
TEMP_FILE=$(mktemp)
|
|
45
|
+
trap "rm -f ${TEMP_FILE}" EXIT
|
|
46
|
+
|
|
47
|
+
if ! curl -sSL "${NPM_URL}" -o "${TEMP_FILE}"; then
|
|
48
|
+
echo -e "${RED}Error: Failed to download tarball from NPM${NC}"
|
|
49
|
+
echo "Please verify that version ${VERSION} has been published to NPM"
|
|
50
|
+
echo "Check: https://www.npmjs.com/package/${NPM_PACKAGE}"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
echo "Step 3: Calculating SHA256 hash..."
|
|
55
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
56
|
+
# macOS and some Linux systems
|
|
57
|
+
SHA256=$(shasum -a 256 "${TEMP_FILE}" | awk '{print $1}')
|
|
58
|
+
elif command -v sha256sum >/dev/null 2>&1; then
|
|
59
|
+
# Most Linux systems
|
|
60
|
+
SHA256=$(sha256sum "${TEMP_FILE}" | awk '{print $1}')
|
|
61
|
+
else
|
|
62
|
+
echo -e "${RED}Error: Neither shasum nor sha256sum found${NC}"
|
|
63
|
+
echo "Please install one of these tools to calculate SHA256 hashes"
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
if [ -z "$SHA256" ]; then
|
|
68
|
+
echo -e "${RED}Error: Failed to calculate SHA256 hash${NC}"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
echo -e "${GREEN}Found hash: ${SHA256}${NC}"
|
|
73
|
+
echo ""
|
|
74
|
+
|
|
75
|
+
# Step 4: Update formula with real hash
|
|
76
|
+
echo "Step 4: Updating formula with calculated hash..."
|
|
77
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
78
|
+
sed -i '' "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
|
|
79
|
+
else
|
|
80
|
+
sed -i "s/sha256 \".*\"/sha256 \"${SHA256}\"/" "$FORMULA_FILE"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Step 5: Validate formula syntax
|
|
84
|
+
echo "Step 5: Validating formula syntax..."
|
|
85
|
+
if ! ruby -c "$FORMULA_FILE" > /dev/null 2>&1; then
|
|
86
|
+
echo -e "${RED}✗ Formula has syntax errors${NC}"
|
|
87
|
+
ruby -c "$FORMULA_FILE"
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
echo -e "${GREEN}✓ Formula syntax is valid${NC}"
|
|
92
|
+
|
|
93
|
+
# Step 6: Audit formula (if brew is available)
|
|
94
|
+
if command -v brew >/dev/null 2>&1; then
|
|
95
|
+
echo "Step 6: Auditing formula with Homebrew..."
|
|
96
|
+
# Note: brew audit with path doesn't work in current Homebrew versions
|
|
97
|
+
# This is a known limitation, so we skip it for now
|
|
98
|
+
echo -e "${YELLOW}Note: Automated brew audit is not available for local formulae${NC}"
|
|
99
|
+
echo -e "${YELLOW}Manual audit will be required after pushing to repository${NC}"
|
|
100
|
+
else
|
|
101
|
+
echo -e "${YELLOW}Step 6: Skipping brew audit (brew not installed)${NC}"
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
echo ""
|
|
105
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
106
|
+
echo -e "${GREEN}Success! Homebrew formula updated to v${VERSION}${NC}"
|
|
107
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
108
|
+
echo ""
|
|
109
|
+
echo "Changes made to: ${FORMULA_FILE}"
|
|
110
|
+
echo ""
|
|
111
|
+
echo "Formula details:"
|
|
112
|
+
echo " Version: ${VERSION}"
|
|
113
|
+
echo " URL: ${NPM_URL}"
|
|
114
|
+
echo " SHA256: ${SHA256}"
|
|
115
|
+
echo ""
|
|
116
|
+
echo "Next steps:"
|
|
117
|
+
echo " 1. Review the changes: git diff ${FORMULA_FILE}"
|
|
118
|
+
echo " 2. Commit: git add ${FORMULA_FILE}"
|
|
119
|
+
echo " 3. Commit: git commit -m 'chore: update homebrew formula to v${VERSION}'"
|
|
120
|
+
echo " 4. Push: git push"
|
|
121
|
+
echo ""
|
|
122
|
+
echo "To test the formula locally:"
|
|
123
|
+
echo " 1. brew tap mochiyaki/coder https://github.com/mochiyaki/coder"
|
|
124
|
+
echo " 2. brew install coder"
|
|
125
|
+
echo " 3. coder --help"
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Update Nix package version and hashes for a new release
|
|
3
|
+
# Usage: ./scripts/update-nix-version.sh <version>
|
|
4
|
+
# Example: ./scripts/update-nix-version.sh 1.15.0
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
VERSION=$1
|
|
9
|
+
SKIP_VERIFY=$2
|
|
10
|
+
NIX_FILE="nix/packages/default/default.nix"
|
|
11
|
+
FAKE_HASH="sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
|
|
12
|
+
|
|
13
|
+
# Color codes for output
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
NC='\033[0m' # No Color
|
|
18
|
+
|
|
19
|
+
if [ -z "$VERSION" ]; then
|
|
20
|
+
echo -e "${RED}Error: Version number required${NC}"
|
|
21
|
+
echo "Usage: $0 <version> [--skip-verify]"
|
|
22
|
+
echo "Example: $0 1.15.0"
|
|
23
|
+
echo "Example: $0 1.15.0 --skip-verify"
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
echo -e "${YELLOW}Updating Nix package to version ${VERSION}...${NC}"
|
|
28
|
+
echo ""
|
|
29
|
+
|
|
30
|
+
# Step 1: Update version in nix file
|
|
31
|
+
echo "Step 1: Updating version number in ${NIX_FILE}..."
|
|
32
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
33
|
+
sed -i '' "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
|
|
34
|
+
else
|
|
35
|
+
sed -i "s|version = \".*\";|version = \"${VERSION}\";|" "$NIX_FILE"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Step 2: Insert fake source hash
|
|
39
|
+
echo "Step 2: Using fake source hash to trigger hash calculation..."
|
|
40
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
41
|
+
sed -i '' "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
|
|
42
|
+
else
|
|
43
|
+
sed -i "s|sha256 = \".*\";|sha256 = \"${FAKE_HASH}\";|" "$NIX_FILE"
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Step 3: Build to get the real source hash
|
|
47
|
+
echo "Step 3: Building package to get correct source hash..."
|
|
48
|
+
echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
|
|
49
|
+
echo ""
|
|
50
|
+
|
|
51
|
+
BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
|
|
52
|
+
SOURCE_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
|
|
53
|
+
|
|
54
|
+
if [ -z "$SOURCE_HASH" ]; then
|
|
55
|
+
echo -e "${RED}Error: Could not extract source hash from build output${NC}"
|
|
56
|
+
echo "Build output:"
|
|
57
|
+
echo "$BUILD_OUTPUT"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
echo -e "${GREEN}Found source hash: ${SOURCE_HASH}${NC}"
|
|
62
|
+
echo ""
|
|
63
|
+
|
|
64
|
+
# Step 4: Update with real source hash
|
|
65
|
+
echo "Step 4: Updating with correct source hash..."
|
|
66
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
67
|
+
sed -i '' "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
|
|
68
|
+
else
|
|
69
|
+
sed -i "s|sha256 = \".*\";|sha256 = \"${SOURCE_HASH}\";|" "$NIX_FILE"
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Step 5: Insert fake pnpmDeps hash
|
|
73
|
+
echo "Step 5: Using fake pnpmDeps hash to trigger hash calculation..."
|
|
74
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
75
|
+
sed -i '' "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
|
|
76
|
+
else
|
|
77
|
+
sed -i "s|hash = \".*\";|hash = \"${FAKE_HASH}\";|" "$NIX_FILE"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# Step 6: Build to get the real pnpmDeps hash
|
|
81
|
+
echo "Step 6: Building package to get correct pnpmDeps hash..."
|
|
82
|
+
echo -e "${YELLOW}(This will fail - that's expected!)${NC}"
|
|
83
|
+
echo ""
|
|
84
|
+
|
|
85
|
+
BUILD_OUTPUT=$(nix build .#default 2>&1 || true)
|
|
86
|
+
PNPM_HASH=$(echo "$BUILD_OUTPUT" | sed -n 's/.*got:[[:space:]]*\(sha256-[A-Za-z0-9+/=]*\).*/\1/p' | head -1)
|
|
87
|
+
|
|
88
|
+
if [ -z "$PNPM_HASH" ]; then
|
|
89
|
+
echo -e "${RED}Error: Could not extract pnpmDeps hash from build output${NC}"
|
|
90
|
+
echo "Build output:"
|
|
91
|
+
echo "$BUILD_OUTPUT"
|
|
92
|
+
exit 1
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
echo -e "${GREEN}Found pnpmDeps hash: ${PNPM_HASH}${NC}"
|
|
96
|
+
echo ""
|
|
97
|
+
|
|
98
|
+
# Step 7: Update with real pnpmDeps hash
|
|
99
|
+
echo "Step 7: Updating with correct pnpmDeps hash..."
|
|
100
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
101
|
+
sed -i '' "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
|
|
102
|
+
else
|
|
103
|
+
sed -i "s|hash = \".*\";|hash = \"${PNPM_HASH}\";|" "$NIX_FILE"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Step 8: Build again to verify (unless --skip-verify is passed)
|
|
107
|
+
if [ "$SKIP_VERIFY" = "--skip-verify" ]; then
|
|
108
|
+
echo "Step 8: Skipping verification build (--skip-verify flag passed)"
|
|
109
|
+
echo ""
|
|
110
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
111
|
+
echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
|
|
112
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
113
|
+
echo ""
|
|
114
|
+
echo "Changes made to: ${NIX_FILE}"
|
|
115
|
+
echo ""
|
|
116
|
+
echo "Source hash: ${SOURCE_HASH}"
|
|
117
|
+
echo "pnpmDeps hash: ${PNPM_HASH}"
|
|
118
|
+
echo ""
|
|
119
|
+
echo -e "${YELLOW}Note: Verification build was skipped. Run 'nix build .#default' locally to verify.${NC}"
|
|
120
|
+
else
|
|
121
|
+
echo "Step 8: Verifying build with correct hashes..."
|
|
122
|
+
if nix build .#default; then
|
|
123
|
+
echo -e "${GREEN}✓ Build successful!${NC}"
|
|
124
|
+
echo ""
|
|
125
|
+
|
|
126
|
+
# Test the binary exists
|
|
127
|
+
echo "Step 9: Verifying binary exists..."
|
|
128
|
+
if [ -f "./result/bin/coder" ] && [ -x "./result/bin/coder" ]; then
|
|
129
|
+
echo -e "${GREEN}✓ Binary exists and is executable!${NC}"
|
|
130
|
+
else
|
|
131
|
+
echo -e "${YELLOW}⚠ Warning: Binary not found or not executable${NC}"
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Clean up
|
|
135
|
+
rm -f result
|
|
136
|
+
|
|
137
|
+
echo ""
|
|
138
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
139
|
+
echo -e "${GREEN}Success! Nix package updated to v${VERSION}${NC}"
|
|
140
|
+
echo -e "${GREEN}════════════════════════════════════════════════${NC}"
|
|
141
|
+
echo ""
|
|
142
|
+
echo "Changes made to: ${NIX_FILE}"
|
|
143
|
+
echo ""
|
|
144
|
+
echo "Source hash: ${SOURCE_HASH}"
|
|
145
|
+
echo "pnpmDeps hash: ${PNPM_HASH}"
|
|
146
|
+
echo ""
|
|
147
|
+
echo "Next steps:"
|
|
148
|
+
echo " 1. Review the changes: git diff ${NIX_FILE}"
|
|
149
|
+
echo " 2. Commit: git add ${NIX_FILE}"
|
|
150
|
+
echo " 3. Commit: git commit -m 'chore: update nix package to v${VERSION}'"
|
|
151
|
+
echo " 4. Push: git push"
|
|
152
|
+
else
|
|
153
|
+
echo -e "${RED}✗ Build failed with correct hashes${NC}"
|
|
154
|
+
echo "Please check the build output above for errors."
|
|
155
|
+
exit 1
|
|
156
|
+
fi
|
|
157
|
+
fi
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import type {AIProviderConfig} from '@/types/index';
|
|
3
|
+
import {AISDKClient} from './AISDKClient.js';
|
|
4
|
+
|
|
5
|
+
test('AISDKClient constructor initializes with config', t => {
|
|
6
|
+
const config: AIProviderConfig = {
|
|
7
|
+
name: 'TestProvider',
|
|
8
|
+
type: 'openai',
|
|
9
|
+
models: ['test-model-1', 'test-model-2'],
|
|
10
|
+
config: {
|
|
11
|
+
baseURL: 'https://api.test.com',
|
|
12
|
+
apiKey: 'test-key',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const client = new AISDKClient(config);
|
|
17
|
+
|
|
18
|
+
t.is(client.getCurrentModel(), 'test-model-1');
|
|
19
|
+
t.is(client.getContextSize(), 0); // Not yet loaded
|
|
20
|
+
t.is(client.getMaxRetries(), 2); // Default value
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('AISDKClient.create returns a Promise', async t => {
|
|
24
|
+
const config: AIProviderConfig = {
|
|
25
|
+
name: 'TestProvider',
|
|
26
|
+
type: 'openai',
|
|
27
|
+
models: ['test-model'],
|
|
28
|
+
config: {
|
|
29
|
+
baseURL: 'https://api.test.com',
|
|
30
|
+
apiKey: 'test-key',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const client = await AISDKClient.create(config);
|
|
35
|
+
|
|
36
|
+
t.truthy(client);
|
|
37
|
+
t.true(client instanceof AISDKClient);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('AISDKClient setModel updates current model', t => {
|
|
41
|
+
const config: AIProviderConfig = {
|
|
42
|
+
name: 'TestProvider',
|
|
43
|
+
type: 'openai',
|
|
44
|
+
models: ['model-1', 'model-2'],
|
|
45
|
+
config: {
|
|
46
|
+
baseURL: 'https://api.test.com',
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const client = new AISDKClient(config);
|
|
51
|
+
t.is(client.getCurrentModel(), 'model-1');
|
|
52
|
+
|
|
53
|
+
client.setModel('model-2');
|
|
54
|
+
t.is(client.getCurrentModel(), 'model-2');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('AISDKClient getAvailableModels returns models array', async t => {
|
|
58
|
+
const config: AIProviderConfig = {
|
|
59
|
+
name: 'TestProvider',
|
|
60
|
+
type: 'openai',
|
|
61
|
+
models: ['model-1', 'model-2', 'model-3'],
|
|
62
|
+
config: {
|
|
63
|
+
baseURL: 'https://api.test.com',
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const client = new AISDKClient(config);
|
|
68
|
+
const models = await client.getAvailableModels();
|
|
69
|
+
|
|
70
|
+
t.deepEqual(models, ['model-1', 'model-2', 'model-3']);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('AISDKClient clearContext resolves successfully', async t => {
|
|
74
|
+
const config: AIProviderConfig = {
|
|
75
|
+
name: 'TestProvider',
|
|
76
|
+
type: 'openai',
|
|
77
|
+
models: ['test-model'],
|
|
78
|
+
config: {
|
|
79
|
+
baseURL: 'https://api.test.com',
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const client = new AISDKClient(config);
|
|
84
|
+
|
|
85
|
+
await t.notThrowsAsync(async () => {
|
|
86
|
+
await client.clearContext();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('AISDKClient uses custom maxRetries from config', t => {
|
|
91
|
+
const config: AIProviderConfig = {
|
|
92
|
+
name: 'TestProvider',
|
|
93
|
+
type: 'openai',
|
|
94
|
+
models: ['test-model'],
|
|
95
|
+
maxRetries: 5,
|
|
96
|
+
config: {
|
|
97
|
+
baseURL: 'https://api.test.com',
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const client = new AISDKClient(config);
|
|
102
|
+
t.is(client.getMaxRetries(), 5);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('AISDKClient handles config without models', t => {
|
|
106
|
+
const config: AIProviderConfig = {
|
|
107
|
+
name: 'TestProvider',
|
|
108
|
+
type: 'openai',
|
|
109
|
+
models: [],
|
|
110
|
+
config: {
|
|
111
|
+
baseURL: 'https://api.test.com',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const client = new AISDKClient(config);
|
|
116
|
+
t.is(client.getCurrentModel(), '');
|
|
117
|
+
});
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {TIMEOUT_SOCKET_DEFAULT_MS} from '@/constants';
|
|
2
|
+
import {getModelContextLimit} from '@/models/index.js';
|
|
3
|
+
import type {
|
|
4
|
+
AIProviderConfig,
|
|
5
|
+
AISDKCoreTool,
|
|
6
|
+
LLMChatResponse,
|
|
7
|
+
LLMClient,
|
|
8
|
+
Message,
|
|
9
|
+
StreamCallbacks,
|
|
10
|
+
} from '@/types/index';
|
|
11
|
+
import {getLogger} from '@/utils/logging';
|
|
12
|
+
import {createOpenAICompatible} from '@ai-sdk/openai-compatible';
|
|
13
|
+
import type {LanguageModel} from 'ai';
|
|
14
|
+
import {Agent} from 'undici';
|
|
15
|
+
import {handleChat} from './chat/chat-handler.js';
|
|
16
|
+
import {createProvider} from './providers/provider-factory.js';
|
|
17
|
+
|
|
18
|
+
export class AISDKClient implements LLMClient {
|
|
19
|
+
private provider: ReturnType<typeof createOpenAICompatible>;
|
|
20
|
+
private currentModel: string;
|
|
21
|
+
private availableModels: string[];
|
|
22
|
+
private providerConfig: AIProviderConfig;
|
|
23
|
+
private undiciAgent: Agent;
|
|
24
|
+
private cachedContextSize: number;
|
|
25
|
+
private maxRetries: number;
|
|
26
|
+
|
|
27
|
+
constructor(providerConfig: AIProviderConfig) {
|
|
28
|
+
const logger = getLogger();
|
|
29
|
+
|
|
30
|
+
this.providerConfig = providerConfig;
|
|
31
|
+
this.availableModels = providerConfig.models;
|
|
32
|
+
this.currentModel = providerConfig.models[0] || '';
|
|
33
|
+
this.cachedContextSize = 0;
|
|
34
|
+
// Default to 2 retries (same as AI SDK default), or use configured value
|
|
35
|
+
this.maxRetries = providerConfig.maxRetries ?? 2;
|
|
36
|
+
|
|
37
|
+
logger.info('AI SDK client initializing', {
|
|
38
|
+
models: this.availableModels,
|
|
39
|
+
defaultModel: this.currentModel,
|
|
40
|
+
provider: providerConfig.name || 'unknown',
|
|
41
|
+
baseUrl: providerConfig.config.baseURL ? '[REDACTED]' : undefined,
|
|
42
|
+
maxRetries: this.maxRetries,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const {connectionPool} = this.providerConfig;
|
|
46
|
+
const {requestTimeout, socketTimeout} = this.providerConfig;
|
|
47
|
+
const effectiveSocketTimeout = socketTimeout ?? requestTimeout;
|
|
48
|
+
const resolvedSocketTimeout =
|
|
49
|
+
effectiveSocketTimeout === -1
|
|
50
|
+
? 0
|
|
51
|
+
: (effectiveSocketTimeout ?? TIMEOUT_SOCKET_DEFAULT_MS);
|
|
52
|
+
|
|
53
|
+
this.undiciAgent = new Agent({
|
|
54
|
+
connect: {
|
|
55
|
+
timeout: resolvedSocketTimeout,
|
|
56
|
+
},
|
|
57
|
+
bodyTimeout: resolvedSocketTimeout,
|
|
58
|
+
headersTimeout: resolvedSocketTimeout,
|
|
59
|
+
keepAliveTimeout: connectionPool?.idleTimeout,
|
|
60
|
+
keepAliveMaxTimeout: connectionPool?.cumulativeMaxIdleTimeout,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
this.provider = createProvider(this.providerConfig, this.undiciAgent);
|
|
64
|
+
|
|
65
|
+
// Fetch context size asynchronously (don't block construction)
|
|
66
|
+
void this.updateContextSize();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Fetch and cache context size from models.dev
|
|
71
|
+
*/
|
|
72
|
+
private async updateContextSize(): Promise<void> {
|
|
73
|
+
try {
|
|
74
|
+
const contextSize = await getModelContextLimit(this.currentModel);
|
|
75
|
+
this.cachedContextSize = contextSize || 0;
|
|
76
|
+
} catch {
|
|
77
|
+
// Silently fail - context size will remain 0
|
|
78
|
+
this.cachedContextSize = 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static create(providerConfig: AIProviderConfig): Promise<AISDKClient> {
|
|
83
|
+
const client = new AISDKClient(providerConfig);
|
|
84
|
+
return Promise.resolve(client);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
setModel(model: string): void {
|
|
88
|
+
const logger = getLogger();
|
|
89
|
+
const previousModel = this.currentModel;
|
|
90
|
+
|
|
91
|
+
this.currentModel = model;
|
|
92
|
+
|
|
93
|
+
logger.info('Model changed', {
|
|
94
|
+
previousModel,
|
|
95
|
+
newModel: model,
|
|
96
|
+
provider: this.providerConfig.name,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Update context size when model changes
|
|
100
|
+
void this.updateContextSize();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
getCurrentModel(): string {
|
|
104
|
+
return this.currentModel;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
getContextSize(): number {
|
|
108
|
+
return this.cachedContextSize;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
getMaxRetries(): number {
|
|
112
|
+
return this.maxRetries;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
getAvailableModels(): Promise<string[]> {
|
|
116
|
+
return Promise.resolve(this.availableModels);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Stream chat with real-time token updates
|
|
121
|
+
*/
|
|
122
|
+
async chat(
|
|
123
|
+
messages: Message[],
|
|
124
|
+
tools: Record<string, AISDKCoreTool>,
|
|
125
|
+
callbacks: StreamCallbacks,
|
|
126
|
+
signal?: AbortSignal,
|
|
127
|
+
): Promise<LLMChatResponse> {
|
|
128
|
+
// Get the language model instance from the provider
|
|
129
|
+
const model = this.provider(this.currentModel) as unknown as LanguageModel;
|
|
130
|
+
|
|
131
|
+
// Delegate to chat handler
|
|
132
|
+
return await handleChat({
|
|
133
|
+
model,
|
|
134
|
+
currentModel: this.currentModel,
|
|
135
|
+
providerConfig: this.providerConfig,
|
|
136
|
+
messages,
|
|
137
|
+
tools,
|
|
138
|
+
callbacks,
|
|
139
|
+
signal,
|
|
140
|
+
maxRetries: this.maxRetries,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
clearContext(): Promise<void> {
|
|
145
|
+
const logger = getLogger();
|
|
146
|
+
|
|
147
|
+
logger.debug('AI SDK client context cleared', {
|
|
148
|
+
model: this.currentModel,
|
|
149
|
+
provider: this.providerConfig.name,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// No internal state to clear
|
|
153
|
+
return Promise.resolve();
|
|
154
|
+
}
|
|
155
|
+
}
|