@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,186 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {parseAPIError} from '@/ai-sdk-client';
|
|
3
|
-
|
|
4
|
-
// Tests for parseAPIError function
|
|
5
|
-
// Now using the actual exported function instead of a duplicated copy
|
|
6
|
-
|
|
7
|
-
test('parseAPIError - handles Ollama unmarshal error from issue #87', t => {
|
|
8
|
-
const error = new Error(
|
|
9
|
-
"RetryError [AI_RetryError]: Failed after 3 attempts. Last error: unmarshal: invalid character '{' after top-level value",
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
const result = parseAPIError(error);
|
|
13
|
-
|
|
14
|
-
t.true(result.includes('Ollama server error'));
|
|
15
|
-
t.true(result.includes('malformed JSON'));
|
|
16
|
-
t.true(result.includes('Restart Ollama'));
|
|
17
|
-
t.true(result.includes('Re-pull the model'));
|
|
18
|
-
t.true(result.includes('Check Ollama logs'));
|
|
19
|
-
t.true(result.includes('Try a different model'));
|
|
20
|
-
t.true(result.includes('Original error:'));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('parseAPIError - handles unmarshal error without retry wrapper', t => {
|
|
24
|
-
const error = new Error(
|
|
25
|
-
"unmarshal: invalid character '{' after top-level value",
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const result = parseAPIError(error);
|
|
29
|
-
|
|
30
|
-
t.true(result.includes('Ollama server error'));
|
|
31
|
-
t.true(result.includes('malformed JSON'));
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('parseAPIError - handles 500 error with invalid character (status code takes precedence)', t => {
|
|
35
|
-
// This test verifies that HTTP status codes are parsed FIRST,
|
|
36
|
-
// so a 500 error with "invalid character" in the message is treated
|
|
37
|
-
// as a server error, not an Ollama-specific error
|
|
38
|
-
const error = new Error(
|
|
39
|
-
"500 Internal Server Error: invalid character 'x' after top-level value",
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const result = parseAPIError(error);
|
|
43
|
-
|
|
44
|
-
// Status code parsing takes precedence over Ollama-specific pattern matching
|
|
45
|
-
t.is(result, "Server error: invalid character 'x' after top-level value");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('parseAPIError - handles 500 error without JSON parsing issue', t => {
|
|
49
|
-
const error = new Error(
|
|
50
|
-
'500 Internal Server Error: database connection failed',
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const result = parseAPIError(error);
|
|
54
|
-
|
|
55
|
-
t.is(result, 'Server error: database connection failed');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('parseAPIError - handles 404 error', t => {
|
|
59
|
-
const error = new Error('404 Not Found: model not available');
|
|
60
|
-
|
|
61
|
-
const result = parseAPIError(error);
|
|
62
|
-
|
|
63
|
-
t.is(
|
|
64
|
-
result,
|
|
65
|
-
'Model not found: The requested model may not exist or is unavailable',
|
|
66
|
-
);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('parseAPIError - handles connection refused', t => {
|
|
70
|
-
const error = new Error('ECONNREFUSED: Connection refused');
|
|
71
|
-
|
|
72
|
-
const result = parseAPIError(error);
|
|
73
|
-
|
|
74
|
-
t.is(result, 'Connection failed: Unable to reach the model server');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('parseAPIError - handles timeout error', t => {
|
|
78
|
-
const error = new Error('Request timeout: ETIMEDOUT');
|
|
79
|
-
|
|
80
|
-
const result = parseAPIError(error);
|
|
81
|
-
|
|
82
|
-
t.is(result, 'Request timed out: The model took too long to respond');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test('parseAPIError - handles non-Error objects', t => {
|
|
86
|
-
const result = parseAPIError('string error');
|
|
87
|
-
|
|
88
|
-
t.is(result, 'An unknown error occurred while communicating with the model');
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('parseAPIError - handles context length errors', t => {
|
|
92
|
-
const error = new Error('context length exceeded');
|
|
93
|
-
|
|
94
|
-
const result = parseAPIError(error);
|
|
95
|
-
|
|
96
|
-
// Use exact assertion instead of OR condition
|
|
97
|
-
t.is(
|
|
98
|
-
result,
|
|
99
|
-
'Context too large: Please reduce the conversation length or message size',
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test('parseAPIError - handles too many tokens errors', t => {
|
|
104
|
-
const error = new Error('too many tokens in the request');
|
|
105
|
-
|
|
106
|
-
const result = parseAPIError(error);
|
|
107
|
-
|
|
108
|
-
t.is(
|
|
109
|
-
result,
|
|
110
|
-
'Context too large: Please reduce the conversation length or message size',
|
|
111
|
-
);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
test('parseAPIError - handles 400 with context length in message', t => {
|
|
115
|
-
const error = new Error('400 Bad Request: context length exceeded');
|
|
116
|
-
|
|
117
|
-
const result = parseAPIError(error);
|
|
118
|
-
|
|
119
|
-
// The 400 status code pattern matches first, so we get the full message
|
|
120
|
-
t.is(result, 'Bad request: context length exceeded');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('parseAPIError - handles 401 authentication error', t => {
|
|
124
|
-
const error = new Error('401 Unauthorized: Invalid API key');
|
|
125
|
-
|
|
126
|
-
const result = parseAPIError(error);
|
|
127
|
-
|
|
128
|
-
t.is(result, 'Authentication failed: Invalid API key or credentials');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
test('parseAPIError - handles 403 forbidden error', t => {
|
|
132
|
-
const error = new Error('403 Forbidden: Access denied');
|
|
133
|
-
|
|
134
|
-
const result = parseAPIError(error);
|
|
135
|
-
|
|
136
|
-
t.is(result, 'Access forbidden: Check your API permissions');
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('parseAPIError - handles 429 rate limit error', t => {
|
|
140
|
-
const error = new Error('429 Too Many Requests: Rate limit exceeded');
|
|
141
|
-
|
|
142
|
-
const result = parseAPIError(error);
|
|
143
|
-
|
|
144
|
-
t.is(
|
|
145
|
-
result,
|
|
146
|
-
'Rate limit exceeded: Too many requests. Please wait and try again',
|
|
147
|
-
);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test('parseAPIError - handles 502 bad gateway error', t => {
|
|
151
|
-
const error = new Error('502 Bad Gateway: upstream error');
|
|
152
|
-
|
|
153
|
-
const result = parseAPIError(error);
|
|
154
|
-
|
|
155
|
-
t.is(result, 'Server error: upstream error');
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
test('parseAPIError - handles 503 service unavailable error', t => {
|
|
159
|
-
const error = new Error('503 Service Unavailable: server overloaded');
|
|
160
|
-
|
|
161
|
-
const result = parseAPIError(error);
|
|
162
|
-
|
|
163
|
-
t.is(result, 'Server error: server overloaded');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test('parseAPIError - handles reduce tokens message', t => {
|
|
167
|
-
const error = new Error('Please reduce the number of tokens in your request');
|
|
168
|
-
|
|
169
|
-
const result = parseAPIError(error);
|
|
170
|
-
|
|
171
|
-
t.is(
|
|
172
|
-
result,
|
|
173
|
-
'Too many tokens: Please shorten your message or clear conversation history',
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
test('parseAPIError - cleans up unknown errors', t => {
|
|
178
|
-
const error = new Error(
|
|
179
|
-
'Error: Something unexpected happened\nWith more details',
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
const result = parseAPIError(error);
|
|
183
|
-
|
|
184
|
-
// Should strip "Error: " prefix and only return first line
|
|
185
|
-
t.is(result, 'Something unexpected happened');
|
|
186
|
-
});
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {AISDKClient} from '@/ai-sdk-client';
|
|
3
|
-
import type {AIProviderConfig} from '@/types/config';
|
|
4
|
-
|
|
5
|
-
// Tests for maxRetries configuration
|
|
6
|
-
// Now tests actual AISDKClient instantiation and behavior
|
|
7
|
-
|
|
8
|
-
test('AISDKClient - maxRetries defaults to 2 when not specified', t => {
|
|
9
|
-
const config: AIProviderConfig = {
|
|
10
|
-
name: 'TestProvider',
|
|
11
|
-
type: 'openai-compatible',
|
|
12
|
-
models: ['test-model'],
|
|
13
|
-
config: {
|
|
14
|
-
baseURL: 'http://localhost:11434/v1',
|
|
15
|
-
apiKey: 'test-key',
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const client = new AISDKClient(config);
|
|
20
|
-
|
|
21
|
-
// Verify the client's internal maxRetries is set to default of 2
|
|
22
|
-
t.is(client.getMaxRetries(), 2);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test('AISDKClient - maxRetries respects custom value', t => {
|
|
26
|
-
const config: AIProviderConfig = {
|
|
27
|
-
name: 'TestProvider',
|
|
28
|
-
type: 'openai-compatible',
|
|
29
|
-
models: ['test-model'],
|
|
30
|
-
maxRetries: 5,
|
|
31
|
-
config: {
|
|
32
|
-
baseURL: 'http://localhost:11434/v1',
|
|
33
|
-
apiKey: 'test-key',
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const client = new AISDKClient(config);
|
|
38
|
-
|
|
39
|
-
// Verify the client uses the custom maxRetries value
|
|
40
|
-
t.is(client.getMaxRetries(), 5);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('AISDKClient - maxRetries can be set to 0 to disable retries', t => {
|
|
44
|
-
// Important: This test verifies that 0 is treated as a valid value,
|
|
45
|
-
// not as falsy (which would incorrectly default to 2)
|
|
46
|
-
const config: AIProviderConfig = {
|
|
47
|
-
name: 'TestProvider',
|
|
48
|
-
type: 'openai-compatible',
|
|
49
|
-
models: ['test-model'],
|
|
50
|
-
maxRetries: 0,
|
|
51
|
-
config: {
|
|
52
|
-
baseURL: 'http://localhost:11434/v1',
|
|
53
|
-
apiKey: 'test-key',
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const client = new AISDKClient(config);
|
|
58
|
-
|
|
59
|
-
// Verify that 0 is respected (nullish coalescing handles this correctly)
|
|
60
|
-
t.is(client.getMaxRetries(), 0);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('AISDKClient - maxRetries handles value of 1', t => {
|
|
64
|
-
const config: AIProviderConfig = {
|
|
65
|
-
name: 'TestProvider',
|
|
66
|
-
type: 'openai-compatible',
|
|
67
|
-
models: ['test-model'],
|
|
68
|
-
maxRetries: 1,
|
|
69
|
-
config: {
|
|
70
|
-
baseURL: 'http://localhost:11434/v1',
|
|
71
|
-
apiKey: 'test-key',
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const client = new AISDKClient(config);
|
|
76
|
-
|
|
77
|
-
t.is(client.getMaxRetries(), 1);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('AIProviderConfig type - includes maxRetries in interface', t => {
|
|
81
|
-
// Compile-time test that maxRetries is part of the interface
|
|
82
|
-
const config: AIProviderConfig = {
|
|
83
|
-
name: 'TestProvider',
|
|
84
|
-
type: 'openai-compatible',
|
|
85
|
-
models: ['test-model'],
|
|
86
|
-
maxRetries: 3,
|
|
87
|
-
config: {
|
|
88
|
-
baseURL: 'http://localhost:11434/v1',
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
// TypeScript should not complain about maxRetries property
|
|
93
|
-
t.is(typeof config.maxRetries, 'number');
|
|
94
|
-
t.true('maxRetries' in config);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test('AISDKClient - undefined maxRetries uses default', t => {
|
|
98
|
-
// Explicitly set to undefined to test fallback behavior
|
|
99
|
-
const config: AIProviderConfig = {
|
|
100
|
-
name: 'TestProvider',
|
|
101
|
-
type: 'openai-compatible',
|
|
102
|
-
models: ['test-model'],
|
|
103
|
-
maxRetries: undefined,
|
|
104
|
-
config: {
|
|
105
|
-
baseURL: 'http://localhost:11434/v1',
|
|
106
|
-
apiKey: 'test-key',
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const client = new AISDKClient(config);
|
|
111
|
-
|
|
112
|
-
// Verify undefined falls back to default of 2
|
|
113
|
-
t.is(client.getMaxRetries(), 2);
|
|
114
|
-
});
|
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {ModelMessage} from 'ai';
|
|
3
|
-
import {isEmptyAssistantMessage, type TestableMessage} from '@/ai-sdk-client';
|
|
4
|
-
|
|
5
|
-
// Tests for prepareStep message filtering logic
|
|
6
|
-
// This simulates the filtering logic used in AISDKClient.chat() to prevent:
|
|
7
|
-
// 1. "400 Bad Request: Assistant message must have either content or tool_calls"
|
|
8
|
-
// 2. "400 Bad Request: Unexpected role 'tool' after role 'user'"
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Simulates the prepareStep filtering logic from ai-sdk-client.ts
|
|
12
|
-
* This is extracted for testing purposes
|
|
13
|
-
*/
|
|
14
|
-
function simulatePrepareStepFiltering(
|
|
15
|
-
messages: ModelMessage[],
|
|
16
|
-
): ModelMessage[] {
|
|
17
|
-
const filteredMessages: ModelMessage[] = [];
|
|
18
|
-
const indicesToSkip = new Set<number>();
|
|
19
|
-
|
|
20
|
-
// First pass: identify empty assistant messages and their orphaned tool results
|
|
21
|
-
for (let i = 0; i < messages.length; i++) {
|
|
22
|
-
if (isEmptyAssistantMessage(messages[i] as unknown as TestableMessage)) {
|
|
23
|
-
indicesToSkip.add(i);
|
|
24
|
-
|
|
25
|
-
// Mark any immediately following tool messages as orphaned
|
|
26
|
-
let j = i + 1;
|
|
27
|
-
while (j < messages.length && messages[j].role === 'tool') {
|
|
28
|
-
indicesToSkip.add(j);
|
|
29
|
-
j++;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Second pass: build filtered array
|
|
35
|
-
for (let i = 0; i < messages.length; i++) {
|
|
36
|
-
if (!indicesToSkip.has(i)) {
|
|
37
|
-
filteredMessages.push(messages[i]);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return filteredMessages;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// Basic filtering tests
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
test('prepareStep - keeps valid messages unchanged', t => {
|
|
49
|
-
const messages: ModelMessage[] = [
|
|
50
|
-
{role: 'user', content: 'Hello'},
|
|
51
|
-
{role: 'assistant', content: 'Hi there!'},
|
|
52
|
-
];
|
|
53
|
-
|
|
54
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
55
|
-
t.deepEqual(filtered, messages);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('prepareStep - filters out empty assistant message', t => {
|
|
59
|
-
const messages: ModelMessage[] = [
|
|
60
|
-
{role: 'user', content: 'Hello'},
|
|
61
|
-
{role: 'assistant', content: ''},
|
|
62
|
-
{role: 'user', content: 'Are you there?'},
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
66
|
-
t.is(filtered.length, 2);
|
|
67
|
-
t.is(filtered[0].role, 'user');
|
|
68
|
-
t.is(filtered[1].role, 'user');
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// ============================================================================
|
|
72
|
-
// Orphaned tool message tests (critical for fixing the bug)
|
|
73
|
-
// ============================================================================
|
|
74
|
-
|
|
75
|
-
test('prepareStep - filters out orphaned tool messages after empty assistant', t => {
|
|
76
|
-
// This is the scenario that caused the bug:
|
|
77
|
-
// user -> empty assistant -> tool -> tool
|
|
78
|
-
// After filtering empty assistant, we'd have: user -> tool -> tool (INVALID!)
|
|
79
|
-
const messages: ModelMessage[] = [
|
|
80
|
-
{role: 'user', content: 'Read a file'},
|
|
81
|
-
{role: 'assistant', content: ''}, // Empty assistant
|
|
82
|
-
{
|
|
83
|
-
role: 'tool',
|
|
84
|
-
content: [
|
|
85
|
-
{
|
|
86
|
-
type: 'tool-result',
|
|
87
|
-
toolCallId: 'tool_1',
|
|
88
|
-
toolName: 'read_file',
|
|
89
|
-
output: {type: 'text', value: 'file contents'},
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
role: 'tool',
|
|
95
|
-
content: [
|
|
96
|
-
{
|
|
97
|
-
type: 'tool-result',
|
|
98
|
-
toolCallId: 'tool_2',
|
|
99
|
-
toolName: 'read_file',
|
|
100
|
-
output: {type: 'text', value: 'other file contents'},
|
|
101
|
-
},
|
|
102
|
-
],
|
|
103
|
-
},
|
|
104
|
-
];
|
|
105
|
-
|
|
106
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
107
|
-
|
|
108
|
-
// Should only have the user message - empty assistant and orphaned tools removed
|
|
109
|
-
t.is(filtered.length, 1);
|
|
110
|
-
t.is(filtered[0].role, 'user');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test('prepareStep - keeps tool messages after valid assistant', t => {
|
|
114
|
-
// Valid sequence: user -> assistant with content -> tool results
|
|
115
|
-
// Note: tool_calls are part of the model response, not input messages
|
|
116
|
-
const messages: ModelMessage[] = [
|
|
117
|
-
{role: 'user', content: 'Read a file'},
|
|
118
|
-
{
|
|
119
|
-
role: 'assistant',
|
|
120
|
-
content: 'Let me read that file for you.',
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
role: 'tool',
|
|
124
|
-
content: [
|
|
125
|
-
{
|
|
126
|
-
type: 'tool-result',
|
|
127
|
-
toolCallId: 'tool_1',
|
|
128
|
-
toolName: 'read_file',
|
|
129
|
-
output: {type: 'text', value: 'file contents'},
|
|
130
|
-
},
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
];
|
|
134
|
-
|
|
135
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
136
|
-
|
|
137
|
-
// All messages should be kept
|
|
138
|
-
t.is(filtered.length, 3);
|
|
139
|
-
t.is(filtered[0].role, 'user');
|
|
140
|
-
t.is(filtered[1].role, 'assistant');
|
|
141
|
-
t.is(filtered[2].role, 'tool');
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
test('prepareStep - handles multiple empty assistants with tool messages', t => {
|
|
145
|
-
const messages: ModelMessage[] = [
|
|
146
|
-
{role: 'user', content: 'First request'},
|
|
147
|
-
{role: 'assistant', content: ''}, // Empty
|
|
148
|
-
{
|
|
149
|
-
role: 'tool',
|
|
150
|
-
content: [
|
|
151
|
-
{
|
|
152
|
-
type: 'tool-result',
|
|
153
|
-
toolCallId: 'tool_1',
|
|
154
|
-
toolName: 'read_file',
|
|
155
|
-
output: {type: 'text', value: 'file1'},
|
|
156
|
-
},
|
|
157
|
-
],
|
|
158
|
-
},
|
|
159
|
-
{role: 'user', content: 'Second request'},
|
|
160
|
-
{role: 'assistant', content: ''}, // Empty
|
|
161
|
-
{
|
|
162
|
-
role: 'tool',
|
|
163
|
-
content: [
|
|
164
|
-
{
|
|
165
|
-
type: 'tool-result',
|
|
166
|
-
toolCallId: 'tool_2',
|
|
167
|
-
toolName: 'read_file',
|
|
168
|
-
output: {type: 'text', value: 'file2'},
|
|
169
|
-
},
|
|
170
|
-
],
|
|
171
|
-
},
|
|
172
|
-
];
|
|
173
|
-
|
|
174
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
175
|
-
|
|
176
|
-
// Should only have the two user messages
|
|
177
|
-
t.is(filtered.length, 2);
|
|
178
|
-
t.is(filtered[0].role, 'user');
|
|
179
|
-
t.is(filtered[1].role, 'user');
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test('prepareStep - stops filtering tool messages at next non-tool message', t => {
|
|
183
|
-
const messages: ModelMessage[] = [
|
|
184
|
-
{role: 'user', content: 'Request'},
|
|
185
|
-
{role: 'assistant', content: ''}, // Empty
|
|
186
|
-
{
|
|
187
|
-
role: 'tool',
|
|
188
|
-
content: [
|
|
189
|
-
{
|
|
190
|
-
type: 'tool-result',
|
|
191
|
-
toolCallId: 'tool_1',
|
|
192
|
-
toolName: 'read_file',
|
|
193
|
-
output: {type: 'text', value: 'file1'},
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
},
|
|
197
|
-
{role: 'assistant', content: 'Here is the result'}, // Valid assistant
|
|
198
|
-
{
|
|
199
|
-
role: 'tool',
|
|
200
|
-
content: [
|
|
201
|
-
{
|
|
202
|
-
type: 'tool-result',
|
|
203
|
-
toolCallId: 'tool_2',
|
|
204
|
-
toolName: 'read_file',
|
|
205
|
-
output: {type: 'text', value: 'file2'},
|
|
206
|
-
},
|
|
207
|
-
],
|
|
208
|
-
},
|
|
209
|
-
];
|
|
210
|
-
|
|
211
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
212
|
-
|
|
213
|
-
// Empty assistant and its tool are removed, but valid assistant and its tool remain
|
|
214
|
-
// However, the last tool message has no parent assistant with tool_calls, so it's orphaned
|
|
215
|
-
// Actually, looking at the logic more carefully: we only filter tool messages that
|
|
216
|
-
// IMMEDIATELY follow an empty assistant. So the last tool message would remain.
|
|
217
|
-
t.is(filtered.length, 3);
|
|
218
|
-
t.is(filtered[0].role, 'user');
|
|
219
|
-
t.is(filtered[1].role, 'assistant');
|
|
220
|
-
t.is(filtered[2].role, 'tool');
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
// ============================================================================
|
|
224
|
-
// Complex scenarios
|
|
225
|
-
// ============================================================================
|
|
226
|
-
|
|
227
|
-
test('prepareStep - handles empty assistant between valid messages', t => {
|
|
228
|
-
const messages: ModelMessage[] = [
|
|
229
|
-
{role: 'user', content: 'First request'},
|
|
230
|
-
{role: 'assistant', content: 'First response'},
|
|
231
|
-
{role: 'user', content: 'Second request'},
|
|
232
|
-
{role: 'assistant', content: ''}, // Empty
|
|
233
|
-
{
|
|
234
|
-
role: 'tool',
|
|
235
|
-
content: [
|
|
236
|
-
{
|
|
237
|
-
type: 'tool-result',
|
|
238
|
-
toolCallId: 'tool_1',
|
|
239
|
-
toolName: 'read_file',
|
|
240
|
-
output: {type: 'text', value: 'file1'},
|
|
241
|
-
},
|
|
242
|
-
],
|
|
243
|
-
},
|
|
244
|
-
{role: 'assistant', content: 'Final response'},
|
|
245
|
-
];
|
|
246
|
-
|
|
247
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
248
|
-
|
|
249
|
-
// Empty assistant and orphaned tool removed, valid messages remain
|
|
250
|
-
t.is(filtered.length, 4);
|
|
251
|
-
t.is(filtered[0].role, 'user');
|
|
252
|
-
t.is(filtered[1].role, 'assistant');
|
|
253
|
-
t.is(filtered[2].role, 'user');
|
|
254
|
-
t.is(filtered[3].role, 'assistant');
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test('prepareStep - whitespace-only assistant content is considered empty', t => {
|
|
258
|
-
const messages: ModelMessage[] = [
|
|
259
|
-
{role: 'user', content: 'Request'},
|
|
260
|
-
{role: 'assistant', content: ' \n\t '}, // Whitespace only
|
|
261
|
-
{
|
|
262
|
-
role: 'tool',
|
|
263
|
-
content: [
|
|
264
|
-
{
|
|
265
|
-
type: 'tool-result',
|
|
266
|
-
toolCallId: 'tool_1',
|
|
267
|
-
toolName: 'read_file',
|
|
268
|
-
output: {type: 'text', value: 'file1'},
|
|
269
|
-
},
|
|
270
|
-
],
|
|
271
|
-
},
|
|
272
|
-
];
|
|
273
|
-
|
|
274
|
-
const filtered = simulatePrepareStepFiltering(messages);
|
|
275
|
-
|
|
276
|
-
// Whitespace-only assistant and orphaned tool are filtered
|
|
277
|
-
t.is(filtered.length, 1);
|
|
278
|
-
t.is(filtered[0].role, 'user');
|
|
279
|
-
});
|
package/source/app/App.spec.tsx
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {AppProps} from './types';
|
|
3
|
-
|
|
4
|
-
test('App types are properly exported', t => {
|
|
5
|
-
const props: AppProps = {
|
|
6
|
-
vscodeMode: false,
|
|
7
|
-
nonInteractiveMode: false,
|
|
8
|
-
loggingConfig: {},
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
t.truthy(props);
|
|
12
|
-
t.is(props.vscodeMode, false);
|
|
13
|
-
t.is(props.nonInteractiveMode, false);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test('AppProps accepts all optional parameters', t => {
|
|
17
|
-
const minimalProps: AppProps = {};
|
|
18
|
-
const fullProps: AppProps = {
|
|
19
|
-
vscodeMode: true,
|
|
20
|
-
vscodePort: 3000,
|
|
21
|
-
nonInteractivePrompt: 'test prompt',
|
|
22
|
-
nonInteractiveMode: true,
|
|
23
|
-
loggingConfig: {level: 'info'},
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
t.truthy(minimalProps);
|
|
27
|
-
t.truthy(fullProps);
|
|
28
|
-
t.is(fullProps.vscodeMode, true);
|
|
29
|
-
t.is(fullProps.vscodePort, 3000);
|
|
30
|
-
t.is(fullProps.nonInteractivePrompt, 'test prompt');
|
|
31
|
-
t.is(fullProps.nonInteractiveMode, true);
|
|
32
|
-
});
|