@gguf/coder 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +16 -0
- package/.env.example +63 -0
- package/.gitattributes +1 -0
- package/.semgrepignore +19 -0
- package/coder-dummy-file.ts +52 -0
- package/coder.config.example.json +59 -0
- package/coder.config.json +13 -0
- package/color_picker.html +36 -0
- package/package.json +2 -14
- package/scripts/extract-changelog.js +73 -0
- package/scripts/fetch-models.js +143 -0
- package/scripts/test.sh +40 -0
- package/scripts/update-homebrew-formula.sh +125 -0
- package/scripts/update-nix-version.sh +157 -0
- package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
- package/source/ai-sdk-client/AISDKClient.ts +155 -0
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
- package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
- package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
- package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
- package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
- package/source/ai-sdk-client/converters/message-converter.ts +113 -0
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
- package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
- package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
- package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
- package/source/ai-sdk-client/index.ts +7 -0
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
- package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
- package/source/ai-sdk-client/types.ts +9 -0
- package/source/ai-sdk-client-empty-message.spec.ts +141 -0
- package/source/ai-sdk-client-error-handling.spec.ts +186 -0
- package/source/ai-sdk-client-maxretries.spec.ts +114 -0
- package/source/ai-sdk-client-preparestep.spec.ts +279 -0
- package/source/app/App.spec.tsx +32 -0
- package/source/app/App.tsx +480 -0
- package/source/app/components/AppContainer.spec.tsx +96 -0
- package/source/app/components/AppContainer.tsx +56 -0
- package/source/app/components/ChatInterface.spec.tsx +163 -0
- package/source/app/components/ChatInterface.tsx +144 -0
- package/source/app/components/ModalSelectors.spec.tsx +141 -0
- package/source/app/components/ModalSelectors.tsx +135 -0
- package/source/app/helpers.spec.ts +97 -0
- package/source/app/helpers.ts +63 -0
- package/source/app/index.ts +4 -0
- package/source/app/types.ts +39 -0
- package/source/app/utils/appUtils.ts +294 -0
- package/source/app/utils/conversationState.ts +310 -0
- package/source/app.spec.tsx +244 -0
- package/source/cli.spec.ts +73 -0
- package/source/cli.tsx +51 -0
- package/source/client-factory.spec.ts +48 -0
- package/source/client-factory.ts +178 -0
- package/source/command-parser.spec.ts +127 -0
- package/source/command-parser.ts +36 -0
- package/source/commands/checkpoint.spec.tsx +277 -0
- package/source/commands/checkpoint.tsx +366 -0
- package/source/commands/clear.tsx +22 -0
- package/source/commands/custom-commands.tsx +121 -0
- package/source/commands/exit.ts +21 -0
- package/source/commands/export.spec.tsx +131 -0
- package/source/commands/export.tsx +79 -0
- package/source/commands/help.tsx +120 -0
- package/source/commands/index.ts +17 -0
- package/source/commands/init.tsx +339 -0
- package/source/commands/lsp-command.spec.tsx +281 -0
- package/source/commands/lsp.tsx +120 -0
- package/source/commands/mcp-command.spec.tsx +313 -0
- package/source/commands/mcp.tsx +162 -0
- package/source/commands/model-database.spec.tsx +758 -0
- package/source/commands/model-database.tsx +418 -0
- package/source/commands/model.ts +12 -0
- package/source/commands/provider.ts +12 -0
- package/source/commands/setup-config.tsx +16 -0
- package/source/commands/simple-commands.spec.tsx +175 -0
- package/source/commands/status.ts +12 -0
- package/source/commands/theme.ts +12 -0
- package/source/commands/update.spec.tsx +261 -0
- package/source/commands/update.tsx +201 -0
- package/source/commands/usage.spec.tsx +495 -0
- package/source/commands/usage.tsx +100 -0
- package/source/commands.spec.ts +436 -0
- package/source/commands.ts +83 -0
- package/source/components/assistant-message.spec.tsx +796 -0
- package/source/components/assistant-message.tsx +34 -0
- package/source/components/bash-execution-indicator.tsx +21 -0
- package/source/components/cancelling-indicator.tsx +16 -0
- package/source/components/chat-queue.spec.tsx +83 -0
- package/source/components/chat-queue.tsx +36 -0
- package/source/components/checkpoint-display.spec.tsx +219 -0
- package/source/components/checkpoint-display.tsx +126 -0
- package/source/components/checkpoint-selector.spec.tsx +173 -0
- package/source/components/checkpoint-selector.tsx +173 -0
- package/source/components/development-mode-indicator.spec.tsx +268 -0
- package/source/components/development-mode-indicator.tsx +38 -0
- package/source/components/message-box.spec.tsx +427 -0
- package/source/components/message-box.tsx +87 -0
- package/source/components/model-selector.tsx +132 -0
- package/source/components/provider-selector.tsx +75 -0
- package/source/components/random-spinner.tsx +19 -0
- package/source/components/security-disclaimer.tsx +73 -0
- package/source/components/status-connection-display.spec.tsx +133 -0
- package/source/components/status.tsx +267 -0
- package/source/components/theme-selector.tsx +126 -0
- package/source/components/tool-confirmation.tsx +190 -0
- package/source/components/tool-execution-indicator.tsx +33 -0
- package/source/components/tool-message.tsx +85 -0
- package/source/components/ui/titled-box.spec.tsx +207 -0
- package/source/components/ui/titled-box.tsx +57 -0
- package/source/components/usage/progress-bar.spec.tsx +398 -0
- package/source/components/usage/progress-bar.tsx +30 -0
- package/source/components/usage/usage-display.spec.tsx +780 -0
- package/source/components/usage/usage-display.tsx +291 -0
- package/source/components/user-input.spec.tsx +327 -0
- package/source/components/user-input.tsx +533 -0
- package/source/components/user-message.spec.tsx +230 -0
- package/source/components/user-message.tsx +84 -0
- package/source/components/welcome-message.tsx +76 -0
- package/source/config/env-substitution.ts +65 -0
- package/source/config/index.spec.ts +171 -0
- package/source/config/index.ts +154 -0
- package/source/config/paths.spec.ts +241 -0
- package/source/config/paths.ts +55 -0
- package/source/config/preferences.ts +51 -0
- package/source/config/themes.ts +315 -0
- package/source/constants.ts +130 -0
- package/source/context/mode-context.spec.ts +79 -0
- package/source/context/mode-context.ts +24 -0
- package/source/custom-commands/executor.spec.ts +142 -0
- package/source/custom-commands/executor.ts +64 -0
- package/source/custom-commands/loader.spec.ts +314 -0
- package/source/custom-commands/loader.ts +153 -0
- package/source/custom-commands/parser.ts +196 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
- package/source/hooks/chat-handler/index.ts +12 -0
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
- package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
- package/source/hooks/chat-handler/types.ts +38 -0
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
- package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
- package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
- package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
- package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
- package/source/hooks/useAppHandlers.tsx +291 -0
- package/source/hooks/useAppInitialization.tsx +422 -0
- package/source/hooks/useAppState.tsx +311 -0
- package/source/hooks/useDirectoryTrust.tsx +98 -0
- package/source/hooks/useInputState.ts +414 -0
- package/source/hooks/useModeHandlers.tsx +302 -0
- package/source/hooks/useNonInteractiveMode.ts +140 -0
- package/source/hooks/useTerminalWidth.tsx +81 -0
- package/source/hooks/useTheme.ts +18 -0
- package/source/hooks/useToolHandler.tsx +349 -0
- package/source/hooks/useUIState.ts +61 -0
- package/source/init/agents-template-generator.ts +421 -0
- package/source/init/existing-rules-extractor.ts +319 -0
- package/source/init/file-scanner.spec.ts +227 -0
- package/source/init/file-scanner.ts +238 -0
- package/source/init/framework-detector.ts +382 -0
- package/source/init/language-detector.ts +269 -0
- package/source/init/project-analyzer.spec.ts +231 -0
- package/source/init/project-analyzer.ts +458 -0
- package/source/lsp/index.ts +31 -0
- package/source/lsp/lsp-client.spec.ts +508 -0
- package/source/lsp/lsp-client.ts +487 -0
- package/source/lsp/lsp-manager.spec.ts +477 -0
- package/source/lsp/lsp-manager.ts +419 -0
- package/source/lsp/protocol.spec.ts +502 -0
- package/source/lsp/protocol.ts +360 -0
- package/source/lsp/server-discovery.spec.ts +654 -0
- package/source/lsp/server-discovery.ts +515 -0
- package/source/markdown-parser/html-entities.spec.ts +88 -0
- package/source/markdown-parser/html-entities.ts +45 -0
- package/source/markdown-parser/index.spec.ts +281 -0
- package/source/markdown-parser/index.ts +126 -0
- package/source/markdown-parser/table-parser.spec.ts +133 -0
- package/source/markdown-parser/table-parser.ts +114 -0
- package/source/markdown-parser/utils.spec.ts +70 -0
- package/source/markdown-parser/utils.ts +13 -0
- package/source/mcp/mcp-client.spec.ts +81 -0
- package/source/mcp/mcp-client.ts +625 -0
- package/source/mcp/transport-factory.spec.ts +406 -0
- package/source/mcp/transport-factory.ts +312 -0
- package/source/message-handler.ts +67 -0
- package/source/model-database/database-engine.spec.ts +494 -0
- package/source/model-database/database-engine.ts +50 -0
- package/source/model-database/model-database.spec.ts +363 -0
- package/source/model-database/model-database.ts +91 -0
- package/source/model-database/model-engine.spec.ts +447 -0
- package/source/model-database/model-engine.ts +65 -0
- package/source/model-database/model-fetcher.spec.ts +583 -0
- package/source/model-database/model-fetcher.ts +330 -0
- package/source/models/index.ts +1 -0
- package/source/models/models-cache.spec.ts +214 -0
- package/source/models/models-cache.ts +78 -0
- package/source/models/models-dev-client.spec.ts +379 -0
- package/source/models/models-dev-client.ts +329 -0
- package/source/models/models-types.ts +68 -0
- package/source/prompt-history.ts +155 -0
- package/source/security/command-injection.spec.ts +240 -0
- package/source/services/checkpoint-manager.spec.ts +523 -0
- package/source/services/checkpoint-manager.ts +466 -0
- package/source/services/file-snapshot.spec.ts +569 -0
- package/source/services/file-snapshot.ts +220 -0
- package/source/test-utils/render-with-theme.tsx +48 -0
- package/source/tokenization/index.ts +1 -0
- package/source/tokenization/tokenizer-factory.spec.ts +170 -0
- package/source/tokenization/tokenizer-factory.ts +125 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
- package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
- package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
- package/source/tool-calling/index.ts +5 -0
- package/source/tool-calling/json-parser.spec.ts +639 -0
- package/source/tool-calling/json-parser.ts +247 -0
- package/source/tool-calling/tool-parser.spec.ts +395 -0
- package/source/tool-calling/tool-parser.ts +120 -0
- package/source/tool-calling/xml-parser.spec.ts +662 -0
- package/source/tool-calling/xml-parser.ts +289 -0
- package/source/tools/execute-bash.spec.tsx +353 -0
- package/source/tools/execute-bash.tsx +219 -0
- package/source/tools/execute-function.spec.ts +130 -0
- package/source/tools/fetch-url.spec.tsx +342 -0
- package/source/tools/fetch-url.tsx +172 -0
- package/source/tools/find-files.spec.tsx +924 -0
- package/source/tools/find-files.tsx +293 -0
- package/source/tools/index.ts +102 -0
- package/source/tools/lsp-get-diagnostics.tsx +192 -0
- package/source/tools/needs-approval.spec.ts +282 -0
- package/source/tools/read-file.spec.tsx +801 -0
- package/source/tools/read-file.tsx +387 -0
- package/source/tools/search-file-contents.spec.tsx +1273 -0
- package/source/tools/search-file-contents.tsx +293 -0
- package/source/tools/string-replace.spec.tsx +730 -0
- package/source/tools/string-replace.tsx +548 -0
- package/source/tools/tool-manager.ts +210 -0
- package/source/tools/tool-registry.spec.ts +415 -0
- package/source/tools/tool-registry.ts +228 -0
- package/source/tools/web-search.tsx +223 -0
- package/source/tools/write-file.spec.tsx +559 -0
- package/source/tools/write-file.tsx +228 -0
- package/source/types/app.ts +37 -0
- package/source/types/checkpoint.ts +48 -0
- package/source/types/commands.ts +46 -0
- package/source/types/components.ts +27 -0
- package/source/types/config.ts +103 -0
- package/source/types/core-connection-status.spec.ts +67 -0
- package/source/types/core.ts +181 -0
- package/source/types/hooks.ts +50 -0
- package/source/types/index.ts +12 -0
- package/source/types/markdown-parser.ts +11 -0
- package/source/types/mcp.ts +52 -0
- package/source/types/system.ts +16 -0
- package/source/types/tokenization.ts +41 -0
- package/source/types/ui.ts +40 -0
- package/source/types/usage.ts +58 -0
- package/source/types/utils.ts +16 -0
- package/source/usage/calculator.spec.ts +385 -0
- package/source/usage/calculator.ts +104 -0
- package/source/usage/storage.spec.ts +703 -0
- package/source/usage/storage.ts +238 -0
- package/source/usage/tracker.spec.ts +456 -0
- package/source/usage/tracker.ts +102 -0
- package/source/utils/atomic-deletion.spec.ts +194 -0
- package/source/utils/atomic-deletion.ts +127 -0
- package/source/utils/bounded-map.spec.ts +300 -0
- package/source/utils/bounded-map.ts +193 -0
- package/source/utils/checkpoint-utils.spec.ts +222 -0
- package/source/utils/checkpoint-utils.ts +92 -0
- package/source/utils/error-formatter.spec.ts +169 -0
- package/source/utils/error-formatter.ts +194 -0
- package/source/utils/file-autocomplete.spec.ts +173 -0
- package/source/utils/file-autocomplete.ts +196 -0
- package/source/utils/file-cache.spec.ts +309 -0
- package/source/utils/file-cache.ts +195 -0
- package/source/utils/file-content-loader.spec.ts +180 -0
- package/source/utils/file-content-loader.ts +179 -0
- package/source/utils/file-mention-handler.spec.ts +261 -0
- package/source/utils/file-mention-handler.ts +84 -0
- package/source/utils/file-mention-parser.spec.ts +182 -0
- package/source/utils/file-mention-parser.ts +170 -0
- package/source/utils/fuzzy-matching.spec.ts +149 -0
- package/source/utils/fuzzy-matching.ts +146 -0
- package/source/utils/indentation-normalizer.spec.ts +216 -0
- package/source/utils/indentation-normalizer.ts +76 -0
- package/source/utils/installation-detector.spec.ts +178 -0
- package/source/utils/installation-detector.ts +153 -0
- package/source/utils/logging/config.spec.ts +311 -0
- package/source/utils/logging/config.ts +210 -0
- package/source/utils/logging/console-facade.spec.ts +184 -0
- package/source/utils/logging/console-facade.ts +384 -0
- package/source/utils/logging/correlation.spec.ts +679 -0
- package/source/utils/logging/correlation.ts +474 -0
- package/source/utils/logging/formatters.spec.ts +464 -0
- package/source/utils/logging/formatters.ts +207 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
- package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
- package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
- package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
- package/source/utils/logging/health-monitor/index.ts +15 -0
- package/source/utils/logging/health-monitor/instances.ts +48 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
- package/source/utils/logging/health-monitor/types.ts +126 -0
- package/source/utils/logging/index.spec.ts +284 -0
- package/source/utils/logging/index.ts +236 -0
- package/source/utils/logging/integration.spec.ts +441 -0
- package/source/utils/logging/log-method-factory.spec.ts +573 -0
- package/source/utils/logging/log-method-factory.ts +233 -0
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
- package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
- package/source/utils/logging/log-query/index.ts +23 -0
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
- package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
- package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
- package/source/utils/logging/log-query/query/query-builder.ts +151 -0
- package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
- package/source/utils/logging/log-query/query/query-engine.ts +45 -0
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
- package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
- package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
- package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
- package/source/utils/logging/log-query/types.ts +163 -0
- package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
- package/source/utils/logging/log-query/utils/helpers.ts +72 -0
- package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
- package/source/utils/logging/log-query/utils/sorting.ts +61 -0
- package/source/utils/logging/logger-provider.spec.ts +262 -0
- package/source/utils/logging/logger-provider.ts +362 -0
- package/source/utils/logging/performance.spec.ts +209 -0
- package/source/utils/logging/performance.ts +757 -0
- package/source/utils/logging/pino-logger.spec.ts +425 -0
- package/source/utils/logging/pino-logger.ts +514 -0
- package/source/utils/logging/redaction.spec.ts +490 -0
- package/source/utils/logging/redaction.ts +267 -0
- package/source/utils/logging/request-tracker.spec.ts +1198 -0
- package/source/utils/logging/request-tracker.ts +803 -0
- package/source/utils/logging/transports.spec.ts +505 -0
- package/source/utils/logging/transports.ts +305 -0
- package/source/utils/logging/types.ts +216 -0
- package/source/utils/message-builder.spec.ts +179 -0
- package/source/utils/message-builder.ts +101 -0
- package/source/utils/message-queue.tsx +486 -0
- package/source/utils/paste-detection.spec.ts +69 -0
- package/source/utils/paste-detection.ts +124 -0
- package/source/utils/paste-roundtrip.spec.ts +442 -0
- package/source/utils/paste-utils.spec.ts +128 -0
- package/source/utils/paste-utils.ts +52 -0
- package/source/utils/programming-language-helper.spec.ts +74 -0
- package/source/utils/programming-language-helper.ts +32 -0
- package/source/utils/prompt-assembly.spec.ts +221 -0
- package/source/utils/prompt-processor.ts +173 -0
- package/source/utils/tool-args-parser.spec.ts +136 -0
- package/source/utils/tool-args-parser.ts +54 -0
- package/source/utils/tool-cancellation.spec.ts +230 -0
- package/source/utils/tool-cancellation.ts +28 -0
- package/source/utils/tool-result-display.spec.tsx +469 -0
- package/source/utils/tool-result-display.tsx +90 -0
- package/source/utils/update-checker.spec.ts +383 -0
- package/source/utils/update-checker.ts +183 -0
- package/source/wizard/config-wizard.spec.tsx +103 -0
- package/source/wizard/config-wizard.tsx +382 -0
- package/source/wizard/steps/location-step.spec.tsx +186 -0
- package/source/wizard/steps/location-step.tsx +147 -0
- package/source/wizard/steps/mcp-step.spec.tsx +607 -0
- package/source/wizard/steps/mcp-step.tsx +632 -0
- package/source/wizard/steps/provider-step.spec.tsx +342 -0
- package/source/wizard/steps/provider-step.tsx +957 -0
- package/source/wizard/steps/summary-step.spec.tsx +749 -0
- package/source/wizard/steps/summary-step.tsx +228 -0
- package/source/wizard/templates/mcp-templates.spec.ts +613 -0
- package/source/wizard/templates/mcp-templates.ts +570 -0
- package/source/wizard/templates/provider-templates.spec.ts +152 -0
- package/source/wizard/templates/provider-templates.ts +485 -0
- package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
- package/source/wizard/utils/fetch-cloud-models.ts +223 -0
- package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
- package/source/wizard/utils/fetch-local-models.ts +192 -0
- package/source/wizard/validation-array.spec.ts +264 -0
- package/source/wizard/validation.spec.ts +373 -0
- package/source/wizard/validation.ts +232 -0
- package/source/app/prompts/main-prompt.md +0 -122
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import {existsSync} from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import type {Message} from '@/types/core';
|
|
4
|
+
import test from 'ava';
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import {CheckpointManager} from './checkpoint-manager';
|
|
7
|
+
|
|
8
|
+
// Helper to create a temporary directory for tests
|
|
9
|
+
async function createTempDir(): Promise<string> {
|
|
10
|
+
const tempDir = path.join(
|
|
11
|
+
process.cwd(),
|
|
12
|
+
'.test-temp',
|
|
13
|
+
`checkpoint-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
14
|
+
);
|
|
15
|
+
await fs.mkdir(tempDir, {recursive: true});
|
|
16
|
+
return tempDir;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Helper to clean up temp directory
|
|
20
|
+
async function cleanupTempDir(dir: string): Promise<void> {
|
|
21
|
+
try {
|
|
22
|
+
await fs.rm(dir, {recursive: true, force: true});
|
|
23
|
+
} catch {
|
|
24
|
+
// Ignore cleanup errors
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Helper to create mock messages
|
|
29
|
+
function createMockMessages(count: number): Message[] {
|
|
30
|
+
const messages: Message[] = [];
|
|
31
|
+
for (let i = 0; i < count; i++) {
|
|
32
|
+
messages.push({
|
|
33
|
+
role: i % 2 === 0 ? 'user' : 'assistant',
|
|
34
|
+
content: `Message ${i + 1}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return messages;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
test.serial(
|
|
41
|
+
'CheckpointManager creates checkpoints directory on save',
|
|
42
|
+
async t => {
|
|
43
|
+
const tempDir = await createTempDir();
|
|
44
|
+
try {
|
|
45
|
+
const manager = new CheckpointManager(tempDir);
|
|
46
|
+
const messages = createMockMessages(2);
|
|
47
|
+
|
|
48
|
+
await manager.saveCheckpoint(
|
|
49
|
+
'test-checkpoint',
|
|
50
|
+
messages,
|
|
51
|
+
'TestProvider',
|
|
52
|
+
'test-model',
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const checkpointsDir = path.join(tempDir, '.coder', 'checkpoints');
|
|
56
|
+
t.true(existsSync(checkpointsDir));
|
|
57
|
+
} finally {
|
|
58
|
+
await cleanupTempDir(tempDir);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
test.serial(
|
|
64
|
+
'CheckpointManager saves checkpoint with provided name',
|
|
65
|
+
async t => {
|
|
66
|
+
const tempDir = await createTempDir();
|
|
67
|
+
try {
|
|
68
|
+
const manager = new CheckpointManager(tempDir);
|
|
69
|
+
const messages = createMockMessages(2);
|
|
70
|
+
|
|
71
|
+
const metadata = await manager.saveCheckpoint(
|
|
72
|
+
'my-checkpoint',
|
|
73
|
+
messages,
|
|
74
|
+
'TestProvider',
|
|
75
|
+
'test-model',
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
t.is(metadata.name, 'my-checkpoint');
|
|
79
|
+
t.true(manager.checkpointExists('my-checkpoint'));
|
|
80
|
+
} finally {
|
|
81
|
+
await cleanupTempDir(tempDir);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
test.serial(
|
|
87
|
+
'CheckpointManager generates timestamp-based name when not provided',
|
|
88
|
+
async t => {
|
|
89
|
+
const tempDir = await createTempDir();
|
|
90
|
+
try {
|
|
91
|
+
const manager = new CheckpointManager(tempDir);
|
|
92
|
+
const messages = createMockMessages(2);
|
|
93
|
+
|
|
94
|
+
const metadata = await manager.saveCheckpoint(
|
|
95
|
+
undefined,
|
|
96
|
+
messages,
|
|
97
|
+
'TestProvider',
|
|
98
|
+
'test-model',
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
t.true(metadata.name.startsWith('checkpoint-'));
|
|
102
|
+
t.true(manager.checkpointExists(metadata.name));
|
|
103
|
+
} finally {
|
|
104
|
+
await cleanupTempDir(tempDir);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
test.serial('CheckpointManager saves correct metadata', async t => {
|
|
110
|
+
const tempDir = await createTempDir();
|
|
111
|
+
try {
|
|
112
|
+
const manager = new CheckpointManager(tempDir);
|
|
113
|
+
const messages = createMockMessages(4);
|
|
114
|
+
|
|
115
|
+
const metadata = await manager.saveCheckpoint(
|
|
116
|
+
'test',
|
|
117
|
+
messages,
|
|
118
|
+
'MyProvider',
|
|
119
|
+
'my-model',
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
t.is(metadata.messageCount, 4);
|
|
123
|
+
t.is(metadata.provider.name, 'MyProvider');
|
|
124
|
+
t.is(metadata.provider.model, 'my-model');
|
|
125
|
+
t.truthy(metadata.timestamp);
|
|
126
|
+
} finally {
|
|
127
|
+
await cleanupTempDir(tempDir);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test.serial(
|
|
132
|
+
'CheckpointManager throws error for duplicate checkpoint name',
|
|
133
|
+
async t => {
|
|
134
|
+
const tempDir = await createTempDir();
|
|
135
|
+
try {
|
|
136
|
+
const manager = new CheckpointManager(tempDir);
|
|
137
|
+
const messages = createMockMessages(2);
|
|
138
|
+
|
|
139
|
+
await manager.saveCheckpoint('duplicate', messages, 'Provider', 'model');
|
|
140
|
+
|
|
141
|
+
await t.throwsAsync(
|
|
142
|
+
async () => {
|
|
143
|
+
await manager.saveCheckpoint(
|
|
144
|
+
'duplicate',
|
|
145
|
+
messages,
|
|
146
|
+
'Provider',
|
|
147
|
+
'model',
|
|
148
|
+
);
|
|
149
|
+
},
|
|
150
|
+
{message: /already exists/},
|
|
151
|
+
);
|
|
152
|
+
} finally {
|
|
153
|
+
await cleanupTempDir(tempDir);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
test.serial(
|
|
159
|
+
'CheckpointManager throws error for invalid checkpoint name',
|
|
160
|
+
async t => {
|
|
161
|
+
const tempDir = await createTempDir();
|
|
162
|
+
try {
|
|
163
|
+
const manager = new CheckpointManager(tempDir);
|
|
164
|
+
const messages = createMockMessages(2);
|
|
165
|
+
|
|
166
|
+
await t.throwsAsync(
|
|
167
|
+
async () => {
|
|
168
|
+
await manager.saveCheckpoint(
|
|
169
|
+
'invalid/name',
|
|
170
|
+
messages,
|
|
171
|
+
'Provider',
|
|
172
|
+
'model',
|
|
173
|
+
);
|
|
174
|
+
},
|
|
175
|
+
{message: /invalid characters/},
|
|
176
|
+
);
|
|
177
|
+
} finally {
|
|
178
|
+
await cleanupTempDir(tempDir);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
test.serial('CheckpointManager loads saved checkpoint', async t => {
|
|
184
|
+
const tempDir = await createTempDir();
|
|
185
|
+
try {
|
|
186
|
+
const manager = new CheckpointManager(tempDir);
|
|
187
|
+
const messages = createMockMessages(3);
|
|
188
|
+
|
|
189
|
+
await manager.saveCheckpoint('loadable', messages, 'Provider', 'model');
|
|
190
|
+
const loaded = await manager.loadCheckpoint('loadable');
|
|
191
|
+
|
|
192
|
+
t.is(loaded.metadata.name, 'loadable');
|
|
193
|
+
t.is(loaded.conversation.messages.length, 3);
|
|
194
|
+
t.is(loaded.conversation.messages[0].content, 'Message 1');
|
|
195
|
+
} finally {
|
|
196
|
+
await cleanupTempDir(tempDir);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test.serial(
|
|
201
|
+
'CheckpointManager throws error loading non-existent checkpoint',
|
|
202
|
+
async t => {
|
|
203
|
+
const tempDir = await createTempDir();
|
|
204
|
+
try {
|
|
205
|
+
const manager = new CheckpointManager(tempDir);
|
|
206
|
+
|
|
207
|
+
await t.throwsAsync(
|
|
208
|
+
async () => {
|
|
209
|
+
await manager.loadCheckpoint('non-existent');
|
|
210
|
+
},
|
|
211
|
+
{message: /does not exist/},
|
|
212
|
+
);
|
|
213
|
+
} finally {
|
|
214
|
+
await cleanupTempDir(tempDir);
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
test.serial('CheckpointManager lists checkpoints', async t => {
|
|
220
|
+
const tempDir = await createTempDir();
|
|
221
|
+
try {
|
|
222
|
+
const manager = new CheckpointManager(tempDir);
|
|
223
|
+
const messages = createMockMessages(2);
|
|
224
|
+
|
|
225
|
+
await manager.saveCheckpoint('checkpoint-1', messages, 'Provider', 'model');
|
|
226
|
+
await manager.saveCheckpoint('checkpoint-2', messages, 'Provider', 'model');
|
|
227
|
+
await manager.saveCheckpoint('checkpoint-3', messages, 'Provider', 'model');
|
|
228
|
+
|
|
229
|
+
const list = await manager.listCheckpoints();
|
|
230
|
+
|
|
231
|
+
t.is(list.length, 3);
|
|
232
|
+
const names = list.map(c => c.name);
|
|
233
|
+
t.true(names.includes('checkpoint-1'));
|
|
234
|
+
t.true(names.includes('checkpoint-2'));
|
|
235
|
+
t.true(names.includes('checkpoint-3'));
|
|
236
|
+
} finally {
|
|
237
|
+
await cleanupTempDir(tempDir);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test.serial(
|
|
242
|
+
'CheckpointManager lists checkpoints sorted by timestamp (newest first)',
|
|
243
|
+
async t => {
|
|
244
|
+
const tempDir = await createTempDir();
|
|
245
|
+
try {
|
|
246
|
+
const manager = new CheckpointManager(tempDir);
|
|
247
|
+
const messages = createMockMessages(2);
|
|
248
|
+
|
|
249
|
+
await manager.saveCheckpoint('oldest', messages, 'Provider', 'model');
|
|
250
|
+
await new Promise(resolve => setTimeout(resolve, 10)); // Small delay
|
|
251
|
+
await manager.saveCheckpoint('middle', messages, 'Provider', 'model');
|
|
252
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
253
|
+
await manager.saveCheckpoint('newest', messages, 'Provider', 'model');
|
|
254
|
+
|
|
255
|
+
const list = await manager.listCheckpoints();
|
|
256
|
+
|
|
257
|
+
t.is(list[0].name, 'newest');
|
|
258
|
+
t.is(list[2].name, 'oldest');
|
|
259
|
+
} finally {
|
|
260
|
+
await cleanupTempDir(tempDir);
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
test.serial(
|
|
266
|
+
'CheckpointManager returns empty list when no checkpoints',
|
|
267
|
+
async t => {
|
|
268
|
+
const tempDir = await createTempDir();
|
|
269
|
+
try {
|
|
270
|
+
const manager = new CheckpointManager(tempDir);
|
|
271
|
+
const list = await manager.listCheckpoints();
|
|
272
|
+
|
|
273
|
+
t.is(list.length, 0);
|
|
274
|
+
} finally {
|
|
275
|
+
await cleanupTempDir(tempDir);
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
test.serial('CheckpointManager deletes checkpoint', async t => {
|
|
281
|
+
const tempDir = await createTempDir();
|
|
282
|
+
try {
|
|
283
|
+
const manager = new CheckpointManager(tempDir);
|
|
284
|
+
const messages = createMockMessages(2);
|
|
285
|
+
|
|
286
|
+
await manager.saveCheckpoint('to-delete', messages, 'Provider', 'model');
|
|
287
|
+
t.true(manager.checkpointExists('to-delete'));
|
|
288
|
+
|
|
289
|
+
await manager.deleteCheckpoint('to-delete');
|
|
290
|
+
t.false(manager.checkpointExists('to-delete'));
|
|
291
|
+
} finally {
|
|
292
|
+
await cleanupTempDir(tempDir);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
test.serial(
|
|
297
|
+
'CheckpointManager throws error deleting non-existent checkpoint',
|
|
298
|
+
async t => {
|
|
299
|
+
const tempDir = await createTempDir();
|
|
300
|
+
try {
|
|
301
|
+
const manager = new CheckpointManager(tempDir);
|
|
302
|
+
|
|
303
|
+
await t.throwsAsync(
|
|
304
|
+
async () => {
|
|
305
|
+
await manager.deleteCheckpoint('non-existent');
|
|
306
|
+
},
|
|
307
|
+
{message: /does not exist/},
|
|
308
|
+
);
|
|
309
|
+
} finally {
|
|
310
|
+
await cleanupTempDir(tempDir);
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
test.serial('CheckpointManager validates checkpoint integrity', async t => {
|
|
316
|
+
const tempDir = await createTempDir();
|
|
317
|
+
try {
|
|
318
|
+
const manager = new CheckpointManager(tempDir);
|
|
319
|
+
const messages = createMockMessages(2);
|
|
320
|
+
|
|
321
|
+
await manager.saveCheckpoint('valid', messages, 'Provider', 'model');
|
|
322
|
+
const validation = await manager.validateCheckpoint('valid');
|
|
323
|
+
|
|
324
|
+
t.true(validation.valid);
|
|
325
|
+
t.is(validation.errors.length, 0);
|
|
326
|
+
} finally {
|
|
327
|
+
await cleanupTempDir(tempDir);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
test.serial(
|
|
332
|
+
'CheckpointManager detects invalid checkpoint (missing metadata)',
|
|
333
|
+
async t => {
|
|
334
|
+
const tempDir = await createTempDir();
|
|
335
|
+
try {
|
|
336
|
+
const manager = new CheckpointManager(tempDir);
|
|
337
|
+
|
|
338
|
+
// Create a checkpoint directory without metadata
|
|
339
|
+
const checkpointDir = path.join(
|
|
340
|
+
tempDir,
|
|
341
|
+
'.coder',
|
|
342
|
+
'checkpoints',
|
|
343
|
+
'broken',
|
|
344
|
+
);
|
|
345
|
+
await fs.mkdir(checkpointDir, {recursive: true});
|
|
346
|
+
|
|
347
|
+
const validation = await manager.validateCheckpoint('broken');
|
|
348
|
+
|
|
349
|
+
t.false(validation.valid);
|
|
350
|
+
t.true(validation.errors.some(e => e.includes('metadata')));
|
|
351
|
+
} finally {
|
|
352
|
+
await cleanupTempDir(tempDir);
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
test.serial(
|
|
358
|
+
'CheckpointManager checkpointExists returns true for existing checkpoint',
|
|
359
|
+
async t => {
|
|
360
|
+
const tempDir = await createTempDir();
|
|
361
|
+
try {
|
|
362
|
+
const manager = new CheckpointManager(tempDir);
|
|
363
|
+
const messages = createMockMessages(2);
|
|
364
|
+
|
|
365
|
+
await manager.saveCheckpoint('exists', messages, 'Provider', 'model');
|
|
366
|
+
|
|
367
|
+
t.true(manager.checkpointExists('exists'));
|
|
368
|
+
} finally {
|
|
369
|
+
await cleanupTempDir(tempDir);
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
test.serial(
|
|
375
|
+
'CheckpointManager checkpointExists returns false for non-existing checkpoint',
|
|
376
|
+
async t => {
|
|
377
|
+
const tempDir = await createTempDir();
|
|
378
|
+
try {
|
|
379
|
+
const manager = new CheckpointManager(tempDir);
|
|
380
|
+
|
|
381
|
+
t.false(manager.checkpointExists('does-not-exist'));
|
|
382
|
+
} finally {
|
|
383
|
+
await cleanupTempDir(tempDir);
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
test.serial(
|
|
389
|
+
'CheckpointManager getCheckpointMetadata returns metadata',
|
|
390
|
+
async t => {
|
|
391
|
+
const tempDir = await createTempDir();
|
|
392
|
+
try {
|
|
393
|
+
const manager = new CheckpointManager(tempDir);
|
|
394
|
+
const messages = createMockMessages(5);
|
|
395
|
+
|
|
396
|
+
await manager.saveCheckpoint(
|
|
397
|
+
'meta-test',
|
|
398
|
+
messages,
|
|
399
|
+
'MetaProvider',
|
|
400
|
+
'meta-model',
|
|
401
|
+
);
|
|
402
|
+
const metadata = await manager.getCheckpointMetadata('meta-test');
|
|
403
|
+
|
|
404
|
+
t.is(metadata.name, 'meta-test');
|
|
405
|
+
t.is(metadata.messageCount, 5);
|
|
406
|
+
t.is(metadata.provider.name, 'MetaProvider');
|
|
407
|
+
} finally {
|
|
408
|
+
await cleanupTempDir(tempDir);
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
test.serial(
|
|
414
|
+
'CheckpointManager generates description from first user message',
|
|
415
|
+
async t => {
|
|
416
|
+
const tempDir = await createTempDir();
|
|
417
|
+
try {
|
|
418
|
+
const manager = new CheckpointManager(tempDir);
|
|
419
|
+
const messages: Message[] = [
|
|
420
|
+
{role: 'user', content: 'This is my first message'},
|
|
421
|
+
{role: 'assistant', content: 'Hello!'},
|
|
422
|
+
];
|
|
423
|
+
|
|
424
|
+
const metadata = await manager.saveCheckpoint(
|
|
425
|
+
'desc-test',
|
|
426
|
+
messages,
|
|
427
|
+
'Provider',
|
|
428
|
+
'model',
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
t.is(metadata.description, 'This is my first message');
|
|
432
|
+
} finally {
|
|
433
|
+
await cleanupTempDir(tempDir);
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
test.serial('CheckpointManager truncates long descriptions', async t => {
|
|
439
|
+
const tempDir = await createTempDir();
|
|
440
|
+
try {
|
|
441
|
+
const manager = new CheckpointManager(tempDir);
|
|
442
|
+
const longMessage = 'A'.repeat(150);
|
|
443
|
+
const messages: Message[] = [{role: 'user', content: longMessage}];
|
|
444
|
+
|
|
445
|
+
const metadata = await manager.saveCheckpoint(
|
|
446
|
+
'long-desc',
|
|
447
|
+
messages,
|
|
448
|
+
'Provider',
|
|
449
|
+
'model',
|
|
450
|
+
);
|
|
451
|
+
|
|
452
|
+
t.true(metadata.description!.length <= 103); // 100 chars + "..."
|
|
453
|
+
t.true(metadata.description!.endsWith('...'));
|
|
454
|
+
} finally {
|
|
455
|
+
await cleanupTempDir(tempDir);
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
test.serial(
|
|
460
|
+
'CheckpointManager handles empty messages for description',
|
|
461
|
+
async t => {
|
|
462
|
+
const tempDir = await createTempDir();
|
|
463
|
+
try {
|
|
464
|
+
const manager = new CheckpointManager(tempDir);
|
|
465
|
+
const messages: Message[] = [
|
|
466
|
+
{role: 'assistant', content: 'No user messages'},
|
|
467
|
+
];
|
|
468
|
+
|
|
469
|
+
const metadata = await manager.saveCheckpoint(
|
|
470
|
+
'no-user',
|
|
471
|
+
messages,
|
|
472
|
+
'Provider',
|
|
473
|
+
'model',
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
t.is(metadata.description, 'Empty conversation');
|
|
477
|
+
} finally {
|
|
478
|
+
await cleanupTempDir(tempDir);
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
);
|
|
482
|
+
|
|
483
|
+
test.serial(
|
|
484
|
+
'CheckpointManager loadCheckpoint with validateIntegrity option',
|
|
485
|
+
async t => {
|
|
486
|
+
const tempDir = await createTempDir();
|
|
487
|
+
try {
|
|
488
|
+
const manager = new CheckpointManager(tempDir);
|
|
489
|
+
const messages = createMockMessages(2);
|
|
490
|
+
|
|
491
|
+
await manager.saveCheckpoint(
|
|
492
|
+
'validate-test',
|
|
493
|
+
messages,
|
|
494
|
+
'Provider',
|
|
495
|
+
'model',
|
|
496
|
+
);
|
|
497
|
+
const loaded = await manager.loadCheckpoint('validate-test', {
|
|
498
|
+
validateIntegrity: true,
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
t.truthy(loaded);
|
|
502
|
+
t.is(loaded.metadata.name, 'validate-test');
|
|
503
|
+
} finally {
|
|
504
|
+
await cleanupTempDir(tempDir);
|
|
505
|
+
}
|
|
506
|
+
},
|
|
507
|
+
);
|
|
508
|
+
|
|
509
|
+
test.serial('CheckpointManager list includes size information', async t => {
|
|
510
|
+
const tempDir = await createTempDir();
|
|
511
|
+
try {
|
|
512
|
+
const manager = new CheckpointManager(tempDir);
|
|
513
|
+
const messages = createMockMessages(2);
|
|
514
|
+
|
|
515
|
+
await manager.saveCheckpoint('size-test', messages, 'Provider', 'model');
|
|
516
|
+
const list = await manager.listCheckpoints();
|
|
517
|
+
|
|
518
|
+
t.truthy(list[0].sizeBytes);
|
|
519
|
+
t.true(list[0].sizeBytes! > 0);
|
|
520
|
+
} finally {
|
|
521
|
+
await cleanupTempDir(tempDir);
|
|
522
|
+
}
|
|
523
|
+
});
|