@machina.ai/cell-cli 1.22.5-rc1 → 1.25.0-rc3
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/dist/package.json +5 -4
- package/dist/src/commands/extensions/configure.d.ts +13 -0
- package/dist/src/commands/extensions/configure.js +131 -0
- package/dist/src/commands/extensions/configure.js.map +1 -0
- package/dist/src/commands/extensions/configure.test.d.ts +1 -0
- package/dist/src/commands/extensions/configure.test.js +197 -0
- package/dist/src/commands/extensions/configure.test.js.map +1 -0
- package/dist/src/commands/extensions/disable.test.js.map +1 -1
- package/dist/src/commands/extensions/enable.test.js.map +1 -1
- package/dist/src/commands/extensions/install.js +7 -31
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +21 -3
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.test.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
- package/dist/src/commands/extensions/utils.d.ts +2 -1
- package/dist/src/commands/extensions/utils.js +5 -1
- package/dist/src/commands/extensions/utils.js.map +1 -1
- package/dist/src/commands/extensions/validate.js +1 -1
- package/dist/src/commands/extensions/validate.js.map +1 -1
- package/dist/src/commands/extensions/validate.test.js +1 -1
- package/dist/src/commands/extensions/validate.test.js.map +1 -1
- package/dist/src/commands/extensions.js +2 -2
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/commands/hooks/migrate.js +1 -1
- package/dist/src/commands/hooks/migrate.js.map +1 -1
- package/dist/src/commands/hooks/migrate.test.js +1 -1
- package/dist/src/commands/hooks/migrate.test.js.map +1 -1
- package/dist/src/commands/mcp/add.test.js +1 -1
- package/dist/src/commands/mcp/add.test.js.map +1 -1
- package/dist/src/commands/mcp/list.js +7 -1
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/commands/skills/disable.d.ts +14 -0
- package/dist/src/commands/skills/disable.js +45 -0
- package/dist/src/commands/skills/disable.js.map +1 -0
- package/dist/src/commands/skills/disable.test.d.ts +6 -0
- package/dist/src/commands/skills/disable.test.js +80 -0
- package/dist/src/commands/skills/disable.test.js.map +1 -0
- package/dist/src/commands/skills/enable.d.ts +12 -0
- package/dist/src/commands/skills/enable.js +35 -0
- package/dist/src/commands/skills/enable.js.map +1 -0
- package/dist/src/commands/skills/enable.test.d.ts +6 -0
- package/dist/src/commands/skills/enable.test.js +107 -0
- package/dist/src/commands/skills/enable.test.js.map +1 -0
- package/dist/src/commands/skills/install.d.ts +14 -0
- package/dist/src/commands/skills/install.js +61 -0
- package/dist/src/commands/skills/install.js.map +1 -0
- package/dist/src/commands/skills/install.test.d.ts +6 -0
- package/dist/src/commands/skills/install.test.js +57 -0
- package/dist/src/commands/skills/install.test.js.map +1 -0
- package/dist/src/commands/skills/list.d.ts +10 -0
- package/dist/src/commands/skills/list.js +60 -0
- package/dist/src/commands/skills/list.js.map +1 -0
- package/dist/src/commands/skills/list.test.d.ts +6 -0
- package/dist/src/commands/skills/list.test.js +136 -0
- package/dist/src/commands/skills/list.test.js.map +1 -0
- package/dist/src/commands/skills/uninstall.d.ts +13 -0
- package/dist/src/commands/skills/uninstall.js +56 -0
- package/dist/src/commands/skills/uninstall.js.map +1 -0
- package/dist/src/commands/skills/uninstall.test.d.ts +6 -0
- package/dist/src/commands/skills/uninstall.test.js +61 -0
- package/dist/src/commands/skills/uninstall.test.js.map +1 -0
- package/dist/src/commands/{extensions/settings.d.ts → skills.d.ts} +2 -2
- package/dist/src/commands/skills.js +30 -0
- package/dist/src/commands/skills.js.map +1 -0
- package/dist/src/commands/skills.test.d.ts +6 -0
- package/dist/src/commands/skills.test.js +49 -0
- package/dist/src/commands/skills.test.js.map +1 -0
- package/dist/src/config/config.d.ts +10 -3
- package/dist/src/config/config.js +91 -31
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +224 -13
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager-agents.test.d.ts +6 -0
- package/dist/src/config/extension-manager-agents.test.js +115 -0
- package/dist/src/config/extension-manager-agents.test.js.map +1 -0
- package/dist/src/config/extension-manager-scope.test.js +164 -0
- package/dist/src/config/extension-manager-scope.test.js.map +1 -0
- package/dist/src/config/extension-manager-skills.test.js +150 -0
- package/dist/src/config/extension-manager-skills.test.js.map +1 -0
- package/dist/src/config/extension-manager.d.ts +6 -1
- package/dist/src/config/extension-manager.js +157 -34
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension.test.js +98 -16
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensions/consent.d.ts +5 -3
- package/dist/src/config/extensions/consent.js +30 -7
- package/dist/src/config/extensions/consent.js.map +1 -1
- package/dist/src/config/extensions/consent.test.js +97 -3
- package/dist/src/config/extensions/consent.test.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.d.ts +5 -3
- package/dist/src/config/extensions/extensionSettings.js +32 -12
- package/dist/src/config/extensions/extensionSettings.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.test.js +8 -8
- package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
- package/dist/src/config/extensions/extensionUpdates.test.js +231 -0
- package/dist/src/config/extensions/extensionUpdates.test.js.map +1 -0
- package/dist/src/config/extensions/github.js +1 -1
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +2 -2
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/storage.js +2 -2
- package/dist/src/config/extensions/storage.js.map +1 -1
- package/dist/src/config/extensions/update.js +1 -1
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +8 -8
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +14 -2
- package/dist/src/config/keyBindings.js +89 -11
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policy-engine.integration.test.js +13 -1
- package/dist/src/config/policy-engine.integration.test.js.map +1 -1
- package/dist/src/config/settings-validation.js +1 -1
- package/dist/src/config/settings-validation.js.map +1 -1
- package/dist/src/config/settings-validation.test.js +49 -1
- package/dist/src/config/settings-validation.test.js.map +1 -1
- package/dist/src/config/settings.d.ts +9 -7
- package/dist/src/config/settings.js +127 -250
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +245 -594
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +284 -33
- package/dist/src/config/settingsSchema.js +328 -31
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +17 -9
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/config/settings_repro.test.js +1 -1
- package/dist/src/config/settings_repro.test.js.map +1 -1
- package/dist/src/config/settings_validation_warning.test.d.ts +6 -0
- package/dist/src/config/settings_validation_warning.test.js +123 -0
- package/dist/src/config/settings_validation_warning.test.js.map +1 -0
- package/dist/src/config/trustedFolders.d.ts +1 -0
- package/dist/src/config/trustedFolders.js +18 -4
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/config/trustedFolders.test.js +45 -0
- package/dist/src/config/trustedFolders.test.js.map +1 -1
- package/dist/src/gemini.js +117 -85
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +72 -95
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/gemini_cleanup.test.js +6 -0
- package/dist/src/gemini_cleanup.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/nonInteractiveCli.js +54 -1
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCli.test.js +94 -11
- package/dist/src/nonInteractiveCli.test.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.d.ts +1 -1
- package/dist/src/services/BuiltinCommandLoader.js +65 -9
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +67 -13
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/services/FileCommandLoader.js +6 -6
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js +13 -11
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.test.js +93 -61
- package/dist/src/services/prompt-processors/shellProcessor.test.js.map +1 -1
- package/dist/src/test-utils/render.js +4 -2
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.test.js +2 -2
- package/dist/src/ui/App.test.js.map +1 -1
- package/dist/src/ui/AppContainer.js +158 -77
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +230 -41
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.test.js +18 -7
- package/dist/src/ui/IdeIntegrationNudge.test.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.d.ts +4 -1
- package/dist/src/ui/auth/AuthDialog.js +8 -2
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +17 -0
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/AuthInProgress.test.js +16 -6
- package/dist/src/ui/auth/AuthInProgress.test.js.map +1 -1
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.d.ts +10 -0
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js +27 -0
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.js.map +1 -0
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.d.ts +6 -0
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js +68 -0
- package/dist/src/ui/auth/LoginWithGoogleRestartDialog.test.js.map +1 -0
- package/dist/src/ui/commands/aboutCommand.js +1 -1
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/aboutCommand.test.js +4 -4
- package/dist/src/ui/commands/aboutCommand.test.js.map +1 -1
- package/dist/src/ui/commands/agentsCommand.d.ts +7 -0
- package/dist/src/ui/commands/agentsCommand.js +79 -0
- package/dist/src/ui/commands/agentsCommand.js.map +1 -0
- package/dist/src/ui/commands/agentsCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/agentsCommand.test.js +91 -0
- package/dist/src/ui/commands/agentsCommand.test.js.map +1 -0
- package/dist/src/ui/commands/authCommand.js +30 -3
- package/dist/src/ui/commands/authCommand.js.map +1 -1
- package/dist/src/ui/commands/authCommand.test.js +72 -4
- package/dist/src/ui/commands/authCommand.test.js.map +1 -1
- package/dist/src/ui/commands/bugCommand.js +36 -4
- package/dist/src/ui/commands/bugCommand.js.map +1 -1
- package/dist/src/ui/commands/bugCommand.test.js +83 -2
- package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.d.ts +1 -2
- package/dist/src/ui/commands/chatCommand.js +50 -50
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.test.js +84 -58
- package/dist/src/ui/commands/chatCommand.test.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +12 -8
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.test.js +4 -0
- package/dist/src/ui/commands/clearCommand.test.js.map +1 -1
- package/dist/src/ui/commands/copyCommand.js +1 -1
- package/dist/src/ui/commands/copyCommand.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.js +27 -10
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.test.js +47 -11
- package/dist/src/ui/commands/directoryCommand.test.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +193 -24
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.test.js +217 -27
- package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/helpCommand.js +1 -1
- package/dist/src/ui/commands/helpCommand.js.map +1 -1
- package/dist/src/ui/commands/helpCommand.test.js +1 -1
- package/dist/src/ui/commands/helpCommand.test.js.map +1 -1
- package/dist/src/ui/commands/hooksCommand.js +155 -20
- package/dist/src/ui/commands/hooksCommand.js.map +1 -1
- package/dist/src/ui/commands/hooksCommand.test.js +196 -17
- package/dist/src/ui/commands/hooksCommand.test.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +7 -7
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.test.js +14 -6
- package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +19 -33
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.test.js +112 -16
- package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
- package/dist/src/ui/commands/restoreCommand.js +1 -1
- package/dist/src/ui/commands/restoreCommand.js.map +1 -1
- package/dist/src/ui/commands/skillsCommand.d.ts +7 -0
- package/dist/src/ui/commands/skillsCommand.js +235 -0
- package/dist/src/ui/commands/skillsCommand.js.map +1 -0
- package/dist/src/ui/commands/skillsCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/skillsCommand.test.js +405 -0
- package/dist/src/ui/commands/skillsCommand.test.js.map +1 -0
- package/dist/src/ui/commands/statsCommand.js +4 -4
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.test.js +4 -4
- package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +2 -2
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.test.js +2 -2
- package/dist/src/ui/commands/toolsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +15 -2
- package/dist/src/ui/commands/types.js +1 -0
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AsciiArt.d.ts +6 -6
- package/dist/src/ui/components/AsciiArt.js +6 -6
- package/dist/src/ui/components/Composer.js +7 -7
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +23 -4
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.d.ts +1 -0
- package/dist/src/ui/components/ContextSummaryDisplay.js +12 -5
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.test.js +56 -25
- package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +2 -2
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/EditorSettingsDialog.js +2 -1
- package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
- package/dist/src/ui/components/EditorSettingsDialog.test.js +3 -2
- package/dist/src/ui/components/EditorSettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.js +20 -15
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +12 -2
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +4 -4
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Help.js +1 -1
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js +3 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +21 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/HookStatusDisplay.d.ts +12 -0
- package/dist/src/ui/components/HookStatusDisplay.js +20 -0
- package/dist/src/ui/components/HookStatusDisplay.js.map +1 -0
- package/dist/src/ui/components/HookStatusDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/HookStatusDisplay.test.js +51 -0
- package/dist/src/ui/components/HookStatusDisplay.test.js.map +1 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js +2 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js +4 -3
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +54 -24
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.js +172 -7
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/LogoutConfirmationDialog.d.ts +15 -0
- package/dist/src/ui/components/LogoutConfirmationDialog.js +37 -0
- package/dist/src/ui/components/LogoutConfirmationDialog.js.map +1 -0
- package/dist/src/ui/components/LogoutConfirmationDialog.test.d.ts +6 -0
- package/dist/src/ui/components/LogoutConfirmationDialog.test.js +59 -0
- package/dist/src/ui/components/LogoutConfirmationDialog.test.js.map +1 -0
- package/dist/src/ui/components/MainContent.js +12 -10
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/MainContent.test.js +19 -9
- package/dist/src/ui/components/MainContent.test.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +7 -3
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +16 -2
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/ModelStatsDisplay.js +68 -14
- package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
- package/dist/src/ui/components/ModelStatsDisplay.test.js +53 -2
- package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/MultiFolderTrustDialog.d.ts +2 -2
- package/dist/src/ui/components/MultiFolderTrustDialog.js +2 -2
- package/dist/src/ui/components/MultiFolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/MultiFolderTrustDialog.test.js +9 -9
- package/dist/src/ui/components/MultiFolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Notifications.js +3 -4
- package/dist/src/ui/components/Notifications.js.map +1 -1
- package/dist/src/ui/components/Notifications.test.js +1 -0
- package/dist/src/ui/components/Notifications.test.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.d.ts +1 -3
- package/dist/src/ui/components/ProQuotaDialog.js +3 -21
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +25 -10
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +36 -16
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +20 -3
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/StatusDisplay.d.ts +11 -0
- package/dist/src/ui/components/StatusDisplay.js +40 -0
- package/dist/src/ui/components/StatusDisplay.js.map +1 -0
- package/dist/src/ui/components/StatusDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/StatusDisplay.test.js +144 -0
- package/dist/src/ui/components/StatusDisplay.test.js.map +1 -0
- package/dist/src/ui/components/StickyHeader.d.ts +2 -0
- package/dist/src/ui/components/StickyHeader.js +1 -1
- package/dist/src/ui/components/StickyHeader.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.js +7 -2
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/Table.d.ts +21 -0
- package/dist/src/ui/components/Table.js +7 -0
- package/dist/src/ui/components/Table.js.map +1 -0
- package/dist/src/ui/components/Table.test.d.ts +6 -0
- package/dist/src/ui/components/Table.test.js +53 -0
- package/dist/src/ui/components/Table.test.js.map +1 -0
- package/dist/src/ui/components/ThemeDialog.js +63 -17
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.test.js +66 -1
- package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.js +5 -13
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js +26 -17
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
- package/dist/src/ui/components/messages/ShellToolMessage.js +8 -5
- package/dist/src/ui/components/messages/ShellToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +1 -5
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +6 -2
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +1 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.js +22 -16
- package/dist/src/ui/components/messages/ToolResultDisplay.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js +36 -18
- package/dist/src/ui/components/messages/ToolResultDisplay.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js +134 -0
- package/dist/src/ui/components/messages/ToolStickyHeaderRegression.test.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.d.ts +2 -38
- package/dist/src/ui/components/shared/MaxSizedBox.js +34 -418
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +48 -133
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +4 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js +11 -10
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.d.ts +40 -4
- package/dist/src/ui/components/shared/text-buffer.js +234 -64
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.test.js +147 -1
- package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js +3 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
- package/dist/src/ui/components/views/AgentsStatus.d.ts +13 -0
- package/dist/src/ui/components/views/AgentsStatus.js +23 -0
- package/dist/src/ui/components/views/AgentsStatus.js.map +1 -0
- package/dist/src/ui/components/views/ExtensionsList.js +3 -2
- package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionsList.test.js +37 -0
- package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
- package/dist/src/ui/components/views/HooksList.d.ts +2 -0
- package/dist/src/ui/components/views/HooksList.js +12 -7
- package/dist/src/ui/components/views/HooksList.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.js +7 -2
- package/dist/src/ui/components/views/McpStatus.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.test.js +10 -0
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
- package/dist/src/ui/components/views/SkillsList.d.ts +13 -0
- package/dist/src/ui/components/views/SkillsList.js +17 -0
- package/dist/src/ui/components/views/SkillsList.js.map +1 -0
- package/dist/src/ui/components/views/SkillsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/SkillsList.test.js +97 -0
- package/dist/src/ui/components/views/SkillsList.test.js.map +1 -0
- package/dist/src/ui/constants/tips.js +1 -4
- package/dist/src/ui/constants/tips.js.map +1 -1
- package/dist/src/ui/constants.d.ts +4 -3
- package/dist/src/ui/constants.js +5 -6
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.d.ts +1 -0
- package/dist/src/ui/contexts/KeypressContext.js +84 -6
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +130 -9
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +5 -1
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/contexts/VimModeContext.js +1 -1
- package/dist/src/ui/contexts/VimModeContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +17 -3
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +9 -3
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.d.ts +6 -0
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js +183 -0
- package/dist/src/ui/hooks/atCommandProcessor_agents.test.js.map +1 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js +18 -7
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.test.js +2 -3
- package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js +31 -0
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion_agents.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAtCompletion_agents.test.js +85 -0
- package/dist/src/ui/hooks/useAtCompletion_agents.test.js.map +1 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +2 -1
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js +5 -4
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +1 -0
- package/dist/src/ui/hooks/useCommandCompletion.js +13 -8
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js +88 -2
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js +5 -7
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +20 -4
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +14 -19
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +31 -23
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +2 -1
- package/dist/src/ui/hooks/useGeminiStream.js +84 -16
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +290 -10
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.d.ts +1 -1
- package/dist/src/ui/hooks/useHistoryManager.js +1 -1
- package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.test.js +16 -0
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
- package/dist/src/ui/hooks/useHookDisplayState.d.ts +7 -0
- package/dist/src/ui/hooks/useHookDisplayState.js +83 -0
- package/dist/src/ui/hooks/useHookDisplayState.js.map +1 -0
- package/dist/src/ui/hooks/useHookDisplayState.test.d.ts +6 -0
- package/dist/src/ui/hooks/useHookDisplayState.test.js +180 -0
- package/dist/src/ui/hooks/useHookDisplayState.test.js.map +1 -0
- package/dist/src/ui/hooks/useIncludeDirsTrust.js +4 -4
- package/dist/src/ui/hooks/useIncludeDirsTrust.js.map +1 -1
- package/dist/src/ui/hooks/useIncludeDirsTrust.test.js +2 -2
- package/dist/src/ui/hooks/useIncludeDirsTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +2 -2
- package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +7 -3
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +14 -4
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +10 -3
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +2 -2
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/usePromptCompletion.js +0 -2
- package/dist/src/ui/hooks/usePromptCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.js +11 -9
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +22 -16
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.d.ts +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useRewind.d.ts +14 -0
- package/dist/src/ui/hooks/useRewind.js +31 -0
- package/dist/src/ui/hooks/useRewind.js.map +1 -0
- package/dist/src/ui/hooks/useRewind.test.d.ts +6 -0
- package/dist/src/ui/hooks/useRewind.test.js +100 -0
- package/dist/src/ui/hooks/useRewind.test.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.js +2 -1
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSessionBrowser.js +3 -3
- package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
- package/dist/src/ui/hooks/useSessionBrowser.test.js +4 -10
- package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.js +3 -3
- package/dist/src/ui/hooks/useShellHistory.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.js +26 -11
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +115 -5
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +73 -50
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/vim.test.js +7 -0
- package/dist/src/ui/hooks/vim.test.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +79 -53
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/themes/ansi-light.js +1 -1
- package/dist/src/ui/themes/ansi-light.js.map +1 -1
- package/dist/src/ui/themes/ansi.js +1 -1
- package/dist/src/ui/themes/ansi.js.map +1 -1
- package/dist/src/ui/themes/color-utils.d.ts +1 -0
- package/dist/src/ui/themes/color-utils.js +13 -0
- package/dist/src/ui/themes/color-utils.js.map +1 -1
- package/dist/src/ui/themes/color-utils.test.js +20 -1
- package/dist/src/ui/themes/color-utils.test.js.map +1 -1
- package/dist/src/ui/themes/shades-of-purple.js +1 -1
- package/dist/src/ui/themes/shades-of-purple.js.map +1 -1
- package/dist/src/ui/themes/theme-manager.d.ts +5 -0
- package/dist/src/ui/themes/theme-manager.js +9 -3
- package/dist/src/ui/themes/theme-manager.js.map +1 -1
- package/dist/src/ui/themes/theme-manager.test.js +7 -0
- package/dist/src/ui/themes/theme-manager.test.js.map +1 -1
- package/dist/src/ui/themes/theme.d.ts +12 -0
- package/dist/src/ui/themes/theme.js +34 -4
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/themes/theme.test.js +23 -0
- package/dist/src/ui/themes/theme.test.js.map +1 -1
- package/dist/src/ui/types.d.ts +23 -4
- package/dist/src/ui/types.js +4 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.js +2 -2
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.test.js +1 -1
- package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -1
- package/dist/src/ui/utils/ConsolePatcher.js +1 -0
- package/dist/src/ui/utils/ConsolePatcher.js.map +1 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +2 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.d.ts +2 -2
- package/dist/src/ui/utils/clipboardUtils.js +50 -4
- package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.test.js +12 -12
- package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.windows.test.d.ts +6 -0
- package/dist/src/ui/utils/clipboardUtils.windows.test.js +52 -0
- package/dist/src/ui/utils/clipboardUtils.windows.test.js.map +1 -0
- package/dist/src/ui/utils/commandUtils.js +13 -10
- package/dist/src/ui/utils/commandUtils.js.map +1 -1
- package/dist/src/ui/utils/commandUtils.test.js +39 -2
- package/dist/src/ui/utils/commandUtils.test.js.map +1 -1
- package/dist/src/ui/utils/directoryUtils.d.ts +8 -0
- package/dist/src/ui/utils/directoryUtils.js +95 -3
- package/dist/src/ui/utils/directoryUtils.js.map +1 -1
- package/dist/src/ui/utils/directoryUtils.test.js +193 -3
- package/dist/src/ui/utils/directoryUtils.test.js.map +1 -1
- package/dist/src/ui/utils/highlight.d.ts +3 -2
- package/dist/src/ui/utils/highlight.js +46 -36
- package/dist/src/ui/utils/highlight.js.map +1 -1
- package/dist/src/ui/utils/highlight.test.js +75 -0
- package/dist/src/ui/utils/highlight.test.js.map +1 -1
- package/dist/src/ui/utils/historyExportUtils.d.ts +21 -0
- package/dist/src/ui/utils/historyExportUtils.js +59 -0
- package/dist/src/ui/utils/historyExportUtils.js.map +1 -0
- package/dist/src/ui/utils/rewindFileOps.d.ts +47 -0
- package/dist/src/ui/utils/rewindFileOps.js +190 -0
- package/dist/src/ui/utils/rewindFileOps.js.map +1 -0
- package/dist/src/ui/utils/rewindFileOps.test.d.ts +6 -0
- package/dist/src/ui/utils/rewindFileOps.test.js +375 -0
- package/dist/src/ui/utils/rewindFileOps.test.js.map +1 -0
- package/dist/src/ui/utils/terminalCapabilityManager.d.ts +41 -0
- package/dist/src/ui/utils/terminalCapabilityManager.js +209 -0
- package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -0
- package/dist/src/ui/utils/terminalCapabilityManager.test.d.ts +6 -0
- package/dist/src/ui/utils/terminalCapabilityManager.test.js +221 -0
- package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -0
- package/dist/src/ui/utils/terminalSetup.d.ts +1 -1
- package/dist/src/ui/utils/terminalSetup.js +21 -6
- package/dist/src/ui/utils/terminalSetup.js.map +1 -1
- package/dist/src/ui/utils/terminalSetup.test.js +11 -2
- package/dist/src/ui/utils/terminalSetup.test.js.map +1 -1
- package/dist/src/ui/utils/textUtils.js +9 -1
- package/dist/src/ui/utils/textUtils.js.map +1 -1
- package/dist/src/ui/utils/textUtils.test.js +12 -1
- package/dist/src/ui/utils/textUtils.test.js.map +1 -1
- package/dist/src/ui/utils/ui-sizing.js +1 -1
- package/dist/src/ui/utils/ui-sizing.js.map +1 -1
- package/dist/src/ui/utils/ui-sizing.test.js +2 -2
- package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
- package/dist/src/utils/activityLogger.d.ts +47 -0
- package/dist/src/utils/activityLogger.js +297 -0
- package/dist/src/utils/activityLogger.js.map +1 -0
- package/dist/src/utils/cleanup.d.ts +5 -0
- package/dist/src/utils/cleanup.js +17 -0
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/cleanup.test.js +21 -31
- package/dist/src/utils/cleanup.test.js.map +1 -1
- package/dist/src/utils/errors.js +9 -10
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +95 -37
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/handleAutoUpdate.test.js +2 -2
- package/dist/src/utils/processUtils.d.ts +1 -1
- package/dist/src/utils/processUtils.js +1 -1
- package/dist/src/utils/processUtils.js.map +1 -1
- package/dist/src/utils/readStdin.js +7 -0
- package/dist/src/utils/readStdin.js.map +1 -1
- package/dist/src/utils/readStdin.test.js +4 -0
- package/dist/src/utils/readStdin.test.js.map +1 -1
- package/dist/src/utils/readStdin_safety.test.d.ts +6 -0
- package/dist/src/utils/readStdin_safety.test.js +68 -0
- package/dist/src/utils/readStdin_safety.test.js.map +1 -0
- package/dist/src/utils/relaunch.js +3 -1
- package/dist/src/utils/relaunch.js.map +1 -1
- package/dist/src/utils/relaunch.test.js +13 -7
- package/dist/src/utils/relaunch.test.js.map +1 -1
- package/dist/src/utils/resolvePath.js +3 -3
- package/dist/src/utils/resolvePath.js.map +1 -1
- package/dist/src/utils/resolvePath.test.js +3 -0
- package/dist/src/utils/resolvePath.test.js.map +1 -1
- package/dist/src/utils/sandbox.js +27 -17
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/sandbox.test.js +17 -5
- package/dist/src/utils/sandbox.test.js.map +1 -1
- package/dist/src/utils/sessionCleanup.integration.test.js +2 -2
- package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -1
- package/dist/src/utils/sessionCleanup.js +16 -4
- package/dist/src/utils/sessionCleanup.js.map +1 -1
- package/dist/src/utils/sessionCleanup.test.js +18 -68
- package/dist/src/utils/sessionCleanup.test.js.map +1 -1
- package/dist/src/utils/sessionUtils.d.ts +20 -0
- package/dist/src/utils/sessionUtils.js +32 -4
- package/dist/src/utils/sessionUtils.js.map +1 -1
- package/dist/src/utils/sessionUtils.test.js +3 -3
- package/dist/src/utils/sessionUtils.test.js.map +1 -1
- package/dist/src/utils/sessions.js +9 -9
- package/dist/src/utils/sessions.js.map +1 -1
- package/dist/src/utils/sessions.test.js +38 -41
- package/dist/src/utils/sessions.test.js.map +1 -1
- package/dist/src/utils/settingsUtils.js +0 -5
- package/dist/src/utils/settingsUtils.js.map +1 -1
- package/dist/src/utils/skillSettings.d.ts +33 -0
- package/dist/src/utils/skillSettings.js +101 -0
- package/dist/src/utils/skillSettings.js.map +1 -0
- package/dist/src/utils/skillUtils.d.ts +29 -0
- package/dist/src/utils/skillUtils.js +144 -0
- package/dist/src/utils/skillUtils.js.map +1 -0
- package/dist/src/utils/skillUtils.test.d.ts +6 -0
- package/dist/src/utils/skillUtils.test.js +57 -0
- package/dist/src/utils/skillUtils.test.js.map +1 -0
- package/dist/src/utils/terminalTheme.d.ts +15 -0
- package/dist/src/utils/terminalTheme.js +50 -0
- package/dist/src/utils/terminalTheme.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.d.ts +2 -1
- package/dist/src/utils/userStartupWarnings.js +17 -7
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/src/utils/userStartupWarnings.test.js +37 -6
- package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
- package/dist/src/utils/windowTitle.d.ts +13 -4
- package/dist/src/utils/windowTitle.js +65 -7
- package/dist/src/utils/windowTitle.js.map +1 -1
- package/dist/src/utils/windowTitle.test.js +183 -40
- package/dist/src/utils/windowTitle.test.js.map +1 -1
- package/dist/src/validateNonInterActiveAuth.d.ts +1 -1
- package/dist/src/validateNonInterActiveAuth.js +1 -2
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/fileSystemService.d.ts +3 -3
- package/dist/src/zed-integration/fileSystemService.js +5 -7
- package/dist/src/zed-integration/fileSystemService.js.map +1 -1
- package/dist/src/zed-integration/fileSystemService.test.js +11 -13
- package/dist/src/zed-integration/fileSystemService.test.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +5 -5
- package/dist/src/zed-integration/zedIntegration.js +42 -21
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.test.js +29 -18
- package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/dist/src/commands/extensions/settings.js +0 -111
- package/dist/src/commands/extensions/settings.js.map +0 -1
- package/dist/src/ui/hooks/useBracketedPaste.d.ts +0 -12
- package/dist/src/ui/hooks/useBracketedPaste.js +0 -31
- package/dist/src/ui/hooks/useBracketedPaste.js.map +0 -1
- package/dist/src/ui/utils/bracketedPaste.d.ts +0 -7
- package/dist/src/ui/utils/bracketedPaste.js +0 -15
- package/dist/src/ui/utils/bracketedPaste.js.map +0 -1
- package/dist/src/ui/utils/kittyProtocolDetector.d.ts +0 -17
- package/dist/src/ui/utils/kittyProtocolDetector.js +0 -111
- package/dist/src/ui/utils/kittyProtocolDetector.js.map +0 -1
- package/dist/src/ui/utils/kittyProtocolDetector.test.js +0 -113
- package/dist/src/ui/utils/kittyProtocolDetector.test.js.map +0 -1
- package/dist/src/zed-integration/acp.d.ts +0 -41
- package/dist/src/zed-integration/acp.js +0 -72
- package/dist/src/zed-integration/acp.js.map +0 -1
- package/dist/src/zed-integration/acp.test.js +0 -214
- package/dist/src/zed-integration/acp.test.js.map +0 -1
- package/dist/src/zed-integration/connection.d.ts +0 -28
- package/dist/src/zed-integration/connection.js +0 -165
- package/dist/src/zed-integration/connection.js.map +0 -1
- package/dist/src/zed-integration/connection.test.js +0 -175
- package/dist/src/zed-integration/connection.test.js.map +0 -1
- package/dist/src/zed-integration/schema.d.ts +0 -11792
- package/dist/src/zed-integration/schema.js +0 -311
- package/dist/src/zed-integration/schema.js.map +0 -1
- /package/dist/src/{ui/utils/kittyProtocolDetector.test.d.ts → config/extension-manager-scope.test.d.ts} +0 -0
- /package/dist/src/{zed-integration/acp.test.d.ts → config/extension-manager-skills.test.d.ts} +0 -0
- /package/dist/src/{zed-integration/connection.test.d.ts → config/extensions/extensionUpdates.test.d.ts} +0 -0
|
@@ -29,18 +29,26 @@ vi.mock('./trustedFolders.js', () => ({
|
|
|
29
29
|
.fn()
|
|
30
30
|
.mockReturnValue({ isTrusted: true, source: 'file' }),
|
|
31
31
|
}));
|
|
32
|
+
vi.mock('./settingsSchema.js', async (importOriginal) => {
|
|
33
|
+
const actual = await importOriginal();
|
|
34
|
+
return {
|
|
35
|
+
...actual,
|
|
36
|
+
getSettingsSchema: vi.fn(actual.getSettingsSchema),
|
|
37
|
+
};
|
|
38
|
+
});
|
|
32
39
|
// NOW import everything else, including the (now effectively re-exported) settings.js
|
|
33
|
-
import
|
|
40
|
+
import * as pathActual from 'node:path'; // Restored for MOCK_WORKSPACE_SETTINGS_PATH
|
|
41
|
+
import path from 'node:path';
|
|
34
42
|
import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
|
|
35
43
|
import * as fs from 'node:fs'; // fs will be mocked separately
|
|
36
44
|
import stripJsonComments from 'strip-json-comments'; // Will be mocked separately
|
|
37
45
|
import { isWorkspaceTrusted } from './trustedFolders.js';
|
|
38
46
|
// These imports will get the versions from the vi.mock('./settings.js', ...) factory.
|
|
39
47
|
import { loadSettings, USER_SETTINGS_PATH, // This IS the mocked path.
|
|
40
|
-
getSystemSettingsPath, getSystemDefaultsPath,
|
|
48
|
+
getSystemSettingsPath, getSystemDefaultsPath, saveSettings, getDefaultsFromSchema, loadEnvironment, } from './settings.js';
|
|
41
49
|
import { FatalConfigError, CELL_DIR, AuthType } from '@google/gemini-cli-core';
|
|
42
|
-
import { ExtensionManager } from './extension-manager.js';
|
|
43
50
|
import { updateSettingsFilePreservingFormat } from '../utils/commentJson.js';
|
|
51
|
+
import { getSettingsSchema, MergeStrategy, } from './settingsSchema.js';
|
|
44
52
|
const MOCK_WORKSPACE_DIR = '/mock/workspace';
|
|
45
53
|
// Use the (mocked) CELL_DIR for consistency
|
|
46
54
|
const MOCK_WORKSPACE_SETTINGS_PATH = pathActual.join(MOCK_WORKSPACE_DIR, CELL_DIR, 'settings.json');
|
|
@@ -60,6 +68,7 @@ vi.mock('fs', async (importOriginal) => {
|
|
|
60
68
|
vi.mock('./extension.js');
|
|
61
69
|
const mockCoreEvents = vi.hoisted(() => ({
|
|
62
70
|
emitFeedback: vi.fn(),
|
|
71
|
+
emitSettingsChanged: vi.fn(),
|
|
63
72
|
}));
|
|
64
73
|
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
65
74
|
const actual = await importOriginal();
|
|
@@ -114,7 +123,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
114
123
|
},
|
|
115
124
|
});
|
|
116
125
|
expect(settings.workspace.settings).toEqual({});
|
|
117
|
-
expect(settings.merged).
|
|
126
|
+
expect(settings.merged).toMatchObject({
|
|
118
127
|
security: {
|
|
119
128
|
auth: {
|
|
120
129
|
selectedType: AuthType.KEYCLOAK,
|
|
@@ -173,7 +182,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
173
182
|
else {
|
|
174
183
|
expect(settings[scope].settings).toEqual(content);
|
|
175
184
|
}
|
|
176
|
-
expect(settings.merged).
|
|
185
|
+
expect(settings.merged).toMatchObject(expectedWithAuth);
|
|
177
186
|
});
|
|
178
187
|
it('should merge system, user and workspace settings, with system taking precedence over workspace, and workspace over user', () => {
|
|
179
188
|
mockFsExistsSync.mockImplementation((p) => p === getSystemSettingsPath() ||
|
|
@@ -234,7 +243,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
234
243
|
},
|
|
235
244
|
});
|
|
236
245
|
expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
|
|
237
|
-
expect(settings.merged).
|
|
246
|
+
expect(settings.merged).toMatchObject({
|
|
238
247
|
ui: {
|
|
239
248
|
theme: 'system-theme',
|
|
240
249
|
},
|
|
@@ -256,124 +265,23 @@ describe('Settings Loading and Merging', () => {
|
|
|
256
265
|
},
|
|
257
266
|
});
|
|
258
267
|
});
|
|
259
|
-
it('should correctly
|
|
260
|
-
mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
|
|
261
|
-
const legacySettingsContent = {
|
|
262
|
-
theme: 'legacy-dark',
|
|
263
|
-
vimMode: true,
|
|
264
|
-
contextFileName: 'LEGACY_CONTEXT.md',
|
|
265
|
-
model: 'gemini-2.5-pro',
|
|
266
|
-
mcpServers: {
|
|
267
|
-
'legacy-server-1': {
|
|
268
|
-
command: 'npm',
|
|
269
|
-
args: ['run', 'start:server1'],
|
|
270
|
-
description: 'Legacy Server 1',
|
|
271
|
-
},
|
|
272
|
-
'legacy-server-2': {
|
|
273
|
-
command: 'node',
|
|
274
|
-
args: ['server2.js'],
|
|
275
|
-
description: 'Legacy Server 2',
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
allowMCPServers: ['legacy-server-1'],
|
|
279
|
-
someUnrecognizedSetting: 'should-be-preserved',
|
|
280
|
-
};
|
|
281
|
-
fs.readFileSync.mockImplementation((p) => {
|
|
282
|
-
if (p === USER_SETTINGS_PATH)
|
|
283
|
-
return JSON.stringify(legacySettingsContent);
|
|
284
|
-
return '{}';
|
|
285
|
-
});
|
|
286
|
-
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
287
|
-
expect(settings.merged).toEqual({
|
|
288
|
-
ui: {
|
|
289
|
-
theme: 'legacy-dark',
|
|
290
|
-
},
|
|
291
|
-
general: {
|
|
292
|
-
vimMode: true,
|
|
293
|
-
},
|
|
294
|
-
context: {
|
|
295
|
-
fileName: 'LEGACY_CONTEXT.md',
|
|
296
|
-
},
|
|
297
|
-
model: {
|
|
298
|
-
name: 'gemini-2.5-pro',
|
|
299
|
-
},
|
|
300
|
-
mcpServers: {
|
|
301
|
-
'legacy-server-1': {
|
|
302
|
-
command: 'npm',
|
|
303
|
-
args: ['run', 'start:server1'],
|
|
304
|
-
description: 'Legacy Server 1',
|
|
305
|
-
},
|
|
306
|
-
'legacy-server-2': {
|
|
307
|
-
command: 'node',
|
|
308
|
-
args: ['server2.js'],
|
|
309
|
-
description: 'Legacy Server 2',
|
|
310
|
-
},
|
|
311
|
-
},
|
|
312
|
-
mcp: {
|
|
313
|
-
allowed: ['legacy-server-1'],
|
|
314
|
-
},
|
|
315
|
-
someUnrecognizedSetting: 'should-be-preserved',
|
|
316
|
-
security: {
|
|
317
|
-
auth: {
|
|
318
|
-
selectedType: AuthType.KEYCLOAK,
|
|
319
|
-
},
|
|
320
|
-
},
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
it('should rewrite allowedTools to tools.allowed during migration', () => {
|
|
324
|
-
mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
|
|
325
|
-
const legacySettingsContent = {
|
|
326
|
-
allowedTools: ['fs', 'shell'],
|
|
327
|
-
};
|
|
328
|
-
fs.readFileSync.mockImplementation((p) => {
|
|
329
|
-
if (p === USER_SETTINGS_PATH)
|
|
330
|
-
return JSON.stringify(legacySettingsContent);
|
|
331
|
-
return '{}';
|
|
332
|
-
});
|
|
333
|
-
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
334
|
-
expect(settings.merged.tools?.allowed).toEqual(['fs', 'shell']);
|
|
335
|
-
expect(settings.merged['allowedTools']).toBeUndefined();
|
|
336
|
-
});
|
|
337
|
-
it('should allow V2 settings to override V1 settings when both are present (zombie setting fix)', () => {
|
|
338
|
-
mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH);
|
|
339
|
-
const mixedSettingsContent = {
|
|
340
|
-
// V1 setting (migrates to ui.accessibility.screenReader = true)
|
|
341
|
-
accessibility: {
|
|
342
|
-
screenReader: true,
|
|
343
|
-
},
|
|
344
|
-
// V2 setting (explicitly set to false)
|
|
345
|
-
ui: {
|
|
346
|
-
accessibility: {
|
|
347
|
-
screenReader: false,
|
|
348
|
-
},
|
|
349
|
-
},
|
|
350
|
-
};
|
|
351
|
-
fs.readFileSync.mockImplementation((p) => {
|
|
352
|
-
if (p === USER_SETTINGS_PATH)
|
|
353
|
-
return JSON.stringify(mixedSettingsContent);
|
|
354
|
-
return '{}';
|
|
355
|
-
});
|
|
356
|
-
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
357
|
-
// We expect the V2 setting (false) to win, NOT the migrated V1 setting (true)
|
|
358
|
-
expect(settings.merged.ui?.accessibility?.screenReader).toBe(false);
|
|
359
|
-
});
|
|
360
|
-
it('should correctly merge and migrate legacy array properties from multiple scopes', () => {
|
|
268
|
+
it('should correctly merge array properties from multiple scopes', () => {
|
|
361
269
|
mockFsExistsSync.mockReturnValue(true);
|
|
362
|
-
const
|
|
363
|
-
includeDirectories: ['/user/dir'],
|
|
364
|
-
|
|
365
|
-
|
|
270
|
+
const userSettings = {
|
|
271
|
+
context: { includeDirectories: ['/user/dir'] },
|
|
272
|
+
tools: { exclude: ['user-tool'] },
|
|
273
|
+
advanced: { excludedEnvVars: ['USER_VAR'] },
|
|
366
274
|
};
|
|
367
|
-
const
|
|
368
|
-
includeDirectories: ['/workspace/dir'],
|
|
369
|
-
|
|
370
|
-
|
|
275
|
+
const workspaceSettings = {
|
|
276
|
+
context: { includeDirectories: ['/workspace/dir'] },
|
|
277
|
+
tools: { exclude: ['workspace-tool'] },
|
|
278
|
+
advanced: { excludedEnvVars: ['WORKSPACE_VAR', 'USER_VAR'] },
|
|
371
279
|
};
|
|
372
280
|
fs.readFileSync.mockImplementation((p) => {
|
|
373
281
|
if (p === USER_SETTINGS_PATH)
|
|
374
|
-
return JSON.stringify(
|
|
282
|
+
return JSON.stringify(userSettings);
|
|
375
283
|
if (p === MOCK_WORKSPACE_SETTINGS_PATH)
|
|
376
|
-
return JSON.stringify(
|
|
284
|
+
return JSON.stringify(workspaceSettings);
|
|
377
285
|
return '{}';
|
|
378
286
|
});
|
|
379
287
|
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
@@ -389,9 +297,28 @@ describe('Settings Loading and Merging', () => {
|
|
|
389
297
|
]);
|
|
390
298
|
// Verify excludedProjectEnvVars are concatenated and de-duped
|
|
391
299
|
expect(settings.merged.advanced?.excludedEnvVars).toEqual(expect.arrayContaining(['USER_VAR', 'WORKSPACE_VAR']));
|
|
392
|
-
expect(settings.merged.advanced?.excludedEnvVars).toHaveLength(
|
|
300
|
+
expect(settings.merged.advanced?.excludedEnvVars).toHaveLength(4);
|
|
393
301
|
});
|
|
394
302
|
it('should merge all settings files with the correct precedence', () => {
|
|
303
|
+
// Mock schema to test defaults application
|
|
304
|
+
const mockSchema = {
|
|
305
|
+
ui: { type: 'object', default: {}, properties: {} },
|
|
306
|
+
tools: { type: 'object', default: {}, properties: {} },
|
|
307
|
+
context: {
|
|
308
|
+
type: 'object',
|
|
309
|
+
default: {},
|
|
310
|
+
properties: {
|
|
311
|
+
discoveryMaxDirs: { type: 'number', default: 200 },
|
|
312
|
+
includeDirectories: {
|
|
313
|
+
type: 'array',
|
|
314
|
+
default: [],
|
|
315
|
+
mergeStrategy: MergeStrategy.CONCAT,
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
},
|
|
319
|
+
mcpServers: { type: 'object', default: {} },
|
|
320
|
+
};
|
|
321
|
+
getSettingsSchema.mockReturnValue(mockSchema);
|
|
395
322
|
mockFsExistsSync.mockReturnValue(true);
|
|
396
323
|
const systemDefaultsContent = {
|
|
397
324
|
ui: {
|
|
@@ -457,7 +384,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
457
384
|
expect(settings.workspace.settings).toEqual(workspaceSettingsContent);
|
|
458
385
|
expect(settings.merged).toEqual({
|
|
459
386
|
context: {
|
|
460
|
-
|
|
387
|
+
discoveryMaxDirs: 200,
|
|
461
388
|
includeDirectories: [
|
|
462
389
|
'/system/defaults/dir',
|
|
463
390
|
'/user/dir1',
|
|
@@ -465,14 +392,12 @@ describe('Settings Loading and Merging', () => {
|
|
|
465
392
|
'/workspace/dir',
|
|
466
393
|
'/system/dir',
|
|
467
394
|
],
|
|
395
|
+
fileName: 'WORKSPACE_CONTEXT.md',
|
|
468
396
|
},
|
|
397
|
+
mcpServers: {},
|
|
398
|
+
ui: { theme: 'system-theme' },
|
|
399
|
+
tools: { sandbox: false },
|
|
469
400
|
telemetry: false,
|
|
470
|
-
tools: {
|
|
471
|
-
sandbox: false,
|
|
472
|
-
},
|
|
473
|
-
ui: {
|
|
474
|
-
theme: 'system-theme',
|
|
475
|
-
},
|
|
476
401
|
security: {
|
|
477
402
|
auth: {
|
|
478
403
|
selectedType: AuthType.KEYCLOAK,
|
|
@@ -596,7 +521,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
596
521
|
},
|
|
597
522
|
expected: {
|
|
598
523
|
key: 'advanced.excludedEnvVars',
|
|
599
|
-
value: ['DEBUG', 'NODE_ENV', 'CUSTOM_VAR'],
|
|
524
|
+
value: ['DEBUG', 'DEBUG_MODE', 'NODE_ENV', 'CUSTOM_VAR'],
|
|
600
525
|
},
|
|
601
526
|
},
|
|
602
527
|
{
|
|
@@ -607,7 +532,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
607
532
|
},
|
|
608
533
|
expected: {
|
|
609
534
|
key: 'advanced.excludedEnvVars',
|
|
610
|
-
value: ['WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
|
|
535
|
+
value: ['DEBUG', 'DEBUG_MODE', 'WORKSPACE_DEBUG', 'WORKSPACE_VAR'],
|
|
611
536
|
},
|
|
612
537
|
},
|
|
613
538
|
])('should handle $description correctly', ({ path, content, expected }) => {
|
|
@@ -654,6 +579,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
654
579
|
]);
|
|
655
580
|
expect(settings.merged.advanced?.excludedEnvVars).toEqual([
|
|
656
581
|
'DEBUG',
|
|
582
|
+
'DEBUG_MODE',
|
|
657
583
|
'NODE_ENV',
|
|
658
584
|
'USER_VAR',
|
|
659
585
|
'WORKSPACE_DEBUG',
|
|
@@ -716,8 +642,8 @@ describe('Settings Loading and Merging', () => {
|
|
|
716
642
|
fs.readFileSync.mockReturnValue('{}');
|
|
717
643
|
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
718
644
|
expect(settings.merged.telemetry).toBeUndefined();
|
|
719
|
-
expect(settings.merged.ui).
|
|
720
|
-
expect(settings.merged.mcpServers).
|
|
645
|
+
expect(settings.merged.ui).toBeDefined();
|
|
646
|
+
expect(settings.merged.mcpServers).toEqual({});
|
|
721
647
|
});
|
|
722
648
|
it('should merge MCP servers correctly, with workspace taking precedence', () => {
|
|
723
649
|
mockFsExistsSync.mockImplementation((p) => p === USER_SETTINGS_PATH || p === MOCK_WORKSPACE_SETTINGS_PATH);
|
|
@@ -832,7 +758,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
832
758
|
mockFsExistsSync.mockReturnValue(false); // No settings files exist
|
|
833
759
|
fs.readFileSync.mockReturnValue('{}');
|
|
834
760
|
const settings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
835
|
-
expect(settings.merged.mcpServers).
|
|
761
|
+
expect(settings.merged.mcpServers).toEqual({});
|
|
836
762
|
});
|
|
837
763
|
it('should merge MCP servers from system, user, and workspace with system taking precedence', () => {
|
|
838
764
|
mockFsExistsSync.mockReturnValue(true);
|
|
@@ -950,10 +876,10 @@ describe('Settings Loading and Merging', () => {
|
|
|
950
876
|
expected: 0.8,
|
|
951
877
|
},
|
|
952
878
|
{
|
|
953
|
-
description: 'should be
|
|
879
|
+
description: 'should be default if not in any settings file',
|
|
954
880
|
userContent: {},
|
|
955
881
|
workspaceContent: {},
|
|
956
|
-
expected:
|
|
882
|
+
expected: 0.5,
|
|
957
883
|
},
|
|
958
884
|
])('$description', ({ userContent, workspaceContent, expected }) => {
|
|
959
885
|
mockFsExistsSync.mockReturnValue(true);
|
|
@@ -1311,7 +1237,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
1311
1237
|
expect(fs.readFileSync).toHaveBeenCalledWith(MOCK_ENV_SYSTEM_SETTINGS_PATH, 'utf-8');
|
|
1312
1238
|
expect(settings.system.path).toBe(MOCK_ENV_SYSTEM_SETTINGS_PATH);
|
|
1313
1239
|
expect(settings.system.settings).toEqual(systemSettingsContent);
|
|
1314
|
-
expect(settings.merged).
|
|
1240
|
+
expect(settings.merged).toMatchObject({
|
|
1315
1241
|
...systemSettingsContent,
|
|
1316
1242
|
security: {
|
|
1317
1243
|
auth: {
|
|
@@ -1392,8 +1318,9 @@ describe('Settings Loading and Merging', () => {
|
|
|
1392
1318
|
'DEBUG',
|
|
1393
1319
|
]);
|
|
1394
1320
|
expect(settings.merged.advanced?.excludedEnvVars).toEqual([
|
|
1395
|
-
'NODE_ENV',
|
|
1396
1321
|
'DEBUG',
|
|
1322
|
+
'DEBUG_MODE',
|
|
1323
|
+
'NODE_ENV',
|
|
1397
1324
|
]);
|
|
1398
1325
|
});
|
|
1399
1326
|
it('should merge excludedProjectEnvVars with workspace taking precedence', () => {
|
|
@@ -1425,6 +1352,7 @@ describe('Settings Loading and Merging', () => {
|
|
|
1425
1352
|
]);
|
|
1426
1353
|
expect(settings.merged.advanced?.excludedEnvVars).toEqual([
|
|
1427
1354
|
'DEBUG',
|
|
1355
|
+
'DEBUG_MODE',
|
|
1428
1356
|
'NODE_ENV',
|
|
1429
1357
|
'USER_VAR',
|
|
1430
1358
|
'WORKSPACE_DEBUG',
|
|
@@ -1483,315 +1411,6 @@ describe('Settings Loading and Merging', () => {
|
|
|
1483
1411
|
expect(settings.merged.ui?.theme).toBe('dark'); // User setting
|
|
1484
1412
|
});
|
|
1485
1413
|
});
|
|
1486
|
-
describe('migrateSettingsToV1', () => {
|
|
1487
|
-
it('should handle an empty object', () => {
|
|
1488
|
-
const v2Settings = {};
|
|
1489
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1490
|
-
expect(v1Settings).toEqual({});
|
|
1491
|
-
});
|
|
1492
|
-
it('should migrate a simple v2 settings object to v1', () => {
|
|
1493
|
-
const v2Settings = {
|
|
1494
|
-
general: {
|
|
1495
|
-
preferredEditor: 'vscode',
|
|
1496
|
-
vimMode: true,
|
|
1497
|
-
},
|
|
1498
|
-
ui: {
|
|
1499
|
-
theme: 'dark',
|
|
1500
|
-
},
|
|
1501
|
-
};
|
|
1502
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1503
|
-
expect(v1Settings).toEqual({
|
|
1504
|
-
preferredEditor: 'vscode',
|
|
1505
|
-
vimMode: true,
|
|
1506
|
-
theme: 'dark',
|
|
1507
|
-
});
|
|
1508
|
-
});
|
|
1509
|
-
it('should handle nested properties correctly', () => {
|
|
1510
|
-
const v2Settings = {
|
|
1511
|
-
security: {
|
|
1512
|
-
folderTrust: {
|
|
1513
|
-
enabled: true,
|
|
1514
|
-
},
|
|
1515
|
-
auth: {
|
|
1516
|
-
selectedType: 'oauth',
|
|
1517
|
-
},
|
|
1518
|
-
},
|
|
1519
|
-
advanced: {
|
|
1520
|
-
autoConfigureMemory: true,
|
|
1521
|
-
},
|
|
1522
|
-
};
|
|
1523
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1524
|
-
expect(v1Settings).toEqual({
|
|
1525
|
-
folderTrust: true,
|
|
1526
|
-
selectedAuthType: 'oauth',
|
|
1527
|
-
autoConfigureMaxOldSpaceSize: true,
|
|
1528
|
-
});
|
|
1529
|
-
});
|
|
1530
|
-
it('should preserve mcpServers at the top level', () => {
|
|
1531
|
-
const v2Settings = {
|
|
1532
|
-
general: {
|
|
1533
|
-
preferredEditor: 'vscode',
|
|
1534
|
-
},
|
|
1535
|
-
mcpServers: {
|
|
1536
|
-
'my-server': {
|
|
1537
|
-
command: 'npm start',
|
|
1538
|
-
},
|
|
1539
|
-
},
|
|
1540
|
-
};
|
|
1541
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1542
|
-
expect(v1Settings).toEqual({
|
|
1543
|
-
preferredEditor: 'vscode',
|
|
1544
|
-
mcpServers: {
|
|
1545
|
-
'my-server': {
|
|
1546
|
-
command: 'npm start',
|
|
1547
|
-
},
|
|
1548
|
-
},
|
|
1549
|
-
});
|
|
1550
|
-
});
|
|
1551
|
-
it('should carry over unrecognized top-level properties', () => {
|
|
1552
|
-
const v2Settings = {
|
|
1553
|
-
general: {
|
|
1554
|
-
vimMode: false,
|
|
1555
|
-
},
|
|
1556
|
-
unrecognized: 'value',
|
|
1557
|
-
another: {
|
|
1558
|
-
nested: true,
|
|
1559
|
-
},
|
|
1560
|
-
};
|
|
1561
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1562
|
-
expect(v1Settings).toEqual({
|
|
1563
|
-
vimMode: false,
|
|
1564
|
-
unrecognized: 'value',
|
|
1565
|
-
another: {
|
|
1566
|
-
nested: true,
|
|
1567
|
-
},
|
|
1568
|
-
});
|
|
1569
|
-
});
|
|
1570
|
-
it('should handle a complex object with mixed properties', () => {
|
|
1571
|
-
const v2Settings = {
|
|
1572
|
-
general: {
|
|
1573
|
-
disableAutoUpdate: true,
|
|
1574
|
-
},
|
|
1575
|
-
ui: {
|
|
1576
|
-
hideBanner: true,
|
|
1577
|
-
customThemes: {
|
|
1578
|
-
myTheme: {},
|
|
1579
|
-
},
|
|
1580
|
-
},
|
|
1581
|
-
model: {
|
|
1582
|
-
name: 'gemini-pro',
|
|
1583
|
-
},
|
|
1584
|
-
mcpServers: {
|
|
1585
|
-
'server-1': {
|
|
1586
|
-
command: 'node server.js',
|
|
1587
|
-
},
|
|
1588
|
-
},
|
|
1589
|
-
unrecognized: {
|
|
1590
|
-
should: 'be-preserved',
|
|
1591
|
-
},
|
|
1592
|
-
};
|
|
1593
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1594
|
-
expect(v1Settings).toEqual({
|
|
1595
|
-
disableAutoUpdate: true,
|
|
1596
|
-
hideBanner: true,
|
|
1597
|
-
customThemes: {
|
|
1598
|
-
myTheme: {},
|
|
1599
|
-
},
|
|
1600
|
-
model: 'gemini-pro',
|
|
1601
|
-
mcpServers: {
|
|
1602
|
-
'server-1': {
|
|
1603
|
-
command: 'node server.js',
|
|
1604
|
-
},
|
|
1605
|
-
},
|
|
1606
|
-
unrecognized: {
|
|
1607
|
-
should: 'be-preserved',
|
|
1608
|
-
},
|
|
1609
|
-
});
|
|
1610
|
-
});
|
|
1611
|
-
it('should not migrate a v1 settings object', () => {
|
|
1612
|
-
const v1Settings = {
|
|
1613
|
-
preferredEditor: 'vscode',
|
|
1614
|
-
vimMode: true,
|
|
1615
|
-
theme: 'dark',
|
|
1616
|
-
};
|
|
1617
|
-
const migratedSettings = migrateSettingsToV1(v1Settings);
|
|
1618
|
-
expect(migratedSettings).toEqual({
|
|
1619
|
-
preferredEditor: 'vscode',
|
|
1620
|
-
vimMode: true,
|
|
1621
|
-
theme: 'dark',
|
|
1622
|
-
});
|
|
1623
|
-
});
|
|
1624
|
-
it('should migrate a full v2 settings object to v1', () => {
|
|
1625
|
-
const v2Settings = {
|
|
1626
|
-
general: {
|
|
1627
|
-
preferredEditor: 'code',
|
|
1628
|
-
vimMode: true,
|
|
1629
|
-
},
|
|
1630
|
-
ui: {
|
|
1631
|
-
theme: 'dark',
|
|
1632
|
-
},
|
|
1633
|
-
privacy: {
|
|
1634
|
-
usageStatisticsEnabled: false,
|
|
1635
|
-
},
|
|
1636
|
-
model: {
|
|
1637
|
-
name: 'gemini-2.5-pro',
|
|
1638
|
-
},
|
|
1639
|
-
context: {
|
|
1640
|
-
fileName: 'CONTEXT.md',
|
|
1641
|
-
includeDirectories: ['/src'],
|
|
1642
|
-
},
|
|
1643
|
-
tools: {
|
|
1644
|
-
sandbox: true,
|
|
1645
|
-
exclude: ['toolA'],
|
|
1646
|
-
},
|
|
1647
|
-
mcp: {
|
|
1648
|
-
allowed: ['server1'],
|
|
1649
|
-
},
|
|
1650
|
-
security: {
|
|
1651
|
-
folderTrust: {
|
|
1652
|
-
enabled: true,
|
|
1653
|
-
},
|
|
1654
|
-
},
|
|
1655
|
-
advanced: {
|
|
1656
|
-
dnsResolutionOrder: 'ipv4first',
|
|
1657
|
-
excludedEnvVars: ['SECRET'],
|
|
1658
|
-
},
|
|
1659
|
-
mcpServers: {
|
|
1660
|
-
'my-server': {
|
|
1661
|
-
command: 'npm start',
|
|
1662
|
-
},
|
|
1663
|
-
},
|
|
1664
|
-
unrecognizedTopLevel: {
|
|
1665
|
-
value: 'should be preserved',
|
|
1666
|
-
},
|
|
1667
|
-
};
|
|
1668
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1669
|
-
expect(v1Settings).toEqual({
|
|
1670
|
-
preferredEditor: 'code',
|
|
1671
|
-
vimMode: true,
|
|
1672
|
-
theme: 'dark',
|
|
1673
|
-
usageStatisticsEnabled: false,
|
|
1674
|
-
model: 'gemini-2.5-pro',
|
|
1675
|
-
contextFileName: 'CONTEXT.md',
|
|
1676
|
-
includeDirectories: ['/src'],
|
|
1677
|
-
sandbox: true,
|
|
1678
|
-
excludeTools: ['toolA'],
|
|
1679
|
-
allowMCPServers: ['server1'],
|
|
1680
|
-
folderTrust: true,
|
|
1681
|
-
dnsResolutionOrder: 'ipv4first',
|
|
1682
|
-
excludedProjectEnvVars: ['SECRET'],
|
|
1683
|
-
mcpServers: {
|
|
1684
|
-
'my-server': {
|
|
1685
|
-
command: 'npm start',
|
|
1686
|
-
},
|
|
1687
|
-
},
|
|
1688
|
-
unrecognizedTopLevel: {
|
|
1689
|
-
value: 'should be preserved',
|
|
1690
|
-
},
|
|
1691
|
-
});
|
|
1692
|
-
});
|
|
1693
|
-
it('should handle partial v2 settings', () => {
|
|
1694
|
-
const v2Settings = {
|
|
1695
|
-
general: {
|
|
1696
|
-
vimMode: false,
|
|
1697
|
-
},
|
|
1698
|
-
ui: {},
|
|
1699
|
-
model: {
|
|
1700
|
-
name: 'gemini-2.5-pro',
|
|
1701
|
-
},
|
|
1702
|
-
unrecognized: 'value',
|
|
1703
|
-
};
|
|
1704
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1705
|
-
expect(v1Settings).toEqual({
|
|
1706
|
-
vimMode: false,
|
|
1707
|
-
model: 'gemini-2.5-pro',
|
|
1708
|
-
unrecognized: 'value',
|
|
1709
|
-
});
|
|
1710
|
-
});
|
|
1711
|
-
it('should handle settings with different data types', () => {
|
|
1712
|
-
const v2Settings = {
|
|
1713
|
-
general: {
|
|
1714
|
-
vimMode: false,
|
|
1715
|
-
},
|
|
1716
|
-
model: {
|
|
1717
|
-
maxSessionTurns: -1,
|
|
1718
|
-
},
|
|
1719
|
-
context: {
|
|
1720
|
-
includeDirectories: [],
|
|
1721
|
-
},
|
|
1722
|
-
security: {
|
|
1723
|
-
folderTrust: {
|
|
1724
|
-
enabled: undefined,
|
|
1725
|
-
},
|
|
1726
|
-
},
|
|
1727
|
-
};
|
|
1728
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1729
|
-
expect(v1Settings).toEqual({
|
|
1730
|
-
vimMode: false,
|
|
1731
|
-
maxSessionTurns: -1,
|
|
1732
|
-
includeDirectories: [],
|
|
1733
|
-
security: {
|
|
1734
|
-
folderTrust: {
|
|
1735
|
-
enabled: undefined,
|
|
1736
|
-
},
|
|
1737
|
-
},
|
|
1738
|
-
});
|
|
1739
|
-
});
|
|
1740
|
-
it('should preserve unrecognized top-level keys', () => {
|
|
1741
|
-
const v2Settings = {
|
|
1742
|
-
general: {
|
|
1743
|
-
vimMode: true,
|
|
1744
|
-
},
|
|
1745
|
-
customTopLevel: {
|
|
1746
|
-
a: 1,
|
|
1747
|
-
b: [2],
|
|
1748
|
-
},
|
|
1749
|
-
anotherOne: 'hello',
|
|
1750
|
-
};
|
|
1751
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1752
|
-
expect(v1Settings).toEqual({
|
|
1753
|
-
vimMode: true,
|
|
1754
|
-
customTopLevel: {
|
|
1755
|
-
a: 1,
|
|
1756
|
-
b: [2],
|
|
1757
|
-
},
|
|
1758
|
-
anotherOne: 'hello',
|
|
1759
|
-
});
|
|
1760
|
-
});
|
|
1761
|
-
it('should handle an empty v2 settings object', () => {
|
|
1762
|
-
const v2Settings = {};
|
|
1763
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1764
|
-
expect(v1Settings).toEqual({});
|
|
1765
|
-
});
|
|
1766
|
-
it('should correctly handle mcpServers at the top level', () => {
|
|
1767
|
-
const v2Settings = {
|
|
1768
|
-
mcpServers: {
|
|
1769
|
-
serverA: { command: 'a' },
|
|
1770
|
-
},
|
|
1771
|
-
mcp: {
|
|
1772
|
-
allowed: ['serverA'],
|
|
1773
|
-
},
|
|
1774
|
-
};
|
|
1775
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1776
|
-
expect(v1Settings).toEqual({
|
|
1777
|
-
mcpServers: {
|
|
1778
|
-
serverA: { command: 'a' },
|
|
1779
|
-
},
|
|
1780
|
-
allowMCPServers: ['serverA'],
|
|
1781
|
-
});
|
|
1782
|
-
});
|
|
1783
|
-
it('should correctly migrate customWittyPhrases', () => {
|
|
1784
|
-
const v2Settings = {
|
|
1785
|
-
ui: {
|
|
1786
|
-
customWittyPhrases: ['test phrase'],
|
|
1787
|
-
},
|
|
1788
|
-
};
|
|
1789
|
-
const v1Settings = migrateSettingsToV1(v2Settings);
|
|
1790
|
-
expect(v1Settings).toEqual({
|
|
1791
|
-
customWittyPhrases: ['test phrase'],
|
|
1792
|
-
});
|
|
1793
|
-
});
|
|
1794
|
-
});
|
|
1795
1414
|
describe('loadEnvironment', () => {
|
|
1796
1415
|
function setup({ isFolderTrustEnabled = true, isWorkspaceTrustedValue = true, }) {
|
|
1797
1416
|
delete process.env['TESTTEST']; // reset
|
|
@@ -1833,156 +1452,6 @@ describe('Settings Loading and Merging', () => {
|
|
|
1833
1452
|
expect(process.env['TESTTEST']).not.toEqual('1234');
|
|
1834
1453
|
});
|
|
1835
1454
|
});
|
|
1836
|
-
describe('needsMigration', () => {
|
|
1837
|
-
it('should return false for an empty object', () => {
|
|
1838
|
-
expect(needsMigration({})).toBe(false);
|
|
1839
|
-
});
|
|
1840
|
-
it('should return false for settings that are already in V2 format', () => {
|
|
1841
|
-
const v2Settings = {
|
|
1842
|
-
ui: {
|
|
1843
|
-
theme: 'dark',
|
|
1844
|
-
},
|
|
1845
|
-
tools: {
|
|
1846
|
-
sandbox: true,
|
|
1847
|
-
},
|
|
1848
|
-
};
|
|
1849
|
-
expect(needsMigration(v2Settings)).toBe(false);
|
|
1850
|
-
});
|
|
1851
|
-
it('should return true for settings with a V1 key that needs to be moved', () => {
|
|
1852
|
-
const v1Settings = {
|
|
1853
|
-
theme: 'dark', // v1 key
|
|
1854
|
-
};
|
|
1855
|
-
expect(needsMigration(v1Settings)).toBe(true);
|
|
1856
|
-
});
|
|
1857
|
-
it('should return true for settings with a mix of V1 and V2 keys', () => {
|
|
1858
|
-
const mixedSettings = {
|
|
1859
|
-
theme: 'dark', // v1 key
|
|
1860
|
-
tools: {
|
|
1861
|
-
sandbox: true, // v2 key
|
|
1862
|
-
},
|
|
1863
|
-
};
|
|
1864
|
-
expect(needsMigration(mixedSettings)).toBe(true);
|
|
1865
|
-
});
|
|
1866
|
-
it('should return false for settings with only V1 keys that are the same in V2', () => {
|
|
1867
|
-
const v1Settings = {
|
|
1868
|
-
mcpServers: {},
|
|
1869
|
-
telemetry: {},
|
|
1870
|
-
extensions: [],
|
|
1871
|
-
};
|
|
1872
|
-
expect(needsMigration(v1Settings)).toBe(false);
|
|
1873
|
-
});
|
|
1874
|
-
it('should return true for settings with a mix of V1 keys that are the same in V2 and V1 keys that need moving', () => {
|
|
1875
|
-
const v1Settings = {
|
|
1876
|
-
mcpServers: {}, // same in v2
|
|
1877
|
-
theme: 'dark', // needs moving
|
|
1878
|
-
};
|
|
1879
|
-
expect(needsMigration(v1Settings)).toBe(true);
|
|
1880
|
-
});
|
|
1881
|
-
it('should return false for settings with unrecognized keys', () => {
|
|
1882
|
-
const settings = {
|
|
1883
|
-
someUnrecognizedKey: 'value',
|
|
1884
|
-
};
|
|
1885
|
-
expect(needsMigration(settings)).toBe(false);
|
|
1886
|
-
});
|
|
1887
|
-
it('should return false for settings with v2 keys and unrecognized keys', () => {
|
|
1888
|
-
const settings = {
|
|
1889
|
-
ui: { theme: 'dark' },
|
|
1890
|
-
someUnrecognizedKey: 'value',
|
|
1891
|
-
};
|
|
1892
|
-
expect(needsMigration(settings)).toBe(false);
|
|
1893
|
-
});
|
|
1894
|
-
});
|
|
1895
|
-
describe('migrateDeprecatedSettings', () => {
|
|
1896
|
-
let mockFsExistsSync;
|
|
1897
|
-
let mockFsReadFileSync;
|
|
1898
|
-
beforeEach(() => {
|
|
1899
|
-
vi.resetAllMocks();
|
|
1900
|
-
mockFsExistsSync = vi.mocked(fs.existsSync);
|
|
1901
|
-
mockFsExistsSync.mockReturnValue(true);
|
|
1902
|
-
mockFsReadFileSync = vi.mocked(fs.readFileSync);
|
|
1903
|
-
mockFsReadFileSync.mockReturnValue('{}');
|
|
1904
|
-
vi.mocked(isWorkspaceTrusted).mockReturnValue({
|
|
1905
|
-
isTrusted: true,
|
|
1906
|
-
source: undefined,
|
|
1907
|
-
});
|
|
1908
|
-
});
|
|
1909
|
-
afterEach(() => {
|
|
1910
|
-
vi.restoreAllMocks();
|
|
1911
|
-
});
|
|
1912
|
-
it('should migrate disabled extensions from user and workspace settings', () => {
|
|
1913
|
-
const userSettingsContent = {
|
|
1914
|
-
extensions: {
|
|
1915
|
-
disabled: ['user-ext-1', 'shared-ext'],
|
|
1916
|
-
},
|
|
1917
|
-
};
|
|
1918
|
-
const workspaceSettingsContent = {
|
|
1919
|
-
extensions: {
|
|
1920
|
-
disabled: ['workspace-ext-1', 'shared-ext'],
|
|
1921
|
-
},
|
|
1922
|
-
};
|
|
1923
|
-
mockFsReadFileSync.mockImplementation((p) => {
|
|
1924
|
-
if (p === USER_SETTINGS_PATH)
|
|
1925
|
-
return JSON.stringify(userSettingsContent);
|
|
1926
|
-
if (p === MOCK_WORKSPACE_SETTINGS_PATH)
|
|
1927
|
-
return JSON.stringify(workspaceSettingsContent);
|
|
1928
|
-
return '{}';
|
|
1929
|
-
});
|
|
1930
|
-
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1931
|
-
const setValueSpy = vi.spyOn(loadedSettings, 'setValue');
|
|
1932
|
-
const extensionManager = new ExtensionManager({
|
|
1933
|
-
settings: loadedSettings.merged,
|
|
1934
|
-
workspaceDir: MOCK_WORKSPACE_DIR,
|
|
1935
|
-
requestConsent: vi.fn(),
|
|
1936
|
-
requestSetting: vi.fn(),
|
|
1937
|
-
});
|
|
1938
|
-
const mockDisableExtension = vi.spyOn(extensionManager, 'disableExtension');
|
|
1939
|
-
mockDisableExtension.mockImplementation(async () => { });
|
|
1940
|
-
migrateDeprecatedSettings(loadedSettings, extensionManager);
|
|
1941
|
-
// Check user settings migration
|
|
1942
|
-
expect(mockDisableExtension).toHaveBeenCalledWith('user-ext-1', SettingScope.User);
|
|
1943
|
-
expect(mockDisableExtension).toHaveBeenCalledWith('shared-ext', SettingScope.User);
|
|
1944
|
-
// Check workspace settings migration
|
|
1945
|
-
expect(mockDisableExtension).toHaveBeenCalledWith('workspace-ext-1', SettingScope.Workspace);
|
|
1946
|
-
expect(mockDisableExtension).toHaveBeenCalledWith('shared-ext', SettingScope.Workspace);
|
|
1947
|
-
// Check that setValue was called to remove the deprecated setting
|
|
1948
|
-
expect(setValueSpy).toHaveBeenCalledWith(SettingScope.User, 'extensions', {
|
|
1949
|
-
disabled: undefined,
|
|
1950
|
-
});
|
|
1951
|
-
expect(setValueSpy).toHaveBeenCalledWith(SettingScope.Workspace, 'extensions', {
|
|
1952
|
-
disabled: undefined,
|
|
1953
|
-
});
|
|
1954
|
-
});
|
|
1955
|
-
it('should not do anything if there are no deprecated settings', () => {
|
|
1956
|
-
const userSettingsContent = {
|
|
1957
|
-
extensions: {
|
|
1958
|
-
enabled: ['user-ext-1'],
|
|
1959
|
-
},
|
|
1960
|
-
};
|
|
1961
|
-
const workspaceSettingsContent = {
|
|
1962
|
-
someOtherSetting: 'value',
|
|
1963
|
-
};
|
|
1964
|
-
mockFsReadFileSync.mockImplementation((p) => {
|
|
1965
|
-
if (p === USER_SETTINGS_PATH)
|
|
1966
|
-
return JSON.stringify(userSettingsContent);
|
|
1967
|
-
if (p === MOCK_WORKSPACE_SETTINGS_PATH)
|
|
1968
|
-
return JSON.stringify(workspaceSettingsContent);
|
|
1969
|
-
return '{}';
|
|
1970
|
-
});
|
|
1971
|
-
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1972
|
-
const setValueSpy = vi.spyOn(loadedSettings, 'setValue');
|
|
1973
|
-
const extensionManager = new ExtensionManager({
|
|
1974
|
-
settings: loadedSettings.merged,
|
|
1975
|
-
workspaceDir: MOCK_WORKSPACE_DIR,
|
|
1976
|
-
requestConsent: vi.fn(),
|
|
1977
|
-
requestSetting: vi.fn(),
|
|
1978
|
-
});
|
|
1979
|
-
const mockDisableExtension = vi.spyOn(extensionManager, 'disableExtension');
|
|
1980
|
-
mockDisableExtension.mockImplementation(async () => { });
|
|
1981
|
-
migrateDeprecatedSettings(loadedSettings, extensionManager);
|
|
1982
|
-
expect(mockDisableExtension).not.toHaveBeenCalled();
|
|
1983
|
-
expect(setValueSpy).not.toHaveBeenCalled();
|
|
1984
|
-
});
|
|
1985
|
-
});
|
|
1986
1455
|
describe('saveSettings', () => {
|
|
1987
1456
|
it('should save settings using updateSettingsFilePreservingFormat', () => {
|
|
1988
1457
|
const mockUpdateSettings = vi.mocked(updateSettingsFilePreservingFormat);
|
|
@@ -2026,5 +1495,187 @@ describe('Settings Loading and Merging', () => {
|
|
|
2026
1495
|
expect(mockCoreEvents.emitFeedback).toHaveBeenCalledWith('error', 'There was an error saving your latest settings changes.', error);
|
|
2027
1496
|
});
|
|
2028
1497
|
});
|
|
1498
|
+
describe('LoadedSettings and remote admin settings', () => {
|
|
1499
|
+
it('should prioritize remote admin settings over file-based admin settings', () => {
|
|
1500
|
+
mockFsExistsSync.mockReturnValue(true);
|
|
1501
|
+
const systemSettingsContent = {
|
|
1502
|
+
admin: {
|
|
1503
|
+
// These should be ignored
|
|
1504
|
+
secureModeEnabled: true,
|
|
1505
|
+
mcp: { enabled: false },
|
|
1506
|
+
extensions: { enabled: false },
|
|
1507
|
+
},
|
|
1508
|
+
// A non-admin setting to ensure it's still processed
|
|
1509
|
+
ui: { theme: 'system-theme' },
|
|
1510
|
+
};
|
|
1511
|
+
fs.readFileSync.mockImplementation((p) => {
|
|
1512
|
+
if (p === getSystemSettingsPath()) {
|
|
1513
|
+
return JSON.stringify(systemSettingsContent);
|
|
1514
|
+
}
|
|
1515
|
+
return '{}';
|
|
1516
|
+
});
|
|
1517
|
+
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1518
|
+
// 1. Verify that on initial load, file-based admin settings are ignored
|
|
1519
|
+
// and schema defaults are used instead.
|
|
1520
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false); // default: false
|
|
1521
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // default: true
|
|
1522
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // default: true
|
|
1523
|
+
expect(loadedSettings.merged.ui?.theme).toBe('system-theme'); // non-admin setting should be loaded
|
|
1524
|
+
// 2. Now, set remote admin settings.
|
|
1525
|
+
loadedSettings.setRemoteAdminSettings({
|
|
1526
|
+
secureModeEnabled: true,
|
|
1527
|
+
mcpSetting: { mcpEnabled: false },
|
|
1528
|
+
cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
|
|
1529
|
+
});
|
|
1530
|
+
// 3. Verify that remote admin settings take precedence.
|
|
1531
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
|
|
1532
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
|
|
1533
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
|
|
1534
|
+
// non-admin setting should remain unchanged
|
|
1535
|
+
expect(loadedSettings.merged.ui?.theme).toBe('system-theme');
|
|
1536
|
+
});
|
|
1537
|
+
it('should set remote admin settings and recompute merged settings', () => {
|
|
1538
|
+
mockFsExistsSync.mockReturnValue(true);
|
|
1539
|
+
const systemSettingsContent = {
|
|
1540
|
+
admin: {
|
|
1541
|
+
secureModeEnabled: false,
|
|
1542
|
+
mcp: { enabled: false },
|
|
1543
|
+
extensions: { enabled: false },
|
|
1544
|
+
},
|
|
1545
|
+
ui: { theme: 'initial-theme' },
|
|
1546
|
+
};
|
|
1547
|
+
fs.readFileSync.mockImplementation((p) => {
|
|
1548
|
+
if (p === getSystemSettingsPath()) {
|
|
1549
|
+
return JSON.stringify(systemSettingsContent);
|
|
1550
|
+
}
|
|
1551
|
+
return '{}';
|
|
1552
|
+
});
|
|
1553
|
+
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1554
|
+
// Ensure initial state from defaults (as file-based admin settings are ignored)
|
|
1555
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1556
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1557
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1558
|
+
expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
|
|
1559
|
+
const newRemoteSettings = {
|
|
1560
|
+
secureModeEnabled: true,
|
|
1561
|
+
mcpSetting: { mcpEnabled: false },
|
|
1562
|
+
cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
|
|
1563
|
+
};
|
|
1564
|
+
loadedSettings.setRemoteAdminSettings(newRemoteSettings);
|
|
1565
|
+
// Verify that remote admin settings are applied
|
|
1566
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
|
|
1567
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
|
|
1568
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
|
|
1569
|
+
// Non-admin settings should remain untouched
|
|
1570
|
+
expect(loadedSettings.merged.ui?.theme).toBe('initial-theme');
|
|
1571
|
+
// Verify that calling setRemoteAdminSettings with partial data overwrites previous remote settings
|
|
1572
|
+
// and missing properties revert to schema defaults.
|
|
1573
|
+
loadedSettings.setRemoteAdminSettings({ secureModeEnabled: false });
|
|
1574
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1575
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true); // Reverts to default: true
|
|
1576
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true); // Reverts to default: true
|
|
1577
|
+
});
|
|
1578
|
+
it('should correctly handle undefined remote admin settings', () => {
|
|
1579
|
+
mockFsExistsSync.mockReturnValue(true);
|
|
1580
|
+
const systemSettingsContent = {
|
|
1581
|
+
ui: { theme: 'initial-theme' },
|
|
1582
|
+
};
|
|
1583
|
+
fs.readFileSync.mockImplementation((p) => {
|
|
1584
|
+
if (p === getSystemSettingsPath()) {
|
|
1585
|
+
return JSON.stringify(systemSettingsContent);
|
|
1586
|
+
}
|
|
1587
|
+
return '{}';
|
|
1588
|
+
});
|
|
1589
|
+
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1590
|
+
// Should have default admin settings
|
|
1591
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1592
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1593
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1594
|
+
loadedSettings.setRemoteAdminSettings({}); // Set empty remote settings
|
|
1595
|
+
// Admin settings should revert to defaults because there are no remote overrides
|
|
1596
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1597
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1598
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1599
|
+
});
|
|
1600
|
+
it('should correctly handle missing properties in remote admin settings', () => {
|
|
1601
|
+
mockFsExistsSync.mockReturnValue(true);
|
|
1602
|
+
const systemSettingsContent = {
|
|
1603
|
+
admin: {
|
|
1604
|
+
secureModeEnabled: true,
|
|
1605
|
+
},
|
|
1606
|
+
};
|
|
1607
|
+
fs.readFileSync.mockImplementation((p) => {
|
|
1608
|
+
if (p === getSystemSettingsPath()) {
|
|
1609
|
+
return JSON.stringify(systemSettingsContent);
|
|
1610
|
+
}
|
|
1611
|
+
return '{}';
|
|
1612
|
+
});
|
|
1613
|
+
const loadedSettings = loadSettings(MOCK_WORKSPACE_DIR);
|
|
1614
|
+
// Ensure initial state from defaults (as file-based admin settings are ignored)
|
|
1615
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1616
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1617
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1618
|
+
// Set remote settings with only secureModeEnabled
|
|
1619
|
+
loadedSettings.setRemoteAdminSettings({
|
|
1620
|
+
secureModeEnabled: true,
|
|
1621
|
+
});
|
|
1622
|
+
// Verify secureModeEnabled is updated, others remain defaults
|
|
1623
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(true);
|
|
1624
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1625
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1626
|
+
// Set remote settings with only mcpSetting.mcpEnabled
|
|
1627
|
+
loadedSettings.setRemoteAdminSettings({
|
|
1628
|
+
mcpSetting: { mcpEnabled: false },
|
|
1629
|
+
});
|
|
1630
|
+
// Verify mcpEnabled is updated, others remain defaults (secureModeEnabled reverts to default:false)
|
|
1631
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1632
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(false);
|
|
1633
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(true);
|
|
1634
|
+
// Set remote settings with only cliFeatureSetting.extensionsSetting.extensionsEnabled
|
|
1635
|
+
loadedSettings.setRemoteAdminSettings({
|
|
1636
|
+
cliFeatureSetting: { extensionsSetting: { extensionsEnabled: false } },
|
|
1637
|
+
});
|
|
1638
|
+
// Verify extensionsEnabled is updated, others remain defaults
|
|
1639
|
+
expect(loadedSettings.merged.admin?.secureModeEnabled).toBe(false);
|
|
1640
|
+
expect(loadedSettings.merged.admin?.mcp?.enabled).toBe(true);
|
|
1641
|
+
expect(loadedSettings.merged.admin?.extensions?.enabled).toBe(false);
|
|
1642
|
+
});
|
|
1643
|
+
});
|
|
1644
|
+
describe('getDefaultsFromSchema', () => {
|
|
1645
|
+
it('should extract defaults from a schema', () => {
|
|
1646
|
+
const mockSchema = {
|
|
1647
|
+
prop1: {
|
|
1648
|
+
type: 'string',
|
|
1649
|
+
default: 'default1',
|
|
1650
|
+
label: 'Prop 1',
|
|
1651
|
+
category: 'General',
|
|
1652
|
+
requiresRestart: false,
|
|
1653
|
+
},
|
|
1654
|
+
nested: {
|
|
1655
|
+
type: 'object',
|
|
1656
|
+
label: 'Nested',
|
|
1657
|
+
category: 'General',
|
|
1658
|
+
requiresRestart: false,
|
|
1659
|
+
default: {},
|
|
1660
|
+
properties: {
|
|
1661
|
+
prop2: {
|
|
1662
|
+
type: 'number',
|
|
1663
|
+
default: 42,
|
|
1664
|
+
label: 'Prop 2',
|
|
1665
|
+
category: 'General',
|
|
1666
|
+
requiresRestart: false,
|
|
1667
|
+
},
|
|
1668
|
+
},
|
|
1669
|
+
},
|
|
1670
|
+
};
|
|
1671
|
+
const defaults = getDefaultsFromSchema(mockSchema);
|
|
1672
|
+
expect(defaults).toEqual({
|
|
1673
|
+
prop1: 'default1',
|
|
1674
|
+
nested: {
|
|
1675
|
+
prop2: 42,
|
|
1676
|
+
},
|
|
1677
|
+
});
|
|
1678
|
+
});
|
|
1679
|
+
});
|
|
2029
1680
|
});
|
|
2030
1681
|
//# sourceMappingURL=settings.test.js.map
|