@rdmind/rdmind 0.0.15-alpha.0 → 0.0.15-alpha.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/dist/package.json +15 -10
- package/dist/src/commands/extensions/disable.d.ts +2 -3
- package/dist/src/commands/extensions/disable.js +20 -6
- package/dist/src/commands/extensions/disable.js.map +1 -1
- package/dist/src/commands/extensions/enable.d.ts +2 -3
- package/dist/src/commands/extensions/enable.js +21 -10
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/examples/context/QWEN.md +8 -0
- package/dist/src/commands/extensions/examples/context/qwen-extension.json +4 -0
- package/dist/src/commands/extensions/examples/custom-commands/commands/fs/grep-code.toml +6 -0
- package/dist/src/commands/extensions/examples/custom-commands/qwen-extension.json +4 -0
- package/dist/src/commands/extensions/examples/exclude-tools/qwen-extension.json +5 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
- package/dist/src/commands/extensions/examples/mcp-server/package.json +18 -0
- package/dist/src/commands/extensions/examples/mcp-server/qwen-extension.json +11 -0
- package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +13 -0
- package/dist/src/commands/extensions/install.d.ts +3 -2
- package/dist/src/commands/extensions/install.js +47 -17
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +86 -9
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.d.ts +12 -0
- package/dist/src/commands/extensions/link.js +37 -0
- package/dist/src/commands/extensions/link.js.map +1 -0
- package/dist/src/commands/extensions/list.js +1 -1
- package/dist/src/commands/extensions/list.js.map +1 -1
- package/dist/src/commands/extensions/new.d.ts +7 -0
- package/dist/src/commands/extensions/new.js +90 -0
- package/dist/src/commands/extensions/new.js.map +1 -0
- package/dist/src/commands/extensions/new.test.js +59 -0
- package/dist/src/commands/extensions/new.test.js.map +1 -0
- package/dist/src/commands/extensions/uninstall.js +1 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.test.js +2 -2
- package/dist/src/commands/extensions/uninstall.test.js.map +1 -1
- package/dist/src/commands/extensions/update.d.ts +2 -1
- package/dist/src/commands/extensions/update.js +80 -14
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/extensions.js +4 -0
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/commands/mcp/add.js +6 -1
- package/dist/src/commands/mcp/add.js.map +1 -1
- package/dist/src/commands/mcp/list.js +4 -3
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/commands/mcp/remove.js +1 -1
- package/dist/src/commands/mcp/remove.js.map +1 -1
- package/dist/src/config/auth.d.ts +1 -1
- package/dist/src/config/auth.js +4 -4
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/auth.test.js +15 -7
- package/dist/src/config/auth.test.js.map +1 -1
- package/dist/src/config/config.d.ts +7 -2
- package/dist/src/config/config.js +178 -122
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +39 -16
- package/dist/src/config/extension.js +349 -192
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.d.ts +47 -0
- package/dist/src/config/extensions/extensionEnablement.js +189 -0
- package/dist/src/config/extensions/extensionEnablement.js.map +1 -0
- package/dist/src/{ui/components/ModelSelectionDialog.test.d.ts → config/extensions/extensionEnablement.test.d.ts} +1 -1
- package/dist/src/config/extensions/extensionEnablement.test.js +333 -0
- package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -0
- package/dist/src/config/extensions/github.d.ts +30 -0
- package/dist/src/config/extensions/github.js +322 -0
- package/dist/src/config/extensions/github.js.map +1 -0
- package/dist/src/config/extensions/github.test.d.ts +6 -0
- package/dist/src/config/extensions/github.test.js +334 -0
- package/dist/src/config/extensions/github.test.js.map +1 -0
- package/dist/src/config/extensions/update.d.ts +19 -0
- package/dist/src/config/extensions/update.js +113 -0
- package/dist/src/config/extensions/update.js.map +1 -0
- package/dist/src/config/extensions/update.test.d.ts +6 -0
- package/dist/src/config/extensions/update.test.js +342 -0
- package/dist/src/config/extensions/update.test.js.map +1 -0
- package/dist/src/config/extensions/variableSchema.d.ts +8 -0
- package/dist/src/config/extensions/variableSchema.js +4 -0
- package/dist/src/config/extensions/variableSchema.js.map +1 -1
- package/dist/src/config/keyBindings.d.ts +5 -1
- package/dist/src/config/keyBindings.js +14 -25
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/settings.d.ts +8 -5
- package/dist/src/config/settings.js +178 -275
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +332 -141
- package/dist/src/config/settingsSchema.js +321 -153
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +64 -57
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +23 -4
- package/dist/src/config/trustedFolders.js +97 -47
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/config/trustedFolders.test.js +196 -20
- package/dist/src/config/trustedFolders.test.js.map +1 -1
- package/dist/src/core/auth.d.ts +13 -0
- package/dist/src/core/auth.js +27 -0
- package/dist/src/core/auth.js.map +1 -0
- package/dist/src/core/initializer.d.ts +21 -0
- package/dist/src/core/initializer.js +33 -0
- package/dist/src/core/initializer.js.map +1 -0
- package/dist/src/core/theme.d.ts +12 -0
- package/dist/src/core/theme.js +20 -0
- package/dist/src/core/theme.js.map +1 -0
- package/dist/src/gemini.d.ts +3 -2
- package/dist/src/gemini.js +156 -128
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +190 -47
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/nonInteractiveCli.d.ts +2 -1
- package/dist/src/nonInteractiveCli.js +101 -72
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCliCommands.d.ts +17 -0
- package/dist/src/nonInteractiveCliCommands.js +79 -0
- package/dist/src/nonInteractiveCliCommands.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.js +1 -1
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +30 -18
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +2 -0
- package/dist/src/services/FileCommandLoader.js +7 -0
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.js +43 -8
- package/dist/src/services/McpPromptLoader.js.map +1 -1
- package/dist/src/services/McpPromptLoader.test.js +228 -1
- package/dist/src/services/McpPromptLoader.test.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js +8 -1
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
- package/dist/src/test-utils/createExtension.d.ts +15 -0
- package/dist/src/test-utils/createExtension.js +25 -0
- package/dist/src/test-utils/createExtension.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.js +2 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +5 -1
- package/dist/src/test-utils/render.js +5 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.d.ts +1 -10
- package/dist/src/ui/App.js +26 -834
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.d.ts +17 -0
- package/dist/src/ui/AppContainer.js +1062 -0
- package/dist/src/ui/AppContainer.js.map +1 -0
- package/dist/src/ui/AppContainer.test.d.ts +6 -0
- package/dist/src/ui/AppContainer.test.js +831 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -0
- package/dist/src/ui/IdeIntegrationNudge.d.ts +2 -2
- package/dist/src/ui/IdeIntegrationNudge.js +6 -8
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/{components → auth}/AuthDialog.js +8 -4
- package/dist/src/ui/auth/AuthDialog.js.map +1 -0
- package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
- package/dist/src/ui/{components → auth}/AuthDialog.test.js +92 -10
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
- package/dist/src/ui/{components → auth}/AuthInProgress.js +2 -2
- package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
- package/dist/src/ui/{hooks/useAuthCommand.d.ts → auth/useAuth.d.ts} +9 -3
- package/dist/src/ui/{hooks/useAuthCommand.js → auth/useAuth.js} +49 -14
- package/dist/src/ui/auth/useAuth.js.map +1 -0
- package/dist/src/ui/commands/aboutCommand.js +9 -3
- package/dist/src/ui/commands/aboutCommand.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.d.ts +2 -0
- package/dist/src/ui/commands/chatCommand.js +93 -3
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/clearCommand.js +1 -1
- package/dist/src/ui/commands/clearCommand.js.map +1 -1
- package/dist/src/ui/commands/corgiCommand.js +1 -0
- package/dist/src/ui/commands/corgiCommand.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.d.ts +1 -0
- package/dist/src/ui/commands/directoryCommand.js +156 -4
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +92 -15
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/ideCommand.d.ts +1 -2
- package/dist/src/ui/commands/ideCommand.js +19 -10
- package/dist/src/ui/commands/ideCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +88 -261
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +1 -1
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.js +1 -16
- package/dist/src/ui/commands/modelCommand.js.map +1 -1
- package/dist/src/ui/commands/modelCommand.test.js +10 -11
- package/dist/src/ui/commands/modelCommand.test.js.map +1 -1
- package/dist/src/ui/commands/summaryCommand.js +1 -1
- package/dist/src/ui/commands/summaryCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +10 -24
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +7 -2
- package/dist/src/ui/commands/types.js +0 -1
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AboutBox.js +2 -2
- package/dist/src/ui/components/AboutBox.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.d.ts +13 -0
- package/dist/src/ui/components/AnsiOutput.js +12 -0
- package/dist/src/ui/components/AnsiOutput.js.map +1 -0
- package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
- package/dist/src/ui/components/AnsiOutput.test.js +97 -0
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
- package/dist/src/ui/components/AppHeader.d.ts +10 -0
- package/dist/src/ui/components/AppHeader.js +19 -0
- package/dist/src/ui/components/AppHeader.js.map +1 -0
- package/dist/src/ui/components/AutoAcceptIndicator.js +5 -5
- package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -1
- package/dist/src/ui/components/Composer.d.ts +6 -0
- package/dist/src/ui/components/Composer.js +54 -0
- package/dist/src/ui/components/Composer.js.map +1 -0
- package/dist/src/ui/components/Composer.test.d.ts +6 -0
- package/dist/src/ui/components/Composer.test.js +337 -0
- package/dist/src/ui/components/Composer.test.js.map +1 -0
- package/dist/src/ui/components/ConfigInitDisplay.d.ts +6 -0
- package/dist/src/ui/components/ConfigInitDisplay.js +38 -0
- package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -0
- package/dist/src/ui/components/ConsentPrompt.d.ts +13 -0
- package/dist/src/ui/components/ConsentPrompt.js +19 -0
- package/dist/src/ui/components/ConsentPrompt.js.map +1 -0
- package/dist/src/ui/components/ConsentPrompt.test.d.ts +6 -0
- package/dist/src/ui/components/ConsentPrompt.test.js +67 -0
- package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -0
- package/dist/src/ui/components/ConsoleSummaryDisplay.js +2 -2
- package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.js +3 -3
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/ContextUsageDisplay.d.ts +2 -1
- package/dist/src/ui/components/ContextUsageDisplay.js +5 -3
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.js +2 -2
- package/dist/src/ui/components/DebugProfiler.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +7 -7
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/DialogManager.d.ts +12 -0
- package/dist/src/ui/components/DialogManager.js +129 -0
- package/dist/src/ui/components/DialogManager.js.map +1 -0
- package/dist/src/ui/components/EditorSettingsDialog.js +16 -7
- package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ExitWarning.d.ts +7 -0
- package/dist/src/ui/components/ExitWarning.js +9 -0
- package/dist/src/ui/components/ExitWarning.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.js +22 -9
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +37 -12
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +1 -17
- package/dist/src/ui/components/Footer.js +33 -11
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +5 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.js +7 -2
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
- package/dist/src/ui/components/Header.js +2 -2
- package/dist/src/ui/components/Header.js.map +1 -1
- package/dist/src/ui/components/Help.d.ts +1 -1
- package/dist/src/ui/components/Help.js +9 -6
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/Help.test.d.ts +6 -0
- package/dist/src/ui/components/Help.test.js +57 -0
- package/dist/src/ui/components/Help.test.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +5 -4
- package/dist/src/ui/components/HistoryItemDisplay.js +13 -4
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +90 -9
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +11 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js +32 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js +57 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.d.ts +9 -0
- package/dist/src/ui/components/InputPrompt.js +192 -45
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.js +2 -2
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +4 -0
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js +37 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js +28 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
- package/dist/src/ui/components/MainContent.d.ts +6 -0
- package/dist/src/ui/components/MainContent.js +28 -0
- package/dist/src/ui/components/MainContent.js.map +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js +6 -4
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.d.ts +11 -0
- package/dist/src/ui/components/ModelDialog.js +42 -0
- package/dist/src/ui/components/ModelDialog.js.map +1 -0
- package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ModelDialog.test.js +158 -0
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
- package/dist/src/ui/components/ModelStatsDisplay.js +7 -7
- package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -1
- package/dist/src/ui/components/ModelSwitchDialog.js +3 -0
- package/dist/src/ui/components/ModelSwitchDialog.js.map +1 -1
- package/dist/src/ui/components/ModelSwitchDialog.test.js +3 -0
- package/dist/src/ui/components/ModelSwitchDialog.test.js.map +1 -1
- package/dist/src/ui/components/Notifications.d.ts +6 -0
- package/dist/src/ui/components/Notifications.js +23 -0
- package/dist/src/ui/components/Notifications.js.map +1 -0
- package/dist/src/ui/components/OpenAIKeyPrompt.js +63 -39
- package/dist/src/ui/components/OpenAIKeyPrompt.js.map +1 -1
- package/dist/src/ui/components/OpenAIKeyPrompt.test.js +8 -1
- package/dist/src/ui/components/OpenAIKeyPrompt.test.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.d.ts +13 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +48 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.d.ts +6 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +154 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -0
- package/dist/src/ui/components/PrepareLabel.d.ts +5 -5
- package/dist/src/ui/components/PrepareLabel.js +67 -11
- package/dist/src/ui/components/PrepareLabel.js.map +1 -1
- package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
- package/dist/src/ui/components/PrepareLabel.test.js +71 -0
- package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
- package/dist/src/ui/components/ProQuotaDialog.d.ts +13 -0
- package/dist/src/ui/components/ProQuotaDialog.js +23 -0
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -0
- package/dist/src/ui/components/ProQuotaDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js +58 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js +20 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js +56 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
- package/dist/src/ui/components/QuitConfirmationDialog.js +4 -0
- package/dist/src/ui/components/QuitConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
- package/dist/src/ui/components/QuittingDisplay.js +20 -0
- package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
- package/dist/src/ui/components/QwenOAuthProgress.js +5 -4
- package/dist/src/ui/components/QwenOAuthProgress.js.map +1 -1
- package/dist/src/ui/components/QwenOAuthProgress.test.js +82 -11
- package/dist/src/ui/components/QwenOAuthProgress.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
- package/dist/src/ui/components/SettingsDialog.js +97 -23
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +474 -84
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js +5 -2
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
- package/dist/src/ui/components/ShellInputPrompt.js +36 -0
- package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
- package/dist/src/ui/components/ShellModeIndicator.js +2 -2
- package/dist/src/ui/components/ShellModeIndicator.js.map +1 -1
- package/dist/src/ui/components/ShowMoreLines.js +2 -2
- package/dist/src/ui/components/ShowMoreLines.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.js +6 -6
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/SuggestionsDisplay.d.ts +7 -2
- package/dist/src/ui/components/SuggestionsDisplay.js +17 -17
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.js +14 -29
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ThemeDialog.test.js +75 -0
- package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
- package/dist/src/ui/components/Tips.js +2 -2
- package/dist/src/ui/components/Tips.js.map +1 -1
- package/dist/src/ui/components/ToolStatsDisplay.js +4 -4
- package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -1
- package/dist/src/ui/components/UpdateNotification.js +2 -2
- package/dist/src/ui/components/UpdateNotification.js.map +1 -1
- package/dist/src/ui/components/WelcomeBackDialog.js +2 -0
- package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +14 -11
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.d.ts +1 -2
- package/dist/src/ui/components/messages/CompressionMessage.js +37 -8
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
- package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.d.ts +2 -1
- package/dist/src/ui/components/messages/DiffRenderer.js +14 -22
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
- package/dist/src/ui/components/messages/ErrorMessage.js +2 -2
- package/dist/src/ui/components/messages/ErrorMessage.js.map +1 -1
- package/dist/src/ui/components/messages/GeminiMessage.js +2 -2
- package/dist/src/ui/components/messages/GeminiMessage.js.map +1 -1
- package/dist/src/ui/components/messages/InfoMessage.js +2 -2
- package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +53 -21
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +0 -8
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +3 -2
- package/dist/src/ui/components/messages/ToolGroupMessage.js +18 -10
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +17 -15
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.d.ts +3 -1
- package/dist/src/ui/components/messages/ToolMessage.js +53 -11
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +34 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +3 -4
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserShellMessage.js +2 -2
- package/dist/src/ui/components/messages/UserShellMessage.js.map +1 -1
- package/dist/src/ui/components/messages/WarningMessage.d.ts +11 -0
- package/dist/src/ui/components/messages/WarningMessage.js +10 -0
- package/dist/src/ui/components/messages/WarningMessage.js.map +1 -0
- package/dist/src/ui/components/shared/BaseSelectionList.d.ts +38 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js +72 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +376 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +35 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +79 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
- package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
- package/dist/src/ui/components/shared/EnumSelector.js +44 -0
- package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
- package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
- package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
- package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.js +2 -2
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +2 -3
- package/dist/src/ui/components/shared/RadioButtonSelect.js +10 -105
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +115 -92
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
- package/dist/src/ui/components/shared/ScopeSelector.js +14 -0
- package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
- package/dist/src/ui/components/shared/text-buffer.d.ts +25 -2
- package/dist/src/ui/components/shared/text-buffer.js +296 -187
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js +2 -3
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js.map +1 -1
- package/dist/src/ui/components/subagents/create/ColorSelector.js +3 -2
- package/dist/src/ui/components/subagents/create/ColorSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/CreationSummary.js +6 -5
- package/dist/src/ui/components/subagents/create/CreationSummary.js.map +1 -1
- package/dist/src/ui/components/subagents/create/DescriptionInput.js +2 -3
- package/dist/src/ui/components/subagents/create/DescriptionInput.js.map +1 -1
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js +1 -0
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/LocationSelector.js +1 -0
- package/dist/src/ui/components/subagents/create/LocationSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/create/TextEntryStep.js +2 -2
- package/dist/src/ui/components/subagents/create/TextEntryStep.js.map +1 -1
- package/dist/src/ui/components/subagents/create/ToolSelector.js +4 -3
- package/dist/src/ui/components/subagents/create/ToolSelector.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js +4 -4
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js +1 -0
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +1 -2
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -1
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js +1 -2
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js.map +1 -1
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js +9 -10
- package/dist/src/ui/components/subagents/runtime/AgentExecutionDisplay.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
- package/dist/src/ui/components/views/ExtensionsList.js +47 -0
- package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
- package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ExtensionsList.test.js +97 -0
- package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
- package/dist/src/ui/components/views/McpStatus.d.ts +27 -0
- package/dist/src/ui/components/views/McpStatus.js +77 -0
- package/dist/src/ui/components/views/McpStatus.js.map +1 -0
- package/dist/src/ui/components/views/McpStatus.test.d.ts +6 -0
- package/dist/src/ui/components/views/McpStatus.test.js +117 -0
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.d.ts +14 -0
- package/dist/src/ui/components/views/ToolsList.js +7 -0
- package/dist/src/ui/components/views/ToolsList.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ToolsList.test.js +45 -0
- package/dist/src/ui/components/views/ToolsList.test.js.map +1 -0
- package/dist/src/ui/constants.d.ts +1 -0
- package/dist/src/ui/constants.js +1 -0
- package/dist/src/ui/constants.js.map +1 -1
- package/dist/src/ui/contexts/AppContext.d.ts +11 -0
- package/dist/src/ui/contexts/AppContext.js +15 -0
- package/dist/src/ui/contexts/AppContext.js.map +1 -0
- package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
- package/dist/src/ui/contexts/ConfigContext.js +16 -0
- package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.d.ts +3 -0
- package/dist/src/ui/contexts/KeypressContext.js +309 -44
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +288 -2
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
- package/dist/src/ui/contexts/SessionContext.js +107 -5
- package/dist/src/ui/contexts/SessionContext.js.map +1 -1
- package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
- package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
- package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
- package/dist/src/ui/contexts/UIActionsContext.d.ts +45 -0
- package/dist/src/ui/contexts/UIActionsContext.js +21 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
- package/dist/src/ui/contexts/UIStateContext.d.ts +117 -0
- package/dist/src/ui/contexts/UIStateContext.js +17 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +12 -12
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +21 -19
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
- package/dist/src/ui/hooks/keyToAnsi.js +67 -0
- package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +2 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +65 -15
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +196 -17
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +20 -2
- package/dist/src/ui/hooks/slashCommandProcessor.js +41 -82
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js +1 -1
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +3 -2
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js +20 -18
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +43 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +21 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js +116 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +243 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
- package/dist/src/ui/hooks/useFocus.js +10 -0
- package/dist/src/ui/hooks/useFocus.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.js +6 -10
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.d.ts +14 -3
- package/dist/src/ui/hooks/useGeminiStream.js +173 -79
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.js +15 -18
- package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.js +49 -53
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.d.ts +16 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js +65 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +6 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js +183 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js +81 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +234 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +2 -2
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +2 -2
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useMemoryMonitor.d.ts +13 -0
- package/dist/src/ui/hooks/useMemoryMonitor.js +28 -0
- package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.js +57 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
- package/dist/src/ui/hooks/useMessageQueue.d.ts +2 -1
- package/dist/src/ui/hooks/useMessageQueue.js +5 -3
- package/dist/src/ui/hooks/useMessageQueue.js.map +1 -1
- package/dist/src/ui/hooks/useMessageQueue.test.js +9 -0
- package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
- package/dist/src/ui/hooks/useModelCommand.d.ts +12 -0
- package/dist/src/ui/hooks/useModelCommand.js +21 -0
- package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
- package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
- package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.d.ts +17 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js +78 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.js.map +1 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.d.ts +6 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +182 -0
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.d.ts +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +11 -8
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +21 -0
- package/dist/src/ui/hooks/useQuotaAndFallback.js +122 -0
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -0
- package/dist/src/ui/hooks/useQuotaAndFallback.test.d.ts +6 -0
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +269 -0
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -0
- package/dist/src/ui/hooks/useReactToolScheduler.d.ts +3 -2
- package/dist/src/ui/hooks/useReactToolScheduler.js +23 -17
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.js +67 -20
- package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.d.ts +34 -0
- package/dist/src/ui/hooks/useSelectionList.js +245 -0
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSelectionList.test.js +701 -0
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.js +281 -67
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +4 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +390 -65
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
- package/dist/src/ui/hooks/useStateAndRef.js +2 -2
- package/dist/src/ui/hooks/useStateAndRef.js.map +1 -1
- package/dist/src/ui/hooks/useThemeCommand.d.ts +1 -1
- package/dist/src/ui/hooks/useThemeCommand.js +3 -14
- package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +64 -291
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/useWelcomeBack.js +2 -2
- package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -1
- package/dist/src/ui/hooks/useWorkspaceMigration.js +2 -1
- package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +17 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.d.ts +9 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js +13 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js +14 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
- package/dist/src/ui/models/availableModels.d.ts +3 -0
- package/dist/src/ui/models/availableModels.js +27 -3
- package/dist/src/ui/models/availableModels.js.map +1 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +28 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
- package/dist/src/ui/state/extensions.d.ts +42 -0
- package/dist/src/ui/state/extensions.js +62 -0
- package/dist/src/ui/state/extensions.js.map +1 -0
- package/dist/src/ui/themes/ayu.js +1 -1
- package/dist/src/ui/themes/dracula.js +2 -2
- package/dist/src/ui/themes/github-dark.js +1 -1
- package/dist/src/ui/themes/theme.js +19 -19
- package/dist/src/ui/themes/theme.js.map +1 -1
- package/dist/src/ui/types.d.ts +79 -3
- package/dist/src/ui/types.js +14 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.js +3 -2
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +7 -7
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +11 -11
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +95 -87
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/TableRenderer.js +4 -4
- package/dist/src/ui/utils/TableRenderer.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.js +7 -8
- package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.d.ts +1 -0
- package/dist/src/ui/utils/displayUtils.js +7 -4
- package/dist/src/ui/utils/displayUtils.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.test.js +37 -18
- package/dist/src/ui/utils/displayUtils.test.js.map +1 -1
- package/dist/src/ui/utils/highlight.d.ts +11 -0
- package/dist/src/ui/utils/highlight.js +78 -0
- package/dist/src/ui/utils/highlight.js.map +1 -0
- package/dist/src/ui/utils/highlight.test.d.ts +6 -0
- package/dist/src/ui/utils/highlight.test.js +120 -0
- package/dist/src/ui/utils/highlight.test.js.map +1 -0
- package/dist/src/ui/utils/kittyProtocolDetector.js +39 -29
- package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -1
- package/dist/src/ui/utils/platformConstants.d.ts +24 -1
- package/dist/src/ui/utils/platformConstants.js +26 -1
- package/dist/src/ui/utils/platformConstants.js.map +1 -1
- package/dist/src/ui/utils/textUtils.d.ts +10 -0
- package/dist/src/ui/utils/textUtils.js +108 -3
- package/dist/src/ui/utils/textUtils.js.map +1 -1
- package/dist/src/ui/utils/textUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/textUtils.test.js +132 -0
- package/dist/src/ui/utils/textUtils.test.js.map +1 -0
- package/dist/src/utils/commands.d.ts +20 -0
- package/dist/src/utils/commands.js +53 -0
- package/dist/src/utils/commands.js.map +1 -0
- package/dist/src/utils/commands.test.d.ts +6 -0
- package/dist/src/utils/commands.test.js +115 -0
- package/dist/src/utils/commands.test.js.map +1 -0
- package/dist/src/utils/commentJson.d.ts +9 -0
- package/dist/src/utils/commentJson.js +48 -0
- package/dist/src/utils/commentJson.js.map +1 -0
- package/dist/src/utils/commentJson.test.d.ts +6 -0
- package/dist/src/utils/commentJson.test.js +146 -0
- package/dist/src/utils/commentJson.test.js.map +1 -0
- package/dist/src/utils/deepMerge.d.ts +9 -0
- package/dist/src/utils/deepMerge.js +58 -0
- package/dist/src/utils/deepMerge.js.map +1 -0
- package/dist/src/utils/deepMerge.test.d.ts +6 -0
- package/dist/src/utils/deepMerge.test.js +143 -0
- package/dist/src/utils/deepMerge.test.js.map +1 -0
- package/dist/src/utils/envVarResolver.d.ts +39 -0
- package/dist/src/utils/envVarResolver.js +97 -0
- package/dist/src/utils/envVarResolver.js.map +1 -0
- package/dist/src/utils/envVarResolver.test.d.ts +6 -0
- package/dist/src/utils/envVarResolver.test.js +221 -0
- package/dist/src/utils/envVarResolver.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +21 -0
- package/dist/src/utils/errors.js +93 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.d.ts +6 -0
- package/dist/src/utils/errors.test.js +303 -0
- package/dist/src/utils/errors.test.js.map +1 -0
- package/dist/src/utils/events.d.ts +2 -1
- package/dist/src/utils/events.js +1 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/math.d.ts +13 -0
- package/dist/src/utils/math.js +14 -0
- package/dist/src/utils/math.js.map +1 -0
- package/dist/src/utils/processUtils.d.ts +13 -0
- package/dist/src/utils/processUtils.js +18 -0
- package/dist/src/utils/processUtils.js.map +1 -0
- package/dist/src/utils/processUtils.test.d.ts +6 -0
- package/dist/src/utils/processUtils.test.js +20 -0
- package/dist/src/utils/processUtils.test.js.map +1 -0
- package/dist/src/utils/relaunch.d.ts +7 -0
- package/dist/src/utils/relaunch.js +57 -0
- package/dist/src/utils/relaunch.js.map +1 -0
- package/dist/src/utils/relaunch.test.d.ts +6 -0
- package/dist/src/utils/relaunch.test.js +273 -0
- package/dist/src/utils/relaunch.test.js.map +1 -0
- package/dist/src/utils/sandbox.d.ts +1 -1
- package/dist/src/utils/sandbox.js +42 -17
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/settingsUtils.d.ts +16 -6
- package/dist/src/utils/settingsUtils.js +35 -25
- package/dist/src/utils/settingsUtils.js.map +1 -1
- package/dist/src/utils/settingsUtils.test.js +455 -158
- package/dist/src/utils/settingsUtils.test.js.map +1 -1
- package/dist/src/utils/userStartupWarnings.d.ts +1 -1
- package/dist/src/utils/userStartupWarnings.js +1 -1
- package/dist/src/utils/userStartupWarnings.js.map +1 -1
- package/dist/src/utils/windowTitle.d.ts +12 -0
- package/dist/src/utils/windowTitle.js +19 -0
- package/dist/src/utils/windowTitle.js.map +1 -0
- package/dist/src/utils/windowTitle.test.d.ts +6 -0
- package/dist/src/utils/windowTitle.test.js +49 -0
- package/dist/src/utils/windowTitle.test.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.d.ts +4 -2
- package/dist/src/validateNonInterActiveAuth.js +33 -12
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/fileSystemService.d.ts +1 -0
- package/dist/src/zed-integration/fileSystemService.js +3 -0
- package/dist/src/zed-integration/fileSystemService.js.map +1 -1
- package/dist/src/zed-integration/schema.d.ts +310 -310
- package/dist/src/zed-integration/zedIntegration.d.ts +8 -1
- package/dist/src/zed-integration/zedIntegration.js +32 -15
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -10
- package/dist/src/ui/components/AuthDialog.js.map +0 -1
- package/dist/src/ui/components/AuthDialog.test.js.map +0 -1
- package/dist/src/ui/components/AuthInProgress.js.map +0 -1
- package/dist/src/ui/components/ModelSelectionDialog.d.ts +0 -14
- package/dist/src/ui/components/ModelSelectionDialog.js +0 -26
- package/dist/src/ui/components/ModelSelectionDialog.js.map +0 -1
- package/dist/src/ui/components/ModelSelectionDialog.test.js +0 -124
- package/dist/src/ui/components/ModelSelectionDialog.test.js.map +0 -1
- package/dist/src/ui/hooks/useAuthCommand.js.map +0 -1
- /package/dist/src/{ui/components/AuthDialog.test.d.ts → commands/extensions/new.test.d.ts} +0 -0
- /package/dist/src/ui/{components → auth}/AuthDialog.d.ts +0 -0
- /package/dist/src/ui/{components → auth}/AuthInProgress.d.ts +0 -0
|
@@ -3,17 +3,21 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Storage } from '@rdmind/rdmind-core';
|
|
6
|
+
import { QWEN_DIR, Storage, Config, ExtensionInstallEvent, ExtensionUninstallEvent, ExtensionDisableEvent, ExtensionEnableEvent, logExtensionEnable, logExtensionInstallEvent, logExtensionUninstall, logExtensionDisable, } from '@rdmind/rdmind-core';
|
|
7
7
|
import * as fs from 'node:fs';
|
|
8
8
|
import * as path from 'node:path';
|
|
9
9
|
import * as os from 'node:os';
|
|
10
|
-
import { simpleGit } from 'simple-git';
|
|
11
10
|
import { SettingScope, loadSettings } from '../config/settings.js';
|
|
12
11
|
import { getErrorMessage } from '../utils/errors.js';
|
|
13
12
|
import { recursivelyHydrateStrings } from './extensions/variables.js';
|
|
14
|
-
|
|
13
|
+
import { isWorkspaceTrusted } from './trustedFolders.js';
|
|
14
|
+
import { resolveEnvVarsInObject } from '../utils/envVarResolver.js';
|
|
15
|
+
import { randomUUID } from 'node:crypto';
|
|
16
|
+
import { cloneFromGit, downloadFromGitHubRelease, } from './extensions/github.js';
|
|
17
|
+
import { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
export const EXTENSIONS_DIRECTORY_NAME = path.join(QWEN_DIR, 'extensions');
|
|
15
20
|
export const EXTENSIONS_CONFIG_FILENAME = 'rdmind-extension.json';
|
|
16
|
-
export const EXTENSIONS_CONFIG_FILENAME_OLD = 'gemini-extension.json';
|
|
17
21
|
export const INSTALL_METADATA_FILENAME = '.rdmind-extension-install.json';
|
|
18
22
|
export class ExtensionStorage {
|
|
19
23
|
extensionName;
|
|
@@ -35,12 +39,16 @@ export class ExtensionStorage {
|
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
export function getWorkspaceExtensions(workspaceDir) {
|
|
42
|
+
// If the workspace dir is the user extensions dir, there are no workspace extensions.
|
|
43
|
+
if (path.resolve(workspaceDir) === path.resolve(os.homedir())) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
38
46
|
return loadExtensionsFromDir(workspaceDir);
|
|
39
47
|
}
|
|
40
|
-
async function copyExtension(source, destination) {
|
|
48
|
+
export async function copyExtension(source, destination) {
|
|
41
49
|
await fs.promises.cp(source, destination, { recursive: true });
|
|
42
50
|
}
|
|
43
|
-
export async function performWorkspaceExtensionMigration(extensions) {
|
|
51
|
+
export async function performWorkspaceExtensionMigration(extensions, requestConsent) {
|
|
44
52
|
const failedInstallNames = [];
|
|
45
53
|
for (const extension of extensions) {
|
|
46
54
|
try {
|
|
@@ -48,7 +56,7 @@ export async function performWorkspaceExtensionMigration(extensions) {
|
|
|
48
56
|
source: extension.path,
|
|
49
57
|
type: 'local',
|
|
50
58
|
};
|
|
51
|
-
await installExtension(installMetadata);
|
|
59
|
+
await installExtension(installMetadata, requestConsent);
|
|
52
60
|
}
|
|
53
61
|
catch (_) {
|
|
54
62
|
failedInstallNames.push(extension.config.name);
|
|
@@ -56,17 +64,31 @@ export async function performWorkspaceExtensionMigration(extensions) {
|
|
|
56
64
|
}
|
|
57
65
|
return failedInstallNames;
|
|
58
66
|
}
|
|
59
|
-
|
|
67
|
+
function getTelemetryConfig(cwd) {
|
|
68
|
+
const settings = loadSettings(cwd);
|
|
69
|
+
const config = new Config({
|
|
70
|
+
telemetry: settings.merged.telemetry,
|
|
71
|
+
interactive: false,
|
|
72
|
+
sessionId: randomUUID(),
|
|
73
|
+
targetDir: cwd,
|
|
74
|
+
cwd,
|
|
75
|
+
model: '',
|
|
76
|
+
debugMode: false,
|
|
77
|
+
});
|
|
78
|
+
return config;
|
|
79
|
+
}
|
|
80
|
+
export function loadExtensions(extensionEnablementManager, workspaceDir = process.cwd()) {
|
|
60
81
|
const settings = loadSettings(workspaceDir).merged;
|
|
61
|
-
const disabledExtensions = settings.extensions?.disabled ?? [];
|
|
62
82
|
const allExtensions = [...loadUserExtensions()];
|
|
63
|
-
if (
|
|
83
|
+
if ((isWorkspaceTrusted(settings) ?? true) &&
|
|
84
|
+
// Default management setting to true
|
|
85
|
+
!(settings.experimental?.extensionManagement ?? true)) {
|
|
64
86
|
allExtensions.push(...getWorkspaceExtensions(workspaceDir));
|
|
65
87
|
}
|
|
66
88
|
const uniqueExtensions = new Map();
|
|
67
89
|
for (const extension of allExtensions) {
|
|
68
90
|
if (!uniqueExtensions.has(extension.config.name) &&
|
|
69
|
-
|
|
91
|
+
extensionEnablementManager.isEnabled(extension.config.name, workspaceDir)) {
|
|
70
92
|
uniqueExtensions.set(extension.config.name, extension);
|
|
71
93
|
}
|
|
72
94
|
}
|
|
@@ -91,54 +113,74 @@ export function loadExtensionsFromDir(dir) {
|
|
|
91
113
|
const extensions = [];
|
|
92
114
|
for (const subdir of fs.readdirSync(extensionsDir)) {
|
|
93
115
|
const extensionDir = path.join(extensionsDir, subdir);
|
|
94
|
-
const extension = loadExtension(extensionDir);
|
|
116
|
+
const extension = loadExtension({ extensionDir, workspaceDir: dir });
|
|
95
117
|
if (extension != null) {
|
|
96
118
|
extensions.push(extension);
|
|
97
119
|
}
|
|
98
120
|
}
|
|
99
121
|
return extensions;
|
|
100
122
|
}
|
|
101
|
-
export function loadExtension(
|
|
123
|
+
export function loadExtension(context) {
|
|
124
|
+
const { extensionDir, workspaceDir } = context;
|
|
102
125
|
if (!fs.statSync(extensionDir).isDirectory()) {
|
|
103
|
-
console.error(`Warning: unexpected file ${extensionDir} in extensions directory.`);
|
|
104
126
|
return null;
|
|
105
127
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
console.error(`Warning: extension directory ${extensionDir} does not contain a config file ${configFilePath}.`);
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
configFilePath = oldConfigFilePath;
|
|
128
|
+
const installMetadata = loadInstallMetadata(extensionDir);
|
|
129
|
+
let effectiveExtensionPath = extensionDir;
|
|
130
|
+
if (installMetadata?.type === 'link') {
|
|
131
|
+
effectiveExtensionPath = installMetadata.source;
|
|
114
132
|
}
|
|
115
133
|
try {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
'/': path.sep,
|
|
120
|
-
pathSeparator: path.sep,
|
|
134
|
+
let config = loadExtensionConfig({
|
|
135
|
+
extensionDir: effectiveExtensionPath,
|
|
136
|
+
workspaceDir,
|
|
121
137
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
138
|
+
config = resolveEnvVarsInObject(config);
|
|
139
|
+
if (config.mcpServers) {
|
|
140
|
+
config.mcpServers = Object.fromEntries(Object.entries(config.mcpServers).map(([key, value]) => [
|
|
141
|
+
key,
|
|
142
|
+
filterMcpConfig(value),
|
|
143
|
+
]));
|
|
125
144
|
}
|
|
126
145
|
const contextFiles = getContextFileNames(config)
|
|
127
|
-
.map((contextFileName) => path.join(
|
|
146
|
+
.map((contextFileName) => path.join(effectiveExtensionPath, contextFileName))
|
|
128
147
|
.filter((contextFilePath) => fs.existsSync(contextFilePath));
|
|
129
148
|
return {
|
|
130
|
-
path:
|
|
149
|
+
path: effectiveExtensionPath,
|
|
131
150
|
config,
|
|
132
151
|
contextFiles,
|
|
133
|
-
installMetadata
|
|
152
|
+
installMetadata,
|
|
134
153
|
};
|
|
135
154
|
}
|
|
136
155
|
catch (e) {
|
|
137
|
-
console.error(`Warning:
|
|
156
|
+
console.error(`Warning: Skipping extension in ${effectiveExtensionPath}: ${getErrorMessage(e)}`);
|
|
138
157
|
return null;
|
|
139
158
|
}
|
|
140
159
|
}
|
|
141
|
-
function
|
|
160
|
+
export function loadExtensionByName(name, workspaceDir = process.cwd()) {
|
|
161
|
+
const userExtensionsDir = ExtensionStorage.getUserExtensionsDir();
|
|
162
|
+
if (!fs.existsSync(userExtensionsDir)) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
for (const subdir of fs.readdirSync(userExtensionsDir)) {
|
|
166
|
+
const extensionDir = path.join(userExtensionsDir, subdir);
|
|
167
|
+
if (!fs.statSync(extensionDir).isDirectory()) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const extension = loadExtension({ extensionDir, workspaceDir });
|
|
171
|
+
if (extension &&
|
|
172
|
+
extension.config.name.toLowerCase() === name.toLowerCase()) {
|
|
173
|
+
return extension;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
function filterMcpConfig(original) {
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
180
|
+
const { trust, ...rest } = original;
|
|
181
|
+
return Object.freeze(rest);
|
|
182
|
+
}
|
|
183
|
+
export function loadInstallMetadata(extensionDir) {
|
|
142
184
|
const metadataFilePath = path.join(extensionDir, INSTALL_METADATA_FILENAME);
|
|
143
185
|
try {
|
|
144
186
|
const configContent = fs.readFileSync(metadataFilePath, 'utf-8');
|
|
@@ -160,130 +202,287 @@ function getContextFileNames(config) {
|
|
|
160
202
|
}
|
|
161
203
|
/**
|
|
162
204
|
* Returns an annotated list of extensions. If an extension is listed in enabledExtensionNames, it will be active.
|
|
163
|
-
* If enabledExtensionNames is empty, an extension is active unless it is
|
|
205
|
+
* If enabledExtensionNames is empty, an extension is active unless it is disabled.
|
|
164
206
|
* @param extensions The base list of extensions.
|
|
165
207
|
* @param enabledExtensionNames The names of explicitly enabled extensions.
|
|
166
208
|
* @param workspaceDir The current workspace directory.
|
|
167
209
|
*/
|
|
168
|
-
export function annotateActiveExtensions(extensions,
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
210
|
+
export function annotateActiveExtensions(extensions, workspaceDir, manager) {
|
|
211
|
+
manager.validateExtensionOverrides(extensions);
|
|
212
|
+
return extensions.map((extension) => ({
|
|
213
|
+
name: extension.config.name,
|
|
214
|
+
version: extension.config.version,
|
|
215
|
+
isActive: manager.isEnabled(extension.config.name, workspaceDir),
|
|
216
|
+
path: extension.path,
|
|
217
|
+
installMetadata: extension.installMetadata,
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Requests consent from the user to perform an action, by reading a Y/n
|
|
222
|
+
* character from stdin.
|
|
223
|
+
*
|
|
224
|
+
* This should not be called from interactive mode as it will break the CLI.
|
|
225
|
+
*
|
|
226
|
+
* @param consentDescription The description of the thing they will be consenting to.
|
|
227
|
+
* @returns boolean, whether they consented or not.
|
|
228
|
+
*/
|
|
229
|
+
export async function requestConsentNonInteractive(consentDescription) {
|
|
230
|
+
console.info(consentDescription);
|
|
231
|
+
const result = await promptForConsentNonInteractive('Do you want to continue? [Y/n]: ');
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Requests consent from the user to perform an action, in interactive mode.
|
|
236
|
+
*
|
|
237
|
+
* This should not be called from non-interactive mode as it will not work.
|
|
238
|
+
*
|
|
239
|
+
* @param consentDescription The description of the thing they will be consenting to.
|
|
240
|
+
* @param setExtensionUpdateConfirmationRequest A function to actually add a prompt to the UI.
|
|
241
|
+
* @returns boolean, whether they consented or not.
|
|
242
|
+
*/
|
|
243
|
+
export async function requestConsentInteractive(consentDescription, addExtensionUpdateConfirmationRequest) {
|
|
244
|
+
return await promptForConsentInteractive(consentDescription + '\n\nDo you want to continue?', addExtensionUpdateConfirmationRequest);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Asks users a prompt and awaits for a y/n response on stdin.
|
|
248
|
+
*
|
|
249
|
+
* This should not be called from interactive mode as it will break the CLI.
|
|
250
|
+
*
|
|
251
|
+
* @param prompt A yes/no prompt to ask the user
|
|
252
|
+
* @returns Whether or not the user answers 'y' (yes). Defaults to 'yes' on enter.
|
|
253
|
+
*/
|
|
254
|
+
async function promptForConsentNonInteractive(prompt) {
|
|
255
|
+
const readline = await import('node:readline');
|
|
256
|
+
const rl = readline.createInterface({
|
|
257
|
+
input: process.stdin,
|
|
258
|
+
output: process.stdout,
|
|
259
|
+
});
|
|
260
|
+
return new Promise((resolve) => {
|
|
261
|
+
rl.question(prompt, (answer) => {
|
|
262
|
+
rl.close();
|
|
263
|
+
resolve(['y', ''].includes(answer.trim().toLowerCase()));
|
|
202
264
|
});
|
|
203
|
-
}
|
|
204
|
-
for (const requestedName of notFoundNames) {
|
|
205
|
-
console.error(`Extension not found: ${requestedName}`);
|
|
206
|
-
}
|
|
207
|
-
return annotatedExtensions;
|
|
265
|
+
});
|
|
208
266
|
}
|
|
209
267
|
/**
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
268
|
+
* Asks users an interactive yes/no prompt.
|
|
269
|
+
*
|
|
270
|
+
* This should not be called from non-interactive mode as it will break the CLI.
|
|
271
|
+
*
|
|
272
|
+
* @param prompt A markdown prompt to ask the user
|
|
273
|
+
* @param setExtensionUpdateConfirmationRequest Function to update the UI state with the confirmation request.
|
|
274
|
+
* @returns Whether or not the user answers yes.
|
|
213
275
|
*/
|
|
214
|
-
async function
|
|
276
|
+
async function promptForConsentInteractive(prompt, addExtensionUpdateConfirmationRequest) {
|
|
277
|
+
return await new Promise((resolve) => {
|
|
278
|
+
addExtensionUpdateConfirmationRequest({
|
|
279
|
+
prompt,
|
|
280
|
+
onConfirm: (resolvedConfirmed) => {
|
|
281
|
+
resolve(resolvedConfirmed);
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
export async function installExtension(installMetadata, requestConsent, cwd = process.cwd(), previousExtensionConfig) {
|
|
287
|
+
const telemetryConfig = getTelemetryConfig(cwd);
|
|
288
|
+
let newExtensionConfig = null;
|
|
289
|
+
let localSourcePath;
|
|
215
290
|
try {
|
|
216
|
-
|
|
217
|
-
|
|
291
|
+
const settings = loadSettings(cwd).merged;
|
|
292
|
+
if (!isWorkspaceTrusted(settings)) {
|
|
293
|
+
throw new Error(`Could not install extension from untrusted folder at ${installMetadata.source}`);
|
|
294
|
+
}
|
|
295
|
+
const extensionsDir = ExtensionStorage.getUserExtensionsDir();
|
|
296
|
+
await fs.promises.mkdir(extensionsDir, { recursive: true });
|
|
297
|
+
if (!path.isAbsolute(installMetadata.source) &&
|
|
298
|
+
(installMetadata.type === 'local' || installMetadata.type === 'link')) {
|
|
299
|
+
installMetadata.source = path.resolve(cwd, installMetadata.source);
|
|
300
|
+
}
|
|
301
|
+
let tempDir;
|
|
302
|
+
if (installMetadata.type === 'git' ||
|
|
303
|
+
installMetadata.type === 'github-release') {
|
|
304
|
+
tempDir = await ExtensionStorage.createTmpDir();
|
|
305
|
+
try {
|
|
306
|
+
const result = await downloadFromGitHubRelease(installMetadata, tempDir);
|
|
307
|
+
installMetadata.type = result.type;
|
|
308
|
+
installMetadata.releaseTag = result.tagName;
|
|
309
|
+
}
|
|
310
|
+
catch (_error) {
|
|
311
|
+
await cloneFromGit(installMetadata, tempDir);
|
|
312
|
+
installMetadata.type = 'git';
|
|
313
|
+
}
|
|
314
|
+
localSourcePath = tempDir;
|
|
315
|
+
}
|
|
316
|
+
else if (installMetadata.type === 'local' ||
|
|
317
|
+
installMetadata.type === 'link') {
|
|
318
|
+
localSourcePath = installMetadata.source;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
throw new Error(`Unsupported install type: ${installMetadata.type}`);
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
newExtensionConfig = loadExtensionConfig({
|
|
325
|
+
extensionDir: localSourcePath,
|
|
326
|
+
workspaceDir: cwd,
|
|
327
|
+
});
|
|
328
|
+
const newExtensionName = newExtensionConfig.name;
|
|
329
|
+
const extensionStorage = new ExtensionStorage(newExtensionName);
|
|
330
|
+
const destinationPath = extensionStorage.getExtensionDir();
|
|
331
|
+
const installedExtensions = loadUserExtensions();
|
|
332
|
+
if (installedExtensions.some((installed) => installed.config.name === newExtensionName)) {
|
|
333
|
+
throw new Error(`Extension "${newExtensionName}" is already installed. Please uninstall it first.`);
|
|
334
|
+
}
|
|
335
|
+
await maybeRequestConsentOrFail(newExtensionConfig, requestConsent, previousExtensionConfig);
|
|
336
|
+
await fs.promises.mkdir(destinationPath, { recursive: true });
|
|
337
|
+
if (installMetadata.type === 'local' ||
|
|
338
|
+
installMetadata.type === 'git' ||
|
|
339
|
+
installMetadata.type === 'github-release') {
|
|
340
|
+
await copyExtension(localSourcePath, destinationPath);
|
|
341
|
+
}
|
|
342
|
+
const metadataString = JSON.stringify(installMetadata, null, 2);
|
|
343
|
+
const metadataPath = path.join(destinationPath, INSTALL_METADATA_FILENAME);
|
|
344
|
+
await fs.promises.writeFile(metadataPath, metadataString);
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
if (tempDir) {
|
|
348
|
+
await fs.promises.rm(tempDir, { recursive: true, force: true });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
logExtensionInstallEvent(telemetryConfig, new ExtensionInstallEvent(newExtensionConfig.name, newExtensionConfig.version, installMetadata.source, 'success'));
|
|
352
|
+
enableExtension(newExtensionConfig.name, SettingScope.User);
|
|
353
|
+
return newExtensionConfig.name;
|
|
218
354
|
}
|
|
219
355
|
catch (error) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
356
|
+
// Attempt to load config from the source path even if installation fails
|
|
357
|
+
// to get the name and version for logging.
|
|
358
|
+
if (!newExtensionConfig && localSourcePath) {
|
|
359
|
+
try {
|
|
360
|
+
newExtensionConfig = loadExtensionConfig({
|
|
361
|
+
extensionDir: localSourcePath,
|
|
362
|
+
workspaceDir: cwd,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Ignore error, this is just for logging.
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
logExtensionInstallEvent(telemetryConfig, new ExtensionInstallEvent(newExtensionConfig?.name ?? '', newExtensionConfig?.version ?? '', installMetadata.source, 'error'));
|
|
370
|
+
throw error;
|
|
223
371
|
}
|
|
224
372
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
373
|
+
/**
|
|
374
|
+
* Builds a consent string for installing an extension based on it's
|
|
375
|
+
* extensionConfig.
|
|
376
|
+
*/
|
|
377
|
+
function extensionConsentString(extensionConfig) {
|
|
378
|
+
const output = [];
|
|
379
|
+
const mcpServerEntries = Object.entries(extensionConfig.mcpServers || {});
|
|
380
|
+
output.push(`Installing extension "${extensionConfig.name}".`);
|
|
381
|
+
output.push('**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**');
|
|
382
|
+
if (mcpServerEntries.length) {
|
|
383
|
+
output.push('This extension will run the following MCP servers:');
|
|
384
|
+
for (const [key, mcpServer] of mcpServerEntries) {
|
|
385
|
+
const isLocal = !!mcpServer.command;
|
|
386
|
+
const source = mcpServer.httpUrl ??
|
|
387
|
+
`${mcpServer.command || ''}${mcpServer.args ? ' ' + mcpServer.args.join(' ') : ''}`;
|
|
388
|
+
output.push(` * ${key} (${isLocal ? 'local' : 'remote'}): ${source}`);
|
|
389
|
+
}
|
|
232
390
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (installMetadata.type === 'git') {
|
|
236
|
-
tempDir = await ExtensionStorage.createTmpDir();
|
|
237
|
-
await cloneFromGit(installMetadata.source, tempDir);
|
|
238
|
-
localSourcePath = tempDir;
|
|
391
|
+
if (extensionConfig.contextFileName) {
|
|
392
|
+
output.push(`This extension will append info to your gemini.md context using ${extensionConfig.contextFileName}`);
|
|
239
393
|
}
|
|
240
|
-
|
|
241
|
-
|
|
394
|
+
if (extensionConfig.excludeTools) {
|
|
395
|
+
output.push(`This extension will exclude the following core tools: ${extensionConfig.excludeTools}`);
|
|
242
396
|
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
397
|
+
return output.join('\n');
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Requests consent from the user to install an extension (extensionConfig), if
|
|
401
|
+
* there is any difference between the consent string for `extensionConfig` and
|
|
402
|
+
* `previousExtensionConfig`.
|
|
403
|
+
*
|
|
404
|
+
* Always requests consent if previousExtensionConfig is null.
|
|
405
|
+
*
|
|
406
|
+
* Throws if the user does not consent.
|
|
407
|
+
*/
|
|
408
|
+
async function maybeRequestConsentOrFail(extensionConfig, requestConsent, previousExtensionConfig) {
|
|
409
|
+
const extensionConsent = extensionConsentString(extensionConfig);
|
|
410
|
+
if (previousExtensionConfig) {
|
|
411
|
+
const previousExtensionConsent = extensionConsentString(previousExtensionConfig);
|
|
412
|
+
if (previousExtensionConsent === extensionConsent) {
|
|
413
|
+
return;
|
|
256
414
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
415
|
+
}
|
|
416
|
+
if (!(await requestConsent(extensionConsent))) {
|
|
417
|
+
throw new Error(`Installation cancelled for "${extensionConfig.name}".`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
export function validateName(name) {
|
|
421
|
+
if (!/^[a-zA-Z0-9-]+$/.test(name)) {
|
|
422
|
+
throw new Error(`Invalid extension name: "${name}". Only letters (a-z, A-Z), numbers (0-9), and dashes (-) are allowed.`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
export function loadExtensionConfig(context) {
|
|
426
|
+
const { extensionDir, workspaceDir } = context;
|
|
427
|
+
const configFilePath = path.join(extensionDir, EXTENSIONS_CONFIG_FILENAME);
|
|
428
|
+
if (!fs.existsSync(configFilePath)) {
|
|
429
|
+
throw new Error(`Configuration file not found at ${configFilePath}`);
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
const configContent = fs.readFileSync(configFilePath, 'utf-8');
|
|
433
|
+
const config = recursivelyHydrateStrings(JSON.parse(configContent), {
|
|
434
|
+
extensionPath: extensionDir,
|
|
435
|
+
workspacePath: workspaceDir,
|
|
436
|
+
'/': path.sep,
|
|
437
|
+
pathSeparator: path.sep,
|
|
438
|
+
});
|
|
439
|
+
if (!config.name || !config.version) {
|
|
440
|
+
throw new Error(`Invalid configuration in ${configFilePath}: missing ${!config.name ? '"name"' : '"version"'}`);
|
|
265
441
|
}
|
|
442
|
+
validateName(config.name);
|
|
443
|
+
return config;
|
|
444
|
+
}
|
|
445
|
+
catch (e) {
|
|
446
|
+
throw new Error(`Failed to load extension config from ${configFilePath}: ${getErrorMessage(e)}`);
|
|
266
447
|
}
|
|
267
|
-
return newExtensionName;
|
|
268
448
|
}
|
|
269
|
-
export async function uninstallExtension(
|
|
449
|
+
export async function uninstallExtension(extensionIdentifier, cwd = process.cwd()) {
|
|
450
|
+
const telemetryConfig = getTelemetryConfig(cwd);
|
|
270
451
|
const installedExtensions = loadUserExtensions();
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
452
|
+
const extensionName = installedExtensions.find((installed) => installed.config.name.toLowerCase() ===
|
|
453
|
+
extensionIdentifier.toLowerCase() ||
|
|
454
|
+
installed.installMetadata?.source.toLowerCase() ===
|
|
455
|
+
extensionIdentifier.toLowerCase())?.config.name;
|
|
456
|
+
if (!extensionName) {
|
|
457
|
+
throw new Error(`Extension not found.`);
|
|
458
|
+
}
|
|
459
|
+
const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(), [extensionName]);
|
|
460
|
+
manager.remove(extensionName);
|
|
275
461
|
const storage = new ExtensionStorage(extensionName);
|
|
276
|
-
|
|
462
|
+
await fs.promises.rm(storage.getExtensionDir(), {
|
|
277
463
|
recursive: true,
|
|
278
464
|
force: true,
|
|
279
465
|
});
|
|
466
|
+
logExtensionUninstall(telemetryConfig, new ExtensionUninstallEvent(extensionName, 'success'));
|
|
280
467
|
}
|
|
281
|
-
export function toOutputString(extension) {
|
|
282
|
-
|
|
468
|
+
export function toOutputString(extension, workspaceDir) {
|
|
469
|
+
const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir());
|
|
470
|
+
const userEnabled = manager.isEnabled(extension.config.name, os.homedir());
|
|
471
|
+
const workspaceEnabled = manager.isEnabled(extension.config.name, workspaceDir);
|
|
472
|
+
const status = workspaceEnabled ? chalk.green('✓') : chalk.red('✗');
|
|
473
|
+
let output = `${status} ${extension.config.name} (${extension.config.version})`;
|
|
283
474
|
output += `\n Path: ${extension.path}`;
|
|
284
475
|
if (extension.installMetadata) {
|
|
285
|
-
output += `\n Source: ${extension.installMetadata.source}`;
|
|
476
|
+
output += `\n Source: ${extension.installMetadata.source} (Type: ${extension.installMetadata.type})`;
|
|
477
|
+
if (extension.installMetadata.ref) {
|
|
478
|
+
output += `\n Ref: ${extension.installMetadata.ref}`;
|
|
479
|
+
}
|
|
480
|
+
if (extension.installMetadata.releaseTag) {
|
|
481
|
+
output += `\n Release tag: ${extension.installMetadata.releaseTag}`;
|
|
482
|
+
}
|
|
286
483
|
}
|
|
484
|
+
output += `\n Enabled (User): ${userEnabled}`;
|
|
485
|
+
output += `\n Enabled (Workspace): ${workspaceEnabled}`;
|
|
287
486
|
if (extension.contextFiles.length > 0) {
|
|
288
487
|
output += `\n Context files:`;
|
|
289
488
|
extension.contextFiles.forEach((contextFile) => {
|
|
@@ -304,74 +503,32 @@ export function toOutputString(extension) {
|
|
|
304
503
|
}
|
|
305
504
|
return output;
|
|
306
505
|
}
|
|
307
|
-
export async function updateExtension(extensionName, cwd = process.cwd()) {
|
|
308
|
-
const installedExtensions = loadUserExtensions();
|
|
309
|
-
const extension = installedExtensions.find((installed) => installed.config.name === extensionName);
|
|
310
|
-
if (!extension) {
|
|
311
|
-
throw new Error(`Extension "${extensionName}" not found. Run gemini extensions list to see available extensions.`);
|
|
312
|
-
}
|
|
313
|
-
if (!extension.installMetadata) {
|
|
314
|
-
throw new Error(`Extension cannot be updated because it is missing the .rdmind-extension.install.json file. To update manually, uninstall and then reinstall the updated version.`);
|
|
315
|
-
}
|
|
316
|
-
const originalVersion = extension.config.version;
|
|
317
|
-
const tempDir = await ExtensionStorage.createTmpDir();
|
|
318
|
-
try {
|
|
319
|
-
await copyExtension(extension.path, tempDir);
|
|
320
|
-
await uninstallExtension(extensionName, cwd);
|
|
321
|
-
await installExtension(extension.installMetadata, cwd);
|
|
322
|
-
const updatedExtension = loadExtension(extension.path);
|
|
323
|
-
if (!updatedExtension) {
|
|
324
|
-
throw new Error('Updated extension not found after installation.');
|
|
325
|
-
}
|
|
326
|
-
const updatedVersion = updatedExtension.config.version;
|
|
327
|
-
return {
|
|
328
|
-
originalVersion,
|
|
329
|
-
updatedVersion,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
catch (e) {
|
|
333
|
-
console.error(`Error updating extension, rolling back. ${getErrorMessage(e)}`);
|
|
334
|
-
await copyExtension(tempDir, extension.path);
|
|
335
|
-
throw e;
|
|
336
|
-
}
|
|
337
|
-
finally {
|
|
338
|
-
await fs.promises.rm(tempDir, { recursive: true, force: true });
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
506
|
export function disableExtension(name, scope, cwd = process.cwd()) {
|
|
507
|
+
const config = getTelemetryConfig(cwd);
|
|
342
508
|
if (scope === SettingScope.System || scope === SettingScope.SystemDefaults) {
|
|
343
509
|
throw new Error('System and SystemDefaults scopes are not supported.');
|
|
344
510
|
}
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
disabled: [],
|
|
349
|
-
};
|
|
350
|
-
const disabledExtensions = extensionSettings.disabled || [];
|
|
351
|
-
if (!disabledExtensions.includes(name)) {
|
|
352
|
-
disabledExtensions.push(name);
|
|
353
|
-
extensionSettings.disabled = disabledExtensions;
|
|
354
|
-
settings.setValue(scope, 'extensions', extensionSettings);
|
|
511
|
+
const extension = loadExtensionByName(name, cwd);
|
|
512
|
+
if (!extension) {
|
|
513
|
+
throw new Error(`Extension with name ${name} does not exist.`);
|
|
355
514
|
}
|
|
515
|
+
const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(), [name]);
|
|
516
|
+
const scopePath = scope === SettingScope.Workspace ? cwd : os.homedir();
|
|
517
|
+
manager.disable(name, true, scopePath);
|
|
518
|
+
logExtensionDisable(config, new ExtensionDisableEvent(name, scope));
|
|
356
519
|
}
|
|
357
|
-
export function enableExtension(name,
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
*/
|
|
365
|
-
function removeFromDisabledExtensions(name, scopes, cwd = process.cwd()) {
|
|
366
|
-
const settings = loadSettings(cwd);
|
|
367
|
-
for (const scope of scopes) {
|
|
368
|
-
const settingsFile = settings.forScope(scope);
|
|
369
|
-
const extensionSettings = settingsFile.settings.extensions || {
|
|
370
|
-
disabled: [],
|
|
371
|
-
};
|
|
372
|
-
const disabledExtensions = extensionSettings.disabled || [];
|
|
373
|
-
extensionSettings.disabled = disabledExtensions.filter((extension) => extension !== name);
|
|
374
|
-
settings.setValue(scope, 'extensions', extensionSettings);
|
|
520
|
+
export function enableExtension(name, scope, cwd = process.cwd()) {
|
|
521
|
+
if (scope === SettingScope.System || scope === SettingScope.SystemDefaults) {
|
|
522
|
+
throw new Error('System and SystemDefaults scopes are not supported.');
|
|
523
|
+
}
|
|
524
|
+
const extension = loadExtensionByName(name, cwd);
|
|
525
|
+
if (!extension) {
|
|
526
|
+
throw new Error(`Extension with name ${name} does not exist.`);
|
|
375
527
|
}
|
|
528
|
+
const manager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir());
|
|
529
|
+
const scopePath = scope === SettingScope.Workspace ? cwd : os.homedir();
|
|
530
|
+
manager.enable(name, true, scopePath);
|
|
531
|
+
const config = getTelemetryConfig(cwd);
|
|
532
|
+
logExtensionEnable(config, new ExtensionEnableEvent(name, scope));
|
|
376
533
|
}
|
|
377
534
|
//# sourceMappingURL=extension.js.map
|