/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { Box, Text } from 'ink'; import Spinner from 'ink-spinner'; import { IndividualToolCallDisplay, ToolCallStatus, ToolCallConfirmationDetails, ToolEditConfirmationDetails, ToolExecuteConfirmationDetails, } from '../../types.js'; import { DiffRenderer } from './DiffRenderer.js'; import { FileDiff, ToolResultDisplay } from '../../../tools/tools.js'; export const ToolMessage: React.FC = ({ callId, name, description, resultDisplay, status, confirmationDetails, }) => { // Explicitly type the props to help the type checker const typedConfirmationDetails = confirmationDetails as | ToolCallConfirmationDetails | undefined; const typedResultDisplay = resultDisplay as ToolResultDisplay | undefined; let color = 'gray'; let prefix = ''; switch (status) { case ToolCallStatus.Pending: prefix = 'Pending:'; break; case ToolCallStatus.Invoked: prefix = 'Executing:'; break; case ToolCallStatus.Confirming: color = 'yellow'; prefix = 'Confirm:'; break; case ToolCallStatus.Success: color = 'green'; prefix = 'Success:'; break; case ToolCallStatus.Error: color = 'red'; prefix = 'Error:'; break; default: // Handle unexpected status if necessary, or just break break; } const title = `${prefix} ${name}`; return ( {status === ToolCallStatus.Invoked && ( )} {title} {status === ToolCallStatus.Error && typedResultDisplay ? `: ${typedResultDisplay}` : ` - ${description}`} {status === ToolCallStatus.Confirming && typedConfirmationDetails && ( {/* Display diff for edit/write */} {'fileDiff' in typedConfirmationDetails && ( )} {/* Display command for execute */} {'command' in typedConfirmationDetails && ( Command:{' '} { (typedConfirmationDetails as ToolExecuteConfirmationDetails) .command } )} {/* */} )} {status === ToolCallStatus.Success && typedResultDisplay && ( {typeof typedResultDisplay === 'string' ? ( {typedResultDisplay} ) : ( )} )} ); };