@didim365/agent-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -3
- package/dist/src/commands/extensions/configure.test.d.ts +0 -1
- package/dist/src/commands/extensions/configure.test.js +0 -197
- package/dist/src/commands/extensions/configure.test.js.map +0 -1
- package/dist/src/commands/extensions/disable.test.d.ts +0 -6
- package/dist/src/commands/extensions/disable.test.js +0 -169
- package/dist/src/commands/extensions/disable.test.js.map +0 -1
- package/dist/src/commands/extensions/enable.test.d.ts +0 -6
- package/dist/src/commands/extensions/enable.test.js +0 -199
- package/dist/src/commands/extensions/enable.test.js.map +0 -1
- package/dist/src/commands/extensions/install.test.d.ts +0 -6
- package/dist/src/commands/extensions/install.test.js +0 -140
- package/dist/src/commands/extensions/install.test.js.map +0 -1
- package/dist/src/commands/extensions/link.test.d.ts +0 -6
- package/dist/src/commands/extensions/link.test.js +0 -137
- package/dist/src/commands/extensions/link.test.js.map +0 -1
- package/dist/src/commands/extensions/list.test.d.ts +0 -6
- package/dist/src/commands/extensions/list.test.js +0 -148
- package/dist/src/commands/extensions/list.test.js.map +0 -1
- package/dist/src/commands/extensions/new.test.d.ts +0 -6
- package/dist/src/commands/extensions/new.test.js +0 -62
- package/dist/src/commands/extensions/new.test.js.map +0 -1
- package/dist/src/commands/extensions/uninstall.test.d.ts +0 -6
- package/dist/src/commands/extensions/uninstall.test.js +0 -199
- package/dist/src/commands/extensions/uninstall.test.js.map +0 -1
- package/dist/src/commands/extensions/update.test.d.ts +0 -6
- package/dist/src/commands/extensions/update.test.js +0 -170
- package/dist/src/commands/extensions/update.test.js.map +0 -1
- package/dist/src/commands/extensions/validate.test.d.ts +0 -6
- package/dist/src/commands/extensions/validate.test.js +0 -96
- package/dist/src/commands/extensions/validate.test.js.map +0 -1
- package/dist/src/commands/extensions.test.d.ts +0 -6
- package/dist/src/commands/extensions.test.js +0 -67
- package/dist/src/commands/extensions.test.js.map +0 -1
- package/dist/src/commands/hooks/migrate.test.d.ts +0 -6
- package/dist/src/commands/hooks/migrate.test.js +0 -388
- package/dist/src/commands/hooks/migrate.test.js.map +0 -1
- package/dist/src/commands/mcp/add.test.d.ts +0 -6
- package/dist/src/commands/mcp/add.test.js +0 -274
- package/dist/src/commands/mcp/add.test.js.map +0 -1
- package/dist/src/commands/mcp/list.test.d.ts +0 -6
- package/dist/src/commands/mcp/list.test.js +0 -150
- package/dist/src/commands/mcp/list.test.js.map +0 -1
- package/dist/src/commands/mcp/remove.test.d.ts +0 -6
- package/dist/src/commands/mcp/remove.test.js +0 -189
- package/dist/src/commands/mcp/remove.test.js.map +0 -1
- package/dist/src/commands/mcp.test.d.ts +0 -6
- package/dist/src/commands/mcp.test.js +0 -65
- package/dist/src/commands/mcp.test.js.map +0 -1
- package/dist/src/commands/skills/disable.test.d.ts +0 -6
- package/dist/src/commands/skills/disable.test.js +0 -96
- package/dist/src/commands/skills/disable.test.js.map +0 -1
- package/dist/src/commands/skills/enable.test.d.ts +0 -6
- package/dist/src/commands/skills/enable.test.js +0 -107
- package/dist/src/commands/skills/enable.test.js.map +0 -1
- package/dist/src/commands/skills/install.test.d.ts +0 -6
- package/dist/src/commands/skills/install.test.js +0 -95
- package/dist/src/commands/skills/install.test.js.map +0 -1
- package/dist/src/commands/skills/list.test.d.ts +0 -6
- package/dist/src/commands/skills/list.test.js +0 -136
- package/dist/src/commands/skills/list.test.js.map +0 -1
- package/dist/src/commands/skills/uninstall.test.d.ts +0 -6
- package/dist/src/commands/skills/uninstall.test.js +0 -61
- package/dist/src/commands/skills/uninstall.test.js.map +0 -1
- package/dist/src/commands/skills.test.d.ts +0 -6
- package/dist/src/commands/skills.test.js +0 -49
- package/dist/src/commands/skills.test.js.map +0 -1
- package/dist/src/commands/utils.test.d.ts +0 -6
- package/dist/src/commands/utils.test.js +0 -35
- package/dist/src/commands/utils.test.js.map +0 -1
- package/dist/src/config/auth.test.d.ts +0 -6
- package/dist/src/config/auth.test.js +0 -89
- package/dist/src/config/auth.test.js.map +0 -1
- package/dist/src/config/config.integration.test.d.ts +0 -6
- package/dist/src/config/config.integration.test.js +0 -205
- package/dist/src/config/config.integration.test.js.map +0 -1
- package/dist/src/config/config.test.d.ts +0 -6
- package/dist/src/config/config.test.js +0 -2413
- package/dist/src/config/config.test.js.map +0 -1
- package/dist/src/config/extension-manager-agents.test.d.ts +0 -6
- package/dist/src/config/extension-manager-agents.test.js +0 -114
- package/dist/src/config/extension-manager-agents.test.js.map +0 -1
- package/dist/src/config/extension-manager-scope.test.d.ts +0 -6
- package/dist/src/config/extension-manager-scope.test.js +0 -153
- package/dist/src/config/extension-manager-scope.test.js.map +0 -1
- package/dist/src/config/extension-manager-skills.test.d.ts +0 -6
- package/dist/src/config/extension-manager-skills.test.js +0 -148
- package/dist/src/config/extension-manager-skills.test.js.map +0 -1
- package/dist/src/config/extension.test.d.ts +0 -6
- package/dist/src/config/extension.test.js +0 -1671
- package/dist/src/config/extension.test.js.map +0 -1
- package/dist/src/config/extensions/consent.test.d.ts +0 -6
- package/dist/src/config/extensions/consent.test.js +0 -280
- package/dist/src/config/extensions/consent.test.js.map +0 -1
- package/dist/src/config/extensions/extensionEnablement.test.d.ts +0 -6
- package/dist/src/config/extensions/extensionEnablement.test.js +0 -404
- package/dist/src/config/extensions/extensionEnablement.test.js.map +0 -1
- package/dist/src/config/extensions/extensionSettings.test.d.ts +0 -6
- package/dist/src/config/extensions/extensionSettings.test.js +0 -493
- package/dist/src/config/extensions/extensionSettings.test.js.map +0 -1
- package/dist/src/config/extensions/extensionUpdates.test.d.ts +0 -6
- package/dist/src/config/extensions/extensionUpdates.test.js +0 -230
- package/dist/src/config/extensions/extensionUpdates.test.js.map +0 -1
- package/dist/src/config/extensions/github.test.d.ts +0 -6
- package/dist/src/config/extensions/github.test.js +0 -441
- package/dist/src/config/extensions/github.test.js.map +0 -1
- package/dist/src/config/extensions/github_fetch.test.d.ts +0 -6
- package/dist/src/config/extensions/github_fetch.test.js +0 -169
- package/dist/src/config/extensions/github_fetch.test.js.map +0 -1
- package/dist/src/config/extensions/storage.test.d.ts +0 -6
- package/dist/src/config/extensions/storage.test.js +0 -64
- package/dist/src/config/extensions/storage.test.js.map +0 -1
- package/dist/src/config/extensions/update.test.d.ts +0 -6
- package/dist/src/config/extensions/update.test.js +0 -231
- package/dist/src/config/extensions/update.test.js.map +0 -1
- package/dist/src/config/extensions/variables.test.d.ts +0 -6
- package/dist/src/config/extensions/variables.test.js +0 -103
- package/dist/src/config/extensions/variables.test.js.map +0 -1
- package/dist/src/config/keyBindings.test.d.ts +0 -6
- package/dist/src/config/keyBindings.test.js +0 -108
- package/dist/src/config/keyBindings.test.js.map +0 -1
- package/dist/src/config/mcp/mcpServerEnablement.test.d.ts +0 -6
- package/dist/src/config/mcp/mcpServerEnablement.test.js +0 -147
- package/dist/src/config/mcp/mcpServerEnablement.test.js.map +0 -1
- package/dist/src/config/policy-engine.integration.test.d.ts +0 -6
- package/dist/src/config/policy-engine.integration.test.js +0 -353
- package/dist/src/config/policy-engine.integration.test.js.map +0 -1
- package/dist/src/config/sandboxConfig.test.d.ts +0 -6
- package/dist/src/config/sandboxConfig.test.js +0 -184
- package/dist/src/config/sandboxConfig.test.js.map +0 -1
- package/dist/src/config/settingPaths.test.d.ts +0 -6
- package/dist/src/config/settingPaths.test.js +0 -22
- package/dist/src/config/settingPaths.test.js.map +0 -1
- package/dist/src/config/settings-validation.test.d.ts +0 -6
- package/dist/src/config/settings-validation.test.js +0 -370
- package/dist/src/config/settings-validation.test.js.map +0 -1
- package/dist/src/config/settings.test.d.ts +0 -6
- package/dist/src/config/settings.test.js +0 -1822
- package/dist/src/config/settings.test.js.map +0 -1
- package/dist/src/config/settingsSchema.test.d.ts +0 -6
- package/dist/src/config/settingsSchema.test.js +0 -309
- package/dist/src/config/settingsSchema.test.js.map +0 -1
- package/dist/src/config/settings_repro.test.d.ts +0 -6
- package/dist/src/config/settings_repro.test.js +0 -166
- package/dist/src/config/settings_repro.test.js.map +0 -1
- package/dist/src/config/settings_validation_warning.test.d.ts +0 -6
- package/dist/src/config/settings_validation_warning.test.js +0 -123
- package/dist/src/config/settings_validation_warning.test.js.map +0 -1
- package/dist/src/config/skills-backward-compatibility.test.d.ts +0 -6
- package/dist/src/config/skills-backward-compatibility.test.js +0 -99
- package/dist/src/config/skills-backward-compatibility.test.js.map +0 -1
- package/dist/src/config/trustedFolders.test.d.ts +0 -6
- package/dist/src/config/trustedFolders.test.js +0 -385
- package/dist/src/config/trustedFolders.test.js.map +0 -1
- package/dist/src/core/auth.test.d.ts +0 -6
- package/dist/src/core/auth.test.js +0 -47
- package/dist/src/core/auth.test.js.map +0 -1
- package/dist/src/core/initializer.test.d.ts +0 -6
- package/dist/src/core/initializer.test.js +0 -101
- package/dist/src/core/initializer.test.js.map +0 -1
- package/dist/src/core/theme.test.d.ts +0 -6
- package/dist/src/core/theme.test.js +0 -46
- package/dist/src/core/theme.test.js.map +0 -1
- package/dist/src/deferred.test.d.ts +0 -6
- package/dist/src/deferred.test.js +0 -164
- package/dist/src/deferred.test.js.map +0 -1
- package/dist/src/gemini.test.d.ts +0 -6
- package/dist/src/gemini.test.js +0 -1334
- package/dist/src/gemini.test.js.map +0 -1
- package/dist/src/gemini_cleanup.test.d.ts +0 -6
- package/dist/src/gemini_cleanup.test.js +0 -208
- package/dist/src/gemini_cleanup.test.js.map +0 -1
- package/dist/src/nonInteractiveCli.test.d.ts +0 -6
- package/dist/src/nonInteractiveCli.test.js +0 -1687
- package/dist/src/nonInteractiveCli.test.js.map +0 -1
- package/dist/src/services/BuiltinCommandLoader.test.d.ts +0 -6
- package/dist/src/services/BuiltinCommandLoader.test.js +0 -254
- package/dist/src/services/BuiltinCommandLoader.test.js.map +0 -1
- package/dist/src/services/CommandService.test.d.ts +0 -6
- package/dist/src/services/CommandService.test.js +0 -234
- package/dist/src/services/CommandService.test.js.map +0 -1
- package/dist/src/services/FileCommandLoader.test.d.ts +0 -6
- package/dist/src/services/FileCommandLoader.test.js +0 -1102
- package/dist/src/services/FileCommandLoader.test.js.map +0 -1
- package/dist/src/services/McpPromptLoader.test.d.ts +0 -6
- package/dist/src/services/McpPromptLoader.test.js +0 -411
- package/dist/src/services/McpPromptLoader.test.js.map +0 -1
- package/dist/src/services/prompt-processors/argumentProcessor.test.d.ts +0 -6
- package/dist/src/services/prompt-processors/argumentProcessor.test.js +0 -40
- package/dist/src/services/prompt-processors/argumentProcessor.test.js.map +0 -1
- package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +0 -6
- package/dist/src/services/prompt-processors/atFileProcessor.test.js +0 -174
- package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +0 -1
- package/dist/src/services/prompt-processors/injectionParser.test.d.ts +0 -6
- package/dist/src/services/prompt-processors/injectionParser.test.js +0 -189
- package/dist/src/services/prompt-processors/injectionParser.test.js.map +0 -1
- package/dist/src/services/prompt-processors/shellProcessor.test.d.ts +0 -6
- package/dist/src/services/prompt-processors/shellProcessor.test.js +0 -514
- package/dist/src/services/prompt-processors/shellProcessor.test.js.map +0 -1
- package/dist/src/test-utils/mockCommandContext.test.d.ts +0 -6
- package/dist/src/test-utils/mockCommandContext.test.js +0 -51
- package/dist/src/test-utils/mockCommandContext.test.js.map +0 -1
- package/dist/src/test-utils/render.test.d.ts +0 -6
- package/dist/src/test-utils/render.test.js +0 -79
- package/dist/src/test-utils/render.test.js.map +0 -1
- package/dist/src/ui/App.test.d.ts +0 -6
- package/dist/src/ui/App.test.js +0 -218
- package/dist/src/ui/App.test.js.map +0 -1
- package/dist/src/ui/AppContainer.test.d.ts +0 -6
- package/dist/src/ui/AppContainer.test.js +0 -2072
- package/dist/src/ui/AppContainer.test.js.map +0 -1
- package/dist/src/ui/IdeIntegrationNudge.test.d.ts +0 -6
- package/dist/src/ui/IdeIntegrationNudge.test.js +0 -158
- package/dist/src/ui/IdeIntegrationNudge.test.js.map +0 -1
- package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +0 -6
- package/dist/src/ui/auth/ApiAuthDialog.test.js +0 -109
- package/dist/src/ui/auth/ApiAuthDialog.test.js.map +0 -1
- package/dist/src/ui/auth/AuthDialog.test.d.ts +0 -6
- package/dist/src/ui/auth/AuthDialog.test.js +0 -309
- package/dist/src/ui/auth/AuthDialog.test.js.map +0 -1
- package/dist/src/ui/auth/AuthInProgress.test.d.ts +0 -6
- package/dist/src/ui/auth/AuthInProgress.test.js +0 -81
- package/dist/src/ui/auth/AuthInProgress.test.js.map +0 -1
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +0 -6
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +0 -66
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +0 -1
- package/dist/src/ui/auth/useAuth.test.d.ts +0 -6
- package/dist/src/ui/auth/useAuth.test.js +0 -189
- package/dist/src/ui/auth/useAuth.test.js.map +0 -1
- package/dist/src/ui/commands/aboutCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/aboutCommand.test.js +0 -143
- package/dist/src/ui/commands/aboutCommand.test.js.map +0 -1
- package/dist/src/ui/commands/agentsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/agentsCommand.test.js +0 -344
- package/dist/src/ui/commands/agentsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/authCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/authCommand.test.js +0 -98
- package/dist/src/ui/commands/authCommand.test.js.map +0 -1
- package/dist/src/ui/commands/bugCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/bugCommand.test.js +0 -186
- package/dist/src/ui/commands/bugCommand.test.js.map +0 -1
- package/dist/src/ui/commands/chatCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/chatCommand.test.js +0 -620
- package/dist/src/ui/commands/chatCommand.test.js.map +0 -1
- package/dist/src/ui/commands/clearCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/clearCommand.test.js +0 -87
- package/dist/src/ui/commands/clearCommand.test.js.map +0 -1
- package/dist/src/ui/commands/compressCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/compressCommand.test.js +0 -98
- package/dist/src/ui/commands/compressCommand.test.js.map +0 -1
- package/dist/src/ui/commands/copyCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/copyCommand.test.js +0 -242
- package/dist/src/ui/commands/copyCommand.test.js.map +0 -1
- package/dist/src/ui/commands/corgiCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/corgiCommand.test.js +0 -28
- package/dist/src/ui/commands/corgiCommand.test.js.map +0 -1
- package/dist/src/ui/commands/directoryCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/directoryCommand.test.js +0 -353
- package/dist/src/ui/commands/directoryCommand.test.js.map +0 -1
- package/dist/src/ui/commands/docsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/docsCommand.test.js +0 -72
- package/dist/src/ui/commands/docsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/editorCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/editorCommand.test.js +0 -27
- package/dist/src/ui/commands/editorCommand.test.js.map +0 -1
- package/dist/src/ui/commands/extensionsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/extensionsCommand.test.js +0 -778
- package/dist/src/ui/commands/extensionsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/helpCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/helpCommand.test.js +0 -42
- package/dist/src/ui/commands/helpCommand.test.js.map +0 -1
- package/dist/src/ui/commands/hooksCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/hooksCommand.test.js +0 -572
- package/dist/src/ui/commands/hooksCommand.test.js.map +0 -1
- package/dist/src/ui/commands/ideCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/ideCommand.test.js +0 -203
- package/dist/src/ui/commands/ideCommand.test.js.map +0 -1
- package/dist/src/ui/commands/initCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/initCommand.test.js +0 -84
- package/dist/src/ui/commands/initCommand.test.js.map +0 -1
- package/dist/src/ui/commands/mcpCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/mcpCommand.test.js +0 -189
- package/dist/src/ui/commands/mcpCommand.test.js.map +0 -1
- package/dist/src/ui/commands/memoryCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/memoryCommand.test.js +0 -350
- package/dist/src/ui/commands/memoryCommand.test.js.map +0 -1
- package/dist/src/ui/commands/modelCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/modelCommand.test.js +0 -41
- package/dist/src/ui/commands/modelCommand.test.js.map +0 -1
- package/dist/src/ui/commands/permissionsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/permissionsCommand.test.js +0 -86
- package/dist/src/ui/commands/permissionsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/policiesCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/policiesCommand.test.js +0 -87
- package/dist/src/ui/commands/policiesCommand.test.js.map +0 -1
- package/dist/src/ui/commands/privacyCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/privacyCommand.test.js +0 -32
- package/dist/src/ui/commands/privacyCommand.test.js.map +0 -1
- package/dist/src/ui/commands/quitCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/quitCommand.test.js +0 -50
- package/dist/src/ui/commands/quitCommand.test.js.map +0 -1
- package/dist/src/ui/commands/restoreCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/restoreCommand.test.js +0 -190
- package/dist/src/ui/commands/restoreCommand.test.js.map +0 -1
- package/dist/src/ui/commands/rewindCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/rewindCommand.test.js +0 -242
- package/dist/src/ui/commands/rewindCommand.test.js.map +0 -1
- package/dist/src/ui/commands/settingsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/settingsCommand.test.js +0 -30
- package/dist/src/ui/commands/settingsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/setupGithubCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/setupGithubCommand.test.js +0 -238
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +0 -1
- package/dist/src/ui/commands/skillsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/skillsCommand.test.js +0 -426
- package/dist/src/ui/commands/skillsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/statsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/statsCommand.test.js +0 -70
- package/dist/src/ui/commands/statsCommand.test.js.map +0 -1
- package/dist/src/ui/commands/terminalSetupCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/terminalSetupCommand.test.js +0 -66
- package/dist/src/ui/commands/terminalSetupCommand.test.js.map +0 -1
- package/dist/src/ui/commands/themeCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/themeCommand.test.js +0 -32
- package/dist/src/ui/commands/themeCommand.test.js.map +0 -1
- package/dist/src/ui/commands/toolsCommand.test.d.ts +0 -6
- package/dist/src/ui/commands/toolsCommand.test.js +0 -100
- package/dist/src/ui/commands/toolsCommand.test.js.map +0 -1
- package/dist/src/ui/components/AboutBox.test.d.ts +0 -6
- package/dist/src/ui/components/AboutBox.test.js +0 -59
- package/dist/src/ui/components/AboutBox.test.js.map +0 -1
- package/dist/src/ui/components/AdminSettingsChangedDialog.test.d.ts +0 -6
- package/dist/src/ui/components/AdminSettingsChangedDialog.test.js +0 -43
- package/dist/src/ui/components/AdminSettingsChangedDialog.test.js.map +0 -1
- package/dist/src/ui/components/AgentConfigDialog.test.d.ts +0 -6
- package/dist/src/ui/components/AgentConfigDialog.test.js +0 -241
- package/dist/src/ui/components/AgentConfigDialog.test.js.map +0 -1
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +0 -190
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +0 -1
- package/dist/src/ui/components/AnsiOutput.test.d.ts +0 -6
- package/dist/src/ui/components/AnsiOutput.test.js +0 -92
- package/dist/src/ui/components/AnsiOutput.test.js.map +0 -1
- package/dist/src/ui/components/AppHeader.test.d.ts +0 -6
- package/dist/src/ui/components/AppHeader.test.js +0 -225
- package/dist/src/ui/components/AppHeader.test.js.map +0 -1
- package/dist/src/ui/components/ApprovalModeIndicator.test.d.ts +0 -6
- package/dist/src/ui/components/ApprovalModeIndicator.test.js +0 -37
- package/dist/src/ui/components/ApprovalModeIndicator.test.js.map +0 -1
- package/dist/src/ui/components/AskUserDialog.test.d.ts +0 -6
- package/dist/src/ui/components/AskUserDialog.test.js +0 -598
- package/dist/src/ui/components/AskUserDialog.test.js.map +0 -1
- package/dist/src/ui/components/Banner.test.d.ts +0 -6
- package/dist/src/ui/components/Banner.test.js +0 -24
- package/dist/src/ui/components/Banner.test.js.map +0 -1
- package/dist/src/ui/components/CliSpinner.test.d.ts +0 -6
- package/dist/src/ui/components/CliSpinner.test.js +0 -28
- package/dist/src/ui/components/CliSpinner.test.js.map +0 -1
- package/dist/src/ui/components/Composer.test.d.ts +0 -6
- package/dist/src/ui/components/Composer.test.js +0 -383
- package/dist/src/ui/components/Composer.test.js.map +0 -1
- package/dist/src/ui/components/ConfigInitDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ConfigInitDisplay.test.js +0 -117
- package/dist/src/ui/components/ConfigInitDisplay.test.js.map +0 -1
- package/dist/src/ui/components/ConsentPrompt.test.d.ts +0 -6
- package/dist/src/ui/components/ConsentPrompt.test.js +0 -77
- package/dist/src/ui/components/ConsentPrompt.test.js.map +0 -1
- package/dist/src/ui/components/ConsoleSummaryDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ConsoleSummaryDisplay.test.js +0 -26
- package/dist/src/ui/components/ConsoleSummaryDisplay.test.js.map +0 -1
- package/dist/src/ui/components/ContextSummaryDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ContextSummaryDisplay.test.js +0 -102
- package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +0 -1
- package/dist/src/ui/components/ContextUsageDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ContextUsageDisplay.test.js +0 -43
- package/dist/src/ui/components/ContextUsageDisplay.test.js.map +0 -1
- package/dist/src/ui/components/CopyModeWarning.test.d.ts +0 -6
- package/dist/src/ui/components/CopyModeWarning.test.js +0 -33
- package/dist/src/ui/components/CopyModeWarning.test.js.map +0 -1
- package/dist/src/ui/components/DebugProfiler.test.d.ts +0 -6
- package/dist/src/ui/components/DebugProfiler.test.js +0 -229
- package/dist/src/ui/components/DebugProfiler.test.js.map +0 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js +0 -39
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +0 -1
- package/dist/src/ui/components/DialogManager.test.d.ts +0 -6
- package/dist/src/ui/components/DialogManager.test.js +0 -177
- package/dist/src/ui/components/DialogManager.test.js.map +0 -1
- package/dist/src/ui/components/EditorSettingsDialog.test.d.ts +0 -6
- package/dist/src/ui/components/EditorSettingsDialog.test.js +0 -119
- package/dist/src/ui/components/EditorSettingsDialog.test.js.map +0 -1
- package/dist/src/ui/components/ExitWarning.test.d.ts +0 -6
- package/dist/src/ui/components/ExitWarning.test.js +0 -54
- package/dist/src/ui/components/ExitWarning.test.js.map +0 -1
- package/dist/src/ui/components/FolderTrustDialog.test.d.ts +0 -6
- package/dist/src/ui/components/FolderTrustDialog.test.js +0 -102
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +0 -1
- package/dist/src/ui/components/Footer.test.d.ts +0 -6
- package/dist/src/ui/components/Footer.test.js +0 -321
- package/dist/src/ui/components/Footer.test.js.map +0 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +0 -6
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js +0 -61
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +0 -1
- package/dist/src/ui/components/GradientRegression.test.d.ts +0 -6
- package/dist/src/ui/components/GradientRegression.test.js +0 -105
- package/dist/src/ui/components/GradientRegression.test.js.map +0 -1
- package/dist/src/ui/components/Header.test.d.ts +0 -6
- package/dist/src/ui/components/Header.test.js +0 -147
- package/dist/src/ui/components/Header.test.js.map +0 -1
- package/dist/src/ui/components/Help.test.d.ts +0 -6
- package/dist/src/ui/components/Help.test.js +0 -67
- package/dist/src/ui/components/Help.test.js.map +0 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/HistoryItemDisplay.test.js +0 -207
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +0 -1
- package/dist/src/ui/components/HookStatusDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/HookStatusDisplay.test.js +0 -51
- package/dist/src/ui/components/HookStatusDisplay.test.js.map +0 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +0 -6
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js +0 -58
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +0 -1
- package/dist/src/ui/components/InputPrompt.test.d.ts +0 -6
- package/dist/src/ui/components/InputPrompt.test.js +0 -2596
- package/dist/src/ui/components/InputPrompt.test.js.map +0 -1
- package/dist/src/ui/components/LoadingIndicator.test.d.ts +0 -6
- package/dist/src/ui/components/LoadingIndicator.test.js +0 -207
- package/dist/src/ui/components/LoadingIndicator.test.js.map +0 -1
- package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +0 -6
- package/dist/src/ui/components/LogoutConfirmationDialog.test.js +0 -59
- package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +0 -1
- package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +0 -6
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js +0 -25
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +0 -1
- package/dist/src/ui/components/MainContent.test.d.ts +0 -6
- package/dist/src/ui/components/MainContent.test.js +0 -83
- package/dist/src/ui/components/MainContent.test.js.map +0 -1
- package/dist/src/ui/components/MemoryUsageDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/MemoryUsageDisplay.test.js +0 -49
- package/dist/src/ui/components/MemoryUsageDisplay.test.js.map +0 -1
- package/dist/src/ui/components/ModelDialog.test.d.ts +0 -6
- package/dist/src/ui/components/ModelDialog.test.js +0 -197
- package/dist/src/ui/components/ModelDialog.test.js.map +0 -1
- package/dist/src/ui/components/ModelStatsDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ModelStatsDisplay.test.js +0 -343
- package/dist/src/ui/components/ModelStatsDisplay.test.js.map +0 -1
- package/dist/src/ui/components/MultiFolderTrustDialog.test.d.ts +0 -6
- package/dist/src/ui/components/MultiFolderTrustDialog.test.js +0 -162
- package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +0 -1
- package/dist/src/ui/components/NewAgentsNotification.test.d.ts +0 -6
- package/dist/src/ui/components/NewAgentsNotification.test.js +0 -48
- package/dist/src/ui/components/NewAgentsNotification.test.js.map +0 -1
- package/dist/src/ui/components/Notifications.test.d.ts +0 -6
- package/dist/src/ui/components/Notifications.test.js +0 -164
- package/dist/src/ui/components/Notifications.test.js.map +0 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +0 -6
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -162
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +0 -1
- package/dist/src/ui/components/ProQuotaDialog.test.d.ts +0 -6
- package/dist/src/ui/components/ProQuotaDialog.test.js +0 -191
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +0 -1
- package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/QueuedMessageDisplay.test.js +0 -65
- package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +0 -1
- package/dist/src/ui/components/QuittingDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/QuittingDisplay.test.js +0 -49
- package/dist/src/ui/components/QuittingDisplay.test.js.map +0 -1
- package/dist/src/ui/components/RawMarkdownIndicator.test.d.ts +0 -6
- package/dist/src/ui/components/RawMarkdownIndicator.test.js +0 -34
- package/dist/src/ui/components/RawMarkdownIndicator.test.js.map +0 -1
- package/dist/src/ui/components/RewindConfirmation.test.d.ts +0 -6
- package/dist/src/ui/components/RewindConfirmation.test.js +0 -53
- package/dist/src/ui/components/RewindConfirmation.test.js.map +0 -1
- package/dist/src/ui/components/RewindViewer.test.d.ts +0 -6
- package/dist/src/ui/components/RewindViewer.test.js +0 -241
- package/dist/src/ui/components/RewindViewer.test.js.map +0 -1
- package/dist/src/ui/components/SessionBrowser.test.d.ts +0 -6
- package/dist/src/ui/components/SessionBrowser.test.js +0 -256
- package/dist/src/ui/components/SessionBrowser.test.js.map +0 -1
- package/dist/src/ui/components/SessionSummaryDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/SessionSummaryDisplay.test.js +0 -75
- package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +0 -1
- package/dist/src/ui/components/SettingsDialog.test.d.ts +0 -6
- package/dist/src/ui/components/SettingsDialog.test.js +0 -1150
- package/dist/src/ui/components/SettingsDialog.test.js.map +0 -1
- package/dist/src/ui/components/ShellInputPrompt.test.d.ts +0 -6
- package/dist/src/ui/components/ShellInputPrompt.test.js +0 -91
- package/dist/src/ui/components/ShellInputPrompt.test.js.map +0 -1
- package/dist/src/ui/components/ShellModeIndicator.test.d.ts +0 -6
- package/dist/src/ui/components/ShellModeIndicator.test.js +0 -17
- package/dist/src/ui/components/ShellModeIndicator.test.js.map +0 -1
- package/dist/src/ui/components/ShowMoreLines.test.d.ts +0 -6
- package/dist/src/ui/components/ShowMoreLines.test.js +0 -40
- package/dist/src/ui/components/ShowMoreLines.test.js.map +0 -1
- package/dist/src/ui/components/StatsDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/StatsDisplay.test.js +0 -438
- package/dist/src/ui/components/StatsDisplay.test.js.map +0 -1
- package/dist/src/ui/components/StatusDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/StatusDisplay.test.js +0 -155
- package/dist/src/ui/components/StatusDisplay.test.js.map +0 -1
- package/dist/src/ui/components/StickyHeader.test.d.ts +0 -6
- package/dist/src/ui/components/StickyHeader.test.js +0 -17
- package/dist/src/ui/components/StickyHeader.test.js.map +0 -1
- package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/SuggestionsDisplay.test.js +0 -56
- package/dist/src/ui/components/SuggestionsDisplay.test.js.map +0 -1
- package/dist/src/ui/components/Table.test.d.ts +0 -6
- package/dist/src/ui/components/Table.test.js +0 -53
- package/dist/src/ui/components/Table.test.js.map +0 -1
- package/dist/src/ui/components/ThemeDialog.test.d.ts +0 -6
- package/dist/src/ui/components/ThemeDialog.test.js +0 -167
- package/dist/src/ui/components/ThemeDialog.test.js.map +0 -1
- package/dist/src/ui/components/ThemedGradient.test.d.ts +0 -6
- package/dist/src/ui/components/ThemedGradient.test.js +0 -30
- package/dist/src/ui/components/ThemedGradient.test.js.map +0 -1
- package/dist/src/ui/components/Tips.test.d.ts +0 -6
- package/dist/src/ui/components/Tips.test.js +0 -23
- package/dist/src/ui/components/Tips.test.js.map +0 -1
- package/dist/src/ui/components/ToolConfirmationQueue.test.d.ts +0 -6
- package/dist/src/ui/components/ToolConfirmationQueue.test.js +0 -71
- package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +0 -1
- package/dist/src/ui/components/ToolStatsDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/ToolStatsDisplay.test.js +0 -227
- package/dist/src/ui/components/ToolStatsDisplay.test.js.map +0 -1
- package/dist/src/ui/components/UpdateNotification.test.d.ts +0 -6
- package/dist/src/ui/components/UpdateNotification.test.js +0 -16
- package/dist/src/ui/components/UpdateNotification.test.js.map +0 -1
- package/dist/src/ui/components/ValidationDialog.test.d.ts +0 -6
- package/dist/src/ui/components/ValidationDialog.test.js +0 -153
- package/dist/src/ui/components/ValidationDialog.test.js.map +0 -1
- package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/CompressionMessage.test.js +0 -191
- package/dist/src/ui/components/messages/CompressionMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +0 -6
- package/dist/src/ui/components/messages/DiffRenderer.test.js +0 -240
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +0 -1
- package/dist/src/ui/components/messages/ErrorMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ErrorMessage.test.js +0 -23
- package/dist/src/ui/components/messages/ErrorMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/GeminiMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/GeminiMessage.test.js +0 -35
- package/dist/src/ui/components/messages/GeminiMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/InfoMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/InfoMessage.test.js +0 -28
- package/dist/src/ui/components/messages/InfoMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +0 -6
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +0 -33
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +0 -1
- package/dist/src/ui/components/messages/ShellToolMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ShellToolMessage.test.js +0 -123
- package/dist/src/ui/components/messages/ShellToolMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/Todo.test.d.ts +0 -6
- package/dist/src/ui/components/messages/Todo.test.js +0 -114
- package/dist/src/ui/components/messages/Todo.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -232
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +0 -529
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolMessage.test.js +0 -217
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolMessageFocusHint.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js +0 -89
- package/dist/src/ui/components/messages/ToolMessageFocusHint.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +0 -62
- package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js +0 -114
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +0 -1
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +0 -6
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +0 -134
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +0 -1
- package/dist/src/ui/components/messages/UserMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/UserMessage.test.js +0 -32
- package/dist/src/ui/components/messages/UserMessage.test.js.map +0 -1
- package/dist/src/ui/components/messages/WarningMessage.test.d.ts +0 -6
- package/dist/src/ui/components/messages/WarningMessage.test.js +0 -23
- package/dist/src/ui/components/messages/WarningMessage.test.js.map +0 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +0 -6
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +0 -386
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +0 -1
- package/dist/src/ui/components/shared/BaseSettingsDialog.test.d.ts +0 -6
- package/dist/src/ui/components/shared/BaseSettingsDialog.test.js +0 -434
- package/dist/src/ui/components/shared/BaseSettingsDialog.test.js.map +0 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +0 -6
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +0 -79
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +0 -1
- package/dist/src/ui/components/shared/EnumSelector.test.d.ts +0 -6
- package/dist/src/ui/components/shared/EnumSelector.test.js +0 -70
- package/dist/src/ui/components/shared/EnumSelector.test.js.map +0 -1
- package/dist/src/ui/components/shared/ExpandableText.test.d.ts +0 -6
- package/dist/src/ui/components/shared/ExpandableText.test.js +0 -88
- package/dist/src/ui/components/shared/ExpandableText.test.js.map +0 -1
- package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -6
- package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +0 -34
- package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +0 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +0 -6
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +0 -90
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +0 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +0 -6
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +0 -134
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +0 -1
- package/dist/src/ui/components/shared/Scrollable.test.d.ts +0 -6
- package/dist/src/ui/components/shared/Scrollable.test.js +0 -74
- package/dist/src/ui/components/shared/Scrollable.test.js.map +0 -1
- package/dist/src/ui/components/shared/ScrollableList.test.d.ts +0 -6
- package/dist/src/ui/components/shared/ScrollableList.test.js +0 -241
- package/dist/src/ui/components/shared/ScrollableList.test.js.map +0 -1
- package/dist/src/ui/components/shared/TabHeader.test.d.ts +0 -6
- package/dist/src/ui/components/shared/TabHeader.test.js +0 -106
- package/dist/src/ui/components/shared/TabHeader.test.js.map +0 -1
- package/dist/src/ui/components/shared/TextInput.test.d.ts +0 -6
- package/dist/src/ui/components/shared/TextInput.test.js +0 -242
- package/dist/src/ui/components/shared/TextInput.test.js.map +0 -1
- package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +0 -6
- package/dist/src/ui/components/shared/VirtualizedList.test.js +0 -171
- package/dist/src/ui/components/shared/VirtualizedList.test.js.map +0 -1
- package/dist/src/ui/components/shared/performance.test.d.ts +0 -1
- package/dist/src/ui/components/shared/performance.test.js +0 -67
- package/dist/src/ui/components/shared/performance.test.js.map +0 -1
- package/dist/src/ui/components/shared/text-buffer.test.d.ts +0 -6
- package/dist/src/ui/components/shared/text-buffer.test.js +0 -2490
- package/dist/src/ui/components/shared/text-buffer.test.js.map +0 -1
- package/dist/src/ui/components/shared/vim-buffer-actions.test.d.ts +0 -6
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js +0 -964
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +0 -1
- package/dist/src/ui/components/views/ChatList.test.d.ts +0 -6
- package/dist/src/ui/components/views/ChatList.test.js +0 -45
- package/dist/src/ui/components/views/ChatList.test.js.map +0 -1
- package/dist/src/ui/components/views/ExtensionsList.test.d.ts +0 -6
- package/dist/src/ui/components/views/ExtensionsList.test.js +0 -148
- package/dist/src/ui/components/views/ExtensionsList.test.js.map +0 -1
- package/dist/src/ui/components/views/McpStatus.test.d.ts +0 -6
- package/dist/src/ui/components/views/McpStatus.test.js +0 -153
- package/dist/src/ui/components/views/McpStatus.test.js.map +0 -1
- package/dist/src/ui/components/views/SkillsList.test.d.ts +0 -6
- package/dist/src/ui/components/views/SkillsList.test.js +0 -97
- package/dist/src/ui/components/views/SkillsList.test.js.map +0 -1
- package/dist/src/ui/components/views/ToolsList.test.d.ts +0 -6
- package/dist/src/ui/components/views/ToolsList.test.js +0 -45
- package/dist/src/ui/components/views/ToolsList.test.js.map +0 -1
- package/dist/src/ui/contexts/KeypressContext.test.d.ts +0 -6
- package/dist/src/ui/contexts/KeypressContext.test.js +0 -957
- package/dist/src/ui/contexts/KeypressContext.test.js.map +0 -1
- package/dist/src/ui/contexts/MouseContext.test.d.ts +0 -6
- package/dist/src/ui/contexts/MouseContext.test.js +0 -198
- package/dist/src/ui/contexts/MouseContext.test.js.map +0 -1
- package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +0 -6
- package/dist/src/ui/contexts/ScrollProvider.drag.test.js +0 -319
- package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +0 -1
- package/dist/src/ui/contexts/ScrollProvider.test.d.ts +0 -6
- package/dist/src/ui/contexts/ScrollProvider.test.js +0 -377
- package/dist/src/ui/contexts/ScrollProvider.test.js.map +0 -1
- package/dist/src/ui/contexts/SessionContext.test.d.ts +0 -6
- package/dist/src/ui/contexts/SessionContext.test.js +0 -198
- package/dist/src/ui/contexts/SessionContext.test.js.map +0 -1
- package/dist/src/ui/contexts/ToolActionsContext.test.d.ts +0 -6
- package/dist/src/ui/contexts/ToolActionsContext.test.js +0 -166
- package/dist/src/ui/contexts/ToolActionsContext.test.js.map +0 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +0 -6
- package/dist/src/ui/hooks/atCommandProcessor.test.js +0 -1032
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +0 -1
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +0 -6
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +0 -183
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +0 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +0 -6
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +0 -521
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +0 -1
- package/dist/src/ui/hooks/slashCommandProcessor.test.d.ts +0 -6
- package/dist/src/ui/hooks/slashCommandProcessor.test.js +0 -796
- package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +0 -1
- package/dist/src/ui/hooks/toolMapping.test.d.ts +0 -6
- package/dist/src/ui/hooks/toolMapping.test.js +0 -209
- package/dist/src/ui/hooks/toolMapping.test.js.map +0 -1
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +0 -6
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +0 -85
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +0 -1
- package/dist/src/ui/hooks/useApprovalModeIndicator.test.d.ts +0 -6
- package/dist/src/ui/hooks/useApprovalModeIndicator.test.js +0 -435
- package/dist/src/ui/hooks/useApprovalModeIndicator.test.js.map +0 -1
- package/dist/src/ui/hooks/useAtCompletion.test.d.ts +0 -6
- package/dist/src/ui/hooks/useAtCompletion.test.js +0 -417
- package/dist/src/ui/hooks/useAtCompletion.test.js.map +0 -1
- package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +0 -6
- package/dist/src/ui/hooks/useAtCompletion_agents.test.js +0 -87
- package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +0 -1
- package/dist/src/ui/hooks/useBanner.test.d.ts +0 -6
- package/dist/src/ui/hooks/useBanner.test.js +0 -92
- package/dist/src/ui/hooks/useBanner.test.js.map +0 -1
- package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +0 -6
- package/dist/src/ui/hooks/useBatchedScroll.test.js +0 -62
- package/dist/src/ui/hooks/useBatchedScroll.test.js.map +0 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.d.ts +0 -6
- package/dist/src/ui/hooks/useCommandCompletion.test.js +0 -462
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +0 -1
- package/dist/src/ui/hooks/useConsoleMessages.test.d.ts +0 -6
- package/dist/src/ui/hooks/useConsoleMessages.test.js +0 -159
- package/dist/src/ui/hooks/useConsoleMessages.test.js.map +0 -1
- package/dist/src/ui/hooks/useEditorSettings.test.d.ts +0 -6
- package/dist/src/ui/hooks/useEditorSettings.test.js +0 -179
- package/dist/src/ui/hooks/useEditorSettings.test.js.map +0 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +0 -6
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +0 -279
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +0 -1
- package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +0 -6
- package/dist/src/ui/hooks/useFlickerDetector.test.js +0 -106
- package/dist/src/ui/hooks/useFlickerDetector.test.js.map +0 -1
- package/dist/src/ui/hooks/useFocus.test.d.ts +0 -6
- package/dist/src/ui/hooks/useFocus.test.js +0 -131
- package/dist/src/ui/hooks/useFocus.test.js.map +0 -1
- package/dist/src/ui/hooks/useFolderTrust.test.d.ts +0 -6
- package/dist/src/ui/hooks/useFolderTrust.test.js +0 -218
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +0 -1
- package/dist/src/ui/hooks/useGeminiStream.test.d.ts +0 -6
- package/dist/src/ui/hooks/useGeminiStream.test.js +0 -2149
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +0 -1
- package/dist/src/ui/hooks/useGitBranchName.test.d.ts +0 -6
- package/dist/src/ui/hooks/useGitBranchName.test.js +0 -183
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +0 -1
- package/dist/src/ui/hooks/useHistoryManager.test.d.ts +0 -6
- package/dist/src/ui/hooks/useHistoryManager.test.js +0 -188
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +0 -1
- package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +0 -6
- package/dist/src/ui/hooks/useHookDisplayState.test.js +0 -180
- package/dist/src/ui/hooks/useHookDisplayState.test.js.map +0 -1
- package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +0 -6
- package/dist/src/ui/hooks/useIdeTrustListener.test.js +0 -214
- package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +0 -1
- package/dist/src/ui/hooks/useIncludeDirsTrust.test.d.ts +0 -6
- package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +0 -172
- package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +0 -1
- package/dist/src/ui/hooks/useInputHistory.test.d.ts +0 -6
- package/dist/src/ui/hooks/useInputHistory.test.js +0 -208
- package/dist/src/ui/hooks/useInputHistory.test.js.map +0 -1
- package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +0 -6
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +0 -238
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +0 -1
- package/dist/src/ui/hooks/useKeypress.test.d.ts +0 -6
- package/dist/src/ui/hooks/useKeypress.test.js +0 -205
- package/dist/src/ui/hooks/useKeypress.test.js.map +0 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +0 -6
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +0 -145
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +0 -1
- package/dist/src/ui/hooks/useMcpStatus.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMcpStatus.test.js +0 -69
- package/dist/src/ui/hooks/useMcpStatus.test.js.map +0 -1
- package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMemoryMonitor.test.js +0 -62
- package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +0 -1
- package/dist/src/ui/hooks/useMessageQueue.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMessageQueue.test.js +0 -327
- package/dist/src/ui/hooks/useMessageQueue.test.js.map +0 -1
- package/dist/src/ui/hooks/useModelCommand.test.d.ts +0 -6
- package/dist/src/ui/hooks/useModelCommand.test.js +0 -45
- package/dist/src/ui/hooks/useModelCommand.test.js.map +0 -1
- package/dist/src/ui/hooks/useMouse.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMouse.test.js +0 -57
- package/dist/src/ui/hooks/useMouse.test.js.map +0 -1
- package/dist/src/ui/hooks/useMouseClick.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMouseClick.test.js +0 -59
- package/dist/src/ui/hooks/useMouseClick.test.js.map +0 -1
- package/dist/src/ui/hooks/useMouseDoubleClick.test.d.ts +0 -6
- package/dist/src/ui/hooks/useMouseDoubleClick.test.js +0 -125
- package/dist/src/ui/hooks/useMouseDoubleClick.test.js.map +0 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +0 -6
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +0 -291
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +0 -1
- package/dist/src/ui/hooks/usePhraseCycler.test.d.ts +0 -6
- package/dist/src/ui/hooks/usePhraseCycler.test.js +0 -208
- package/dist/src/ui/hooks/usePhraseCycler.test.js.map +0 -1
- package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +0 -6
- package/dist/src/ui/hooks/usePrivacySettings.test.js +0 -104
- package/dist/src/ui/hooks/usePrivacySettings.test.js.map +0 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +0 -6
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +0 -477
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +0 -1
- package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +0 -6
- package/dist/src/ui/hooks/useReactToolScheduler.test.js +0 -58
- package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +0 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +0 -6
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +0 -169
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +0 -1
- package/dist/src/ui/hooks/useRewind.test.d.ts +0 -6
- package/dist/src/ui/hooks/useRewind.test.js +0 -100
- package/dist/src/ui/hooks/useRewind.test.js.map +0 -1
- package/dist/src/ui/hooks/useSelectionList.test.d.ts +0 -6
- package/dist/src/ui/hooks/useSelectionList.test.js +0 -848
- package/dist/src/ui/hooks/useSelectionList.test.js.map +0 -1
- package/dist/src/ui/hooks/useSessionBrowser.test.d.ts +0 -6
- package/dist/src/ui/hooks/useSessionBrowser.test.js +0 -203
- package/dist/src/ui/hooks/useSessionBrowser.test.js.map +0 -1
- package/dist/src/ui/hooks/useSessionResume.test.d.ts +0 -6
- package/dist/src/ui/hooks/useSessionResume.test.js +0 -336
- package/dist/src/ui/hooks/useSessionResume.test.js.map +0 -1
- package/dist/src/ui/hooks/useShellHistory.test.d.ts +0 -6
- package/dist/src/ui/hooks/useShellHistory.test.js +0 -223
- package/dist/src/ui/hooks/useShellHistory.test.js.map +0 -1
- package/dist/src/ui/hooks/useShellInactivityStatus.test.d.ts +0 -6
- package/dist/src/ui/hooks/useShellInactivityStatus.test.js +0 -84
- package/dist/src/ui/hooks/useShellInactivityStatus.test.js.map +0 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +0 -9
- package/dist/src/ui/hooks/useSlashCompletion.test.js +0 -845
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +0 -1
- package/dist/src/ui/hooks/useSnowfall.test.d.ts +0 -6
- package/dist/src/ui/hooks/useSnowfall.test.js +0 -88
- package/dist/src/ui/hooks/useSnowfall.test.js.map +0 -1
- package/dist/src/ui/hooks/useTabbedNavigation.test.d.ts +0 -6
- package/dist/src/ui/hooks/useTabbedNavigation.test.js +0 -187
- package/dist/src/ui/hooks/useTabbedNavigation.test.js.map +0 -1
- package/dist/src/ui/hooks/useTimer.test.d.ts +0 -6
- package/dist/src/ui/hooks/useTimer.test.js +0 -119
- package/dist/src/ui/hooks/useTimer.test.js.map +0 -1
- package/dist/src/ui/hooks/useTips.test.d.ts +0 -6
- package/dist/src/ui/hooks/useTips.test.js +0 -33
- package/dist/src/ui/hooks/useTips.test.js.map +0 -1
- package/dist/src/ui/hooks/useToolExecutionScheduler.test.d.ts +0 -6
- package/dist/src/ui/hooks/useToolExecutionScheduler.test.js +0 -376
- package/dist/src/ui/hooks/useToolExecutionScheduler.test.js.map +0 -1
- package/dist/src/ui/hooks/useToolScheduler.test.d.ts +0 -6
- package/dist/src/ui/hooks/useToolScheduler.test.js +0 -881
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +0 -1
- package/dist/src/ui/hooks/useToolSchedulerFacade.test.d.ts +0 -6
- package/dist/src/ui/hooks/useToolSchedulerFacade.test.js +0 -45
- package/dist/src/ui/hooks/useToolSchedulerFacade.test.js.map +0 -1
- package/dist/src/ui/hooks/useTurnActivityMonitor.test.d.ts +0 -6
- package/dist/src/ui/hooks/useTurnActivityMonitor.test.js +0 -97
- package/dist/src/ui/hooks/useTurnActivityMonitor.test.js.map +0 -1
- package/dist/src/ui/hooks/vim.test.d.ts +0 -6
- package/dist/src/ui/hooks/vim.test.js +0 -1384
- package/dist/src/ui/hooks/vim.test.js.map +0 -1
- package/dist/src/ui/keyMatchers.test.d.ts +0 -6
- package/dist/src/ui/keyMatchers.test.js +0 -386
- package/dist/src/ui/keyMatchers.test.js.map +0 -1
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.d.ts +0 -6
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js +0 -121
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.test.js.map +0 -1
- package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.d.ts +0 -6
- package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js +0 -34
- package/dist/src/ui/privacy/CloudPaidPrivacyNotice.test.js.map +0 -1
- package/dist/src/ui/privacy/GeminiPrivacyNotice.test.d.ts +0 -6
- package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js +0 -34
- package/dist/src/ui/privacy/GeminiPrivacyNotice.test.js.map +0 -1
- package/dist/src/ui/privacy/PrivacyNotice.test.d.ts +0 -6
- package/dist/src/ui/privacy/PrivacyNotice.test.js +0 -62
- package/dist/src/ui/privacy/PrivacyNotice.test.js.map +0 -1
- package/dist/src/ui/state/extensions.test.d.ts +0 -6
- package/dist/src/ui/state/extensions.test.js +0 -219
- package/dist/src/ui/state/extensions.test.js.map +0 -1
- package/dist/src/ui/themes/color-utils.test.d.ts +0 -6
- package/dist/src/ui/themes/color-utils.test.js +0 -245
- package/dist/src/ui/themes/color-utils.test.js.map +0 -1
- package/dist/src/ui/themes/theme-manager.test.d.ts +0 -6
- package/dist/src/ui/themes/theme-manager.test.js +0 -150
- package/dist/src/ui/themes/theme-manager.test.js.map +0 -1
- package/dist/src/ui/themes/theme.test.d.ts +0 -6
- package/dist/src/ui/themes/theme.test.js +0 -174
- package/dist/src/ui/themes/theme.test.js.map +0 -1
- package/dist/src/ui/utils/CodeColorizer.test.d.ts +0 -6
- package/dist/src/ui/utils/CodeColorizer.test.js +0 -38
- package/dist/src/ui/utils/CodeColorizer.test.js.map +0 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +0 -6
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +0 -21
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +0 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +0 -6
- package/dist/src/ui/utils/MarkdownDisplay.test.js +0 -159
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +0 -1
- package/dist/src/ui/utils/clipboardUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/clipboardUtils.test.js +0 -359
- package/dist/src/ui/utils/clipboardUtils.test.js.map +0 -1
- package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +0 -6
- package/dist/src/ui/utils/clipboardUtils.windows.test.js +0 -55
- package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +0 -1
- package/dist/src/ui/utils/commandUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/commandUtils.test.js +0 -479
- package/dist/src/ui/utils/commandUtils.test.js.map +0 -1
- package/dist/src/ui/utils/computeStats.test.d.ts +0 -6
- package/dist/src/ui/utils/computeStats.test.js +0 -271
- package/dist/src/ui/utils/computeStats.test.js.map +0 -1
- package/dist/src/ui/utils/directoryUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/directoryUtils.test.js +0 -244
- package/dist/src/ui/utils/directoryUtils.test.js.map +0 -1
- package/dist/src/ui/utils/displayUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/displayUtils.test.js +0 -61
- package/dist/src/ui/utils/displayUtils.test.js.map +0 -1
- package/dist/src/ui/utils/formatters.test.d.ts +0 -6
- package/dist/src/ui/utils/formatters.test.js +0 -124
- package/dist/src/ui/utils/formatters.test.js.map +0 -1
- package/dist/src/ui/utils/highlight.test.d.ts +0 -6
- package/dist/src/ui/utils/highlight.test.js +0 -198
- package/dist/src/ui/utils/highlight.test.js.map +0 -1
- package/dist/src/ui/utils/input.test.d.ts +0 -6
- package/dist/src/ui/utils/input.test.js +0 -44
- package/dist/src/ui/utils/input.test.js.map +0 -1
- package/dist/src/ui/utils/markdownUtilities.test.d.ts +0 -6
- package/dist/src/ui/utils/markdownUtilities.test.js +0 -42
- package/dist/src/ui/utils/markdownUtilities.test.js.map +0 -1
- package/dist/src/ui/utils/mouse.test.d.ts +0 -6
- package/dist/src/ui/utils/mouse.test.js +0 -136
- package/dist/src/ui/utils/mouse.test.js.map +0 -1
- package/dist/src/ui/utils/rewindFileOps.test.d.ts +0 -6
- package/dist/src/ui/utils/rewindFileOps.test.js +0 -375
- package/dist/src/ui/utils/rewindFileOps.test.js.map +0 -1
- package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +0 -6
- package/dist/src/ui/utils/terminalCapabilityManager.test.js +0 -220
- package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +0 -1
- package/dist/src/ui/utils/terminalSetup.test.d.ts +0 -6
- package/dist/src/ui/utils/terminalSetup.test.js +0 -147
- package/dist/src/ui/utils/terminalSetup.test.js.map +0 -1
- package/dist/src/ui/utils/terminalUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/terminalUtils.test.js +0 -40
- package/dist/src/ui/utils/terminalUtils.test.js.map +0 -1
- package/dist/src/ui/utils/textOutput.test.d.ts +0 -6
- package/dist/src/ui/utils/textOutput.test.js +0 -79
- package/dist/src/ui/utils/textOutput.test.js.map +0 -1
- package/dist/src/ui/utils/textUtils.test.d.ts +0 -6
- package/dist/src/ui/utils/textUtils.test.js +0 -168
- package/dist/src/ui/utils/textUtils.test.js.map +0 -1
- package/dist/src/ui/utils/ui-sizing.test.d.ts +0 -6
- package/dist/src/ui/utils/ui-sizing.test.js +0 -38
- package/dist/src/ui/utils/ui-sizing.test.js.map +0 -1
- package/dist/src/ui/utils/updateCheck.test.d.ts +0 -6
- package/dist/src/ui/utils/updateCheck.test.js +0 -134
- package/dist/src/ui/utils/updateCheck.test.js.map +0 -1
- package/dist/src/utils/agentUtils.test.d.ts +0 -6
- package/dist/src/utils/agentUtils.test.js +0 -121
- package/dist/src/utils/agentUtils.test.js.map +0 -1
- package/dist/src/utils/checks.test.d.ts +0 -6
- package/dist/src/utils/checks.test.js +0 -29
- package/dist/src/utils/checks.test.js.map +0 -1
- package/dist/src/utils/cleanup.test.d.ts +0 -6
- package/dist/src/utils/cleanup.test.js +0 -92
- package/dist/src/utils/cleanup.test.js.map +0 -1
- package/dist/src/utils/commands.test.d.ts +0 -6
- package/dist/src/utils/commands.test.js +0 -115
- package/dist/src/utils/commands.test.js.map +0 -1
- package/dist/src/utils/commentJson.test.d.ts +0 -6
- package/dist/src/utils/commentJson.test.js +0 -308
- package/dist/src/utils/commentJson.test.js.map +0 -1
- package/dist/src/utils/deepMerge.test.d.ts +0 -6
- package/dist/src/utils/deepMerge.test.js +0 -201
- package/dist/src/utils/deepMerge.test.js.map +0 -1
- package/dist/src/utils/dialogScopeUtils.test.d.ts +0 -6
- package/dist/src/utils/dialogScopeUtils.test.js +0 -81
- package/dist/src/utils/dialogScopeUtils.test.js.map +0 -1
- package/dist/src/utils/envVarResolver.test.d.ts +0 -6
- package/dist/src/utils/envVarResolver.test.js +0 -221
- package/dist/src/utils/envVarResolver.test.js.map +0 -1
- package/dist/src/utils/errors.test.d.ts +0 -6
- package/dist/src/utils/errors.test.js +0 -435
- package/dist/src/utils/errors.test.js.map +0 -1
- package/dist/src/utils/events.test.d.ts +0 -6
- package/dist/src/utils/events.test.js +0 -24
- package/dist/src/utils/events.test.js.map +0 -1
- package/dist/src/utils/gitUtils.test.d.ts +0 -6
- package/dist/src/utils/gitUtils.test.js +0 -113
- package/dist/src/utils/gitUtils.test.js.map +0 -1
- package/dist/src/utils/handleAutoUpdate.test.d.ts +0 -6
- package/dist/src/utils/handleAutoUpdate.test.js +0 -310
- package/dist/src/utils/handleAutoUpdate.test.js.map +0 -1
- package/dist/src/utils/installationInfo.test.d.ts +0 -6
- package/dist/src/utils/installationInfo.test.js +0 -296
- package/dist/src/utils/installationInfo.test.js.map +0 -1
- package/dist/src/utils/jsonoutput.test.d.ts +0 -6
- package/dist/src/utils/jsonoutput.test.js +0 -74
- package/dist/src/utils/jsonoutput.test.js.map +0 -1
- package/dist/src/utils/math.test.d.ts +0 -6
- package/dist/src/utils/math.test.js +0 -23
- package/dist/src/utils/math.test.js.map +0 -1
- package/dist/src/utils/persistentState.test.d.ts +0 -6
- package/dist/src/utils/persistentState.test.js +0 -68
- package/dist/src/utils/persistentState.test.js.map +0 -1
- package/dist/src/utils/processUtils.test.d.ts +0 -6
- package/dist/src/utils/processUtils.test.js +0 -20
- package/dist/src/utils/processUtils.test.js.map +0 -1
- package/dist/src/utils/readStdin.test.d.ts +0 -6
- package/dist/src/utils/readStdin.test.js +0 -117
- package/dist/src/utils/readStdin.test.js.map +0 -1
- package/dist/src/utils/readStdin_safety.test.d.ts +0 -6
- package/dist/src/utils/readStdin_safety.test.js +0 -68
- package/dist/src/utils/readStdin_safety.test.js.map +0 -1
- package/dist/src/utils/relaunch.test.d.ts +0 -6
- package/dist/src/utils/relaunch.test.js +0 -279
- package/dist/src/utils/relaunch.test.js.map +0 -1
- package/dist/src/utils/resolvePath.test.d.ts +0 -6
- package/dist/src/utils/resolvePath.test.js +0 -34
- package/dist/src/utils/resolvePath.test.js.map +0 -1
- package/dist/src/utils/sandbox.test.d.ts +0 -6
- package/dist/src/utils/sandbox.test.js +0 -314
- package/dist/src/utils/sandbox.test.js.map +0 -1
- package/dist/src/utils/sandboxUtils.test.d.ts +0 -6
- package/dist/src/utils/sandboxUtils.test.js +0 -122
- package/dist/src/utils/sandboxUtils.test.js.map +0 -1
- package/dist/src/utils/sessionCleanup.integration.test.d.ts +0 -6
- package/dist/src/utils/sessionCleanup.integration.test.js +0 -182
- package/dist/src/utils/sessionCleanup.integration.test.js.map +0 -1
- package/dist/src/utils/sessionCleanup.test.d.ts +0 -6
- package/dist/src/utils/sessionCleanup.test.js +0 -1298
- package/dist/src/utils/sessionCleanup.test.js.map +0 -1
- package/dist/src/utils/sessionUtils.test.d.ts +0 -6
- package/dist/src/utils/sessionUtils.test.js +0 -503
- package/dist/src/utils/sessionUtils.test.js.map +0 -1
- package/dist/src/utils/sessions.test.d.ts +0 -6
- package/dist/src/utils/sessions.test.js +0 -581
- package/dist/src/utils/sessions.test.js.map +0 -1
- package/dist/src/utils/settingsUtils.test.d.ts +0 -6
- package/dist/src/utils/settingsUtils.test.js +0 -808
- package/dist/src/utils/settingsUtils.test.js.map +0 -1
- package/dist/src/utils/skillUtils.test.d.ts +0 -6
- package/dist/src/utils/skillUtils.test.js +0 -70
- package/dist/src/utils/skillUtils.test.js.map +0 -1
- package/dist/src/utils/startupWarnings.test.d.ts +0 -6
- package/dist/src/utils/startupWarnings.test.js +0 -61
- package/dist/src/utils/startupWarnings.test.js.map +0 -1
- package/dist/src/utils/updateEventEmitter.test.d.ts +0 -6
- package/dist/src/utils/updateEventEmitter.test.js +0 -18
- package/dist/src/utils/updateEventEmitter.test.js.map +0 -1
- package/dist/src/utils/userStartupWarnings.test.d.ts +0 -6
- package/dist/src/utils/userStartupWarnings.test.js +0 -98
- package/dist/src/utils/userStartupWarnings.test.js.map +0 -1
- package/dist/src/utils/windowTitle.test.d.ts +0 -6
- package/dist/src/utils/windowTitle.test.js +0 -216
- package/dist/src/utils/windowTitle.test.js.map +0 -1
- package/dist/src/validateNonInterActiveAuth.test.d.ts +0 -6
- package/dist/src/validateNonInterActiveAuth.test.js +0 -319
- package/dist/src/validateNonInterActiveAuth.test.js.map +0 -1
- package/dist/src/zed-integration/fileSystemService.test.d.ts +0 -6
- package/dist/src/zed-integration/fileSystemService.test.js +0 -88
- package/dist/src/zed-integration/fileSystemService.test.js.map +0 -1
- package/dist/src/zed-integration/zedIntegration.test.d.ts +0 -6
- package/dist/src/zed-integration/zedIntegration.test.js +0 -625
- package/dist/src/zed-integration/zedIntegration.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,2072 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2025 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
8
|
-
import { render } from '../test-utils/render.js';
|
|
9
|
-
import { waitFor } from '../test-utils/async.js';
|
|
10
|
-
import { cleanup } from 'ink-testing-library';
|
|
11
|
-
import { act, useContext } from 'react';
|
|
12
|
-
import { AppContainer } from './AppContainer.js';
|
|
13
|
-
import { SettingsContext } from './contexts/SettingsContext.js';
|
|
14
|
-
import {} from './hooks/useReactToolScheduler.js';
|
|
15
|
-
import { makeFakeConfig, CoreEvent, AuthType, } from '@didim365/agent-cli-core';
|
|
16
|
-
// Mock coreEvents
|
|
17
|
-
const mockCoreEvents = vi.hoisted(() => ({
|
|
18
|
-
on: vi.fn(),
|
|
19
|
-
off: vi.fn(),
|
|
20
|
-
drainBacklogs: vi.fn(),
|
|
21
|
-
emit: vi.fn(),
|
|
22
|
-
}));
|
|
23
|
-
// Mock IdeClient
|
|
24
|
-
const mockIdeClient = vi.hoisted(() => ({
|
|
25
|
-
getInstance: vi.fn().mockReturnValue(new Promise(() => { })),
|
|
26
|
-
}));
|
|
27
|
-
// Mock stdout
|
|
28
|
-
const mocks = vi.hoisted(() => ({
|
|
29
|
-
mockStdout: { write: vi.fn() },
|
|
30
|
-
}));
|
|
31
|
-
vi.mock('@didim365/agent-cli-core', async (importOriginal) => {
|
|
32
|
-
const actual = await importOriginal();
|
|
33
|
-
return {
|
|
34
|
-
...actual,
|
|
35
|
-
coreEvents: mockCoreEvents,
|
|
36
|
-
IdeClient: mockIdeClient,
|
|
37
|
-
writeToStdout: vi.fn((...args) => process.stdout.write(...args)),
|
|
38
|
-
writeToStderr: vi.fn((...args) => process.stderr.write(...args)),
|
|
39
|
-
patchStdio: vi.fn(() => () => { }),
|
|
40
|
-
createWorkingStdio: vi.fn(() => ({
|
|
41
|
-
stdout: process.stdout,
|
|
42
|
-
stderr: process.stderr,
|
|
43
|
-
})),
|
|
44
|
-
enableMouseEvents: vi.fn(),
|
|
45
|
-
disableMouseEvents: vi.fn(),
|
|
46
|
-
FileDiscoveryService: vi.fn().mockImplementation(() => ({
|
|
47
|
-
initialize: vi.fn(),
|
|
48
|
-
})),
|
|
49
|
-
startupProfiler: {
|
|
50
|
-
flush: vi.fn(),
|
|
51
|
-
start: vi.fn(),
|
|
52
|
-
end: vi.fn(),
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
import ansiEscapes from 'ansi-escapes';
|
|
57
|
-
import { mergeSettings } from '../config/settings.js';
|
|
58
|
-
import { useQuotaAndFallback } from './hooks/useQuotaAndFallback.js';
|
|
59
|
-
import { UIStateContext } from './contexts/UIStateContext.js';
|
|
60
|
-
import { UIActionsContext, } from './contexts/UIActionsContext.js';
|
|
61
|
-
// Mock useStdout to capture terminal title writes
|
|
62
|
-
vi.mock('ink', async (importOriginal) => {
|
|
63
|
-
const actual = await importOriginal();
|
|
64
|
-
return {
|
|
65
|
-
...actual,
|
|
66
|
-
useStdout: () => ({ stdout: mocks.mockStdout }),
|
|
67
|
-
measureElement: vi.fn(),
|
|
68
|
-
};
|
|
69
|
-
});
|
|
70
|
-
// Helper component will read the context values provided by AppContainer
|
|
71
|
-
// so we can assert against them in our tests.
|
|
72
|
-
let capturedUIState;
|
|
73
|
-
let capturedUIActions;
|
|
74
|
-
function TestContextConsumer() {
|
|
75
|
-
capturedUIState = useContext(UIStateContext);
|
|
76
|
-
capturedUIActions = useContext(UIActionsContext);
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
vi.mock('./App.js', () => ({
|
|
80
|
-
App: TestContextConsumer,
|
|
81
|
-
}));
|
|
82
|
-
vi.mock('./hooks/useQuotaAndFallback.js');
|
|
83
|
-
vi.mock('./hooks/useHistoryManager.js');
|
|
84
|
-
vi.mock('./hooks/useThemeCommand.js');
|
|
85
|
-
vi.mock('./auth/useAuth.js');
|
|
86
|
-
vi.mock('./hooks/useEditorSettings.js');
|
|
87
|
-
vi.mock('./hooks/useSettingsCommand.js');
|
|
88
|
-
vi.mock('./hooks/useModelCommand.js');
|
|
89
|
-
vi.mock('./hooks/slashCommandProcessor.js');
|
|
90
|
-
vi.mock('./hooks/useConsoleMessages.js');
|
|
91
|
-
vi.mock('./hooks/useTerminalSize.js', () => ({
|
|
92
|
-
useTerminalSize: vi.fn(() => ({ columns: 80, rows: 24 })),
|
|
93
|
-
}));
|
|
94
|
-
vi.mock('./hooks/useGeminiStream.js');
|
|
95
|
-
vi.mock('./hooks/vim.js');
|
|
96
|
-
vi.mock('./hooks/useFocus.js');
|
|
97
|
-
vi.mock('./hooks/useBracketedPaste.js');
|
|
98
|
-
vi.mock('./hooks/useKeypress.js');
|
|
99
|
-
vi.mock('./hooks/useLoadingIndicator.js');
|
|
100
|
-
vi.mock('./hooks/useFolderTrust.js');
|
|
101
|
-
vi.mock('./hooks/useIdeTrustListener.js');
|
|
102
|
-
vi.mock('./hooks/useMessageQueue.js');
|
|
103
|
-
vi.mock('./hooks/useApprovalModeIndicator.js');
|
|
104
|
-
vi.mock('./hooks/useGitBranchName.js');
|
|
105
|
-
vi.mock('./contexts/VimModeContext.js');
|
|
106
|
-
vi.mock('./contexts/SessionContext.js');
|
|
107
|
-
vi.mock('./components/shared/text-buffer.js');
|
|
108
|
-
vi.mock('./hooks/useLogger.js');
|
|
109
|
-
vi.mock('./hooks/useInputHistoryStore.js');
|
|
110
|
-
vi.mock('./hooks/useHookDisplayState.js');
|
|
111
|
-
// Mock external utilities
|
|
112
|
-
vi.mock('../utils/events.js');
|
|
113
|
-
vi.mock('../utils/handleAutoUpdate.js');
|
|
114
|
-
vi.mock('./utils/ConsolePatcher.js');
|
|
115
|
-
vi.mock('../utils/cleanup.js');
|
|
116
|
-
import { useHistory } from './hooks/useHistoryManager.js';
|
|
117
|
-
import { useThemeCommand } from './hooks/useThemeCommand.js';
|
|
118
|
-
import { useAuthCommand } from './auth/useAuth.js';
|
|
119
|
-
import { useEditorSettings } from './hooks/useEditorSettings.js';
|
|
120
|
-
import { useSettingsCommand } from './hooks/useSettingsCommand.js';
|
|
121
|
-
import { useModelCommand } from './hooks/useModelCommand.js';
|
|
122
|
-
import { useSlashCommandProcessor } from './hooks/slashCommandProcessor.js';
|
|
123
|
-
import { useConsoleMessages } from './hooks/useConsoleMessages.js';
|
|
124
|
-
import { useGeminiStream } from './hooks/useGeminiStream.js';
|
|
125
|
-
import { useVim } from './hooks/vim.js';
|
|
126
|
-
import { useFolderTrust } from './hooks/useFolderTrust.js';
|
|
127
|
-
import { useIdeTrustListener } from './hooks/useIdeTrustListener.js';
|
|
128
|
-
import { useMessageQueue } from './hooks/useMessageQueue.js';
|
|
129
|
-
import { useApprovalModeIndicator } from './hooks/useApprovalModeIndicator.js';
|
|
130
|
-
import { useGitBranchName } from './hooks/useGitBranchName.js';
|
|
131
|
-
import { useVimMode } from './contexts/VimModeContext.js';
|
|
132
|
-
import { useSessionStats } from './contexts/SessionContext.js';
|
|
133
|
-
import { useTextBuffer } from './components/shared/text-buffer.js';
|
|
134
|
-
import { useLogger } from './hooks/useLogger.js';
|
|
135
|
-
import { useLoadingIndicator } from './hooks/useLoadingIndicator.js';
|
|
136
|
-
import { useInputHistoryStore } from './hooks/useInputHistoryStore.js';
|
|
137
|
-
import { useHookDisplayState } from './hooks/useHookDisplayState.js';
|
|
138
|
-
import { useKeypress } from './hooks/useKeypress.js';
|
|
139
|
-
import { measureElement } from 'ink';
|
|
140
|
-
import { useTerminalSize } from './hooks/useTerminalSize.js';
|
|
141
|
-
import { ShellExecutionService, writeToStdout, enableMouseEvents, disableMouseEvents, } from '@didim365/agent-cli-core';
|
|
142
|
-
import {} from '../config/extension-manager.js';
|
|
143
|
-
describe('AppContainer State Management', () => {
|
|
144
|
-
let mockConfig;
|
|
145
|
-
let mockSettings;
|
|
146
|
-
let mockInitResult;
|
|
147
|
-
let mockExtensionManager;
|
|
148
|
-
// Helper to generate the AppContainer JSX for render and rerender
|
|
149
|
-
const getAppContainer = ({ settings = mockSettings, config = mockConfig, version = '1.0.0', initResult = mockInitResult, startupWarnings, resumedSessionData, } = {}) => (_jsx(SettingsContext.Provider, { value: settings, children: _jsx(AppContainer, { config: config, version: version, initializationResult: initResult, startupWarnings: startupWarnings, resumedSessionData: resumedSessionData }) }));
|
|
150
|
-
// Helper to render the AppContainer
|
|
151
|
-
const renderAppContainer = (props) => render(getAppContainer(props));
|
|
152
|
-
// Create typed mocks for all hooks
|
|
153
|
-
const mockedUseQuotaAndFallback = useQuotaAndFallback;
|
|
154
|
-
const mockedUseHistory = useHistory;
|
|
155
|
-
const mockedUseThemeCommand = useThemeCommand;
|
|
156
|
-
const mockedUseAuthCommand = useAuthCommand;
|
|
157
|
-
const mockedUseEditorSettings = useEditorSettings;
|
|
158
|
-
const mockedUseSettingsCommand = useSettingsCommand;
|
|
159
|
-
const mockedUseModelCommand = useModelCommand;
|
|
160
|
-
const mockedUseSlashCommandProcessor = useSlashCommandProcessor;
|
|
161
|
-
const mockedUseConsoleMessages = useConsoleMessages;
|
|
162
|
-
const mockedUseGeminiStream = useGeminiStream;
|
|
163
|
-
const mockedUseVim = useVim;
|
|
164
|
-
const mockedUseFolderTrust = useFolderTrust;
|
|
165
|
-
const mockedUseIdeTrustListener = useIdeTrustListener;
|
|
166
|
-
const mockedUseMessageQueue = useMessageQueue;
|
|
167
|
-
const mockedUseApprovalModeIndicator = useApprovalModeIndicator;
|
|
168
|
-
const mockedUseGitBranchName = useGitBranchName;
|
|
169
|
-
const mockedUseVimMode = useVimMode;
|
|
170
|
-
const mockedUseSessionStats = useSessionStats;
|
|
171
|
-
const mockedUseTextBuffer = useTextBuffer;
|
|
172
|
-
const mockedUseLogger = useLogger;
|
|
173
|
-
const mockedUseLoadingIndicator = useLoadingIndicator;
|
|
174
|
-
const mockedUseKeypress = useKeypress;
|
|
175
|
-
const mockedUseInputHistoryStore = useInputHistoryStore;
|
|
176
|
-
const mockedUseHookDisplayState = useHookDisplayState;
|
|
177
|
-
beforeEach(() => {
|
|
178
|
-
vi.clearAllMocks();
|
|
179
|
-
mockIdeClient.getInstance.mockReturnValue(new Promise(() => { }));
|
|
180
|
-
// Initialize mock stdout for terminal title tests
|
|
181
|
-
mocks.mockStdout.write.mockClear();
|
|
182
|
-
capturedUIState = null;
|
|
183
|
-
// **Provide a default return value for EVERY mocked hook.**
|
|
184
|
-
mockedUseQuotaAndFallback.mockReturnValue({
|
|
185
|
-
proQuotaRequest: null,
|
|
186
|
-
handleProQuotaChoice: vi.fn(),
|
|
187
|
-
});
|
|
188
|
-
mockedUseHistory.mockReturnValue({
|
|
189
|
-
history: [],
|
|
190
|
-
addItem: vi.fn(),
|
|
191
|
-
updateItem: vi.fn(),
|
|
192
|
-
clearItems: vi.fn(),
|
|
193
|
-
loadHistory: vi.fn(),
|
|
194
|
-
});
|
|
195
|
-
mockedUseThemeCommand.mockReturnValue({
|
|
196
|
-
isThemeDialogOpen: false,
|
|
197
|
-
openThemeDialog: vi.fn(),
|
|
198
|
-
handleThemeSelect: vi.fn(),
|
|
199
|
-
handleThemeHighlight: vi.fn(),
|
|
200
|
-
});
|
|
201
|
-
mockedUseAuthCommand.mockReturnValue({
|
|
202
|
-
authState: 'authenticated',
|
|
203
|
-
setAuthState: vi.fn(),
|
|
204
|
-
authError: null,
|
|
205
|
-
onAuthError: vi.fn(),
|
|
206
|
-
});
|
|
207
|
-
mockedUseEditorSettings.mockReturnValue({
|
|
208
|
-
isEditorDialogOpen: false,
|
|
209
|
-
openEditorDialog: vi.fn(),
|
|
210
|
-
handleEditorSelect: vi.fn(),
|
|
211
|
-
exitEditorDialog: vi.fn(),
|
|
212
|
-
});
|
|
213
|
-
mockedUseSettingsCommand.mockReturnValue({
|
|
214
|
-
isSettingsDialogOpen: false,
|
|
215
|
-
openSettingsDialog: vi.fn(),
|
|
216
|
-
closeSettingsDialog: vi.fn(),
|
|
217
|
-
});
|
|
218
|
-
mockedUseModelCommand.mockReturnValue({
|
|
219
|
-
isModelDialogOpen: false,
|
|
220
|
-
openModelDialog: vi.fn(),
|
|
221
|
-
closeModelDialog: vi.fn(),
|
|
222
|
-
});
|
|
223
|
-
mockedUseSlashCommandProcessor.mockReturnValue({
|
|
224
|
-
handleSlashCommand: vi.fn(),
|
|
225
|
-
slashCommands: [],
|
|
226
|
-
pendingHistoryItems: [],
|
|
227
|
-
commandContext: {},
|
|
228
|
-
shellConfirmationRequest: null,
|
|
229
|
-
confirmationRequest: null,
|
|
230
|
-
});
|
|
231
|
-
mockedUseConsoleMessages.mockReturnValue({
|
|
232
|
-
consoleMessages: [],
|
|
233
|
-
handleNewMessage: vi.fn(),
|
|
234
|
-
clearConsoleMessages: vi.fn(),
|
|
235
|
-
});
|
|
236
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
237
|
-
streamingState: 'idle',
|
|
238
|
-
submitQuery: vi.fn(),
|
|
239
|
-
initError: null,
|
|
240
|
-
pendingHistoryItems: [],
|
|
241
|
-
thought: null,
|
|
242
|
-
cancelOngoingRequest: vi.fn(),
|
|
243
|
-
});
|
|
244
|
-
mockedUseVim.mockReturnValue({ handleInput: vi.fn() });
|
|
245
|
-
mockedUseFolderTrust.mockReturnValue({
|
|
246
|
-
isFolderTrustDialogOpen: false,
|
|
247
|
-
handleFolderTrustSelect: vi.fn(),
|
|
248
|
-
isRestarting: false,
|
|
249
|
-
});
|
|
250
|
-
mockedUseIdeTrustListener.mockReturnValue({
|
|
251
|
-
needsRestart: false,
|
|
252
|
-
restartReason: 'NONE',
|
|
253
|
-
});
|
|
254
|
-
mockedUseMessageQueue.mockReturnValue({
|
|
255
|
-
messageQueue: [],
|
|
256
|
-
addMessage: vi.fn(),
|
|
257
|
-
clearQueue: vi.fn(),
|
|
258
|
-
getQueuedMessagesText: vi.fn().mockReturnValue(''),
|
|
259
|
-
});
|
|
260
|
-
mockedUseApprovalModeIndicator.mockReturnValue(false);
|
|
261
|
-
mockedUseGitBranchName.mockReturnValue('main');
|
|
262
|
-
mockedUseVimMode.mockReturnValue({
|
|
263
|
-
isVimEnabled: false,
|
|
264
|
-
toggleVimEnabled: vi.fn(),
|
|
265
|
-
});
|
|
266
|
-
mockedUseSessionStats.mockReturnValue({ stats: {} });
|
|
267
|
-
mockedUseTextBuffer.mockReturnValue({
|
|
268
|
-
text: '',
|
|
269
|
-
setText: vi.fn(),
|
|
270
|
-
// Add other properties if AppContainer uses them
|
|
271
|
-
});
|
|
272
|
-
mockedUseLogger.mockReturnValue({
|
|
273
|
-
getPreviousUserMessages: vi.fn().mockResolvedValue([]),
|
|
274
|
-
});
|
|
275
|
-
mockedUseInputHistoryStore.mockReturnValue({
|
|
276
|
-
inputHistory: [],
|
|
277
|
-
addInput: vi.fn(),
|
|
278
|
-
initializeFromLogger: vi.fn(),
|
|
279
|
-
});
|
|
280
|
-
mockedUseLoadingIndicator.mockReturnValue({
|
|
281
|
-
elapsedTime: '0.0s',
|
|
282
|
-
currentLoadingPhrase: '',
|
|
283
|
-
});
|
|
284
|
-
mockedUseHookDisplayState.mockReturnValue([]);
|
|
285
|
-
// Mock Config
|
|
286
|
-
mockConfig = makeFakeConfig();
|
|
287
|
-
// Mock config's getTargetDir to return consistent workspace directory
|
|
288
|
-
vi.spyOn(mockConfig, 'getTargetDir').mockReturnValue('/test/workspace');
|
|
289
|
-
vi.spyOn(mockConfig, 'initialize').mockResolvedValue(undefined);
|
|
290
|
-
vi.spyOn(mockConfig, 'getDebugMode').mockReturnValue(false);
|
|
291
|
-
mockExtensionManager = vi.mockObject({
|
|
292
|
-
getExtensions: vi.fn().mockReturnValue([]),
|
|
293
|
-
setRequestConsent: vi.fn(),
|
|
294
|
-
setRequestSetting: vi.fn(),
|
|
295
|
-
start: vi.fn(),
|
|
296
|
-
});
|
|
297
|
-
vi.spyOn(mockConfig, 'getExtensionLoader').mockReturnValue(mockExtensionManager);
|
|
298
|
-
// Mock LoadedSettings
|
|
299
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
300
|
-
mockSettings = {
|
|
301
|
-
merged: {
|
|
302
|
-
...defaultMergedSettings,
|
|
303
|
-
hideBanner: false,
|
|
304
|
-
hideFooter: false,
|
|
305
|
-
hideTips: false,
|
|
306
|
-
showMemoryUsage: false,
|
|
307
|
-
theme: 'default',
|
|
308
|
-
ui: {
|
|
309
|
-
...defaultMergedSettings.ui,
|
|
310
|
-
showStatusInTitle: false,
|
|
311
|
-
hideWindowTitle: false,
|
|
312
|
-
},
|
|
313
|
-
useAlternateBuffer: false,
|
|
314
|
-
},
|
|
315
|
-
};
|
|
316
|
-
// Mock InitializationResult
|
|
317
|
-
mockInitResult = {
|
|
318
|
-
themeError: null,
|
|
319
|
-
authError: null,
|
|
320
|
-
shouldOpenAuthDialog: false,
|
|
321
|
-
geminiMdFileCount: 0,
|
|
322
|
-
};
|
|
323
|
-
});
|
|
324
|
-
afterEach(() => {
|
|
325
|
-
cleanup();
|
|
326
|
-
vi.restoreAllMocks();
|
|
327
|
-
});
|
|
328
|
-
describe('Basic Rendering', () => {
|
|
329
|
-
it('renders without crashing with minimal props', async () => {
|
|
330
|
-
let unmount;
|
|
331
|
-
await act(async () => {
|
|
332
|
-
const result = renderAppContainer();
|
|
333
|
-
unmount = result.unmount;
|
|
334
|
-
});
|
|
335
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
336
|
-
unmount();
|
|
337
|
-
});
|
|
338
|
-
it('renders with startup warnings', async () => {
|
|
339
|
-
const startupWarnings = ['Warning 1', 'Warning 2'];
|
|
340
|
-
let unmount;
|
|
341
|
-
await act(async () => {
|
|
342
|
-
const result = renderAppContainer({ startupWarnings });
|
|
343
|
-
unmount = result.unmount;
|
|
344
|
-
});
|
|
345
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
346
|
-
unmount();
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
describe('State Initialization', () => {
|
|
350
|
-
it('initializes with theme error from initialization result', async () => {
|
|
351
|
-
const initResultWithError = {
|
|
352
|
-
...mockInitResult,
|
|
353
|
-
themeError: 'Failed to load theme',
|
|
354
|
-
};
|
|
355
|
-
let unmount;
|
|
356
|
-
await act(async () => {
|
|
357
|
-
const result = renderAppContainer({
|
|
358
|
-
initResult: initResultWithError,
|
|
359
|
-
});
|
|
360
|
-
unmount = result.unmount;
|
|
361
|
-
});
|
|
362
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
363
|
-
unmount();
|
|
364
|
-
});
|
|
365
|
-
it('handles debug mode state', () => {
|
|
366
|
-
const debugConfig = makeFakeConfig();
|
|
367
|
-
vi.spyOn(debugConfig, 'getDebugMode').mockReturnValue(true);
|
|
368
|
-
expect(() => {
|
|
369
|
-
renderAppContainer({ config: debugConfig });
|
|
370
|
-
}).not.toThrow();
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
describe('Context Providers', () => {
|
|
374
|
-
it('provides AppContext with correct values', async () => {
|
|
375
|
-
let unmount;
|
|
376
|
-
await act(async () => {
|
|
377
|
-
const result = renderAppContainer({ version: '2.0.0' });
|
|
378
|
-
unmount = result.unmount;
|
|
379
|
-
});
|
|
380
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
381
|
-
// Should render and unmount cleanly
|
|
382
|
-
expect(() => unmount()).not.toThrow();
|
|
383
|
-
});
|
|
384
|
-
it('provides UIStateContext with state management', async () => {
|
|
385
|
-
let unmount;
|
|
386
|
-
await act(async () => {
|
|
387
|
-
const result = renderAppContainer();
|
|
388
|
-
unmount = result.unmount;
|
|
389
|
-
});
|
|
390
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
391
|
-
unmount();
|
|
392
|
-
});
|
|
393
|
-
it('provides UIActionsContext with action handlers', async () => {
|
|
394
|
-
let unmount;
|
|
395
|
-
await act(async () => {
|
|
396
|
-
const result = renderAppContainer();
|
|
397
|
-
unmount = result.unmount;
|
|
398
|
-
});
|
|
399
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
400
|
-
unmount();
|
|
401
|
-
});
|
|
402
|
-
it('provides ConfigContext with config object', async () => {
|
|
403
|
-
let unmount;
|
|
404
|
-
await act(async () => {
|
|
405
|
-
const result = renderAppContainer();
|
|
406
|
-
unmount = result.unmount;
|
|
407
|
-
});
|
|
408
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
409
|
-
unmount();
|
|
410
|
-
});
|
|
411
|
-
});
|
|
412
|
-
describe('Settings Integration', () => {
|
|
413
|
-
it('handles settings with all display options disabled', async () => {
|
|
414
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
415
|
-
const settingsAllHidden = {
|
|
416
|
-
merged: {
|
|
417
|
-
...defaultMergedSettings,
|
|
418
|
-
hideBanner: true,
|
|
419
|
-
hideFooter: true,
|
|
420
|
-
hideTips: true,
|
|
421
|
-
showMemoryUsage: false,
|
|
422
|
-
},
|
|
423
|
-
};
|
|
424
|
-
let unmount;
|
|
425
|
-
await act(async () => {
|
|
426
|
-
const result = renderAppContainer({ settings: settingsAllHidden });
|
|
427
|
-
unmount = result.unmount;
|
|
428
|
-
});
|
|
429
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
430
|
-
unmount();
|
|
431
|
-
});
|
|
432
|
-
it('handles settings with memory usage enabled', async () => {
|
|
433
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
434
|
-
const settingsWithMemory = {
|
|
435
|
-
merged: {
|
|
436
|
-
...defaultMergedSettings,
|
|
437
|
-
hideBanner: false,
|
|
438
|
-
hideFooter: false,
|
|
439
|
-
hideTips: false,
|
|
440
|
-
showMemoryUsage: true,
|
|
441
|
-
},
|
|
442
|
-
};
|
|
443
|
-
let unmount;
|
|
444
|
-
await act(async () => {
|
|
445
|
-
const result = renderAppContainer({ settings: settingsWithMemory });
|
|
446
|
-
unmount = result.unmount;
|
|
447
|
-
});
|
|
448
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
449
|
-
unmount();
|
|
450
|
-
});
|
|
451
|
-
});
|
|
452
|
-
describe('Version Handling', () => {
|
|
453
|
-
it.each(['1.0.0', '2.1.3-beta', '3.0.0-nightly'])('handles version format: %s', async (version) => {
|
|
454
|
-
let unmount;
|
|
455
|
-
await act(async () => {
|
|
456
|
-
const result = renderAppContainer({ version });
|
|
457
|
-
unmount = result.unmount;
|
|
458
|
-
});
|
|
459
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
460
|
-
unmount();
|
|
461
|
-
});
|
|
462
|
-
});
|
|
463
|
-
describe('Error Handling', () => {
|
|
464
|
-
it('handles config methods that might throw', async () => {
|
|
465
|
-
const errorConfig = makeFakeConfig();
|
|
466
|
-
vi.spyOn(errorConfig, 'getModel').mockImplementation(() => {
|
|
467
|
-
throw new Error('Config error');
|
|
468
|
-
});
|
|
469
|
-
// Should still render without crashing - errors should be handled internally
|
|
470
|
-
const { unmount } = renderAppContainer({ config: errorConfig });
|
|
471
|
-
unmount();
|
|
472
|
-
});
|
|
473
|
-
it('handles undefined settings gracefully', async () => {
|
|
474
|
-
const undefinedSettings = {
|
|
475
|
-
merged: mergeSettings({}, {}, {}, {}, true),
|
|
476
|
-
};
|
|
477
|
-
let unmount;
|
|
478
|
-
await act(async () => {
|
|
479
|
-
const result = renderAppContainer({ settings: undefinedSettings });
|
|
480
|
-
unmount = result.unmount;
|
|
481
|
-
});
|
|
482
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
483
|
-
unmount();
|
|
484
|
-
});
|
|
485
|
-
});
|
|
486
|
-
describe('Provider Hierarchy', () => {
|
|
487
|
-
it('establishes correct provider nesting order', () => {
|
|
488
|
-
// This tests that all the context providers are properly nested
|
|
489
|
-
// and that the component tree can be built without circular dependencies
|
|
490
|
-
const { unmount } = renderAppContainer();
|
|
491
|
-
expect(() => unmount()).not.toThrow();
|
|
492
|
-
});
|
|
493
|
-
});
|
|
494
|
-
describe('Session Resumption', () => {
|
|
495
|
-
it('handles resumed session data correctly', async () => {
|
|
496
|
-
const mockResumedSessionData = {
|
|
497
|
-
conversation: {
|
|
498
|
-
sessionId: 'test-session-123',
|
|
499
|
-
projectHash: 'test-project-hash',
|
|
500
|
-
startTime: '2024-01-01T00:00:00Z',
|
|
501
|
-
lastUpdated: '2024-01-01T00:00:01Z',
|
|
502
|
-
messages: [
|
|
503
|
-
{
|
|
504
|
-
id: 'msg-1',
|
|
505
|
-
type: 'user',
|
|
506
|
-
content: 'Hello',
|
|
507
|
-
timestamp: '2024-01-01T00:00:00Z',
|
|
508
|
-
},
|
|
509
|
-
{
|
|
510
|
-
id: 'msg-2',
|
|
511
|
-
type: 'gemini',
|
|
512
|
-
content: 'Hi there!',
|
|
513
|
-
role: 'model',
|
|
514
|
-
parts: [{ text: 'Hi there!' }],
|
|
515
|
-
timestamp: '2024-01-01T00:00:01Z',
|
|
516
|
-
},
|
|
517
|
-
],
|
|
518
|
-
},
|
|
519
|
-
filePath: '/tmp/test-session.json',
|
|
520
|
-
};
|
|
521
|
-
let unmount;
|
|
522
|
-
await act(async () => {
|
|
523
|
-
const result = renderAppContainer({
|
|
524
|
-
config: mockConfig,
|
|
525
|
-
settings: mockSettings,
|
|
526
|
-
version: '1.0.0',
|
|
527
|
-
initResult: mockInitResult,
|
|
528
|
-
resumedSessionData: mockResumedSessionData,
|
|
529
|
-
});
|
|
530
|
-
unmount = result.unmount;
|
|
531
|
-
});
|
|
532
|
-
await act(async () => {
|
|
533
|
-
unmount();
|
|
534
|
-
});
|
|
535
|
-
});
|
|
536
|
-
it('renders without resumed session data', async () => {
|
|
537
|
-
let unmount;
|
|
538
|
-
await act(async () => {
|
|
539
|
-
const result = renderAppContainer({
|
|
540
|
-
config: mockConfig,
|
|
541
|
-
settings: mockSettings,
|
|
542
|
-
version: '1.0.0',
|
|
543
|
-
initResult: mockInitResult,
|
|
544
|
-
resumedSessionData: undefined,
|
|
545
|
-
});
|
|
546
|
-
unmount = result.unmount;
|
|
547
|
-
});
|
|
548
|
-
await act(async () => {
|
|
549
|
-
unmount();
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
it('initializes chat recording service when config has it', () => {
|
|
553
|
-
const mockChatRecordingService = {
|
|
554
|
-
initialize: vi.fn(),
|
|
555
|
-
recordMessage: vi.fn(),
|
|
556
|
-
recordMessageTokens: vi.fn(),
|
|
557
|
-
recordToolCalls: vi.fn(),
|
|
558
|
-
};
|
|
559
|
-
const mockGeminiClient = {
|
|
560
|
-
isInitialized: vi.fn(() => true),
|
|
561
|
-
resumeChat: vi.fn(),
|
|
562
|
-
getUserTier: vi.fn(),
|
|
563
|
-
getChatRecordingService: vi.fn(() => mockChatRecordingService),
|
|
564
|
-
};
|
|
565
|
-
const configWithRecording = {
|
|
566
|
-
...mockConfig,
|
|
567
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
568
|
-
};
|
|
569
|
-
expect(() => {
|
|
570
|
-
renderAppContainer({
|
|
571
|
-
config: configWithRecording,
|
|
572
|
-
settings: mockSettings,
|
|
573
|
-
version: '1.0.0',
|
|
574
|
-
initResult: mockInitResult,
|
|
575
|
-
});
|
|
576
|
-
}).not.toThrow();
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
describe('Session Recording Integration', () => {
|
|
580
|
-
it('provides chat recording service configuration', () => {
|
|
581
|
-
const mockChatRecordingService = {
|
|
582
|
-
initialize: vi.fn(),
|
|
583
|
-
recordMessage: vi.fn(),
|
|
584
|
-
recordMessageTokens: vi.fn(),
|
|
585
|
-
recordToolCalls: vi.fn(),
|
|
586
|
-
getSessionId: vi.fn(() => 'test-session-123'),
|
|
587
|
-
getCurrentConversation: vi.fn(),
|
|
588
|
-
};
|
|
589
|
-
const mockGeminiClient = {
|
|
590
|
-
isInitialized: vi.fn(() => true),
|
|
591
|
-
resumeChat: vi.fn(),
|
|
592
|
-
getUserTier: vi.fn(),
|
|
593
|
-
getChatRecordingService: vi.fn(() => mockChatRecordingService),
|
|
594
|
-
setHistory: vi.fn(),
|
|
595
|
-
};
|
|
596
|
-
const configWithRecording = {
|
|
597
|
-
...mockConfig,
|
|
598
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
599
|
-
getSessionId: vi.fn(() => 'test-session-123'),
|
|
600
|
-
};
|
|
601
|
-
expect(() => {
|
|
602
|
-
renderAppContainer({
|
|
603
|
-
config: configWithRecording,
|
|
604
|
-
settings: mockSettings,
|
|
605
|
-
version: '1.0.0',
|
|
606
|
-
initResult: mockInitResult,
|
|
607
|
-
});
|
|
608
|
-
}).not.toThrow();
|
|
609
|
-
// Verify the recording service structure is correct
|
|
610
|
-
expect(configWithRecording.getGeminiClient).toBeDefined();
|
|
611
|
-
expect(mockGeminiClient.getChatRecordingService).toBeDefined();
|
|
612
|
-
expect(mockChatRecordingService.initialize).toBeDefined();
|
|
613
|
-
expect(mockChatRecordingService.recordMessage).toBeDefined();
|
|
614
|
-
});
|
|
615
|
-
it('handles session recording when messages are added', () => {
|
|
616
|
-
const mockRecordMessage = vi.fn();
|
|
617
|
-
const mockRecordMessageTokens = vi.fn();
|
|
618
|
-
const mockChatRecordingService = {
|
|
619
|
-
initialize: vi.fn(),
|
|
620
|
-
recordMessage: mockRecordMessage,
|
|
621
|
-
recordMessageTokens: mockRecordMessageTokens,
|
|
622
|
-
recordToolCalls: vi.fn(),
|
|
623
|
-
getSessionId: vi.fn(() => 'test-session-123'),
|
|
624
|
-
};
|
|
625
|
-
const mockGeminiClient = {
|
|
626
|
-
isInitialized: vi.fn(() => true),
|
|
627
|
-
getChatRecordingService: vi.fn(() => mockChatRecordingService),
|
|
628
|
-
getUserTier: vi.fn(),
|
|
629
|
-
};
|
|
630
|
-
const configWithRecording = {
|
|
631
|
-
...mockConfig,
|
|
632
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
633
|
-
};
|
|
634
|
-
renderAppContainer({
|
|
635
|
-
config: configWithRecording,
|
|
636
|
-
settings: mockSettings,
|
|
637
|
-
version: '1.0.0',
|
|
638
|
-
initResult: mockInitResult,
|
|
639
|
-
});
|
|
640
|
-
// The actual recording happens through the useHistory hook
|
|
641
|
-
// which would be triggered by user interactions
|
|
642
|
-
expect(mockChatRecordingService.initialize).toBeDefined();
|
|
643
|
-
expect(mockChatRecordingService.recordMessage).toBeDefined();
|
|
644
|
-
});
|
|
645
|
-
});
|
|
646
|
-
describe('Session Resume Flow', () => {
|
|
647
|
-
it('accepts resumed session data', () => {
|
|
648
|
-
const mockResumeChat = vi.fn();
|
|
649
|
-
const mockGeminiClient = {
|
|
650
|
-
isInitialized: vi.fn(() => true),
|
|
651
|
-
resumeChat: mockResumeChat,
|
|
652
|
-
getUserTier: vi.fn(),
|
|
653
|
-
getChatRecordingService: vi.fn(() => ({
|
|
654
|
-
initialize: vi.fn(),
|
|
655
|
-
recordMessage: vi.fn(),
|
|
656
|
-
recordMessageTokens: vi.fn(),
|
|
657
|
-
recordToolCalls: vi.fn(),
|
|
658
|
-
})),
|
|
659
|
-
};
|
|
660
|
-
const configWithClient = {
|
|
661
|
-
...mockConfig,
|
|
662
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
663
|
-
};
|
|
664
|
-
const resumedData = {
|
|
665
|
-
conversation: {
|
|
666
|
-
sessionId: 'resumed-session-456',
|
|
667
|
-
projectHash: 'project-hash',
|
|
668
|
-
startTime: '2024-01-01T00:00:00Z',
|
|
669
|
-
lastUpdated: '2024-01-01T00:01:00Z',
|
|
670
|
-
messages: [
|
|
671
|
-
{
|
|
672
|
-
id: 'msg-1',
|
|
673
|
-
type: 'user',
|
|
674
|
-
content: 'Previous question',
|
|
675
|
-
timestamp: '2024-01-01T00:00:00Z',
|
|
676
|
-
},
|
|
677
|
-
{
|
|
678
|
-
id: 'msg-2',
|
|
679
|
-
type: 'gemini',
|
|
680
|
-
content: 'Previous answer',
|
|
681
|
-
role: 'model',
|
|
682
|
-
parts: [{ text: 'Previous answer' }],
|
|
683
|
-
timestamp: '2024-01-01T00:00:30Z',
|
|
684
|
-
tokenCount: { input: 10, output: 20 },
|
|
685
|
-
},
|
|
686
|
-
],
|
|
687
|
-
},
|
|
688
|
-
filePath: '/tmp/resumed-session.json',
|
|
689
|
-
};
|
|
690
|
-
expect(() => {
|
|
691
|
-
renderAppContainer({
|
|
692
|
-
config: configWithClient,
|
|
693
|
-
settings: mockSettings,
|
|
694
|
-
version: '1.0.0',
|
|
695
|
-
initResult: mockInitResult,
|
|
696
|
-
resumedSessionData: resumedData,
|
|
697
|
-
});
|
|
698
|
-
}).not.toThrow();
|
|
699
|
-
// Verify the resume functionality structure is in place
|
|
700
|
-
expect(mockGeminiClient.resumeChat).toBeDefined();
|
|
701
|
-
expect(resumedData.conversation.messages).toHaveLength(2);
|
|
702
|
-
});
|
|
703
|
-
it('does not attempt resume when client is not initialized', () => {
|
|
704
|
-
const mockResumeChat = vi.fn();
|
|
705
|
-
const mockGeminiClient = {
|
|
706
|
-
isInitialized: vi.fn(() => false), // Not initialized
|
|
707
|
-
resumeChat: mockResumeChat,
|
|
708
|
-
getUserTier: vi.fn(),
|
|
709
|
-
getChatRecordingService: vi.fn(),
|
|
710
|
-
};
|
|
711
|
-
const configWithClient = {
|
|
712
|
-
...mockConfig,
|
|
713
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
714
|
-
};
|
|
715
|
-
const resumedData = {
|
|
716
|
-
conversation: {
|
|
717
|
-
sessionId: 'test-session',
|
|
718
|
-
projectHash: 'project-hash',
|
|
719
|
-
startTime: '2024-01-01T00:00:00Z',
|
|
720
|
-
lastUpdated: '2024-01-01T00:01:00Z',
|
|
721
|
-
messages: [],
|
|
722
|
-
},
|
|
723
|
-
filePath: '/tmp/session.json',
|
|
724
|
-
};
|
|
725
|
-
renderAppContainer({
|
|
726
|
-
config: configWithClient,
|
|
727
|
-
settings: mockSettings,
|
|
728
|
-
version: '1.0.0',
|
|
729
|
-
initResult: mockInitResult,
|
|
730
|
-
resumedSessionData: resumedData,
|
|
731
|
-
});
|
|
732
|
-
// Should not call resumeChat when client is not initialized
|
|
733
|
-
expect(mockResumeChat).not.toHaveBeenCalled();
|
|
734
|
-
});
|
|
735
|
-
});
|
|
736
|
-
describe('Token Counting from Session Stats', () => {
|
|
737
|
-
it('tracks token counts from session messages', () => {
|
|
738
|
-
// Session stats are provided through the SessionStatsProvider context
|
|
739
|
-
// in the real app, not through the config directly
|
|
740
|
-
const mockChatRecordingService = {
|
|
741
|
-
initialize: vi.fn(),
|
|
742
|
-
recordMessage: vi.fn(),
|
|
743
|
-
recordMessageTokens: vi.fn(),
|
|
744
|
-
recordToolCalls: vi.fn(),
|
|
745
|
-
getSessionId: vi.fn(() => 'test-session-123'),
|
|
746
|
-
getCurrentConversation: vi.fn(() => ({
|
|
747
|
-
sessionId: 'test-session-123',
|
|
748
|
-
messages: [],
|
|
749
|
-
totalInputTokens: 150,
|
|
750
|
-
totalOutputTokens: 350,
|
|
751
|
-
})),
|
|
752
|
-
};
|
|
753
|
-
const mockGeminiClient = {
|
|
754
|
-
isInitialized: vi.fn(() => true),
|
|
755
|
-
getChatRecordingService: vi.fn(() => mockChatRecordingService),
|
|
756
|
-
getUserTier: vi.fn(),
|
|
757
|
-
};
|
|
758
|
-
const configWithRecording = {
|
|
759
|
-
...mockConfig,
|
|
760
|
-
getGeminiClient: vi.fn(() => mockGeminiClient),
|
|
761
|
-
};
|
|
762
|
-
renderAppContainer({
|
|
763
|
-
config: configWithRecording,
|
|
764
|
-
settings: mockSettings,
|
|
765
|
-
version: '1.0.0',
|
|
766
|
-
initResult: mockInitResult,
|
|
767
|
-
});
|
|
768
|
-
// In the actual app, these stats would be displayed in components
|
|
769
|
-
// and updated as messages are processed through the recording service
|
|
770
|
-
expect(mockChatRecordingService.recordMessageTokens).toBeDefined();
|
|
771
|
-
expect(mockChatRecordingService.getCurrentConversation).toBeDefined();
|
|
772
|
-
});
|
|
773
|
-
});
|
|
774
|
-
describe('Quota and Fallback Integration', () => {
|
|
775
|
-
it('passes a null proQuotaRequest to UIStateContext by default', async () => {
|
|
776
|
-
// The default mock from beforeEach already sets proQuotaRequest to null
|
|
777
|
-
let unmount;
|
|
778
|
-
await act(async () => {
|
|
779
|
-
const result = renderAppContainer();
|
|
780
|
-
unmount = result.unmount;
|
|
781
|
-
});
|
|
782
|
-
await waitFor(() => {
|
|
783
|
-
// Assert that the context value is as expected
|
|
784
|
-
expect(capturedUIState.proQuotaRequest).toBeNull();
|
|
785
|
-
});
|
|
786
|
-
unmount();
|
|
787
|
-
});
|
|
788
|
-
it('passes a valid proQuotaRequest to UIStateContext when provided by the hook', async () => {
|
|
789
|
-
// Arrange: Create a mock request object that a UI dialog would receive
|
|
790
|
-
const mockRequest = {
|
|
791
|
-
failedModel: 'gemini-pro',
|
|
792
|
-
fallbackModel: 'gemini-flash',
|
|
793
|
-
resolve: vi.fn(),
|
|
794
|
-
};
|
|
795
|
-
mockedUseQuotaAndFallback.mockReturnValue({
|
|
796
|
-
proQuotaRequest: mockRequest,
|
|
797
|
-
handleProQuotaChoice: vi.fn(),
|
|
798
|
-
});
|
|
799
|
-
// Act: Render the container
|
|
800
|
-
let unmount;
|
|
801
|
-
await act(async () => {
|
|
802
|
-
const result = renderAppContainer();
|
|
803
|
-
unmount = result.unmount;
|
|
804
|
-
});
|
|
805
|
-
await waitFor(() => {
|
|
806
|
-
// Assert: The mock request is correctly passed through the context
|
|
807
|
-
expect(capturedUIState.proQuotaRequest).toEqual(mockRequest);
|
|
808
|
-
});
|
|
809
|
-
unmount();
|
|
810
|
-
});
|
|
811
|
-
it('passes the handleProQuotaChoice function to UIActionsContext', async () => {
|
|
812
|
-
// Arrange: Create a mock handler function
|
|
813
|
-
const mockHandler = vi.fn();
|
|
814
|
-
mockedUseQuotaAndFallback.mockReturnValue({
|
|
815
|
-
proQuotaRequest: null,
|
|
816
|
-
handleProQuotaChoice: mockHandler,
|
|
817
|
-
});
|
|
818
|
-
// Act: Render the container
|
|
819
|
-
let unmount;
|
|
820
|
-
await act(async () => {
|
|
821
|
-
const result = renderAppContainer();
|
|
822
|
-
unmount = result.unmount;
|
|
823
|
-
});
|
|
824
|
-
await waitFor(() => {
|
|
825
|
-
// Assert: The action in the context is the mock handler we provided
|
|
826
|
-
expect(capturedUIActions.handleProQuotaChoice).toBe(mockHandler);
|
|
827
|
-
});
|
|
828
|
-
// You can even verify that the plumbed function is callable
|
|
829
|
-
act(() => {
|
|
830
|
-
capturedUIActions.handleProQuotaChoice('retry_later');
|
|
831
|
-
});
|
|
832
|
-
expect(mockHandler).toHaveBeenCalledWith('retry_later');
|
|
833
|
-
unmount();
|
|
834
|
-
});
|
|
835
|
-
});
|
|
836
|
-
describe('Terminal Title Update Feature', () => {
|
|
837
|
-
beforeEach(() => {
|
|
838
|
-
// Reset mock stdout for each test
|
|
839
|
-
mocks.mockStdout.write.mockClear();
|
|
840
|
-
});
|
|
841
|
-
it('verifies useStdout is mocked', async () => {
|
|
842
|
-
const { useStdout } = await import('ink');
|
|
843
|
-
const { stdout } = useStdout();
|
|
844
|
-
expect(stdout).toBe(mocks.mockStdout);
|
|
845
|
-
});
|
|
846
|
-
it('should update terminal title with Working… when showStatusInTitle is false', () => {
|
|
847
|
-
// Arrange: Set up mock settings with showStatusInTitle disabled
|
|
848
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
849
|
-
const mockSettingsWithShowStatusFalse = {
|
|
850
|
-
...mockSettings,
|
|
851
|
-
merged: {
|
|
852
|
-
...defaultMergedSettings,
|
|
853
|
-
ui: {
|
|
854
|
-
...defaultMergedSettings.ui,
|
|
855
|
-
showStatusInTitle: false,
|
|
856
|
-
hideWindowTitle: false,
|
|
857
|
-
},
|
|
858
|
-
},
|
|
859
|
-
};
|
|
860
|
-
// Mock the streaming state as Active
|
|
861
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
862
|
-
streamingState: 'responding',
|
|
863
|
-
submitQuery: vi.fn(),
|
|
864
|
-
initError: null,
|
|
865
|
-
pendingHistoryItems: [],
|
|
866
|
-
thought: { subject: 'Some thought' },
|
|
867
|
-
cancelOngoingRequest: vi.fn(),
|
|
868
|
-
});
|
|
869
|
-
// Act: Render the container
|
|
870
|
-
const { unmount } = renderAppContainer({
|
|
871
|
-
settings: mockSettingsWithShowStatusFalse,
|
|
872
|
-
});
|
|
873
|
-
// Assert: Check that title was updated with "Working…"
|
|
874
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
875
|
-
expect(titleWrites).toHaveLength(1);
|
|
876
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${'✦ Working… (workspace)'.padEnd(80, ' ')}\x07`);
|
|
877
|
-
unmount();
|
|
878
|
-
});
|
|
879
|
-
it('should use legacy terminal title when dynamicWindowTitle is false', () => {
|
|
880
|
-
// Arrange: Set up mock settings with dynamicWindowTitle disabled
|
|
881
|
-
const mockSettingsWithDynamicTitleFalse = {
|
|
882
|
-
...mockSettings,
|
|
883
|
-
merged: {
|
|
884
|
-
...mockSettings.merged,
|
|
885
|
-
ui: {
|
|
886
|
-
...mockSettings.merged.ui,
|
|
887
|
-
dynamicWindowTitle: false,
|
|
888
|
-
hideWindowTitle: false,
|
|
889
|
-
},
|
|
890
|
-
},
|
|
891
|
-
};
|
|
892
|
-
// Mock the streaming state
|
|
893
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
894
|
-
streamingState: 'responding',
|
|
895
|
-
submitQuery: vi.fn(),
|
|
896
|
-
initError: null,
|
|
897
|
-
pendingHistoryItems: [],
|
|
898
|
-
thought: { subject: 'Some thought' },
|
|
899
|
-
cancelOngoingRequest: vi.fn(),
|
|
900
|
-
});
|
|
901
|
-
// Act: Render the container
|
|
902
|
-
const { unmount } = renderAppContainer({
|
|
903
|
-
settings: mockSettingsWithDynamicTitleFalse,
|
|
904
|
-
});
|
|
905
|
-
// Assert: Check that legacy title was used
|
|
906
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
907
|
-
expect(titleWrites).toHaveLength(1);
|
|
908
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${'Gemini CLI (workspace)'.padEnd(80, ' ')}\x07`);
|
|
909
|
-
unmount();
|
|
910
|
-
});
|
|
911
|
-
it('should not update terminal title when hideWindowTitle is true', () => {
|
|
912
|
-
// Arrange: Set up mock settings with hideWindowTitle enabled
|
|
913
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
914
|
-
const mockSettingsWithHideTitleTrue = {
|
|
915
|
-
...mockSettings,
|
|
916
|
-
merged: {
|
|
917
|
-
...defaultMergedSettings,
|
|
918
|
-
ui: {
|
|
919
|
-
...defaultMergedSettings.ui,
|
|
920
|
-
showStatusInTitle: true,
|
|
921
|
-
hideWindowTitle: true,
|
|
922
|
-
},
|
|
923
|
-
},
|
|
924
|
-
};
|
|
925
|
-
// Act: Render the container
|
|
926
|
-
const { unmount } = renderAppContainer({
|
|
927
|
-
settings: mockSettingsWithHideTitleTrue,
|
|
928
|
-
});
|
|
929
|
-
// Assert: Check that no title-related writes occurred
|
|
930
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
931
|
-
expect(titleWrites).toHaveLength(0);
|
|
932
|
-
unmount();
|
|
933
|
-
});
|
|
934
|
-
it('should update terminal title with thought subject when in active state', () => {
|
|
935
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
936
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
937
|
-
const mockSettingsWithTitleEnabled = {
|
|
938
|
-
...mockSettings,
|
|
939
|
-
merged: {
|
|
940
|
-
...defaultMergedSettings,
|
|
941
|
-
ui: {
|
|
942
|
-
...defaultMergedSettings.ui,
|
|
943
|
-
showStatusInTitle: true,
|
|
944
|
-
hideWindowTitle: false,
|
|
945
|
-
},
|
|
946
|
-
},
|
|
947
|
-
};
|
|
948
|
-
// Mock the streaming state and thought
|
|
949
|
-
const thoughtSubject = 'Processing request';
|
|
950
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
951
|
-
streamingState: 'responding',
|
|
952
|
-
submitQuery: vi.fn(),
|
|
953
|
-
initError: null,
|
|
954
|
-
pendingHistoryItems: [],
|
|
955
|
-
thought: { subject: thoughtSubject },
|
|
956
|
-
cancelOngoingRequest: vi.fn(),
|
|
957
|
-
});
|
|
958
|
-
// Act: Render the container
|
|
959
|
-
const { unmount } = renderAppContainer({
|
|
960
|
-
settings: mockSettingsWithTitleEnabled,
|
|
961
|
-
});
|
|
962
|
-
// Assert: Check that title was updated with thought subject and suffix
|
|
963
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
964
|
-
expect(titleWrites).toHaveLength(1);
|
|
965
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${`✦ ${thoughtSubject} (workspace)`.padEnd(80, ' ')}\x07`);
|
|
966
|
-
unmount();
|
|
967
|
-
});
|
|
968
|
-
it('should update terminal title with default text when in Idle state and no thought subject', () => {
|
|
969
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
970
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
971
|
-
const mockSettingsWithTitleEnabled = {
|
|
972
|
-
...mockSettings,
|
|
973
|
-
merged: {
|
|
974
|
-
...defaultMergedSettings,
|
|
975
|
-
ui: {
|
|
976
|
-
...defaultMergedSettings.ui,
|
|
977
|
-
showStatusInTitle: true,
|
|
978
|
-
hideWindowTitle: false,
|
|
979
|
-
},
|
|
980
|
-
},
|
|
981
|
-
};
|
|
982
|
-
// Mock the streaming state as Idle with no thought
|
|
983
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
984
|
-
streamingState: 'idle',
|
|
985
|
-
submitQuery: vi.fn(),
|
|
986
|
-
initError: null,
|
|
987
|
-
pendingHistoryItems: [],
|
|
988
|
-
thought: null,
|
|
989
|
-
cancelOngoingRequest: vi.fn(),
|
|
990
|
-
});
|
|
991
|
-
// Act: Render the container
|
|
992
|
-
const { unmount } = renderAppContainer({
|
|
993
|
-
settings: mockSettingsWithTitleEnabled,
|
|
994
|
-
});
|
|
995
|
-
// Assert: Check that title was updated with default Idle text
|
|
996
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
997
|
-
expect(titleWrites).toHaveLength(1);
|
|
998
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${'◇ Ready (workspace)'.padEnd(80, ' ')}\x07`);
|
|
999
|
-
unmount();
|
|
1000
|
-
});
|
|
1001
|
-
it('should update terminal title when in WaitingForConfirmation state with thought subject', async () => {
|
|
1002
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1003
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
1004
|
-
const mockSettingsWithTitleEnabled = {
|
|
1005
|
-
...mockSettings,
|
|
1006
|
-
merged: {
|
|
1007
|
-
...defaultMergedSettings,
|
|
1008
|
-
ui: {
|
|
1009
|
-
...defaultMergedSettings.ui,
|
|
1010
|
-
showStatusInTitle: true,
|
|
1011
|
-
hideWindowTitle: false,
|
|
1012
|
-
},
|
|
1013
|
-
},
|
|
1014
|
-
};
|
|
1015
|
-
// Mock the streaming state and thought
|
|
1016
|
-
const thoughtSubject = 'Confirm tool execution';
|
|
1017
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1018
|
-
streamingState: 'waiting_for_confirmation',
|
|
1019
|
-
submitQuery: vi.fn(),
|
|
1020
|
-
initError: null,
|
|
1021
|
-
pendingHistoryItems: [],
|
|
1022
|
-
thought: { subject: thoughtSubject },
|
|
1023
|
-
cancelOngoingRequest: vi.fn(),
|
|
1024
|
-
});
|
|
1025
|
-
// Act: Render the container
|
|
1026
|
-
let unmount;
|
|
1027
|
-
await act(async () => {
|
|
1028
|
-
const result = renderAppContainer({
|
|
1029
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1030
|
-
});
|
|
1031
|
-
unmount = result.unmount;
|
|
1032
|
-
});
|
|
1033
|
-
// Assert: Check that title was updated with confirmation text
|
|
1034
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1035
|
-
expect(titleWrites).toHaveLength(1);
|
|
1036
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${'✋ Action Required (workspace)'.padEnd(80, ' ')}\x07`);
|
|
1037
|
-
unmount();
|
|
1038
|
-
});
|
|
1039
|
-
describe('Shell Focus Action Required', () => {
|
|
1040
|
-
beforeEach(() => {
|
|
1041
|
-
vi.useFakeTimers();
|
|
1042
|
-
});
|
|
1043
|
-
afterEach(() => {
|
|
1044
|
-
vi.useRealTimers();
|
|
1045
|
-
});
|
|
1046
|
-
it('should show Action Required in title after a delay when shell is awaiting focus', async () => {
|
|
1047
|
-
const startTime = 1000000;
|
|
1048
|
-
vi.setSystemTime(startTime);
|
|
1049
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1050
|
-
const mockSettingsWithTitleEnabled = {
|
|
1051
|
-
...mockSettings,
|
|
1052
|
-
merged: {
|
|
1053
|
-
...mockSettings.merged,
|
|
1054
|
-
ui: {
|
|
1055
|
-
...mockSettings.merged.ui,
|
|
1056
|
-
showStatusInTitle: true,
|
|
1057
|
-
hideWindowTitle: false,
|
|
1058
|
-
},
|
|
1059
|
-
},
|
|
1060
|
-
};
|
|
1061
|
-
// Mock an active shell pty but not focused
|
|
1062
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1063
|
-
streamingState: 'responding',
|
|
1064
|
-
submitQuery: vi.fn(),
|
|
1065
|
-
initError: null,
|
|
1066
|
-
pendingHistoryItems: [],
|
|
1067
|
-
thought: { subject: 'Executing shell command' },
|
|
1068
|
-
cancelOngoingRequest: vi.fn(),
|
|
1069
|
-
pendingToolCalls: [],
|
|
1070
|
-
handleApprovalModeChange: vi.fn(),
|
|
1071
|
-
activePtyId: 'pty-1',
|
|
1072
|
-
loopDetectionConfirmationRequest: null,
|
|
1073
|
-
lastOutputTime: startTime + 100, // Trigger aggressive delay
|
|
1074
|
-
retryStatus: null,
|
|
1075
|
-
});
|
|
1076
|
-
vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
|
|
1077
|
-
vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
|
|
1078
|
-
// Act: Render the container (embeddedShellFocused is false by default in state)
|
|
1079
|
-
const { unmount } = renderAppContainer({
|
|
1080
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1081
|
-
});
|
|
1082
|
-
// Initially it should show the working status
|
|
1083
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1084
|
-
expect(titleWrites[titleWrites.length - 1][0]).toContain('✦ Executing shell command');
|
|
1085
|
-
// Fast-forward time by 40 seconds
|
|
1086
|
-
await act(async () => {
|
|
1087
|
-
await vi.advanceTimersByTimeAsync(40000);
|
|
1088
|
-
});
|
|
1089
|
-
// Now it should show Action Required
|
|
1090
|
-
const titleWritesDelayed = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1091
|
-
const lastTitle = titleWritesDelayed[titleWritesDelayed.length - 1][0];
|
|
1092
|
-
expect(lastTitle).toContain('✋ Action Required');
|
|
1093
|
-
unmount();
|
|
1094
|
-
});
|
|
1095
|
-
it('should show Working… in title for redirected commands after 2 mins', async () => {
|
|
1096
|
-
const startTime = 1000000;
|
|
1097
|
-
vi.setSystemTime(startTime);
|
|
1098
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1099
|
-
const mockSettingsWithTitleEnabled = {
|
|
1100
|
-
...mockSettings,
|
|
1101
|
-
merged: {
|
|
1102
|
-
...mockSettings.merged,
|
|
1103
|
-
ui: {
|
|
1104
|
-
...mockSettings.merged.ui,
|
|
1105
|
-
showStatusInTitle: true,
|
|
1106
|
-
hideWindowTitle: false,
|
|
1107
|
-
},
|
|
1108
|
-
},
|
|
1109
|
-
};
|
|
1110
|
-
// Mock an active shell pty with redirection active
|
|
1111
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1112
|
-
streamingState: 'responding',
|
|
1113
|
-
submitQuery: vi.fn(),
|
|
1114
|
-
initError: null,
|
|
1115
|
-
pendingHistoryItems: [],
|
|
1116
|
-
thought: { subject: 'Executing shell command' },
|
|
1117
|
-
cancelOngoingRequest: vi.fn(),
|
|
1118
|
-
pendingToolCalls: [
|
|
1119
|
-
{
|
|
1120
|
-
request: {
|
|
1121
|
-
name: 'run_shell_command',
|
|
1122
|
-
args: { command: 'ls > out' },
|
|
1123
|
-
},
|
|
1124
|
-
status: 'executing',
|
|
1125
|
-
},
|
|
1126
|
-
],
|
|
1127
|
-
handleApprovalModeChange: vi.fn(),
|
|
1128
|
-
activePtyId: 'pty-1',
|
|
1129
|
-
loopDetectionConfirmationRequest: null,
|
|
1130
|
-
lastOutputTime: startTime,
|
|
1131
|
-
retryStatus: null,
|
|
1132
|
-
});
|
|
1133
|
-
vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
|
|
1134
|
-
vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
|
|
1135
|
-
const { unmount } = renderAppContainer({
|
|
1136
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1137
|
-
});
|
|
1138
|
-
// Fast-forward time by 65 seconds - should still NOT be Action Required
|
|
1139
|
-
await act(async () => {
|
|
1140
|
-
await vi.advanceTimersByTimeAsync(65000);
|
|
1141
|
-
});
|
|
1142
|
-
const titleWritesMid = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1143
|
-
expect(titleWritesMid[titleWritesMid.length - 1][0]).not.toContain('✋ Action Required');
|
|
1144
|
-
// Fast-forward to 2 minutes (120000ms)
|
|
1145
|
-
await act(async () => {
|
|
1146
|
-
await vi.advanceTimersByTimeAsync(60000);
|
|
1147
|
-
});
|
|
1148
|
-
const titleWritesEnd = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1149
|
-
expect(titleWritesEnd[titleWritesEnd.length - 1][0]).toContain('⏲ Working…');
|
|
1150
|
-
unmount();
|
|
1151
|
-
});
|
|
1152
|
-
it('should show Working… in title for silent non-redirected commands after 1 min', async () => {
|
|
1153
|
-
const startTime = 1000000;
|
|
1154
|
-
vi.setSystemTime(startTime);
|
|
1155
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1156
|
-
const mockSettingsWithTitleEnabled = {
|
|
1157
|
-
...mockSettings,
|
|
1158
|
-
merged: {
|
|
1159
|
-
...mockSettings.merged,
|
|
1160
|
-
ui: {
|
|
1161
|
-
...mockSettings.merged.ui,
|
|
1162
|
-
showStatusInTitle: true,
|
|
1163
|
-
hideWindowTitle: false,
|
|
1164
|
-
},
|
|
1165
|
-
},
|
|
1166
|
-
};
|
|
1167
|
-
// Mock an active shell pty with NO output since operation started (silent)
|
|
1168
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1169
|
-
streamingState: 'responding',
|
|
1170
|
-
submitQuery: vi.fn(),
|
|
1171
|
-
initError: null,
|
|
1172
|
-
pendingHistoryItems: [],
|
|
1173
|
-
thought: { subject: 'Executing shell command' },
|
|
1174
|
-
cancelOngoingRequest: vi.fn(),
|
|
1175
|
-
pendingToolCalls: [],
|
|
1176
|
-
handleApprovalModeChange: vi.fn(),
|
|
1177
|
-
activePtyId: 'pty-1',
|
|
1178
|
-
loopDetectionConfirmationRequest: null,
|
|
1179
|
-
lastOutputTime: startTime, // lastOutputTime <= operationStartTime
|
|
1180
|
-
retryStatus: null,
|
|
1181
|
-
});
|
|
1182
|
-
vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
|
|
1183
|
-
vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
|
|
1184
|
-
const { unmount } = renderAppContainer({
|
|
1185
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1186
|
-
});
|
|
1187
|
-
// Fast-forward time by 65 seconds
|
|
1188
|
-
await act(async () => {
|
|
1189
|
-
await vi.advanceTimersByTimeAsync(65000);
|
|
1190
|
-
});
|
|
1191
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1192
|
-
const lastTitle = titleWrites[titleWrites.length - 1][0];
|
|
1193
|
-
// Should show Working… (⏲) instead of Action Required (✋)
|
|
1194
|
-
expect(lastTitle).toContain('⏲ Working…');
|
|
1195
|
-
unmount();
|
|
1196
|
-
});
|
|
1197
|
-
it('should NOT show Action Required in title if shell is streaming output', async () => {
|
|
1198
|
-
const startTime = 1000000;
|
|
1199
|
-
vi.setSystemTime(startTime);
|
|
1200
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1201
|
-
const mockSettingsWithTitleEnabled = {
|
|
1202
|
-
...mockSettings,
|
|
1203
|
-
merged: {
|
|
1204
|
-
...mockSettings.merged,
|
|
1205
|
-
ui: {
|
|
1206
|
-
...mockSettings.merged.ui,
|
|
1207
|
-
showStatusInTitle: true,
|
|
1208
|
-
hideWindowTitle: false,
|
|
1209
|
-
},
|
|
1210
|
-
},
|
|
1211
|
-
};
|
|
1212
|
-
// Mock an active shell pty but not focused
|
|
1213
|
-
let lastOutputTime = startTime + 1000;
|
|
1214
|
-
mockedUseGeminiStream.mockImplementation(() => ({
|
|
1215
|
-
streamingState: 'responding',
|
|
1216
|
-
submitQuery: vi.fn(),
|
|
1217
|
-
initError: null,
|
|
1218
|
-
pendingHistoryItems: [],
|
|
1219
|
-
thought: { subject: 'Executing shell command' },
|
|
1220
|
-
cancelOngoingRequest: vi.fn(),
|
|
1221
|
-
activePtyId: 'pty-1',
|
|
1222
|
-
lastOutputTime,
|
|
1223
|
-
}));
|
|
1224
|
-
vi.spyOn(mockConfig, 'isInteractive').mockReturnValue(true);
|
|
1225
|
-
vi.spyOn(mockConfig, 'isInteractiveShellEnabled').mockReturnValue(true);
|
|
1226
|
-
// Act: Render the container
|
|
1227
|
-
const { unmount, rerender } = renderAppContainer({
|
|
1228
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1229
|
-
});
|
|
1230
|
-
// Fast-forward time by 20 seconds
|
|
1231
|
-
await act(async () => {
|
|
1232
|
-
await vi.advanceTimersByTimeAsync(20000);
|
|
1233
|
-
});
|
|
1234
|
-
// Update lastOutputTime to simulate new output
|
|
1235
|
-
lastOutputTime = startTime + 21000;
|
|
1236
|
-
mockedUseGeminiStream.mockImplementation(() => ({
|
|
1237
|
-
streamingState: 'responding',
|
|
1238
|
-
submitQuery: vi.fn(),
|
|
1239
|
-
initError: null,
|
|
1240
|
-
pendingHistoryItems: [],
|
|
1241
|
-
thought: { subject: 'Executing shell command' },
|
|
1242
|
-
cancelOngoingRequest: vi.fn(),
|
|
1243
|
-
activePtyId: 'pty-1',
|
|
1244
|
-
lastOutputTime,
|
|
1245
|
-
}));
|
|
1246
|
-
// Rerender to propagate the new lastOutputTime
|
|
1247
|
-
await act(async () => {
|
|
1248
|
-
rerender(getAppContainer({ settings: mockSettingsWithTitleEnabled }));
|
|
1249
|
-
});
|
|
1250
|
-
// Fast-forward time by another 20 seconds
|
|
1251
|
-
// Total time elapsed: 40s.
|
|
1252
|
-
// Time since last output: 20s.
|
|
1253
|
-
// It should NOT show Action Required yet.
|
|
1254
|
-
await act(async () => {
|
|
1255
|
-
await vi.advanceTimersByTimeAsync(20000);
|
|
1256
|
-
});
|
|
1257
|
-
const titleWritesAfterOutput = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1258
|
-
const lastTitle = titleWritesAfterOutput[titleWritesAfterOutput.length - 1][0];
|
|
1259
|
-
expect(lastTitle).not.toContain('✋ Action Required');
|
|
1260
|
-
expect(lastTitle).toContain('✦ Executing shell command');
|
|
1261
|
-
// Fast-forward another 40 seconds (Total 60s since last output)
|
|
1262
|
-
await act(async () => {
|
|
1263
|
-
await vi.advanceTimersByTimeAsync(40000);
|
|
1264
|
-
});
|
|
1265
|
-
// Now it SHOULD show Action Required
|
|
1266
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1267
|
-
const lastTitleFinal = titleWrites[titleWrites.length - 1][0];
|
|
1268
|
-
expect(lastTitleFinal).toContain('✋ Action Required');
|
|
1269
|
-
unmount();
|
|
1270
|
-
});
|
|
1271
|
-
});
|
|
1272
|
-
it('should pad title to exactly 80 characters', () => {
|
|
1273
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1274
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
1275
|
-
const mockSettingsWithTitleEnabled = {
|
|
1276
|
-
...mockSettings,
|
|
1277
|
-
merged: {
|
|
1278
|
-
...defaultMergedSettings,
|
|
1279
|
-
ui: {
|
|
1280
|
-
...defaultMergedSettings.ui,
|
|
1281
|
-
showStatusInTitle: true,
|
|
1282
|
-
hideWindowTitle: false,
|
|
1283
|
-
},
|
|
1284
|
-
},
|
|
1285
|
-
};
|
|
1286
|
-
// Mock the streaming state and thought with a short subject
|
|
1287
|
-
const shortTitle = 'Short';
|
|
1288
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1289
|
-
streamingState: 'responding',
|
|
1290
|
-
submitQuery: vi.fn(),
|
|
1291
|
-
initError: null,
|
|
1292
|
-
pendingHistoryItems: [],
|
|
1293
|
-
thought: { subject: shortTitle },
|
|
1294
|
-
cancelOngoingRequest: vi.fn(),
|
|
1295
|
-
});
|
|
1296
|
-
// Act: Render the container
|
|
1297
|
-
const { unmount } = renderAppContainer({
|
|
1298
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1299
|
-
});
|
|
1300
|
-
// Assert: Check that title is padded to exactly 80 characters
|
|
1301
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1302
|
-
expect(titleWrites).toHaveLength(1);
|
|
1303
|
-
const calledWith = titleWrites[0][0];
|
|
1304
|
-
const expectedTitle = `✦ ${shortTitle} (workspace)`.padEnd(80, ' ');
|
|
1305
|
-
const expectedEscapeSequence = `\x1b]0;${expectedTitle}\x07`;
|
|
1306
|
-
expect(calledWith).toBe(expectedEscapeSequence);
|
|
1307
|
-
unmount();
|
|
1308
|
-
});
|
|
1309
|
-
it('should use correct ANSI escape code format', () => {
|
|
1310
|
-
// Arrange: Set up mock settings with showStatusInTitle enabled
|
|
1311
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
1312
|
-
const mockSettingsWithTitleEnabled = {
|
|
1313
|
-
...mockSettings,
|
|
1314
|
-
merged: {
|
|
1315
|
-
...defaultMergedSettings,
|
|
1316
|
-
ui: {
|
|
1317
|
-
...defaultMergedSettings.ui,
|
|
1318
|
-
showStatusInTitle: true,
|
|
1319
|
-
hideWindowTitle: false,
|
|
1320
|
-
},
|
|
1321
|
-
},
|
|
1322
|
-
};
|
|
1323
|
-
// Mock the streaming state and thought
|
|
1324
|
-
const title = 'Test Title';
|
|
1325
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1326
|
-
streamingState: 'responding',
|
|
1327
|
-
submitQuery: vi.fn(),
|
|
1328
|
-
initError: null,
|
|
1329
|
-
pendingHistoryItems: [],
|
|
1330
|
-
thought: { subject: title },
|
|
1331
|
-
cancelOngoingRequest: vi.fn(),
|
|
1332
|
-
});
|
|
1333
|
-
// Act: Render the container
|
|
1334
|
-
const { unmount } = renderAppContainer({
|
|
1335
|
-
settings: mockSettingsWithTitleEnabled,
|
|
1336
|
-
});
|
|
1337
|
-
// Assert: Check that the correct ANSI escape sequence is used
|
|
1338
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1339
|
-
expect(titleWrites).toHaveLength(1);
|
|
1340
|
-
const expectedEscapeSequence = `\x1b]0;${`✦ ${title} (workspace)`.padEnd(80, ' ')}\x07`;
|
|
1341
|
-
expect(titleWrites[0][0]).toBe(expectedEscapeSequence);
|
|
1342
|
-
unmount();
|
|
1343
|
-
});
|
|
1344
|
-
it('should use CLI_TITLE environment variable when set', () => {
|
|
1345
|
-
// Arrange: Set up mock settings with showStatusInTitle disabled (so it shows suffix)
|
|
1346
|
-
const mockSettingsWithTitleDisabled = {
|
|
1347
|
-
...mockSettings,
|
|
1348
|
-
merged: {
|
|
1349
|
-
...mockSettings.merged,
|
|
1350
|
-
ui: {
|
|
1351
|
-
...mockSettings.merged.ui,
|
|
1352
|
-
showStatusInTitle: false,
|
|
1353
|
-
hideWindowTitle: false,
|
|
1354
|
-
},
|
|
1355
|
-
},
|
|
1356
|
-
};
|
|
1357
|
-
// Mock CLI_TITLE environment variable
|
|
1358
|
-
vi.stubEnv('CLI_TITLE', 'Custom Gemini Title');
|
|
1359
|
-
// Mock the streaming state
|
|
1360
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1361
|
-
streamingState: 'responding',
|
|
1362
|
-
submitQuery: vi.fn(),
|
|
1363
|
-
initError: null,
|
|
1364
|
-
pendingHistoryItems: [],
|
|
1365
|
-
thought: null,
|
|
1366
|
-
cancelOngoingRequest: vi.fn(),
|
|
1367
|
-
});
|
|
1368
|
-
// Act: Render the container
|
|
1369
|
-
const { unmount } = renderAppContainer({
|
|
1370
|
-
settings: mockSettingsWithTitleDisabled,
|
|
1371
|
-
});
|
|
1372
|
-
// Assert: Check that title was updated with CLI_TITLE value
|
|
1373
|
-
const titleWrites = mocks.mockStdout.write.mock.calls.filter((call) => call[0].includes('\x1b]0;'));
|
|
1374
|
-
expect(titleWrites).toHaveLength(1);
|
|
1375
|
-
expect(titleWrites[0][0]).toBe(`\x1b]0;${'✦ Working… (Custom Gemini Title)'.padEnd(80, ' ')}\x07`);
|
|
1376
|
-
unmount();
|
|
1377
|
-
});
|
|
1378
|
-
});
|
|
1379
|
-
describe('Queue Error Message', () => {
|
|
1380
|
-
beforeEach(() => {
|
|
1381
|
-
vi.useFakeTimers();
|
|
1382
|
-
});
|
|
1383
|
-
afterEach(() => {
|
|
1384
|
-
vi.useRealTimers();
|
|
1385
|
-
vi.restoreAllMocks();
|
|
1386
|
-
});
|
|
1387
|
-
it('should set and clear the queue error message after a timeout', async () => {
|
|
1388
|
-
const { rerender, unmount } = renderAppContainer();
|
|
1389
|
-
await act(async () => {
|
|
1390
|
-
vi.advanceTimersByTime(0);
|
|
1391
|
-
});
|
|
1392
|
-
expect(capturedUIState.queueErrorMessage).toBeNull();
|
|
1393
|
-
act(() => {
|
|
1394
|
-
capturedUIActions.setQueueErrorMessage('Test error');
|
|
1395
|
-
});
|
|
1396
|
-
rerender(getAppContainer());
|
|
1397
|
-
expect(capturedUIState.queueErrorMessage).toBe('Test error');
|
|
1398
|
-
act(() => {
|
|
1399
|
-
vi.advanceTimersByTime(3000);
|
|
1400
|
-
});
|
|
1401
|
-
rerender(getAppContainer());
|
|
1402
|
-
expect(capturedUIState.queueErrorMessage).toBeNull();
|
|
1403
|
-
unmount();
|
|
1404
|
-
});
|
|
1405
|
-
it('should reset the timer if a new error message is set', async () => {
|
|
1406
|
-
const { rerender, unmount } = renderAppContainer();
|
|
1407
|
-
await act(async () => {
|
|
1408
|
-
vi.advanceTimersByTime(0);
|
|
1409
|
-
});
|
|
1410
|
-
act(() => {
|
|
1411
|
-
capturedUIActions.setQueueErrorMessage('First error');
|
|
1412
|
-
});
|
|
1413
|
-
rerender(getAppContainer());
|
|
1414
|
-
expect(capturedUIState.queueErrorMessage).toBe('First error');
|
|
1415
|
-
act(() => {
|
|
1416
|
-
vi.advanceTimersByTime(1500);
|
|
1417
|
-
});
|
|
1418
|
-
act(() => {
|
|
1419
|
-
capturedUIActions.setQueueErrorMessage('Second error');
|
|
1420
|
-
});
|
|
1421
|
-
rerender(getAppContainer());
|
|
1422
|
-
expect(capturedUIState.queueErrorMessage).toBe('Second error');
|
|
1423
|
-
act(() => {
|
|
1424
|
-
vi.advanceTimersByTime(2000);
|
|
1425
|
-
});
|
|
1426
|
-
rerender(getAppContainer());
|
|
1427
|
-
expect(capturedUIState.queueErrorMessage).toBe('Second error');
|
|
1428
|
-
// 5. Advance time past the 3 second timeout from the second message
|
|
1429
|
-
act(() => {
|
|
1430
|
-
vi.advanceTimersByTime(1000);
|
|
1431
|
-
});
|
|
1432
|
-
rerender(getAppContainer());
|
|
1433
|
-
expect(capturedUIState.queueErrorMessage).toBeNull();
|
|
1434
|
-
unmount();
|
|
1435
|
-
});
|
|
1436
|
-
});
|
|
1437
|
-
describe('Terminal Height Calculation', () => {
|
|
1438
|
-
const mockedMeasureElement = measureElement;
|
|
1439
|
-
const mockedUseTerminalSize = useTerminalSize;
|
|
1440
|
-
it('should prevent terminal height from being less than 1', async () => {
|
|
1441
|
-
const resizePtySpy = vi.spyOn(ShellExecutionService, 'resizePty');
|
|
1442
|
-
// Arrange: Simulate a small terminal and a large footer
|
|
1443
|
-
mockedUseTerminalSize.mockReturnValue({ columns: 80, rows: 5 });
|
|
1444
|
-
mockedMeasureElement.mockReturnValue({ width: 80, height: 10 }); // Footer is taller than the screen
|
|
1445
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1446
|
-
streamingState: 'idle',
|
|
1447
|
-
submitQuery: vi.fn(),
|
|
1448
|
-
initError: null,
|
|
1449
|
-
pendingHistoryItems: [],
|
|
1450
|
-
thought: null,
|
|
1451
|
-
cancelOngoingRequest: vi.fn(),
|
|
1452
|
-
activePtyId: 'some-id',
|
|
1453
|
-
});
|
|
1454
|
-
let unmount;
|
|
1455
|
-
await act(async () => {
|
|
1456
|
-
const result = renderAppContainer();
|
|
1457
|
-
unmount = result.unmount;
|
|
1458
|
-
});
|
|
1459
|
-
await waitFor(() => expect(resizePtySpy).toHaveBeenCalled());
|
|
1460
|
-
const lastCall = resizePtySpy.mock.calls[resizePtySpy.mock.calls.length - 1];
|
|
1461
|
-
// Check the height argument specifically
|
|
1462
|
-
expect(lastCall[2]).toBe(1);
|
|
1463
|
-
unmount();
|
|
1464
|
-
});
|
|
1465
|
-
});
|
|
1466
|
-
describe('Keyboard Input Handling (CTRL+C / CTRL+D)', () => {
|
|
1467
|
-
let handleGlobalKeypress;
|
|
1468
|
-
let mockHandleSlashCommand;
|
|
1469
|
-
let mockCancelOngoingRequest;
|
|
1470
|
-
let rerender;
|
|
1471
|
-
let unmount;
|
|
1472
|
-
// Helper function to reduce boilerplate in tests
|
|
1473
|
-
const setupKeypressTest = async () => {
|
|
1474
|
-
const renderResult = renderAppContainer();
|
|
1475
|
-
await act(async () => {
|
|
1476
|
-
vi.advanceTimersByTime(0);
|
|
1477
|
-
});
|
|
1478
|
-
rerender = () => renderResult.rerender(getAppContainer());
|
|
1479
|
-
unmount = renderResult.unmount;
|
|
1480
|
-
};
|
|
1481
|
-
const pressKey = (key, times = 1) => {
|
|
1482
|
-
for (let i = 0; i < times; i++) {
|
|
1483
|
-
act(() => {
|
|
1484
|
-
handleGlobalKeypress({
|
|
1485
|
-
name: 'c',
|
|
1486
|
-
shift: false,
|
|
1487
|
-
alt: false,
|
|
1488
|
-
ctrl: false,
|
|
1489
|
-
cmd: false,
|
|
1490
|
-
...key,
|
|
1491
|
-
});
|
|
1492
|
-
});
|
|
1493
|
-
rerender();
|
|
1494
|
-
}
|
|
1495
|
-
};
|
|
1496
|
-
beforeEach(() => {
|
|
1497
|
-
// Capture the keypress handler from the AppContainer
|
|
1498
|
-
mockedUseKeypress.mockImplementation((callback) => {
|
|
1499
|
-
handleGlobalKeypress = callback;
|
|
1500
|
-
});
|
|
1501
|
-
// Mock slash command handler
|
|
1502
|
-
mockHandleSlashCommand = vi.fn();
|
|
1503
|
-
mockedUseSlashCommandProcessor.mockReturnValue({
|
|
1504
|
-
handleSlashCommand: mockHandleSlashCommand,
|
|
1505
|
-
slashCommands: [],
|
|
1506
|
-
pendingHistoryItems: [],
|
|
1507
|
-
commandContext: {},
|
|
1508
|
-
shellConfirmationRequest: null,
|
|
1509
|
-
confirmationRequest: null,
|
|
1510
|
-
});
|
|
1511
|
-
// Mock request cancellation
|
|
1512
|
-
mockCancelOngoingRequest = vi.fn();
|
|
1513
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1514
|
-
streamingState: 'idle',
|
|
1515
|
-
submitQuery: vi.fn(),
|
|
1516
|
-
initError: null,
|
|
1517
|
-
pendingHistoryItems: [],
|
|
1518
|
-
thought: null,
|
|
1519
|
-
cancelOngoingRequest: mockCancelOngoingRequest,
|
|
1520
|
-
});
|
|
1521
|
-
// Default empty text buffer
|
|
1522
|
-
mockedUseTextBuffer.mockReturnValue({
|
|
1523
|
-
text: '',
|
|
1524
|
-
setText: vi.fn(),
|
|
1525
|
-
});
|
|
1526
|
-
vi.useFakeTimers();
|
|
1527
|
-
});
|
|
1528
|
-
afterEach(() => {
|
|
1529
|
-
vi.useRealTimers();
|
|
1530
|
-
vi.restoreAllMocks();
|
|
1531
|
-
});
|
|
1532
|
-
describe('CTRL+C', () => {
|
|
1533
|
-
it('should cancel ongoing request on first press', async () => {
|
|
1534
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1535
|
-
streamingState: 'responding',
|
|
1536
|
-
submitQuery: vi.fn(),
|
|
1537
|
-
initError: null,
|
|
1538
|
-
pendingHistoryItems: [],
|
|
1539
|
-
thought: null,
|
|
1540
|
-
cancelOngoingRequest: mockCancelOngoingRequest,
|
|
1541
|
-
});
|
|
1542
|
-
await setupKeypressTest();
|
|
1543
|
-
pressKey({ name: 'c', ctrl: true });
|
|
1544
|
-
expect(mockCancelOngoingRequest).toHaveBeenCalledTimes(1);
|
|
1545
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1546
|
-
unmount();
|
|
1547
|
-
});
|
|
1548
|
-
it('should quit on second press', async () => {
|
|
1549
|
-
await setupKeypressTest();
|
|
1550
|
-
pressKey({ name: 'c', ctrl: true }, 2);
|
|
1551
|
-
expect(mockCancelOngoingRequest).toHaveBeenCalledTimes(2);
|
|
1552
|
-
expect(mockHandleSlashCommand).toHaveBeenCalledWith('/quit', undefined, undefined, false);
|
|
1553
|
-
unmount();
|
|
1554
|
-
});
|
|
1555
|
-
it('should reset press count after a timeout', async () => {
|
|
1556
|
-
await setupKeypressTest();
|
|
1557
|
-
pressKey({ name: 'c', ctrl: true });
|
|
1558
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1559
|
-
// Advance timer past the reset threshold
|
|
1560
|
-
act(() => {
|
|
1561
|
-
vi.advanceTimersByTime(1001);
|
|
1562
|
-
});
|
|
1563
|
-
pressKey({ name: 'c', ctrl: true });
|
|
1564
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1565
|
-
unmount();
|
|
1566
|
-
});
|
|
1567
|
-
});
|
|
1568
|
-
describe('CTRL+D', () => {
|
|
1569
|
-
it('should do nothing if text buffer is not empty', async () => {
|
|
1570
|
-
mockedUseTextBuffer.mockReturnValue({
|
|
1571
|
-
text: 'some text',
|
|
1572
|
-
setText: vi.fn(),
|
|
1573
|
-
});
|
|
1574
|
-
await setupKeypressTest();
|
|
1575
|
-
pressKey({ name: 'd', ctrl: true }, 2);
|
|
1576
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1577
|
-
unmount();
|
|
1578
|
-
});
|
|
1579
|
-
it('should quit on second press if buffer is empty', async () => {
|
|
1580
|
-
await setupKeypressTest();
|
|
1581
|
-
pressKey({ name: 'd', ctrl: true }, 2);
|
|
1582
|
-
expect(mockHandleSlashCommand).toHaveBeenCalledWith('/quit', undefined, undefined, false);
|
|
1583
|
-
unmount();
|
|
1584
|
-
});
|
|
1585
|
-
it('should reset press count after a timeout', async () => {
|
|
1586
|
-
await setupKeypressTest();
|
|
1587
|
-
pressKey({ name: 'd', ctrl: true });
|
|
1588
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1589
|
-
// Advance timer past the reset threshold
|
|
1590
|
-
act(() => {
|
|
1591
|
-
vi.advanceTimersByTime(1001);
|
|
1592
|
-
});
|
|
1593
|
-
pressKey({ name: 'd', ctrl: true });
|
|
1594
|
-
expect(mockHandleSlashCommand).not.toHaveBeenCalled();
|
|
1595
|
-
unmount();
|
|
1596
|
-
});
|
|
1597
|
-
});
|
|
1598
|
-
});
|
|
1599
|
-
describe('Copy Mode (CTRL+S)', () => {
|
|
1600
|
-
let handleGlobalKeypress;
|
|
1601
|
-
let rerender;
|
|
1602
|
-
let unmount;
|
|
1603
|
-
const setupCopyModeTest = async (isAlternateMode = false) => {
|
|
1604
|
-
// Update settings for this test run
|
|
1605
|
-
const defaultMergedSettings = mergeSettings({}, {}, {}, {}, true);
|
|
1606
|
-
const testSettings = {
|
|
1607
|
-
...mockSettings,
|
|
1608
|
-
merged: {
|
|
1609
|
-
...defaultMergedSettings,
|
|
1610
|
-
ui: {
|
|
1611
|
-
...defaultMergedSettings.ui,
|
|
1612
|
-
useAlternateBuffer: isAlternateMode,
|
|
1613
|
-
},
|
|
1614
|
-
},
|
|
1615
|
-
};
|
|
1616
|
-
const renderResult = renderAppContainer({ settings: testSettings });
|
|
1617
|
-
await act(async () => {
|
|
1618
|
-
vi.advanceTimersByTime(0);
|
|
1619
|
-
});
|
|
1620
|
-
rerender = () => renderResult.rerender(getAppContainer({ settings: testSettings }));
|
|
1621
|
-
unmount = renderResult.unmount;
|
|
1622
|
-
};
|
|
1623
|
-
beforeEach(() => {
|
|
1624
|
-
mocks.mockStdout.write.mockClear();
|
|
1625
|
-
mockedUseKeypress.mockImplementation((callback) => {
|
|
1626
|
-
handleGlobalKeypress = callback;
|
|
1627
|
-
});
|
|
1628
|
-
vi.useFakeTimers();
|
|
1629
|
-
});
|
|
1630
|
-
afterEach(() => {
|
|
1631
|
-
vi.useRealTimers();
|
|
1632
|
-
vi.restoreAllMocks();
|
|
1633
|
-
});
|
|
1634
|
-
describe.each([
|
|
1635
|
-
{
|
|
1636
|
-
isAlternateMode: false,
|
|
1637
|
-
shouldEnable: false,
|
|
1638
|
-
modeName: 'Normal Mode',
|
|
1639
|
-
},
|
|
1640
|
-
{
|
|
1641
|
-
isAlternateMode: true,
|
|
1642
|
-
shouldEnable: true,
|
|
1643
|
-
modeName: 'Alternate Buffer Mode',
|
|
1644
|
-
},
|
|
1645
|
-
])('$modeName', ({ isAlternateMode, shouldEnable }) => {
|
|
1646
|
-
it(`should ${shouldEnable ? 'toggle' : 'NOT toggle'} mouse off when Ctrl+S is pressed`, async () => {
|
|
1647
|
-
await setupCopyModeTest(isAlternateMode);
|
|
1648
|
-
mocks.mockStdout.write.mockClear(); // Clear initial enable call
|
|
1649
|
-
act(() => {
|
|
1650
|
-
handleGlobalKeypress({
|
|
1651
|
-
name: 's',
|
|
1652
|
-
shift: false,
|
|
1653
|
-
alt: false,
|
|
1654
|
-
ctrl: true,
|
|
1655
|
-
cmd: false,
|
|
1656
|
-
insertable: false,
|
|
1657
|
-
sequence: '\x13',
|
|
1658
|
-
});
|
|
1659
|
-
});
|
|
1660
|
-
rerender();
|
|
1661
|
-
if (shouldEnable) {
|
|
1662
|
-
expect(disableMouseEvents).toHaveBeenCalled();
|
|
1663
|
-
}
|
|
1664
|
-
else {
|
|
1665
|
-
expect(disableMouseEvents).not.toHaveBeenCalled();
|
|
1666
|
-
}
|
|
1667
|
-
unmount();
|
|
1668
|
-
});
|
|
1669
|
-
if (shouldEnable) {
|
|
1670
|
-
it('should toggle mouse back on when Ctrl+S is pressed again', async () => {
|
|
1671
|
-
await setupCopyModeTest(isAlternateMode);
|
|
1672
|
-
writeToStdout.mockClear();
|
|
1673
|
-
// Turn it on (disable mouse)
|
|
1674
|
-
act(() => {
|
|
1675
|
-
handleGlobalKeypress({
|
|
1676
|
-
name: 's',
|
|
1677
|
-
shift: false,
|
|
1678
|
-
alt: false,
|
|
1679
|
-
ctrl: true,
|
|
1680
|
-
cmd: false,
|
|
1681
|
-
insertable: false,
|
|
1682
|
-
sequence: '\x13',
|
|
1683
|
-
});
|
|
1684
|
-
});
|
|
1685
|
-
rerender();
|
|
1686
|
-
expect(disableMouseEvents).toHaveBeenCalled();
|
|
1687
|
-
// Turn it off (enable mouse)
|
|
1688
|
-
act(() => {
|
|
1689
|
-
handleGlobalKeypress({
|
|
1690
|
-
name: 'any', // Any key should exit copy mode
|
|
1691
|
-
shift: false,
|
|
1692
|
-
alt: false,
|
|
1693
|
-
ctrl: false,
|
|
1694
|
-
cmd: false,
|
|
1695
|
-
insertable: true,
|
|
1696
|
-
sequence: 'a',
|
|
1697
|
-
});
|
|
1698
|
-
});
|
|
1699
|
-
rerender();
|
|
1700
|
-
expect(enableMouseEvents).toHaveBeenCalled();
|
|
1701
|
-
unmount();
|
|
1702
|
-
});
|
|
1703
|
-
it('should exit copy mode on any key press', async () => {
|
|
1704
|
-
await setupCopyModeTest(isAlternateMode);
|
|
1705
|
-
// Enter copy mode
|
|
1706
|
-
act(() => {
|
|
1707
|
-
handleGlobalKeypress({
|
|
1708
|
-
name: 's',
|
|
1709
|
-
shift: false,
|
|
1710
|
-
alt: false,
|
|
1711
|
-
ctrl: true,
|
|
1712
|
-
cmd: false,
|
|
1713
|
-
insertable: false,
|
|
1714
|
-
sequence: '\x13',
|
|
1715
|
-
});
|
|
1716
|
-
});
|
|
1717
|
-
rerender();
|
|
1718
|
-
writeToStdout.mockClear();
|
|
1719
|
-
// Press any other key
|
|
1720
|
-
act(() => {
|
|
1721
|
-
handleGlobalKeypress({
|
|
1722
|
-
name: 'a',
|
|
1723
|
-
shift: false,
|
|
1724
|
-
alt: false,
|
|
1725
|
-
ctrl: false,
|
|
1726
|
-
cmd: false,
|
|
1727
|
-
insertable: true,
|
|
1728
|
-
sequence: 'a',
|
|
1729
|
-
});
|
|
1730
|
-
});
|
|
1731
|
-
rerender();
|
|
1732
|
-
// Should have re-enabled mouse
|
|
1733
|
-
expect(enableMouseEvents).toHaveBeenCalled();
|
|
1734
|
-
unmount();
|
|
1735
|
-
});
|
|
1736
|
-
}
|
|
1737
|
-
});
|
|
1738
|
-
});
|
|
1739
|
-
describe('Model Dialog Integration', () => {
|
|
1740
|
-
it('should provide isModelDialogOpen in the UIStateContext', async () => {
|
|
1741
|
-
mockedUseModelCommand.mockReturnValue({
|
|
1742
|
-
isModelDialogOpen: true,
|
|
1743
|
-
openModelDialog: vi.fn(),
|
|
1744
|
-
closeModelDialog: vi.fn(),
|
|
1745
|
-
});
|
|
1746
|
-
let unmount;
|
|
1747
|
-
await act(async () => {
|
|
1748
|
-
const result = renderAppContainer();
|
|
1749
|
-
unmount = result.unmount;
|
|
1750
|
-
});
|
|
1751
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1752
|
-
expect(capturedUIState.isModelDialogOpen).toBe(true);
|
|
1753
|
-
unmount();
|
|
1754
|
-
});
|
|
1755
|
-
it('should provide model dialog actions in the UIActionsContext', async () => {
|
|
1756
|
-
const mockCloseModelDialog = vi.fn();
|
|
1757
|
-
mockedUseModelCommand.mockReturnValue({
|
|
1758
|
-
isModelDialogOpen: false,
|
|
1759
|
-
openModelDialog: vi.fn(),
|
|
1760
|
-
closeModelDialog: mockCloseModelDialog,
|
|
1761
|
-
});
|
|
1762
|
-
let unmount;
|
|
1763
|
-
await act(async () => {
|
|
1764
|
-
const result = renderAppContainer();
|
|
1765
|
-
unmount = result.unmount;
|
|
1766
|
-
});
|
|
1767
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1768
|
-
// Verify that the actions are correctly passed through context
|
|
1769
|
-
act(() => {
|
|
1770
|
-
capturedUIActions.closeModelDialog();
|
|
1771
|
-
});
|
|
1772
|
-
expect(mockCloseModelDialog).toHaveBeenCalled();
|
|
1773
|
-
unmount();
|
|
1774
|
-
});
|
|
1775
|
-
});
|
|
1776
|
-
describe('Agent Configuration Dialog Integration', () => {
|
|
1777
|
-
it('should initialize with dialog closed and no agent selected', async () => {
|
|
1778
|
-
let unmount;
|
|
1779
|
-
await act(async () => {
|
|
1780
|
-
const result = renderAppContainer();
|
|
1781
|
-
unmount = result.unmount;
|
|
1782
|
-
});
|
|
1783
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1784
|
-
expect(capturedUIState.isAgentConfigDialogOpen).toBe(false);
|
|
1785
|
-
expect(capturedUIState.selectedAgentName).toBeUndefined();
|
|
1786
|
-
expect(capturedUIState.selectedAgentDisplayName).toBeUndefined();
|
|
1787
|
-
expect(capturedUIState.selectedAgentDefinition).toBeUndefined();
|
|
1788
|
-
unmount();
|
|
1789
|
-
});
|
|
1790
|
-
it('should update state when openAgentConfigDialog is called', async () => {
|
|
1791
|
-
let unmount;
|
|
1792
|
-
await act(async () => {
|
|
1793
|
-
const result = renderAppContainer();
|
|
1794
|
-
unmount = result.unmount;
|
|
1795
|
-
});
|
|
1796
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1797
|
-
const agentDefinition = { name: 'test-agent' };
|
|
1798
|
-
act(() => {
|
|
1799
|
-
capturedUIActions.openAgentConfigDialog('test-agent', 'Test Agent', agentDefinition);
|
|
1800
|
-
});
|
|
1801
|
-
expect(capturedUIState.isAgentConfigDialogOpen).toBe(true);
|
|
1802
|
-
expect(capturedUIState.selectedAgentName).toBe('test-agent');
|
|
1803
|
-
expect(capturedUIState.selectedAgentDisplayName).toBe('Test Agent');
|
|
1804
|
-
expect(capturedUIState.selectedAgentDefinition).toEqual(agentDefinition);
|
|
1805
|
-
unmount();
|
|
1806
|
-
});
|
|
1807
|
-
it('should clear state when closeAgentConfigDialog is called', async () => {
|
|
1808
|
-
let unmount;
|
|
1809
|
-
await act(async () => {
|
|
1810
|
-
const result = renderAppContainer();
|
|
1811
|
-
unmount = result.unmount;
|
|
1812
|
-
});
|
|
1813
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1814
|
-
const agentDefinition = { name: 'test-agent' };
|
|
1815
|
-
act(() => {
|
|
1816
|
-
capturedUIActions.openAgentConfigDialog('test-agent', 'Test Agent', agentDefinition);
|
|
1817
|
-
});
|
|
1818
|
-
expect(capturedUIState.isAgentConfigDialogOpen).toBe(true);
|
|
1819
|
-
act(() => {
|
|
1820
|
-
capturedUIActions.closeAgentConfigDialog();
|
|
1821
|
-
});
|
|
1822
|
-
expect(capturedUIState.isAgentConfigDialogOpen).toBe(false);
|
|
1823
|
-
expect(capturedUIState.selectedAgentName).toBeUndefined();
|
|
1824
|
-
expect(capturedUIState.selectedAgentDisplayName).toBeUndefined();
|
|
1825
|
-
expect(capturedUIState.selectedAgentDefinition).toBeUndefined();
|
|
1826
|
-
unmount();
|
|
1827
|
-
});
|
|
1828
|
-
});
|
|
1829
|
-
describe('CoreEvents Integration', () => {
|
|
1830
|
-
it('subscribes to UserFeedback and drains backlog on mount', async () => {
|
|
1831
|
-
let unmount;
|
|
1832
|
-
await act(async () => {
|
|
1833
|
-
const result = renderAppContainer();
|
|
1834
|
-
unmount = result.unmount;
|
|
1835
|
-
});
|
|
1836
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1837
|
-
expect(mockCoreEvents.on).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
|
|
1838
|
-
expect(mockCoreEvents.drainBacklogs).toHaveBeenCalledTimes(1);
|
|
1839
|
-
unmount();
|
|
1840
|
-
});
|
|
1841
|
-
it('unsubscribes from UserFeedback on unmount', async () => {
|
|
1842
|
-
let unmount;
|
|
1843
|
-
await act(async () => {
|
|
1844
|
-
const result = renderAppContainer();
|
|
1845
|
-
unmount = result.unmount;
|
|
1846
|
-
});
|
|
1847
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1848
|
-
unmount();
|
|
1849
|
-
expect(mockCoreEvents.off).toHaveBeenCalledWith(CoreEvent.UserFeedback, expect.any(Function));
|
|
1850
|
-
});
|
|
1851
|
-
it('adds history item when UserFeedback event is received', async () => {
|
|
1852
|
-
let unmount;
|
|
1853
|
-
await act(async () => {
|
|
1854
|
-
const result = renderAppContainer();
|
|
1855
|
-
unmount = result.unmount;
|
|
1856
|
-
});
|
|
1857
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1858
|
-
// Get the registered handler
|
|
1859
|
-
const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.UserFeedback)?.[1];
|
|
1860
|
-
expect(handler).toBeDefined();
|
|
1861
|
-
// Simulate an event
|
|
1862
|
-
const payload = {
|
|
1863
|
-
severity: 'error',
|
|
1864
|
-
message: 'Test error message',
|
|
1865
|
-
};
|
|
1866
|
-
act(() => {
|
|
1867
|
-
handler(payload);
|
|
1868
|
-
});
|
|
1869
|
-
expect(mockedUseHistory().addItem).toHaveBeenCalledWith(expect.objectContaining({
|
|
1870
|
-
type: 'error',
|
|
1871
|
-
text: 'Test error message',
|
|
1872
|
-
}), expect.any(Number));
|
|
1873
|
-
unmount();
|
|
1874
|
-
});
|
|
1875
|
-
it('updates currentModel when ModelChanged event is received', async () => {
|
|
1876
|
-
// Arrange: Mock initial model
|
|
1877
|
-
vi.spyOn(mockConfig, 'getModel').mockReturnValue('initial-model');
|
|
1878
|
-
let unmount;
|
|
1879
|
-
await act(async () => {
|
|
1880
|
-
const result = renderAppContainer();
|
|
1881
|
-
unmount = result.unmount;
|
|
1882
|
-
});
|
|
1883
|
-
await waitFor(() => {
|
|
1884
|
-
expect(capturedUIState?.currentModel).toBe('initial-model');
|
|
1885
|
-
});
|
|
1886
|
-
// Get the registered handler for ModelChanged
|
|
1887
|
-
const handler = mockCoreEvents.on.mock.calls.find((call) => call[0] === CoreEvent.ModelChanged)?.[1];
|
|
1888
|
-
expect(handler).toBeDefined();
|
|
1889
|
-
// Act: Simulate ModelChanged event
|
|
1890
|
-
// Update config mock to return new model since the handler reads from config
|
|
1891
|
-
vi.spyOn(mockConfig, 'getModel').mockReturnValue('new-model');
|
|
1892
|
-
act(() => {
|
|
1893
|
-
handler({ model: 'new-model' });
|
|
1894
|
-
});
|
|
1895
|
-
// Assert: Verify model is updated
|
|
1896
|
-
await waitFor(() => {
|
|
1897
|
-
expect(capturedUIState.currentModel).toBe('new-model');
|
|
1898
|
-
});
|
|
1899
|
-
unmount();
|
|
1900
|
-
});
|
|
1901
|
-
it('provides activeHooks from useHookDisplayState', async () => {
|
|
1902
|
-
const mockHooks = [{ name: 'hook1', eventName: 'event1' }];
|
|
1903
|
-
mockedUseHookDisplayState.mockReturnValue(mockHooks);
|
|
1904
|
-
let unmount;
|
|
1905
|
-
await act(async () => {
|
|
1906
|
-
const result = renderAppContainer();
|
|
1907
|
-
unmount = result.unmount;
|
|
1908
|
-
});
|
|
1909
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1910
|
-
expect(capturedUIState.activeHooks).toEqual(mockHooks);
|
|
1911
|
-
unmount();
|
|
1912
|
-
});
|
|
1913
|
-
});
|
|
1914
|
-
describe('Shell Interaction', () => {
|
|
1915
|
-
it('should not crash if resizing the pty fails', async () => {
|
|
1916
|
-
const resizePtySpy = vi
|
|
1917
|
-
.spyOn(ShellExecutionService, 'resizePty')
|
|
1918
|
-
.mockImplementation(() => {
|
|
1919
|
-
throw new Error('Cannot resize a pty that has already exited');
|
|
1920
|
-
});
|
|
1921
|
-
mockedUseGeminiStream.mockReturnValue({
|
|
1922
|
-
streamingState: 'idle',
|
|
1923
|
-
submitQuery: vi.fn(),
|
|
1924
|
-
initError: null,
|
|
1925
|
-
pendingHistoryItems: [],
|
|
1926
|
-
thought: null,
|
|
1927
|
-
cancelOngoingRequest: vi.fn(),
|
|
1928
|
-
activePtyId: 'some-pty-id', // Make sure activePtyId is set
|
|
1929
|
-
});
|
|
1930
|
-
// The main assertion is that the render does not throw.
|
|
1931
|
-
let unmount;
|
|
1932
|
-
await act(async () => {
|
|
1933
|
-
const result = renderAppContainer();
|
|
1934
|
-
unmount = result.unmount;
|
|
1935
|
-
});
|
|
1936
|
-
await waitFor(() => expect(resizePtySpy).toHaveBeenCalled());
|
|
1937
|
-
unmount();
|
|
1938
|
-
});
|
|
1939
|
-
});
|
|
1940
|
-
describe('Banner Text', () => {
|
|
1941
|
-
it('should render placeholder banner text for USE_GEMINI auth type', async () => {
|
|
1942
|
-
const config = makeFakeConfig();
|
|
1943
|
-
vi.spyOn(config, 'getContentGeneratorConfig').mockReturnValue({
|
|
1944
|
-
authType: AuthType.USE_GEMINI,
|
|
1945
|
-
apiKey: 'fake-key',
|
|
1946
|
-
});
|
|
1947
|
-
let unmount;
|
|
1948
|
-
await act(async () => {
|
|
1949
|
-
const result = renderAppContainer();
|
|
1950
|
-
unmount = result.unmount;
|
|
1951
|
-
});
|
|
1952
|
-
await waitFor(() => {
|
|
1953
|
-
expect(capturedUIState.bannerData.defaultText).toBeDefined();
|
|
1954
|
-
unmount();
|
|
1955
|
-
});
|
|
1956
|
-
});
|
|
1957
|
-
});
|
|
1958
|
-
describe('onCancelSubmit Behavior', () => {
|
|
1959
|
-
let mockSetText;
|
|
1960
|
-
// Helper to extract arguments from the useGeminiStream hook call
|
|
1961
|
-
// This isolates the positional argument dependency to a single location
|
|
1962
|
-
const extractUseGeminiStreamArgs = (args) => ({
|
|
1963
|
-
onCancelSubmit: args[13],
|
|
1964
|
-
});
|
|
1965
|
-
beforeEach(() => {
|
|
1966
|
-
mockSetText = vi.fn();
|
|
1967
|
-
mockedUseTextBuffer.mockReturnValue({
|
|
1968
|
-
text: '',
|
|
1969
|
-
setText: mockSetText,
|
|
1970
|
-
});
|
|
1971
|
-
});
|
|
1972
|
-
it('clears the prompt when onCancelSubmit is called with shouldRestorePrompt=false', async () => {
|
|
1973
|
-
let unmount;
|
|
1974
|
-
await act(async () => {
|
|
1975
|
-
const result = renderAppContainer();
|
|
1976
|
-
unmount = result.unmount;
|
|
1977
|
-
});
|
|
1978
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
1979
|
-
const { onCancelSubmit } = extractUseGeminiStreamArgs(mockedUseGeminiStream.mock.lastCall);
|
|
1980
|
-
act(() => {
|
|
1981
|
-
onCancelSubmit(false);
|
|
1982
|
-
});
|
|
1983
|
-
expect(mockSetText).toHaveBeenCalledWith('');
|
|
1984
|
-
unmount();
|
|
1985
|
-
});
|
|
1986
|
-
it('restores the prompt when onCancelSubmit is called with shouldRestorePrompt=true (or undefined)', async () => {
|
|
1987
|
-
// Mock useInputHistoryStore to provide input history
|
|
1988
|
-
mockedUseInputHistoryStore.mockReturnValue({
|
|
1989
|
-
inputHistory: ['previous message'],
|
|
1990
|
-
addInput: vi.fn(),
|
|
1991
|
-
initializeFromLogger: vi.fn(),
|
|
1992
|
-
});
|
|
1993
|
-
let unmount;
|
|
1994
|
-
await act(async () => {
|
|
1995
|
-
const result = renderAppContainer();
|
|
1996
|
-
unmount = result.unmount;
|
|
1997
|
-
});
|
|
1998
|
-
await waitFor(() => expect(capturedUIState.userMessages).toContain('previous message'));
|
|
1999
|
-
const { onCancelSubmit } = extractUseGeminiStreamArgs(mockedUseGeminiStream.mock.lastCall);
|
|
2000
|
-
await act(async () => {
|
|
2001
|
-
onCancelSubmit(true);
|
|
2002
|
-
});
|
|
2003
|
-
await waitFor(() => {
|
|
2004
|
-
expect(mockSetText).toHaveBeenCalledWith('previous message');
|
|
2005
|
-
});
|
|
2006
|
-
unmount();
|
|
2007
|
-
});
|
|
2008
|
-
it('input history is independent from conversation history (survives /clear)', async () => {
|
|
2009
|
-
// This test verifies that input history (used for up-arrow navigation) is maintained
|
|
2010
|
-
// separately from conversation history and survives /clear operations.
|
|
2011
|
-
const mockAddInput = vi.fn();
|
|
2012
|
-
mockedUseInputHistoryStore.mockReturnValue({
|
|
2013
|
-
inputHistory: ['first prompt', 'second prompt'],
|
|
2014
|
-
addInput: mockAddInput,
|
|
2015
|
-
initializeFromLogger: vi.fn(),
|
|
2016
|
-
});
|
|
2017
|
-
let rerender;
|
|
2018
|
-
let unmount;
|
|
2019
|
-
await act(async () => {
|
|
2020
|
-
const result = renderAppContainer();
|
|
2021
|
-
rerender = result.rerender;
|
|
2022
|
-
unmount = result.unmount;
|
|
2023
|
-
});
|
|
2024
|
-
// Verify userMessages is populated from inputHistory
|
|
2025
|
-
await waitFor(() => expect(capturedUIState.userMessages).toContain('first prompt'));
|
|
2026
|
-
expect(capturedUIState.userMessages).toContain('second prompt');
|
|
2027
|
-
// Clear the conversation history (simulating /clear command)
|
|
2028
|
-
const mockClearItems = vi.fn();
|
|
2029
|
-
mockedUseHistory.mockReturnValue({
|
|
2030
|
-
history: [],
|
|
2031
|
-
addItem: vi.fn(),
|
|
2032
|
-
updateItem: vi.fn(),
|
|
2033
|
-
clearItems: mockClearItems,
|
|
2034
|
-
loadHistory: vi.fn(),
|
|
2035
|
-
});
|
|
2036
|
-
await act(async () => {
|
|
2037
|
-
// Rerender to apply the new mock.
|
|
2038
|
-
rerender(getAppContainer());
|
|
2039
|
-
});
|
|
2040
|
-
// Verify that userMessages still contains the input history
|
|
2041
|
-
// (it should not be affected by clearing conversation history)
|
|
2042
|
-
expect(capturedUIState.userMessages).toContain('first prompt');
|
|
2043
|
-
expect(capturedUIState.userMessages).toContain('second prompt');
|
|
2044
|
-
unmount();
|
|
2045
|
-
});
|
|
2046
|
-
});
|
|
2047
|
-
describe('Regression Tests', () => {
|
|
2048
|
-
it('does not refresh static on startup if banner text is empty', async () => {
|
|
2049
|
-
// Mock banner text to be empty strings
|
|
2050
|
-
vi.spyOn(mockConfig, 'getBannerTextNoCapacityIssues').mockResolvedValue('');
|
|
2051
|
-
vi.spyOn(mockConfig, 'getBannerTextCapacityIssues').mockResolvedValue('');
|
|
2052
|
-
// Clear previous calls
|
|
2053
|
-
mocks.mockStdout.write.mockClear();
|
|
2054
|
-
let compUnmount = () => { };
|
|
2055
|
-
await act(async () => {
|
|
2056
|
-
const { unmount } = renderAppContainer();
|
|
2057
|
-
compUnmount = unmount;
|
|
2058
|
-
});
|
|
2059
|
-
// Allow async effects to run
|
|
2060
|
-
await waitFor(() => expect(capturedUIState).toBeTruthy());
|
|
2061
|
-
// Wait for fetchBannerTexts to complete
|
|
2062
|
-
await act(async () => {
|
|
2063
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
2064
|
-
});
|
|
2065
|
-
// Check that clearTerminal was NOT written to stdout
|
|
2066
|
-
const clearTerminalCalls = mocks.mockStdout.write.mock.calls.filter((call) => call[0] === ansiEscapes.clearTerminal);
|
|
2067
|
-
expect(clearTerminalCalls).toHaveLength(0);
|
|
2068
|
-
compUnmount();
|
|
2069
|
-
});
|
|
2070
|
-
});
|
|
2071
|
-
});
|
|
2072
|
-
//# sourceMappingURL=AppContainer.test.js.map
|