@google/gemini-cli 0.0.77777772 → 0.0.77777773
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -71
- package/dist/package.json +8 -2
- package/dist/src/commands/extensions/examples/context/GEMINI.md +9 -3
- package/dist/src/commands/extensions/examples/context/gemini-extension.json +1 -2
- package/dist/src/commands/extensions/install.d.ts +2 -2
- package/dist/src/commands/extensions/install.js +35 -36
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +22 -31
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -2
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/new.js +22 -7
- package/dist/src/commands/extensions/new.js.map +1 -1
- package/dist/src/commands/extensions/new.test.js +14 -7
- package/dist/src/commands/extensions/new.test.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.js +1 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/update.js +18 -8
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/list.js +5 -4
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/config/config.d.ts +5 -4
- package/dist/src/config/config.js +62 -22
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +24 -20
- package/dist/src/config/extension.js +107 -102
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.d.ts +12 -9
- package/dist/src/config/extensions/extensionEnablement.js +36 -9
- package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.test.js +74 -1
- package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
- package/dist/src/config/extensions/github.d.ts +9 -1
- package/dist/src/config/extensions/github.js +49 -79
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +119 -12
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/github_fetch.d.ts +7 -0
- package/dist/src/config/extensions/github_fetch.js +34 -0
- package/dist/src/config/extensions/github_fetch.js.map +1 -0
- package/dist/src/config/extensions/update.d.ts +4 -5
- package/dist/src/config/extensions/update.js +61 -44
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +84 -69
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/keyBindings.js +1 -1
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policy.js +2 -2
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/settings.d.ts +10 -1
- package/dist/src/config/settings.js +3 -3
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +80 -6
- package/dist/src/config/settingsSchema.js +79 -5
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +9 -1
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/config/trustedFolders.d.ts +0 -1
- package/dist/src/config/trustedFolders.js +2 -3
- package/dist/src/config/trustedFolders.js.map +1 -1
- package/dist/src/gemini.js +31 -23
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +21 -9
- 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/services/BuiltinCommandLoader.js +3 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
- package/dist/src/services/BuiltinCommandLoader.test.js +37 -0
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -1
- package/dist/src/services/FileCommandLoader.d.ts +1 -1
- package/dist/src/services/FileCommandLoader.js +4 -4
- package/dist/src/services/FileCommandLoader.js.map +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js +1 -1
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +11 -2
- package/dist/src/test-utils/render.js +55 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.js +7 -9
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.js +68 -16
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +269 -7
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.js +3 -0
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.js +8 -1
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +1 -0
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/AuthInProgress.js +2 -2
- package/dist/src/ui/auth/AuthInProgress.js.map +1 -1
- package/dist/src/ui/commands/chatCommand.js +7 -24
- package/dist/src/ui/commands/chatCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +39 -37
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +78 -260
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +23 -5
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/profileCommand.d.ts +7 -0
- package/dist/src/ui/commands/profileCommand.js +23 -0
- package/dist/src/ui/commands/profileCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js +2 -1
- package/dist/src/ui/commands/setupGithubCommand.test.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 -5
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.d.ts +1 -0
- package/dist/src/ui/components/AnsiOutput.js +5 -5
- package/dist/src/ui/components/AnsiOutput.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +6 -6
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/components/CliSpinner.d.ts +10 -0
- package/dist/src/ui/components/CliSpinner.js +20 -0
- package/dist/src/ui/components/CliSpinner.js.map +1 -0
- package/dist/src/ui/components/Composer.js +7 -27
- package/dist/src/ui/components/Composer.js.map +1 -1
- 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/ContextSummaryDisplay.js +2 -2
- 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 +4 -2
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.d.ts +18 -0
- package/dist/src/ui/components/DebugProfiler.js +158 -12
- package/dist/src/ui/components/DebugProfiler.js.map +1 -1
- package/dist/src/ui/components/DebugProfiler.test.d.ts +6 -0
- package/dist/src/ui/components/DebugProfiler.test.js +140 -0
- package/dist/src/ui/components/DebugProfiler.test.js.map +1 -0
- package/dist/src/ui/components/DialogManager.d.ts +2 -1
- package/dist/src/ui/components/DialogManager.js +9 -9
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/EditorSettingsDialog.js +11 -2
- 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 +3 -0
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +2 -2
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +1 -19
- package/dist/src/ui/components/Footer.js +35 -17
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.js +2 -2
- package/dist/src/ui/components/GeminiRespondingSpinner.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.d.ts +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +6 -2
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +50 -10
- 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 +7 -1
- package/dist/src/ui/components/InputPrompt.js +50 -25
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoopDetectionConfirmation.js +2 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +7 -2
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +4 -0
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/Notifications.js +12 -4
- package/dist/src/ui/components/Notifications.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +3 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -4
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.js +2 -0
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +2 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +5 -2
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js +3 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.js +2 -0
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.d.ts +2 -2
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +4 -4
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.js +2 -2
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +15 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +26 -3
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +1 -2
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.d.ts +5 -10
- package/dist/src/ui/components/shared/BaseSelectionList.js +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +7 -5
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +2 -3
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +13 -2
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +2 -3
- package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +5 -3
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/ScopeSelector.js +4 -1
- package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -1
- package/dist/src/ui/components/views/ChatList.d.ts +12 -0
- package/dist/src/ui/components/views/ChatList.js +17 -0
- package/dist/src/ui/components/views/ChatList.js.map +1 -0
- package/dist/src/ui/components/views/ChatList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ChatList.test.js +42 -0
- package/dist/src/ui/components/views/ChatList.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/contexts/UIStateContext.d.ts +6 -1
- package/dist/src/ui/contexts/UIStateContext.js +1 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.js +5 -6
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +19 -32
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +6 -5
- package/dist/src/ui/hooks/slashCommandProcessor.js +5 -2
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +10 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js +145 -49
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +161 -80
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFlickerDetector.d.ts +14 -0
- package/dist/src/ui/hooks/useFlickerDetector.js +37 -0
- package/dist/src/ui/hooks/useFlickerDetector.js.map +1 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.d.ts +6 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.js +102 -0
- package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -0
- package/dist/src/ui/hooks/useFolderTrust.d.ts +2 -1
- package/dist/src/ui/hooks/useFolderTrust.js +12 -3
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +33 -2
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.js +3 -3
- package/dist/src/ui/hooks/useHistoryManager.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.d.ts +4 -2
- package/dist/src/ui/hooks/useIdeTrustListener.js +40 -14
- package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -1
- 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/usePhraseCycler.js +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.js +3 -17
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +13 -43
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.d.ts +1 -0
- package/dist/src/ui/hooks/useSelectionList.js +63 -43
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.test.js +111 -37
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +12 -8
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useTerminalSize.js +2 -3
- package/dist/src/ui/hooks/useTerminalSize.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +2 -2
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/useWorkspaceMigration.d.ts +2 -2
- package/dist/src/ui/hooks/useWorkspaceMigration.js +13 -8
- package/dist/src/ui/hooks/useWorkspaceMigration.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js +16 -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 +17 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +3 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +2 -2
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
- package/dist/src/ui/state/extensions.d.ts +46 -0
- package/dist/src/ui/state/extensions.js +67 -0
- package/dist/src/ui/state/extensions.js.map +1 -1
- package/dist/src/ui/types.d.ts +54 -3
- package/dist/src/ui/types.js +3 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +1 -2
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +94 -91
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.d.ts +1 -0
- package/dist/src/ui/utils/displayUtils.js +3 -0
- package/dist/src/ui/utils/displayUtils.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.test.js +36 -17
- package/dist/src/ui/utils/displayUtils.test.js.map +1 -1
- package/dist/src/ui/utils/ui-sizing.d.ts +7 -0
- package/dist/src/ui/utils/ui-sizing.js +23 -0
- package/dist/src/ui/utils/ui-sizing.js.map +1 -0
- package/dist/src/utils/commentJson.js +95 -13
- package/dist/src/utils/commentJson.js.map +1 -1
- package/dist/src/utils/commentJson.test.js +161 -0
- package/dist/src/utils/commentJson.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +8 -3
- package/dist/src/utils/errors.js +23 -13
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.js +40 -46
- package/dist/src/utils/errors.test.js.map +1 -1
- 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/handleAutoUpdate.js +4 -1
- package/dist/src/utils/handleAutoUpdate.js.map +1 -1
- package/dist/src/utils/installationInfo.d.ts +1 -0
- package/dist/src/utils/installationInfo.js +2 -0
- package/dist/src/utils/installationInfo.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/sandbox.js +8 -8
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/sessionCleanup.d.ts +22 -0
- package/dist/src/utils/sessionCleanup.integration.test.d.ts +6 -0
- package/dist/src/utils/sessionCleanup.integration.test.js +182 -0
- package/dist/src/utils/sessionCleanup.integration.test.js.map +1 -0
- package/dist/src/utils/sessionCleanup.js +214 -0
- package/dist/src/utils/sessionCleanup.js.map +1 -0
- package/dist/src/utils/sessionCleanup.test.d.ts +6 -0
- package/dist/src/utils/sessionCleanup.test.js +1232 -0
- package/dist/src/utils/sessionCleanup.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +37 -0
- package/dist/src/utils/sessionUtils.js +71 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- 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.js +6 -7
- package/dist/src/validateNonInterActiveAuth.js.map +1 -1
- package/dist/src/zed-integration/acp.js +1 -2
- package/dist/src/zed-integration/acp.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 +48 -48
- package/dist/src/zed-integration/zedIntegration.d.ts +2 -3
- package/dist/src/zed-integration/zedIntegration.js +10 -27
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/install.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAqB,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/install.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { installOrUpdateExtension, requestConsentNonInteractive, } from '../../config/extension.js';
|
|
7
7
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
8
8
|
export async function handleLink(args) {
|
|
9
9
|
try {
|
|
@@ -11,7 +11,7 @@ export async function handleLink(args) {
|
|
|
11
11
|
source: args.path,
|
|
12
12
|
type: 'link',
|
|
13
13
|
};
|
|
14
|
-
const extensionName = await
|
|
14
|
+
const extensionName = await installOrUpdateExtension(installMetadata, requestConsentNonInteractive);
|
|
15
15
|
console.log(`Extension "${extensionName}" linked successfully and enabled.`);
|
|
16
16
|
}
|
|
17
17
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/commands/extensions/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../../../src/commands/extensions/link.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMxD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiB;IAChD,IAAI,CAAC;QACH,MAAM,eAAe,GAA6B;YAChD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM;SACb,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,eAAe,EACf,4BAA4B,CAC7B,CAAC;QACF,OAAO,CAAC,GAAG,CACT,cAAc,aAAa,oCAAoC,CAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,gGAAgG;IAClG,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,oCAAoC;QAC9C,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;IACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,UAAU,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;SAC7B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { access, cp, mkdir, readdir } from 'node:fs/promises';
|
|
7
|
-
import { join, dirname } from 'node:path';
|
|
6
|
+
import { access, cp, mkdir, readdir, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { join, dirname, basename } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -19,12 +19,15 @@ async function pathExists(path) {
|
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
async function
|
|
22
|
+
async function createDirectory(path) {
|
|
23
23
|
if (await pathExists(path)) {
|
|
24
24
|
throw new Error(`Path already exists: ${path}`);
|
|
25
25
|
}
|
|
26
|
-
const examplePath = join(EXAMPLES_PATH, template);
|
|
27
26
|
await mkdir(path, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
async function copyDirectory(template, path) {
|
|
29
|
+
await createDirectory(path);
|
|
30
|
+
const examplePath = join(EXAMPLES_PATH, template);
|
|
28
31
|
const entries = await readdir(examplePath, { withFileTypes: true });
|
|
29
32
|
for (const entry of entries) {
|
|
30
33
|
const srcPath = join(examplePath, entry.name);
|
|
@@ -34,8 +37,20 @@ async function copyDirectory(template, path) {
|
|
|
34
37
|
}
|
|
35
38
|
async function handleNew(args) {
|
|
36
39
|
try {
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
if (args.template) {
|
|
41
|
+
await copyDirectory(args.template, args.path);
|
|
42
|
+
console.log(`Successfully created new extension from template "${args.template}" at ${args.path}.`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
await createDirectory(args.path);
|
|
46
|
+
const extensionName = basename(args.path);
|
|
47
|
+
const manifest = {
|
|
48
|
+
name: extensionName,
|
|
49
|
+
version: '1.0.0',
|
|
50
|
+
};
|
|
51
|
+
await writeFile(join(args.path, 'gemini-extension.json'), JSON.stringify(manifest, null, 2));
|
|
52
|
+
console.log(`Successfully created new extension at ${args.path}.`);
|
|
53
|
+
}
|
|
39
54
|
console.log(`You can install this using "gemini extensions link ${args.path}" to test it out.`);
|
|
40
55
|
}
|
|
41
56
|
catch (error) {
|
|
@@ -50,7 +65,7 @@ async function getBoilerplateChoices() {
|
|
|
50
65
|
.map((entry) => entry.name);
|
|
51
66
|
}
|
|
52
67
|
export const newCommand = {
|
|
53
|
-
command: 'new <path>
|
|
68
|
+
command: 'new <path> [template]',
|
|
54
69
|
describe: 'Create a new extension from a boilerplate example.',
|
|
55
70
|
builder: async (yargs) => {
|
|
56
71
|
const choices = await getBoilerplateChoices();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
7
7
|
import { newCommand } from './new.js';
|
|
8
8
|
import yargs from 'yargs';
|
|
9
9
|
import * as fsPromises from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
10
11
|
vi.mock('node:fs/promises');
|
|
11
12
|
const mockedFs = vi.mocked(fsPromises);
|
|
12
13
|
describe('extensions new command', () => {
|
|
@@ -22,11 +23,17 @@ describe('extensions new command', () => {
|
|
|
22
23
|
});
|
|
23
24
|
it('should fail if no path is provided', async () => {
|
|
24
25
|
const parser = yargs([]).command(newCommand).fail(false).locale('en');
|
|
25
|
-
await expect(parser.parseAsync('new')).rejects.toThrow('Not enough non-option arguments: got 0, need at least
|
|
26
|
+
await expect(parser.parseAsync('new')).rejects.toThrow('Not enough non-option arguments: got 0, need at least 1');
|
|
26
27
|
});
|
|
27
|
-
it('should
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
it('should create directory when no template is provided', async () => {
|
|
29
|
+
mockedFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
30
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
31
|
+
const parser = yargs([]).command(newCommand).fail(false);
|
|
32
|
+
await parser.parseAsync('new /some/path');
|
|
33
|
+
expect(mockedFs.mkdir).toHaveBeenCalledWith('/some/path', {
|
|
34
|
+
recursive: true,
|
|
35
|
+
});
|
|
36
|
+
expect(mockedFs.cp).not.toHaveBeenCalled();
|
|
30
37
|
});
|
|
31
38
|
it('should create directory and copy files when path does not exist', async () => {
|
|
32
39
|
mockedFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
@@ -37,9 +44,9 @@ describe('extensions new command', () => {
|
|
|
37
44
|
expect(mockedFs.mkdir).toHaveBeenCalledWith('/some/path', {
|
|
38
45
|
recursive: true,
|
|
39
46
|
});
|
|
40
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/context'), '/some/path/context', { recursive: true });
|
|
41
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/custom-commands'), '/some/path/custom-commands', { recursive: true });
|
|
42
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/mcp-server'), '/some/path/mcp-server', { recursive: true });
|
|
47
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/context')), path.normalize('/some/path/context'), { recursive: true });
|
|
48
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/custom-commands')), path.normalize('/some/path/custom-commands'), { recursive: true });
|
|
49
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/mcp-server')), path.normalize('/some/path/mcp-server'), { recursive: true });
|
|
43
50
|
});
|
|
44
51
|
it('should throw an error if the path already exists', async () => {
|
|
45
52
|
mockedFs.access.mockResolvedValue(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"new.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { uninstallExtension } from '../../config/extension.js';
|
|
|
7
7
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
8
8
|
export async function handleUninstall(args) {
|
|
9
9
|
try {
|
|
10
|
-
await uninstallExtension(args.name);
|
|
10
|
+
await uninstallExtension(args.name, false);
|
|
11
11
|
console.log(`Extension "${args.name}" successfully uninstalled.`);
|
|
12
12
|
}
|
|
13
13
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../../src/commands/extensions/uninstall.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMxD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAmB;IACvD,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../../src/commands/extensions/uninstall.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMxD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAmB;IACvD,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAkB;IAC7C,OAAO,EAAE,kBAAkB;IAC3B,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,wDAAwD;QAClE,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,eAAe,CAAC;YACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAW;SAC7B,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { loadExtensions, annotateActiveExtensions, requestConsentNonInteractive, } from '../../config/extension.js';
|
|
6
|
+
import { loadExtensions, annotateActiveExtensions, ExtensionStorage, requestConsentNonInteractive, } from '../../config/extension.js';
|
|
7
7
|
import { updateAllUpdatableExtensions, checkForAllExtensionUpdates, updateExtension, } from '../../config/extensions/update.js';
|
|
8
8
|
import { checkForExtensionUpdate } from '../../config/extensions/github.js';
|
|
9
9
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
10
10
|
import { ExtensionUpdateState } from '../../ui/state/extensions.js';
|
|
11
|
+
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
|
|
11
12
|
const updateOutput = (info) => `Extension "${info.name}" successfully updated: ${info.originalVersion} → ${info.updatedVersion}.`;
|
|
12
13
|
export async function handleUpdate(args) {
|
|
13
14
|
const workingDir = process.cwd();
|
|
14
|
-
const
|
|
15
|
-
|
|
15
|
+
const extensionEnablementManager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(),
|
|
16
|
+
// Force enable named extensions, otherwise we will only update the enabled
|
|
17
|
+
// ones.
|
|
18
|
+
args.name ? [args.name] : []);
|
|
19
|
+
const allExtensions = loadExtensions(extensionEnablementManager);
|
|
20
|
+
const extensions = annotateActiveExtensions(allExtensions, workingDir, extensionEnablementManager);
|
|
16
21
|
if (args.name) {
|
|
17
22
|
try {
|
|
18
23
|
const extension = extensions.find((extension) => extension.name === args.name);
|
|
@@ -20,14 +25,11 @@ export async function handleUpdate(args) {
|
|
|
20
25
|
console.log(`Extension "${args.name}" not found.`);
|
|
21
26
|
return;
|
|
22
27
|
}
|
|
23
|
-
let updateState;
|
|
24
28
|
if (!extension.installMetadata) {
|
|
25
29
|
console.log(`Unable to install extension "${args.name}" due to missing install metadata`);
|
|
26
30
|
return;
|
|
27
31
|
}
|
|
28
|
-
await checkForExtensionUpdate(extension
|
|
29
|
-
updateState = newState;
|
|
30
|
-
});
|
|
32
|
+
const updateState = await checkForExtensionUpdate(extension);
|
|
31
33
|
if (updateState !== ExtensionUpdateState.UPDATE_AVAILABLE) {
|
|
32
34
|
console.log(`Extension "${args.name}" is already up to date.`);
|
|
33
35
|
return;
|
|
@@ -48,7 +50,15 @@ export async function handleUpdate(args) {
|
|
|
48
50
|
}
|
|
49
51
|
if (args.all) {
|
|
50
52
|
try {
|
|
51
|
-
|
|
53
|
+
const extensionState = new Map();
|
|
54
|
+
await checkForAllExtensionUpdates(extensions, (action) => {
|
|
55
|
+
if (action.type === 'SET_STATE') {
|
|
56
|
+
extensionState.set(action.payload.name, {
|
|
57
|
+
status: action.payload.state,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}, workingDir);
|
|
61
|
+
let updateInfos = await updateAllUpdatableExtensions(workingDir, requestConsentNonInteractive, extensions, extensionState, () => { });
|
|
52
62
|
updateInfos = updateInfos.filter((info) => info.originalVersion !== info.updatedVersion);
|
|
53
63
|
if (updateInfos.length === 0) {
|
|
54
64
|
console.log('No extensions to update.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/extensions/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,4BAA4B,EAE5B,2BAA2B,EAC3B,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/extensions/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,23 +6,24 @@
|
|
|
6
6
|
import { loadSettings } from '../../config/settings.js';
|
|
7
7
|
import { MCPServerStatus, createTransport } from '@google/gemini-cli-core';
|
|
8
8
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
-
import { loadExtensions } from '../../config/extension.js';
|
|
9
|
+
import { ExtensionStorage, loadExtensions } from '../../config/extension.js';
|
|
10
|
+
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
|
|
10
11
|
const COLOR_GREEN = '\u001b[32m';
|
|
11
12
|
const COLOR_YELLOW = '\u001b[33m';
|
|
12
13
|
const COLOR_RED = '\u001b[31m';
|
|
13
14
|
const RESET_COLOR = '\u001b[0m';
|
|
14
15
|
async function getMcpServersFromConfig() {
|
|
15
16
|
const settings = loadSettings();
|
|
16
|
-
const extensions = loadExtensions();
|
|
17
|
+
const extensions = loadExtensions(new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir()));
|
|
17
18
|
const mcpServers = { ...(settings.merged.mcpServers || {}) };
|
|
18
19
|
for (const extension of extensions) {
|
|
19
|
-
Object.entries(extension.
|
|
20
|
+
Object.entries(extension.mcpServers || {}).forEach(([key, server]) => {
|
|
20
21
|
if (mcpServers[key]) {
|
|
21
22
|
return;
|
|
22
23
|
}
|
|
23
24
|
mcpServers[key] = {
|
|
24
25
|
...server,
|
|
25
|
-
extensionName: extension.
|
|
26
|
+
extensionName: extension.name,
|
|
26
27
|
};
|
|
27
28
|
});
|
|
28
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/mcp/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/mcp/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import type { FileFilteringOptions } from '@google/gemini-cli-core';
|
|
6
|
+
import type { FileFilteringOptions, GeminiCLIExtension } from '@google/gemini-cli-core';
|
|
7
7
|
import { Config, FileDiscoveryService } from '@google/gemini-cli-core';
|
|
8
8
|
import type { Settings } from './settings.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
|
|
10
10
|
export interface CliArgs {
|
|
11
|
+
query: string | undefined;
|
|
11
12
|
model: string | undefined;
|
|
12
13
|
sandbox: boolean | string | undefined;
|
|
13
14
|
sandboxImage: string | undefined;
|
|
@@ -35,13 +36,13 @@ export interface CliArgs {
|
|
|
35
36
|
screenReader: boolean | undefined;
|
|
36
37
|
useSmartEdit: boolean | undefined;
|
|
37
38
|
useWriteTodos: boolean | undefined;
|
|
38
|
-
promptWords: string[] | undefined;
|
|
39
39
|
outputFormat: string | undefined;
|
|
40
40
|
}
|
|
41
41
|
export declare function parseArguments(settings: Settings): Promise<CliArgs>;
|
|
42
42
|
export declare function loadHierarchicalGeminiMemory(currentWorkingDirectory: string, includeDirectoriesToReadGemini: readonly string[] | undefined, debugMode: boolean, fileService: FileDiscoveryService, settings: Settings, extensionContextFilePaths: string[] | undefined, folderTrust: boolean, memoryImportFormat?: 'flat' | 'tree', fileFilteringOptions?: FileFilteringOptions): Promise<{
|
|
43
43
|
memoryContent: string;
|
|
44
44
|
fileCount: number;
|
|
45
|
+
filePaths: string[];
|
|
45
46
|
}>;
|
|
46
47
|
export declare function isDebugMode(argv: CliArgs): boolean;
|
|
47
|
-
export declare function loadCliConfig(settings: Settings, extensions:
|
|
48
|
+
export declare function loadCliConfig(settings: Settings, extensions: GeminiCLIExtension[], extensionEnablementManager: ExtensionEnablementManager, sessionId: string, argv: CliArgs, cwd?: string): Promise<Config>;
|
|
@@ -11,7 +11,7 @@ import { hideBin } from 'yargs/helpers';
|
|
|
11
11
|
import process from 'node:process';
|
|
12
12
|
import { mcpCommand } from '../commands/mcp.js';
|
|
13
13
|
import { extensionsCommand } from '../commands/extensions.js';
|
|
14
|
-
import { Config, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, ShellTool, EditTool,
|
|
14
|
+
import { Config, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, ShellTool, EditTool, WRITE_FILE_TOOL_NAME, SHELL_TOOL_NAMES, resolveTelemetrySettings, FatalConfigError, } from '@google/gemini-cli-core';
|
|
15
15
|
import { annotateActiveExtensions } from './extension.js';
|
|
16
16
|
import { getCliVersion } from '../utils/version.js';
|
|
17
17
|
import { loadSandboxConfig } from './sandboxConfig.js';
|
|
@@ -29,7 +29,8 @@ const logger = {
|
|
|
29
29
|
error: (...args) => console.error('[ERROR]', ...args),
|
|
30
30
|
};
|
|
31
31
|
export async function parseArguments(settings) {
|
|
32
|
-
const
|
|
32
|
+
const rawArgv = hideBin(process.argv);
|
|
33
|
+
const yargsInstance = yargs(rawArgv)
|
|
33
34
|
.locale('en')
|
|
34
35
|
.scriptName('gemini')
|
|
35
36
|
.usage('Usage: gemini [options] [command]\n\nGemini CLI - Launch an interactive CLI, use -p/--prompt for non-interactive mode')
|
|
@@ -76,7 +77,10 @@ export async function parseArguments(settings) {
|
|
|
76
77
|
description: 'Proxy for gemini client, like schema://user:password@host:port',
|
|
77
78
|
})
|
|
78
79
|
.deprecateOption('proxy', 'Use the "proxy" setting in settings.json instead. This flag will be removed in a future version.')
|
|
79
|
-
.command('$0 [
|
|
80
|
+
.command('$0 [query..]', 'Launch Gemini CLI', (yargsInstance) => yargsInstance
|
|
81
|
+
.positional('query', {
|
|
82
|
+
description: 'Positional prompt. Defaults to one-shot; use -i/--prompt-interactive for interactive.',
|
|
83
|
+
})
|
|
80
84
|
.option('model', {
|
|
81
85
|
alias: 'm',
|
|
82
86
|
type: 'string',
|
|
@@ -153,6 +157,7 @@ export async function parseArguments(settings) {
|
|
|
153
157
|
alias: 'e',
|
|
154
158
|
type: 'array',
|
|
155
159
|
string: true,
|
|
160
|
+
nargs: 1,
|
|
156
161
|
description: 'A list of extensions to use. If not provided, all extensions are used.',
|
|
157
162
|
coerce: (extensions) =>
|
|
158
163
|
// Handle comma-separated values
|
|
@@ -186,16 +191,27 @@ export async function parseArguments(settings) {
|
|
|
186
191
|
.deprecateOption('checkpointing', 'Use the "general.checkpointing.enabled" setting in settings.json instead. This flag will be removed in a future version.')
|
|
187
192
|
.deprecateOption('all-files', 'Use @ includes in the application instead. This flag will be removed in a future version.')
|
|
188
193
|
.deprecateOption('prompt', 'Use the positional prompt instead. This flag will be removed in a future version.')
|
|
194
|
+
// Ensure validation flows through .fail() for clean UX
|
|
195
|
+
.fail((msg, err, yargs) => {
|
|
196
|
+
console.error(msg || err?.message || 'Unknown error');
|
|
197
|
+
yargs.showHelp();
|
|
198
|
+
process.exit(1);
|
|
199
|
+
})
|
|
189
200
|
.check((argv) => {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
201
|
+
// The 'query' positional can be a string (for one arg) or string[] (for multiple).
|
|
202
|
+
// This guard safely checks if any positional argument was provided.
|
|
203
|
+
const query = argv['query'];
|
|
204
|
+
const hasPositionalQuery = Array.isArray(query)
|
|
205
|
+
? query.length > 0
|
|
206
|
+
: !!query;
|
|
207
|
+
if (argv['prompt'] && hasPositionalQuery) {
|
|
208
|
+
return 'Cannot use both a positional prompt and the --prompt (-p) flag together';
|
|
193
209
|
}
|
|
194
210
|
if (argv['prompt'] && argv['promptInteractive']) {
|
|
195
|
-
|
|
211
|
+
return 'Cannot use both --prompt (-p) and --prompt-interactive (-i) together';
|
|
196
212
|
}
|
|
197
213
|
if (argv.yolo && argv['approvalMode']) {
|
|
198
|
-
|
|
214
|
+
return 'Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.';
|
|
199
215
|
}
|
|
200
216
|
return true;
|
|
201
217
|
}))
|
|
@@ -213,6 +229,7 @@ export async function parseArguments(settings) {
|
|
|
213
229
|
.demandCommand(0, 0); // Allow base command to run with no subcommands
|
|
214
230
|
yargsInstance.wrap(yargsInstance.terminalWidth());
|
|
215
231
|
const result = await yargsInstance.parse();
|
|
232
|
+
// If yargs handled --help/--version it will have exited; nothing to do here.
|
|
216
233
|
// Handle case where MCP subcommands are executed - they should exit the process
|
|
217
234
|
// and not return to main CLI logic
|
|
218
235
|
if (result._.length > 0 &&
|
|
@@ -220,6 +237,23 @@ export async function parseArguments(settings) {
|
|
|
220
237
|
// MCP commands handle their own execution and process exit
|
|
221
238
|
process.exit(0);
|
|
222
239
|
}
|
|
240
|
+
// Normalize query args: handle both quoted "@path file" and unquoted @path file
|
|
241
|
+
const queryArg = result.query;
|
|
242
|
+
const q = Array.isArray(queryArg)
|
|
243
|
+
? queryArg.join(' ')
|
|
244
|
+
: queryArg;
|
|
245
|
+
// Route positional args: explicit -i flag -> interactive; else -> one-shot (even for @commands)
|
|
246
|
+
if (q && !result['prompt']) {
|
|
247
|
+
const hasExplicitInteractive = result['promptInteractive'] === '' || !!result['promptInteractive'];
|
|
248
|
+
if (hasExplicitInteractive) {
|
|
249
|
+
result['promptInteractive'] = q;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
result['prompt'] = q;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Keep CliArgs.query as a string for downstream typing
|
|
256
|
+
result['query'] = q || undefined;
|
|
223
257
|
// The import format is now only controlled by settings.memoryImportFormat
|
|
224
258
|
// We no longer accept it as a CLI argument
|
|
225
259
|
return result;
|
|
@@ -269,13 +303,13 @@ export function isDebugMode(argv) {
|
|
|
269
303
|
return (argv.debug ||
|
|
270
304
|
[process.env['DEBUG'], process.env['DEBUG_MODE']].some((v) => v === 'true' || v === '1'));
|
|
271
305
|
}
|
|
272
|
-
export async function loadCliConfig(settings, extensions, sessionId, argv, cwd = process.cwd()) {
|
|
306
|
+
export async function loadCliConfig(settings, extensions, extensionEnablementManager, sessionId, argv, cwd = process.cwd()) {
|
|
273
307
|
const debugMode = isDebugMode(argv);
|
|
274
308
|
const memoryImportFormat = settings.context?.importFormat || 'tree';
|
|
275
309
|
const ideMode = settings.ide?.enabled ?? false;
|
|
276
310
|
const folderTrust = settings.security?.folderTrust?.enabled ?? false;
|
|
277
311
|
const trustedFolder = isWorkspaceTrusted(settings)?.isTrusted ?? true;
|
|
278
|
-
const allExtensions = annotateActiveExtensions(extensions,
|
|
312
|
+
const allExtensions = annotateActiveExtensions(extensions, cwd, extensionEnablementManager);
|
|
279
313
|
const activeExtensions = extensions.filter((_, i) => allExtensions[i].isActive);
|
|
280
314
|
// Set the context filename in the server's memoryTool module BEFORE loading memory
|
|
281
315
|
// TODO(b/343434939): This is a bit of a hack. The contextFileName should ideally be passed
|
|
@@ -298,11 +332,11 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
298
332
|
.map(resolvePath)
|
|
299
333
|
.concat((argv.includeDirectories || []).map(resolvePath));
|
|
300
334
|
// Call the (now wrapper) loadHierarchicalGeminiMemory which calls the server's version
|
|
301
|
-
const { memoryContent, fileCount } = await loadHierarchicalGeminiMemory(cwd, settings.context?.loadMemoryFromIncludeDirectories
|
|
335
|
+
const { memoryContent, fileCount, filePaths } = await loadHierarchicalGeminiMemory(cwd, settings.context?.loadMemoryFromIncludeDirectories
|
|
302
336
|
? includeDirectories
|
|
303
337
|
: [], debugMode, fileService, settings, extensionContextFilePaths, trustedFolder, memoryImportFormat, fileFiltering);
|
|
304
338
|
let mcpServers = mergeMcpServers(settings, activeExtensions);
|
|
305
|
-
const question = argv.promptInteractive || argv.prompt ||
|
|
339
|
+
const question = argv.promptInteractive || argv.prompt || '';
|
|
306
340
|
// Determine approval mode with backward compatibility
|
|
307
341
|
let approvalMode;
|
|
308
342
|
if (argv.approvalMode) {
|
|
@@ -348,14 +382,18 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
348
382
|
const policyEngineConfig = createPolicyEngineConfig(settings, approvalMode);
|
|
349
383
|
const allowedTools = argv.allowedTools || settings.tools?.allowed || [];
|
|
350
384
|
const allowedToolsSet = new Set(allowedTools);
|
|
351
|
-
//
|
|
352
|
-
const
|
|
385
|
+
// Interactive mode: explicit -i flag or (TTY + no args + no -p flag)
|
|
386
|
+
const hasQuery = !!argv.query;
|
|
353
387
|
const interactive = !!argv.promptInteractive ||
|
|
354
|
-
(process.stdin.isTTY && !
|
|
388
|
+
(process.stdin.isTTY && !hasQuery && !argv.prompt);
|
|
355
389
|
// In non-interactive mode, exclude tools that require a prompt.
|
|
356
390
|
const extraExcludes = [];
|
|
357
391
|
if (!interactive && !argv.experimentalAcp) {
|
|
358
|
-
const defaultExcludes = [
|
|
392
|
+
const defaultExcludes = [
|
|
393
|
+
ShellTool.Name,
|
|
394
|
+
EditTool.Name,
|
|
395
|
+
WRITE_FILE_TOOL_NAME,
|
|
396
|
+
];
|
|
359
397
|
const autoEditExcludes = [ShellTool.Name];
|
|
360
398
|
const toolExclusionFilter = createToolExclusionFilter(allowedTools, allowedToolsSet);
|
|
361
399
|
switch (approvalMode) {
|
|
@@ -391,7 +429,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
391
429
|
if (argv.allowedMcpServerNames) {
|
|
392
430
|
mcpServers = allowedMcpServers(mcpServers, argv.allowedMcpServerNames, blockedMcpServers);
|
|
393
431
|
}
|
|
394
|
-
const useModelRouter = settings.experimental?.useModelRouter ??
|
|
432
|
+
const useModelRouter = settings.experimental?.useModelRouter ?? false;
|
|
395
433
|
const defaultModel = useModelRouter
|
|
396
434
|
? DEFAULT_GEMINI_MODEL_AUTO
|
|
397
435
|
: DEFAULT_GEMINI_MODEL;
|
|
@@ -423,6 +461,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
423
461
|
mcpServers,
|
|
424
462
|
userMemory: memoryContent,
|
|
425
463
|
geminiMdFileCount: fileCount,
|
|
464
|
+
geminiMdFilePaths: filePaths,
|
|
426
465
|
approvalMode,
|
|
427
466
|
showMemoryUsage: argv.showMemoryUsage || settings.ui?.showMemoryUsage || false,
|
|
428
467
|
accessibility: {
|
|
@@ -431,7 +470,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
431
470
|
},
|
|
432
471
|
telemetry: telemetrySettings,
|
|
433
472
|
usageStatisticsEnabled: settings.privacy?.usageStatisticsEnabled ?? true,
|
|
434
|
-
fileFiltering
|
|
473
|
+
fileFiltering,
|
|
435
474
|
checkpointing: argv.checkpointing || settings.general?.checkpointing?.enabled,
|
|
436
475
|
proxy: argv.proxy ||
|
|
437
476
|
process.env['HTTPS_PROXY'] ||
|
|
@@ -456,7 +495,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
456
495
|
interactive,
|
|
457
496
|
trustedFolder,
|
|
458
497
|
useRipgrep: settings.tools?.useRipgrep,
|
|
459
|
-
|
|
498
|
+
enableInteractiveShell: settings.tools?.shell?.enableInteractiveShell ?? true,
|
|
460
499
|
skipNextSpeakerCheck: settings.model?.skipNextSpeakerCheck,
|
|
461
500
|
enablePromptCompletion: settings.general?.enablePromptCompletion ?? false,
|
|
462
501
|
truncateToolOutputThreshold: settings.tools?.truncateToolOutputThreshold,
|
|
@@ -470,6 +509,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
470
509
|
},
|
|
471
510
|
useModelRouter,
|
|
472
511
|
enableMessageBusIntegration: settings.tools?.enableMessageBusIntegration ?? false,
|
|
512
|
+
enableSubagents: settings.experimental?.enableSubagents ?? false,
|
|
473
513
|
});
|
|
474
514
|
}
|
|
475
515
|
function allowedMcpServers(mcpServers, allowMCPServers, blockedMcpServers) {
|
|
@@ -498,14 +538,14 @@ function allowedMcpServers(mcpServers, allowMCPServers, blockedMcpServers) {
|
|
|
498
538
|
function mergeMcpServers(settings, extensions) {
|
|
499
539
|
const mcpServers = { ...(settings.mcpServers || {}) };
|
|
500
540
|
for (const extension of extensions) {
|
|
501
|
-
Object.entries(extension.
|
|
541
|
+
Object.entries(extension.mcpServers || {}).forEach(([key, server]) => {
|
|
502
542
|
if (mcpServers[key]) {
|
|
503
543
|
logger.warn(`Skipping extension MCP config for server with key "${key}" as it already exists.`);
|
|
504
544
|
return;
|
|
505
545
|
}
|
|
506
546
|
mcpServers[key] = {
|
|
507
547
|
...server,
|
|
508
|
-
extensionName: extension.
|
|
548
|
+
extensionName: extension.name,
|
|
509
549
|
};
|
|
510
550
|
});
|
|
511
551
|
}
|
|
@@ -517,7 +557,7 @@ function mergeExcludeTools(settings, extensions, extraExcludes) {
|
|
|
517
557
|
...(extraExcludes || []),
|
|
518
558
|
]);
|
|
519
559
|
for (const extension of extensions) {
|
|
520
|
-
for (const tool of extension.
|
|
560
|
+
for (const tool of extension.excludeTools || []) {
|
|
521
561
|
allExcludeTools.add(tool);
|
|
522
562
|
}
|
|
523
563
|
}
|