@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,2413 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import * as os from 'node:os';
|
|
8
|
-
import * as path from 'node:path';
|
|
9
|
-
import { DEFAULT_FILE_FILTERING_OPTIONS, OutputFormat, SHELL_TOOL_NAME, WRITE_FILE_TOOL_NAME, EDIT_TOOL_NAME, WEB_FETCH_TOOL_NAME, debugLogger, ApprovalMode, } from '@didim365/agent-cli-core';
|
|
10
|
-
import { loadCliConfig, parseArguments } from './config.js';
|
|
11
|
-
import { createTestMergedSettings } from './settings.js';
|
|
12
|
-
import * as ServerConfig from '@didim365/agent-cli-core';
|
|
13
|
-
import { isWorkspaceTrusted } from './trustedFolders.js';
|
|
14
|
-
import { ExtensionManager } from './extension-manager.js';
|
|
15
|
-
import { RESUME_LATEST } from '../utils/sessionUtils.js';
|
|
16
|
-
vi.mock('./trustedFolders.js', () => ({
|
|
17
|
-
isWorkspaceTrusted: vi.fn(() => ({ isTrusted: true, source: 'file' })), // Default to trusted
|
|
18
|
-
}));
|
|
19
|
-
vi.mock('./sandboxConfig.js', () => ({
|
|
20
|
-
loadSandboxConfig: vi.fn(async () => undefined),
|
|
21
|
-
}));
|
|
22
|
-
vi.mock('../commands/utils.js', () => ({
|
|
23
|
-
exitCli: vi.fn(),
|
|
24
|
-
}));
|
|
25
|
-
vi.mock('fs', async (importOriginal) => {
|
|
26
|
-
const actualFs = await importOriginal();
|
|
27
|
-
const pathMod = await import('node:path');
|
|
28
|
-
const mockHome = pathMod.resolve(pathMod.sep, 'mock', 'home', 'user');
|
|
29
|
-
const MOCK_CWD1 = process.cwd();
|
|
30
|
-
const MOCK_CWD2 = pathMod.resolve(pathMod.sep, 'home', 'user', 'project');
|
|
31
|
-
const mockPaths = new Set([
|
|
32
|
-
MOCK_CWD1,
|
|
33
|
-
MOCK_CWD2,
|
|
34
|
-
pathMod.resolve(pathMod.sep, 'cli', 'path1'),
|
|
35
|
-
pathMod.resolve(pathMod.sep, 'settings', 'path1'),
|
|
36
|
-
pathMod.join(mockHome, 'settings', 'path2'),
|
|
37
|
-
pathMod.join(MOCK_CWD2, 'cli', 'path2'),
|
|
38
|
-
pathMod.join(MOCK_CWD2, 'settings', 'path3'),
|
|
39
|
-
]);
|
|
40
|
-
return {
|
|
41
|
-
...actualFs,
|
|
42
|
-
mkdirSync: vi.fn((p) => {
|
|
43
|
-
mockPaths.add(p.toString());
|
|
44
|
-
}),
|
|
45
|
-
writeFileSync: vi.fn(),
|
|
46
|
-
existsSync: vi.fn((p) => mockPaths.has(p.toString())),
|
|
47
|
-
statSync: vi.fn((p) => {
|
|
48
|
-
if (mockPaths.has(p.toString())) {
|
|
49
|
-
return { isDirectory: () => true };
|
|
50
|
-
}
|
|
51
|
-
return actualFs.statSync(p);
|
|
52
|
-
}),
|
|
53
|
-
realpathSync: vi.fn((p) => p),
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
vi.mock('os', async (importOriginal) => {
|
|
57
|
-
const actualOs = await importOriginal();
|
|
58
|
-
return {
|
|
59
|
-
...actualOs,
|
|
60
|
-
homedir: vi.fn(() => path.resolve(path.sep, 'mock', 'home', 'user')),
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
vi.mock('open', () => ({
|
|
64
|
-
default: vi.fn(),
|
|
65
|
-
}));
|
|
66
|
-
vi.mock('read-package-up', () => ({
|
|
67
|
-
readPackageUp: vi.fn(() => Promise.resolve({ packageJson: { version: 'test-version' } })),
|
|
68
|
-
}));
|
|
69
|
-
vi.mock('@didim365/agent-cli-core', async () => {
|
|
70
|
-
const actualServer = await vi.importActual('@didim365/agent-cli-core');
|
|
71
|
-
return {
|
|
72
|
-
...actualServer,
|
|
73
|
-
IdeClient: {
|
|
74
|
-
getInstance: vi.fn().mockResolvedValue({
|
|
75
|
-
getConnectionStatus: vi.fn(),
|
|
76
|
-
initialize: vi.fn(),
|
|
77
|
-
shutdown: vi.fn(),
|
|
78
|
-
}),
|
|
79
|
-
},
|
|
80
|
-
loadEnvironment: vi.fn(),
|
|
81
|
-
loadServerHierarchicalMemory: vi.fn((cwd, dirs, debug, fileService, extensionLoader, _maxDirs) => {
|
|
82
|
-
const extensionPaths = extensionLoader
|
|
83
|
-
.getExtensions()
|
|
84
|
-
.flatMap((e) => e.contextFiles);
|
|
85
|
-
return Promise.resolve({
|
|
86
|
-
memoryContent: extensionPaths.join(',') || '',
|
|
87
|
-
fileCount: extensionPaths?.length || 0,
|
|
88
|
-
filePaths: extensionPaths,
|
|
89
|
-
});
|
|
90
|
-
}),
|
|
91
|
-
DEFAULT_MEMORY_FILE_FILTERING_OPTIONS: {
|
|
92
|
-
respectGitIgnore: false,
|
|
93
|
-
respectGeminiIgnore: true,
|
|
94
|
-
},
|
|
95
|
-
DEFAULT_FILE_FILTERING_OPTIONS: {
|
|
96
|
-
respectGitIgnore: true,
|
|
97
|
-
respectGeminiIgnore: true,
|
|
98
|
-
},
|
|
99
|
-
createPolicyEngineConfig: vi.fn(async () => ({
|
|
100
|
-
rules: [],
|
|
101
|
-
checkers: [],
|
|
102
|
-
defaultDecision: ServerConfig.PolicyDecision.ASK_USER,
|
|
103
|
-
approvalMode: ServerConfig.ApprovalMode.DEFAULT,
|
|
104
|
-
})),
|
|
105
|
-
};
|
|
106
|
-
});
|
|
107
|
-
vi.mock('./extension-manager.js', () => {
|
|
108
|
-
const ExtensionManager = vi.fn();
|
|
109
|
-
ExtensionManager.prototype.loadExtensions = vi.fn();
|
|
110
|
-
ExtensionManager.prototype.getExtensions = vi.fn().mockReturnValue([]);
|
|
111
|
-
return { ExtensionManager };
|
|
112
|
-
});
|
|
113
|
-
// Global setup to ensure clean environment for all tests in this file
|
|
114
|
-
const originalArgv = process.argv;
|
|
115
|
-
const originalGeminiModel = process.env['GEMINI_MODEL'];
|
|
116
|
-
beforeEach(() => {
|
|
117
|
-
delete process.env['GEMINI_MODEL'];
|
|
118
|
-
// Restore ExtensionManager mocks by re-assigning them
|
|
119
|
-
ExtensionManager.prototype.getExtensions = vi.fn().mockReturnValue([]);
|
|
120
|
-
ExtensionManager.prototype.loadExtensions = vi
|
|
121
|
-
.fn()
|
|
122
|
-
.mockResolvedValue(undefined);
|
|
123
|
-
});
|
|
124
|
-
afterEach(() => {
|
|
125
|
-
process.argv = originalArgv;
|
|
126
|
-
if (originalGeminiModel !== undefined) {
|
|
127
|
-
process.env['GEMINI_MODEL'] = originalGeminiModel;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
delete process.env['GEMINI_MODEL'];
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
describe('parseArguments', () => {
|
|
134
|
-
it.each([
|
|
135
|
-
{
|
|
136
|
-
description: 'long flags',
|
|
137
|
-
argv: [
|
|
138
|
-
'node',
|
|
139
|
-
'script.js',
|
|
140
|
-
'--prompt',
|
|
141
|
-
'test prompt',
|
|
142
|
-
'--prompt-interactive',
|
|
143
|
-
'interactive prompt',
|
|
144
|
-
],
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
description: 'short flags',
|
|
148
|
-
argv: [
|
|
149
|
-
'node',
|
|
150
|
-
'script.js',
|
|
151
|
-
'-p',
|
|
152
|
-
'test prompt',
|
|
153
|
-
'-i',
|
|
154
|
-
'interactive prompt',
|
|
155
|
-
],
|
|
156
|
-
},
|
|
157
|
-
])('should throw an error when using conflicting prompt flags ($description)', async ({ argv }) => {
|
|
158
|
-
process.argv = argv;
|
|
159
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
160
|
-
throw new Error('process.exit called');
|
|
161
|
-
});
|
|
162
|
-
const mockConsoleError = vi
|
|
163
|
-
.spyOn(console, 'error')
|
|
164
|
-
.mockImplementation(() => { });
|
|
165
|
-
await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
|
|
166
|
-
expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Cannot use both --prompt (-p) and --prompt-interactive (-i) together'));
|
|
167
|
-
mockExit.mockRestore();
|
|
168
|
-
mockConsoleError.mockRestore();
|
|
169
|
-
});
|
|
170
|
-
it.each([
|
|
171
|
-
{
|
|
172
|
-
description: 'should allow --prompt without --prompt-interactive',
|
|
173
|
-
argv: ['node', 'script.js', '--prompt', 'test prompt'],
|
|
174
|
-
expected: { prompt: 'test prompt', promptInteractive: undefined },
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
description: 'should allow --prompt-interactive without --prompt',
|
|
178
|
-
argv: ['node', 'script.js', '--prompt-interactive', 'interactive prompt'],
|
|
179
|
-
expected: { prompt: undefined, promptInteractive: 'interactive prompt' },
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
description: 'should allow -i flag as alias for --prompt-interactive',
|
|
183
|
-
argv: ['node', 'script.js', '-i', 'interactive prompt'],
|
|
184
|
-
expected: { prompt: undefined, promptInteractive: 'interactive prompt' },
|
|
185
|
-
},
|
|
186
|
-
])('$description', async ({ argv, expected }) => {
|
|
187
|
-
process.argv = argv;
|
|
188
|
-
const parsedArgs = await parseArguments(createTestMergedSettings());
|
|
189
|
-
expect(parsedArgs.prompt).toBe(expected.prompt);
|
|
190
|
-
expect(parsedArgs.promptInteractive).toBe(expected.promptInteractive);
|
|
191
|
-
});
|
|
192
|
-
describe('positional arguments and @commands', () => {
|
|
193
|
-
it.each([
|
|
194
|
-
{
|
|
195
|
-
description: 'should convert positional query argument to prompt by default',
|
|
196
|
-
argv: ['node', 'script.js', 'Hi Gemini'],
|
|
197
|
-
expectedQuery: 'Hi Gemini',
|
|
198
|
-
expectedModel: undefined,
|
|
199
|
-
debug: false,
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
description: 'should map @path to prompt (one-shot) when it starts with @',
|
|
203
|
-
argv: ['node', 'script.js', '@path ./file.md'],
|
|
204
|
-
expectedQuery: '@path ./file.md',
|
|
205
|
-
expectedModel: undefined,
|
|
206
|
-
debug: false,
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
description: 'should map @path to prompt even when config flags are present',
|
|
210
|
-
argv: [
|
|
211
|
-
'node',
|
|
212
|
-
'script.js',
|
|
213
|
-
'@path',
|
|
214
|
-
'./file.md',
|
|
215
|
-
'--model',
|
|
216
|
-
'gemini-2.5-pro',
|
|
217
|
-
],
|
|
218
|
-
expectedQuery: '@path ./file.md',
|
|
219
|
-
expectedModel: 'gemini-2.5-pro',
|
|
220
|
-
debug: false,
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
description: 'maps unquoted positional @path + arg to prompt (one-shot)',
|
|
224
|
-
argv: ['node', 'script.js', '@path', './file.md'],
|
|
225
|
-
expectedQuery: '@path ./file.md',
|
|
226
|
-
expectedModel: undefined,
|
|
227
|
-
debug: false,
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
description: 'should handle multiple @path arguments in a single command (one-shot)',
|
|
231
|
-
argv: [
|
|
232
|
-
'node',
|
|
233
|
-
'script.js',
|
|
234
|
-
'@path',
|
|
235
|
-
'./file1.md',
|
|
236
|
-
'@path',
|
|
237
|
-
'./file2.md',
|
|
238
|
-
],
|
|
239
|
-
expectedQuery: '@path ./file1.md @path ./file2.md',
|
|
240
|
-
expectedModel: undefined,
|
|
241
|
-
debug: false,
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
description: 'should handle mixed quoted and unquoted @path arguments (one-shot)',
|
|
245
|
-
argv: [
|
|
246
|
-
'node',
|
|
247
|
-
'script.js',
|
|
248
|
-
'@path ./file1.md',
|
|
249
|
-
'@path',
|
|
250
|
-
'./file2.md',
|
|
251
|
-
'additional text',
|
|
252
|
-
],
|
|
253
|
-
expectedQuery: '@path ./file1.md @path ./file2.md additional text',
|
|
254
|
-
expectedModel: undefined,
|
|
255
|
-
debug: false,
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
description: 'should map @path to prompt with ambient flags (debug)',
|
|
259
|
-
argv: ['node', 'script.js', '@path', './file.md', '--debug'],
|
|
260
|
-
expectedQuery: '@path ./file.md',
|
|
261
|
-
expectedModel: undefined,
|
|
262
|
-
debug: true,
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
description: 'should map @include to prompt (one-shot)',
|
|
266
|
-
argv: ['node', 'script.js', '@include src/'],
|
|
267
|
-
expectedQuery: '@include src/',
|
|
268
|
-
expectedModel: undefined,
|
|
269
|
-
debug: false,
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
description: 'should map @search to prompt (one-shot)',
|
|
273
|
-
argv: ['node', 'script.js', '@search pattern'],
|
|
274
|
-
expectedQuery: '@search pattern',
|
|
275
|
-
expectedModel: undefined,
|
|
276
|
-
debug: false,
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
description: 'should map @web to prompt (one-shot)',
|
|
280
|
-
argv: ['node', 'script.js', '@web query'],
|
|
281
|
-
expectedQuery: '@web query',
|
|
282
|
-
expectedModel: undefined,
|
|
283
|
-
debug: false,
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
description: 'should map @git to prompt (one-shot)',
|
|
287
|
-
argv: ['node', 'script.js', '@git status'],
|
|
288
|
-
expectedQuery: '@git status',
|
|
289
|
-
expectedModel: undefined,
|
|
290
|
-
debug: false,
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
description: 'should handle @command with leading whitespace',
|
|
294
|
-
argv: ['node', 'script.js', ' @path ./file.md'],
|
|
295
|
-
expectedQuery: ' @path ./file.md',
|
|
296
|
-
expectedModel: undefined,
|
|
297
|
-
debug: false,
|
|
298
|
-
},
|
|
299
|
-
])('$description', async ({ argv, expectedQuery, expectedModel, debug }) => {
|
|
300
|
-
process.argv = argv;
|
|
301
|
-
const parsedArgs = await parseArguments(createTestMergedSettings());
|
|
302
|
-
expect(parsedArgs.query).toBe(expectedQuery);
|
|
303
|
-
expect(parsedArgs.prompt).toBe(expectedQuery);
|
|
304
|
-
expect(parsedArgs.promptInteractive).toBeUndefined();
|
|
305
|
-
if (expectedModel) {
|
|
306
|
-
expect(parsedArgs.model).toBe(expectedModel);
|
|
307
|
-
}
|
|
308
|
-
if (debug) {
|
|
309
|
-
expect(parsedArgs.debug).toBe(true);
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
it('should include a startup message when converting positional query to interactive prompt', async () => {
|
|
313
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
314
|
-
process.stdin.isTTY = true;
|
|
315
|
-
process.argv = ['node', 'script.js', 'hello'];
|
|
316
|
-
try {
|
|
317
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
318
|
-
expect(argv.startupMessages).toContain('Positional arguments now default to interactive mode. To run in non-interactive mode, use the --prompt (-p) flag.');
|
|
319
|
-
}
|
|
320
|
-
finally {
|
|
321
|
-
process.stdin.isTTY = originalIsTTY;
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
it.each([
|
|
326
|
-
{
|
|
327
|
-
description: 'long flags',
|
|
328
|
-
argv: ['node', 'script.js', '--yolo', '--approval-mode', 'default'],
|
|
329
|
-
},
|
|
330
|
-
{
|
|
331
|
-
description: 'short flags',
|
|
332
|
-
argv: ['node', 'script.js', '-y', '--approval-mode', 'yolo'],
|
|
333
|
-
},
|
|
334
|
-
])('should throw an error when using conflicting yolo/approval-mode flags ($description)', async ({ argv }) => {
|
|
335
|
-
process.argv = argv;
|
|
336
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
337
|
-
throw new Error('process.exit called');
|
|
338
|
-
});
|
|
339
|
-
const mockConsoleError = vi
|
|
340
|
-
.spyOn(console, 'error')
|
|
341
|
-
.mockImplementation(() => { });
|
|
342
|
-
await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
|
|
343
|
-
expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.'));
|
|
344
|
-
mockExit.mockRestore();
|
|
345
|
-
mockConsoleError.mockRestore();
|
|
346
|
-
});
|
|
347
|
-
it.each([
|
|
348
|
-
{
|
|
349
|
-
description: 'should allow --approval-mode without --yolo',
|
|
350
|
-
argv: ['node', 'script.js', '--approval-mode', 'auto_edit'],
|
|
351
|
-
expected: { approvalMode: 'auto_edit', yolo: false },
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
description: 'should allow --yolo without --approval-mode',
|
|
355
|
-
argv: ['node', 'script.js', '--yolo'],
|
|
356
|
-
expected: { approvalMode: undefined, yolo: true },
|
|
357
|
-
},
|
|
358
|
-
])('$description', async ({ argv, expected }) => {
|
|
359
|
-
process.argv = argv;
|
|
360
|
-
const parsedArgs = await parseArguments(createTestMergedSettings());
|
|
361
|
-
expect(parsedArgs.approvalMode).toBe(expected.approvalMode);
|
|
362
|
-
expect(parsedArgs.yolo).toBe(expected.yolo);
|
|
363
|
-
});
|
|
364
|
-
it('should reject invalid --approval-mode values', async () => {
|
|
365
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'invalid'];
|
|
366
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
367
|
-
throw new Error('process.exit called');
|
|
368
|
-
});
|
|
369
|
-
const mockConsoleError = vi
|
|
370
|
-
.spyOn(console, 'error')
|
|
371
|
-
.mockImplementation(() => { });
|
|
372
|
-
const debugErrorSpy = vi
|
|
373
|
-
.spyOn(debugLogger, 'error')
|
|
374
|
-
.mockImplementation(() => { });
|
|
375
|
-
await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
|
|
376
|
-
expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid values:'));
|
|
377
|
-
expect(mockConsoleError).toHaveBeenCalled();
|
|
378
|
-
mockExit.mockRestore();
|
|
379
|
-
mockConsoleError.mockRestore();
|
|
380
|
-
debugErrorSpy.mockRestore();
|
|
381
|
-
});
|
|
382
|
-
it('should allow resuming a session without prompt argument in non-interactive mode (expecting stdin)', async () => {
|
|
383
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
384
|
-
process.stdin.isTTY = false;
|
|
385
|
-
process.argv = ['node', 'script.js', '--resume', 'session-id'];
|
|
386
|
-
try {
|
|
387
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
388
|
-
expect(argv.resume).toBe('session-id');
|
|
389
|
-
}
|
|
390
|
-
finally {
|
|
391
|
-
process.stdin.isTTY = originalIsTTY;
|
|
392
|
-
}
|
|
393
|
-
});
|
|
394
|
-
it('should return RESUME_LATEST constant when --resume is passed without a value', async () => {
|
|
395
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
396
|
-
process.stdin.isTTY = true; // Make it interactive to avoid validation error
|
|
397
|
-
process.argv = ['node', 'script.js', '--resume'];
|
|
398
|
-
try {
|
|
399
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
400
|
-
expect(argv.resume).toBe(RESUME_LATEST);
|
|
401
|
-
expect(argv.resume).toBe('latest');
|
|
402
|
-
}
|
|
403
|
-
finally {
|
|
404
|
-
process.stdin.isTTY = originalIsTTY;
|
|
405
|
-
}
|
|
406
|
-
});
|
|
407
|
-
it('should support comma-separated values for --allowed-tools', async () => {
|
|
408
|
-
process.argv = [
|
|
409
|
-
'node',
|
|
410
|
-
'script.js',
|
|
411
|
-
'--allowed-tools',
|
|
412
|
-
'read_file,ShellTool(git status)',
|
|
413
|
-
];
|
|
414
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
415
|
-
expect(argv.allowedTools).toEqual(['read_file', 'ShellTool(git status)']);
|
|
416
|
-
});
|
|
417
|
-
it('should support comma-separated values for --allowed-mcp-server-names', async () => {
|
|
418
|
-
process.argv = [
|
|
419
|
-
'node',
|
|
420
|
-
'script.js',
|
|
421
|
-
'--allowed-mcp-server-names',
|
|
422
|
-
'server1,server2',
|
|
423
|
-
];
|
|
424
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
425
|
-
expect(argv.allowedMcpServerNames).toEqual(['server1', 'server2']);
|
|
426
|
-
});
|
|
427
|
-
it('should support comma-separated values for --extensions', async () => {
|
|
428
|
-
process.argv = ['node', 'script.js', '--extensions', 'ext1,ext2'];
|
|
429
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
430
|
-
expect(argv.extensions).toEqual(['ext1', 'ext2']);
|
|
431
|
-
});
|
|
432
|
-
it('should correctly parse positional arguments when flags with arguments are present', async () => {
|
|
433
|
-
process.argv = [
|
|
434
|
-
'node',
|
|
435
|
-
'script.js',
|
|
436
|
-
'--model',
|
|
437
|
-
'test-model-string',
|
|
438
|
-
'my-positional-arg',
|
|
439
|
-
];
|
|
440
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
441
|
-
expect(argv.model).toBe('test-model-string');
|
|
442
|
-
expect(argv.query).toBe('my-positional-arg');
|
|
443
|
-
});
|
|
444
|
-
it('should handle long positional prompts with multiple flags', async () => {
|
|
445
|
-
process.argv = [
|
|
446
|
-
'node',
|
|
447
|
-
'script.js',
|
|
448
|
-
'-e',
|
|
449
|
-
'none',
|
|
450
|
-
'--approval-mode=auto_edit',
|
|
451
|
-
'--allowed-tools=ShellTool',
|
|
452
|
-
'--allowed-tools=ShellTool(whoami)',
|
|
453
|
-
'--allowed-tools=ShellTool(wc)',
|
|
454
|
-
'Use whoami to write a poem in file poem.md about my username in pig latin and use wc to tell me how many lines are in the poem you wrote.',
|
|
455
|
-
];
|
|
456
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
457
|
-
expect(argv.extensions).toEqual(['none']);
|
|
458
|
-
expect(argv.approvalMode).toBe('auto_edit');
|
|
459
|
-
expect(argv.allowedTools).toEqual([
|
|
460
|
-
'ShellTool',
|
|
461
|
-
'ShellTool(whoami)',
|
|
462
|
-
'ShellTool(wc)',
|
|
463
|
-
]);
|
|
464
|
-
expect(argv.query).toBe('Use whoami to write a poem in file poem.md about my username in pig latin and use wc to tell me how many lines are in the poem you wrote.');
|
|
465
|
-
});
|
|
466
|
-
it('should set isCommand to true for mcp command', async () => {
|
|
467
|
-
process.argv = ['node', 'script.js', 'mcp', 'list'];
|
|
468
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
469
|
-
expect(argv.isCommand).toBe(true);
|
|
470
|
-
});
|
|
471
|
-
it('should set isCommand to true for extensions command', async () => {
|
|
472
|
-
process.argv = ['node', 'script.js', 'extensions', 'list'];
|
|
473
|
-
// Extensions command uses experimental settings
|
|
474
|
-
const settings = createTestMergedSettings({
|
|
475
|
-
experimental: { extensionManagement: true },
|
|
476
|
-
});
|
|
477
|
-
const argv = await parseArguments(settings);
|
|
478
|
-
expect(argv.isCommand).toBe(true);
|
|
479
|
-
});
|
|
480
|
-
it('should set isCommand to true for skills command', async () => {
|
|
481
|
-
process.argv = ['node', 'script.js', 'skills', 'list'];
|
|
482
|
-
// Skills command enabled by default or via experimental
|
|
483
|
-
const settings = createTestMergedSettings({
|
|
484
|
-
experimental: { skills: true },
|
|
485
|
-
});
|
|
486
|
-
const argv = await parseArguments(settings);
|
|
487
|
-
expect(argv.isCommand).toBe(true);
|
|
488
|
-
});
|
|
489
|
-
it('should set isCommand to true for hooks command', async () => {
|
|
490
|
-
process.argv = ['node', 'script.js', 'hooks', 'migrate'];
|
|
491
|
-
// Hooks command enabled via tools settings
|
|
492
|
-
const settings = createTestMergedSettings({
|
|
493
|
-
tools: { enableHooks: true },
|
|
494
|
-
});
|
|
495
|
-
const argv = await parseArguments(settings);
|
|
496
|
-
expect(argv.isCommand).toBe(true);
|
|
497
|
-
});
|
|
498
|
-
});
|
|
499
|
-
describe('loadCliConfig', () => {
|
|
500
|
-
beforeEach(() => {
|
|
501
|
-
vi.resetAllMocks();
|
|
502
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
503
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
504
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
505
|
-
});
|
|
506
|
-
afterEach(() => {
|
|
507
|
-
vi.unstubAllEnvs();
|
|
508
|
-
vi.restoreAllMocks();
|
|
509
|
-
});
|
|
510
|
-
describe('Proxy configuration', () => {
|
|
511
|
-
const originalProxyEnv = {};
|
|
512
|
-
const proxyEnvVars = [
|
|
513
|
-
'HTTP_PROXY',
|
|
514
|
-
'HTTPS_PROXY',
|
|
515
|
-
'http_proxy',
|
|
516
|
-
'https_proxy',
|
|
517
|
-
];
|
|
518
|
-
beforeEach(() => {
|
|
519
|
-
for (const key of proxyEnvVars) {
|
|
520
|
-
originalProxyEnv[key] = process.env[key];
|
|
521
|
-
delete process.env[key];
|
|
522
|
-
}
|
|
523
|
-
});
|
|
524
|
-
afterEach(() => {
|
|
525
|
-
for (const key of proxyEnvVars) {
|
|
526
|
-
if (originalProxyEnv[key]) {
|
|
527
|
-
process.env[key] = originalProxyEnv[key];
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
delete process.env[key];
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
});
|
|
534
|
-
it(`should leave proxy to empty by default`, async () => {
|
|
535
|
-
process.argv = ['node', 'script.js'];
|
|
536
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
537
|
-
const settings = createTestMergedSettings();
|
|
538
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
539
|
-
expect(config.getProxy()).toBeFalsy();
|
|
540
|
-
});
|
|
541
|
-
const proxy_url = 'http://localhost:7890';
|
|
542
|
-
const testCases = [
|
|
543
|
-
{
|
|
544
|
-
input: {
|
|
545
|
-
env_name: 'https_proxy',
|
|
546
|
-
proxy_url,
|
|
547
|
-
},
|
|
548
|
-
expected: proxy_url,
|
|
549
|
-
},
|
|
550
|
-
{
|
|
551
|
-
input: {
|
|
552
|
-
env_name: 'http_proxy',
|
|
553
|
-
proxy_url,
|
|
554
|
-
},
|
|
555
|
-
expected: proxy_url,
|
|
556
|
-
},
|
|
557
|
-
{
|
|
558
|
-
input: {
|
|
559
|
-
env_name: 'HTTPS_PROXY',
|
|
560
|
-
proxy_url,
|
|
561
|
-
},
|
|
562
|
-
expected: proxy_url,
|
|
563
|
-
},
|
|
564
|
-
{
|
|
565
|
-
input: {
|
|
566
|
-
env_name: 'HTTP_PROXY',
|
|
567
|
-
proxy_url,
|
|
568
|
-
},
|
|
569
|
-
expected: proxy_url,
|
|
570
|
-
},
|
|
571
|
-
];
|
|
572
|
-
testCases.forEach(({ input, expected }) => {
|
|
573
|
-
it(`should set proxy to ${expected} according to environment variable [${input.env_name}]`, async () => {
|
|
574
|
-
vi.stubEnv(input.env_name, input.proxy_url);
|
|
575
|
-
process.argv = ['node', 'script.js'];
|
|
576
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
577
|
-
const settings = createTestMergedSettings();
|
|
578
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
579
|
-
expect(config.getProxy()).toBe(expected);
|
|
580
|
-
});
|
|
581
|
-
});
|
|
582
|
-
});
|
|
583
|
-
it('should use default fileFilter options when unconfigured', async () => {
|
|
584
|
-
process.argv = ['node', 'script.js'];
|
|
585
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
586
|
-
const settings = createTestMergedSettings();
|
|
587
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
588
|
-
expect(config.getFileFilteringRespectGitIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore);
|
|
589
|
-
expect(config.getFileFilteringRespectGeminiIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGeminiIgnore);
|
|
590
|
-
expect(config.getApprovalMode()).toBe(ApprovalMode.DEFAULT);
|
|
591
|
-
});
|
|
592
|
-
it('should be non-interactive when isCommand is set', async () => {
|
|
593
|
-
process.argv = ['node', 'script.js', 'mcp', 'list'];
|
|
594
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
595
|
-
argv.isCommand = true; // explicitly set it as if middleware ran (it does in parseArguments but we want to be sure for this isolated test if we were mocking argv)
|
|
596
|
-
// reset tty for this test
|
|
597
|
-
process.stdin.isTTY = true;
|
|
598
|
-
const settings = createTestMergedSettings();
|
|
599
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
600
|
-
expect(config.isInteractive()).toBe(false);
|
|
601
|
-
});
|
|
602
|
-
});
|
|
603
|
-
describe('Hierarchical Memory Loading (config.ts) - Placeholder Suite', () => {
|
|
604
|
-
beforeEach(() => {
|
|
605
|
-
vi.resetAllMocks();
|
|
606
|
-
// Restore ExtensionManager mocks that were reset
|
|
607
|
-
ExtensionManager.prototype.getExtensions = vi.fn().mockReturnValue([]);
|
|
608
|
-
ExtensionManager.prototype.loadExtensions = vi
|
|
609
|
-
.fn()
|
|
610
|
-
.mockResolvedValue(undefined);
|
|
611
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
612
|
-
// Other common mocks would be reset here.
|
|
613
|
-
});
|
|
614
|
-
afterEach(() => {
|
|
615
|
-
vi.restoreAllMocks();
|
|
616
|
-
});
|
|
617
|
-
it('should pass extension context file paths to loadServerHierarchicalMemory', async () => {
|
|
618
|
-
process.argv = ['node', 'script.js'];
|
|
619
|
-
const settings = createTestMergedSettings();
|
|
620
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
621
|
-
{
|
|
622
|
-
path: '/path/to/ext1',
|
|
623
|
-
name: 'ext1',
|
|
624
|
-
id: 'ext1-id',
|
|
625
|
-
version: '1.0.0',
|
|
626
|
-
contextFiles: ['/path/to/ext1/GEMINI.md'],
|
|
627
|
-
isActive: true,
|
|
628
|
-
},
|
|
629
|
-
{
|
|
630
|
-
path: '/path/to/ext2',
|
|
631
|
-
name: 'ext2',
|
|
632
|
-
id: 'ext2-id',
|
|
633
|
-
version: '1.0.0',
|
|
634
|
-
contextFiles: [],
|
|
635
|
-
isActive: true,
|
|
636
|
-
},
|
|
637
|
-
{
|
|
638
|
-
path: '/path/to/ext3',
|
|
639
|
-
name: 'ext3',
|
|
640
|
-
id: 'ext3-id',
|
|
641
|
-
version: '1.0.0',
|
|
642
|
-
contextFiles: [
|
|
643
|
-
'/path/to/ext3/context1.md',
|
|
644
|
-
'/path/to/ext3/context2.md',
|
|
645
|
-
],
|
|
646
|
-
isActive: true,
|
|
647
|
-
},
|
|
648
|
-
]);
|
|
649
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
650
|
-
await loadCliConfig(settings, 'session-id', argv);
|
|
651
|
-
expect(ServerConfig.loadServerHierarchicalMemory).toHaveBeenCalledWith(expect.any(String), [], false, expect.any(Object), expect.any(ExtensionManager), true, 'tree', expect.objectContaining({
|
|
652
|
-
respectGitIgnore: true,
|
|
653
|
-
respectGeminiIgnore: true,
|
|
654
|
-
}), 200);
|
|
655
|
-
});
|
|
656
|
-
it('should pass includeDirectories to loadServerHierarchicalMemory when loadMemoryFromIncludeDirectories is true', async () => {
|
|
657
|
-
process.argv = ['node', 'script.js'];
|
|
658
|
-
const includeDir = path.resolve(path.sep, 'path', 'to', 'include');
|
|
659
|
-
const settings = createTestMergedSettings({
|
|
660
|
-
context: {
|
|
661
|
-
includeDirectories: [includeDir],
|
|
662
|
-
loadMemoryFromIncludeDirectories: true,
|
|
663
|
-
},
|
|
664
|
-
});
|
|
665
|
-
const argv = await parseArguments(settings);
|
|
666
|
-
await loadCliConfig(settings, 'session-id', argv);
|
|
667
|
-
expect(ServerConfig.loadServerHierarchicalMemory).toHaveBeenCalledWith(expect.any(String), [includeDir], false, expect.any(Object), expect.any(ExtensionManager), true, 'tree', expect.objectContaining({
|
|
668
|
-
respectGitIgnore: true,
|
|
669
|
-
respectGeminiIgnore: true,
|
|
670
|
-
}), 200);
|
|
671
|
-
});
|
|
672
|
-
it('should NOT pass includeDirectories to loadServerHierarchicalMemory when loadMemoryFromIncludeDirectories is false', async () => {
|
|
673
|
-
process.argv = ['node', 'script.js'];
|
|
674
|
-
const settings = createTestMergedSettings({
|
|
675
|
-
context: {
|
|
676
|
-
includeDirectories: ['/path/to/include'],
|
|
677
|
-
loadMemoryFromIncludeDirectories: false,
|
|
678
|
-
},
|
|
679
|
-
});
|
|
680
|
-
const argv = await parseArguments(settings);
|
|
681
|
-
await loadCliConfig(settings, 'session-id', argv);
|
|
682
|
-
expect(ServerConfig.loadServerHierarchicalMemory).toHaveBeenCalledWith(expect.any(String), [], false, expect.any(Object), expect.any(ExtensionManager), true, 'tree', expect.objectContaining({
|
|
683
|
-
respectGitIgnore: true,
|
|
684
|
-
respectGeminiIgnore: true,
|
|
685
|
-
}), 200);
|
|
686
|
-
});
|
|
687
|
-
});
|
|
688
|
-
describe('mergeMcpServers', () => {
|
|
689
|
-
it('should not modify the original settings object', async () => {
|
|
690
|
-
const settings = createTestMergedSettings({
|
|
691
|
-
mcpServers: {
|
|
692
|
-
'test-server': {
|
|
693
|
-
url: 'http://localhost:8080',
|
|
694
|
-
},
|
|
695
|
-
},
|
|
696
|
-
});
|
|
697
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
698
|
-
{
|
|
699
|
-
path: '/path/to/ext1',
|
|
700
|
-
name: 'ext1',
|
|
701
|
-
id: 'ext1-id',
|
|
702
|
-
version: '1.0.0',
|
|
703
|
-
mcpServers: {
|
|
704
|
-
'ext1-server': {
|
|
705
|
-
url: 'http://localhost:8081',
|
|
706
|
-
},
|
|
707
|
-
},
|
|
708
|
-
contextFiles: [],
|
|
709
|
-
isActive: true,
|
|
710
|
-
},
|
|
711
|
-
]);
|
|
712
|
-
const originalSettings = JSON.parse(JSON.stringify(settings));
|
|
713
|
-
process.argv = ['node', 'script.js'];
|
|
714
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
715
|
-
await loadCliConfig(settings, 'test-session', argv);
|
|
716
|
-
expect(settings).toEqual(originalSettings);
|
|
717
|
-
});
|
|
718
|
-
});
|
|
719
|
-
describe('mergeExcludeTools', () => {
|
|
720
|
-
const defaultExcludes = new Set([
|
|
721
|
-
SHELL_TOOL_NAME,
|
|
722
|
-
EDIT_TOOL_NAME,
|
|
723
|
-
WRITE_FILE_TOOL_NAME,
|
|
724
|
-
WEB_FETCH_TOOL_NAME,
|
|
725
|
-
]);
|
|
726
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
727
|
-
beforeEach(() => {
|
|
728
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
729
|
-
process.stdin.isTTY = true;
|
|
730
|
-
});
|
|
731
|
-
afterEach(() => {
|
|
732
|
-
process.stdin.isTTY = originalIsTTY;
|
|
733
|
-
});
|
|
734
|
-
it('should merge excludeTools from settings and extensions', async () => {
|
|
735
|
-
const settings = createTestMergedSettings({
|
|
736
|
-
tools: { exclude: ['tool1', 'tool2'] },
|
|
737
|
-
});
|
|
738
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
739
|
-
{
|
|
740
|
-
path: '/path/to/ext1',
|
|
741
|
-
name: 'ext1',
|
|
742
|
-
id: 'ext1-id',
|
|
743
|
-
version: '1.0.0',
|
|
744
|
-
excludeTools: ['tool3', 'tool4'],
|
|
745
|
-
contextFiles: [],
|
|
746
|
-
isActive: true,
|
|
747
|
-
},
|
|
748
|
-
{
|
|
749
|
-
path: '/path/to/ext2',
|
|
750
|
-
name: 'ext2',
|
|
751
|
-
id: 'ext2-id',
|
|
752
|
-
version: '1.0.0',
|
|
753
|
-
excludeTools: ['tool5'],
|
|
754
|
-
contextFiles: [],
|
|
755
|
-
isActive: true,
|
|
756
|
-
},
|
|
757
|
-
]);
|
|
758
|
-
process.argv = ['node', 'script.js'];
|
|
759
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
760
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
761
|
-
expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3', 'tool4', 'tool5']));
|
|
762
|
-
expect(config.getExcludeTools()).toHaveLength(5);
|
|
763
|
-
});
|
|
764
|
-
it('should handle overlapping excludeTools between settings and extensions', async () => {
|
|
765
|
-
const settings = createTestMergedSettings({
|
|
766
|
-
tools: { exclude: ['tool1', 'tool2'] },
|
|
767
|
-
});
|
|
768
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
769
|
-
{
|
|
770
|
-
path: '/path/to/ext1',
|
|
771
|
-
name: 'ext1',
|
|
772
|
-
id: 'ext1-id',
|
|
773
|
-
version: '1.0.0',
|
|
774
|
-
excludeTools: ['tool2', 'tool3'],
|
|
775
|
-
contextFiles: [],
|
|
776
|
-
isActive: true,
|
|
777
|
-
},
|
|
778
|
-
]);
|
|
779
|
-
process.argv = ['node', 'script.js'];
|
|
780
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
781
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
782
|
-
expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3']));
|
|
783
|
-
expect(config.getExcludeTools()).toHaveLength(3);
|
|
784
|
-
});
|
|
785
|
-
it('should handle overlapping excludeTools between extensions', async () => {
|
|
786
|
-
const settings = createTestMergedSettings({
|
|
787
|
-
tools: { exclude: ['tool1'] },
|
|
788
|
-
});
|
|
789
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
790
|
-
{
|
|
791
|
-
path: '/path/to/ext1',
|
|
792
|
-
name: 'ext1',
|
|
793
|
-
id: 'ext1-id',
|
|
794
|
-
version: '1.0.0',
|
|
795
|
-
excludeTools: ['tool2', 'tool3'],
|
|
796
|
-
contextFiles: [],
|
|
797
|
-
isActive: true,
|
|
798
|
-
},
|
|
799
|
-
{
|
|
800
|
-
path: '/path/to/ext2',
|
|
801
|
-
name: 'ext2',
|
|
802
|
-
id: 'ext2-id',
|
|
803
|
-
version: '1.0.0',
|
|
804
|
-
excludeTools: ['tool3', 'tool4'],
|
|
805
|
-
contextFiles: [],
|
|
806
|
-
isActive: true,
|
|
807
|
-
},
|
|
808
|
-
]);
|
|
809
|
-
process.argv = ['node', 'script.js'];
|
|
810
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
811
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
812
|
-
expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2', 'tool3', 'tool4']));
|
|
813
|
-
expect(config.getExcludeTools()).toHaveLength(4);
|
|
814
|
-
});
|
|
815
|
-
it('should return an empty array when no excludeTools are specified and it is interactive', async () => {
|
|
816
|
-
process.stdin.isTTY = true;
|
|
817
|
-
const settings = createTestMergedSettings();
|
|
818
|
-
process.argv = ['node', 'script.js'];
|
|
819
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
820
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
821
|
-
expect(config.getExcludeTools()).toEqual(new Set([]));
|
|
822
|
-
});
|
|
823
|
-
it('should return default excludes when no excludeTools are specified and it is not interactive', async () => {
|
|
824
|
-
process.stdin.isTTY = false;
|
|
825
|
-
const settings = createTestMergedSettings();
|
|
826
|
-
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
827
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
828
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
829
|
-
expect(config.getExcludeTools()).toEqual(defaultExcludes);
|
|
830
|
-
});
|
|
831
|
-
it('should handle settings with excludeTools but no extensions', async () => {
|
|
832
|
-
process.argv = ['node', 'script.js'];
|
|
833
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
834
|
-
const settings = createTestMergedSettings({
|
|
835
|
-
tools: { exclude: ['tool1', 'tool2'] },
|
|
836
|
-
});
|
|
837
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
838
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
839
|
-
expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2']));
|
|
840
|
-
expect(config.getExcludeTools()).toHaveLength(2);
|
|
841
|
-
});
|
|
842
|
-
it('should handle extensions with excludeTools but no settings', async () => {
|
|
843
|
-
const settings = createTestMergedSettings();
|
|
844
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
845
|
-
{
|
|
846
|
-
path: '/path/to/ext',
|
|
847
|
-
name: 'ext1',
|
|
848
|
-
id: 'ext1-id',
|
|
849
|
-
version: '1.0.0',
|
|
850
|
-
excludeTools: ['tool1', 'tool2'],
|
|
851
|
-
contextFiles: [],
|
|
852
|
-
isActive: true,
|
|
853
|
-
},
|
|
854
|
-
]);
|
|
855
|
-
process.argv = ['node', 'script.js'];
|
|
856
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
857
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
858
|
-
expect(config.getExcludeTools()).toEqual(new Set(['tool1', 'tool2']));
|
|
859
|
-
expect(config.getExcludeTools()).toHaveLength(2);
|
|
860
|
-
});
|
|
861
|
-
it('should not modify the original settings object', async () => {
|
|
862
|
-
const settings = createTestMergedSettings({
|
|
863
|
-
tools: { exclude: ['tool1'] },
|
|
864
|
-
});
|
|
865
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
866
|
-
{
|
|
867
|
-
path: '/path/to/ext',
|
|
868
|
-
name: 'ext1',
|
|
869
|
-
id: 'ext1-id',
|
|
870
|
-
version: '1.0.0',
|
|
871
|
-
excludeTools: ['tool2'],
|
|
872
|
-
contextFiles: [],
|
|
873
|
-
isActive: true,
|
|
874
|
-
},
|
|
875
|
-
]);
|
|
876
|
-
const originalSettings = JSON.parse(JSON.stringify(settings));
|
|
877
|
-
process.argv = ['node', 'script.js'];
|
|
878
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
879
|
-
await loadCliConfig(settings, 'test-session', argv);
|
|
880
|
-
expect(settings).toEqual(originalSettings);
|
|
881
|
-
});
|
|
882
|
-
});
|
|
883
|
-
describe('Approval mode tool exclusion logic', () => {
|
|
884
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
885
|
-
beforeEach(() => {
|
|
886
|
-
process.stdin.isTTY = false; // Ensure non-interactive mode
|
|
887
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
888
|
-
isTrusted: true,
|
|
889
|
-
source: undefined,
|
|
890
|
-
});
|
|
891
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
892
|
-
});
|
|
893
|
-
afterEach(() => {
|
|
894
|
-
process.stdin.isTTY = originalIsTTY;
|
|
895
|
-
});
|
|
896
|
-
it('should exclude all interactive tools in non-interactive mode with default approval mode', async () => {
|
|
897
|
-
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
898
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
899
|
-
const settings = createTestMergedSettings();
|
|
900
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
901
|
-
const excludedTools = config.getExcludeTools();
|
|
902
|
-
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
903
|
-
expect(excludedTools).toContain(EDIT_TOOL_NAME);
|
|
904
|
-
expect(excludedTools).toContain(WRITE_FILE_TOOL_NAME);
|
|
905
|
-
});
|
|
906
|
-
it('should exclude all interactive tools in non-interactive mode with explicit default approval mode', async () => {
|
|
907
|
-
process.argv = [
|
|
908
|
-
'node',
|
|
909
|
-
'script.js',
|
|
910
|
-
'--approval-mode',
|
|
911
|
-
'default',
|
|
912
|
-
'-p',
|
|
913
|
-
'test',
|
|
914
|
-
];
|
|
915
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
916
|
-
const settings = createTestMergedSettings();
|
|
917
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
918
|
-
const excludedTools = config.getExcludeTools();
|
|
919
|
-
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
920
|
-
expect(excludedTools).toContain(EDIT_TOOL_NAME);
|
|
921
|
-
expect(excludedTools).toContain(WRITE_FILE_TOOL_NAME);
|
|
922
|
-
});
|
|
923
|
-
it('should exclude only shell tools in non-interactive mode with auto_edit approval mode', async () => {
|
|
924
|
-
process.argv = [
|
|
925
|
-
'node',
|
|
926
|
-
'script.js',
|
|
927
|
-
'--approval-mode',
|
|
928
|
-
'auto_edit',
|
|
929
|
-
'-p',
|
|
930
|
-
'test',
|
|
931
|
-
];
|
|
932
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
933
|
-
const settings = createTestMergedSettings();
|
|
934
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
935
|
-
const excludedTools = config.getExcludeTools();
|
|
936
|
-
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
937
|
-
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
938
|
-
expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
|
|
939
|
-
});
|
|
940
|
-
it('should exclude no interactive tools in non-interactive mode with yolo approval mode', async () => {
|
|
941
|
-
process.argv = [
|
|
942
|
-
'node',
|
|
943
|
-
'script.js',
|
|
944
|
-
'--approval-mode',
|
|
945
|
-
'yolo',
|
|
946
|
-
'-p',
|
|
947
|
-
'test',
|
|
948
|
-
];
|
|
949
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
950
|
-
const settings = createTestMergedSettings();
|
|
951
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
952
|
-
const excludedTools = config.getExcludeTools();
|
|
953
|
-
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
954
|
-
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
955
|
-
expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
|
|
956
|
-
});
|
|
957
|
-
it('should exclude all interactive tools in non-interactive mode with plan approval mode', async () => {
|
|
958
|
-
process.argv = [
|
|
959
|
-
'node',
|
|
960
|
-
'script.js',
|
|
961
|
-
'--approval-mode',
|
|
962
|
-
'plan',
|
|
963
|
-
'-p',
|
|
964
|
-
'test',
|
|
965
|
-
];
|
|
966
|
-
const settings = createTestMergedSettings({
|
|
967
|
-
experimental: {
|
|
968
|
-
plan: true,
|
|
969
|
-
},
|
|
970
|
-
});
|
|
971
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
972
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
973
|
-
const excludedTools = config.getExcludeTools();
|
|
974
|
-
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
975
|
-
expect(excludedTools).toContain(EDIT_TOOL_NAME);
|
|
976
|
-
expect(excludedTools).toContain(WRITE_FILE_TOOL_NAME);
|
|
977
|
-
});
|
|
978
|
-
it('should exclude no interactive tools in non-interactive mode with legacy yolo flag', async () => {
|
|
979
|
-
process.argv = ['node', 'script.js', '--yolo', '-p', 'test'];
|
|
980
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
981
|
-
const settings = createTestMergedSettings();
|
|
982
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
983
|
-
const excludedTools = config.getExcludeTools();
|
|
984
|
-
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
985
|
-
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
986
|
-
expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
|
|
987
|
-
});
|
|
988
|
-
it('should not exclude interactive tools in interactive mode regardless of approval mode', async () => {
|
|
989
|
-
process.stdin.isTTY = true; // Interactive mode
|
|
990
|
-
const testCases = [
|
|
991
|
-
{ args: ['node', 'script.js'] }, // default
|
|
992
|
-
{ args: ['node', 'script.js', '--approval-mode', 'default'] },
|
|
993
|
-
{ args: ['node', 'script.js', '--approval-mode', 'auto_edit'] },
|
|
994
|
-
{ args: ['node', 'script.js', '--approval-mode', 'yolo'] },
|
|
995
|
-
{ args: ['node', 'script.js', '--yolo'] },
|
|
996
|
-
];
|
|
997
|
-
for (const testCase of testCases) {
|
|
998
|
-
process.argv = testCase.args;
|
|
999
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1000
|
-
const settings = createTestMergedSettings();
|
|
1001
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1002
|
-
const excludedTools = config.getExcludeTools();
|
|
1003
|
-
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
1004
|
-
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
1005
|
-
expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME);
|
|
1006
|
-
}
|
|
1007
|
-
});
|
|
1008
|
-
it('should merge approval mode exclusions with settings exclusions in auto_edit mode', async () => {
|
|
1009
|
-
process.argv = [
|
|
1010
|
-
'node',
|
|
1011
|
-
'script.js',
|
|
1012
|
-
'--approval-mode',
|
|
1013
|
-
'auto_edit',
|
|
1014
|
-
'-p',
|
|
1015
|
-
'test',
|
|
1016
|
-
];
|
|
1017
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1018
|
-
const settings = createTestMergedSettings({
|
|
1019
|
-
tools: { exclude: ['custom_tool'] },
|
|
1020
|
-
});
|
|
1021
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1022
|
-
const excludedTools = config.getExcludeTools();
|
|
1023
|
-
expect(excludedTools).toContain('custom_tool'); // From settings
|
|
1024
|
-
expect(excludedTools).toContain(SHELL_TOOL_NAME); // From approval mode
|
|
1025
|
-
expect(excludedTools).not.toContain(EDIT_TOOL_NAME); // Should be allowed in auto_edit
|
|
1026
|
-
expect(excludedTools).not.toContain(WRITE_FILE_TOOL_NAME); // Should be allowed in auto_edit
|
|
1027
|
-
});
|
|
1028
|
-
it('should throw an error if YOLO mode is attempted when disableYoloMode is true', async () => {
|
|
1029
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1030
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1031
|
-
const settings = createTestMergedSettings({
|
|
1032
|
-
security: {
|
|
1033
|
-
disableYoloMode: true,
|
|
1034
|
-
},
|
|
1035
|
-
});
|
|
1036
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode since it is disabled by your admin');
|
|
1037
|
-
});
|
|
1038
|
-
it('should throw an error for invalid approval mode values in loadCliConfig', async () => {
|
|
1039
|
-
// Create a mock argv with an invalid approval mode that bypasses argument parsing validation
|
|
1040
|
-
const invalidArgv = {
|
|
1041
|
-
approvalMode: 'invalid_mode',
|
|
1042
|
-
promptInteractive: '',
|
|
1043
|
-
prompt: '',
|
|
1044
|
-
yolo: false,
|
|
1045
|
-
};
|
|
1046
|
-
const settings = createTestMergedSettings();
|
|
1047
|
-
await expect(loadCliConfig(settings, 'test-session', invalidArgv)).rejects.toThrow('Invalid approval mode: invalid_mode. Valid values are: yolo, auto_edit, plan, default');
|
|
1048
|
-
});
|
|
1049
|
-
});
|
|
1050
|
-
describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
1051
|
-
beforeEach(() => {
|
|
1052
|
-
vi.resetAllMocks();
|
|
1053
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1054
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1055
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1056
|
-
});
|
|
1057
|
-
afterEach(() => {
|
|
1058
|
-
vi.unstubAllEnvs();
|
|
1059
|
-
vi.restoreAllMocks();
|
|
1060
|
-
});
|
|
1061
|
-
const baseSettings = createTestMergedSettings({
|
|
1062
|
-
mcpServers: {
|
|
1063
|
-
server1: { url: 'http://localhost:8080' },
|
|
1064
|
-
server2: { url: 'http://localhost:8081' },
|
|
1065
|
-
server3: { url: 'http://localhost:8082' },
|
|
1066
|
-
},
|
|
1067
|
-
});
|
|
1068
|
-
it('should allow all MCP servers if the flag is not provided', async () => {
|
|
1069
|
-
process.argv = ['node', 'script.js'];
|
|
1070
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1071
|
-
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
1072
|
-
expect(config.getMcpServers()).toEqual(baseSettings.mcpServers);
|
|
1073
|
-
});
|
|
1074
|
-
it('should allow only the specified MCP server', async () => {
|
|
1075
|
-
process.argv = [
|
|
1076
|
-
'node',
|
|
1077
|
-
'script.js',
|
|
1078
|
-
'--allowed-mcp-server-names',
|
|
1079
|
-
'server1',
|
|
1080
|
-
];
|
|
1081
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1082
|
-
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
1083
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1']);
|
|
1084
|
-
});
|
|
1085
|
-
it('should allow multiple specified MCP servers', async () => {
|
|
1086
|
-
process.argv = [
|
|
1087
|
-
'node',
|
|
1088
|
-
'script.js',
|
|
1089
|
-
'--allowed-mcp-server-names',
|
|
1090
|
-
'server1',
|
|
1091
|
-
'--allowed-mcp-server-names',
|
|
1092
|
-
'server3',
|
|
1093
|
-
];
|
|
1094
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1095
|
-
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
1096
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1', 'server3']);
|
|
1097
|
-
});
|
|
1098
|
-
it('should handle server names that do not exist', async () => {
|
|
1099
|
-
process.argv = [
|
|
1100
|
-
'node',
|
|
1101
|
-
'script.js',
|
|
1102
|
-
'--allowed-mcp-server-names',
|
|
1103
|
-
'server1',
|
|
1104
|
-
'--allowed-mcp-server-names',
|
|
1105
|
-
'server4',
|
|
1106
|
-
];
|
|
1107
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1108
|
-
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
1109
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1', 'server4']);
|
|
1110
|
-
});
|
|
1111
|
-
it('should allow no MCP servers if the flag is provided but empty', async () => {
|
|
1112
|
-
process.argv = ['node', 'script.js', '--allowed-mcp-server-names', ''];
|
|
1113
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1114
|
-
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
1115
|
-
expect(config.getAllowedMcpServers()).toEqual(['']);
|
|
1116
|
-
});
|
|
1117
|
-
it('should read allowMCPServers from settings', async () => {
|
|
1118
|
-
process.argv = ['node', 'script.js'];
|
|
1119
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1120
|
-
const settings = createTestMergedSettings({
|
|
1121
|
-
...baseSettings,
|
|
1122
|
-
mcp: { allowed: ['server1', 'server2'] },
|
|
1123
|
-
});
|
|
1124
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1125
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1', 'server2']);
|
|
1126
|
-
});
|
|
1127
|
-
it('should read excludeMCPServers from settings', async () => {
|
|
1128
|
-
process.argv = ['node', 'script.js'];
|
|
1129
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1130
|
-
const settings = createTestMergedSettings({
|
|
1131
|
-
...baseSettings,
|
|
1132
|
-
mcp: { excluded: ['server1', 'server2'] },
|
|
1133
|
-
});
|
|
1134
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1135
|
-
expect(config.getBlockedMcpServers()).toEqual(['server1', 'server2']);
|
|
1136
|
-
});
|
|
1137
|
-
it('should override allowMCPServers with excludeMCPServers if overlapping', async () => {
|
|
1138
|
-
process.argv = ['node', 'script.js'];
|
|
1139
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1140
|
-
const settings = createTestMergedSettings({
|
|
1141
|
-
...baseSettings,
|
|
1142
|
-
mcp: {
|
|
1143
|
-
excluded: ['server1'],
|
|
1144
|
-
allowed: ['server1', 'server2'],
|
|
1145
|
-
},
|
|
1146
|
-
});
|
|
1147
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1148
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1', 'server2']);
|
|
1149
|
-
expect(config.getBlockedMcpServers()).toEqual(['server1']);
|
|
1150
|
-
});
|
|
1151
|
-
it('should prioritize mcp server flag if set', async () => {
|
|
1152
|
-
process.argv = [
|
|
1153
|
-
'node',
|
|
1154
|
-
'script.js',
|
|
1155
|
-
'--allowed-mcp-server-names',
|
|
1156
|
-
'server1',
|
|
1157
|
-
];
|
|
1158
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1159
|
-
const settings = createTestMergedSettings({
|
|
1160
|
-
...baseSettings,
|
|
1161
|
-
mcp: {
|
|
1162
|
-
excluded: ['server1'],
|
|
1163
|
-
allowed: ['server2'],
|
|
1164
|
-
},
|
|
1165
|
-
});
|
|
1166
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1167
|
-
expect(config.getAllowedMcpServers()).toEqual(['server1']);
|
|
1168
|
-
});
|
|
1169
|
-
it('should prioritize CLI flag over both allowed and excluded settings', async () => {
|
|
1170
|
-
process.argv = [
|
|
1171
|
-
'node',
|
|
1172
|
-
'script.js',
|
|
1173
|
-
'--allowed-mcp-server-names',
|
|
1174
|
-
'server2',
|
|
1175
|
-
'--allowed-mcp-server-names',
|
|
1176
|
-
'server3',
|
|
1177
|
-
];
|
|
1178
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1179
|
-
const settings = createTestMergedSettings({
|
|
1180
|
-
...baseSettings,
|
|
1181
|
-
mcp: {
|
|
1182
|
-
allowed: ['server1', 'server2'], // Should be ignored
|
|
1183
|
-
excluded: ['server3'], // Should be ignored
|
|
1184
|
-
},
|
|
1185
|
-
});
|
|
1186
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1187
|
-
expect(config.getAllowedMcpServers()).toEqual(['server2', 'server3']);
|
|
1188
|
-
expect(config.getBlockedMcpServers()).toEqual([]);
|
|
1189
|
-
});
|
|
1190
|
-
});
|
|
1191
|
-
describe('loadCliConfig model selection', () => {
|
|
1192
|
-
beforeEach(() => {
|
|
1193
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1194
|
-
});
|
|
1195
|
-
afterEach(() => {
|
|
1196
|
-
vi.resetAllMocks();
|
|
1197
|
-
});
|
|
1198
|
-
it('selects a model from settings.json if provided', async () => {
|
|
1199
|
-
process.argv = ['node', 'script.js'];
|
|
1200
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1201
|
-
const config = await loadCliConfig(createTestMergedSettings({
|
|
1202
|
-
model: {
|
|
1203
|
-
name: 'gemini-2.5-pro',
|
|
1204
|
-
},
|
|
1205
|
-
}), 'test-session', argv);
|
|
1206
|
-
expect(config.getModel()).toBe('gemini-2.5-pro');
|
|
1207
|
-
});
|
|
1208
|
-
it('uses the default gemini model if nothing is set', async () => {
|
|
1209
|
-
process.argv = ['node', 'script.js']; // No model set.
|
|
1210
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1211
|
-
const config = await loadCliConfig(createTestMergedSettings({
|
|
1212
|
-
// No model set.
|
|
1213
|
-
}), 'test-session', argv);
|
|
1214
|
-
expect(config.getModel()).toBe('auto-gemini-2.5');
|
|
1215
|
-
});
|
|
1216
|
-
it('always prefers model from argv', async () => {
|
|
1217
|
-
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-flash-preview'];
|
|
1218
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1219
|
-
const config = await loadCliConfig(createTestMergedSettings({
|
|
1220
|
-
model: {
|
|
1221
|
-
name: 'gemini-2.5-pro',
|
|
1222
|
-
},
|
|
1223
|
-
}), 'test-session', argv);
|
|
1224
|
-
expect(config.getModel()).toBe('gemini-2.5-flash-preview');
|
|
1225
|
-
});
|
|
1226
|
-
it('selects the model from argv if provided', async () => {
|
|
1227
|
-
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-flash-preview'];
|
|
1228
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1229
|
-
const config = await loadCliConfig(createTestMergedSettings({
|
|
1230
|
-
// No model provided via settings.
|
|
1231
|
-
}), 'test-session', argv);
|
|
1232
|
-
expect(config.getModel()).toBe('gemini-2.5-flash-preview');
|
|
1233
|
-
});
|
|
1234
|
-
it('selects the default auto model if provided via auto alias', async () => {
|
|
1235
|
-
process.argv = ['node', 'script.js', '--model', 'auto'];
|
|
1236
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1237
|
-
const config = await loadCliConfig(createTestMergedSettings({
|
|
1238
|
-
// No model provided via settings.
|
|
1239
|
-
}), 'test-session', argv);
|
|
1240
|
-
expect(config.getModel()).toBe('auto-gemini-2.5');
|
|
1241
|
-
});
|
|
1242
|
-
});
|
|
1243
|
-
describe('loadCliConfig folderTrust', () => {
|
|
1244
|
-
beforeEach(() => {
|
|
1245
|
-
vi.resetAllMocks();
|
|
1246
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1247
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1248
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1249
|
-
});
|
|
1250
|
-
afterEach(() => {
|
|
1251
|
-
vi.unstubAllEnvs();
|
|
1252
|
-
vi.restoreAllMocks();
|
|
1253
|
-
});
|
|
1254
|
-
it('should be false when folderTrust is false', async () => {
|
|
1255
|
-
process.argv = ['node', 'script.js'];
|
|
1256
|
-
const settings = createTestMergedSettings({
|
|
1257
|
-
security: {
|
|
1258
|
-
folderTrust: {
|
|
1259
|
-
enabled: false,
|
|
1260
|
-
},
|
|
1261
|
-
},
|
|
1262
|
-
});
|
|
1263
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1264
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1265
|
-
expect(config.getFolderTrust()).toBe(false);
|
|
1266
|
-
});
|
|
1267
|
-
it('should be true when folderTrust is true', async () => {
|
|
1268
|
-
process.argv = ['node', 'script.js'];
|
|
1269
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1270
|
-
const settings = createTestMergedSettings({
|
|
1271
|
-
security: {
|
|
1272
|
-
folderTrust: {
|
|
1273
|
-
enabled: true,
|
|
1274
|
-
},
|
|
1275
|
-
},
|
|
1276
|
-
});
|
|
1277
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1278
|
-
expect(config.getFolderTrust()).toBe(true);
|
|
1279
|
-
});
|
|
1280
|
-
it('should be false by default', async () => {
|
|
1281
|
-
process.argv = ['node', 'script.js'];
|
|
1282
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1283
|
-
const settings = createTestMergedSettings();
|
|
1284
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1285
|
-
expect(config.getFolderTrust()).toBe(false);
|
|
1286
|
-
});
|
|
1287
|
-
});
|
|
1288
|
-
describe('loadCliConfig with includeDirectories', () => {
|
|
1289
|
-
beforeEach(() => {
|
|
1290
|
-
vi.resetAllMocks();
|
|
1291
|
-
vi.mocked(os.homedir).mockReturnValue(path.resolve(path.sep, 'mock', 'home', 'user'));
|
|
1292
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1293
|
-
vi.spyOn(process, 'cwd').mockReturnValue(path.resolve(path.sep, 'home', 'user', 'project'));
|
|
1294
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1295
|
-
});
|
|
1296
|
-
afterEach(() => {
|
|
1297
|
-
vi.restoreAllMocks();
|
|
1298
|
-
});
|
|
1299
|
-
it('should combine and resolve paths from settings and CLI arguments', async () => {
|
|
1300
|
-
const mockCwd = path.resolve(path.sep, 'home', 'user', 'project');
|
|
1301
|
-
process.argv = [
|
|
1302
|
-
'node',
|
|
1303
|
-
'script.js',
|
|
1304
|
-
'--include-directories',
|
|
1305
|
-
`${path.resolve(path.sep, 'cli', 'path1')},${path.join(mockCwd, 'cli', 'path2')}`,
|
|
1306
|
-
];
|
|
1307
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1308
|
-
const settings = createTestMergedSettings({
|
|
1309
|
-
context: {
|
|
1310
|
-
includeDirectories: [
|
|
1311
|
-
path.resolve(path.sep, 'settings', 'path1'),
|
|
1312
|
-
path.join(os.homedir(), 'settings', 'path2'),
|
|
1313
|
-
path.join(mockCwd, 'settings', 'path3'),
|
|
1314
|
-
],
|
|
1315
|
-
},
|
|
1316
|
-
});
|
|
1317
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1318
|
-
const expected = [
|
|
1319
|
-
mockCwd,
|
|
1320
|
-
path.resolve(path.sep, 'cli', 'path1'),
|
|
1321
|
-
path.join(mockCwd, 'cli', 'path2'),
|
|
1322
|
-
path.resolve(path.sep, 'settings', 'path1'),
|
|
1323
|
-
path.join(os.homedir(), 'settings', 'path2'),
|
|
1324
|
-
path.join(mockCwd, 'settings', 'path3'),
|
|
1325
|
-
];
|
|
1326
|
-
const directories = config.getWorkspaceContext().getDirectories();
|
|
1327
|
-
expect(directories).toEqual([mockCwd]);
|
|
1328
|
-
expect(config.getPendingIncludeDirectories()).toEqual(expect.arrayContaining(expected.filter((dir) => dir !== mockCwd)));
|
|
1329
|
-
expect(config.getPendingIncludeDirectories()).toHaveLength(expected.length - 1);
|
|
1330
|
-
});
|
|
1331
|
-
});
|
|
1332
|
-
describe('loadCliConfig compressionThreshold', () => {
|
|
1333
|
-
beforeEach(() => {
|
|
1334
|
-
vi.resetAllMocks();
|
|
1335
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1336
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1337
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1338
|
-
});
|
|
1339
|
-
afterEach(() => {
|
|
1340
|
-
vi.unstubAllEnvs();
|
|
1341
|
-
vi.restoreAllMocks();
|
|
1342
|
-
});
|
|
1343
|
-
it('should pass settings to the core config', async () => {
|
|
1344
|
-
process.argv = ['node', 'script.js'];
|
|
1345
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1346
|
-
const settings = createTestMergedSettings({
|
|
1347
|
-
model: {
|
|
1348
|
-
compressionThreshold: 0.5,
|
|
1349
|
-
},
|
|
1350
|
-
});
|
|
1351
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1352
|
-
expect(await config.getCompressionThreshold()).toBe(0.5);
|
|
1353
|
-
});
|
|
1354
|
-
it('should have default compressionThreshold if not in settings', async () => {
|
|
1355
|
-
process.argv = ['node', 'script.js'];
|
|
1356
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1357
|
-
const settings = createTestMergedSettings();
|
|
1358
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1359
|
-
expect(await config.getCompressionThreshold()).toBe(0.5);
|
|
1360
|
-
});
|
|
1361
|
-
});
|
|
1362
|
-
describe('loadCliConfig useRipgrep', () => {
|
|
1363
|
-
beforeEach(() => {
|
|
1364
|
-
vi.resetAllMocks();
|
|
1365
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1366
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1367
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1368
|
-
});
|
|
1369
|
-
afterEach(() => {
|
|
1370
|
-
vi.unstubAllEnvs();
|
|
1371
|
-
vi.restoreAllMocks();
|
|
1372
|
-
});
|
|
1373
|
-
it('should be true by default when useRipgrep is not set in settings', async () => {
|
|
1374
|
-
process.argv = ['node', 'script.js'];
|
|
1375
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1376
|
-
const settings = createTestMergedSettings();
|
|
1377
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1378
|
-
expect(config.getUseRipgrep()).toBe(true);
|
|
1379
|
-
});
|
|
1380
|
-
it('should be false when useRipgrep is set to false in settings', async () => {
|
|
1381
|
-
process.argv = ['node', 'script.js'];
|
|
1382
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1383
|
-
const settings = createTestMergedSettings({ tools: { useRipgrep: false } });
|
|
1384
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1385
|
-
expect(config.getUseRipgrep()).toBe(false);
|
|
1386
|
-
});
|
|
1387
|
-
it('should be true when useRipgrep is explicitly set to true in settings', async () => {
|
|
1388
|
-
process.argv = ['node', 'script.js'];
|
|
1389
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1390
|
-
const settings = createTestMergedSettings({ tools: { useRipgrep: true } });
|
|
1391
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1392
|
-
expect(config.getUseRipgrep()).toBe(true);
|
|
1393
|
-
});
|
|
1394
|
-
});
|
|
1395
|
-
describe('screenReader configuration', () => {
|
|
1396
|
-
beforeEach(() => {
|
|
1397
|
-
vi.resetAllMocks();
|
|
1398
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1399
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1400
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1401
|
-
});
|
|
1402
|
-
afterEach(() => {
|
|
1403
|
-
vi.unstubAllEnvs();
|
|
1404
|
-
vi.restoreAllMocks();
|
|
1405
|
-
});
|
|
1406
|
-
it('should use screenReader value from settings if CLI flag is not present (settings true)', async () => {
|
|
1407
|
-
process.argv = ['node', 'script.js'];
|
|
1408
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1409
|
-
const settings = createTestMergedSettings({
|
|
1410
|
-
ui: { accessibility: { screenReader: true } },
|
|
1411
|
-
});
|
|
1412
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1413
|
-
expect(config.getScreenReader()).toBe(true);
|
|
1414
|
-
});
|
|
1415
|
-
it('should use screenReader value from settings if CLI flag is not present (settings false)', async () => {
|
|
1416
|
-
process.argv = ['node', 'script.js'];
|
|
1417
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1418
|
-
const settings = createTestMergedSettings({
|
|
1419
|
-
ui: { accessibility: { screenReader: false } },
|
|
1420
|
-
});
|
|
1421
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1422
|
-
expect(config.getScreenReader()).toBe(false);
|
|
1423
|
-
});
|
|
1424
|
-
it('should prioritize --screen-reader CLI flag (true) over settings (false)', async () => {
|
|
1425
|
-
process.argv = ['node', 'script.js', '--screen-reader'];
|
|
1426
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1427
|
-
const settings = createTestMergedSettings({
|
|
1428
|
-
ui: { accessibility: { screenReader: false } },
|
|
1429
|
-
});
|
|
1430
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1431
|
-
expect(config.getScreenReader()).toBe(true);
|
|
1432
|
-
});
|
|
1433
|
-
it('should be false by default when no flag or setting is present', async () => {
|
|
1434
|
-
process.argv = ['node', 'script.js'];
|
|
1435
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1436
|
-
const settings = createTestMergedSettings();
|
|
1437
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1438
|
-
expect(config.getScreenReader()).toBe(false);
|
|
1439
|
-
});
|
|
1440
|
-
});
|
|
1441
|
-
describe('loadCliConfig tool exclusions', () => {
|
|
1442
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
1443
|
-
beforeEach(() => {
|
|
1444
|
-
vi.resetAllMocks();
|
|
1445
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1446
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1447
|
-
process.stdin.isTTY = true;
|
|
1448
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
1449
|
-
isTrusted: true,
|
|
1450
|
-
source: undefined,
|
|
1451
|
-
});
|
|
1452
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1453
|
-
});
|
|
1454
|
-
afterEach(() => {
|
|
1455
|
-
process.stdin.isTTY = originalIsTTY;
|
|
1456
|
-
vi.unstubAllEnvs();
|
|
1457
|
-
vi.restoreAllMocks();
|
|
1458
|
-
});
|
|
1459
|
-
it('should not exclude interactive tools in interactive mode without YOLO', async () => {
|
|
1460
|
-
process.stdin.isTTY = true;
|
|
1461
|
-
process.argv = ['node', 'script.js'];
|
|
1462
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1463
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1464
|
-
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1465
|
-
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1466
|
-
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
1467
|
-
});
|
|
1468
|
-
it('should not exclude interactive tools in interactive mode with YOLO', async () => {
|
|
1469
|
-
process.stdin.isTTY = true;
|
|
1470
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1471
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1472
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1473
|
-
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1474
|
-
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1475
|
-
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
1476
|
-
});
|
|
1477
|
-
it('should exclude interactive tools in non-interactive mode without YOLO', async () => {
|
|
1478
|
-
process.stdin.isTTY = false;
|
|
1479
|
-
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
1480
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1481
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1482
|
-
expect(config.getExcludeTools()).toContain('run_shell_command');
|
|
1483
|
-
expect(config.getExcludeTools()).toContain('replace');
|
|
1484
|
-
expect(config.getExcludeTools()).toContain('write_file');
|
|
1485
|
-
});
|
|
1486
|
-
it('should not exclude interactive tools in non-interactive mode with YOLO', async () => {
|
|
1487
|
-
process.stdin.isTTY = false;
|
|
1488
|
-
process.argv = ['node', 'script.js', '-p', 'test', '--yolo'];
|
|
1489
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1490
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1491
|
-
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1492
|
-
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1493
|
-
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
1494
|
-
});
|
|
1495
|
-
it('should not exclude shell tool in non-interactive mode when --allowed-tools="ShellTool" is set', async () => {
|
|
1496
|
-
process.stdin.isTTY = false;
|
|
1497
|
-
process.argv = [
|
|
1498
|
-
'node',
|
|
1499
|
-
'script.js',
|
|
1500
|
-
'-p',
|
|
1501
|
-
'test',
|
|
1502
|
-
'--allowed-tools',
|
|
1503
|
-
'ShellTool',
|
|
1504
|
-
];
|
|
1505
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1506
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1507
|
-
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1508
|
-
});
|
|
1509
|
-
it('should exclude web-fetch in non-interactive mode when not allowed', async () => {
|
|
1510
|
-
process.stdin.isTTY = false;
|
|
1511
|
-
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
1512
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1513
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1514
|
-
expect(config.getExcludeTools()).toContain(WEB_FETCH_TOOL_NAME);
|
|
1515
|
-
});
|
|
1516
|
-
it('should not exclude web-fetch in non-interactive mode when allowed', async () => {
|
|
1517
|
-
process.stdin.isTTY = false;
|
|
1518
|
-
process.argv = [
|
|
1519
|
-
'node',
|
|
1520
|
-
'script.js',
|
|
1521
|
-
'-p',
|
|
1522
|
-
'test',
|
|
1523
|
-
'--allowed-tools',
|
|
1524
|
-
WEB_FETCH_TOOL_NAME,
|
|
1525
|
-
];
|
|
1526
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1527
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1528
|
-
expect(config.getExcludeTools()).not.toContain(WEB_FETCH_TOOL_NAME);
|
|
1529
|
-
});
|
|
1530
|
-
it('should not exclude shell tool in non-interactive mode when --allowed-tools="run_shell_command" is set', async () => {
|
|
1531
|
-
process.stdin.isTTY = false;
|
|
1532
|
-
process.argv = [
|
|
1533
|
-
'node',
|
|
1534
|
-
'script.js',
|
|
1535
|
-
'-p',
|
|
1536
|
-
'test',
|
|
1537
|
-
'--allowed-tools',
|
|
1538
|
-
'run_shell_command',
|
|
1539
|
-
];
|
|
1540
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1541
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1542
|
-
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1543
|
-
});
|
|
1544
|
-
it('should not exclude shell tool in non-interactive mode when --allowed-tools="ShellTool(wc)" is set', async () => {
|
|
1545
|
-
process.stdin.isTTY = false;
|
|
1546
|
-
process.argv = [
|
|
1547
|
-
'node',
|
|
1548
|
-
'script.js',
|
|
1549
|
-
'-p',
|
|
1550
|
-
'test',
|
|
1551
|
-
'--allowed-tools',
|
|
1552
|
-
'ShellTool(wc)',
|
|
1553
|
-
];
|
|
1554
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1555
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1556
|
-
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1557
|
-
});
|
|
1558
|
-
});
|
|
1559
|
-
describe('loadCliConfig interactive', () => {
|
|
1560
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
1561
|
-
beforeEach(() => {
|
|
1562
|
-
vi.resetAllMocks();
|
|
1563
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1564
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1565
|
-
process.stdin.isTTY = true;
|
|
1566
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1567
|
-
});
|
|
1568
|
-
afterEach(() => {
|
|
1569
|
-
process.stdin.isTTY = originalIsTTY;
|
|
1570
|
-
vi.unstubAllEnvs();
|
|
1571
|
-
vi.restoreAllMocks();
|
|
1572
|
-
});
|
|
1573
|
-
it('should be interactive if isTTY and no prompt', async () => {
|
|
1574
|
-
process.stdin.isTTY = true;
|
|
1575
|
-
process.argv = ['node', 'script.js'];
|
|
1576
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1577
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1578
|
-
expect(config.isInteractive()).toBe(true);
|
|
1579
|
-
});
|
|
1580
|
-
it('should be interactive if prompt-interactive is set', async () => {
|
|
1581
|
-
process.stdin.isTTY = false;
|
|
1582
|
-
process.argv = ['node', 'script.js', '--prompt-interactive', 'test'];
|
|
1583
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1584
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1585
|
-
expect(config.isInteractive()).toBe(true);
|
|
1586
|
-
});
|
|
1587
|
-
it('should not be interactive if not isTTY and no prompt', async () => {
|
|
1588
|
-
process.stdin.isTTY = false;
|
|
1589
|
-
process.argv = ['node', 'script.js'];
|
|
1590
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1591
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1592
|
-
expect(config.isInteractive()).toBe(false);
|
|
1593
|
-
});
|
|
1594
|
-
it('should not be interactive if prompt is set', async () => {
|
|
1595
|
-
process.stdin.isTTY = true;
|
|
1596
|
-
process.argv = ['node', 'script.js', '--prompt', 'test'];
|
|
1597
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1598
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1599
|
-
expect(config.isInteractive()).toBe(false);
|
|
1600
|
-
});
|
|
1601
|
-
it('should be interactive if positional prompt words are provided with other flags', async () => {
|
|
1602
|
-
process.stdin.isTTY = true;
|
|
1603
|
-
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro', 'Hello'];
|
|
1604
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1605
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1606
|
-
expect(config.isInteractive()).toBe(true);
|
|
1607
|
-
});
|
|
1608
|
-
it('should be interactive if positional prompt words are provided with multiple flags', async () => {
|
|
1609
|
-
process.stdin.isTTY = true;
|
|
1610
|
-
process.argv = [
|
|
1611
|
-
'node',
|
|
1612
|
-
'script.js',
|
|
1613
|
-
'--model',
|
|
1614
|
-
'gemini-2.5-pro',
|
|
1615
|
-
'--yolo',
|
|
1616
|
-
'Hello world',
|
|
1617
|
-
];
|
|
1618
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1619
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1620
|
-
expect(config.isInteractive()).toBe(true);
|
|
1621
|
-
// Verify the question is preserved for one-shot execution
|
|
1622
|
-
expect(argv.prompt).toBeUndefined();
|
|
1623
|
-
expect(argv.promptInteractive).toBe('Hello world');
|
|
1624
|
-
});
|
|
1625
|
-
it('should be interactive if positional prompt words are provided with extensions flag', async () => {
|
|
1626
|
-
process.stdin.isTTY = true;
|
|
1627
|
-
process.argv = ['node', 'script.js', '-e', 'none', 'hello'];
|
|
1628
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1629
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1630
|
-
expect(config.isInteractive()).toBe(true);
|
|
1631
|
-
expect(argv.query).toBe('hello');
|
|
1632
|
-
expect(argv.promptInteractive).toBe('hello');
|
|
1633
|
-
expect(argv.extensions).toEqual(['none']);
|
|
1634
|
-
});
|
|
1635
|
-
it('should handle multiple positional words correctly', async () => {
|
|
1636
|
-
process.stdin.isTTY = true;
|
|
1637
|
-
process.argv = ['node', 'script.js', 'hello world how are you'];
|
|
1638
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1639
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1640
|
-
expect(config.isInteractive()).toBe(true);
|
|
1641
|
-
expect(argv.query).toBe('hello world how are you');
|
|
1642
|
-
expect(argv.promptInteractive).toBe('hello world how are you');
|
|
1643
|
-
});
|
|
1644
|
-
it('should handle multiple positional words with flags', async () => {
|
|
1645
|
-
process.stdin.isTTY = true;
|
|
1646
|
-
process.argv = [
|
|
1647
|
-
'node',
|
|
1648
|
-
'script.js',
|
|
1649
|
-
'--model',
|
|
1650
|
-
'gemini-2.5-pro',
|
|
1651
|
-
'write',
|
|
1652
|
-
'a',
|
|
1653
|
-
'function',
|
|
1654
|
-
'to',
|
|
1655
|
-
'sort',
|
|
1656
|
-
'array',
|
|
1657
|
-
];
|
|
1658
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1659
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1660
|
-
expect(config.isInteractive()).toBe(true);
|
|
1661
|
-
expect(argv.query).toBe('write a function to sort array');
|
|
1662
|
-
expect(argv.promptInteractive).toBe('write a function to sort array');
|
|
1663
|
-
expect(argv.model).toBe('gemini-2.5-pro');
|
|
1664
|
-
});
|
|
1665
|
-
it('should handle empty positional arguments', async () => {
|
|
1666
|
-
process.stdin.isTTY = true;
|
|
1667
|
-
process.argv = ['node', 'script.js', ''];
|
|
1668
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1669
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1670
|
-
expect(config.isInteractive()).toBe(true);
|
|
1671
|
-
expect(argv.query).toBeUndefined();
|
|
1672
|
-
});
|
|
1673
|
-
it('should handle extensions flag with positional arguments correctly', async () => {
|
|
1674
|
-
process.stdin.isTTY = true;
|
|
1675
|
-
process.argv = [
|
|
1676
|
-
'node',
|
|
1677
|
-
'script.js',
|
|
1678
|
-
'-e',
|
|
1679
|
-
'none',
|
|
1680
|
-
'hello',
|
|
1681
|
-
'world',
|
|
1682
|
-
'how',
|
|
1683
|
-
'are',
|
|
1684
|
-
'you',
|
|
1685
|
-
];
|
|
1686
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1687
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1688
|
-
expect(config.isInteractive()).toBe(true);
|
|
1689
|
-
expect(argv.query).toBe('hello world how are you');
|
|
1690
|
-
expect(argv.promptInteractive).toBe('hello world how are you');
|
|
1691
|
-
expect(argv.extensions).toEqual(['none']);
|
|
1692
|
-
});
|
|
1693
|
-
it('should be interactive if no positional prompt words are provided with flags', async () => {
|
|
1694
|
-
process.stdin.isTTY = true;
|
|
1695
|
-
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro'];
|
|
1696
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1697
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1698
|
-
expect(config.isInteractive()).toBe(true);
|
|
1699
|
-
});
|
|
1700
|
-
});
|
|
1701
|
-
describe('loadCliConfig approval mode', () => {
|
|
1702
|
-
const originalArgv = process.argv;
|
|
1703
|
-
beforeEach(() => {
|
|
1704
|
-
vi.resetAllMocks();
|
|
1705
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1706
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1707
|
-
process.argv = ['node', 'script.js']; // Reset argv for each test
|
|
1708
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
1709
|
-
isTrusted: true,
|
|
1710
|
-
source: undefined,
|
|
1711
|
-
});
|
|
1712
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1713
|
-
});
|
|
1714
|
-
afterEach(() => {
|
|
1715
|
-
process.argv = originalArgv;
|
|
1716
|
-
vi.unstubAllEnvs();
|
|
1717
|
-
vi.restoreAllMocks();
|
|
1718
|
-
});
|
|
1719
|
-
it('should default to DEFAULT approval mode when no flags are set', async () => {
|
|
1720
|
-
process.argv = ['node', 'script.js'];
|
|
1721
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1722
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1723
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1724
|
-
});
|
|
1725
|
-
it('should set YOLO approval mode when --yolo flag is used', async () => {
|
|
1726
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1727
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1728
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1729
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1730
|
-
});
|
|
1731
|
-
it('should set YOLO approval mode when -y flag is used', async () => {
|
|
1732
|
-
process.argv = ['node', 'script.js', '-y'];
|
|
1733
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1734
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1735
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1736
|
-
});
|
|
1737
|
-
it('should set DEFAULT approval mode when --approval-mode=default', async () => {
|
|
1738
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'default'];
|
|
1739
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1740
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1741
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1742
|
-
});
|
|
1743
|
-
it('should set AUTO_EDIT approval mode when --approval-mode=auto_edit', async () => {
|
|
1744
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
|
|
1745
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1746
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1747
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
|
|
1748
|
-
});
|
|
1749
|
-
it('should set YOLO approval mode when --approval-mode=yolo', async () => {
|
|
1750
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
|
|
1751
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1752
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1753
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1754
|
-
});
|
|
1755
|
-
it('should prioritize --approval-mode over --yolo when both would be valid (but validation prevents this)', async () => {
|
|
1756
|
-
// Note: This test documents the intended behavior, but in practice the validation
|
|
1757
|
-
// prevents both flags from being used together
|
|
1758
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'default'];
|
|
1759
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1760
|
-
// Manually set yolo to true to simulate what would happen if validation didn't prevent it
|
|
1761
|
-
argv.yolo = true;
|
|
1762
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1763
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1764
|
-
});
|
|
1765
|
-
it('should fall back to --yolo behavior when --approval-mode is not set', async () => {
|
|
1766
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1767
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1768
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1769
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1770
|
-
});
|
|
1771
|
-
it('should set Plan approval mode when --approval-mode=plan is used and experimental.plan is enabled', async () => {
|
|
1772
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
|
|
1773
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1774
|
-
const settings = createTestMergedSettings({
|
|
1775
|
-
experimental: {
|
|
1776
|
-
plan: true,
|
|
1777
|
-
},
|
|
1778
|
-
});
|
|
1779
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1780
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.PLAN);
|
|
1781
|
-
});
|
|
1782
|
-
it('should ignore "yolo" in settings.tools.approvalMode and fall back to DEFAULT', async () => {
|
|
1783
|
-
process.argv = ['node', 'script.js'];
|
|
1784
|
-
const settings = createTestMergedSettings({
|
|
1785
|
-
tools: {
|
|
1786
|
-
// @ts-expect-error: testing invalid value
|
|
1787
|
-
approvalMode: 'yolo',
|
|
1788
|
-
},
|
|
1789
|
-
});
|
|
1790
|
-
const argv = await parseArguments(settings);
|
|
1791
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1792
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1793
|
-
});
|
|
1794
|
-
it('should throw error when --approval-mode=plan is used but experimental.plan is disabled', async () => {
|
|
1795
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
|
|
1796
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1797
|
-
const settings = createTestMergedSettings({
|
|
1798
|
-
experimental: {
|
|
1799
|
-
plan: false,
|
|
1800
|
-
},
|
|
1801
|
-
});
|
|
1802
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Approval mode "plan" is only available when experimental.plan is enabled.');
|
|
1803
|
-
});
|
|
1804
|
-
it('should throw error when --approval-mode=plan is used but experimental.plan setting is missing', async () => {
|
|
1805
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'plan'];
|
|
1806
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1807
|
-
const settings = createTestMergedSettings({});
|
|
1808
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Approval mode "plan" is only available when experimental.plan is enabled.');
|
|
1809
|
-
});
|
|
1810
|
-
// --- Untrusted Folder Scenarios ---
|
|
1811
|
-
describe('when folder is NOT trusted', () => {
|
|
1812
|
-
beforeEach(() => {
|
|
1813
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
1814
|
-
isTrusted: false,
|
|
1815
|
-
source: 'file',
|
|
1816
|
-
});
|
|
1817
|
-
});
|
|
1818
|
-
it('should override --approval-mode=yolo to DEFAULT', async () => {
|
|
1819
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
|
|
1820
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1821
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1822
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1823
|
-
});
|
|
1824
|
-
it('should override --approval-mode=auto_edit to DEFAULT', async () => {
|
|
1825
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
|
|
1826
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1827
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1828
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1829
|
-
});
|
|
1830
|
-
it('should override --yolo flag to DEFAULT', async () => {
|
|
1831
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1832
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1833
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1834
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1835
|
-
});
|
|
1836
|
-
it('should remain DEFAULT when --approval-mode=default', async () => {
|
|
1837
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'default'];
|
|
1838
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1839
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1840
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1841
|
-
});
|
|
1842
|
-
});
|
|
1843
|
-
describe('Persistent approvalMode setting', () => {
|
|
1844
|
-
it('should use approvalMode from settings when no CLI flags are set', async () => {
|
|
1845
|
-
process.argv = ['node', 'script.js'];
|
|
1846
|
-
const settings = createTestMergedSettings({
|
|
1847
|
-
tools: { approvalMode: 'auto_edit' },
|
|
1848
|
-
});
|
|
1849
|
-
const argv = await parseArguments(settings);
|
|
1850
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1851
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
|
|
1852
|
-
});
|
|
1853
|
-
it('should prioritize --approval-mode flag over settings', async () => {
|
|
1854
|
-
process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
|
|
1855
|
-
const settings = createTestMergedSettings({
|
|
1856
|
-
tools: { approvalMode: 'default' },
|
|
1857
|
-
});
|
|
1858
|
-
const argv = await parseArguments(settings);
|
|
1859
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1860
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
|
|
1861
|
-
});
|
|
1862
|
-
it('should prioritize --yolo flag over settings', async () => {
|
|
1863
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
1864
|
-
const settings = createTestMergedSettings({
|
|
1865
|
-
tools: { approvalMode: 'auto_edit' },
|
|
1866
|
-
});
|
|
1867
|
-
const argv = await parseArguments(settings);
|
|
1868
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1869
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1870
|
-
});
|
|
1871
|
-
it('should respect plan mode from settings when experimental.plan is enabled', async () => {
|
|
1872
|
-
process.argv = ['node', 'script.js'];
|
|
1873
|
-
const settings = createTestMergedSettings({
|
|
1874
|
-
tools: { approvalMode: 'plan' },
|
|
1875
|
-
experimental: { plan: true },
|
|
1876
|
-
});
|
|
1877
|
-
const argv = await parseArguments(settings);
|
|
1878
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1879
|
-
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.PLAN);
|
|
1880
|
-
});
|
|
1881
|
-
it('should throw error if plan mode is in settings but experimental.plan is disabled', async () => {
|
|
1882
|
-
process.argv = ['node', 'script.js'];
|
|
1883
|
-
const settings = createTestMergedSettings({
|
|
1884
|
-
tools: { approvalMode: 'plan' },
|
|
1885
|
-
experimental: { plan: false },
|
|
1886
|
-
});
|
|
1887
|
-
const argv = await parseArguments(settings);
|
|
1888
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Approval mode "plan" is only available when experimental.plan is enabled.');
|
|
1889
|
-
});
|
|
1890
|
-
});
|
|
1891
|
-
});
|
|
1892
|
-
describe('loadCliConfig fileFiltering', () => {
|
|
1893
|
-
const originalArgv = process.argv;
|
|
1894
|
-
beforeEach(() => {
|
|
1895
|
-
vi.resetAllMocks();
|
|
1896
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1897
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1898
|
-
process.argv = ['node', 'script.js']; // Reset argv for each test
|
|
1899
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1900
|
-
});
|
|
1901
|
-
afterEach(() => {
|
|
1902
|
-
process.argv = originalArgv;
|
|
1903
|
-
vi.unstubAllEnvs();
|
|
1904
|
-
vi.restoreAllMocks();
|
|
1905
|
-
});
|
|
1906
|
-
const testCases = [
|
|
1907
|
-
{
|
|
1908
|
-
property: 'enableFuzzySearch',
|
|
1909
|
-
getter: (c) => c.getFileFilteringEnableFuzzySearch(),
|
|
1910
|
-
value: true,
|
|
1911
|
-
},
|
|
1912
|
-
{
|
|
1913
|
-
property: 'enableFuzzySearch',
|
|
1914
|
-
getter: (c) => c.getFileFilteringEnableFuzzySearch(),
|
|
1915
|
-
value: false,
|
|
1916
|
-
},
|
|
1917
|
-
{
|
|
1918
|
-
property: 'respectGitIgnore',
|
|
1919
|
-
getter: (c) => c.getFileFilteringRespectGitIgnore(),
|
|
1920
|
-
value: true,
|
|
1921
|
-
},
|
|
1922
|
-
{
|
|
1923
|
-
property: 'respectGitIgnore',
|
|
1924
|
-
getter: (c) => c.getFileFilteringRespectGitIgnore(),
|
|
1925
|
-
value: false,
|
|
1926
|
-
},
|
|
1927
|
-
{
|
|
1928
|
-
property: 'respectGeminiIgnore',
|
|
1929
|
-
getter: (c) => c.getFileFilteringRespectGeminiIgnore(),
|
|
1930
|
-
value: true,
|
|
1931
|
-
},
|
|
1932
|
-
{
|
|
1933
|
-
property: 'respectGeminiIgnore',
|
|
1934
|
-
getter: (c) => c.getFileFilteringRespectGeminiIgnore(),
|
|
1935
|
-
value: false,
|
|
1936
|
-
},
|
|
1937
|
-
{
|
|
1938
|
-
property: 'enableRecursiveFileSearch',
|
|
1939
|
-
getter: (c) => c.getEnableRecursiveFileSearch(),
|
|
1940
|
-
value: true,
|
|
1941
|
-
},
|
|
1942
|
-
{
|
|
1943
|
-
property: 'enableRecursiveFileSearch',
|
|
1944
|
-
getter: (c) => c.getEnableRecursiveFileSearch(),
|
|
1945
|
-
value: false,
|
|
1946
|
-
},
|
|
1947
|
-
];
|
|
1948
|
-
it.each(testCases)('should pass $property from settings to config when $value', async ({ property, getter, value }) => {
|
|
1949
|
-
const settings = createTestMergedSettings({
|
|
1950
|
-
context: {
|
|
1951
|
-
fileFiltering: { [property]: value },
|
|
1952
|
-
},
|
|
1953
|
-
});
|
|
1954
|
-
const argv = await parseArguments(settings);
|
|
1955
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1956
|
-
expect(getter(config)).toBe(value);
|
|
1957
|
-
});
|
|
1958
|
-
});
|
|
1959
|
-
describe('Output format', () => {
|
|
1960
|
-
beforeEach(() => {
|
|
1961
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1962
|
-
});
|
|
1963
|
-
afterEach(() => {
|
|
1964
|
-
vi.resetAllMocks();
|
|
1965
|
-
});
|
|
1966
|
-
it('should default to TEXT', async () => {
|
|
1967
|
-
process.argv = ['node', 'script.js'];
|
|
1968
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1969
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1970
|
-
expect(config.getOutputFormat()).toBe(OutputFormat.TEXT);
|
|
1971
|
-
});
|
|
1972
|
-
it('should use the format from settings', async () => {
|
|
1973
|
-
process.argv = ['node', 'script.js'];
|
|
1974
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1975
|
-
const config = await loadCliConfig(createTestMergedSettings({ output: { format: OutputFormat.JSON } }), 'test-session', argv);
|
|
1976
|
-
expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
|
|
1977
|
-
});
|
|
1978
|
-
it('should prioritize the format from argv', async () => {
|
|
1979
|
-
process.argv = ['node', 'script.js', '--output-format', 'json'];
|
|
1980
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1981
|
-
const config = await loadCliConfig(createTestMergedSettings({ output: { format: OutputFormat.JSON } }), 'test-session', argv);
|
|
1982
|
-
expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
|
|
1983
|
-
});
|
|
1984
|
-
it('should accept stream-json as a valid output format', async () => {
|
|
1985
|
-
process.argv = ['node', 'script.js', '--output-format', 'stream-json'];
|
|
1986
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
1987
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
1988
|
-
expect(config.getOutputFormat()).toBe(OutputFormat.STREAM_JSON);
|
|
1989
|
-
});
|
|
1990
|
-
it('should error on invalid --output-format argument', async () => {
|
|
1991
|
-
process.argv = ['node', 'script.js', '--output-format', 'invalid'];
|
|
1992
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
1993
|
-
throw new Error('process.exit called');
|
|
1994
|
-
});
|
|
1995
|
-
const mockConsoleError = vi
|
|
1996
|
-
.spyOn(console, 'error')
|
|
1997
|
-
.mockImplementation(() => { });
|
|
1998
|
-
const debugErrorSpy = vi
|
|
1999
|
-
.spyOn(debugLogger, 'error')
|
|
2000
|
-
.mockImplementation(() => { });
|
|
2001
|
-
await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
|
|
2002
|
-
expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid values:'));
|
|
2003
|
-
expect(mockConsoleError).toHaveBeenCalled();
|
|
2004
|
-
mockExit.mockRestore();
|
|
2005
|
-
mockConsoleError.mockRestore();
|
|
2006
|
-
debugErrorSpy.mockRestore();
|
|
2007
|
-
});
|
|
2008
|
-
});
|
|
2009
|
-
describe('parseArguments with positional prompt', () => {
|
|
2010
|
-
const originalArgv = process.argv;
|
|
2011
|
-
afterEach(() => {
|
|
2012
|
-
process.argv = originalArgv;
|
|
2013
|
-
});
|
|
2014
|
-
it('should throw an error when both a positional prompt and the --prompt flag are used', async () => {
|
|
2015
|
-
process.argv = [
|
|
2016
|
-
'node',
|
|
2017
|
-
'script.js',
|
|
2018
|
-
'positional',
|
|
2019
|
-
'prompt',
|
|
2020
|
-
'--prompt',
|
|
2021
|
-
'test prompt',
|
|
2022
|
-
];
|
|
2023
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
2024
|
-
throw new Error('process.exit called');
|
|
2025
|
-
});
|
|
2026
|
-
const mockConsoleError = vi
|
|
2027
|
-
.spyOn(console, 'error')
|
|
2028
|
-
.mockImplementation(() => { });
|
|
2029
|
-
const debugErrorSpy = vi
|
|
2030
|
-
.spyOn(debugLogger, 'error')
|
|
2031
|
-
.mockImplementation(() => { });
|
|
2032
|
-
await expect(parseArguments(createTestMergedSettings())).rejects.toThrow('process.exit called');
|
|
2033
|
-
expect(debugErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Cannot use both a positional prompt and the --prompt (-p) flag together'));
|
|
2034
|
-
mockExit.mockRestore();
|
|
2035
|
-
mockConsoleError.mockRestore();
|
|
2036
|
-
debugErrorSpy.mockRestore();
|
|
2037
|
-
});
|
|
2038
|
-
it('should correctly parse a positional prompt to query field', async () => {
|
|
2039
|
-
process.argv = ['node', 'script.js', 'positional', 'prompt'];
|
|
2040
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2041
|
-
expect(argv.query).toBe('positional prompt');
|
|
2042
|
-
// Since no explicit prompt flags are set and query doesn't start with @, should map to prompt (one-shot)
|
|
2043
|
-
expect(argv.prompt).toBe('positional prompt');
|
|
2044
|
-
expect(argv.promptInteractive).toBeUndefined();
|
|
2045
|
-
});
|
|
2046
|
-
it('should have correct positional argument description', async () => {
|
|
2047
|
-
// Test that the positional argument has the expected description
|
|
2048
|
-
const yargsInstance = await import('./config.js');
|
|
2049
|
-
// This test verifies that the positional 'query' argument is properly configured
|
|
2050
|
-
// with the description: "Positional prompt. Defaults to one-shot; use -i/--prompt-interactive for interactive."
|
|
2051
|
-
process.argv = ['node', 'script.js', 'test', 'query'];
|
|
2052
|
-
const argv = await yargsInstance.parseArguments(createTestMergedSettings());
|
|
2053
|
-
expect(argv.query).toBe('test query');
|
|
2054
|
-
});
|
|
2055
|
-
it('should correctly parse a prompt from the --prompt flag', async () => {
|
|
2056
|
-
process.argv = ['node', 'script.js', '--prompt', 'test prompt'];
|
|
2057
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2058
|
-
expect(argv.prompt).toBe('test prompt');
|
|
2059
|
-
});
|
|
2060
|
-
});
|
|
2061
|
-
describe('Telemetry configuration via environment variables', () => {
|
|
2062
|
-
beforeEach(() => {
|
|
2063
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2064
|
-
});
|
|
2065
|
-
afterEach(() => {
|
|
2066
|
-
vi.resetAllMocks();
|
|
2067
|
-
});
|
|
2068
|
-
it('should prioritize GEMINI_TELEMETRY_ENABLED over settings', async () => {
|
|
2069
|
-
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', 'true');
|
|
2070
|
-
process.argv = ['node', 'script.js'];
|
|
2071
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2072
|
-
const settings = createTestMergedSettings({
|
|
2073
|
-
telemetry: { enabled: false },
|
|
2074
|
-
});
|
|
2075
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2076
|
-
expect(config.getTelemetryEnabled()).toBe(true);
|
|
2077
|
-
});
|
|
2078
|
-
it('should prioritize GEMINI_TELEMETRY_TARGET over settings', async () => {
|
|
2079
|
-
vi.stubEnv('GEMINI_TELEMETRY_TARGET', 'gcp');
|
|
2080
|
-
process.argv = ['node', 'script.js'];
|
|
2081
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2082
|
-
const settings = createTestMergedSettings({
|
|
2083
|
-
telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
|
|
2084
|
-
});
|
|
2085
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2086
|
-
expect(config.getTelemetryTarget()).toBe('gcp');
|
|
2087
|
-
});
|
|
2088
|
-
it('should throw when GEMINI_TELEMETRY_TARGET is invalid', async () => {
|
|
2089
|
-
vi.stubEnv('GEMINI_TELEMETRY_TARGET', 'bogus');
|
|
2090
|
-
process.argv = ['node', 'script.js'];
|
|
2091
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2092
|
-
const settings = createTestMergedSettings({
|
|
2093
|
-
telemetry: { target: ServerConfig.TelemetryTarget.GCP },
|
|
2094
|
-
});
|
|
2095
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow(/Invalid telemetry configuration: .*Invalid telemetry target/i);
|
|
2096
|
-
vi.unstubAllEnvs();
|
|
2097
|
-
});
|
|
2098
|
-
it('should prioritize GEMINI_TELEMETRY_OTLP_ENDPOINT over settings and default env var', async () => {
|
|
2099
|
-
vi.stubEnv('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://default.env.com');
|
|
2100
|
-
vi.stubEnv('GEMINI_TELEMETRY_OTLP_ENDPOINT', 'http://gemini.env.com');
|
|
2101
|
-
process.argv = ['node', 'script.js'];
|
|
2102
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2103
|
-
const settings = createTestMergedSettings({
|
|
2104
|
-
telemetry: { otlpEndpoint: 'http://settings.com' },
|
|
2105
|
-
});
|
|
2106
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2107
|
-
expect(config.getTelemetryOtlpEndpoint()).toBe('http://gemini.env.com');
|
|
2108
|
-
});
|
|
2109
|
-
it('should prioritize GEMINI_TELEMETRY_OTLP_PROTOCOL over settings', async () => {
|
|
2110
|
-
vi.stubEnv('GEMINI_TELEMETRY_OTLP_PROTOCOL', 'http');
|
|
2111
|
-
process.argv = ['node', 'script.js'];
|
|
2112
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2113
|
-
const settings = createTestMergedSettings({
|
|
2114
|
-
telemetry: { otlpProtocol: 'grpc' },
|
|
2115
|
-
});
|
|
2116
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2117
|
-
expect(config.getTelemetryOtlpProtocol()).toBe('http');
|
|
2118
|
-
});
|
|
2119
|
-
it('should prioritize GEMINI_TELEMETRY_LOG_PROMPTS over settings', async () => {
|
|
2120
|
-
vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', 'false');
|
|
2121
|
-
process.argv = ['node', 'script.js'];
|
|
2122
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2123
|
-
const settings = createTestMergedSettings({
|
|
2124
|
-
telemetry: { logPrompts: true },
|
|
2125
|
-
});
|
|
2126
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2127
|
-
expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
|
|
2128
|
-
});
|
|
2129
|
-
it('should prioritize GEMINI_TELEMETRY_OUTFILE over settings', async () => {
|
|
2130
|
-
vi.stubEnv('GEMINI_TELEMETRY_OUTFILE', '/gemini/env/telemetry.log');
|
|
2131
|
-
process.argv = ['node', 'script.js'];
|
|
2132
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2133
|
-
const settings = createTestMergedSettings({
|
|
2134
|
-
telemetry: { outfile: '/settings/telemetry.log' },
|
|
2135
|
-
});
|
|
2136
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2137
|
-
expect(config.getTelemetryOutfile()).toBe('/gemini/env/telemetry.log');
|
|
2138
|
-
});
|
|
2139
|
-
it('should prioritize GEMINI_TELEMETRY_USE_COLLECTOR over settings', async () => {
|
|
2140
|
-
vi.stubEnv('GEMINI_TELEMETRY_USE_COLLECTOR', 'true');
|
|
2141
|
-
process.argv = ['node', 'script.js'];
|
|
2142
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2143
|
-
const settings = createTestMergedSettings({
|
|
2144
|
-
telemetry: { useCollector: false },
|
|
2145
|
-
});
|
|
2146
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2147
|
-
expect(config.getTelemetryUseCollector()).toBe(true);
|
|
2148
|
-
});
|
|
2149
|
-
it('should use settings value when GEMINI_TELEMETRY_ENABLED is not set', async () => {
|
|
2150
|
-
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', undefined);
|
|
2151
|
-
process.argv = ['node', 'script.js'];
|
|
2152
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2153
|
-
const settings = createTestMergedSettings({ telemetry: { enabled: true } });
|
|
2154
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2155
|
-
expect(config.getTelemetryEnabled()).toBe(true);
|
|
2156
|
-
});
|
|
2157
|
-
it('should use settings value when GEMINI_TELEMETRY_TARGET is not set', async () => {
|
|
2158
|
-
vi.stubEnv('GEMINI_TELEMETRY_TARGET', undefined);
|
|
2159
|
-
process.argv = ['node', 'script.js'];
|
|
2160
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2161
|
-
const settings = createTestMergedSettings({
|
|
2162
|
-
telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
|
|
2163
|
-
});
|
|
2164
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2165
|
-
expect(config.getTelemetryTarget()).toBe('local');
|
|
2166
|
-
});
|
|
2167
|
-
it("should treat GEMINI_TELEMETRY_ENABLED='1' as true", async () => {
|
|
2168
|
-
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '1');
|
|
2169
|
-
process.argv = ['node', 'script.js'];
|
|
2170
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2171
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
2172
|
-
expect(config.getTelemetryEnabled()).toBe(true);
|
|
2173
|
-
});
|
|
2174
|
-
it("should treat GEMINI_TELEMETRY_ENABLED='0' as false", async () => {
|
|
2175
|
-
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '0');
|
|
2176
|
-
process.argv = ['node', 'script.js'];
|
|
2177
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2178
|
-
const config = await loadCliConfig(createTestMergedSettings({ telemetry: { enabled: true } }), 'test-session', argv);
|
|
2179
|
-
expect(config.getTelemetryEnabled()).toBe(false);
|
|
2180
|
-
});
|
|
2181
|
-
it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='1' as true", async () => {
|
|
2182
|
-
vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', '1');
|
|
2183
|
-
process.argv = ['node', 'script.js'];
|
|
2184
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2185
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
2186
|
-
expect(config.getTelemetryLogPromptsEnabled()).toBe(true);
|
|
2187
|
-
});
|
|
2188
|
-
it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='false' as false", async () => {
|
|
2189
|
-
vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', 'false');
|
|
2190
|
-
process.argv = ['node', 'script.js'];
|
|
2191
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2192
|
-
const config = await loadCliConfig(createTestMergedSettings({ telemetry: { logPrompts: true } }), 'test-session', argv);
|
|
2193
|
-
expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
|
|
2194
|
-
});
|
|
2195
|
-
});
|
|
2196
|
-
describe('PolicyEngine nonInteractive wiring', () => {
|
|
2197
|
-
const originalIsTTY = process.stdin.isTTY;
|
|
2198
|
-
beforeEach(() => {
|
|
2199
|
-
vi.resetAllMocks();
|
|
2200
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
2201
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2202
|
-
});
|
|
2203
|
-
afterEach(() => {
|
|
2204
|
-
process.stdin.isTTY = originalIsTTY;
|
|
2205
|
-
vi.restoreAllMocks();
|
|
2206
|
-
});
|
|
2207
|
-
it('should set nonInteractive to true when -p flag is used', async () => {
|
|
2208
|
-
process.stdin.isTTY = true;
|
|
2209
|
-
process.argv = ['node', 'script.js', '-p', 'echo hello'];
|
|
2210
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2211
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
2212
|
-
expect(config.isInteractive()).toBe(false);
|
|
2213
|
-
expect(config.getPolicyEngine()
|
|
2214
|
-
.nonInteractive).toBe(true);
|
|
2215
|
-
});
|
|
2216
|
-
it('should set nonInteractive to false in interactive mode', async () => {
|
|
2217
|
-
process.stdin.isTTY = true;
|
|
2218
|
-
process.argv = ['node', 'script.js'];
|
|
2219
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2220
|
-
const config = await loadCliConfig(createTestMergedSettings(), 'test-session', argv);
|
|
2221
|
-
expect(config.isInteractive()).toBe(true);
|
|
2222
|
-
expect(config.getPolicyEngine()
|
|
2223
|
-
.nonInteractive).toBe(false);
|
|
2224
|
-
});
|
|
2225
|
-
});
|
|
2226
|
-
describe('Policy Engine Integration in loadCliConfig', () => {
|
|
2227
|
-
beforeEach(() => {
|
|
2228
|
-
vi.resetAllMocks();
|
|
2229
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
2230
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
2231
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2232
|
-
});
|
|
2233
|
-
afterEach(() => {
|
|
2234
|
-
vi.unstubAllEnvs();
|
|
2235
|
-
vi.restoreAllMocks();
|
|
2236
|
-
});
|
|
2237
|
-
it('should pass merged allowed tools from CLI and settings to createPolicyEngineConfig', async () => {
|
|
2238
|
-
process.argv = ['node', 'script.js', '--allowed-tools', 'cli-tool'];
|
|
2239
|
-
const settings = createTestMergedSettings({
|
|
2240
|
-
tools: { allowed: ['settings-tool'] },
|
|
2241
|
-
});
|
|
2242
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2243
|
-
await loadCliConfig(settings, 'test-session', argv);
|
|
2244
|
-
expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
2245
|
-
tools: expect.objectContaining({
|
|
2246
|
-
allowed: expect.arrayContaining(['cli-tool']),
|
|
2247
|
-
}),
|
|
2248
|
-
}), expect.anything());
|
|
2249
|
-
});
|
|
2250
|
-
it('should pass merged exclude tools from CLI logic and settings to createPolicyEngineConfig', async () => {
|
|
2251
|
-
process.stdin.isTTY = false; // Non-interactive to trigger default excludes
|
|
2252
|
-
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
2253
|
-
const settings = createTestMergedSettings({
|
|
2254
|
-
tools: { exclude: ['settings-exclude'] },
|
|
2255
|
-
});
|
|
2256
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2257
|
-
await loadCliConfig(settings, 'test-session', argv);
|
|
2258
|
-
// In non-interactive mode, ShellTool, etc. are excluded
|
|
2259
|
-
expect(ServerConfig.createPolicyEngineConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
2260
|
-
tools: expect.objectContaining({
|
|
2261
|
-
exclude: expect.arrayContaining([SHELL_TOOL_NAME]),
|
|
2262
|
-
}),
|
|
2263
|
-
}), expect.anything());
|
|
2264
|
-
});
|
|
2265
|
-
});
|
|
2266
|
-
describe('loadCliConfig disableYoloMode', () => {
|
|
2267
|
-
beforeEach(() => {
|
|
2268
|
-
vi.resetAllMocks();
|
|
2269
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
2270
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
2271
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2272
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
2273
|
-
isTrusted: true,
|
|
2274
|
-
source: undefined,
|
|
2275
|
-
});
|
|
2276
|
-
});
|
|
2277
|
-
afterEach(() => {
|
|
2278
|
-
vi.unstubAllEnvs();
|
|
2279
|
-
vi.restoreAllMocks();
|
|
2280
|
-
});
|
|
2281
|
-
it('should allow auto_edit mode even if yolo mode is disabled', async () => {
|
|
2282
|
-
process.argv = ['node', 'script.js', '--approval-mode=auto_edit'];
|
|
2283
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2284
|
-
const settings = createTestMergedSettings({
|
|
2285
|
-
security: { disableYoloMode: true },
|
|
2286
|
-
});
|
|
2287
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2288
|
-
expect(config.getApprovalMode()).toBe(ApprovalMode.AUTO_EDIT);
|
|
2289
|
-
});
|
|
2290
|
-
it('should throw if YOLO mode is attempted when disableYoloMode is true', async () => {
|
|
2291
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
2292
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2293
|
-
const settings = createTestMergedSettings({
|
|
2294
|
-
security: { disableYoloMode: true },
|
|
2295
|
-
});
|
|
2296
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode since it is disabled by your admin');
|
|
2297
|
-
});
|
|
2298
|
-
});
|
|
2299
|
-
describe('loadCliConfig secureModeEnabled', () => {
|
|
2300
|
-
beforeEach(() => {
|
|
2301
|
-
vi.resetAllMocks();
|
|
2302
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
2303
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
2304
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2305
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
2306
|
-
isTrusted: true,
|
|
2307
|
-
source: undefined,
|
|
2308
|
-
});
|
|
2309
|
-
});
|
|
2310
|
-
afterEach(() => {
|
|
2311
|
-
vi.unstubAllEnvs();
|
|
2312
|
-
vi.restoreAllMocks();
|
|
2313
|
-
});
|
|
2314
|
-
it('should throw an error if YOLO mode is attempted when secureModeEnabled is true', async () => {
|
|
2315
|
-
process.argv = ['node', 'script.js', '--yolo'];
|
|
2316
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2317
|
-
const settings = createTestMergedSettings({
|
|
2318
|
-
admin: {
|
|
2319
|
-
secureModeEnabled: true,
|
|
2320
|
-
},
|
|
2321
|
-
});
|
|
2322
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode since it is disabled by your admin');
|
|
2323
|
-
});
|
|
2324
|
-
it('should throw an error if approval-mode=yolo is attempted when secureModeEnabled is true', async () => {
|
|
2325
|
-
process.argv = ['node', 'script.js', '--approval-mode=yolo'];
|
|
2326
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2327
|
-
const settings = createTestMergedSettings({
|
|
2328
|
-
admin: {
|
|
2329
|
-
secureModeEnabled: true,
|
|
2330
|
-
},
|
|
2331
|
-
});
|
|
2332
|
-
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode since it is disabled by your admin');
|
|
2333
|
-
});
|
|
2334
|
-
it('should set disableYoloMode to true when secureModeEnabled is true', async () => {
|
|
2335
|
-
process.argv = ['node', 'script.js'];
|
|
2336
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2337
|
-
const settings = createTestMergedSettings({
|
|
2338
|
-
admin: {
|
|
2339
|
-
secureModeEnabled: true,
|
|
2340
|
-
},
|
|
2341
|
-
});
|
|
2342
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2343
|
-
expect(config.isYoloModeDisabled()).toBe(true);
|
|
2344
|
-
});
|
|
2345
|
-
});
|
|
2346
|
-
describe('loadCliConfig mcpEnabled', () => {
|
|
2347
|
-
beforeEach(() => {
|
|
2348
|
-
vi.resetAllMocks();
|
|
2349
|
-
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
2350
|
-
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
2351
|
-
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
2352
|
-
});
|
|
2353
|
-
afterEach(() => {
|
|
2354
|
-
vi.unstubAllEnvs();
|
|
2355
|
-
vi.restoreAllMocks();
|
|
2356
|
-
});
|
|
2357
|
-
const mcpSettings = {
|
|
2358
|
-
mcp: {
|
|
2359
|
-
serverCommand: 'mcp-server',
|
|
2360
|
-
allowed: ['serverA'],
|
|
2361
|
-
excluded: ['serverB'],
|
|
2362
|
-
},
|
|
2363
|
-
mcpServers: { serverA: { url: 'http://a' } },
|
|
2364
|
-
};
|
|
2365
|
-
it('should enable MCP by default', async () => {
|
|
2366
|
-
process.argv = ['node', 'script.js'];
|
|
2367
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2368
|
-
const settings = createTestMergedSettings({ ...mcpSettings });
|
|
2369
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2370
|
-
expect(config.getMcpEnabled()).toBe(true);
|
|
2371
|
-
expect(config.getMcpServerCommand()).toBe('mcp-server');
|
|
2372
|
-
expect(config.getMcpServers()).toEqual({ serverA: { url: 'http://a' } });
|
|
2373
|
-
expect(config.getAllowedMcpServers()).toEqual(['serverA']);
|
|
2374
|
-
expect(config.getBlockedMcpServers()).toEqual(['serverB']);
|
|
2375
|
-
});
|
|
2376
|
-
it('should disable MCP when mcpEnabled is false', async () => {
|
|
2377
|
-
process.argv = ['node', 'script.js'];
|
|
2378
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2379
|
-
const settings = createTestMergedSettings({
|
|
2380
|
-
...mcpSettings,
|
|
2381
|
-
admin: {
|
|
2382
|
-
mcp: {
|
|
2383
|
-
enabled: false,
|
|
2384
|
-
},
|
|
2385
|
-
},
|
|
2386
|
-
});
|
|
2387
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2388
|
-
expect(config.getMcpEnabled()).toBe(false);
|
|
2389
|
-
expect(config.getMcpServerCommand()).toBeUndefined();
|
|
2390
|
-
expect(config.getMcpServers()).toEqual({});
|
|
2391
|
-
expect(config.getAllowedMcpServers()).toEqual([]);
|
|
2392
|
-
expect(config.getBlockedMcpServers()).toEqual([]);
|
|
2393
|
-
});
|
|
2394
|
-
it('should enable MCP when mcpEnabled is true', async () => {
|
|
2395
|
-
process.argv = ['node', 'script.js'];
|
|
2396
|
-
const argv = await parseArguments(createTestMergedSettings());
|
|
2397
|
-
const settings = createTestMergedSettings({
|
|
2398
|
-
...mcpSettings,
|
|
2399
|
-
admin: {
|
|
2400
|
-
mcp: {
|
|
2401
|
-
enabled: true,
|
|
2402
|
-
},
|
|
2403
|
-
},
|
|
2404
|
-
});
|
|
2405
|
-
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
2406
|
-
expect(config.getMcpEnabled()).toBe(true);
|
|
2407
|
-
expect(config.getMcpServerCommand()).toBe('mcp-server');
|
|
2408
|
-
expect(config.getMcpServers()).toEqual({ serverA: { url: 'http://a' } });
|
|
2409
|
-
expect(config.getAllowedMcpServers()).toEqual(['serverA']);
|
|
2410
|
-
expect(config.getBlockedMcpServers()).toEqual(['serverB']);
|
|
2411
|
-
});
|
|
2412
|
-
});
|
|
2413
|
-
//# sourceMappingURL=config.test.js.map
|