From 410e6758371bc23ac4ab276e671a96d1c2daafbc Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Sat, 11 Apr 2026 19:04:36 -0700 Subject: [PATCH] revert: remove invasive ToolDisplay logic from legacy UI components --- .../components/messages/DenseToolMessage.tsx | 109 ++---------------- .../components/messages/ShellToolMessage.tsx | 2 - .../components/messages/ToolGroupMessage.tsx | 5 +- .../ui/components/messages/ToolMessage.tsx | 19 +-- .../src/ui/components/messages/ToolShared.tsx | 19 +-- packages/cli/src/ui/hooks/toolMapping.ts | 18 +-- packages/cli/src/ui/hooks/useAgentStream.ts | 10 +- 7 files changed, 17 insertions(+), 165 deletions(-) diff --git a/packages/cli/src/ui/components/messages/DenseToolMessage.tsx b/packages/cli/src/ui/components/messages/DenseToolMessage.tsx index 7cdf1eb4fb..f5e4b31c66 100644 --- a/packages/cli/src/ui/components/messages/DenseToolMessage.tsx +++ b/packages/cli/src/ui/components/messages/DenseToolMessage.tsx @@ -17,14 +17,12 @@ import { isGrepResult, isListResult, isReadManyFilesResult, - type ToolDisplay, } from '@google/gemini-cli-core'; import { type IndividualToolCallDisplay, type ToolResultDisplay, isTodoList, } from '../../types.js'; -import { isCompactTool } from './ToolGroupMessage.js'; import { useAlternateBuffer } from '../../hooks/useAlternateBuffer.js'; import { ToolStatusIndicator } from './ToolShared.js'; import { theme } from '../../semantic-colors.js'; @@ -48,7 +46,6 @@ const PAYLOAD_SCROLL_GUTTER = 4; const PAYLOAD_MAX_WIDTH = 120 + PAYLOAD_SCROLL_GUTTER; interface DenseToolMessageProps extends IndividualToolCallDisplay { - display?: ToolDisplay; terminalWidth: number; availableTerminalHeight?: number; } @@ -272,7 +269,6 @@ export const DenseToolMessage: React.FC = (props) => { terminalWidth, availableTerminalHeight, description: originalDescription, - display, } = props; const settings = useSettings(); @@ -287,7 +283,6 @@ export const DenseToolMessage: React.FC = (props) => { const [isFocused, setIsFocused] = useState(false); const toggleRef = useRef(null); - const isActuallyCompact = useMemo(() => isCompactTool(props, true), [props]); // Unified File Data Extraction (Safely bridge resultDisplay and confirmationDetails) const diff = useMemo((): FileDiff | undefined => { @@ -327,83 +322,6 @@ export const DenseToolMessage: React.FC = (props) => { // State-to-View Coordination const viewParts = useMemo((): ViewParts => { - if (display) { - const descriptionText = ( - - {display.description || originalDescription} - - ); - - const summaryText = display.resultSummary ? ( - - → {display.resultSummary} - - ) : status === CoreToolCallStatus.Error ? ( - - → {typeof resultDisplay === 'string' ? resultDisplay : 'Failed'} - - ) : undefined; - - // For now, DenseToolMessage still handles complex resultDisplay types - // like FileDiff or ListResult manually if display.result is not provided - // or doesn't cover them. - if (!display.result) { - if (diff) { - return { - ...getFileOpData( - diff, - status, - resultDisplay, - terminalWidth, - availableTerminalHeight, - isAlternateBuffer, - ), - description: descriptionText, - summary: summaryText, - }; - } - if (isListResult(resultDisplay)) { - return { - ...getListResultData(resultDisplay, originalDescription), - description: descriptionText, - summary: summaryText, - }; - } - } - - // If we have a display.result, use it as the payload - let payload: React.ReactNode; - if (display.result) { - if (display.result.type === 'text') { - const text = display.result.text; - if (text) { - payload = ( - - {text} - - ); - } - } - // Step 5 will expand this to handle 'diff' type - } - - // Compact tools should elide text payloads by default unless expanded. - if ( - isActuallyCompact && - !isExpanded && - display.result?.type === 'text' && - !isAlternateBuffer - ) { - payload = undefined; - } - - return { - description: descriptionText, - summary: summaryText, - payload, - }; - } - if (diff) { return getFileOpData( diff, @@ -465,9 +383,6 @@ export const DenseToolMessage: React.FC = (props) => { availableTerminalHeight, originalDescription, isAlternateBuffer, - display, - isActuallyCompact, - isExpanded, ]); const { description, summary } = viewParts; @@ -505,10 +420,6 @@ export const DenseToolMessage: React.FC = (props) => { }, [diff, isExpanded, isAlternateBuffer, terminalWidth, settings, status]); const showPayload = useMemo(() => { - // If we are using the new display protocol and it's a compact tool, - // hide the payload by default unless expanded. - if (display && isActuallyCompact && !isExpanded) return false; - const policy = !isAlternateBuffer || !diff || isExpanded; if (!policy) return false; @@ -528,8 +439,6 @@ export const DenseToolMessage: React.FC = (props) => { diffLines.length, viewParts.payload, outputFile, - isActuallyCompact, - display, ]); const keyExtractor = (_item: React.ReactNode, index: number) => @@ -540,16 +449,7 @@ export const DenseToolMessage: React.FC = (props) => { return ( - + @@ -563,7 +463,12 @@ export const DenseToolMessage: React.FC = (props) => { {summary && ( - + {summary} )} diff --git a/packages/cli/src/ui/components/messages/ShellToolMessage.tsx b/packages/cli/src/ui/components/messages/ShellToolMessage.tsx index 201a78f70e..f3694f3490 100644 --- a/packages/cli/src/ui/components/messages/ShellToolMessage.tsx +++ b/packages/cli/src/ui/components/messages/ShellToolMessage.tsx @@ -43,7 +43,6 @@ export interface ShellToolMessageProps extends ToolMessageProps { export const ShellToolMessage: React.FC = ({ name, description, - display, resultDisplay, status, availableTerminalHeight, @@ -168,7 +167,6 @@ export const ShellToolMessage: React.FC = ({ name={name} status={status} description={description} - display={display} emphasis={emphasis} originalRequestName={originalRequestName} /> diff --git a/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx b/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx index b28acee83e..3a37f3ff5e 100644 --- a/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolGroupMessage.tsx @@ -61,9 +61,7 @@ export const isCompactTool = ( tool: IndividualToolCallDisplay, isCompactModeEnabled: boolean, ): boolean => { - const hasCompactOutputSupport = COMPACT_OUTPUT_ALLOWLIST.has( - tool.originalRequestName || tool.name, - ); + const hasCompactOutputSupport = COMPACT_OUTPUT_ALLOWLIST.has(tool.name); const displayStatus = mapCoreStatusToDisplayStatus(tool.status); return ( isCompactModeEnabled && @@ -121,7 +119,6 @@ export const ToolGroupMessage: React.FC = ({ isToolGroupBoundary, }) => { const settings = useSettings(); - const isLowErrorVerbosity = settings.merged.ui?.errorVerbosity !== 'full'; const isCompactModeEnabled = settings.merged.ui?.compactToolOutput === true; diff --git a/packages/cli/src/ui/components/messages/ToolMessage.tsx b/packages/cli/src/ui/components/messages/ToolMessage.tsx index 25cf476512..5747f7677f 100644 --- a/packages/cli/src/ui/components/messages/ToolMessage.tsx +++ b/packages/cli/src/ui/components/messages/ToolMessage.tsx @@ -21,20 +21,13 @@ import { useFocusHint, FocusHint, } from './ToolShared.js'; -import { - type Config, - CoreToolCallStatus, - Kind, - type ToolDisplay, -} from '@google/gemini-cli-core'; +import { type Config, CoreToolCallStatus, Kind } from '@google/gemini-cli-core'; import { ShellInputPrompt } from '../ShellInputPrompt.js'; import { SUBAGENT_MAX_LINES } from '../../constants.js'; export type { TextEmphasis }; export interface ToolMessageProps extends IndividualToolCallDisplay { - description: string; - display?: ToolDisplay; availableTerminalHeight?: number; terminalWidth: number; emphasis?: TextEmphasis; @@ -51,7 +44,6 @@ export interface ToolMessageProps extends IndividualToolCallDisplay { export const ToolMessage: React.FC = ({ name, description, - display, resultDisplay, status, kind, @@ -87,11 +79,6 @@ export const ToolMessage: React.FC = ({ resultDisplay, ); - const effectiveResultDisplay = - display?.resultSummary && !display.result - ? display.resultSummary - : resultDisplay; - return ( // It is crucial we don't replace this <> with a Box because otherwise the // sticky header inside it would be sticky to that box rather than to the @@ -112,11 +99,9 @@ export const ToolMessage: React.FC = ({ name={name} status={status} description={description} - display={display} emphasis={emphasis} progressMessage={progressMessage} originalRequestName={originalRequestName} - hideSummary={!display?.result && !!display?.resultSummary} /> = ({ /> )} = ({ @@ -204,10 +201,8 @@ export const ToolInfo: React.FC = ({ description, status: coreStatus, emphasis, - display, progressMessage: _progressMessage, originalRequestName, - hideSummary, }) => { const status = mapCoreStatusToDisplayStatus(coreStatus); const nameColor = React.useMemo(() => { @@ -228,15 +223,11 @@ export const ToolInfo: React.FC = ({ // Hide description for completed Ask User tools (the result display speaks for itself) const isCompletedAskUser = isCompletedAskUserTool(name, status); - const displayName = display?.name || name; - const displayDescription = display?.description || description; - const displaySummary = hideSummary ? undefined : display?.resultSummary; - return ( - {displayName} + {name} {originalRequestName && originalRequestName !== name && ( @@ -247,13 +238,7 @@ export const ToolInfo: React.FC = ({ {!isCompletedAskUser && ( <> {' '} - {displayDescription} - - )} - {displaySummary && ( - <> - - {displaySummary} + {description} )} diff --git a/packages/cli/src/ui/hooks/toolMapping.ts b/packages/cli/src/ui/hooks/toolMapping.ts index d6ff238483..abf53e76e5 100644 --- a/packages/cli/src/ui/hooks/toolMapping.ts +++ b/packages/cli/src/ui/hooks/toolMapping.ts @@ -8,7 +8,6 @@ import { type ToolCall, type SerializableConfirmationDetails, type ToolResultDisplay, - type ToolDisplay, debugLogger, CoreToolCallStatus, type SubagentActivityItem, @@ -36,17 +35,10 @@ export function mapToDisplay( borderBottom?: boolean; borderColor?: string; borderDimColor?: boolean; - isAgentSessionInteractive?: boolean; } = {}, ): HistoryItemToolGroup { const toolCalls = Array.isArray(toolOrTools) ? toolOrTools : [toolOrTools]; - const { - borderTop, - borderBottom, - borderColor, - borderDimColor, - isAgentSessionInteractive, - } = options; + const { borderTop, borderBottom, borderColor, borderDimColor } = options; const toolDisplays = toolCalls.map((call): IndividualToolCallDisplay => { let description: string; @@ -71,7 +63,6 @@ export function mapToDisplay( }; let resultDisplay: ToolResultDisplay | undefined = undefined; - let display: ToolDisplay | undefined = undefined; let confirmationDetails: SerializableConfirmationDetails | undefined = undefined; let outputFile: string | undefined = undefined; @@ -84,17 +75,11 @@ export function mapToDisplay( switch (call.status) { case CoreToolCallStatus.Success: resultDisplay = call.response.resultDisplay; - if (isAgentSessionInteractive) { - display = call.response.display; - } outputFile = call.response.outputFile; break; case CoreToolCallStatus.Error: case CoreToolCallStatus.Cancelled: resultDisplay = call.response.resultDisplay; - if (isAgentSessionInteractive) { - display = call.response.display; - } break; case CoreToolCallStatus.AwaitingApproval: correlationId = call.correlationId; @@ -127,7 +112,6 @@ export function mapToDisplay( status: call.status, isClientInitiated: !!call.request.isClientInitiated, kind: call.tool?.kind, - display, resultDisplay, confirmationDetails, outputFile, diff --git a/packages/cli/src/ui/hooks/useAgentStream.ts b/packages/cli/src/ui/hooks/useAgentStream.ts index 648a5e78fa..4fb4a9c94f 100644 --- a/packages/cli/src/ui/hooks/useAgentStream.ts +++ b/packages/cli/src/ui/hooks/useAgentStream.ts @@ -224,9 +224,9 @@ export const useAgentStream = ({ else if (evtStatus === 'success') status = CoreToolCallStatus.Success; + const display = event.display?.result; const liveOutput = - displayContentToString(event.display?.result) ?? - tc.resultDisplay; + displayContentToString(display) ?? tc.resultDisplay; const progressMessage = legacyState?.progressMessage ?? tc.progressMessage; const progress = legacyState?.progress ?? tc.progress; @@ -237,7 +237,6 @@ export const useAgentStream = ({ return { ...tc, - name: event.display?.name ?? tc.name, status, display: event.display ? { ...tc.display, ...event.display } @@ -260,13 +259,12 @@ export const useAgentStream = ({ const legacyState = event._meta?.legacyState; const outputFile = legacyState?.outputFile; - const display = event.display; + const display = event.display?.result; const resultDisplay = - displayContentToString(display?.result) ?? tc.resultDisplay; + displayContentToString(display) ?? tc.resultDisplay; return { ...tc, - name: display?.name ?? tc.name, status: event.isError ? CoreToolCallStatus.Error : CoreToolCallStatus.Success,