@vybestack/llxprt-code 0.1.20 → 0.1.22
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/commands/mcp/add.js +11 -0
- package/dist/src/commands/mcp/add.js.map +1 -1
- 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 +3 -2
- package/dist/src/config/keyBindings.js.map +1 -1
- 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 +318 -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/nonInteractiveCli.js +2 -5
- package/dist/src/nonInteractiveCli.js.map +1 -1
- 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/services/FileCommandLoader.js +10 -8
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/prompt-processors/argumentProcessor.d.ts +2 -7
- package/dist/src/services/prompt-processors/argumentProcessor.js +2 -10
- package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.d.ts +16 -13
- package/dist/src/services/prompt-processors/shellProcessor.js +133 -40
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
- package/dist/src/services/prompt-processors/types.d.ts +2 -0
- package/dist/src/services/prompt-processors/types.js +2 -0
- package/dist/src/services/prompt-processors/types.js.map +1 -1
- 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/render.d.ts +8 -0
- package/dist/src/test-utils/render.js +10 -0
- package/dist/src/test-utils/render.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 +7 -6
- 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/colors.js +25 -2
- package/dist/src/ui/colors.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.js +3 -0
- package/dist/src/ui/commands/aboutCommand.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 +3 -3
- 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.js +41 -0
- package/dist/src/ui/commands/setCommand.js.map +1 -1
- 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/AboutBox.d.ts +1 -0
- package/dist/src/ui/components/AboutBox.js +1 -1
- package/dist/src/ui/components/AboutBox.js.map +1 -1
- 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.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js +93 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.js +0 -4
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- 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.js +2 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- 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 -3
- 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 +266 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
- package/dist/src/ui/components/messages/InfoMessage.js +2 -1
- package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +15 -5
- 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 +173 -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 +113 -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/contexts/KeypressContext.d.ts +30 -0
- package/dist/src/ui/contexts/KeypressContext.js +314 -0
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
- package/dist/src/ui/contexts/KeypressContext.test.js +220 -0
- package/dist/src/ui/contexts/KeypressContext.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/index.d.ts +1 -0
- package/dist/src/ui/hooks/index.js +1 -0
- package/dist/src/ui/hooks/index.js.map +1 -1
- 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/slashCommandProcessor.js +13 -7
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js +3 -5
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- 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.d.ts +4 -24
- package/dist/src/ui/hooks/useKeypress.js +9 -330
- package/dist/src/ui/hooks/useKeypress.js.map +1 -1
- package/dist/src/ui/hooks/useKeypress.test.d.ts +6 -0
- package/dist/src/ui/hooks/useKeypress.test.js +176 -0
- package/dist/src/ui/hooks/useKeypress.test.js.map +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.js +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- 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/hooks/useToolScheduler.test.d.ts +6 -0
- package/dist/src/ui/hooks/useToolScheduler.test.js +841 -0
- package/dist/src/ui/hooks/useToolScheduler.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.js +16 -7
- package/dist/src/ui/themes/semantic-resolver.js.map +1 -1
- package/dist/src/ui/themes/semantic-resolver.test.d.ts +6 -0
- package/dist/src/ui/themes/semantic-resolver.test.js +246 -0
- package/dist/src/ui/themes/semantic-resolver.test.js.map +1 -0
- package/dist/src/ui/themes/semantic-tokens.d.ts +18 -33
- package/dist/src/ui/themes/semantic-tokens.js +88 -1
- package/dist/src/ui/themes/semantic-tokens.js.map +1 -1
- package/dist/src/ui/themes/semantic-tokens.test.d.ts +6 -0
- package/dist/src/ui/themes/semantic-tokens.test.js +289 -0
- package/dist/src/ui/themes/semantic-tokens.test.js.map +1 -0
- package/dist/src/ui/themes/theme-compat.d.ts +1 -1
- package/dist/src/ui/themes/theme-compat.js +7 -2
- package/dist/src/ui/themes/theme-compat.js.map +1 -1
- package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
- package/dist/src/ui/themes/theme-manager.test.js +160 -0
- package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
- package/dist/src/ui/types.d.ts +12 -1
- package/dist/src/ui/types.js +1 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +8 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
- 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/platformConstants.d.ts +5 -0
- package/dist/src/ui/utils/platformConstants.js +5 -0
- package/dist/src/ui/utils/platformConstants.js.map +1 -1
- 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,531 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Vybestack LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
7
|
+
import { ContentGeneratorRole, } from '@vybestack/llxprt-code-core';
|
8
|
+
// Remove unused interface to fix TS6196 error
|
9
|
+
// Mock telemetry system
|
10
|
+
const telemetrySystem = {
|
11
|
+
logConversationRequest: vi.fn(),
|
12
|
+
logProviderSwitch: vi.fn(),
|
13
|
+
logConversationComplete: vi.fn(),
|
14
|
+
};
|
15
|
+
// Test helper functions
|
16
|
+
function createMockProvider(name, capabilities) {
|
17
|
+
const defaultCapabilities = { streaming: true, tools: true, ...capabilities };
|
18
|
+
return {
|
19
|
+
name,
|
20
|
+
getModels: vi.fn().mockResolvedValue([
|
21
|
+
{
|
22
|
+
id: `${name}-model-1`,
|
23
|
+
name: `${name.charAt(0).toUpperCase() + name.slice(1)} Model 1`,
|
24
|
+
},
|
25
|
+
]),
|
26
|
+
async *generateChatCompletion(_messages, _tools) {
|
27
|
+
// Simulate provider-specific response patterns
|
28
|
+
if (name === 'openai') {
|
29
|
+
yield {
|
30
|
+
content: 'OpenAI response chunk 1',
|
31
|
+
role: ContentGeneratorRole.ASSISTANT,
|
32
|
+
};
|
33
|
+
yield { content: ' chunk 2', role: ContentGeneratorRole.ASSISTANT };
|
34
|
+
}
|
35
|
+
else if (name === 'anthropic') {
|
36
|
+
yield {
|
37
|
+
content: 'Claude response: I understand your request.',
|
38
|
+
role: ContentGeneratorRole.ASSISTANT,
|
39
|
+
};
|
40
|
+
}
|
41
|
+
else if (name === 'gemini') {
|
42
|
+
yield {
|
43
|
+
content: 'Gemini response with reasoning...',
|
44
|
+
role: ContentGeneratorRole.ASSISTANT,
|
45
|
+
};
|
46
|
+
}
|
47
|
+
},
|
48
|
+
getServerTools: vi
|
49
|
+
.fn()
|
50
|
+
.mockReturnValue(defaultCapabilities.tools ? ['search', 'analyze'] : []),
|
51
|
+
invokeServerTool: vi
|
52
|
+
.fn()
|
53
|
+
.mockResolvedValue({ result: `Tool result from ${name}` }),
|
54
|
+
setModel: vi.fn(),
|
55
|
+
getCurrentModel: vi.fn().mockReturnValue(`${name}-model-1`),
|
56
|
+
getDefaultModel: vi.fn().mockReturnValue(`${name}-default`),
|
57
|
+
getToolFormat: vi
|
58
|
+
.fn()
|
59
|
+
.mockReturnValue(name === 'anthropic' ? 'xml' : 'json'),
|
60
|
+
};
|
61
|
+
}
|
62
|
+
async function consumeAsyncIterable(iterable) {
|
63
|
+
const results = [];
|
64
|
+
for await (const item of iterable) {
|
65
|
+
results.push(item);
|
66
|
+
}
|
67
|
+
return results;
|
68
|
+
}
|
69
|
+
// Mock implementations for testing
|
70
|
+
class MockProviderManager {
|
71
|
+
providers = new Map();
|
72
|
+
activeProvider = null;
|
73
|
+
registerProvider(provider) {
|
74
|
+
this.providers.set(provider.name, provider);
|
75
|
+
}
|
76
|
+
setActiveProvider(name) {
|
77
|
+
if (this.providers.has(name)) {
|
78
|
+
const oldProvider = this.activeProvider;
|
79
|
+
this.activeProvider = name;
|
80
|
+
if (oldProvider && oldProvider !== name) {
|
81
|
+
telemetrySystem.logProviderSwitch({
|
82
|
+
from_provider: oldProvider,
|
83
|
+
to_provider: name,
|
84
|
+
context_preserved: this.isContextCompatible(oldProvider, name),
|
85
|
+
timestamp: new Date().toISOString(),
|
86
|
+
});
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
getActiveProvider() {
|
91
|
+
return this.activeProvider
|
92
|
+
? this.providers.get(this.activeProvider) || null
|
93
|
+
: null;
|
94
|
+
}
|
95
|
+
getProviderNames() {
|
96
|
+
return Array.from(this.providers.keys());
|
97
|
+
}
|
98
|
+
isContextCompatible(from, to) {
|
99
|
+
// Simple heuristic for context compatibility
|
100
|
+
const compatiblePairs = new Set([
|
101
|
+
'openai-anthropic',
|
102
|
+
'anthropic-openai',
|
103
|
+
'gemini-openai',
|
104
|
+
'openai-gemini',
|
105
|
+
]);
|
106
|
+
return compatiblePairs.has(`${from}-${to}`);
|
107
|
+
}
|
108
|
+
}
|
109
|
+
class MockConversationDataRedactor {
|
110
|
+
redactMessage(message, _provider) {
|
111
|
+
return {
|
112
|
+
...message,
|
113
|
+
content: message.content.replace(/sk-[a-zA-Z0-9]{48}/g, '[REDACTED-API-KEY]'),
|
114
|
+
};
|
115
|
+
}
|
116
|
+
redactConversation(messages, provider) {
|
117
|
+
return messages.map((msg) => this.redactMessage(msg, provider));
|
118
|
+
}
|
119
|
+
}
|
120
|
+
class MockLoggingProviderWrapper {
|
121
|
+
provider;
|
122
|
+
redactor;
|
123
|
+
storage;
|
124
|
+
constructor(provider, _config, redactor, storage) {
|
125
|
+
this.provider = provider;
|
126
|
+
this.redactor = redactor;
|
127
|
+
this.storage = storage;
|
128
|
+
}
|
129
|
+
async *generateChatCompletion(messages, tools, toolFormat) {
|
130
|
+
const conversationId = `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
131
|
+
// Log conversation request
|
132
|
+
const redactedMessages = this.redactor.redactConversation(messages, this.provider.name);
|
133
|
+
const logEntry = {
|
134
|
+
timestamp: new Date().toISOString(),
|
135
|
+
conversation_id: conversationId,
|
136
|
+
provider_name: this.provider.name,
|
137
|
+
messages: redactedMessages,
|
138
|
+
};
|
139
|
+
await this.storage.writeConversationEntry(logEntry);
|
140
|
+
telemetrySystem.logConversationRequest({
|
141
|
+
conversation_id: conversationId,
|
142
|
+
provider_name: this.provider.name,
|
143
|
+
message_count: messages.length,
|
144
|
+
has_tools: Boolean(tools && tools.length > 0),
|
145
|
+
});
|
146
|
+
// Stream response from wrapped provider
|
147
|
+
const responseChunks = [];
|
148
|
+
for await (const chunk of this.provider.generateChatCompletion(messages, tools, toolFormat)) {
|
149
|
+
responseChunks.push(chunk);
|
150
|
+
yield chunk;
|
151
|
+
}
|
152
|
+
// Log completion
|
153
|
+
telemetrySystem.logConversationComplete({
|
154
|
+
conversation_id: conversationId,
|
155
|
+
provider_name: this.provider.name,
|
156
|
+
response_chunks: responseChunks.length,
|
157
|
+
});
|
158
|
+
}
|
159
|
+
getWrappedProvider() {
|
160
|
+
return this.provider;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
class MockConversationStorage {
|
164
|
+
entries = [];
|
165
|
+
async writeConversationEntry(entry) {
|
166
|
+
this.entries.push(entry);
|
167
|
+
}
|
168
|
+
async getLogFiles() {
|
169
|
+
return [
|
170
|
+
{
|
171
|
+
path: '/test/conversations.log',
|
172
|
+
size: this.entries.length * 1000, // Estimate
|
173
|
+
created: new Date(),
|
174
|
+
lastModified: new Date(),
|
175
|
+
},
|
176
|
+
];
|
177
|
+
}
|
178
|
+
getEntries() {
|
179
|
+
return this.entries;
|
180
|
+
}
|
181
|
+
}
|
182
|
+
function createConfigWithLogging(enabled) {
|
183
|
+
return {
|
184
|
+
getConversationLoggingEnabled: () => enabled,
|
185
|
+
};
|
186
|
+
}
|
187
|
+
describe('Multi-Provider Conversation Logging Integration', () => {
|
188
|
+
let providerManager;
|
189
|
+
let redactor;
|
190
|
+
let storage;
|
191
|
+
let config;
|
192
|
+
beforeEach(() => {
|
193
|
+
vi.clearAllMocks();
|
194
|
+
providerManager = new MockProviderManager();
|
195
|
+
redactor = new MockConversationDataRedactor();
|
196
|
+
storage = new MockConversationStorage();
|
197
|
+
config = createConfigWithLogging(true);
|
198
|
+
});
|
199
|
+
/**
|
200
|
+
* @requirement INTEGRATION-001: Cross-provider conversation logging
|
201
|
+
* @scenario Conversation spans multiple providers
|
202
|
+
* @given ProviderManager with OpenAI, Anthropic, and Gemini providers
|
203
|
+
* @when User switches between providers during conversation
|
204
|
+
* @then Each provider interaction is logged with correct context
|
205
|
+
* @and Provider switches are tracked with context preservation info
|
206
|
+
*/
|
207
|
+
it('should log conversations across multiple provider switches', async () => {
|
208
|
+
// Register providers
|
209
|
+
const openaiProvider = createMockProvider('openai');
|
210
|
+
const anthropicProvider = createMockProvider('anthropic');
|
211
|
+
const geminiProvider = createMockProvider('gemini');
|
212
|
+
providerManager.registerProvider(openaiProvider);
|
213
|
+
providerManager.registerProvider(anthropicProvider);
|
214
|
+
providerManager.registerProvider(geminiProvider);
|
215
|
+
// Wrap each provider with logging
|
216
|
+
const openaiWrapper = new MockLoggingProviderWrapper(openaiProvider, config, redactor, storage);
|
217
|
+
const anthropicWrapper = new MockLoggingProviderWrapper(anthropicProvider, config, redactor, storage);
|
218
|
+
const geminiWrapper = new MockLoggingProviderWrapper(geminiProvider, config, redactor, storage);
|
219
|
+
// Simulate conversation flow with provider switches
|
220
|
+
providerManager.setActiveProvider('openai');
|
221
|
+
await consumeAsyncIterable(openaiWrapper.generateChatCompletion([
|
222
|
+
{
|
223
|
+
role: ContentGeneratorRole.USER,
|
224
|
+
content: 'Explain quantum computing',
|
225
|
+
},
|
226
|
+
]));
|
227
|
+
providerManager.setActiveProvider('anthropic');
|
228
|
+
await consumeAsyncIterable(anthropicWrapper.generateChatCompletion([
|
229
|
+
{
|
230
|
+
role: ContentGeneratorRole.USER,
|
231
|
+
content: 'Continue the explanation with practical applications',
|
232
|
+
},
|
233
|
+
]));
|
234
|
+
providerManager.setActiveProvider('gemini');
|
235
|
+
await consumeAsyncIterable(geminiWrapper.generateChatCompletion([
|
236
|
+
{
|
237
|
+
role: ContentGeneratorRole.USER,
|
238
|
+
content: 'Summarize the key points',
|
239
|
+
},
|
240
|
+
]));
|
241
|
+
// Verify logging across providers
|
242
|
+
const entries = storage.getEntries();
|
243
|
+
expect(entries).toHaveLength(3);
|
244
|
+
expect(entries.map((e) => e.provider_name)).toEqual([
|
245
|
+
'openai',
|
246
|
+
'anthropic',
|
247
|
+
'gemini',
|
248
|
+
]);
|
249
|
+
// Verify provider switches were logged
|
250
|
+
expect(telemetrySystem.logProviderSwitch).toHaveBeenCalledTimes(2);
|
251
|
+
expect(telemetrySystem.logProviderSwitch).toHaveBeenCalledWith(expect.objectContaining({
|
252
|
+
from_provider: 'openai',
|
253
|
+
to_provider: 'anthropic',
|
254
|
+
}));
|
255
|
+
expect(telemetrySystem.logProviderSwitch).toHaveBeenCalledWith(expect.objectContaining({
|
256
|
+
from_provider: 'anthropic',
|
257
|
+
to_provider: 'gemini',
|
258
|
+
}));
|
259
|
+
});
|
260
|
+
/**
|
261
|
+
* @requirement INTEGRATION-002: Tool usage logging across providers
|
262
|
+
* @scenario Different providers with different tool formats
|
263
|
+
* @given Providers with different tool formats (JSON vs XML)
|
264
|
+
* @when Conversations include tool calls
|
265
|
+
* @then Tool usage is logged consistently regardless of provider format
|
266
|
+
*/
|
267
|
+
it('should log tool usage consistently across different provider formats', async () => {
|
268
|
+
const openaiProvider = createMockProvider('openai', { tools: true });
|
269
|
+
const anthropicProvider = createMockProvider('anthropic', { tools: true });
|
270
|
+
const openaiWrapper = new MockLoggingProviderWrapper(openaiProvider, config, redactor, storage);
|
271
|
+
const anthropicWrapper = new MockLoggingProviderWrapper(anthropicProvider, config, redactor, storage);
|
272
|
+
const tools = [
|
273
|
+
{
|
274
|
+
type: 'function',
|
275
|
+
function: {
|
276
|
+
name: 'search_web',
|
277
|
+
description: 'Search the web for information',
|
278
|
+
parameters: {
|
279
|
+
type: 'object',
|
280
|
+
properties: { query: { type: 'string' } },
|
281
|
+
},
|
282
|
+
},
|
283
|
+
},
|
284
|
+
];
|
285
|
+
const messagesWithTools = [
|
286
|
+
{
|
287
|
+
role: ContentGeneratorRole.USER,
|
288
|
+
content: 'Search for information about AI safety',
|
289
|
+
tool_calls: [
|
290
|
+
{
|
291
|
+
id: 'call_1',
|
292
|
+
type: 'function',
|
293
|
+
function: {
|
294
|
+
name: 'search_web',
|
295
|
+
arguments: JSON.stringify({ query: 'AI safety research 2024' }),
|
296
|
+
},
|
297
|
+
},
|
298
|
+
],
|
299
|
+
},
|
300
|
+
];
|
301
|
+
// Test with OpenAI (JSON format)
|
302
|
+
await consumeAsyncIterable(openaiWrapper.generateChatCompletion(messagesWithTools, tools, 'json'));
|
303
|
+
// Test with Anthropic (XML format)
|
304
|
+
await consumeAsyncIterable(anthropicWrapper.generateChatCompletion(messagesWithTools, tools, 'xml'));
|
305
|
+
const entries = storage.getEntries();
|
306
|
+
expect(entries).toHaveLength(2);
|
307
|
+
// Both entries should have tool calls logged
|
308
|
+
entries.forEach((entry) => {
|
309
|
+
expect(entry.messages[0].tool_calls).toBeDefined();
|
310
|
+
expect(entry.messages[0].tool_calls[0].function.name).toBe('search_web');
|
311
|
+
});
|
312
|
+
// Verify telemetry includes tool usage
|
313
|
+
expect(telemetrySystem.logConversationRequest).toHaveBeenCalledTimes(2);
|
314
|
+
expect(telemetrySystem.logConversationRequest).toHaveBeenCalledWith(expect.objectContaining({ has_tools: true }));
|
315
|
+
});
|
316
|
+
/**
|
317
|
+
* @requirement INTEGRATION-003: Streaming response logging
|
318
|
+
* @scenario Providers with different streaming patterns
|
319
|
+
* @given Providers that stream responses differently
|
320
|
+
* @when Streaming conversations are logged
|
321
|
+
* @then Complete responses are captured despite streaming differences
|
322
|
+
*/
|
323
|
+
it('should handle different streaming patterns across providers', async () => {
|
324
|
+
const fastStreamProvider = createMockProvider('fast-stream');
|
325
|
+
const slowStreamProvider = createMockProvider('slow-stream');
|
326
|
+
// Override streaming behavior
|
327
|
+
fastStreamProvider.generateChatCompletion = vi
|
328
|
+
.fn()
|
329
|
+
.mockImplementation(async function* () {
|
330
|
+
yield { content: 'Fast', role: ContentGeneratorRole.ASSISTANT };
|
331
|
+
yield { content: ' response', role: ContentGeneratorRole.ASSISTANT };
|
332
|
+
});
|
333
|
+
slowStreamProvider.generateChatCompletion = vi
|
334
|
+
.fn()
|
335
|
+
.mockImplementation(async function* () {
|
336
|
+
yield { content: 'Slow', role: ContentGeneratorRole.ASSISTANT };
|
337
|
+
await new Promise((resolve) => setTimeout(resolve, 10)); // Simulate slow streaming
|
338
|
+
yield { content: ' deliberate', role: ContentGeneratorRole.ASSISTANT };
|
339
|
+
yield { content: ' response', role: ContentGeneratorRole.ASSISTANT };
|
340
|
+
});
|
341
|
+
const fastWrapper = new MockLoggingProviderWrapper(fastStreamProvider, config, redactor, storage);
|
342
|
+
const slowWrapper = new MockLoggingProviderWrapper(slowStreamProvider, config, redactor, storage);
|
343
|
+
const message = [
|
344
|
+
{
|
345
|
+
role: ContentGeneratorRole.USER,
|
346
|
+
content: 'Tell me about machine learning',
|
347
|
+
},
|
348
|
+
];
|
349
|
+
// Test fast streaming
|
350
|
+
const fastResult = await consumeAsyncIterable(fastWrapper.generateChatCompletion(message));
|
351
|
+
// Test slow streaming
|
352
|
+
const slowResult = await consumeAsyncIterable(slowWrapper.generateChatCompletion(message));
|
353
|
+
expect(fastResult).toHaveLength(2);
|
354
|
+
expect(slowResult).toHaveLength(3);
|
355
|
+
// Verify both conversations were logged
|
356
|
+
const entries = storage.getEntries();
|
357
|
+
expect(entries).toHaveLength(2);
|
358
|
+
// Verify completion events were logged
|
359
|
+
expect(telemetrySystem.logConversationComplete).toHaveBeenCalledTimes(2);
|
360
|
+
expect(telemetrySystem.logConversationComplete).toHaveBeenCalledWith(expect.objectContaining({ response_chunks: 2 }));
|
361
|
+
expect(telemetrySystem.logConversationComplete).toHaveBeenCalledWith(expect.objectContaining({ response_chunks: 3 }));
|
362
|
+
});
|
363
|
+
/**
|
364
|
+
* @requirement INTEGRATION-004: Error handling across providers
|
365
|
+
* @scenario Provider errors during logged conversations
|
366
|
+
* @given Providers that may throw errors
|
367
|
+
* @when Provider errors occur during logging
|
368
|
+
* @then Logging system handles errors gracefully
|
369
|
+
* @and Other provider operations continue normally
|
370
|
+
*/
|
371
|
+
it('should handle provider errors gracefully without affecting logging', async () => {
|
372
|
+
const reliableProvider = createMockProvider('reliable');
|
373
|
+
const errorProvider = createMockProvider('error-prone');
|
374
|
+
// Make error provider throw during generation
|
375
|
+
errorProvider.generateChatCompletion = vi
|
376
|
+
.fn()
|
377
|
+
.mockImplementation(async function* () {
|
378
|
+
yield {
|
379
|
+
content: 'Starting response...',
|
380
|
+
role: ContentGeneratorRole.ASSISTANT,
|
381
|
+
};
|
382
|
+
throw new Error('Provider API error');
|
383
|
+
});
|
384
|
+
const reliableWrapper = new MockLoggingProviderWrapper(reliableProvider, config, redactor, storage);
|
385
|
+
const errorWrapper = new MockLoggingProviderWrapper(errorProvider, config, redactor, storage);
|
386
|
+
const message = [
|
387
|
+
{ role: ContentGeneratorRole.USER, content: 'Test message' },
|
388
|
+
];
|
389
|
+
// Test reliable provider first
|
390
|
+
await consumeAsyncIterable(reliableWrapper.generateChatCompletion(message));
|
391
|
+
// Test error provider (should handle error gracefully)
|
392
|
+
try {
|
393
|
+
await consumeAsyncIterable(errorWrapper.generateChatCompletion(message));
|
394
|
+
}
|
395
|
+
catch (error) {
|
396
|
+
expect(error).toBeInstanceOf(Error);
|
397
|
+
expect(error.message).toBe('Provider API error');
|
398
|
+
}
|
399
|
+
// Verify that logging occurred even when provider errored
|
400
|
+
const entries = storage.getEntries();
|
401
|
+
expect(entries.length).toBeGreaterThan(0);
|
402
|
+
// Verify that at least the request was logged for error provider
|
403
|
+
expect(telemetrySystem.logConversationRequest).toHaveBeenCalledTimes(2);
|
404
|
+
});
|
405
|
+
/**
|
406
|
+
* @requirement INTEGRATION-005: Concurrent provider operations
|
407
|
+
* @scenario Multiple providers handling conversations simultaneously
|
408
|
+
* @given Multiple wrapped providers operating concurrently
|
409
|
+
* @when Concurrent conversations are initiated
|
410
|
+
* @then All conversations are logged correctly without interference
|
411
|
+
*/
|
412
|
+
it('should handle concurrent provider operations without logging conflicts', async () => {
|
413
|
+
const providers = [
|
414
|
+
createMockProvider('concurrent-1'),
|
415
|
+
createMockProvider('concurrent-2'),
|
416
|
+
createMockProvider('concurrent-3'),
|
417
|
+
];
|
418
|
+
const wrappers = providers.map((provider) => new MockLoggingProviderWrapper(provider, config, redactor, storage));
|
419
|
+
const messages = [
|
420
|
+
{ role: ContentGeneratorRole.USER, content: 'Concurrent test message' },
|
421
|
+
];
|
422
|
+
// Start all conversations concurrently
|
423
|
+
const concurrentOperations = wrappers.map((wrapper) => consumeAsyncIterable(wrapper.generateChatCompletion(messages)));
|
424
|
+
const results = await Promise.all(concurrentOperations);
|
425
|
+
// Verify all operations completed
|
426
|
+
expect(results).toHaveLength(3);
|
427
|
+
results.forEach((result) => {
|
428
|
+
expect(result.length).toBeGreaterThan(0);
|
429
|
+
});
|
430
|
+
// Verify all conversations were logged
|
431
|
+
const entries = storage.getEntries();
|
432
|
+
expect(entries).toHaveLength(3);
|
433
|
+
// Verify each provider was logged correctly
|
434
|
+
const providerNames = entries.map((e) => e.provider_name).sort();
|
435
|
+
expect(providerNames).toEqual([
|
436
|
+
'concurrent-1',
|
437
|
+
'concurrent-2',
|
438
|
+
'concurrent-3',
|
439
|
+
]);
|
440
|
+
// Verify telemetry was called for all
|
441
|
+
expect(telemetrySystem.logConversationRequest).toHaveBeenCalledTimes(3);
|
442
|
+
expect(telemetrySystem.logConversationComplete).toHaveBeenCalledTimes(3);
|
443
|
+
});
|
444
|
+
/**
|
445
|
+
* @requirement INTEGRATION-006: Provider-specific data redaction
|
446
|
+
* @scenario Different providers with provider-specific sensitive data
|
447
|
+
* @given Providers with different API key formats and sensitive data patterns
|
448
|
+
* @when Conversations contain provider-specific sensitive information
|
449
|
+
* @then Data is redacted appropriately based on provider context
|
450
|
+
*/
|
451
|
+
it('should apply provider-specific redaction patterns', async () => {
|
452
|
+
const providers = [
|
453
|
+
createMockProvider('openai'),
|
454
|
+
createMockProvider('anthropic'),
|
455
|
+
createMockProvider('gemini'),
|
456
|
+
];
|
457
|
+
const wrappers = providers.map((provider) => new MockLoggingProviderWrapper(provider, config, redactor, storage));
|
458
|
+
const sensitiveMessages = [
|
459
|
+
{
|
460
|
+
role: ContentGeneratorRole.USER,
|
461
|
+
content: 'My OpenAI key is sk-1234567890abcdef1234567890abcdef12345678',
|
462
|
+
},
|
463
|
+
{
|
464
|
+
role: ContentGeneratorRole.USER,
|
465
|
+
content: 'My Anthropic key is sk-ant-api03-abcd1234567890',
|
466
|
+
},
|
467
|
+
{
|
468
|
+
role: ContentGeneratorRole.USER,
|
469
|
+
content: 'My Google key is AIzaSyAbcd1234567890',
|
470
|
+
},
|
471
|
+
];
|
472
|
+
// Test each provider with its specific sensitive data
|
473
|
+
for (let i = 0; i < wrappers.length; i++) {
|
474
|
+
await consumeAsyncIterable(wrappers[i].generateChatCompletion([sensitiveMessages[i]]));
|
475
|
+
}
|
476
|
+
const entries = storage.getEntries();
|
477
|
+
expect(entries).toHaveLength(3);
|
478
|
+
// Verify redaction occurred for all providers
|
479
|
+
entries.forEach((entry) => {
|
480
|
+
expect(entry.messages[0].content).toContain('[REDACTED-API-KEY]');
|
481
|
+
expect(entry.messages[0].content).not.toContain('sk-');
|
482
|
+
expect(entry.messages[0].content).not.toContain('AIza');
|
483
|
+
});
|
484
|
+
});
|
485
|
+
/**
|
486
|
+
* @requirement INTEGRATION-007: Session continuity across providers
|
487
|
+
* @scenario Long conversation session with multiple provider switches
|
488
|
+
* @given Long conversation with multiple provider switches
|
489
|
+
* @when Session continues across provider changes
|
490
|
+
* @then Session context is maintained in logging
|
491
|
+
* @and Conversation continuity is tracked
|
492
|
+
*/
|
493
|
+
it('should maintain session continuity across provider switches in logging', async () => {
|
494
|
+
// Session ID for testing continuity tracking
|
495
|
+
// const _sessionId = 'session_' + Date.now(); // Unused for now but may be needed for future session continuity tests
|
496
|
+
const providers = ['openai', 'anthropic', 'gemini'].map((name) => createMockProvider(name));
|
497
|
+
const wrappers = providers.map((provider) => new MockLoggingProviderWrapper(provider, config, redactor, storage));
|
498
|
+
// Simulate conversation progression
|
499
|
+
const conversationMessages = [
|
500
|
+
{
|
501
|
+
role: ContentGeneratorRole.USER,
|
502
|
+
content: 'What is machine learning?',
|
503
|
+
},
|
504
|
+
{
|
505
|
+
role: ContentGeneratorRole.USER,
|
506
|
+
content: 'Can you give examples?',
|
507
|
+
},
|
508
|
+
{
|
509
|
+
role: ContentGeneratorRole.USER,
|
510
|
+
content: 'How about neural networks specifically?',
|
511
|
+
},
|
512
|
+
];
|
513
|
+
// Use different provider for each message to simulate switching
|
514
|
+
for (let i = 0; i < conversationMessages.length; i++) {
|
515
|
+
const wrapper = wrappers[i];
|
516
|
+
await consumeAsyncIterable(wrapper.generateChatCompletion([conversationMessages[i]]));
|
517
|
+
}
|
518
|
+
const entries = storage.getEntries();
|
519
|
+
expect(entries).toHaveLength(3);
|
520
|
+
// Verify conversation progression
|
521
|
+
expect(entries[0].provider_name).toBe('openai');
|
522
|
+
expect(entries[1].provider_name).toBe('anthropic');
|
523
|
+
expect(entries[2].provider_name).toBe('gemini');
|
524
|
+
// Verify each conversation has unique conversation_id but could be linked by session
|
525
|
+
const conversationIds = entries.map((e) => e.conversation_id);
|
526
|
+
expect(new Set(conversationIds).size).toBe(3); // All unique
|
527
|
+
// Verify provider switches were tracked
|
528
|
+
expect(telemetrySystem.logProviderSwitch).toHaveBeenCalledTimes(2);
|
529
|
+
});
|
530
|
+
});
|
531
|
+
//# sourceMappingURL=multi-provider-logging.integration.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"multi-provider-logging.integration.test.js","sourceRoot":"","sources":["../../../../src/providers/logging/multi-provider-logging.integration.test.ts"],"names":[],"mappings":"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"}
|