@google/gemini-cli 0.31.0-preview.2 → 0.32.0-preview.0
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 +2 -2
- package/dist/src/commands/extensions/examples/policies/README.md +41 -0
- package/dist/src/commands/extensions/examples/policies/gemini-extension.json +5 -0
- package/dist/src/commands/extensions/examples/policies/policies/policies.toml +28 -0
- package/dist/src/commands/extensions/link.test.js +5 -21
- package/dist/src/commands/extensions/link.test.js.map +1 -1
- package/dist/src/commands/extensions/list.test.js +10 -24
- package/dist/src/commands/extensions/list.test.js.map +1 -1
- package/dist/src/commands/mcp/list.js +32 -14
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/commands/mcp/list.test.js +22 -1
- package/dist/src/commands/mcp/list.test.js.map +1 -1
- package/dist/src/commands/skills/disable.test.js +4 -7
- package/dist/src/commands/skills/disable.test.js.map +1 -1
- package/dist/src/commands/skills/enable.test.js +4 -7
- package/dist/src/commands/skills/enable.test.js.map +1 -1
- package/dist/src/commands/skills/install.test.js +12 -9
- package/dist/src/commands/skills/install.test.js.map +1 -1
- package/dist/src/commands/skills/link.test.js +5 -2
- package/dist/src/commands/skills/link.test.js.map +1 -1
- package/dist/src/commands/skills/list.test.js +16 -29
- package/dist/src/commands/skills/list.test.js.map +1 -1
- package/dist/src/commands/skills/uninstall.test.js +9 -6
- package/dist/src/commands/skills/uninstall.test.js.map +1 -1
- package/dist/src/config/config.js +3 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +55 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager.d.ts +8 -1
- package/dist/src/config/extension-manager.js +88 -23
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension-manager.test.d.ts +6 -0
- package/dist/src/config/extension-manager.test.js +138 -0
- package/dist/src/config/extension-manager.test.js.map +1 -0
- package/dist/src/config/extension.test.js +93 -4
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensions/consent.test.js +35 -43
- package/dist/src/config/extensions/consent.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-engine.integration.test.js +12 -12
- package/dist/src/config/policy.d.ts +20 -0
- package/dist/src/config/policy.js +35 -7
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/policy.test.js +71 -24
- package/dist/src/config/policy.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +98 -3
- package/dist/src/config/settingsSchema.js +92 -1
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +49 -0
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/config/workspace-policy-cli.test.js +48 -19
- package/dist/src/config/workspace-policy-cli.test.js.map +1 -1
- package/dist/src/gemini.js +7 -8
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +5 -1
- 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/test-utils/AppRig.d.ts +26 -0
- package/dist/src/test-utils/AppRig.js +128 -6
- package/dist/src/test-utils/AppRig.js.map +1 -1
- package/dist/src/test-utils/customMatchers.d.ts +25 -5
- package/dist/src/test-utils/customMatchers.js +46 -0
- package/dist/src/test-utils/customMatchers.js.map +1 -1
- package/dist/src/test-utils/mockConfig.js +4 -0
- package/dist/src/test-utils/mockConfig.js.map +1 -1
- package/dist/src/test-utils/mockDebugLogger.d.ts +35 -0
- package/dist/src/test-utils/mockDebugLogger.js +67 -0
- package/dist/src/test-utils/mockDebugLogger.js.map +1 -0
- package/dist/src/test-utils/render.d.ts +13 -0
- package/dist/src/test-utils/render.js +48 -8
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/test-utils/svg.d.ts +7 -0
- package/dist/src/test-utils/svg.js +163 -0
- package/dist/src/test-utils/svg.js.map +1 -0
- package/dist/src/ui/AppContainer.js +48 -66
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +89 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +17 -3
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.test.js +10 -3
- package/dist/src/ui/commands/mcpCommand.test.js.map +1 -1
- package/dist/src/ui/commands/setupGithubCommand.js +2 -0
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.js +10 -4
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.test.js +12 -3
- package/dist/src/ui/commands/statsCommand.test.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +3 -3
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/components/AskUserDialog.d.ts +4 -0
- package/dist/src/ui/components/AskUserDialog.js +5 -5
- package/dist/src/ui/components/AskUserDialog.js.map +1 -1
- package/dist/src/ui/components/AskUserDialog.test.js +6 -7
- package/dist/src/ui/components/AskUserDialog.test.js.map +1 -1
- package/dist/src/ui/components/Composer.js +17 -6
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +47 -6
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/ConfigInitDisplay.js +1 -1
- package/dist/src/ui/components/ConfigInitDisplay.js.map +1 -1
- package/dist/src/ui/components/ConfigInitDisplay.test.js +6 -6
- package/dist/src/ui/components/ConfigInitDisplay.test.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +6 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js +43 -4
- package/dist/src/ui/components/DetailedMessagesDisplay.test.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +9 -1
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/DialogManager.test.js +4 -0
- package/dist/src/ui/components/DialogManager.test.js.map +1 -1
- package/dist/src/ui/components/EmptyWalletDialog.d.ts +22 -0
- package/dist/src/ui/components/EmptyWalletDialog.js +33 -0
- package/dist/src/ui/components/EmptyWalletDialog.js.map +1 -0
- package/dist/src/ui/components/EmptyWalletDialog.test.d.ts +6 -0
- package/dist/src/ui/components/EmptyWalletDialog.test.js +127 -0
- package/dist/src/ui/components/EmptyWalletDialog.test.js.map +1 -0
- package/dist/src/ui/components/ExitPlanModeDialog.d.ts +2 -1
- package/dist/src/ui/components/ExitPlanModeDialog.js +34 -7
- package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
- package/dist/src/ui/components/ExitPlanModeDialog.test.js +31 -2
- package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +3 -1
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.test.js +63 -1
- package/dist/src/ui/components/Footer.test.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +0 -5
- package/dist/src/ui/components/GeminiRespondingSpinner.js +1 -32
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -1
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js +5 -10
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -1
- package/dist/src/ui/components/GeminiSpinner.d.ts +13 -0
- package/dist/src/ui/components/GeminiSpinner.js +35 -0
- package/dist/src/ui/components/GeminiSpinner.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.js +31 -3
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.js +82 -18
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/OverageMenuDialog.d.ts +22 -0
- package/dist/src/ui/components/OverageMenuDialog.js +32 -0
- package/dist/src/ui/components/OverageMenuDialog.js.map +1 -0
- package/dist/src/ui/components/OverageMenuDialog.test.d.ts +6 -0
- package/dist/src/ui/components/OverageMenuDialog.test.js +129 -0
- package/dist/src/ui/components/OverageMenuDialog.test.js.map +1 -0
- package/dist/src/ui/components/ProQuotaDialog.d.ts +3 -1
- package/dist/src/ui/components/ProQuotaDialog.js +11 -6
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +27 -14
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +9 -11
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.d.ts +1 -0
- package/dist/src/ui/components/StatsDisplay.js +2 -2
- package/dist/src/ui/components/StatsDisplay.js.map +1 -1
- package/dist/src/ui/components/Table.test.js +23 -4
- package/dist/src/ui/components/Table.test.js.map +1 -1
- package/dist/src/ui/components/ToastDisplay.js +1 -1
- package/dist/src/ui/components/ToastDisplay.js.map +1 -1
- package/dist/src/ui/components/ToastDisplay.test.js +2 -2
- package/dist/src/ui/components/ToastDisplay.test.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.js +3 -1
- package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
- package/dist/src/ui/components/ToolConfirmationQueue.test.js +3 -2
- package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +1 -1
- package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +2 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +3 -2
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +17 -17
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +17 -7
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +88 -5
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js +1 -1
- package/dist/src/ui/components/messages/ToolOverflowConsistencyChecks.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js +11 -4
- package/dist/src/ui/components/messages/ToolResultDisplayOverflow.test.js.map +1 -1
- package/dist/src/ui/components/shared/DialogFooter.d.ts +2 -0
- package/dist/src/ui/components/shared/DialogFooter.js +2 -1
- package/dist/src/ui/components/shared/DialogFooter.js.map +1 -1
- package/dist/src/ui/components/shared/ExpandableText.test.js +21 -16
- package/dist/src/ui/components/shared/ExpandableText.test.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.js +10 -1
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +8 -8
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
- package/dist/src/ui/components/shared/Scrollable.d.ts +1 -1
- package/dist/src/ui/components/shared/Scrollable.js +76 -43
- package/dist/src/ui/components/shared/Scrollable.js.map +1 -1
- package/dist/src/ui/components/shared/Scrollable.test.js +15 -20
- package/dist/src/ui/components/shared/Scrollable.test.js.map +1 -1
- package/dist/src/ui/components/shared/ScrollableList.js +14 -9
- package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
- package/dist/src/ui/components/shared/ScrollableList.test.js +153 -0
- package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
- package/dist/src/ui/components/shared/VirtualizedList.js +133 -88
- package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -1
- package/dist/src/ui/components/shared/VirtualizedList.test.js +6 -3
- package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.js +3 -30
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.d.ts +1 -0
- package/dist/src/ui/components/views/McpStatus.js +2 -2
- package/dist/src/ui/components/views/McpStatus.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.test.js +7 -0
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +3 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +24 -1
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +4 -0
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/creditsFlowHandler.d.ts +35 -0
- package/dist/src/ui/hooks/creditsFlowHandler.js +144 -0
- package/dist/src/ui/hooks/creditsFlowHandler.js.map +1 -0
- package/dist/src/ui/hooks/creditsFlowHandler.test.d.ts +6 -0
- package/dist/src/ui/hooks/creditsFlowHandler.test.js +180 -0
- package/dist/src/ui/hooks/creditsFlowHandler.test.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.d.ts +7 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.js +73 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.test.d.ts +6 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.test.js +73 -0
- package/dist/src/ui/hooks/shell-completions/gitProvider.test.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/index.d.ts +7 -0
- package/dist/src/ui/hooks/shell-completions/index.js +16 -0
- package/dist/src/ui/hooks/shell-completions/index.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.d.ts +7 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.js +67 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.test.d.ts +6 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.test.js +69 -0
- package/dist/src/ui/hooks/shell-completions/npmProvider.test.js.map +1 -0
- package/dist/src/ui/hooks/shell-completions/types.d.ts +16 -0
- package/dist/src/ui/hooks/shell-completions/types.js +7 -0
- package/dist/src/ui/hooks/shell-completions/types.js.map +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.js +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.js +1 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/toolMapping.js +1 -0
- package/dist/src/ui/hooks/toolMapping.js.map +1 -1
- package/dist/src/ui/hooks/toolMapping.test.js +25 -0
- package/dist/src/ui/hooks/toolMapping.test.js.map +1 -1
- package/dist/src/ui/hooks/useAlternateBuffer.d.ts +2 -2
- package/dist/src/ui/hooks/useAlternateBuffer.js +5 -4
- package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
- package/dist/src/ui/hooks/useAlternateBuffer.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAlternateBuffer.test.js +57 -0
- package/dist/src/ui/hooks/useAlternateBuffer.test.js.map +1 -0
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +2 -1
- package/dist/src/ui/hooks/useCommandCompletion.js +37 -5
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js +23 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +83 -5
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +110 -4
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +2 -1
- package/dist/src/ui/hooks/useLoadingIndicator.js +7 -2
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +25 -4
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.js +9 -3
- package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +11 -3
- package/dist/src/ui/hooks/useQuotaAndFallback.js +84 -12
- package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +278 -16
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellCompletion.d.ts +49 -0
- package/dist/src/ui/hooks/useShellCompletion.js +489 -0
- package/dist/src/ui/hooks/useShellCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useShellCompletion.test.d.ts +6 -0
- package/dist/src/ui/hooks/useShellCompletion.test.js +354 -0
- package/dist/src/ui/hooks/useShellCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useTimedMessage.d.ts +1 -1
- package/dist/src/ui/hooks/useTimedMessage.js +5 -3
- package/dist/src/ui/hooks/useTimedMessage.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.js +5 -0
- package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +28 -19
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/types.d.ts +3 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +4 -86
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +2 -2
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/TableRenderer.js +18 -12
- package/dist/src/ui/utils/TableRenderer.js.map +1 -1
- package/dist/src/ui/utils/TableRenderer.test.js +152 -22
- package/dist/src/ui/utils/TableRenderer.test.js.map +1 -1
- package/dist/src/ui/utils/borderStyles.js +4 -1
- package/dist/src/ui/utils/borderStyles.js.map +1 -1
- package/dist/src/ui/utils/borderStyles.test.d.ts +6 -0
- package/dist/src/ui/utils/borderStyles.test.js +141 -0
- package/dist/src/ui/utils/borderStyles.test.js.map +1 -0
- package/dist/src/ui/utils/editorUtils.d.ts +17 -0
- package/dist/src/ui/utils/editorUtils.js +104 -0
- package/dist/src/ui/utils/editorUtils.js.map +1 -0
- package/dist/src/ui/utils/markdownParsingUtils.d.ts +10 -0
- package/dist/src/ui/utils/markdownParsingUtils.js +150 -0
- package/dist/src/ui/utils/markdownParsingUtils.js.map +1 -0
- package/dist/src/ui/utils/markdownParsingUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/markdownParsingUtils.test.js +163 -0
- package/dist/src/ui/utils/markdownParsingUtils.test.js.map +1 -0
- package/dist/src/ui/utils/ui-sizing.d.ts +2 -2
- package/dist/src/ui/utils/ui-sizing.js +2 -3
- package/dist/src/ui/utils/ui-sizing.js.map +1 -1
- package/dist/src/ui/utils/ui-sizing.test.js +5 -19
- package/dist/src/ui/utils/ui-sizing.test.js.map +1 -1
- package/dist/src/utils/cleanup.d.ts +2 -0
- package/dist/src/utils/cleanup.js +51 -1
- package/dist/src/utils/cleanup.js.map +1 -1
- package/dist/src/utils/cleanup.test.js +130 -2
- package/dist/src/utils/cleanup.test.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +2 -1
- package/dist/src/zed-integration/zedIntegration.js +35 -11
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.test.js +17 -1
- package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.31.0-preview.1.tgz +0 -0
|
@@ -99,11 +99,11 @@ describe('Policy Engine Integration Tests', () => {
|
|
|
99
99
|
};
|
|
100
100
|
const config = await createPolicyEngineConfig(settings, ApprovalMode.DEFAULT);
|
|
101
101
|
const engine = new PolicyEngine(config);
|
|
102
|
-
// MCP server allowed (priority
|
|
103
|
-
// MCP server allowed (priority
|
|
102
|
+
// MCP server allowed (priority 4.1) provides general allow for server
|
|
103
|
+
// MCP server allowed (priority 4.1) provides general allow for server
|
|
104
104
|
expect((await engine.check({ name: 'my-server__safe-tool' }, undefined))
|
|
105
105
|
.decision).toBe(PolicyDecision.ALLOW);
|
|
106
|
-
// But specific tool exclude (priority
|
|
106
|
+
// But specific tool exclude (priority 4.4) wins over server allow
|
|
107
107
|
expect((await engine.check({ name: 'my-server__dangerous-tool' }, undefined))
|
|
108
108
|
.decision).toBe(PolicyDecision.DENY);
|
|
109
109
|
});
|
|
@@ -264,15 +264,15 @@ describe('Policy Engine Integration Tests', () => {
|
|
|
264
264
|
const rules = config.rules || [];
|
|
265
265
|
// Find rules and verify their priorities
|
|
266
266
|
const blockedToolRule = rules.find((r) => r.toolName === 'blocked-tool');
|
|
267
|
-
expect(blockedToolRule?.priority).toBe(
|
|
267
|
+
expect(blockedToolRule?.priority).toBe(4.4); // Command line exclude
|
|
268
268
|
const blockedServerRule = rules.find((r) => r.toolName === 'blocked-server__*');
|
|
269
|
-
expect(blockedServerRule?.priority).toBe(
|
|
269
|
+
expect(blockedServerRule?.priority).toBe(4.9); // MCP server exclude
|
|
270
270
|
const specificToolRule = rules.find((r) => r.toolName === 'specific-tool');
|
|
271
|
-
expect(specificToolRule?.priority).toBe(
|
|
271
|
+
expect(specificToolRule?.priority).toBe(4.3); // Command line allow
|
|
272
272
|
const trustedServerRule = rules.find((r) => r.toolName === 'trusted-server__*');
|
|
273
|
-
expect(trustedServerRule?.priority).toBe(
|
|
273
|
+
expect(trustedServerRule?.priority).toBe(4.2); // MCP trusted server
|
|
274
274
|
const mcpServerRule = rules.find((r) => r.toolName === 'mcp-server__*');
|
|
275
|
-
expect(mcpServerRule?.priority).toBe(
|
|
275
|
+
expect(mcpServerRule?.priority).toBe(4.1); // MCP allowed server
|
|
276
276
|
const readOnlyToolRule = rules.find((r) => r.toolName === 'glob');
|
|
277
277
|
// Priority 70 in default tier → 1.07 (Overriding Plan Mode Deny)
|
|
278
278
|
expect(readOnlyToolRule?.priority).toBeCloseTo(1.07, 5);
|
|
@@ -358,13 +358,13 @@ describe('Policy Engine Integration Tests', () => {
|
|
|
358
358
|
const rules = config.rules || [];
|
|
359
359
|
// Verify each rule has the expected priority
|
|
360
360
|
const tool3Rule = rules.find((r) => r.toolName === 'tool3');
|
|
361
|
-
expect(tool3Rule?.priority).toBe(
|
|
361
|
+
expect(tool3Rule?.priority).toBe(4.4); // Excluded tools (user tier)
|
|
362
362
|
const server2Rule = rules.find((r) => r.toolName === 'server2__*');
|
|
363
|
-
expect(server2Rule?.priority).toBe(
|
|
363
|
+
expect(server2Rule?.priority).toBe(4.9); // Excluded servers (user tier)
|
|
364
364
|
const tool1Rule = rules.find((r) => r.toolName === 'tool1');
|
|
365
|
-
expect(tool1Rule?.priority).toBe(
|
|
365
|
+
expect(tool1Rule?.priority).toBe(4.3); // Allowed tools (user tier)
|
|
366
366
|
const server1Rule = rules.find((r) => r.toolName === 'server1__*');
|
|
367
|
-
expect(server1Rule?.priority).toBe(
|
|
367
|
+
expect(server1Rule?.priority).toBe(4.1); // Allowed servers (user tier)
|
|
368
368
|
const globRule = rules.find((r) => r.toolName === 'glob');
|
|
369
369
|
// Priority 70 in default tier → 1.07
|
|
370
370
|
expect(globRule?.priority).toBeCloseTo(1.07, 5); // Auto-accept read-only
|
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { type PolicyEngineConfig, type ApprovalMode, type PolicyEngine, type MessageBus, Storage, type PolicyUpdateConfirmationRequest } from '@google/gemini-cli-core';
|
|
7
7
|
import { type Settings } from './settings.js';
|
|
8
|
+
/**
|
|
9
|
+
* Temporary flag to automatically accept workspace policies to reduce friction.
|
|
10
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
11
|
+
*/
|
|
12
|
+
export declare let autoAcceptWorkspacePolicies: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the autoAcceptWorkspacePolicies flag.
|
|
15
|
+
* Used primarily for testing purposes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function setAutoAcceptWorkspacePolicies(value: boolean): void;
|
|
18
|
+
/**
|
|
19
|
+
* Temporary flag to disable workspace level policies altogether.
|
|
20
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
21
|
+
*/
|
|
22
|
+
export declare let disableWorkspacePolicies: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Sets the disableWorkspacePolicies flag.
|
|
25
|
+
* Used primarily for testing purposes.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setDisableWorkspacePolicies(value: boolean): void;
|
|
8
28
|
export declare function createPolicyEngineConfig(settings: Settings, approvalMode: ApprovalMode, workspacePoliciesDir?: string): Promise<PolicyEngineConfig>;
|
|
9
29
|
export declare function createPolicyUpdater(policyEngine: PolicyEngine, messageBus: MessageBus, storage: Storage): void;
|
|
10
30
|
export interface WorkspacePolicyState {
|
|
@@ -3,8 +3,32 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, } from '@google/gemini-cli-core';
|
|
6
|
+
import { createPolicyEngineConfig as createCorePolicyEngineConfig, createPolicyUpdater as createCorePolicyUpdater, PolicyIntegrityManager, IntegrityStatus, Storage, writeToStderr, debugLogger, } from '@google/gemini-cli-core';
|
|
7
7
|
import {} from './settings.js';
|
|
8
|
+
/**
|
|
9
|
+
* Temporary flag to automatically accept workspace policies to reduce friction.
|
|
10
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
11
|
+
*/
|
|
12
|
+
export let autoAcceptWorkspacePolicies = true;
|
|
13
|
+
/**
|
|
14
|
+
* Sets the autoAcceptWorkspacePolicies flag.
|
|
15
|
+
* Used primarily for testing purposes.
|
|
16
|
+
*/
|
|
17
|
+
export function setAutoAcceptWorkspacePolicies(value) {
|
|
18
|
+
autoAcceptWorkspacePolicies = value;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Temporary flag to disable workspace level policies altogether.
|
|
22
|
+
* Exported as 'let' to allow monkey patching in tests via the setter.
|
|
23
|
+
*/
|
|
24
|
+
export let disableWorkspacePolicies = true;
|
|
25
|
+
/**
|
|
26
|
+
* Sets the disableWorkspacePolicies flag.
|
|
27
|
+
* Used primarily for testing purposes.
|
|
28
|
+
*/
|
|
29
|
+
export function setDisableWorkspacePolicies(value) {
|
|
30
|
+
disableWorkspacePolicies = value;
|
|
31
|
+
}
|
|
8
32
|
export async function createPolicyEngineConfig(settings, approvalMode, workspacePoliciesDir) {
|
|
9
33
|
// Explicitly construct PolicySettings from Settings to ensure type safety
|
|
10
34
|
// and avoid accidental leakage of other settings properties.
|
|
@@ -27,7 +51,7 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
27
51
|
const { cwd, trustedFolder, interactive } = options;
|
|
28
52
|
let workspacePoliciesDir;
|
|
29
53
|
let policyUpdateConfirmationRequest;
|
|
30
|
-
if (trustedFolder) {
|
|
54
|
+
if (trustedFolder && !disableWorkspacePolicies) {
|
|
31
55
|
const storage = new Storage(cwd);
|
|
32
56
|
// If we are in the home directory (or rather, our target Gemini dir is the global one),
|
|
33
57
|
// don't treat it as a workspace to avoid loading global policies twice.
|
|
@@ -45,8 +69,8 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
45
69
|
// No workspace policies found
|
|
46
70
|
workspacePoliciesDir = undefined;
|
|
47
71
|
}
|
|
48
|
-
else if (interactive) {
|
|
49
|
-
// Policies changed or are new, and we are in interactive mode
|
|
72
|
+
else if (interactive && !autoAcceptWorkspacePolicies) {
|
|
73
|
+
// Policies changed or are new, and we are in interactive mode and auto-accept is disabled
|
|
50
74
|
policyUpdateConfirmationRequest = {
|
|
51
75
|
scope: 'workspace',
|
|
52
76
|
identifier: cwd,
|
|
@@ -55,11 +79,15 @@ export async function resolveWorkspacePolicyState(options) {
|
|
|
55
79
|
};
|
|
56
80
|
}
|
|
57
81
|
else {
|
|
58
|
-
// Non-interactive mode
|
|
82
|
+
// Non-interactive mode or auto-accept is enabled: automatically accept/load
|
|
59
83
|
await integrityManager.acceptIntegrity('workspace', cwd, integrityResult.hash);
|
|
60
84
|
workspacePoliciesDir = potentialWorkspacePoliciesDir;
|
|
61
|
-
|
|
62
|
-
|
|
85
|
+
if (!interactive) {
|
|
86
|
+
writeToStderr('WARNING: Workspace policies changed or are new. Automatically accepting and loading them.\n');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
debugLogger.warn('Workspace policies changed or are new. Automatically accepting and loading them.');
|
|
90
|
+
}
|
|
63
91
|
}
|
|
64
92
|
}
|
|
65
93
|
return { workspacePoliciesDir, policyUpdateConfirmationRequest };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,wBAAwB,IAAI,4BAA4B,EACxD,mBAAmB,IAAI,uBAAuB,EAC9C,sBAAsB,EACtB,eAAe,EACf,OAAO,EAEP,aAAa,
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/config/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
|
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 { resolveWorkspacePolicyState } from './policy.js';
|
|
10
|
+
import { resolveWorkspacePolicyState, autoAcceptWorkspacePolicies, setAutoAcceptWorkspacePolicies, disableWorkspacePolicies, setDisableWorkspacePolicies, } from './policy.js';
|
|
11
11
|
import { writeToStderr } from '@google/gemini-cli-core';
|
|
12
12
|
// Mock debugLogger to avoid noise in test output
|
|
13
13
|
vi.mock('@google/gemini-cli-core', async (importOriginal) => {
|
|
@@ -34,6 +34,8 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
34
34
|
workspaceDir = path.join(tempDir, 'workspace');
|
|
35
35
|
fs.mkdirSync(workspaceDir);
|
|
36
36
|
policiesDir = path.join(workspaceDir, '.gemini', 'policies');
|
|
37
|
+
// Enable policies for these tests to verify loading logic
|
|
38
|
+
setDisableWorkspacePolicies(false);
|
|
37
39
|
vi.clearAllMocks();
|
|
38
40
|
});
|
|
39
41
|
afterEach(() => {
|
|
@@ -52,21 +54,25 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
52
54
|
policyUpdateConfirmationRequest: undefined,
|
|
53
55
|
});
|
|
54
56
|
});
|
|
57
|
+
it('should have disableWorkspacePolicies set to true by default', () => {
|
|
58
|
+
// We explicitly set it to false in beforeEach for other tests,
|
|
59
|
+
// so here we test that setting it to true works.
|
|
60
|
+
setDisableWorkspacePolicies(true);
|
|
61
|
+
expect(disableWorkspacePolicies).toBe(true);
|
|
62
|
+
});
|
|
55
63
|
it('should return policy directory if integrity matches', async () => {
|
|
56
64
|
// Set up policies directory with a file
|
|
57
65
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
58
66
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
59
|
-
// First call to establish integrity (interactive accept)
|
|
67
|
+
// First call to establish integrity (interactive auto-accept)
|
|
60
68
|
const firstResult = await resolveWorkspacePolicyState({
|
|
61
69
|
cwd: workspaceDir,
|
|
62
70
|
trustedFolder: true,
|
|
63
71
|
interactive: true,
|
|
64
72
|
});
|
|
65
|
-
expect(firstResult.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const integrityManager = new PolicyIntegrityManager();
|
|
69
|
-
await integrityManager.acceptIntegrity('workspace', workspaceDir, firstResult.policyUpdateConfirmationRequest.newHash);
|
|
73
|
+
expect(firstResult.workspacePoliciesDir).toBe(policiesDir);
|
|
74
|
+
expect(firstResult.policyUpdateConfirmationRequest).toBeUndefined();
|
|
75
|
+
expect(writeToStderr).not.toHaveBeenCalled();
|
|
70
76
|
// Second call should match
|
|
71
77
|
const result = await resolveWorkspacePolicyState({
|
|
72
78
|
cwd: workspaceDir,
|
|
@@ -85,23 +91,30 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
85
91
|
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
86
92
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
87
93
|
});
|
|
88
|
-
it('should return confirmation request if changed in interactive mode', async () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
94
|
+
it('should return confirmation request if changed in interactive mode when AUTO_ACCEPT is false', async () => {
|
|
95
|
+
const originalValue = autoAcceptWorkspacePolicies;
|
|
96
|
+
setAutoAcceptWorkspacePolicies(false);
|
|
97
|
+
try {
|
|
98
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
99
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
100
|
+
const result = await resolveWorkspacePolicyState({
|
|
101
|
+
cwd: workspaceDir,
|
|
102
|
+
trustedFolder: true,
|
|
103
|
+
interactive: true,
|
|
104
|
+
});
|
|
105
|
+
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
106
|
+
expect(result.policyUpdateConfirmationRequest).toEqual({
|
|
107
|
+
scope: 'workspace',
|
|
108
|
+
identifier: workspaceDir,
|
|
109
|
+
policyDir: policiesDir,
|
|
110
|
+
newHash: expect.any(String),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
setAutoAcceptWorkspacePolicies(originalValue);
|
|
115
|
+
}
|
|
103
116
|
});
|
|
104
|
-
it('should warn and auto-accept if changed in non-interactive mode', async () => {
|
|
117
|
+
it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is true', async () => {
|
|
105
118
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
106
119
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
107
120
|
const result = await resolveWorkspacePolicyState({
|
|
@@ -113,6 +126,25 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
113
126
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
114
127
|
expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
|
|
115
128
|
});
|
|
129
|
+
it('should warn and auto-accept if changed in non-interactive mode when AUTO_ACCEPT is false', async () => {
|
|
130
|
+
const originalValue = autoAcceptWorkspacePolicies;
|
|
131
|
+
setAutoAcceptWorkspacePolicies(false);
|
|
132
|
+
try {
|
|
133
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
134
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
135
|
+
const result = await resolveWorkspacePolicyState({
|
|
136
|
+
cwd: workspaceDir,
|
|
137
|
+
trustedFolder: true,
|
|
138
|
+
interactive: false,
|
|
139
|
+
});
|
|
140
|
+
expect(result.workspacePoliciesDir).toBe(policiesDir);
|
|
141
|
+
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
142
|
+
expect(writeToStderr).toHaveBeenCalledWith(expect.stringContaining('Automatically accepting and loading'));
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
setAutoAcceptWorkspacePolicies(originalValue);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
116
148
|
it('should not return workspace policies if cwd is the home directory', async () => {
|
|
117
149
|
const policiesDir = path.join(tempDir, '.gemini', 'policies');
|
|
118
150
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
@@ -126,7 +158,22 @@ describe('resolveWorkspacePolicyState', () => {
|
|
|
126
158
|
expect(result.workspacePoliciesDir).toBeUndefined();
|
|
127
159
|
expect(result.policyUpdateConfirmationRequest).toBeUndefined();
|
|
128
160
|
});
|
|
129
|
-
it('should
|
|
161
|
+
it('should return empty state if disableWorkspacePolicies is true even if folder is trusted', async () => {
|
|
162
|
+
setDisableWorkspacePolicies(true);
|
|
163
|
+
// Set up policies directory with a file
|
|
164
|
+
fs.mkdirSync(policiesDir, { recursive: true });
|
|
165
|
+
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
166
|
+
const result = await resolveWorkspacePolicyState({
|
|
167
|
+
cwd: workspaceDir,
|
|
168
|
+
trustedFolder: true,
|
|
169
|
+
interactive: true,
|
|
170
|
+
});
|
|
171
|
+
expect(result).toEqual({
|
|
172
|
+
workspacePoliciesDir: undefined,
|
|
173
|
+
policyUpdateConfirmationRequest: undefined,
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
it('should return empty state if cwd is a symlink to the home directory', async () => {
|
|
130
177
|
const policiesDir = path.join(tempDir, '.gemini', 'policies');
|
|
131
178
|
fs.mkdirSync(policiesDir, { recursive: true });
|
|
132
179
|
fs.writeFileSync(path.join(policiesDir, 'policy.toml'), 'rules = []');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../../src/config/policy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -655,6 +655,22 @@ declare const SETTINGS_SCHEMA: {
|
|
|
655
655
|
readonly label: "Off";
|
|
656
656
|
}];
|
|
657
657
|
};
|
|
658
|
+
readonly errorVerbosity: {
|
|
659
|
+
readonly type: "enum";
|
|
660
|
+
readonly label: "Error Verbosity";
|
|
661
|
+
readonly category: "UI";
|
|
662
|
+
readonly requiresRestart: false;
|
|
663
|
+
readonly default: "low";
|
|
664
|
+
readonly description: "Controls whether recoverable errors are hidden (low) or fully shown (full).";
|
|
665
|
+
readonly showInDialog: true;
|
|
666
|
+
readonly options: readonly [{
|
|
667
|
+
readonly value: "low";
|
|
668
|
+
readonly label: "Low";
|
|
669
|
+
}, {
|
|
670
|
+
readonly value: "full";
|
|
671
|
+
readonly label: "Full";
|
|
672
|
+
}];
|
|
673
|
+
};
|
|
658
674
|
readonly customWittyPhrases: {
|
|
659
675
|
readonly type: "array";
|
|
660
676
|
readonly label: "Custom Witty Phrases";
|
|
@@ -757,6 +773,36 @@ declare const SETTINGS_SCHEMA: {
|
|
|
757
773
|
readonly showInDialog: false;
|
|
758
774
|
readonly ref: "TelemetrySettings";
|
|
759
775
|
};
|
|
776
|
+
readonly billing: {
|
|
777
|
+
readonly type: "object";
|
|
778
|
+
readonly label: "Billing";
|
|
779
|
+
readonly category: "Advanced";
|
|
780
|
+
readonly requiresRestart: false;
|
|
781
|
+
readonly default: {};
|
|
782
|
+
readonly description: "Billing and AI credits settings.";
|
|
783
|
+
readonly showInDialog: false;
|
|
784
|
+
readonly properties: {
|
|
785
|
+
readonly overageStrategy: {
|
|
786
|
+
readonly type: "enum";
|
|
787
|
+
readonly label: "Overage Strategy";
|
|
788
|
+
readonly category: "Advanced";
|
|
789
|
+
readonly requiresRestart: false;
|
|
790
|
+
readonly default: "ask";
|
|
791
|
+
readonly description: string;
|
|
792
|
+
readonly showInDialog: true;
|
|
793
|
+
readonly options: readonly [{
|
|
794
|
+
readonly value: "ask";
|
|
795
|
+
readonly label: "Ask each time";
|
|
796
|
+
}, {
|
|
797
|
+
readonly value: "always";
|
|
798
|
+
readonly label: "Always use credits";
|
|
799
|
+
}, {
|
|
800
|
+
readonly value: "never";
|
|
801
|
+
readonly label: "Never use credits";
|
|
802
|
+
}];
|
|
803
|
+
};
|
|
804
|
+
};
|
|
805
|
+
};
|
|
760
806
|
readonly model: {
|
|
761
807
|
readonly type: "object";
|
|
762
808
|
readonly label: "Model";
|
|
@@ -773,7 +819,7 @@ declare const SETTINGS_SCHEMA: {
|
|
|
773
819
|
readonly requiresRestart: false;
|
|
774
820
|
readonly default: string | undefined;
|
|
775
821
|
readonly description: "The Gemini model to use for conversations.";
|
|
776
|
-
readonly showInDialog:
|
|
822
|
+
readonly showInDialog: true;
|
|
777
823
|
};
|
|
778
824
|
readonly maxSessionTurns: {
|
|
779
825
|
readonly type: "number";
|
|
@@ -1668,6 +1714,55 @@ declare const SETTINGS_SCHEMA: {
|
|
|
1668
1714
|
readonly description: "Enable web fetch behavior that bypasses LLM summarization.";
|
|
1669
1715
|
readonly showInDialog: true;
|
|
1670
1716
|
};
|
|
1717
|
+
readonly gemmaModelRouter: {
|
|
1718
|
+
readonly type: "object";
|
|
1719
|
+
readonly label: "Gemma Model Router";
|
|
1720
|
+
readonly category: "Experimental";
|
|
1721
|
+
readonly requiresRestart: true;
|
|
1722
|
+
readonly default: {};
|
|
1723
|
+
readonly description: "Enable Gemma model router (experimental).";
|
|
1724
|
+
readonly showInDialog: true;
|
|
1725
|
+
readonly properties: {
|
|
1726
|
+
readonly enabled: {
|
|
1727
|
+
readonly type: "boolean";
|
|
1728
|
+
readonly label: "Enable Gemma Model Router";
|
|
1729
|
+
readonly category: "Experimental";
|
|
1730
|
+
readonly requiresRestart: true;
|
|
1731
|
+
readonly default: false;
|
|
1732
|
+
readonly description: "Enable the Gemma Model Router. Requires a local endpoint serving Gemma via the Gemini API using LiteRT-LM shim.";
|
|
1733
|
+
readonly showInDialog: true;
|
|
1734
|
+
};
|
|
1735
|
+
readonly classifier: {
|
|
1736
|
+
readonly type: "object";
|
|
1737
|
+
readonly label: "Classifier";
|
|
1738
|
+
readonly category: "Experimental";
|
|
1739
|
+
readonly requiresRestart: true;
|
|
1740
|
+
readonly default: {};
|
|
1741
|
+
readonly description: "Classifier configuration.";
|
|
1742
|
+
readonly showInDialog: false;
|
|
1743
|
+
readonly properties: {
|
|
1744
|
+
readonly host: {
|
|
1745
|
+
readonly type: "string";
|
|
1746
|
+
readonly label: "Host";
|
|
1747
|
+
readonly category: "Experimental";
|
|
1748
|
+
readonly requiresRestart: true;
|
|
1749
|
+
readonly default: "http://localhost:9379";
|
|
1750
|
+
readonly description: "The host of the classifier.";
|
|
1751
|
+
readonly showInDialog: false;
|
|
1752
|
+
};
|
|
1753
|
+
readonly model: {
|
|
1754
|
+
readonly type: "string";
|
|
1755
|
+
readonly label: "Model";
|
|
1756
|
+
readonly category: "Experimental";
|
|
1757
|
+
readonly requiresRestart: true;
|
|
1758
|
+
readonly default: "gemma3-1b-gpu-custom";
|
|
1759
|
+
readonly description: "The model to use for the classifier. Only tested on `gemma3-1b-gpu-custom`.";
|
|
1760
|
+
readonly showInDialog: false;
|
|
1761
|
+
};
|
|
1762
|
+
};
|
|
1763
|
+
};
|
|
1764
|
+
};
|
|
1765
|
+
};
|
|
1671
1766
|
};
|
|
1672
1767
|
};
|
|
1673
1768
|
readonly extensions: {
|
|
@@ -2030,12 +2125,12 @@ export declare function getSettingsSchema(): SettingsSchemaType;
|
|
|
2030
2125
|
type InferSettings<T extends SettingsSchema> = {
|
|
2031
2126
|
-readonly [K in keyof T]?: T[K] extends {
|
|
2032
2127
|
properties: SettingsSchema;
|
|
2033
|
-
} ? InferSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'];
|
|
2128
|
+
} ? InferSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'] extends string ? string : T[K]['default'];
|
|
2034
2129
|
};
|
|
2035
2130
|
type InferMergedSettings<T extends SettingsSchema> = {
|
|
2036
2131
|
-readonly [K in keyof T]-?: T[K] extends {
|
|
2037
2132
|
properties: SettingsSchema;
|
|
2038
|
-
} ? InferMergedSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'];
|
|
2133
|
+
} ? InferMergedSettings<T[K]['properties']> : T[K]['type'] extends 'enum' ? T[K]['options'] extends readonly SettingEnumOption[] ? T[K]['options'][number]['value'] : T[K]['default'] : T[K]['default'] extends boolean ? boolean : T[K]['default'] extends string ? string : T[K]['default'];
|
|
2039
2134
|
};
|
|
2040
2135
|
export type Settings = InferSettings<SettingsSchemaType>;
|
|
2041
2136
|
export type MergedSettings = InferMergedSettings<SettingsSchemaType>;
|
|
@@ -605,6 +605,19 @@ const SETTINGS_SCHEMA = {
|
|
|
605
605
|
{ value: 'off', label: 'Off' },
|
|
606
606
|
],
|
|
607
607
|
},
|
|
608
|
+
errorVerbosity: {
|
|
609
|
+
type: 'enum',
|
|
610
|
+
label: 'Error Verbosity',
|
|
611
|
+
category: 'UI',
|
|
612
|
+
requiresRestart: false,
|
|
613
|
+
default: 'low',
|
|
614
|
+
description: 'Controls whether recoverable errors are hidden (low) or fully shown (full).',
|
|
615
|
+
showInDialog: true,
|
|
616
|
+
options: [
|
|
617
|
+
{ value: 'low', label: 'Low' },
|
|
618
|
+
{ value: 'full', label: 'Full' },
|
|
619
|
+
],
|
|
620
|
+
},
|
|
608
621
|
customWittyPhrases: {
|
|
609
622
|
type: 'array',
|
|
610
623
|
label: 'Custom Witty Phrases',
|
|
@@ -708,6 +721,35 @@ const SETTINGS_SCHEMA = {
|
|
|
708
721
|
showInDialog: false,
|
|
709
722
|
ref: 'TelemetrySettings',
|
|
710
723
|
},
|
|
724
|
+
billing: {
|
|
725
|
+
type: 'object',
|
|
726
|
+
label: 'Billing',
|
|
727
|
+
category: 'Advanced',
|
|
728
|
+
requiresRestart: false,
|
|
729
|
+
default: {},
|
|
730
|
+
description: 'Billing and AI credits settings.',
|
|
731
|
+
showInDialog: false,
|
|
732
|
+
properties: {
|
|
733
|
+
overageStrategy: {
|
|
734
|
+
type: 'enum',
|
|
735
|
+
label: 'Overage Strategy',
|
|
736
|
+
category: 'Advanced',
|
|
737
|
+
requiresRestart: false,
|
|
738
|
+
default: 'ask',
|
|
739
|
+
description: oneLine `
|
|
740
|
+
How to handle quota exhaustion when AI credits are available.
|
|
741
|
+
'ask' prompts each time, 'always' automatically uses credits,
|
|
742
|
+
'never' disables credit usage.
|
|
743
|
+
`,
|
|
744
|
+
showInDialog: true,
|
|
745
|
+
options: [
|
|
746
|
+
{ value: 'ask', label: 'Ask each time' },
|
|
747
|
+
{ value: 'always', label: 'Always use credits' },
|
|
748
|
+
{ value: 'never', label: 'Never use credits' },
|
|
749
|
+
],
|
|
750
|
+
},
|
|
751
|
+
},
|
|
752
|
+
},
|
|
711
753
|
model: {
|
|
712
754
|
type: 'object',
|
|
713
755
|
label: 'Model',
|
|
@@ -724,7 +766,7 @@ const SETTINGS_SCHEMA = {
|
|
|
724
766
|
requiresRestart: false,
|
|
725
767
|
default: undefined,
|
|
726
768
|
description: 'The Gemini model to use for conversations.',
|
|
727
|
-
showInDialog:
|
|
769
|
+
showInDialog: true,
|
|
728
770
|
},
|
|
729
771
|
maxSessionTurns: {
|
|
730
772
|
type: 'number',
|
|
@@ -1621,6 +1663,55 @@ const SETTINGS_SCHEMA = {
|
|
|
1621
1663
|
description: 'Enable web fetch behavior that bypasses LLM summarization.',
|
|
1622
1664
|
showInDialog: true,
|
|
1623
1665
|
},
|
|
1666
|
+
gemmaModelRouter: {
|
|
1667
|
+
type: 'object',
|
|
1668
|
+
label: 'Gemma Model Router',
|
|
1669
|
+
category: 'Experimental',
|
|
1670
|
+
requiresRestart: true,
|
|
1671
|
+
default: {},
|
|
1672
|
+
description: 'Enable Gemma model router (experimental).',
|
|
1673
|
+
showInDialog: true,
|
|
1674
|
+
properties: {
|
|
1675
|
+
enabled: {
|
|
1676
|
+
type: 'boolean',
|
|
1677
|
+
label: 'Enable Gemma Model Router',
|
|
1678
|
+
category: 'Experimental',
|
|
1679
|
+
requiresRestart: true,
|
|
1680
|
+
default: false,
|
|
1681
|
+
description: 'Enable the Gemma Model Router. Requires a local endpoint serving Gemma via the Gemini API using LiteRT-LM shim.',
|
|
1682
|
+
showInDialog: true,
|
|
1683
|
+
},
|
|
1684
|
+
classifier: {
|
|
1685
|
+
type: 'object',
|
|
1686
|
+
label: 'Classifier',
|
|
1687
|
+
category: 'Experimental',
|
|
1688
|
+
requiresRestart: true,
|
|
1689
|
+
default: {},
|
|
1690
|
+
description: 'Classifier configuration.',
|
|
1691
|
+
showInDialog: false,
|
|
1692
|
+
properties: {
|
|
1693
|
+
host: {
|
|
1694
|
+
type: 'string',
|
|
1695
|
+
label: 'Host',
|
|
1696
|
+
category: 'Experimental',
|
|
1697
|
+
requiresRestart: true,
|
|
1698
|
+
default: 'http://localhost:9379',
|
|
1699
|
+
description: 'The host of the classifier.',
|
|
1700
|
+
showInDialog: false,
|
|
1701
|
+
},
|
|
1702
|
+
model: {
|
|
1703
|
+
type: 'string',
|
|
1704
|
+
label: 'Model',
|
|
1705
|
+
category: 'Experimental',
|
|
1706
|
+
requiresRestart: true,
|
|
1707
|
+
default: 'gemma3-1b-gpu-custom',
|
|
1708
|
+
description: 'The model to use for the classifier. Only tested on `gemma3-1b-gpu-custom`.',
|
|
1709
|
+
showInDialog: false,
|
|
1710
|
+
},
|
|
1711
|
+
},
|
|
1712
|
+
},
|
|
1713
|
+
},
|
|
1714
|
+
},
|
|
1624
1715
|
},
|
|
1625
1716
|
},
|
|
1626
1717
|
extensions: {
|