@gguf/coder 0.3.1 → 0.3.3
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/package.json +5 -2
- package/.editorconfig +0 -16
- package/.env.example +0 -63
- package/.gitattributes +0 -1
- package/.semgrepignore +0 -19
- package/coder-dummy-file.ts +0 -52
- package/coder.config.example.json +0 -59
- package/coder.config.json +0 -13
- package/color_picker.html +0 -36
- package/scripts/extract-changelog.js +0 -73
- package/scripts/fetch-models.js +0 -143
- package/scripts/test.sh +0 -40
- package/scripts/update-homebrew-formula.sh +0 -125
- package/scripts/update-nix-version.sh +0 -157
- package/source/ai-sdk-client/AISDKClient.spec.ts +0 -117
- package/source/ai-sdk-client/AISDKClient.ts +0 -155
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +0 -121
- package/source/ai-sdk-client/chat/chat-handler.ts +0 -276
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +0 -173
- package/source/ai-sdk-client/chat/streaming-handler.ts +0 -110
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +0 -92
- package/source/ai-sdk-client/chat/tool-processor.ts +0 -70
- package/source/ai-sdk-client/converters/message-converter.spec.ts +0 -220
- package/source/ai-sdk-client/converters/message-converter.ts +0 -113
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +0 -90
- package/source/ai-sdk-client/converters/tool-converter.ts +0 -46
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +0 -55
- package/source/ai-sdk-client/error-handling/error-extractor.ts +0 -15
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +0 -169
- package/source/ai-sdk-client/error-handling/error-parser.ts +0 -161
- package/source/ai-sdk-client/index.ts +0 -7
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +0 -71
- package/source/ai-sdk-client/providers/provider-factory.ts +0 -41
- package/source/ai-sdk-client/types.ts +0 -9
- package/source/ai-sdk-client-empty-message.spec.ts +0 -141
- package/source/ai-sdk-client-error-handling.spec.ts +0 -186
- package/source/ai-sdk-client-maxretries.spec.ts +0 -114
- package/source/ai-sdk-client-preparestep.spec.ts +0 -279
- package/source/app/App.spec.tsx +0 -32
- package/source/app/App.tsx +0 -480
- package/source/app/components/AppContainer.spec.tsx +0 -96
- package/source/app/components/AppContainer.tsx +0 -56
- package/source/app/components/ChatInterface.spec.tsx +0 -163
- package/source/app/components/ChatInterface.tsx +0 -144
- package/source/app/components/ModalSelectors.spec.tsx +0 -141
- package/source/app/components/ModalSelectors.tsx +0 -135
- package/source/app/helpers.spec.ts +0 -97
- package/source/app/helpers.ts +0 -63
- package/source/app/index.ts +0 -4
- package/source/app/types.ts +0 -39
- package/source/app/utils/appUtils.ts +0 -294
- package/source/app/utils/conversationState.ts +0 -310
- package/source/app.spec.tsx +0 -244
- package/source/cli.spec.ts +0 -73
- package/source/cli.tsx +0 -51
- package/source/client-factory.spec.ts +0 -48
- package/source/client-factory.ts +0 -178
- package/source/command-parser.spec.ts +0 -127
- package/source/command-parser.ts +0 -36
- package/source/commands/checkpoint.spec.tsx +0 -277
- package/source/commands/checkpoint.tsx +0 -366
- package/source/commands/clear.tsx +0 -22
- package/source/commands/custom-commands.tsx +0 -121
- package/source/commands/exit.ts +0 -21
- package/source/commands/export.spec.tsx +0 -131
- package/source/commands/export.tsx +0 -79
- package/source/commands/help.tsx +0 -120
- package/source/commands/index.ts +0 -17
- package/source/commands/init.tsx +0 -339
- package/source/commands/lsp-command.spec.tsx +0 -281
- package/source/commands/lsp.tsx +0 -120
- package/source/commands/mcp-command.spec.tsx +0 -313
- package/source/commands/mcp.tsx +0 -162
- package/source/commands/model-database.spec.tsx +0 -758
- package/source/commands/model-database.tsx +0 -418
- package/source/commands/model.ts +0 -12
- package/source/commands/provider.ts +0 -12
- package/source/commands/setup-config.tsx +0 -16
- package/source/commands/simple-commands.spec.tsx +0 -175
- package/source/commands/status.ts +0 -12
- package/source/commands/theme.ts +0 -12
- package/source/commands/update.spec.tsx +0 -261
- package/source/commands/update.tsx +0 -201
- package/source/commands/usage.spec.tsx +0 -495
- package/source/commands/usage.tsx +0 -100
- package/source/commands.spec.ts +0 -436
- package/source/commands.ts +0 -83
- package/source/components/assistant-message.spec.tsx +0 -796
- package/source/components/assistant-message.tsx +0 -34
- package/source/components/bash-execution-indicator.tsx +0 -21
- package/source/components/cancelling-indicator.tsx +0 -16
- package/source/components/chat-queue.spec.tsx +0 -83
- package/source/components/chat-queue.tsx +0 -36
- package/source/components/checkpoint-display.spec.tsx +0 -219
- package/source/components/checkpoint-display.tsx +0 -126
- package/source/components/checkpoint-selector.spec.tsx +0 -173
- package/source/components/checkpoint-selector.tsx +0 -173
- package/source/components/development-mode-indicator.spec.tsx +0 -268
- package/source/components/development-mode-indicator.tsx +0 -38
- package/source/components/message-box.spec.tsx +0 -427
- package/source/components/message-box.tsx +0 -87
- package/source/components/model-selector.tsx +0 -132
- package/source/components/provider-selector.tsx +0 -75
- package/source/components/random-spinner.tsx +0 -19
- package/source/components/security-disclaimer.tsx +0 -73
- package/source/components/status-connection-display.spec.tsx +0 -133
- package/source/components/status.tsx +0 -267
- package/source/components/theme-selector.tsx +0 -126
- package/source/components/tool-confirmation.tsx +0 -190
- package/source/components/tool-execution-indicator.tsx +0 -33
- package/source/components/tool-message.tsx +0 -85
- package/source/components/ui/titled-box.spec.tsx +0 -207
- package/source/components/ui/titled-box.tsx +0 -57
- package/source/components/usage/progress-bar.spec.tsx +0 -398
- package/source/components/usage/progress-bar.tsx +0 -30
- package/source/components/usage/usage-display.spec.tsx +0 -780
- package/source/components/usage/usage-display.tsx +0 -291
- package/source/components/user-input.spec.tsx +0 -327
- package/source/components/user-input.tsx +0 -533
- package/source/components/user-message.spec.tsx +0 -230
- package/source/components/user-message.tsx +0 -84
- package/source/components/welcome-message.tsx +0 -76
- package/source/config/env-substitution.ts +0 -65
- package/source/config/index.spec.ts +0 -171
- package/source/config/index.ts +0 -154
- package/source/config/paths.spec.ts +0 -241
- package/source/config/paths.ts +0 -55
- package/source/config/preferences.ts +0 -51
- package/source/config/themes.ts +0 -315
- package/source/constants.ts +0 -130
- package/source/context/mode-context.spec.ts +0 -79
- package/source/context/mode-context.ts +0 -24
- package/source/custom-commands/executor.spec.ts +0 -142
- package/source/custom-commands/executor.ts +0 -64
- package/source/custom-commands/loader.spec.ts +0 -314
- package/source/custom-commands/loader.ts +0 -153
- package/source/custom-commands/parser.ts +0 -196
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +0 -39
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +0 -511
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +0 -50
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +0 -109
- package/source/hooks/chat-handler/index.ts +0 -12
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +0 -26
- package/source/hooks/chat-handler/state/streaming-state.ts +0 -19
- package/source/hooks/chat-handler/types.ts +0 -38
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +0 -321
- package/source/hooks/chat-handler/useChatHandler.tsx +0 -194
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +0 -60
- package/source/hooks/chat-handler/utils/context-checker.tsx +0 -73
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +0 -42
- package/source/hooks/chat-handler/utils/message-helpers.tsx +0 -36
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +0 -109
- package/source/hooks/chat-handler/utils/tool-filters.ts +0 -64
- package/source/hooks/useAppHandlers.tsx +0 -291
- package/source/hooks/useAppInitialization.tsx +0 -422
- package/source/hooks/useAppState.tsx +0 -311
- package/source/hooks/useDirectoryTrust.tsx +0 -98
- package/source/hooks/useInputState.ts +0 -414
- package/source/hooks/useModeHandlers.tsx +0 -302
- package/source/hooks/useNonInteractiveMode.ts +0 -140
- package/source/hooks/useTerminalWidth.tsx +0 -81
- package/source/hooks/useTheme.ts +0 -18
- package/source/hooks/useToolHandler.tsx +0 -349
- package/source/hooks/useUIState.ts +0 -61
- package/source/init/agents-template-generator.ts +0 -421
- package/source/init/existing-rules-extractor.ts +0 -319
- package/source/init/file-scanner.spec.ts +0 -227
- package/source/init/file-scanner.ts +0 -238
- package/source/init/framework-detector.ts +0 -382
- package/source/init/language-detector.ts +0 -269
- package/source/init/project-analyzer.spec.ts +0 -231
- package/source/init/project-analyzer.ts +0 -458
- package/source/lsp/index.ts +0 -31
- package/source/lsp/lsp-client.spec.ts +0 -508
- package/source/lsp/lsp-client.ts +0 -487
- package/source/lsp/lsp-manager.spec.ts +0 -477
- package/source/lsp/lsp-manager.ts +0 -419
- package/source/lsp/protocol.spec.ts +0 -502
- package/source/lsp/protocol.ts +0 -360
- package/source/lsp/server-discovery.spec.ts +0 -654
- package/source/lsp/server-discovery.ts +0 -515
- package/source/markdown-parser/html-entities.spec.ts +0 -88
- package/source/markdown-parser/html-entities.ts +0 -45
- package/source/markdown-parser/index.spec.ts +0 -281
- package/source/markdown-parser/index.ts +0 -126
- package/source/markdown-parser/table-parser.spec.ts +0 -133
- package/source/markdown-parser/table-parser.ts +0 -114
- package/source/markdown-parser/utils.spec.ts +0 -70
- package/source/markdown-parser/utils.ts +0 -13
- package/source/mcp/mcp-client.spec.ts +0 -81
- package/source/mcp/mcp-client.ts +0 -625
- package/source/mcp/transport-factory.spec.ts +0 -406
- package/source/mcp/transport-factory.ts +0 -312
- package/source/message-handler.ts +0 -67
- package/source/model-database/database-engine.spec.ts +0 -494
- package/source/model-database/database-engine.ts +0 -50
- package/source/model-database/model-database.spec.ts +0 -363
- package/source/model-database/model-database.ts +0 -91
- package/source/model-database/model-engine.spec.ts +0 -447
- package/source/model-database/model-engine.ts +0 -65
- package/source/model-database/model-fetcher.spec.ts +0 -583
- package/source/model-database/model-fetcher.ts +0 -330
- package/source/models/index.ts +0 -1
- package/source/models/models-cache.spec.ts +0 -214
- package/source/models/models-cache.ts +0 -78
- package/source/models/models-dev-client.spec.ts +0 -379
- package/source/models/models-dev-client.ts +0 -329
- package/source/models/models-types.ts +0 -68
- package/source/prompt-history.ts +0 -155
- package/source/security/command-injection.spec.ts +0 -240
- package/source/services/checkpoint-manager.spec.ts +0 -523
- package/source/services/checkpoint-manager.ts +0 -466
- package/source/services/file-snapshot.spec.ts +0 -569
- package/source/services/file-snapshot.ts +0 -220
- package/source/test-utils/render-with-theme.tsx +0 -48
- package/source/tokenization/index.ts +0 -1
- package/source/tokenization/tokenizer-factory.spec.ts +0 -170
- package/source/tokenization/tokenizer-factory.ts +0 -125
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +0 -200
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +0 -43
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +0 -236
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +0 -26
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +0 -224
- package/source/tokenization/tokenizers/llama-tokenizer.ts +0 -41
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +0 -184
- package/source/tokenization/tokenizers/openai-tokenizer.ts +0 -57
- package/source/tool-calling/index.ts +0 -5
- package/source/tool-calling/json-parser.spec.ts +0 -639
- package/source/tool-calling/json-parser.ts +0 -247
- package/source/tool-calling/tool-parser.spec.ts +0 -395
- package/source/tool-calling/tool-parser.ts +0 -120
- package/source/tool-calling/xml-parser.spec.ts +0 -662
- package/source/tool-calling/xml-parser.ts +0 -289
- package/source/tools/execute-bash.spec.tsx +0 -353
- package/source/tools/execute-bash.tsx +0 -219
- package/source/tools/execute-function.spec.ts +0 -130
- package/source/tools/fetch-url.spec.tsx +0 -342
- package/source/tools/fetch-url.tsx +0 -172
- package/source/tools/find-files.spec.tsx +0 -924
- package/source/tools/find-files.tsx +0 -293
- package/source/tools/index.ts +0 -102
- package/source/tools/lsp-get-diagnostics.tsx +0 -192
- package/source/tools/needs-approval.spec.ts +0 -282
- package/source/tools/read-file.spec.tsx +0 -801
- package/source/tools/read-file.tsx +0 -387
- package/source/tools/search-file-contents.spec.tsx +0 -1273
- package/source/tools/search-file-contents.tsx +0 -293
- package/source/tools/string-replace.spec.tsx +0 -730
- package/source/tools/string-replace.tsx +0 -548
- package/source/tools/tool-manager.ts +0 -210
- package/source/tools/tool-registry.spec.ts +0 -415
- package/source/tools/tool-registry.ts +0 -228
- package/source/tools/web-search.tsx +0 -223
- package/source/tools/write-file.spec.tsx +0 -559
- package/source/tools/write-file.tsx +0 -228
- package/source/types/app.ts +0 -37
- package/source/types/checkpoint.ts +0 -48
- package/source/types/commands.ts +0 -46
- package/source/types/components.ts +0 -27
- package/source/types/config.ts +0 -103
- package/source/types/core-connection-status.spec.ts +0 -67
- package/source/types/core.ts +0 -181
- package/source/types/hooks.ts +0 -50
- package/source/types/index.ts +0 -12
- package/source/types/markdown-parser.ts +0 -11
- package/source/types/mcp.ts +0 -52
- package/source/types/system.ts +0 -16
- package/source/types/tokenization.ts +0 -41
- package/source/types/ui.ts +0 -40
- package/source/types/usage.ts +0 -58
- package/source/types/utils.ts +0 -16
- package/source/usage/calculator.spec.ts +0 -385
- package/source/usage/calculator.ts +0 -104
- package/source/usage/storage.spec.ts +0 -703
- package/source/usage/storage.ts +0 -238
- package/source/usage/tracker.spec.ts +0 -456
- package/source/usage/tracker.ts +0 -102
- package/source/utils/atomic-deletion.spec.ts +0 -194
- package/source/utils/atomic-deletion.ts +0 -127
- package/source/utils/bounded-map.spec.ts +0 -300
- package/source/utils/bounded-map.ts +0 -193
- package/source/utils/checkpoint-utils.spec.ts +0 -222
- package/source/utils/checkpoint-utils.ts +0 -92
- package/source/utils/error-formatter.spec.ts +0 -169
- package/source/utils/error-formatter.ts +0 -194
- package/source/utils/file-autocomplete.spec.ts +0 -173
- package/source/utils/file-autocomplete.ts +0 -196
- package/source/utils/file-cache.spec.ts +0 -309
- package/source/utils/file-cache.ts +0 -195
- package/source/utils/file-content-loader.spec.ts +0 -180
- package/source/utils/file-content-loader.ts +0 -179
- package/source/utils/file-mention-handler.spec.ts +0 -261
- package/source/utils/file-mention-handler.ts +0 -84
- package/source/utils/file-mention-parser.spec.ts +0 -182
- package/source/utils/file-mention-parser.ts +0 -170
- package/source/utils/fuzzy-matching.spec.ts +0 -149
- package/source/utils/fuzzy-matching.ts +0 -146
- package/source/utils/indentation-normalizer.spec.ts +0 -216
- package/source/utils/indentation-normalizer.ts +0 -76
- package/source/utils/installation-detector.spec.ts +0 -178
- package/source/utils/installation-detector.ts +0 -153
- package/source/utils/logging/config.spec.ts +0 -311
- package/source/utils/logging/config.ts +0 -210
- package/source/utils/logging/console-facade.spec.ts +0 -184
- package/source/utils/logging/console-facade.ts +0 -384
- package/source/utils/logging/correlation.spec.ts +0 -679
- package/source/utils/logging/correlation.ts +0 -474
- package/source/utils/logging/formatters.spec.ts +0 -464
- package/source/utils/logging/formatters.ts +0 -207
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +0 -93
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +0 -79
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +0 -43
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/logging-check.ts +0 -58
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +0 -100
- package/source/utils/logging/health-monitor/checks/memory-check.ts +0 -78
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/performance-check.ts +0 -56
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +0 -56
- package/source/utils/logging/health-monitor/checks/request-check.ts +0 -76
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +0 -70
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +0 -138
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +0 -58
- package/source/utils/logging/health-monitor/core/health-monitor.ts +0 -344
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +0 -65
- package/source/utils/logging/health-monitor/core/scoring.ts +0 -91
- package/source/utils/logging/health-monitor/index.ts +0 -15
- package/source/utils/logging/health-monitor/instances.ts +0 -48
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +0 -141
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +0 -75
- package/source/utils/logging/health-monitor/types.ts +0 -126
- package/source/utils/logging/index.spec.ts +0 -284
- package/source/utils/logging/index.ts +0 -236
- package/source/utils/logging/integration.spec.ts +0 -441
- package/source/utils/logging/log-method-factory.spec.ts +0 -573
- package/source/utils/logging/log-method-factory.ts +0 -233
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +0 -277
- package/source/utils/logging/log-query/aggregation/aggregator.ts +0 -159
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +0 -159
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +0 -47
- package/source/utils/logging/log-query/index.ts +0 -23
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +0 -247
- package/source/utils/logging/log-query/query/filter-predicates.ts +0 -154
- package/source/utils/logging/log-query/query/query-builder.spec.ts +0 -182
- package/source/utils/logging/log-query/query/query-builder.ts +0 -151
- package/source/utils/logging/log-query/query/query-engine.spec.ts +0 -214
- package/source/utils/logging/log-query/query/query-engine.ts +0 -45
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +0 -143
- package/source/utils/logging/log-query/storage/circular-buffer.ts +0 -75
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +0 -150
- package/source/utils/logging/log-query/storage/index-manager.ts +0 -71
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +0 -257
- package/source/utils/logging/log-query/storage/log-storage.ts +0 -80
- package/source/utils/logging/log-query/types.ts +0 -163
- package/source/utils/logging/log-query/utils/helpers.spec.ts +0 -263
- package/source/utils/logging/log-query/utils/helpers.ts +0 -72
- package/source/utils/logging/log-query/utils/sorting.spec.ts +0 -182
- package/source/utils/logging/log-query/utils/sorting.ts +0 -61
- package/source/utils/logging/logger-provider.spec.ts +0 -262
- package/source/utils/logging/logger-provider.ts +0 -362
- package/source/utils/logging/performance.spec.ts +0 -209
- package/source/utils/logging/performance.ts +0 -757
- package/source/utils/logging/pino-logger.spec.ts +0 -425
- package/source/utils/logging/pino-logger.ts +0 -514
- package/source/utils/logging/redaction.spec.ts +0 -490
- package/source/utils/logging/redaction.ts +0 -267
- package/source/utils/logging/request-tracker.spec.ts +0 -1198
- package/source/utils/logging/request-tracker.ts +0 -803
- package/source/utils/logging/transports.spec.ts +0 -505
- package/source/utils/logging/transports.ts +0 -305
- package/source/utils/logging/types.ts +0 -216
- package/source/utils/message-builder.spec.ts +0 -179
- package/source/utils/message-builder.ts +0 -101
- package/source/utils/message-queue.tsx +0 -486
- package/source/utils/paste-detection.spec.ts +0 -69
- package/source/utils/paste-detection.ts +0 -124
- package/source/utils/paste-roundtrip.spec.ts +0 -442
- package/source/utils/paste-utils.spec.ts +0 -128
- package/source/utils/paste-utils.ts +0 -52
- package/source/utils/programming-language-helper.spec.ts +0 -74
- package/source/utils/programming-language-helper.ts +0 -32
- package/source/utils/prompt-assembly.spec.ts +0 -221
- package/source/utils/prompt-processor.ts +0 -173
- package/source/utils/tool-args-parser.spec.ts +0 -136
- package/source/utils/tool-args-parser.ts +0 -54
- package/source/utils/tool-cancellation.spec.ts +0 -230
- package/source/utils/tool-cancellation.ts +0 -28
- package/source/utils/tool-result-display.spec.tsx +0 -469
- package/source/utils/tool-result-display.tsx +0 -90
- package/source/utils/update-checker.spec.ts +0 -383
- package/source/utils/update-checker.ts +0 -183
- package/source/wizard/config-wizard.spec.tsx +0 -103
- package/source/wizard/config-wizard.tsx +0 -382
- package/source/wizard/steps/location-step.spec.tsx +0 -186
- package/source/wizard/steps/location-step.tsx +0 -147
- package/source/wizard/steps/mcp-step.spec.tsx +0 -607
- package/source/wizard/steps/mcp-step.tsx +0 -632
- package/source/wizard/steps/provider-step.spec.tsx +0 -342
- package/source/wizard/steps/provider-step.tsx +0 -957
- package/source/wizard/steps/summary-step.spec.tsx +0 -749
- package/source/wizard/steps/summary-step.tsx +0 -228
- package/source/wizard/templates/mcp-templates.spec.ts +0 -613
- package/source/wizard/templates/mcp-templates.ts +0 -570
- package/source/wizard/templates/provider-templates.spec.ts +0 -152
- package/source/wizard/templates/provider-templates.ts +0 -485
- package/source/wizard/utils/fetch-cloud-models.spec.ts +0 -428
- package/source/wizard/utils/fetch-cloud-models.ts +0 -223
- package/source/wizard/utils/fetch-local-models.spec.ts +0 -297
- package/source/wizard/utils/fetch-local-models.ts +0 -192
- package/source/wizard/validation-array.spec.ts +0 -264
- package/source/wizard/validation.spec.ts +0 -373
- package/source/wizard/validation.ts +0 -232
|
@@ -1,418 +0,0 @@
|
|
|
1
|
-
import {TitledBox} from '@/components/ui/titled-box';
|
|
2
|
-
import {
|
|
3
|
-
COST_SCORE_CHEAP,
|
|
4
|
-
COST_SCORE_EXPENSIVE,
|
|
5
|
-
COST_SCORE_FREE,
|
|
6
|
-
COST_SCORE_MODERATE,
|
|
7
|
-
} from '@/constants';
|
|
8
|
-
import {useTerminalWidth} from '@/hooks/useTerminalWidth';
|
|
9
|
-
import {useTheme} from '@/hooks/useTheme';
|
|
10
|
-
import {databaseEngine} from '@/model-database/database-engine';
|
|
11
|
-
import {Colors, Command, ModelEntry} from '@/types/index';
|
|
12
|
-
import {Box, Text, useFocus, useInput} from 'ink';
|
|
13
|
-
import {Tab, Tabs} from 'ink-tab';
|
|
14
|
-
import React, {useState, useEffect} from 'react';
|
|
15
|
-
|
|
16
|
-
type TabType = 'latest' | 'open' | 'proprietary';
|
|
17
|
-
|
|
18
|
-
interface ModelDatabaseDisplayProps {
|
|
19
|
-
onCancel?: () => void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function ModelDatabaseDisplay({onCancel}: ModelDatabaseDisplayProps) {
|
|
23
|
-
const boxWidth = useTerminalWidth();
|
|
24
|
-
const {colors} = useTheme();
|
|
25
|
-
const [openModels, setOpenModels] = useState<ModelEntry[]>([]);
|
|
26
|
-
const [proprietaryModels, setProprietaryModels] = useState<ModelEntry[]>([]);
|
|
27
|
-
const [latestModels, setLatestModels] = useState<ModelEntry[]>([]);
|
|
28
|
-
const [allModels, setAllModels] = useState<ModelEntry[]>([]);
|
|
29
|
-
const [loading, setLoading] = useState(true);
|
|
30
|
-
const [error, setError] = useState<string | null>(null);
|
|
31
|
-
const [currentModelIndex, setCurrentModelIndex] = useState(0);
|
|
32
|
-
const [activeTab, setActiveTab] = useState<TabType>('latest');
|
|
33
|
-
const [searchQuery, setSearchQuery] = useState('');
|
|
34
|
-
const [searchMode, setSearchMode] = useState(false);
|
|
35
|
-
const [closed, setClosed] = useState(false);
|
|
36
|
-
|
|
37
|
-
// Capture focus to prevent user input from being active
|
|
38
|
-
useFocus({autoFocus: true, id: 'model-database-display'});
|
|
39
|
-
|
|
40
|
-
// Get current tab's models with search filtering
|
|
41
|
-
const filterBySearch = (modelList: ModelEntry[]) => {
|
|
42
|
-
if (!searchQuery) return modelList;
|
|
43
|
-
const query = searchQuery.toLowerCase();
|
|
44
|
-
return modelList.filter(
|
|
45
|
-
m =>
|
|
46
|
-
m.name.toLowerCase().includes(query) ||
|
|
47
|
-
m.author.toLowerCase().includes(query) ||
|
|
48
|
-
m.id.toLowerCase().includes(query),
|
|
49
|
-
);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// Get models for current view
|
|
53
|
-
const getCurrentModels = (): ModelEntry[] => {
|
|
54
|
-
if (searchMode) {
|
|
55
|
-
return filterBySearch(allModels);
|
|
56
|
-
}
|
|
57
|
-
switch (activeTab) {
|
|
58
|
-
case 'latest':
|
|
59
|
-
return latestModels;
|
|
60
|
-
case 'open':
|
|
61
|
-
return openModels;
|
|
62
|
-
case 'proprietary':
|
|
63
|
-
return proprietaryModels;
|
|
64
|
-
default:
|
|
65
|
-
return [];
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const currentTabModels = getCurrentModels();
|
|
70
|
-
|
|
71
|
-
// Keyboard handler for navigation
|
|
72
|
-
useInput((input, key) => {
|
|
73
|
-
if (key.escape) {
|
|
74
|
-
if (searchMode) {
|
|
75
|
-
setSearchMode(false);
|
|
76
|
-
setSearchQuery('');
|
|
77
|
-
setCurrentModelIndex(0);
|
|
78
|
-
} else {
|
|
79
|
-
setClosed(true);
|
|
80
|
-
if (onCancel) {
|
|
81
|
-
onCancel();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
} else if (key.return) {
|
|
85
|
-
setClosed(true);
|
|
86
|
-
if (onCancel) {
|
|
87
|
-
onCancel();
|
|
88
|
-
}
|
|
89
|
-
} else if (key.upArrow) {
|
|
90
|
-
setCurrentModelIndex(prev => Math.max(0, prev - 1));
|
|
91
|
-
} else if (key.downArrow) {
|
|
92
|
-
setCurrentModelIndex(prev =>
|
|
93
|
-
Math.min(currentTabModels.length - 1, prev + 1),
|
|
94
|
-
);
|
|
95
|
-
} else if (key.tab && !searchMode) {
|
|
96
|
-
// Cycle through tabs
|
|
97
|
-
const tabs: TabType[] = ['latest', 'open', 'proprietary'];
|
|
98
|
-
const currentIndex = tabs.indexOf(activeTab);
|
|
99
|
-
const nextIndex = (currentIndex + 1) % tabs.length;
|
|
100
|
-
setActiveTab(tabs[nextIndex]);
|
|
101
|
-
} else if (key.backspace || key.delete) {
|
|
102
|
-
if (searchMode) {
|
|
103
|
-
setSearchQuery(prev => {
|
|
104
|
-
const newQuery = prev.slice(0, -1);
|
|
105
|
-
if (newQuery === '') {
|
|
106
|
-
setSearchMode(false);
|
|
107
|
-
}
|
|
108
|
-
return newQuery;
|
|
109
|
-
});
|
|
110
|
-
setCurrentModelIndex(0);
|
|
111
|
-
}
|
|
112
|
-
} else if (input && input.length === 1 && !key.ctrl && !key.meta) {
|
|
113
|
-
if (!searchMode) {
|
|
114
|
-
setSearchMode(true);
|
|
115
|
-
}
|
|
116
|
-
setSearchQuery(prev => prev + input);
|
|
117
|
-
setCurrentModelIndex(0);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
// Reset index when switching tabs
|
|
122
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: Reset state when activeTab changes is intentional
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
setCurrentModelIndex(0);
|
|
125
|
-
}, [activeTab]);
|
|
126
|
-
|
|
127
|
-
useEffect(() => {
|
|
128
|
-
async function loadModels() {
|
|
129
|
-
try {
|
|
130
|
-
const result = await databaseEngine.getDatabasesAsync();
|
|
131
|
-
|
|
132
|
-
setOpenModels(result.openModels);
|
|
133
|
-
setProprietaryModels(result.proprietaryModels);
|
|
134
|
-
setLatestModels(result.latestModels);
|
|
135
|
-
setAllModels(result.allModels);
|
|
136
|
-
setLoading(false);
|
|
137
|
-
} catch (error_) {
|
|
138
|
-
setError(
|
|
139
|
-
error_ instanceof Error
|
|
140
|
-
? error_.message
|
|
141
|
-
: 'Failed to fetch model data',
|
|
142
|
-
);
|
|
143
|
-
setLoading(false);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
void loadModels();
|
|
148
|
-
}, []);
|
|
149
|
-
|
|
150
|
-
if (closed) {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (loading) {
|
|
155
|
-
return (
|
|
156
|
-
<TitledBox
|
|
157
|
-
title="/model-database"
|
|
158
|
-
width={boxWidth}
|
|
159
|
-
borderColor={colors.primary}
|
|
160
|
-
paddingX={2}
|
|
161
|
-
paddingY={1}
|
|
162
|
-
>
|
|
163
|
-
<Text color={colors.white}>Fetching models from OpenRouter...</Text>
|
|
164
|
-
</TitledBox>
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (error) {
|
|
169
|
-
return (
|
|
170
|
-
<TitledBox
|
|
171
|
-
title="/model-database"
|
|
172
|
-
width={boxWidth}
|
|
173
|
-
borderColor={colors.error}
|
|
174
|
-
paddingX={2}
|
|
175
|
-
paddingY={1}
|
|
176
|
-
>
|
|
177
|
-
<Text color={colors.error}>Error: {error}</Text>
|
|
178
|
-
</TitledBox>
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<TitledBox
|
|
184
|
-
title="/model-database"
|
|
185
|
-
width={boxWidth}
|
|
186
|
-
borderColor={colors.primary}
|
|
187
|
-
paddingX={2}
|
|
188
|
-
paddingY={1}
|
|
189
|
-
marginBottom={1}
|
|
190
|
-
flexDirection="column"
|
|
191
|
-
>
|
|
192
|
-
<ModelsTabView
|
|
193
|
-
openModels={openModels}
|
|
194
|
-
proprietaryModels={proprietaryModels}
|
|
195
|
-
latestModels={latestModels}
|
|
196
|
-
colors={colors}
|
|
197
|
-
currentModelIndex={currentModelIndex}
|
|
198
|
-
activeTab={activeTab}
|
|
199
|
-
onTabChange={setActiveTab}
|
|
200
|
-
searchMode={searchMode}
|
|
201
|
-
searchQuery={searchQuery}
|
|
202
|
-
currentTabModels={currentTabModels}
|
|
203
|
-
/>
|
|
204
|
-
|
|
205
|
-
<Box marginTop={1} flexDirection="column">
|
|
206
|
-
{searchMode && searchQuery && (
|
|
207
|
-
<Box marginBottom={1}>
|
|
208
|
-
<Text color={colors.primary}>
|
|
209
|
-
Search: <Text bold>{searchQuery}</Text>
|
|
210
|
-
</Text>
|
|
211
|
-
</Box>
|
|
212
|
-
)}
|
|
213
|
-
|
|
214
|
-
<Box marginBottom={1}>
|
|
215
|
-
<Text color={colors.secondary} dimColor>
|
|
216
|
-
Data from OpenRouter
|
|
217
|
-
</Text>
|
|
218
|
-
</Box>
|
|
219
|
-
|
|
220
|
-
<Text color={colors.secondary} dimColor>
|
|
221
|
-
{searchMode
|
|
222
|
-
? 'Type to search | Backspace to delete | Up/Down: Navigate | Esc: Exit search'
|
|
223
|
-
: 'Type to search | Up/Down: Navigate | Tab: Switch tabs | Esc: Close'}
|
|
224
|
-
</Text>
|
|
225
|
-
</Box>
|
|
226
|
-
</TitledBox>
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function ModelsTabView({
|
|
231
|
-
openModels,
|
|
232
|
-
proprietaryModels,
|
|
233
|
-
latestModels,
|
|
234
|
-
colors,
|
|
235
|
-
currentModelIndex,
|
|
236
|
-
activeTab,
|
|
237
|
-
onTabChange,
|
|
238
|
-
searchMode,
|
|
239
|
-
searchQuery,
|
|
240
|
-
currentTabModels,
|
|
241
|
-
}: {
|
|
242
|
-
openModels: ModelEntry[];
|
|
243
|
-
proprietaryModels: ModelEntry[];
|
|
244
|
-
latestModels: ModelEntry[];
|
|
245
|
-
colors: Colors;
|
|
246
|
-
currentModelIndex: number;
|
|
247
|
-
activeTab: TabType;
|
|
248
|
-
onTabChange: (tab: TabType) => void;
|
|
249
|
-
searchMode: boolean;
|
|
250
|
-
searchQuery: string;
|
|
251
|
-
currentTabModels: ModelEntry[];
|
|
252
|
-
}) {
|
|
253
|
-
const currentModel = currentTabModels[currentModelIndex];
|
|
254
|
-
|
|
255
|
-
if (!currentModel) {
|
|
256
|
-
return (
|
|
257
|
-
<Box
|
|
258
|
-
flexDirection="column"
|
|
259
|
-
borderStyle={'round'}
|
|
260
|
-
borderColor={colors.secondary}
|
|
261
|
-
padding={1}
|
|
262
|
-
>
|
|
263
|
-
<Box marginBottom={1}>
|
|
264
|
-
<Text color={colors.primary} bold underline>
|
|
265
|
-
{searchMode ? 'Search Results' : 'Model Browser'}
|
|
266
|
-
</Text>
|
|
267
|
-
</Box>
|
|
268
|
-
{!searchMode && (
|
|
269
|
-
<Tabs
|
|
270
|
-
onChange={name => onTabChange(name as TabType)}
|
|
271
|
-
defaultValue={activeTab}
|
|
272
|
-
colors={{
|
|
273
|
-
activeTab: {
|
|
274
|
-
color: colors.success,
|
|
275
|
-
},
|
|
276
|
-
}}
|
|
277
|
-
>
|
|
278
|
-
<Tab name="latest">Latest ({latestModels.length})</Tab>
|
|
279
|
-
<Tab name="open">Open ({openModels.length})</Tab>
|
|
280
|
-
<Tab name="proprietary">
|
|
281
|
-
Proprietary ({proprietaryModels.length})
|
|
282
|
-
</Tab>
|
|
283
|
-
</Tabs>
|
|
284
|
-
)}
|
|
285
|
-
<Box marginTop={1}>
|
|
286
|
-
<Text color={colors.warning}>
|
|
287
|
-
{searchMode && searchQuery
|
|
288
|
-
? `No models found matching "${searchQuery}"`
|
|
289
|
-
: 'No models available in this category'}
|
|
290
|
-
</Text>
|
|
291
|
-
</Box>
|
|
292
|
-
</Box>
|
|
293
|
-
);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
return (
|
|
297
|
-
<Box
|
|
298
|
-
flexDirection="column"
|
|
299
|
-
borderStyle={'round'}
|
|
300
|
-
borderColor={colors.secondary}
|
|
301
|
-
padding={1}
|
|
302
|
-
>
|
|
303
|
-
<Box marginBottom={1}>
|
|
304
|
-
<Text color={colors.primary} bold underline>
|
|
305
|
-
{searchMode ? 'Search Results' : 'Model Browser'}
|
|
306
|
-
</Text>
|
|
307
|
-
</Box>
|
|
308
|
-
{!searchMode && (
|
|
309
|
-
<Tabs
|
|
310
|
-
onChange={name => onTabChange(name as TabType)}
|
|
311
|
-
defaultValue={activeTab}
|
|
312
|
-
colors={{
|
|
313
|
-
activeTab: {
|
|
314
|
-
color: colors.success,
|
|
315
|
-
},
|
|
316
|
-
}}
|
|
317
|
-
>
|
|
318
|
-
<Tab name="latest">Latest ({latestModels.length})</Tab>
|
|
319
|
-
<Tab name="open">Open ({openModels.length})</Tab>
|
|
320
|
-
<Tab name="proprietary">Proprietary ({proprietaryModels.length})</Tab>
|
|
321
|
-
</Tabs>
|
|
322
|
-
)}
|
|
323
|
-
|
|
324
|
-
<Box flexDirection="column" marginTop={1}>
|
|
325
|
-
<Box marginBottom={1}>
|
|
326
|
-
<Text color={colors.secondary} dimColor>
|
|
327
|
-
Model {currentModelIndex + 1} of {currentTabModels.length}
|
|
328
|
-
</Text>
|
|
329
|
-
</Box>
|
|
330
|
-
<ModelItem model={currentModel} colors={colors} />
|
|
331
|
-
</Box>
|
|
332
|
-
</Box>
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function ModelItem({model, colors}: {model: ModelEntry; colors: Colors}) {
|
|
337
|
-
// Format the created date
|
|
338
|
-
const formatDate = (timestamp: number) => {
|
|
339
|
-
const date = new Date(timestamp * 1000);
|
|
340
|
-
return date.toLocaleDateString('en-US', {
|
|
341
|
-
year: 'numeric',
|
|
342
|
-
month: 'short',
|
|
343
|
-
day: 'numeric',
|
|
344
|
-
});
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
// Get cost label based on score
|
|
348
|
-
const getCostLabel = (score: number) => {
|
|
349
|
-
if (score >= COST_SCORE_FREE) return {label: 'Free', color: colors.success};
|
|
350
|
-
if (score >= COST_SCORE_CHEAP)
|
|
351
|
-
return {label: 'Cheap', color: colors.success};
|
|
352
|
-
if (score >= COST_SCORE_MODERATE)
|
|
353
|
-
return {label: 'Moderate', color: colors.primary};
|
|
354
|
-
if (score >= COST_SCORE_EXPENSIVE)
|
|
355
|
-
return {label: 'Expensive', color: colors.warning};
|
|
356
|
-
return {label: 'Premium', color: colors.error};
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
const costInfo = getCostLabel(model.quality.cost);
|
|
360
|
-
|
|
361
|
-
return (
|
|
362
|
-
<Box flexDirection="column" marginBottom={1}>
|
|
363
|
-
<Box>
|
|
364
|
-
<Text color={colors.primary} bold underline>
|
|
365
|
-
{model.name}
|
|
366
|
-
</Text>
|
|
367
|
-
</Box>
|
|
368
|
-
<Box marginLeft={2} flexDirection="column">
|
|
369
|
-
<Box flexDirection="column">
|
|
370
|
-
<Text color={colors.white}>
|
|
371
|
-
<Text bold>ID: </Text>
|
|
372
|
-
<Text dimColor>{model.id}</Text>
|
|
373
|
-
</Text>
|
|
374
|
-
<Text color={colors.white}>
|
|
375
|
-
<Text bold>Author: </Text>
|
|
376
|
-
{model.author}
|
|
377
|
-
</Text>
|
|
378
|
-
<Text color={colors.white}>
|
|
379
|
-
<Text bold>Context: </Text>
|
|
380
|
-
{model.size} tokens
|
|
381
|
-
</Text>
|
|
382
|
-
<Text color={colors.white}>
|
|
383
|
-
<Text bold>Type: </Text>
|
|
384
|
-
{model.local ? 'Open Weights' : 'Proprietary'}
|
|
385
|
-
</Text>
|
|
386
|
-
<Text color={colors.white}>
|
|
387
|
-
<Text bold>Cost: </Text>
|
|
388
|
-
<Text color={costInfo.color}>{costInfo.label}</Text>
|
|
389
|
-
<Text dimColor> - {model.costDetails}</Text>
|
|
390
|
-
</Text>
|
|
391
|
-
<Text color={colors.white}>
|
|
392
|
-
<Text bold>Tools: </Text>
|
|
393
|
-
{model.hasToolSupport ? (
|
|
394
|
-
<Text color={colors.success}>Supported</Text>
|
|
395
|
-
) : (
|
|
396
|
-
<Text dimColor>Not supported</Text>
|
|
397
|
-
)}
|
|
398
|
-
</Text>
|
|
399
|
-
<Text color={colors.white}>
|
|
400
|
-
<Text bold>Added: </Text>
|
|
401
|
-
{formatDate(model.created)}
|
|
402
|
-
</Text>
|
|
403
|
-
</Box>
|
|
404
|
-
</Box>
|
|
405
|
-
</Box>
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Export the display component for use in app.tsx
|
|
410
|
-
export {ModelDatabaseDisplay};
|
|
411
|
-
|
|
412
|
-
export const modelDatabaseCommand: Command = {
|
|
413
|
-
name: 'model-database',
|
|
414
|
-
description: 'Browse coding models from OpenRouter',
|
|
415
|
-
handler: (_args: string[], _messages, _metadata) => {
|
|
416
|
-
return Promise.resolve(React.createElement(React.Fragment));
|
|
417
|
-
},
|
|
418
|
-
};
|
package/source/commands/model.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {Command} from '@/types/index';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
|
|
4
|
-
export const modelCommand: Command = {
|
|
5
|
-
name: 'model',
|
|
6
|
-
description: 'Select a model for the current provider',
|
|
7
|
-
handler: (_args: string[], _messages, _metadata) => {
|
|
8
|
-
// This command is handled specially in app.tsx
|
|
9
|
-
// This handler exists only for registration purposes
|
|
10
|
-
return Promise.resolve(React.createElement(React.Fragment));
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {Command} from '@/types/index';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
|
|
4
|
-
export const providerCommand: Command = {
|
|
5
|
-
name: 'provider',
|
|
6
|
-
description: 'Switch between AI providers',
|
|
7
|
-
handler: (_args: string[], _messages, _metadata) => {
|
|
8
|
-
// This command is handled specially in app.tsx
|
|
9
|
-
// This handler exists only for registration purposes
|
|
10
|
-
return Promise.resolve(React.createElement(React.Fragment));
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import {Command} from '@/types/index';
|
|
2
|
-
import {Text} from 'ink';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
|
|
5
|
-
// Note: The /setup-config command is handled via appUtils.ts which calls
|
|
6
|
-
// onEnterConfigWizardMode() directly, not through this command handler.
|
|
7
|
-
// This export exists for command registration only.
|
|
8
|
-
export const setupConfigCommand: Command = {
|
|
9
|
-
name: 'setup-config',
|
|
10
|
-
description: 'Launch interactive configuration wizard',
|
|
11
|
-
handler: () => {
|
|
12
|
-
// This handler is never called - the command is intercepted in appUtils.ts
|
|
13
|
-
// and handled via the mode system (onEnterConfigWizardMode)
|
|
14
|
-
return Promise.resolve(React.createElement(Text, {}, ''));
|
|
15
|
-
},
|
|
16
|
-
};
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import type {Message} from '@/types/index';
|
|
4
|
-
import {clearCommand} from './clear';
|
|
5
|
-
import {exitCommand} from './exit';
|
|
6
|
-
import {modelCommand} from './model';
|
|
7
|
-
import {providerCommand} from './provider';
|
|
8
|
-
import {statusCommand} from './status';
|
|
9
|
-
import {themeCommand} from './theme';
|
|
10
|
-
|
|
11
|
-
// Test metadata
|
|
12
|
-
const testMetadata = {
|
|
13
|
-
provider: 'test',
|
|
14
|
-
model: 'test-model',
|
|
15
|
-
tokens: 100,
|
|
16
|
-
getMessageTokens: (m: Message) => 0,
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const testMessages: Message[] = [];
|
|
20
|
-
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// Tests for clear command
|
|
23
|
-
// ============================================================================
|
|
24
|
-
|
|
25
|
-
test('clearCommand - has correct name and description', t => {
|
|
26
|
-
t.is(clearCommand.name, 'clear');
|
|
27
|
-
t.is(clearCommand.description, 'Clear the chat history and model context');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('clearCommand - handler returns React element', async t => {
|
|
31
|
-
const result = await clearCommand.handler([], testMessages, testMetadata);
|
|
32
|
-
|
|
33
|
-
// SuccessMessage is wrapped in memo() so just check it's a valid React element
|
|
34
|
-
t.truthy(React.isValidElement(result));
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test('clearCommand - handler ignores arguments', async t => {
|
|
38
|
-
const result1 = await clearCommand.handler([], testMessages, testMetadata);
|
|
39
|
-
const result2 = await clearCommand.handler(['arg1', 'arg2'], testMessages, testMetadata);
|
|
40
|
-
|
|
41
|
-
t.truthy(React.isValidElement(result1));
|
|
42
|
-
t.truthy(React.isValidElement(result2));
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// ============================================================================
|
|
46
|
-
// Tests for exit command
|
|
47
|
-
// ============================================================================
|
|
48
|
-
|
|
49
|
-
test('exitCommand - has correct name and description', t => {
|
|
50
|
-
t.is(exitCommand.name, 'exit');
|
|
51
|
-
t.is(exitCommand.description, 'Exit the application');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
test('exitCommand - handler returns InfoMessage component', async t => {
|
|
55
|
-
// Stub process.exit to prevent actual exit during test
|
|
56
|
-
const originalExit = process.exit;
|
|
57
|
-
process.exit = (() => {
|
|
58
|
-
throw new Error('process.exit called');
|
|
59
|
-
}) as typeof process.exit;
|
|
60
|
-
|
|
61
|
-
try {
|
|
62
|
-
const result = await exitCommand.handler([], testMessages, testMetadata);
|
|
63
|
-
|
|
64
|
-
// Should return InfoMessage first
|
|
65
|
-
t.truthy(React.isValidElement(result));
|
|
66
|
-
} finally {
|
|
67
|
-
process.exit = originalExit;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test('exitCommand - handler ignores arguments', async t => {
|
|
72
|
-
const originalExit = process.exit;
|
|
73
|
-
process.exit = (() => {
|
|
74
|
-
throw new Error('process.exit called');
|
|
75
|
-
}) as typeof process.exit;
|
|
76
|
-
|
|
77
|
-
try {
|
|
78
|
-
const result = await exitCommand.handler(['arg1'], testMessages, testMetadata);
|
|
79
|
-
t.truthy(React.isValidElement(result));
|
|
80
|
-
} finally {
|
|
81
|
-
process.exit = originalExit;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// ============================================================================
|
|
86
|
-
// Tests for model command
|
|
87
|
-
// ============================================================================
|
|
88
|
-
|
|
89
|
-
test('modelCommand - has correct name and description', t => {
|
|
90
|
-
t.is(modelCommand.name, 'model');
|
|
91
|
-
t.is(modelCommand.description, 'Select a model for the current provider');
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test('modelCommand - handler returns empty fragment', async t => {
|
|
95
|
-
const result = await modelCommand.handler([], testMessages, testMetadata);
|
|
96
|
-
|
|
97
|
-
t.truthy(React.isValidElement(result));
|
|
98
|
-
const element = result as React.ReactElement;
|
|
99
|
-
t.is(element.type, React.Fragment);
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test('modelCommand - handler ignores all parameters', async t => {
|
|
103
|
-
const result = await modelCommand.handler(['arg1', 'arg2'], testMessages, testMetadata);
|
|
104
|
-
|
|
105
|
-
t.truthy(React.isValidElement(result));
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// ============================================================================
|
|
109
|
-
// Tests for provider command
|
|
110
|
-
// ============================================================================
|
|
111
|
-
|
|
112
|
-
test('providerCommand - has correct name and description', t => {
|
|
113
|
-
t.is(providerCommand.name, 'provider');
|
|
114
|
-
t.is(providerCommand.description, 'Switch between AI providers');
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test('providerCommand - handler returns empty fragment', async t => {
|
|
118
|
-
const result = await providerCommand.handler([], testMessages, testMetadata);
|
|
119
|
-
|
|
120
|
-
t.truthy(React.isValidElement(result));
|
|
121
|
-
const element = result as React.ReactElement;
|
|
122
|
-
t.is(element.type, React.Fragment);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
test('providerCommand - handler ignores all parameters', async t => {
|
|
126
|
-
const result = await providerCommand.handler(['arg1', 'arg2'], testMessages, testMetadata);
|
|
127
|
-
|
|
128
|
-
t.truthy(React.isValidElement(result));
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// ============================================================================
|
|
132
|
-
// Tests for status command
|
|
133
|
-
// ============================================================================
|
|
134
|
-
|
|
135
|
-
test('statusCommand - has correct name and description', t => {
|
|
136
|
-
t.is(statusCommand.name, 'status');
|
|
137
|
-
t.is(statusCommand.description, 'Display current status (provider, model, theme)');
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test('statusCommand - handler returns empty fragment', async t => {
|
|
141
|
-
const result = await statusCommand.handler([], testMessages, testMetadata);
|
|
142
|
-
|
|
143
|
-
t.truthy(React.isValidElement(result));
|
|
144
|
-
const element = result as React.ReactElement;
|
|
145
|
-
t.is(element.type, React.Fragment);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test('statusCommand - handler ignores all parameters', async t => {
|
|
149
|
-
const result = await statusCommand.handler(['arg1', 'arg2'], testMessages, testMetadata);
|
|
150
|
-
|
|
151
|
-
t.truthy(React.isValidElement(result));
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// ============================================================================
|
|
155
|
-
// Tests for theme command
|
|
156
|
-
// ============================================================================
|
|
157
|
-
|
|
158
|
-
test('themeCommand - has correct name and description', t => {
|
|
159
|
-
t.is(themeCommand.name, 'theme');
|
|
160
|
-
t.is(themeCommand.description, 'Select a theme for the Coder CLI');
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
test('themeCommand - handler returns empty fragment', async t => {
|
|
164
|
-
const result = await themeCommand.handler([], testMessages, testMetadata);
|
|
165
|
-
|
|
166
|
-
t.truthy(React.isValidElement(result));
|
|
167
|
-
const element = result as React.ReactElement;
|
|
168
|
-
t.is(element.type, React.Fragment);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test('themeCommand - handler ignores all parameters', async t => {
|
|
172
|
-
const result = await themeCommand.handler(['arg1', 'arg2'], testMessages, testMetadata);
|
|
173
|
-
|
|
174
|
-
t.truthy(React.isValidElement(result));
|
|
175
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type {Command} from '@/types/index';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
|
|
4
|
-
export const statusCommand: Command = {
|
|
5
|
-
name: 'status',
|
|
6
|
-
description: 'Display current status (provider, model, theme)',
|
|
7
|
-
handler: (_args: string[], _messages, _metadata) => {
|
|
8
|
-
// This command is handled specially in app.tsx
|
|
9
|
-
// This handler exists only for registration purposes
|
|
10
|
-
return Promise.resolve(React.createElement(React.Fragment));
|
|
11
|
-
},
|
|
12
|
-
};
|
package/source/commands/theme.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type {Command} from '@/types/index';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
|
|
4
|
-
export const themeCommand: Command = {
|
|
5
|
-
name: 'theme',
|
|
6
|
-
description: 'Select a theme for the Coder CLI',
|
|
7
|
-
handler: (_args: string[], _messages, _metadata) => {
|
|
8
|
-
// This command is handled specially in app.tsx
|
|
9
|
-
// This handler exists only for registration purposes
|
|
10
|
-
return Promise.resolve(React.createElement(React.Fragment));
|
|
11
|
-
},
|
|
12
|
-
};
|