From fbfb2a72e300729c016745febb67a1fa9c6f1003 Mon Sep 17 00:00:00 2001 From: Jarrod Whelan Date: Tue, 10 Feb 2026 11:51:15 -0800 Subject: [PATCH] feat(cli): remove output verbosity settings and logic --- docs/cli/settings.md | 7 +- docs/get-started/configuration.md | 6 -- packages/cli/src/config/settingsSchema.ts | 15 ---- packages/cli/src/ui/AppContainer.tsx | 4 +- .../ui/components/HistoryItemDisplay.test.tsx | 12 ---- .../src/ui/components/HistoryItemDisplay.tsx | 22 ------ .../src/ui/components/MainContent.test.tsx | 39 ----------- .../cli/src/ui/components/MainContent.tsx | 26 ++----- .../cli/src/ui/hooks/shellCommandProcessor.ts | 3 +- packages/cli/src/ui/hooks/toolMapping.test.ts | 24 +------ packages/cli/src/ui/hooks/toolMapping.ts | 5 -- .../src/ui/hooks/useHistoryManager.test.ts | 22 ------ .../cli/src/ui/hooks/useHistoryManager.ts | 1 - packages/cli/src/ui/types.ts | 68 +------------------ schemas/settings.schema.json | 8 --- 15 files changed, 12 insertions(+), 250 deletions(-) diff --git a/docs/cli/settings.md b/docs/cli/settings.md index 85bac74716..9893f4cacb 100644 --- a/docs/cli/settings.md +++ b/docs/cli/settings.md @@ -32,10 +32,9 @@ they appear in the UI. ### Output -| UI Label | Setting | Description | Default | -| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------- | ----------- | -| Output Format | `output.format` | The format of the CLI output. Can be `text` or `json`. | `"text"` | -| Verbose Output History | `output.verbosity` | Show verbose output history. When enabled, output history will include autonomous tool calls, additional logs, etc. | `"verbose"` | +| UI Label | Setting | Description | Default | +| ------------- | --------------- | ------------------------------------------------------ | -------- | +| Output Format | `output.format` | The format of the CLI output. Can be `text` or `json`. | `"text"` | ### UI diff --git a/docs/get-started/configuration.md b/docs/get-started/configuration.md index 9d28578c22..66635e49b7 100644 --- a/docs/get-started/configuration.md +++ b/docs/get-started/configuration.md @@ -163,12 +163,6 @@ their corresponding top-level category object in your `settings.json` file. - **Default:** `"text"` - **Values:** `"text"`, `"json"` -- **`output.verbosity`** (enum): - - **Description:** Show verbose output history. When enabled, output history - will include autonomous tool calls, additional logs, etc. - - **Default:** `"verbose"` - - **Values:** `"info"`, `"verbose"` - #### `ui` - **`ui.theme`** (string): diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 9e576b87b6..880b6cf63d 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -328,21 +328,6 @@ const SETTINGS_SCHEMA = { { value: 'json', label: 'JSON' }, ], }, - // Defined as enum type to support the addition of more verbosity levels - verbosity: { - type: 'enum', - label: 'Verbose Output History', - category: 'General', - requiresRestart: false, - default: 'verbose', - description: - 'Show verbose output history. When enabled, output history will include autonomous tool calls, additional logs, etc.', - showInDialog: true, - options: [ - { value: 'info', label: 'false' }, - { value: 'verbose', label: 'true' }, - ], - }, }, }, diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index 4422930896..fbfa93ac3a 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -862,7 +862,7 @@ Logging in with Google... Restarting Gemini CLI to continue. const performMemoryRefresh = useCallback(async () => { historyManager.addItem( { - type: MessageType.VERBOSE, + type: MessageType.INFO, text: 'Refreshing hierarchical memory (GEMINI.md or other context files)...', }, Date.now(), @@ -873,7 +873,7 @@ Logging in with Google... Restarting Gemini CLI to continue. historyManager.addItem( { - type: MessageType.VERBOSE, + type: MessageType.INFO, text: `Memory refreshed successfully. ${ memoryContent.length > 0 ? `Loaded ${memoryContent.length} characters from ${fileCount} file(s).` diff --git a/packages/cli/src/ui/components/HistoryItemDisplay.test.tsx b/packages/cli/src/ui/components/HistoryItemDisplay.test.tsx index 06bdf155c5..1aecb9a0ba 100644 --- a/packages/cli/src/ui/components/HistoryItemDisplay.test.tsx +++ b/packages/cli/src/ui/components/HistoryItemDisplay.test.tsx @@ -171,18 +171,6 @@ describe('', () => { expect(lastFrame()).toContain('Agent powering down. Goodbye!'); }); - it('renders InfoMessage for "debug" type with gear icon', () => { - const item: HistoryItem = { - ...baseItem, - type: MessageType.DEBUG, - text: 'Debug info', - }; - const { lastFrame } = renderWithProviders( - , - ); - expect(lastFrame()).toContain('⚙ Debug info'); - }); - it('should escape ANSI codes in text content', () => { const historyItem: HistoryItem = { id: 1, diff --git a/packages/cli/src/ui/components/HistoryItemDisplay.tsx b/packages/cli/src/ui/components/HistoryItemDisplay.tsx index 15e68909a3..ed399dd38f 100644 --- a/packages/cli/src/ui/components/HistoryItemDisplay.tsx +++ b/packages/cli/src/ui/components/HistoryItemDisplay.tsx @@ -18,7 +18,6 @@ import { GeminiMessageContent } from './messages/GeminiMessageContent.js'; import { CompressionMessage } from './messages/CompressionMessage.js'; import { WarningMessage } from './messages/WarningMessage.js'; import { Box } from 'ink'; -import { theme } from '../semantic-colors.js'; import { AboutBox } from './AboutBox.js'; import { StatsDisplay } from './StatsDisplay.js'; import { ModelStatsDisplay } from './ModelStatsDisplay.js'; @@ -97,27 +96,6 @@ export const HistoryItemDisplay: React.FC = ({ color={itemForDisplay.color} /> )} - {itemForDisplay.type === 'verbose' && ( - - )} - {itemForDisplay.type === 'debug' && ( - - )} - {itemForDisplay.type === 'trace' && ( - - )} {itemForDisplay.type === 'warning' && ( )} diff --git a/packages/cli/src/ui/components/MainContent.test.tsx b/packages/cli/src/ui/components/MainContent.test.tsx index 850b71e0bb..a3d0ad2dc6 100644 --- a/packages/cli/src/ui/components/MainContent.test.tsx +++ b/packages/cli/src/ui/components/MainContent.test.tsx @@ -14,7 +14,6 @@ import { useAlternateBuffer } from '../hooks/useAlternateBuffer.js'; import { ToolCallStatus } from '../types.js'; import { SHELL_COMMAND_NAME } from '../constants.js'; import type { UIState } from '../contexts/UIStateContext.js'; -import type { HistoryItem } from '../types.js'; // Mock dependencies vi.mock('../contexts/AppContext.js', async () => { @@ -29,9 +28,6 @@ vi.mock('../contexts/AppContext.js', async () => { const mockSettings = { merged: { - output: { - verbosity: 'info', - }, ui: { enableCompactToolOutput: false, }, @@ -99,7 +95,6 @@ describe('MainContent', () => { beforeEach(() => { vi.mocked(useAlternateBuffer).mockReturnValue(false); - mockSettings.merged.output.verbosity = 'info'; mockSettings.merged.ui.enableCompactToolOutput = false; }); @@ -248,38 +243,4 @@ describe('MainContent', () => { }, ); }); - - it('filters out verbose items when verbosity is info', async () => { - const history: HistoryItem[] = [ - { id: 1, type: 'user', text: 'Visible User Message' }, - { id: 2, type: 'verbose', text: 'Hidden Verbose Log' }, - ]; - mockSettings.merged.output.verbosity = 'info'; - - const { lastFrame } = renderWithProviders(, { - uiState: { ...defaultMockUiState, history } as Partial, - }); - await waitFor(() => expect(lastFrame()).toContain('AppHeader')); - const output = lastFrame(); - - expect(output).toContain('Visible User Message'); - expect(output).not.toContain('Hidden Verbose Log'); - }); - - it('shows verbose items when verbosity is verbose', async () => { - const history: HistoryItem[] = [ - { id: 1, type: 'user', text: 'Visible User Message' }, - { id: 2, type: 'verbose', text: 'Visible Verbose Log' }, - ]; - mockSettings.merged.output.verbosity = 'verbose'; - - const { lastFrame } = renderWithProviders(, { - uiState: { ...defaultMockUiState, history } as Partial, - }); - await waitFor(() => expect(lastFrame()).toContain('AppHeader')); - const output = lastFrame(); - - expect(output).toContain('Visible User Message'); - expect(output).toContain('Visible Verbose Log'); - }); }); diff --git a/packages/cli/src/ui/components/MainContent.tsx b/packages/cli/src/ui/components/MainContent.tsx index bbf0144b34..32c70e8cad 100644 --- a/packages/cli/src/ui/components/MainContent.tsx +++ b/packages/cli/src/ui/components/MainContent.tsx @@ -20,8 +20,6 @@ import { MAX_GEMINI_MESSAGE_LINES } from '../constants.js'; import { useConfirmingTool } from '../hooks/useConfirmingTool.js'; import { ToolConfirmationQueue } from './ToolConfirmationQueue.js'; import { useConfig } from '../contexts/ConfigContext.js'; -import { VERBOSITY_MAPPING, Verbosity } from '../types.js'; -import { useSettings } from '../contexts/SettingsContext.js'; const MemoizedHistoryItemDisplay = memo(HistoryItemDisplay); const MemoizedAppHeader = memo(AppHeader); @@ -34,7 +32,6 @@ export const MainContent = () => { const { version } = useAppContext(); const uiState = useUIState(); const config = useConfig(); - const settings = useSettings(); const isAlternateBuffer = useAlternateBuffer(); const confirmingTool = useConfirmingTool(); @@ -56,24 +53,9 @@ export const MainContent = () => { availableTerminalHeight, } = uiState; - const currentVerbosity = - VERBOSITY_MAPPING[settings.merged.output?.verbosity ?? 'info'] ?? - Verbosity.INFO; - - const filteredHistory = useMemo( - () => - uiState.history.filter((item) => { - const itemType = item.type; - const itemVerbosity = - item.verbosity ?? VERBOSITY_MAPPING[itemType] ?? Verbosity.INFO; - return itemVerbosity <= currentVerbosity; - }), - [uiState.history, currentVerbosity], - ); - const historyItems = useMemo( () => - filteredHistory.map((h) => ( + uiState.history.map((h) => ( { /> )), [ - filteredHistory, + uiState.history, mainAreaWidth, staticAreaMaxItemHeight, uiState.slashCommands, @@ -134,10 +116,10 @@ export const MainContent = () => { const virtualizedData = useMemo( () => [ { type: 'header' as const }, - ...filteredHistory.map((item) => ({ type: 'history' as const, item })), + ...uiState.history.map((item) => ({ type: 'history' as const, item })), { type: 'pending' as const }, ], - [filteredHistory], + [uiState.history], ); const renderItem = useCallback( diff --git a/packages/cli/src/ui/hooks/shellCommandProcessor.ts b/packages/cli/src/ui/hooks/shellCommandProcessor.ts index 441f7e6665..7191c029c8 100644 --- a/packages/cli/src/ui/hooks/shellCommandProcessor.ts +++ b/packages/cli/src/ui/hooks/shellCommandProcessor.ts @@ -8,7 +8,7 @@ import type { HistoryItemWithoutId, IndividualToolCallDisplay, } from '../types.js'; -import { ToolCallStatus, Verbosity } from '../types.js'; +import { ToolCallStatus } from '../types.js'; import { useCallback, useReducer, useRef, useEffect } from 'react'; import type { AnsiOutput, Config, GeminiClient } from '@google/gemini-cli-core'; import { isBinary, ShellExecutionService } from '@google/gemini-cli-core'; @@ -487,7 +487,6 @@ export const useShellCommandProcessor = ( addItemToHistory( { type: 'tool_group', - verbosity: Verbosity.INFO, tools: [finalToolDisplay], } as HistoryItemWithoutId, userMessageTimestamp, diff --git a/packages/cli/src/ui/hooks/toolMapping.test.ts b/packages/cli/src/ui/hooks/toolMapping.test.ts index 6fcded6a3c..16900f3ad7 100644 --- a/packages/cli/src/ui/hooks/toolMapping.test.ts +++ b/packages/cli/src/ui/hooks/toolMapping.test.ts @@ -19,7 +19,7 @@ import { type WaitingToolCall, type CancelledToolCall, } from '@google/gemini-cli-core'; -import { ToolCallStatus, Verbosity } from '../types.js'; +import { ToolCallStatus } from '../types.js'; describe('toolMapping', () => { beforeEach(() => { @@ -274,27 +274,5 @@ describe('toolMapping', () => { expect(result.tools[0].resultDisplay).toBeUndefined(); expect(result.tools[0].status).toBe(ToolCallStatus.Pending); }); - - it('sets verbosity to INFO for client-initiated tools', () => { - const toolCall: ScheduledToolCall = { - status: 'scheduled', - request: { ...mockRequest, isClientInitiated: true }, - tool: mockTool, - invocation: mockInvocation, - }; - const result = mapToDisplay(toolCall); - expect(result.verbosity).toBe(Verbosity.INFO); - }); - - it('sets verbosity to undefined (defaulting to VERBOSE) for autonomous tools', () => { - const toolCall: ScheduledToolCall = { - status: 'scheduled', - request: { ...mockRequest, isClientInitiated: false }, - tool: mockTool, - invocation: mockInvocation, - }; - const result = mapToDisplay(toolCall); - expect(result.verbosity).toBeUndefined(); - }); }); }); diff --git a/packages/cli/src/ui/hooks/toolMapping.ts b/packages/cli/src/ui/hooks/toolMapping.ts index 6de60c4f25..e83fb583bf 100644 --- a/packages/cli/src/ui/hooks/toolMapping.ts +++ b/packages/cli/src/ui/hooks/toolMapping.ts @@ -14,7 +14,6 @@ import { } from '@google/gemini-cli-core'; import { ToolCallStatus, - Verbosity, type HistoryItemToolGroup, type IndividualToolCallDisplay, } from '../types.js'; @@ -55,9 +54,6 @@ export function mapToDisplay( ): HistoryItemToolGroup { const toolCalls = Array.isArray(toolOrTools) ? toolOrTools : [toolOrTools]; const { borderTop, borderBottom } = options; - const isClientInitiated = toolCalls.some( - (tc) => tc.request.isClientInitiated, - ); const toolDisplays = toolCalls.map((call): IndividualToolCallDisplay => { let description: string; @@ -133,7 +129,6 @@ export function mapToDisplay( return { type: 'tool_group', - verbosity: isClientInitiated ? Verbosity.INFO : undefined, tools: toolDisplays, borderTop, borderBottom, diff --git a/packages/cli/src/ui/hooks/useHistoryManager.test.ts b/packages/cli/src/ui/hooks/useHistoryManager.test.ts index 625802bce5..30b2cbc470 100644 --- a/packages/cli/src/ui/hooks/useHistoryManager.test.ts +++ b/packages/cli/src/ui/hooks/useHistoryManager.test.ts @@ -261,28 +261,6 @@ describe('useHistoryManager', () => { }); }); - it('should store all items regardless of verbosity level (filtering is done at render time)', () => { - // @ts-expect-error - verbosity prop was removed, but we want to ensure it's ignored if passed by mistake - const { result } = renderHook(() => useHistory({ verbosity: 'info' })); - const timestamp = Date.now(); - const verboseItem: HistoryItemWithoutId = { - type: 'verbose', - text: 'Hidden detail', - verbosity: 3, // Verbosity.VERBOSE - }; - - act(() => { - result.current.addItem(verboseItem, timestamp); - }); - - expect(result.current.history).toHaveLength(1); - expect(result.current.history[0]).toEqual( - expect.objectContaining({ - text: 'Hidden detail', - }), - ); - }); - it('should merge consecutive tool_group items', () => { const { result } = renderHook(() => useHistory()); const timestamp = Date.now(); diff --git a/packages/cli/src/ui/hooks/useHistoryManager.ts b/packages/cli/src/ui/hooks/useHistoryManager.ts index 29e797c84c..9957ec0fcf 100644 --- a/packages/cli/src/ui/hooks/useHistoryManager.ts +++ b/packages/cli/src/ui/hooks/useHistoryManager.ts @@ -103,7 +103,6 @@ export function useHistory({ switch (itemData.type) { case 'compression': - case 'verbose': case 'info': chatRecordingService?.recordMessage({ model: undefined, diff --git a/packages/cli/src/ui/types.ts b/packages/cli/src/ui/types.ts index 5cdaa1ed35..eb914c0edc 100644 --- a/packages/cli/src/ui/types.ts +++ b/packages/cli/src/ui/types.ts @@ -101,7 +101,6 @@ export const emptyIcon = ' '; export interface HistoryItemBase { text?: string; // Text content for user/gemini/info/error messages - verbosity?: Verbosity; } export type HistoryItemUser = HistoryItemBase & { @@ -136,23 +135,6 @@ export type HistoryItemWarning = HistoryItemBase & { text: string; }; -export type HistoryItemVerbose = HistoryItemBase & { - type: 'verbose'; - text: string; - icon?: string; - color?: string; -}; - -export type HistoryItemDebug = HistoryItemBase & { - type: 'debug'; - text: string; -}; - -export type HistoryItemTrace = HistoryItemBase & { - type: 'trace'; - text: string; -}; - export type HistoryItemAbout = HistoryItemBase & { type: 'about'; cliVersion: string; @@ -336,9 +318,6 @@ export type HistoryItemWithoutId = | HistoryItemInfo | HistoryItemError | HistoryItemWarning - | HistoryItemVerbose - | HistoryItemDebug - | HistoryItemTrace | HistoryItemAbout | HistoryItemHelp | HistoryItemToolGroup @@ -363,9 +342,6 @@ export type HistoryItem = HistoryItemWithoutId & { id: number }; // Message types used by internal command feedback (subset of HistoryItem types) export enum MessageType { INFO = 'info', - VERBOSE = 'verbose', - DEBUG = 'debug', - TRACE = 'trace', ERROR = 'error', WARNING = 'warning', USER = 'user', @@ -386,52 +362,10 @@ export enum MessageType { HOOKS_LIST = 'hooks_list', } -export enum Verbosity { - ERROR = 0, - WARN = 1, - INFO = 2, - VERBOSE = 3, - DEBUG = 4, - TRACE = 5, -} - -export const VERBOSITY_MAPPING: Record = { - error: Verbosity.ERROR, - warning: Verbosity.WARN, - info: Verbosity.INFO, - user: Verbosity.INFO, - gemini: Verbosity.INFO, - gemini_content: Verbosity.INFO, - tool_group: Verbosity.INFO, - user_shell: Verbosity.INFO, - about: Verbosity.INFO, - stats: Verbosity.INFO, - model_stats: Verbosity.INFO, - tool_stats: Verbosity.INFO, - model: Verbosity.INFO, - quit: Verbosity.INFO, - extensions_list: Verbosity.INFO, - tools_list: Verbosity.INFO, - skills_list: Verbosity.INFO, - agents_list: Verbosity.INFO, - mcp_status: Verbosity.INFO, - chat_list: Verbosity.INFO, - hooks_list: Verbosity.INFO, - help: Verbosity.INFO, - verbose: Verbosity.VERBOSE, - compression: Verbosity.VERBOSE, - debug: Verbosity.DEBUG, - trace: Verbosity.TRACE, -}; - // Simplified message structure for internal feedback export type Message = | { - type: - | MessageType.INFO - | MessageType.VERBOSE - | MessageType.ERROR - | MessageType.USER; + type: MessageType.INFO | MessageType.ERROR | MessageType.USER; content: string; // Renamed from text for clarity in this context timestamp: Date; } diff --git a/schemas/settings.schema.json b/schemas/settings.schema.json index ab0ff4ada3..2575f97be7 100644 --- a/schemas/settings.schema.json +++ b/schemas/settings.schema.json @@ -153,14 +153,6 @@ "default": "text", "type": "string", "enum": ["text", "json"] - }, - "verbosity": { - "title": "Verbose Output History", - "description": "Show verbose output history. When enabled, output history will include autonomous tool calls, additional logs, etc.", - "markdownDescription": "Show verbose output history. When enabled, output history will include autonomous tool calls, additional logs, etc.\n\n- Category: `General`\n- Requires restart: `no`\n- Default: `verbose`", - "default": "verbose", - "type": "string", - "enum": ["info", "verbose"] } }, "additionalProperties": false