@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,70 +0,0 @@
|
|
|
1
|
-
import {XMLToolCallParser} from '@/tool-calling/xml-parser';
|
|
2
|
-
import type {AISDKCoreTool, StreamCallbacks, ToolCall} from '@/types/index';
|
|
3
|
-
import {getLogger} from '@/utils/logging';
|
|
4
|
-
|
|
5
|
-
export interface XMLToolProcessingResult {
|
|
6
|
-
toolCalls: ToolCall[];
|
|
7
|
-
cleanedContent: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Processes XML tool calls from response content
|
|
12
|
-
*/
|
|
13
|
-
export function processXMLToolCalls(
|
|
14
|
-
content: string,
|
|
15
|
-
tools: Record<string, AISDKCoreTool>,
|
|
16
|
-
callbacks: StreamCallbacks,
|
|
17
|
-
): XMLToolProcessingResult {
|
|
18
|
-
const logger = getLogger();
|
|
19
|
-
const toolCalls: ToolCall[] = [];
|
|
20
|
-
let cleanedContent = content;
|
|
21
|
-
|
|
22
|
-
// Only process if tools are available and no native tool calls were found
|
|
23
|
-
if (Object.keys(tools).length === 0 || !content) {
|
|
24
|
-
return {toolCalls, cleanedContent};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
logger.debug('Checking for XML tool calls in response content');
|
|
28
|
-
|
|
29
|
-
// First check for malformed XML tool calls
|
|
30
|
-
const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
|
|
31
|
-
if (malformedError) {
|
|
32
|
-
logger.warn('Malformed XML tool call detected', {
|
|
33
|
-
error: malformedError.error,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Return malformed tool call with validation error
|
|
37
|
-
// This mimics how validators work - returns tool call that will show error
|
|
38
|
-
const malformedCall: ToolCall = {
|
|
39
|
-
id: 'malformed_xml_validation',
|
|
40
|
-
function: {
|
|
41
|
-
name: '__xml_validation_error__',
|
|
42
|
-
arguments: {
|
|
43
|
-
error: malformedError.error,
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
toolCalls.push(malformedCall);
|
|
48
|
-
callbacks.onToolCall?.(malformedCall);
|
|
49
|
-
cleanedContent = ''; // Clear content since it was malformed
|
|
50
|
-
} else if (XMLToolCallParser.hasToolCalls(content)) {
|
|
51
|
-
logger.debug('Parsing XML tool calls from content');
|
|
52
|
-
|
|
53
|
-
// Try to parse well-formed XML tool calls
|
|
54
|
-
const parsedToolCalls = XMLToolCallParser.parseToolCalls(content);
|
|
55
|
-
const xmlToolCalls = XMLToolCallParser.convertToToolCalls(parsedToolCalls);
|
|
56
|
-
cleanedContent = XMLToolCallParser.removeToolCallsFromContent(content);
|
|
57
|
-
|
|
58
|
-
logger.debug('XML tool calls parsed', {
|
|
59
|
-
toolCallCount: xmlToolCalls.length,
|
|
60
|
-
contentLength: cleanedContent.length,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
for (const tc of xmlToolCalls) {
|
|
64
|
-
toolCalls.push(tc);
|
|
65
|
-
callbacks.onToolCall?.(tc);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return {toolCalls, cleanedContent};
|
|
70
|
-
}
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {Message} from '@/types/index';
|
|
3
|
-
import {convertToModelMessages, isEmptyAssistantMessage} from './message-converter.js';
|
|
4
|
-
import type {TestableMessage} from '../types.js';
|
|
5
|
-
|
|
6
|
-
test('isEmptyAssistantMessage returns false for non-assistant messages', t => {
|
|
7
|
-
const message: TestableMessage = {
|
|
8
|
-
role: 'user',
|
|
9
|
-
content: '',
|
|
10
|
-
};
|
|
11
|
-
t.false(isEmptyAssistantMessage(message));
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
test('isEmptyAssistantMessage returns true for empty assistant message with string content', t => {
|
|
15
|
-
const message: TestableMessage = {
|
|
16
|
-
role: 'assistant',
|
|
17
|
-
content: '',
|
|
18
|
-
};
|
|
19
|
-
t.true(isEmptyAssistantMessage(message));
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('isEmptyAssistantMessage returns true for empty assistant message with whitespace', t => {
|
|
23
|
-
const message: TestableMessage = {
|
|
24
|
-
role: 'assistant',
|
|
25
|
-
content: ' ',
|
|
26
|
-
};
|
|
27
|
-
t.true(isEmptyAssistantMessage(message));
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('isEmptyAssistantMessage returns true for empty assistant message with empty array content', t => {
|
|
31
|
-
const message: TestableMessage = {
|
|
32
|
-
role: 'assistant',
|
|
33
|
-
content: [],
|
|
34
|
-
};
|
|
35
|
-
t.true(isEmptyAssistantMessage(message));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('isEmptyAssistantMessage returns false for assistant message with content', t => {
|
|
39
|
-
const message: TestableMessage = {
|
|
40
|
-
role: 'assistant',
|
|
41
|
-
content: 'Hello',
|
|
42
|
-
};
|
|
43
|
-
t.false(isEmptyAssistantMessage(message));
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('isEmptyAssistantMessage returns false for assistant message with tool calls', t => {
|
|
47
|
-
const message: TestableMessage = {
|
|
48
|
-
role: 'assistant',
|
|
49
|
-
content: '',
|
|
50
|
-
toolCalls: [{name: 'test', arguments: {}}],
|
|
51
|
-
};
|
|
52
|
-
t.false(isEmptyAssistantMessage(message));
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test('convertToModelMessages converts system message', t => {
|
|
56
|
-
const messages: Message[] = [
|
|
57
|
-
{
|
|
58
|
-
role: 'system',
|
|
59
|
-
content: 'You are a helpful assistant',
|
|
60
|
-
},
|
|
61
|
-
];
|
|
62
|
-
|
|
63
|
-
const result = convertToModelMessages(messages);
|
|
64
|
-
t.is(result.length, 1);
|
|
65
|
-
t.is(result[0].role, 'system');
|
|
66
|
-
t.is(result[0].content, 'You are a helpful assistant');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('convertToModelMessages converts user message', t => {
|
|
70
|
-
const messages: Message[] = [
|
|
71
|
-
{
|
|
72
|
-
role: 'user',
|
|
73
|
-
content: 'Hello',
|
|
74
|
-
},
|
|
75
|
-
];
|
|
76
|
-
|
|
77
|
-
const result = convertToModelMessages(messages);
|
|
78
|
-
t.is(result.length, 1);
|
|
79
|
-
t.is(result[0].role, 'user');
|
|
80
|
-
t.is(result[0].content, 'Hello');
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test('convertToModelMessages converts assistant message with text', t => {
|
|
84
|
-
const messages: Message[] = [
|
|
85
|
-
{
|
|
86
|
-
role: 'assistant',
|
|
87
|
-
content: 'Hi there',
|
|
88
|
-
},
|
|
89
|
-
];
|
|
90
|
-
|
|
91
|
-
const result = convertToModelMessages(messages);
|
|
92
|
-
t.is(result.length, 1);
|
|
93
|
-
t.is(result[0].role, 'assistant');
|
|
94
|
-
t.true(Array.isArray(result[0].content));
|
|
95
|
-
const content = result[0].content as Array<{type: string; text?: string}>;
|
|
96
|
-
t.is(content.length, 1);
|
|
97
|
-
t.is(content[0].type, 'text');
|
|
98
|
-
t.is(content[0].text, 'Hi there');
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test('convertToModelMessages converts assistant message with tool calls', t => {
|
|
102
|
-
const messages: Message[] = [
|
|
103
|
-
{
|
|
104
|
-
role: 'assistant',
|
|
105
|
-
content: '',
|
|
106
|
-
tool_calls: [
|
|
107
|
-
{
|
|
108
|
-
id: 'call_123',
|
|
109
|
-
function: {
|
|
110
|
-
name: 'test_tool',
|
|
111
|
-
arguments: {arg: 'value'},
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
},
|
|
116
|
-
];
|
|
117
|
-
|
|
118
|
-
const result = convertToModelMessages(messages);
|
|
119
|
-
t.is(result.length, 1);
|
|
120
|
-
t.is(result[0].role, 'assistant');
|
|
121
|
-
t.true(Array.isArray(result[0].content));
|
|
122
|
-
const content = result[0].content as Array<{
|
|
123
|
-
type: string;
|
|
124
|
-
toolCallId?: string;
|
|
125
|
-
toolName?: string;
|
|
126
|
-
input?: unknown;
|
|
127
|
-
}>;
|
|
128
|
-
t.is(content.length, 1);
|
|
129
|
-
t.is(content[0].type, 'tool-call');
|
|
130
|
-
t.is(content[0].toolCallId, 'call_123');
|
|
131
|
-
t.is(content[0].toolName, 'test_tool');
|
|
132
|
-
t.deepEqual(content[0].input, {arg: 'value'});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test('convertToModelMessages converts assistant message with both text and tool calls', t => {
|
|
136
|
-
const messages: Message[] = [
|
|
137
|
-
{
|
|
138
|
-
role: 'assistant',
|
|
139
|
-
content: 'Let me help',
|
|
140
|
-
tool_calls: [
|
|
141
|
-
{
|
|
142
|
-
id: 'call_123',
|
|
143
|
-
function: {
|
|
144
|
-
name: 'test_tool',
|
|
145
|
-
arguments: {},
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
],
|
|
149
|
-
},
|
|
150
|
-
];
|
|
151
|
-
|
|
152
|
-
const result = convertToModelMessages(messages);
|
|
153
|
-
t.is(result.length, 1);
|
|
154
|
-
t.is(result[0].role, 'assistant');
|
|
155
|
-
t.true(Array.isArray(result[0].content));
|
|
156
|
-
const content = result[0].content as Array<{type: string}>;
|
|
157
|
-
t.is(content.length, 2);
|
|
158
|
-
t.is(content[0].type, 'text');
|
|
159
|
-
t.is(content[1].type, 'tool-call');
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test('convertToModelMessages converts empty assistant message to message with empty text', t => {
|
|
163
|
-
const messages: Message[] = [
|
|
164
|
-
{
|
|
165
|
-
role: 'assistant',
|
|
166
|
-
content: '',
|
|
167
|
-
},
|
|
168
|
-
];
|
|
169
|
-
|
|
170
|
-
const result = convertToModelMessages(messages);
|
|
171
|
-
t.is(result.length, 1);
|
|
172
|
-
t.is(result[0].role, 'assistant');
|
|
173
|
-
t.true(Array.isArray(result[0].content));
|
|
174
|
-
const content = result[0].content as Array<{type: string; text?: string}>;
|
|
175
|
-
t.is(content.length, 1);
|
|
176
|
-
t.is(content[0].type, 'text');
|
|
177
|
-
t.is(content[0].text, '');
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test('convertToModelMessages converts tool message', t => {
|
|
181
|
-
const messages: Message[] = [
|
|
182
|
-
{
|
|
183
|
-
role: 'tool',
|
|
184
|
-
content: 'Tool result',
|
|
185
|
-
tool_call_id: 'call_123',
|
|
186
|
-
name: 'test_tool',
|
|
187
|
-
},
|
|
188
|
-
];
|
|
189
|
-
|
|
190
|
-
const result = convertToModelMessages(messages);
|
|
191
|
-
t.is(result.length, 1);
|
|
192
|
-
t.is(result[0].role, 'tool');
|
|
193
|
-
t.true(Array.isArray(result[0].content));
|
|
194
|
-
const content = result[0].content as Array<{
|
|
195
|
-
type: string;
|
|
196
|
-
toolCallId?: string;
|
|
197
|
-
toolName?: string;
|
|
198
|
-
output?: {type: string; value: string};
|
|
199
|
-
}>;
|
|
200
|
-
t.is(content.length, 1);
|
|
201
|
-
t.is(content[0].type, 'tool-result');
|
|
202
|
-
t.is(content[0].toolCallId, 'call_123');
|
|
203
|
-
t.is(content[0].toolName, 'test_tool');
|
|
204
|
-
t.is(content[0].output?.type, 'text');
|
|
205
|
-
t.is(content[0].output?.value, 'Tool result');
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
test('convertToModelMessages handles multiple messages', t => {
|
|
209
|
-
const messages: Message[] = [
|
|
210
|
-
{role: 'system', content: 'System'},
|
|
211
|
-
{role: 'user', content: 'User'},
|
|
212
|
-
{role: 'assistant', content: 'Assistant'},
|
|
213
|
-
];
|
|
214
|
-
|
|
215
|
-
const result = convertToModelMessages(messages);
|
|
216
|
-
t.is(result.length, 3);
|
|
217
|
-
t.is(result[0].role, 'system');
|
|
218
|
-
t.is(result[1].role, 'user');
|
|
219
|
-
t.is(result[2].role, 'assistant');
|
|
220
|
-
});
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import type {Message} from '@/types/index';
|
|
2
|
-
import type {AssistantContent, ModelMessage, TextPart, ToolCallPart} from 'ai';
|
|
3
|
-
import type {TestableMessage} from '../types.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Checks if an assistant message is empty (no content and no tool calls).
|
|
7
|
-
* Empty assistant messages cause API errors:
|
|
8
|
-
* "400 Bad Request: Assistant message must have either content or tool_calls, but not none."
|
|
9
|
-
*
|
|
10
|
-
* Exported for testing purposes.
|
|
11
|
-
*/
|
|
12
|
-
export function isEmptyAssistantMessage(message: TestableMessage): boolean {
|
|
13
|
-
if (message.role !== 'assistant') {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
// Check for content - handle both string and array content formats
|
|
17
|
-
const hasContent = Array.isArray(message.content)
|
|
18
|
-
? message.content.length > 0
|
|
19
|
-
: typeof message.content === 'string' && message.content.trim().length > 0;
|
|
20
|
-
// Tool calls are in a separate property for AI SDK messages
|
|
21
|
-
const hasToolCalls =
|
|
22
|
-
'toolCalls' in message &&
|
|
23
|
-
Array.isArray(message.toolCalls) &&
|
|
24
|
-
message.toolCalls.length > 0;
|
|
25
|
-
return !hasContent && !hasToolCalls;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Convert our Message format to AI SDK v6 ModelMessage format
|
|
30
|
-
*
|
|
31
|
-
* Tool messages: Converted to AI SDK tool-result format with proper structure.
|
|
32
|
-
*/
|
|
33
|
-
export function convertToModelMessages(messages: Message[]): ModelMessage[] {
|
|
34
|
-
return messages.map((msg): ModelMessage => {
|
|
35
|
-
if (msg.role === 'tool') {
|
|
36
|
-
// Convert to AI SDK tool-result format
|
|
37
|
-
// AI SDK expects: { role: 'tool', content: [{ type: 'tool-result', toolCallId, toolName, output }] }
|
|
38
|
-
// where output is { type: 'text', value: string } or { type: 'json', value: JSONValue }
|
|
39
|
-
return {
|
|
40
|
-
role: 'tool',
|
|
41
|
-
content: [
|
|
42
|
-
{
|
|
43
|
-
type: 'tool-result',
|
|
44
|
-
toolCallId: msg.tool_call_id || '',
|
|
45
|
-
toolName: msg.name || '',
|
|
46
|
-
output: {
|
|
47
|
-
type: 'text',
|
|
48
|
-
value: msg.content,
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (msg.role === 'system') {
|
|
56
|
-
return {
|
|
57
|
-
role: 'system',
|
|
58
|
-
content: msg.content,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (msg.role === 'user') {
|
|
63
|
-
return {
|
|
64
|
-
role: 'user',
|
|
65
|
-
content: msg.content,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (msg.role === 'assistant') {
|
|
70
|
-
// Build content array
|
|
71
|
-
const content: AssistantContent = [];
|
|
72
|
-
|
|
73
|
-
// Add text content if present
|
|
74
|
-
if (msg.content) {
|
|
75
|
-
content.push({
|
|
76
|
-
type: 'text',
|
|
77
|
-
text: msg.content,
|
|
78
|
-
} as TextPart);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Add tool calls if present (for auto-executed messages)
|
|
82
|
-
if (msg.tool_calls && msg.tool_calls.length > 0) {
|
|
83
|
-
for (const toolCall of msg.tool_calls) {
|
|
84
|
-
content.push({
|
|
85
|
-
type: 'tool-call',
|
|
86
|
-
toolCallId: toolCall.id,
|
|
87
|
-
toolName: toolCall.function.name,
|
|
88
|
-
input: toolCall.function.arguments,
|
|
89
|
-
} as ToolCallPart);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// If no content at all, add empty text to avoid empty message
|
|
94
|
-
if (content.length === 0) {
|
|
95
|
-
content.push({
|
|
96
|
-
type: 'text',
|
|
97
|
-
text: '',
|
|
98
|
-
} as TextPart);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
role: 'assistant',
|
|
103
|
-
content,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Fallback - should never happen
|
|
108
|
-
return {
|
|
109
|
-
role: 'user',
|
|
110
|
-
content: msg.content,
|
|
111
|
-
};
|
|
112
|
-
});
|
|
113
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {
|
|
3
|
-
convertAISDKToolCall,
|
|
4
|
-
convertAISDKToolCalls,
|
|
5
|
-
generateToolCallId,
|
|
6
|
-
getToolResultOutput,
|
|
7
|
-
} from './tool-converter.js';
|
|
8
|
-
|
|
9
|
-
test('generateToolCallId creates unique IDs', t => {
|
|
10
|
-
const id1 = generateToolCallId();
|
|
11
|
-
const id2 = generateToolCallId();
|
|
12
|
-
|
|
13
|
-
t.true(id1.startsWith('tool_'));
|
|
14
|
-
t.true(id2.startsWith('tool_'));
|
|
15
|
-
t.not(id1, id2);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test('convertAISDKToolCall uses provided toolCallId', t => {
|
|
19
|
-
const aiToolCall = {
|
|
20
|
-
toolCallId: 'call_123',
|
|
21
|
-
toolName: 'test_tool',
|
|
22
|
-
input: {arg: 'value'},
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const result = convertAISDKToolCall(aiToolCall);
|
|
26
|
-
|
|
27
|
-
t.is(result.id, 'call_123');
|
|
28
|
-
t.is(result.function.name, 'test_tool');
|
|
29
|
-
t.deepEqual(result.function.arguments, {arg: 'value'});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('convertAISDKToolCall generates ID when missing', t => {
|
|
33
|
-
const aiToolCall = {
|
|
34
|
-
toolName: 'test_tool',
|
|
35
|
-
input: {arg: 'value'},
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const result = convertAISDKToolCall(aiToolCall);
|
|
39
|
-
|
|
40
|
-
t.true(result.id.startsWith('tool_'));
|
|
41
|
-
t.is(result.function.name, 'test_tool');
|
|
42
|
-
t.deepEqual(result.function.arguments, {arg: 'value'});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('convertAISDKToolCalls converts multiple tool calls', t => {
|
|
46
|
-
const aiToolCalls = [
|
|
47
|
-
{
|
|
48
|
-
toolCallId: 'call_1',
|
|
49
|
-
toolName: 'tool_1',
|
|
50
|
-
input: {a: 1},
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
toolName: 'tool_2',
|
|
54
|
-
input: {b: 2},
|
|
55
|
-
},
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
const result = convertAISDKToolCalls(aiToolCalls);
|
|
59
|
-
|
|
60
|
-
t.is(result.length, 2);
|
|
61
|
-
t.is(result[0].id, 'call_1');
|
|
62
|
-
t.is(result[0].function.name, 'tool_1');
|
|
63
|
-
t.true(result[1].id.startsWith('tool_'));
|
|
64
|
-
t.is(result[1].function.name, 'tool_2');
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test('convertAISDKToolCalls handles empty array', t => {
|
|
68
|
-
const result = convertAISDKToolCalls([]);
|
|
69
|
-
t.deepEqual(result, []);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test('getToolResultOutput returns string as-is', t => {
|
|
73
|
-
const result = getToolResultOutput('test output');
|
|
74
|
-
t.is(result, 'test output');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test('getToolResultOutput converts object to JSON string', t => {
|
|
78
|
-
const result = getToolResultOutput({key: 'value'});
|
|
79
|
-
t.is(result, '{"key":"value"}');
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test('getToolResultOutput converts array to JSON string', t => {
|
|
83
|
-
const result = getToolResultOutput([1, 2, 3]);
|
|
84
|
-
t.is(result, '[1,2,3]');
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test('getToolResultOutput converts number to JSON string', t => {
|
|
88
|
-
const result = getToolResultOutput(42);
|
|
89
|
-
t.is(result, '42');
|
|
90
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import {randomBytes} from 'node:crypto';
|
|
2
|
-
import type {ToolCall} from '@/types/index';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generates a unique tool call ID
|
|
6
|
-
*/
|
|
7
|
-
export function generateToolCallId(): string {
|
|
8
|
-
return `tool_${Date.now()}_${randomBytes(8).toString('hex')}`;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Converts AI SDK tool call format to our ToolCall format
|
|
13
|
-
*/
|
|
14
|
-
export function convertAISDKToolCall(toolCall: {
|
|
15
|
-
toolCallId?: string;
|
|
16
|
-
toolName: string;
|
|
17
|
-
input: unknown;
|
|
18
|
-
}): ToolCall {
|
|
19
|
-
return {
|
|
20
|
-
id: toolCall.toolCallId || generateToolCallId(),
|
|
21
|
-
function: {
|
|
22
|
-
name: toolCall.toolName,
|
|
23
|
-
arguments: toolCall.input as Record<string, unknown>,
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Converts multiple AI SDK tool calls to our ToolCall format
|
|
30
|
-
*/
|
|
31
|
-
export function convertAISDKToolCalls(
|
|
32
|
-
toolCalls: Array<{
|
|
33
|
-
toolCallId?: string;
|
|
34
|
-
toolName: string;
|
|
35
|
-
input: unknown;
|
|
36
|
-
}>,
|
|
37
|
-
): ToolCall[] {
|
|
38
|
-
return toolCalls.map(convertAISDKToolCall);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Gets the tool result output as a string
|
|
43
|
-
*/
|
|
44
|
-
export function getToolResultOutput(output: unknown): string {
|
|
45
|
-
return typeof output === 'string' ? output : JSON.stringify(output);
|
|
46
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {RetryError} from 'ai';
|
|
3
|
-
import {extractRootError} from './error-extractor.js';
|
|
4
|
-
|
|
5
|
-
test('extractRootError returns error unchanged if not a RetryError', t => {
|
|
6
|
-
const error = new Error('Test error');
|
|
7
|
-
const result = extractRootError(error);
|
|
8
|
-
t.is(result, error);
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
test('extractRootError extracts lastError from RetryError', t => {
|
|
12
|
-
const rootError = new Error('Root cause');
|
|
13
|
-
const retryError = new RetryError({
|
|
14
|
-
message: 'Retry failed',
|
|
15
|
-
reason: 'maxRetriesExceeded',
|
|
16
|
-
errors: [rootError],
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const result = extractRootError(retryError);
|
|
20
|
-
t.is(result, rootError);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('extractRootError handles nested RetryErrors', t => {
|
|
24
|
-
const rootError = new Error('Root cause');
|
|
25
|
-
const innerRetryError = new RetryError({
|
|
26
|
-
message: 'Inner retry failed',
|
|
27
|
-
reason: 'maxRetriesExceeded',
|
|
28
|
-
errors: [rootError],
|
|
29
|
-
});
|
|
30
|
-
const outerRetryError = new RetryError({
|
|
31
|
-
message: 'Outer retry failed',
|
|
32
|
-
reason: 'maxRetriesExceeded',
|
|
33
|
-
errors: [innerRetryError],
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const result = extractRootError(outerRetryError);
|
|
37
|
-
t.is(result, rootError);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test('extractRootError handles RetryError with no lastError', t => {
|
|
41
|
-
const retryError = new RetryError({
|
|
42
|
-
message: 'Retry failed',
|
|
43
|
-
reason: 'maxRetriesExceeded',
|
|
44
|
-
errors: [],
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const result = extractRootError(retryError);
|
|
48
|
-
t.is(result, retryError);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test('extractRootError handles non-Error values', t => {
|
|
52
|
-
const nonError = 'string error';
|
|
53
|
-
const result = extractRootError(nonError);
|
|
54
|
-
t.is(result, nonError);
|
|
55
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {RetryError} from 'ai';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Extracts the root cause error from AI SDK error wrappers.
|
|
5
|
-
* AI SDK wraps errors in RetryError which contains lastError.
|
|
6
|
-
*/
|
|
7
|
-
export function extractRootError(error: unknown): unknown {
|
|
8
|
-
// Handle AI SDK RetryError - extract the last error
|
|
9
|
-
if (RetryError.isInstance(error)) {
|
|
10
|
-
if (error.lastError) {
|
|
11
|
-
return extractRootError(error.lastError);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return error;
|
|
15
|
-
}
|