@vybestack/llxprt-code 0.1.20-nightly.250818.90f427f5 → 0.1.21
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/README.md +31 -0
- package/dist/package.json +3 -3
- package/dist/src/config/auth.test.d.ts +6 -0
- package/dist/src/config/auth.test.js +57 -0
- package/dist/src/config/auth.test.js.map +1 -0
- package/dist/src/config/config.d.ts +1 -1
- package/dist/src/config/config.js +27 -14
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/keyBindings.js +2 -2
- package/dist/src/config/keyBindings.test.d.ts +6 -0
- package/dist/src/config/keyBindings.test.js +51 -0
- package/dist/src/config/keyBindings.test.js.map +1 -0
- package/dist/src/config/logging/loggingConfig.test.d.ts +6 -0
- package/dist/src/config/logging/loggingConfig.test.js +363 -0
- package/dist/src/config/logging/loggingConfig.test.js.map +1 -0
- package/dist/src/config/settingsSchema.d.ts +0 -9
- package/dist/src/config/settingsSchema.js +0 -9
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.d.ts +6 -0
- package/dist/src/config/settingsSchema.test.js +195 -0
- package/dist/src/config/settingsSchema.test.js.map +1 -0
- package/dist/src/config/trustedFolders.test.d.ts +6 -0
- package/dist/src/config/trustedFolders.test.js +156 -0
- package/dist/src/config/trustedFolders.test.js.map +1 -0
- package/dist/src/gemini.js +14 -4
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.d.ts +6 -0
- package/dist/src/gemini.test.js +199 -0
- package/dist/src/gemini.test.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +1 -1
- package/dist/src/generated/git-commit.js +1 -1
- package/dist/src/integration-tests/base-url-behavior.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/base-url-behavior.integration.test.js +492 -0
- package/dist/src/integration-tests/base-url-behavior.integration.test.js.map +1 -0
- package/dist/src/integration-tests/cli-args.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/cli-args.integration.test.js +398 -0
- package/dist/src/integration-tests/cli-args.integration.test.js.map +1 -0
- package/dist/src/integration-tests/compression-settings-apply.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/compression-settings-apply.integration.test.js +436 -0
- package/dist/src/integration-tests/compression-settings-apply.integration.test.js.map +1 -0
- package/dist/src/integration-tests/ephemeral-settings.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/ephemeral-settings.integration.test.js +290 -0
- package/dist/src/integration-tests/ephemeral-settings.integration.test.js.map +1 -0
- package/dist/src/integration-tests/model-params-isolation.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/model-params-isolation.integration.test.js +564 -0
- package/dist/src/integration-tests/model-params-isolation.integration.test.js.map +1 -0
- package/dist/src/integration-tests/modelParams.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/modelParams.integration.test.js +784 -0
- package/dist/src/integration-tests/modelParams.integration.test.js.map +1 -0
- package/dist/src/integration-tests/profile-keyfile.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/profile-keyfile.integration.test.js +429 -0
- package/dist/src/integration-tests/profile-keyfile.integration.test.js.map +1 -0
- package/dist/src/integration-tests/profile-system.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/profile-system.integration.test.js +364 -0
- package/dist/src/integration-tests/profile-system.integration.test.js.map +1 -0
- package/dist/src/integration-tests/provider-switching.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/provider-switching.integration.test.js +207 -0
- package/dist/src/integration-tests/provider-switching.integration.test.js.map +1 -0
- package/dist/src/integration-tests/security.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/security.integration.test.js +319 -0
- package/dist/src/integration-tests/security.integration.test.js.map +1 -0
- package/dist/src/integration-tests/test-utils.test.d.ts +6 -0
- package/dist/src/integration-tests/test-utils.test.js +221 -0
- package/dist/src/integration-tests/test-utils.test.js.map +1 -0
- package/dist/src/integration-tests/todo-continuation.integration.test.d.ts +6 -0
- package/dist/src/integration-tests/todo-continuation.integration.test.js +559 -0
- package/dist/src/integration-tests/todo-continuation.integration.test.js.map +1 -0
- package/dist/src/providers/logging/LoggingProviderWrapper.test.d.ts +6 -0
- package/dist/src/providers/logging/LoggingProviderWrapper.test.js +305 -0
- package/dist/src/providers/logging/LoggingProviderWrapper.test.js.map +1 -0
- package/dist/src/providers/logging/git-stats.integration.test.d.ts +6 -0
- package/dist/src/providers/logging/git-stats.integration.test.js +245 -0
- package/dist/src/providers/logging/git-stats.integration.test.js.map +1 -0
- package/dist/src/providers/logging/git-stats.test.d.ts +6 -0
- package/dist/src/providers/logging/git-stats.test.js +432 -0
- package/dist/src/providers/logging/git-stats.test.js.map +1 -0
- package/dist/src/providers/logging/multi-provider-logging.integration.test.d.ts +6 -0
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js +531 -0
- package/dist/src/providers/logging/multi-provider-logging.integration.test.js.map +1 -0
- package/dist/src/providers/logging/performance.test.d.ts +6 -0
- package/dist/src/providers/logging/performance.test.js +465 -0
- package/dist/src/providers/logging/performance.test.js.map +1 -0
- package/dist/src/providers/provider-gemini-switching.test.d.ts +6 -0
- package/dist/src/providers/provider-gemini-switching.test.js +129 -0
- package/dist/src/providers/provider-gemini-switching.test.js.map +1 -0
- package/dist/src/providers/provider-switching.integration.test.d.ts +6 -0
- package/dist/src/providers/provider-switching.integration.test.js +113 -0
- package/dist/src/providers/provider-switching.integration.test.js.map +1 -0
- package/dist/src/providers/providerManagerInstance.test.d.ts +6 -0
- package/dist/src/providers/providerManagerInstance.test.js +104 -0
- package/dist/src/providers/providerManagerInstance.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
- package/dist/src/services/BuiltinCommandLoader.test.js +118 -0
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
- package/dist/src/services/CommandService.test.d.ts +6 -0
- package/dist/src/services/CommandService.test.js +232 -0
- package/dist/src/services/CommandService.test.js.map +1 -0
- package/dist/src/storage/ConversationStorage.test.d.ts +6 -0
- package/dist/src/storage/ConversationStorage.test.js +379 -0
- package/dist/src/storage/ConversationStorage.test.js.map +1 -0
- package/dist/src/test-utils/customMatchers.d.ts +14 -0
- package/dist/src/test-utils/customMatchers.js +46 -0
- package/dist/src/test-utils/customMatchers.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
- package/dist/src/test-utils/mockCommandContext.js +86 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
- package/dist/src/test-utils/mockCommandContext.test.js +51 -0
- package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
- package/dist/src/test-utils/responsive-testing.d.ts +14 -0
- package/dist/src/test-utils/responsive-testing.js +35 -0
- package/dist/src/test-utils/responsive-testing.js.map +1 -0
- package/dist/src/test-utils/responsive-testing.test.d.ts +6 -0
- package/dist/src/test-utils/responsive-testing.test.js +89 -0
- package/dist/src/test-utils/responsive-testing.test.js.map +1 -0
- package/dist/src/test-utils/testProviderConfig.d.ts +18 -0
- package/dist/src/test-utils/testProviderConfig.js +19 -0
- package/dist/src/test-utils/testProviderConfig.js.map +1 -0
- package/dist/src/ui/App.js +1 -1
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.js +1 -1
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +8 -6
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/diagnosticsCommand.js +0 -1
- package/dist/src/ui/commands/diagnosticsCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.js +5 -5
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/keyCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/keyCommand.test.js +128 -0
- package/dist/src/ui/commands/keyCommand.test.js.map +1 -0
- package/dist/src/ui/commands/profileCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/profileCommand.test.js +343 -0
- package/dist/src/ui/commands/profileCommand.test.js.map +1 -0
- package/dist/src/ui/commands/setCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/setCommand.test.js +431 -0
- package/dist/src/ui/commands/setCommand.test.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js +69 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
- package/dist/src/ui/commands/toolformatCommand.test.d.ts +1 -0
- package/dist/src/ui/commands/toolformatCommand.test.js +145 -0
- package/dist/src/ui/commands/toolformatCommand.test.js.map +1 -0
- package/dist/src/ui/components/AuthDialog.js +1 -1
- package/dist/src/ui/components/AuthDialog.js.map +1 -1
- package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
- package/dist/src/ui/components/AuthDialog.test.js +252 -0
- package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
- package/dist/src/ui/components/ContextIndicator.ui.test.d.ts +1 -0
- package/dist/src/ui/components/ContextIndicator.ui.test.js +89 -0
- package/dist/src/ui/components/ContextIndicator.ui.test.js.map +1 -0
- package/dist/src/ui/components/ContextSummaryDisplay.js +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.semantic.test.d.ts +6 -0
- package/dist/src/ui/components/ContextUsageDisplay.semantic.test.js +75 -0
- package/dist/src/ui/components/ContextUsageDisplay.semantic.test.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
- package/dist/src/ui/components/FolderTrustDialog.test.js +26 -0
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
- package/dist/src/ui/components/Footer.d.ts +1 -0
- package/dist/src/ui/components/Footer.js +2 -2
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.responsive.test.d.ts +6 -0
- package/dist/src/ui/components/Footer.responsive.test.js +262 -0
- package/dist/src/ui/components/Footer.responsive.test.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js +92 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.paste.test.d.ts +6 -0
- package/dist/src/ui/components/InputPrompt.paste.test.js +263 -0
- package/dist/src/ui/components/InputPrompt.paste.test.js.map +1 -0
- package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
- package/dist/src/ui/components/LoadingIndicator.test.js +149 -0
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.d.ts +6 -0
- package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.js +127 -0
- package/dist/src/ui/components/MemoryUsageDisplay.semantic.test.js.map +1 -0
- package/dist/src/ui/components/ProviderDialog.responsive.test.d.ts +6 -0
- package/dist/src/ui/components/ProviderDialog.responsive.test.js +153 -0
- package/dist/src/ui/components/ProviderDialog.responsive.test.js.map +1 -0
- package/dist/src/ui/components/ProviderModelDialog.responsive.test.d.ts +6 -0
- package/dist/src/ui/components/ProviderModelDialog.responsive.test.js +252 -0
- package/dist/src/ui/components/ProviderModelDialog.responsive.test.js.map +1 -0
- package/dist/src/ui/components/ProviderModelDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ProviderModelDialog.test.js +197 -0
- package/dist/src/ui/components/ProviderModelDialog.test.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
- package/dist/src/ui/components/SettingsDialog.test.js +555 -0
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.js +40 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
- package/dist/src/ui/components/TodoPanel.responsive.test.d.ts +6 -0
- package/dist/src/ui/components/TodoPanel.responsive.test.js +221 -0
- package/dist/src/ui/components/TodoPanel.responsive.test.js.map +1 -0
- package/dist/src/ui/components/TodoPanel.semantic.test.d.ts +6 -0
- package/dist/src/ui/components/TodoPanel.semantic.test.js +137 -0
- package/dist/src/ui/components/TodoPanel.semantic.test.js.map +1 -0
- package/dist/src/ui/components/__tests__/LayoutManager.test.d.ts +6 -0
- package/dist/src/ui/components/__tests__/LayoutManager.test.js +94 -0
- package/dist/src/ui/components/__tests__/LayoutManager.test.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +9 -7
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +13 -4
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js +172 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.responsive.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js +118 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +112 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
- package/dist/src/ui/containers/SessionController.test.d.ts +6 -0
- package/dist/src/ui/containers/SessionController.test.js +440 -0
- package/dist/src/ui/containers/SessionController.test.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.js +830 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +328 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +191 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
- package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
- package/dist/src/ui/hooks/useEditorSettings.test.js +221 -0
- package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.integration.test.d.ts +6 -0
- package/dist/src/ui/hooks/useGeminiStream.integration.test.js +800 -0
- package/dist/src/ui/hooks/useGeminiStream.integration.test.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.js +12 -47
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
- package/dist/src/ui/hooks/useGitBranchName.test.js +170 -0
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
- package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
- package/dist/src/ui/hooks/useHistoryManager.test.js +171 -0
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
- package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
- package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
- package/dist/src/ui/hooks/useKeypress.test.d.ts +6 -0
- package/dist/src/ui/hooks/useKeypress.test.js +171 -0
- package/dist/src/ui/hooks/useKeypress.test.js.map +1 -0
- package/dist/src/ui/hooks/useResponsive.test.d.ts +6 -0
- package/dist/src/ui/hooks/useResponsive.test.js +124 -0
- package/dist/src/ui/hooks/useResponsive.test.js.map +1 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
- package/dist/src/ui/hooks/useShellHistory.test.js +162 -0
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.js +929 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useStableCallback.test.d.ts +6 -0
- package/dist/src/ui/hooks/useStableCallback.test.js +57 -0
- package/dist/src/ui/hooks/useStableCallback.test.js.map +1 -0
- package/dist/src/ui/keyMatchers.test.d.ts +6 -0
- package/dist/src/ui/keyMatchers.test.js +276 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -0
- package/dist/src/ui/reducers/appReducer.test.d.ts +6 -0
- package/dist/src/ui/reducers/appReducer.test.js +519 -0
- package/dist/src/ui/reducers/appReducer.test.js.map +1 -0
- package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
- package/dist/src/ui/themes/color-utils.test.js +197 -0
- package/dist/src/ui/themes/color-utils.test.js.map +1 -0
- package/dist/src/ui/themes/semantic-resolver.test.d.ts +6 -0
- package/dist/src/ui/themes/semantic-resolver.test.js +210 -0
- package/dist/src/ui/themes/semantic-resolver.test.js.map +1 -0
- package/dist/src/ui/themes/semantic-tokens.test.d.ts +6 -0
- package/dist/src/ui/themes/semantic-tokens.test.js +272 -0
- package/dist/src/ui/themes/semantic-tokens.test.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
- package/dist/src/ui/themes/theme-manager.test.js +151 -0
- package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js +151 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
- package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/clipboardUtils.test.js +65 -0
- package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
- package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/commandUtils.test.js +294 -0
- package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
- package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/displayUtils.test.js +42 -0
- package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
- package/dist/src/ui/utils/formatters.test.d.ts +6 -0
- package/dist/src/ui/utils/formatters.test.js +56 -0
- package/dist/src/ui/utils/formatters.test.js.map +1 -0
- package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
- package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
- package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
- package/dist/src/ui/utils/responsive.test.d.ts +6 -0
- package/dist/src/ui/utils/responsive.test.js +107 -0
- package/dist/src/ui/utils/responsive.test.js.map +1 -0
- package/dist/src/ui/utils/secureInputHandler.test.d.ts +6 -0
- package/dist/src/ui/utils/secureInputHandler.test.js +274 -0
- package/dist/src/ui/utils/secureInputHandler.test.js.map +1 -0
- package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
- package/dist/src/ui/utils/updateCheck.test.js +202 -0
- package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
- package/dist/src/utils/ConversationContext.test.d.ts +6 -0
- package/dist/src/utils/ConversationContext.test.js +64 -0
- package/dist/src/utils/ConversationContext.test.js.map +1 -0
- package/dist/src/utils/gitUtils.test.d.ts +6 -0
- package/dist/src/utils/gitUtils.test.js +113 -0
- package/dist/src/utils/gitUtils.test.js.map +1 -0
- package/dist/src/utils/installationInfo.test.d.ts +6 -0
- package/dist/src/utils/installationInfo.test.js +242 -0
- package/dist/src/utils/installationInfo.test.js.map +1 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.test.d.ts +6 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.test.js +463 -0
- package/dist/src/utils/privacy/ConversationDataRedactor.test.js.map +1 -0
- package/dist/src/utils/readStdin.js +10 -0
- package/dist/src/utils/readStdin.js.map +1 -1
- package/dist/src/utils/sandbox.js +2 -2
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/settingsUtils.test.d.ts +6 -0
- package/dist/src/utils/settingsUtils.test.js +514 -0
- package/dist/src/utils/settingsUtils.test.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.js +2 -2
- package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
- package/dist/src/utils/userStartupWarnings.test.js +67 -0
- package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
@@ -0,0 +1,559 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
7
|
+
import { Config, GeminiClient, TodoStore, ApprovalMode, todoEvents, } from '@vybestack/llxprt-code-core';
|
8
|
+
import { createTempDirectory, cleanupTempDirectory } from './test-utils.js';
|
9
|
+
/**
|
10
|
+
* Todo Continuation Integration Tests
|
11
|
+
*
|
12
|
+
* These tests validate end-to-end functionality of the todo continuation feature
|
13
|
+
* by testing the real components and their interactions without mocking core functionality.
|
14
|
+
*/
|
15
|
+
describe('Todo Continuation Integration Tests', () => {
|
16
|
+
let tempDir;
|
17
|
+
let config;
|
18
|
+
let geminiClient;
|
19
|
+
let todoStore;
|
20
|
+
let sessionId;
|
21
|
+
let originalHome;
|
22
|
+
const createTodo = (id, content, status = 'pending') => ({
|
23
|
+
id,
|
24
|
+
content,
|
25
|
+
status,
|
26
|
+
priority: 'medium',
|
27
|
+
});
|
28
|
+
beforeEach(async () => {
|
29
|
+
originalHome = process.env.HOME;
|
30
|
+
tempDir = await createTempDirectory();
|
31
|
+
process.env.HOME = tempDir;
|
32
|
+
sessionId = 'integration-test-session';
|
33
|
+
todoStore = new TodoStore(sessionId);
|
34
|
+
config = new Config({
|
35
|
+
sessionId,
|
36
|
+
targetDir: tempDir,
|
37
|
+
debugMode: false,
|
38
|
+
model: 'gemini-2.0-flash-exp',
|
39
|
+
cwd: tempDir,
|
40
|
+
});
|
41
|
+
await config.initialize();
|
42
|
+
geminiClient = new GeminiClient(config);
|
43
|
+
});
|
44
|
+
afterEach(async () => {
|
45
|
+
if (originalHome !== undefined) {
|
46
|
+
process.env.HOME = originalHome;
|
47
|
+
}
|
48
|
+
else {
|
49
|
+
delete process.env.HOME;
|
50
|
+
}
|
51
|
+
await cleanupTempDirectory(tempDir);
|
52
|
+
});
|
53
|
+
describe('Configuration Persistence', () => {
|
54
|
+
it('@requirement REQ-004 should persist todo-continuation setting in Config', async () => {
|
55
|
+
// Given: Initially no setting
|
56
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBeUndefined();
|
57
|
+
// When: Set todo-continuation to true
|
58
|
+
config.setEphemeralSetting('todo-continuation', true);
|
59
|
+
// Then: Setting should be persisted
|
60
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBe(true);
|
61
|
+
// When: Set to false
|
62
|
+
config.setEphemeralSetting('todo-continuation', false);
|
63
|
+
// Then: Setting should be updated
|
64
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBe(false);
|
65
|
+
// When: Remove setting
|
66
|
+
config.setEphemeralSetting('todo-continuation', undefined);
|
67
|
+
// Then: Setting should be undefined
|
68
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBeUndefined();
|
69
|
+
});
|
70
|
+
it('@requirement REQ-004 should not persist across Config instances by default', async () => {
|
71
|
+
// Given: Set setting in first instance
|
72
|
+
config.setEphemeralSetting('todo-continuation', true);
|
73
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBe(true);
|
74
|
+
// When: Create new Config instance
|
75
|
+
const newConfig = new Config({
|
76
|
+
sessionId: 'new-session',
|
77
|
+
targetDir: tempDir,
|
78
|
+
debugMode: false,
|
79
|
+
model: 'gemini-2.0-flash-exp',
|
80
|
+
cwd: tempDir,
|
81
|
+
});
|
82
|
+
await newConfig.initialize();
|
83
|
+
// Then: Setting should not be persisted
|
84
|
+
expect(newConfig.getEphemeralSetting('todo-continuation')).toBeUndefined();
|
85
|
+
});
|
86
|
+
it('@requirement REQ-004 should handle all ephemeral setting data types', async () => {
|
87
|
+
// Given: Various data types for configuration
|
88
|
+
const testCases = [
|
89
|
+
{ key: 'bool-true', value: true },
|
90
|
+
{ key: 'bool-false', value: false },
|
91
|
+
{ key: 'string', value: 'test-string' },
|
92
|
+
{ key: 'number', value: 42 },
|
93
|
+
{ key: 'null', value: null },
|
94
|
+
{ key: 'object', value: { nested: 'value' } },
|
95
|
+
{ key: 'array', value: ['item1', 'item2'] },
|
96
|
+
];
|
97
|
+
for (const testCase of testCases) {
|
98
|
+
// When: Set various types
|
99
|
+
config.setEphemeralSetting(testCase.key, testCase.value);
|
100
|
+
// Then: Should retrieve correctly
|
101
|
+
expect(config.getEphemeralSetting(testCase.key)).toEqual(testCase.value);
|
102
|
+
}
|
103
|
+
});
|
104
|
+
});
|
105
|
+
describe('TodoStore Integration', () => {
|
106
|
+
it('@requirement REQ-001 should read and write todos through TodoStore', async () => {
|
107
|
+
// Given: Create todos
|
108
|
+
const todos = [
|
109
|
+
createTodo('1', 'Complete feature implementation', 'in_progress'),
|
110
|
+
createTodo('2', 'Write comprehensive tests', 'pending'),
|
111
|
+
createTodo('3', 'Update documentation', 'completed'),
|
112
|
+
];
|
113
|
+
// When: Write todos to store
|
114
|
+
await todoStore.writeTodos(todos);
|
115
|
+
// Then: Should be able to read back
|
116
|
+
const storedTodos = await todoStore.readTodos();
|
117
|
+
expect(storedTodos).toHaveLength(3);
|
118
|
+
expect(storedTodos[0].content).toBe('Complete feature implementation');
|
119
|
+
expect(storedTodos[0].status).toBe('in_progress');
|
120
|
+
expect(storedTodos[1].status).toBe('pending');
|
121
|
+
expect(storedTodos[2].status).toBe('completed');
|
122
|
+
});
|
123
|
+
it('@requirement REQ-001 should handle empty todo lists', async () => {
|
124
|
+
// Given: Empty todo list
|
125
|
+
const todos = [];
|
126
|
+
// When: Write empty list
|
127
|
+
await todoStore.writeTodos(todos);
|
128
|
+
// Then: Should read back empty list
|
129
|
+
const storedTodos = await todoStore.readTodos();
|
130
|
+
expect(storedTodos).toHaveLength(0);
|
131
|
+
});
|
132
|
+
it('@requirement REQ-001 should update existing todos', async () => {
|
133
|
+
// Given: Initial todos
|
134
|
+
const initialTodos = [createTodo('1', 'Initial task', 'pending')];
|
135
|
+
await todoStore.writeTodos(initialTodos);
|
136
|
+
// When: Update todo status
|
137
|
+
const updatedTodos = [
|
138
|
+
createTodo('1', 'Initial task', 'completed'),
|
139
|
+
createTodo('2', 'New task', 'in_progress'),
|
140
|
+
];
|
141
|
+
await todoStore.writeTodos(updatedTodos);
|
142
|
+
// Then: Should reflect updates
|
143
|
+
const storedTodos = await todoStore.readTodos();
|
144
|
+
expect(storedTodos).toHaveLength(2);
|
145
|
+
expect(storedTodos[0].status).toBe('completed');
|
146
|
+
expect(storedTodos[1].content).toBe('New task');
|
147
|
+
expect(storedTodos[1].status).toBe('in_progress');
|
148
|
+
});
|
149
|
+
it('@requirement REQ-001 should isolate todos by session ID', async () => {
|
150
|
+
// Given: Multiple sessions
|
151
|
+
const session1Id = 'session-1';
|
152
|
+
const session2Id = 'session-2';
|
153
|
+
const store1 = new TodoStore(session1Id);
|
154
|
+
const store2 = new TodoStore(session2Id);
|
155
|
+
const todos1 = [createTodo('1', 'Session 1 task', 'in_progress')];
|
156
|
+
const todos2 = [createTodo('1', 'Session 2 task', 'pending')];
|
157
|
+
// When: Write different todos to each session
|
158
|
+
await store1.writeTodos(todos1);
|
159
|
+
await store2.writeTodos(todos2);
|
160
|
+
// Then: Each session should have its own todos
|
161
|
+
const stored1 = await store1.readTodos();
|
162
|
+
const stored2 = await store2.readTodos();
|
163
|
+
expect(stored1).toHaveLength(1);
|
164
|
+
expect(stored2).toHaveLength(1);
|
165
|
+
expect(stored1[0].content).toBe('Session 1 task');
|
166
|
+
expect(stored2[0].content).toBe('Session 2 task');
|
167
|
+
expect(stored1[0].status).toBe('in_progress');
|
168
|
+
expect(stored2[0].status).toBe('pending');
|
169
|
+
});
|
170
|
+
});
|
171
|
+
describe('GeminiClient Integration', () => {
|
172
|
+
it('@requirement REQ-002 should create GeminiClient with correct configuration', async () => {
|
173
|
+
// Given: GeminiClient instance
|
174
|
+
expect(geminiClient).toBeDefined();
|
175
|
+
expect(typeof geminiClient.sendMessageStream).toBe('function');
|
176
|
+
});
|
177
|
+
it('@requirement REQ-002 should support ephemeral messaging interface', async () => {
|
178
|
+
// Given: Mock the sendMessageStream to capture calls
|
179
|
+
let capturedMessage = '';
|
180
|
+
let capturedOptions = null;
|
181
|
+
const originalSendMessageStream = geminiClient.sendMessageStream;
|
182
|
+
geminiClient.sendMessageStream = vi.fn(async function* (request, signal, prompt_id, turns, originalModel) {
|
183
|
+
capturedMessage =
|
184
|
+
typeof request === 'string' ? request : JSON.stringify(request);
|
185
|
+
capturedOptions = { signal, prompt_id, turns, originalModel };
|
186
|
+
// Yield a mock stream event
|
187
|
+
yield {
|
188
|
+
type: 'content',
|
189
|
+
value: 'test',
|
190
|
+
};
|
191
|
+
// Create a mock Turn object
|
192
|
+
const mockTurn = {};
|
193
|
+
return mockTurn;
|
194
|
+
});
|
195
|
+
// When: Send ephemeral message
|
196
|
+
const generator = geminiClient.sendMessageStream('Test continuation prompt', new AbortController().signal, 'test-prompt-id');
|
197
|
+
await generator.next();
|
198
|
+
// Then: Should capture message and options
|
199
|
+
expect(capturedMessage).toBe('Test continuation prompt');
|
200
|
+
expect(capturedOptions).toEqual({
|
201
|
+
signal: expect.any(AbortSignal),
|
202
|
+
prompt_id: 'test-prompt-id',
|
203
|
+
turns: undefined,
|
204
|
+
originalModel: undefined,
|
205
|
+
});
|
206
|
+
// Restore original method
|
207
|
+
geminiClient.sendMessageStream = originalSendMessageStream;
|
208
|
+
});
|
209
|
+
it('@requirement REQ-002 should handle YOLO vs DEFAULT approval modes', async () => {
|
210
|
+
// Given: Test different approval modes
|
211
|
+
const yoloConfig = new Config({
|
212
|
+
sessionId: 'yolo-session',
|
213
|
+
targetDir: tempDir,
|
214
|
+
debugMode: false,
|
215
|
+
model: 'gemini-2.0-flash-exp',
|
216
|
+
cwd: tempDir,
|
217
|
+
});
|
218
|
+
await yoloConfig.initialize();
|
219
|
+
// When: Set YOLO mode
|
220
|
+
yoloConfig.setApprovalMode(ApprovalMode.YOLO);
|
221
|
+
// Then: Should reflect mode change
|
222
|
+
expect(yoloConfig.getApprovalMode()).toBe(ApprovalMode.YOLO);
|
223
|
+
// When: Set DEFAULT mode
|
224
|
+
config.setApprovalMode(ApprovalMode.DEFAULT);
|
225
|
+
// Then: Should reflect mode change
|
226
|
+
expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
|
227
|
+
});
|
228
|
+
});
|
229
|
+
describe('Todo Events Integration', () => {
|
230
|
+
it('@requirement REQ-003 should emit and handle todo update events', async () => {
|
231
|
+
// Given: Setup event listener
|
232
|
+
let receivedEvent = null;
|
233
|
+
const eventHandler = (eventData) => {
|
234
|
+
receivedEvent = eventData;
|
235
|
+
};
|
236
|
+
todoEvents.onTodoUpdated(eventHandler);
|
237
|
+
// When: Emit todo update event
|
238
|
+
const testTodos = [createTodo('1', 'Event test task', 'in_progress')];
|
239
|
+
todoEvents.emitTodoUpdated({
|
240
|
+
sessionId,
|
241
|
+
todos: testTodos,
|
242
|
+
timestamp: new Date(),
|
243
|
+
});
|
244
|
+
// Then: Event should be received
|
245
|
+
expect(receivedEvent).toBeDefined();
|
246
|
+
expect(receivedEvent).not.toBeNull();
|
247
|
+
const event = receivedEvent;
|
248
|
+
expect(event.sessionId).toBe(sessionId);
|
249
|
+
expect(event.todos).toHaveLength(1);
|
250
|
+
expect(event.todos[0].content).toBe('Event test task');
|
251
|
+
// Cleanup
|
252
|
+
todoEvents.offTodoUpdated(eventHandler);
|
253
|
+
});
|
254
|
+
it('@requirement REQ-003 should handle multiple event listeners', async () => {
|
255
|
+
// Given: Multiple event listeners
|
256
|
+
const receivedEvents = [];
|
257
|
+
const handler1 = (eventData) => {
|
258
|
+
receivedEvents.push({ handler: 1, data: eventData });
|
259
|
+
};
|
260
|
+
const handler2 = (eventData) => {
|
261
|
+
receivedEvents.push({ handler: 2, data: eventData });
|
262
|
+
};
|
263
|
+
todoEvents.onTodoUpdated(handler1);
|
264
|
+
todoEvents.onTodoUpdated(handler2);
|
265
|
+
// When: Emit event
|
266
|
+
const testTodos = [createTodo('1', 'Multi-handler test', 'pending')];
|
267
|
+
todoEvents.emitTodoUpdated({
|
268
|
+
sessionId,
|
269
|
+
todos: testTodos,
|
270
|
+
timestamp: new Date(),
|
271
|
+
});
|
272
|
+
// Then: All handlers should receive event
|
273
|
+
expect(receivedEvents).toHaveLength(2);
|
274
|
+
expect(receivedEvents[0].handler).toBe(1);
|
275
|
+
expect(receivedEvents[1].handler).toBe(2);
|
276
|
+
expect(receivedEvents[0].data.todos[0].content).toBe('Multi-handler test');
|
277
|
+
expect(receivedEvents[1].data.todos[0].content).toBe('Multi-handler test');
|
278
|
+
// Cleanup
|
279
|
+
todoEvents.offTodoUpdated(handler1);
|
280
|
+
todoEvents.offTodoUpdated(handler2);
|
281
|
+
});
|
282
|
+
it('@requirement REQ-003 should properly unregister event listeners', async () => {
|
283
|
+
// Given: Event listener
|
284
|
+
let eventCount = 0;
|
285
|
+
const handler = () => {
|
286
|
+
eventCount++;
|
287
|
+
};
|
288
|
+
todoEvents.onTodoUpdated(handler);
|
289
|
+
// When: Emit event
|
290
|
+
todoEvents.emitTodoUpdated({
|
291
|
+
sessionId,
|
292
|
+
todos: [createTodo('1', 'Test', 'pending')],
|
293
|
+
timestamp: new Date(),
|
294
|
+
});
|
295
|
+
expect(eventCount).toBe(1);
|
296
|
+
// When: Unregister and emit again
|
297
|
+
todoEvents.offTodoUpdated(handler);
|
298
|
+
todoEvents.emitTodoUpdated({
|
299
|
+
sessionId,
|
300
|
+
todos: [createTodo('2', 'Test 2', 'pending')],
|
301
|
+
timestamp: new Date(),
|
302
|
+
});
|
303
|
+
// Then: Handler should not be called again
|
304
|
+
expect(eventCount).toBe(1);
|
305
|
+
});
|
306
|
+
});
|
307
|
+
describe('Real Component Data Flow', () => {
|
308
|
+
it('@requirement REQ-001, REQ-002, REQ-003, REQ-004 should demonstrate end-to-end data flow', async () => {
|
309
|
+
// Given: Enable todo continuation
|
310
|
+
config.setEphemeralSetting('todo-continuation', true);
|
311
|
+
expect(config.getEphemeralSetting('todo-continuation')).toBe(true);
|
312
|
+
// Create active todos through real TodoStore
|
313
|
+
const todos = [
|
314
|
+
createTodo('1', 'Implement authentication', 'in_progress'),
|
315
|
+
createTodo('2', 'Write integration tests', 'pending'),
|
316
|
+
createTodo('3', 'Update user guide', 'completed'),
|
317
|
+
];
|
318
|
+
await todoStore.writeTodos(todos);
|
319
|
+
// Verify storage worked
|
320
|
+
const storedTodos = await todoStore.readTodos();
|
321
|
+
expect(storedTodos).toHaveLength(3);
|
322
|
+
// Filter for active todos (simulating continuation logic)
|
323
|
+
const activeTodos = storedTodos.filter((todo) => todo.status === 'in_progress' || todo.status === 'pending');
|
324
|
+
expect(activeTodos).toHaveLength(2);
|
325
|
+
// Prioritize in_progress todos (simulating continuation prioritization)
|
326
|
+
const inProgressTodos = activeTodos.filter((todo) => todo.status === 'in_progress');
|
327
|
+
const pendingTodos = activeTodos.filter((todo) => todo.status === 'pending');
|
328
|
+
const prioritizedTodo = inProgressTodos.length > 0 ? inProgressTodos[0] : pendingTodos[0];
|
329
|
+
expect(prioritizedTodo.content).toBe('Implement authentication');
|
330
|
+
expect(prioritizedTodo.status).toBe('in_progress');
|
331
|
+
// Simulate continuation prompt generation
|
332
|
+
const isYoloMode = config.getApprovalMode() === ApprovalMode.YOLO;
|
333
|
+
const continuationPrompt = isYoloMode
|
334
|
+
? `Continue to proceed with the active task without waiting for confirmation: "${prioritizedTodo.content}"`
|
335
|
+
: `Please continue working on the following task: "${prioritizedTodo.content}"`;
|
336
|
+
expect(continuationPrompt).toContain('Implement authentication');
|
337
|
+
expect(continuationPrompt).toMatch(/please continue working/i);
|
338
|
+
// Test YOLO mode prompt
|
339
|
+
config.setApprovalMode(ApprovalMode.YOLO);
|
340
|
+
const yoloPrompt = config.getApprovalMode() === ApprovalMode.YOLO
|
341
|
+
? `Continue to proceed with the active task without waiting for confirmation: "${prioritizedTodo.content}"`
|
342
|
+
: `Please continue working on the following task: "${prioritizedTodo.content}"`;
|
343
|
+
expect(yoloPrompt).toMatch(/(continue|proceed).*without.*confirmation/i);
|
344
|
+
// Simulate todo pause functionality
|
345
|
+
const pauseResult = {
|
346
|
+
type: 'pause',
|
347
|
+
reason: 'User needs to review requirements',
|
348
|
+
message: 'Task paused: User needs to review requirements',
|
349
|
+
};
|
350
|
+
expect(pauseResult.type).toBe('pause');
|
351
|
+
expect(pauseResult.reason).toBe('User needs to review requirements');
|
352
|
+
expect(pauseResult.message).toContain('paused');
|
353
|
+
});
|
354
|
+
it('@requirement REQ-001, REQ-003 should handle todo state transitions through events', async () => {
|
355
|
+
// Given: Initial todos
|
356
|
+
const initialTodos = [
|
357
|
+
createTodo('1', 'Design database schema', 'pending'),
|
358
|
+
];
|
359
|
+
await todoStore.writeTodos(initialTodos);
|
360
|
+
// Setup event tracking
|
361
|
+
const events = [];
|
362
|
+
const eventHandler = (eventData) => {
|
363
|
+
events.push(eventData);
|
364
|
+
};
|
365
|
+
todoEvents.onTodoUpdated(eventHandler);
|
366
|
+
// When: Update todo status to in_progress
|
367
|
+
const updatedTodos = [
|
368
|
+
createTodo('1', 'Design database schema', 'in_progress'),
|
369
|
+
];
|
370
|
+
await todoStore.writeTodos(updatedTodos);
|
371
|
+
todoEvents.emitTodoUpdated({
|
372
|
+
sessionId,
|
373
|
+
todos: updatedTodos,
|
374
|
+
timestamp: new Date(),
|
375
|
+
});
|
376
|
+
// Then: Event should reflect state change
|
377
|
+
expect(events).toHaveLength(1);
|
378
|
+
expect(events[0].todos[0].status).toBe('in_progress');
|
379
|
+
// When: Complete the todo
|
380
|
+
const completedTodos = [
|
381
|
+
createTodo('1', 'Design database schema', 'completed'),
|
382
|
+
];
|
383
|
+
await todoStore.writeTodos(completedTodos);
|
384
|
+
todoEvents.emitTodoUpdated({
|
385
|
+
sessionId,
|
386
|
+
todos: completedTodos,
|
387
|
+
timestamp: new Date(),
|
388
|
+
});
|
389
|
+
// Then: Should have two events showing progression
|
390
|
+
expect(events).toHaveLength(2);
|
391
|
+
expect(events[1].todos[0].status).toBe('completed');
|
392
|
+
// Verify final state in storage
|
393
|
+
const finalTodos = await todoStore.readTodos();
|
394
|
+
expect(finalTodos[0].status).toBe('completed');
|
395
|
+
// Cleanup
|
396
|
+
todoEvents.offTodoUpdated(eventHandler);
|
397
|
+
});
|
398
|
+
it('@requirement REQ-002 should validate ephemeral settings persistence patterns', async () => {
|
399
|
+
// Given: Multiple configuration scenarios
|
400
|
+
const testSettings = [
|
401
|
+
{ key: 'todo-continuation', value: true },
|
402
|
+
{ key: 'context-limit', value: 150000 },
|
403
|
+
{ key: 'compression-threshold', value: 0.75 },
|
404
|
+
{ key: 'base-url', value: 'https://api.example.com' },
|
405
|
+
{ key: 'custom-headers', value: { 'X-Test': 'integration' } },
|
406
|
+
];
|
407
|
+
// When: Set all ephemeral settings
|
408
|
+
for (const setting of testSettings) {
|
409
|
+
config.setEphemeralSetting(setting.key, setting.value);
|
410
|
+
}
|
411
|
+
// Then: All should be retrievable
|
412
|
+
for (const setting of testSettings) {
|
413
|
+
expect(config.getEphemeralSetting(setting.key)).toEqual(setting.value);
|
414
|
+
}
|
415
|
+
// When: Get all settings at once
|
416
|
+
const allSettings = config.getEphemeralSettings();
|
417
|
+
// Then: Should contain all set values
|
418
|
+
expect(allSettings['todo-continuation']).toBe(true);
|
419
|
+
expect(allSettings['context-limit']).toBe(150000);
|
420
|
+
expect(allSettings['compression-threshold']).toBe(0.75);
|
421
|
+
expect(allSettings['base-url']).toBe('https://api.example.com');
|
422
|
+
expect(allSettings['custom-headers']).toEqual({
|
423
|
+
'X-Test': 'integration',
|
424
|
+
});
|
425
|
+
// When: Create new Config instance
|
426
|
+
const newConfig = new Config({
|
427
|
+
sessionId: 'ephemeral-test',
|
428
|
+
targetDir: tempDir,
|
429
|
+
debugMode: false,
|
430
|
+
model: 'gemini-2.0-flash-exp',
|
431
|
+
cwd: tempDir,
|
432
|
+
});
|
433
|
+
await newConfig.initialize();
|
434
|
+
// Then: New instance should have empty ephemeral settings
|
435
|
+
const newSettings = newConfig.getEphemeralSettings();
|
436
|
+
expect(Object.keys(newSettings)).toHaveLength(0);
|
437
|
+
});
|
438
|
+
it('@requirement REQ-004 should demonstrate configuration edge cases', async () => {
|
439
|
+
// Test undefined values
|
440
|
+
config.setEphemeralSetting('undefined-test', undefined);
|
441
|
+
expect(config.getEphemeralSetting('undefined-test')).toBeUndefined();
|
442
|
+
// Test null values
|
443
|
+
config.setEphemeralSetting('null-test', null);
|
444
|
+
expect(config.getEphemeralSetting('null-test')).toBeNull();
|
445
|
+
// Test empty string
|
446
|
+
config.setEphemeralSetting('empty-string', '');
|
447
|
+
expect(config.getEphemeralSetting('empty-string')).toBe('');
|
448
|
+
// Test zero
|
449
|
+
config.setEphemeralSetting('zero', 0);
|
450
|
+
expect(config.getEphemeralSetting('zero')).toBe(0);
|
451
|
+
// Test false
|
452
|
+
config.setEphemeralSetting('false', false);
|
453
|
+
expect(config.getEphemeralSetting('false')).toBe(false);
|
454
|
+
// Test overwriting values
|
455
|
+
config.setEphemeralSetting('overwrite-test', 'initial');
|
456
|
+
expect(config.getEphemeralSetting('overwrite-test')).toBe('initial');
|
457
|
+
config.setEphemeralSetting('overwrite-test', 'updated');
|
458
|
+
expect(config.getEphemeralSetting('overwrite-test')).toBe('updated');
|
459
|
+
});
|
460
|
+
it('@requirement REQ-001, REQ-002, REQ-003 should validate data and handle edge cases', async () => {
|
461
|
+
// Test valid todos with edge case content
|
462
|
+
const edgeCaseTodos = [
|
463
|
+
{
|
464
|
+
id: '1',
|
465
|
+
content: 'Valid todo',
|
466
|
+
status: 'pending',
|
467
|
+
priority: 'medium',
|
468
|
+
},
|
469
|
+
{
|
470
|
+
id: '2',
|
471
|
+
content: 'Todo with special chars: !@#$%^&*()',
|
472
|
+
status: 'in_progress',
|
473
|
+
priority: 'high',
|
474
|
+
},
|
475
|
+
{
|
476
|
+
id: '3',
|
477
|
+
content: 'Very long todo content that spans multiple lines and contains various characters',
|
478
|
+
status: 'completed',
|
479
|
+
priority: 'low',
|
480
|
+
},
|
481
|
+
];
|
482
|
+
// Should handle valid todos with edge cases
|
483
|
+
await todoStore.writeTodos(edgeCaseTodos);
|
484
|
+
const storedTodos = await todoStore.readTodos();
|
485
|
+
expect(storedTodos).toHaveLength(3);
|
486
|
+
expect(storedTodos[1].content).toContain('special chars');
|
487
|
+
// Test that TodoStore validates malformed todos (expected to throw)
|
488
|
+
const malformedTodos = [
|
489
|
+
{ id: '1', status: 'pending', priority: 'low' },
|
490
|
+
];
|
491
|
+
// TodoStore should validate and throw for invalid data
|
492
|
+
await expect(async () => {
|
493
|
+
await todoStore.writeTodos(malformedTodos);
|
494
|
+
}).rejects.toThrow();
|
495
|
+
// Test graceful handling of various configuration values
|
496
|
+
expect(() => {
|
497
|
+
config.setEphemeralSetting('test-undefined', undefined);
|
498
|
+
config.setEphemeralSetting('test-null', null);
|
499
|
+
config.setEphemeralSetting('test-empty-string', '');
|
500
|
+
config.setEphemeralSetting('test-zero', 0);
|
501
|
+
config.setEphemeralSetting('test-false', false);
|
502
|
+
config.setEphemeralSetting('test-array', []);
|
503
|
+
config.setEphemeralSetting('test-object', {});
|
504
|
+
}).not.toThrow();
|
505
|
+
});
|
506
|
+
});
|
507
|
+
describe('Performance and Scale Testing', () => {
|
508
|
+
it('@requirement REQ-001 should handle large numbers of todos efficiently', async () => {
|
509
|
+
// Given: Large number of todos
|
510
|
+
const largeTodoSet = [];
|
511
|
+
for (let i = 0; i < 1000; i++) {
|
512
|
+
largeTodoSet.push(createTodo(`todo-${i}`, `Task number ${i}`, i % 3 === 0 ? 'completed' : i % 3 === 1 ? 'in_progress' : 'pending'));
|
513
|
+
}
|
514
|
+
const startTime = Date.now();
|
515
|
+
// When: Write large todo set
|
516
|
+
await todoStore.writeTodos(largeTodoSet);
|
517
|
+
// Then: Should complete in reasonable time
|
518
|
+
const writeTime = Date.now() - startTime;
|
519
|
+
expect(writeTime).toBeLessThan(5000); // Should complete within 5 seconds
|
520
|
+
// When: Read back large todo set
|
521
|
+
const readStartTime = Date.now();
|
522
|
+
const storedTodos = await todoStore.readTodos();
|
523
|
+
const readTime = Date.now() - readStartTime;
|
524
|
+
// Then: Should read efficiently
|
525
|
+
expect(readTime).toBeLessThan(1000); // Should read within 1 second
|
526
|
+
expect(storedTodos).toHaveLength(1000);
|
527
|
+
// Verify data integrity
|
528
|
+
expect(storedTodos[0].content).toBe('Task number 0');
|
529
|
+
expect(storedTodos[999].content).toBe('Task number 999');
|
530
|
+
});
|
531
|
+
it('@requirement REQ-003 should handle rapid event emissions', async () => {
|
532
|
+
// Given: Event handler that tracks all events
|
533
|
+
const receivedEvents = [];
|
534
|
+
const eventHandler = (eventData) => {
|
535
|
+
receivedEvents.push(eventData);
|
536
|
+
};
|
537
|
+
todoEvents.onTodoUpdated(eventHandler);
|
538
|
+
// When: Emit many events rapidly
|
539
|
+
const eventCount = 100;
|
540
|
+
const startTime = Date.now();
|
541
|
+
for (let i = 0; i < eventCount; i++) {
|
542
|
+
todoEvents.emitTodoUpdated({
|
543
|
+
sessionId: `rapid-test-${i}`,
|
544
|
+
todos: [createTodo(`${i}`, `Rapid event ${i}`, 'pending')],
|
545
|
+
timestamp: new Date(),
|
546
|
+
});
|
547
|
+
}
|
548
|
+
// Give events time to process
|
549
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
550
|
+
const processTime = Date.now() - startTime;
|
551
|
+
// Then: All events should be processed efficiently
|
552
|
+
expect(receivedEvents).toHaveLength(eventCount);
|
553
|
+
expect(processTime).toBeLessThan(1000); // Should process within 1 second
|
554
|
+
// Cleanup
|
555
|
+
todoEvents.offTodoUpdated(eventHandler);
|
556
|
+
});
|
557
|
+
});
|
558
|
+
});
|
559
|
+
//# sourceMappingURL=todo-continuation.integration.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"todo-continuation.integration.test.js","sourceRoot":"","sources":["../../../src/integration-tests/todo-continuation.integration.test.ts"],"names":[],"mappings":"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"}
|