@gguf/coder 0.3.1 → 0.3.2
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 +2 -2
- package/pnpm-workspace.yaml +15 -0
- 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,173 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {StreamCallbacks} from '@/types/index';
|
|
3
|
-
import {createOnStepFinishHandler, createPrepareStepHandler} from './streaming-handler.js';
|
|
4
|
-
import type {TestableMessage} from '../types.js';
|
|
5
|
-
|
|
6
|
-
test('createOnStepFinishHandler calls onToolExecuted callback', t => {
|
|
7
|
-
let callbackCalled = false;
|
|
8
|
-
const callbacks: StreamCallbacks = {
|
|
9
|
-
onToolExecuted: (toolCall, result) => {
|
|
10
|
-
callbackCalled = true;
|
|
11
|
-
t.is(toolCall.function.name, 'test_tool');
|
|
12
|
-
t.is(result, 'test output');
|
|
13
|
-
},
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const handler = createOnStepFinishHandler(callbacks);
|
|
17
|
-
handler({
|
|
18
|
-
toolCalls: [
|
|
19
|
-
{
|
|
20
|
-
toolCallId: 'call_123',
|
|
21
|
-
toolName: 'test_tool',
|
|
22
|
-
input: {},
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
toolResults: [
|
|
26
|
-
{
|
|
27
|
-
output: 'test output',
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
t.true(callbackCalled);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test('createOnStepFinishHandler handles steps without tool calls', t => {
|
|
36
|
-
const callbacks: StreamCallbacks = {
|
|
37
|
-
onToolExecuted: () => {
|
|
38
|
-
t.fail('Should not be called');
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const handler = createOnStepFinishHandler(callbacks);
|
|
43
|
-
handler({
|
|
44
|
-
text: 'Some text',
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
t.pass();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('createOnStepFinishHandler handles steps with tool calls but no results', t => {
|
|
51
|
-
const callbacks: StreamCallbacks = {
|
|
52
|
-
onToolExecuted: () => {
|
|
53
|
-
t.fail('Should not be called');
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const handler = createOnStepFinishHandler(callbacks);
|
|
58
|
-
handler({
|
|
59
|
-
toolCalls: [
|
|
60
|
-
{
|
|
61
|
-
toolCallId: 'call_123',
|
|
62
|
-
toolName: 'test_tool',
|
|
63
|
-
input: {},
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
t.pass();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test('createOnStepFinishHandler converts object output to JSON string', t => {
|
|
72
|
-
let resultReceived = '';
|
|
73
|
-
const callbacks: StreamCallbacks = {
|
|
74
|
-
onToolExecuted: (_toolCall, result) => {
|
|
75
|
-
resultReceived = result;
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
const handler = createOnStepFinishHandler(callbacks);
|
|
80
|
-
handler({
|
|
81
|
-
toolCalls: [
|
|
82
|
-
{
|
|
83
|
-
toolCallId: 'call_123',
|
|
84
|
-
toolName: 'test_tool',
|
|
85
|
-
input: {},
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
toolResults: [
|
|
89
|
-
{
|
|
90
|
-
output: {key: 'value'},
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
t.is(resultReceived, '{"key":"value"}');
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test('createPrepareStepHandler filters empty assistant messages', t => {
|
|
99
|
-
const handler = createPrepareStepHandler();
|
|
100
|
-
const messages = [
|
|
101
|
-
{role: 'user', content: 'Hello'},
|
|
102
|
-
{role: 'assistant', content: ''},
|
|
103
|
-
{role: 'user', content: 'World'},
|
|
104
|
-
] as unknown as TestableMessage[];
|
|
105
|
-
|
|
106
|
-
const result = handler({messages: messages as any});
|
|
107
|
-
|
|
108
|
-
t.truthy(result.messages);
|
|
109
|
-
t.is(result.messages?.length, 2);
|
|
110
|
-
t.is((result.messages?.[0] as any).content, 'Hello');
|
|
111
|
-
t.is((result.messages?.[1] as any).content, 'World');
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
test('createPrepareStepHandler filters orphaned tool messages', t => {
|
|
115
|
-
const handler = createPrepareStepHandler();
|
|
116
|
-
const messages = [
|
|
117
|
-
{role: 'user', content: 'Hello'},
|
|
118
|
-
{role: 'assistant', content: ''},
|
|
119
|
-
{role: 'tool', content: 'Tool result'},
|
|
120
|
-
{role: 'user', content: 'World'},
|
|
121
|
-
] as unknown as TestableMessage[];
|
|
122
|
-
|
|
123
|
-
const result = handler({messages: messages as any});
|
|
124
|
-
|
|
125
|
-
t.truthy(result.messages);
|
|
126
|
-
t.is(result.messages?.length, 2);
|
|
127
|
-
t.is((result.messages?.[0] as any).content, 'Hello');
|
|
128
|
-
t.is((result.messages?.[1] as any).content, 'World');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
test('createPrepareStepHandler returns empty object when no filtering needed', t => {
|
|
132
|
-
const handler = createPrepareStepHandler();
|
|
133
|
-
const messages = [
|
|
134
|
-
{role: 'user', content: 'Hello'},
|
|
135
|
-
{role: 'assistant', content: 'Hi'},
|
|
136
|
-
] as unknown as TestableMessage[];
|
|
137
|
-
|
|
138
|
-
const result = handler({messages: messages as any});
|
|
139
|
-
|
|
140
|
-
t.deepEqual(result, {});
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
test('createPrepareStepHandler filters multiple empty assistant messages', t => {
|
|
144
|
-
const handler = createPrepareStepHandler();
|
|
145
|
-
const messages = [
|
|
146
|
-
{role: 'user', content: 'Hello'},
|
|
147
|
-
{role: 'assistant', content: ''},
|
|
148
|
-
{role: 'user', content: 'World'},
|
|
149
|
-
{role: 'assistant', content: ' '},
|
|
150
|
-
{role: 'user', content: 'Test'},
|
|
151
|
-
] as unknown as TestableMessage[];
|
|
152
|
-
|
|
153
|
-
const result = handler({messages: messages as any});
|
|
154
|
-
|
|
155
|
-
t.truthy(result.messages);
|
|
156
|
-
t.is(result.messages?.length, 3);
|
|
157
|
-
t.is(result.messages?.[0].role, 'user');
|
|
158
|
-
t.is(result.messages?.[1].role, 'user');
|
|
159
|
-
t.is(result.messages?.[2].role, 'user');
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test('createPrepareStepHandler keeps non-empty assistant messages', t => {
|
|
163
|
-
const handler = createPrepareStepHandler();
|
|
164
|
-
const messages = [
|
|
165
|
-
{role: 'user', content: 'Hello'},
|
|
166
|
-
{role: 'assistant', content: 'Response'},
|
|
167
|
-
{role: 'user', content: 'World'},
|
|
168
|
-
] as unknown as TestableMessage[];
|
|
169
|
-
|
|
170
|
-
const result = handler({messages: messages as any});
|
|
171
|
-
|
|
172
|
-
t.deepEqual(result, {});
|
|
173
|
-
});
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import type {StreamCallbacks, ToolCall} from '@/types/index';
|
|
2
|
-
import {getLogger} from '@/utils/logging';
|
|
3
|
-
import type {ModelMessage} from 'ai';
|
|
4
|
-
import {isEmptyAssistantMessage} from '../converters/message-converter.js';
|
|
5
|
-
import {
|
|
6
|
-
convertAISDKToolCall,
|
|
7
|
-
getToolResultOutput,
|
|
8
|
-
} from '../converters/tool-converter.js';
|
|
9
|
-
import type {TestableMessage} from '../types.js';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Creates the onStepFinish callback for AI SDK generateText
|
|
13
|
-
* This handles logging and displaying tool execution results
|
|
14
|
-
*/
|
|
15
|
-
export function createOnStepFinishHandler(callbacks: StreamCallbacks): (step: {
|
|
16
|
-
toolCalls?: Array<{toolCallId?: string; toolName: string; input: unknown}>;
|
|
17
|
-
toolResults?: Array<{output: unknown}>;
|
|
18
|
-
text?: string;
|
|
19
|
-
}) => void {
|
|
20
|
-
const logger = getLogger();
|
|
21
|
-
|
|
22
|
-
return step => {
|
|
23
|
-
// Log tool execution steps
|
|
24
|
-
if (step.toolCalls && step.toolCalls.length > 0) {
|
|
25
|
-
logger.trace('AI SDK tool step', {
|
|
26
|
-
stepType: 'tool_execution',
|
|
27
|
-
toolCount: step.toolCalls.length,
|
|
28
|
-
hasResults: !!step.toolResults,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Display formatters for auto-executed tools (after execution with results)
|
|
33
|
-
if (
|
|
34
|
-
step.toolCalls &&
|
|
35
|
-
step.toolResults &&
|
|
36
|
-
step.toolCalls.length === step.toolResults.length
|
|
37
|
-
) {
|
|
38
|
-
step.toolCalls.forEach((toolCall, idx) => {
|
|
39
|
-
const toolResult = step.toolResults?.[idx];
|
|
40
|
-
if (!toolResult) return;
|
|
41
|
-
const tc: ToolCall = convertAISDKToolCall(toolCall);
|
|
42
|
-
const resultStr = getToolResultOutput(toolResult.output);
|
|
43
|
-
|
|
44
|
-
logger.debug('Tool executed', {
|
|
45
|
-
toolName: tc.function.name,
|
|
46
|
-
resultLength: resultStr.length,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
callbacks.onToolExecuted?.(tc, resultStr);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Creates the prepareStep callback for AI SDK generateText
|
|
57
|
-
* This filters out empty assistant messages and orphaned tool results
|
|
58
|
-
*/
|
|
59
|
-
export function createPrepareStepHandler(): (params: {
|
|
60
|
-
messages: ModelMessage[];
|
|
61
|
-
}) => {messages?: ModelMessage[]} | Record<string, never> {
|
|
62
|
-
const logger = getLogger();
|
|
63
|
-
|
|
64
|
-
return ({messages}) => {
|
|
65
|
-
// Filter out empty assistant messages that would cause API errors
|
|
66
|
-
// "Assistant message must have either content or tool_calls"
|
|
67
|
-
// Also filter out orphaned tool messages that follow empty assistant messages
|
|
68
|
-
const filteredMessages: ModelMessage[] = [];
|
|
69
|
-
const indicesToSkip = new Set<number>();
|
|
70
|
-
|
|
71
|
-
// First pass: identify empty assistant messages and their orphaned tool results
|
|
72
|
-
for (let i = 0; i < messages.length; i++) {
|
|
73
|
-
if (isEmptyAssistantMessage(messages[i] as unknown as TestableMessage)) {
|
|
74
|
-
indicesToSkip.add(i);
|
|
75
|
-
|
|
76
|
-
// Mark any immediately following tool messages as orphaned
|
|
77
|
-
let j = i + 1;
|
|
78
|
-
while (j < messages.length && messages[j].role === 'tool') {
|
|
79
|
-
indicesToSkip.add(j);
|
|
80
|
-
j++;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Second pass: build filtered array
|
|
86
|
-
for (let i = 0; i < messages.length; i++) {
|
|
87
|
-
if (!indicesToSkip.has(i)) {
|
|
88
|
-
filteredMessages.push(messages[i]);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Log message filtering
|
|
93
|
-
if (filteredMessages.length !== messages.length) {
|
|
94
|
-
logger.debug(
|
|
95
|
-
'Filtered empty assistant messages and orphaned tool results',
|
|
96
|
-
{
|
|
97
|
-
originalCount: messages.length,
|
|
98
|
-
filteredCount: filteredMessages.length,
|
|
99
|
-
removedCount: messages.length - filteredMessages.length,
|
|
100
|
-
},
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Return filtered messages if any were removed, otherwise no changes
|
|
105
|
-
if (filteredMessages.length !== messages.length) {
|
|
106
|
-
return {messages: filteredMessages};
|
|
107
|
-
}
|
|
108
|
-
return {}; // No modifications needed
|
|
109
|
-
};
|
|
110
|
-
}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import type {AISDKCoreTool, StreamCallbacks} from '@/types/index';
|
|
3
|
-
import {processXMLToolCalls} from './tool-processor.js';
|
|
4
|
-
|
|
5
|
-
test('processXMLToolCalls returns empty result when no tools available', t => {
|
|
6
|
-
const content = 'Some response text';
|
|
7
|
-
const tools: Record<string, AISDKCoreTool> = {};
|
|
8
|
-
const callbacks: StreamCallbacks = {};
|
|
9
|
-
|
|
10
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
11
|
-
|
|
12
|
-
t.deepEqual(result.toolCalls, []);
|
|
13
|
-
t.is(result.cleanedContent, content);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
test('processXMLToolCalls returns empty result when content is empty', t => {
|
|
17
|
-
const content = '';
|
|
18
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
19
|
-
test_tool: {} as AISDKCoreTool, // Type-only check, actual structure doesn't matter for empty content test
|
|
20
|
-
};
|
|
21
|
-
const callbacks: StreamCallbacks = {};
|
|
22
|
-
|
|
23
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
24
|
-
|
|
25
|
-
t.deepEqual(result.toolCalls, []);
|
|
26
|
-
t.is(result.cleanedContent, content);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test('processXMLToolCalls handles malformed XML gracefully', t => {
|
|
30
|
-
const content = '<tool_call>\n<name>test_tool</name>\n<arguments>';
|
|
31
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
32
|
-
test_tool: {} as AISDKCoreTool,
|
|
33
|
-
};
|
|
34
|
-
const callbacks: StreamCallbacks = {
|
|
35
|
-
onToolCall: () => {},
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Function should not throw, even with malformed XML
|
|
39
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
40
|
-
|
|
41
|
-
t.truthy(result);
|
|
42
|
-
t.true(Array.isArray(result.toolCalls));
|
|
43
|
-
t.is(typeof result.cleanedContent, 'string');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('processXMLToolCalls handles valid XML content', t => {
|
|
47
|
-
const content =
|
|
48
|
-
'<tool_call>\n<name>test_tool</name>\n<arguments>{"arg": "value"}</arguments>\n</tool_call>';
|
|
49
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
50
|
-
test_tool: {} as AISDKCoreTool,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const callbacks: StreamCallbacks = {
|
|
54
|
-
onToolCall: () => {},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// Function should not throw with valid XML structure
|
|
58
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
59
|
-
|
|
60
|
-
t.truthy(result);
|
|
61
|
-
t.true(Array.isArray(result.toolCalls));
|
|
62
|
-
t.is(typeof result.cleanedContent, 'string');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test('processXMLToolCalls handles mixed content', t => {
|
|
66
|
-
const content =
|
|
67
|
-
'Some text before\n<tool_call>\n<name>test_tool</name>\n<arguments>{}</arguments>\n</tool_call>\nSome text after';
|
|
68
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
69
|
-
test_tool: {} as AISDKCoreTool,
|
|
70
|
-
};
|
|
71
|
-
const callbacks: StreamCallbacks = {};
|
|
72
|
-
|
|
73
|
-
// Function should not throw with mixed content
|
|
74
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
75
|
-
|
|
76
|
-
t.truthy(result);
|
|
77
|
-
t.true(Array.isArray(result.toolCalls));
|
|
78
|
-
t.is(typeof result.cleanedContent, 'string');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('processXMLToolCalls returns original content when no XML tool calls', t => {
|
|
82
|
-
const content = 'Just some plain text response';
|
|
83
|
-
const tools: Record<string, AISDKCoreTool> = {
|
|
84
|
-
test_tool: {} as AISDKCoreTool,
|
|
85
|
-
};
|
|
86
|
-
const callbacks: StreamCallbacks = {};
|
|
87
|
-
|
|
88
|
-
const result = processXMLToolCalls(content, tools, callbacks);
|
|
89
|
-
|
|
90
|
-
t.deepEqual(result.toolCalls, []);
|
|
91
|
-
t.is(result.cleanedContent, content);
|
|
92
|
-
});
|
|
@@ -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
|
-
});
|