/** * Simplified MessageComponent - no more pending state handling */ import { Box, Text } from 'ink'; import type { MessageComponentProps } from '../types/ui.js'; /** * Simplified message component - all messages are complete when rendered */ export function MessageComponent({ message, toolDisplayMode, variant = 'default', prefixOverrides = {}, contentColor, showTimestamp = false }: MessageComponentProps) { const { role, content, toolName, toolArgs } = message; // Don't show hidden tool messages if (role === 'tool' && toolDisplayMode === 'hidden') { return null; } // Skip empty system messages if (role === 'system' && !content.trim()) { return null; } // Default prefixes based on variant const getDefaultPrefixes = (variant: string) => { const base = { user: 'You: ', assistant: 'Assistant: ', system: '[system] ', tool: '[tool] ', error: '[error] ' }; // Customize based on variant switch (variant) { case 'git': return { ...base, system: '[git] ', error: '[git] ' }; case 'chat': return { ...base, assistant: 'Chat: ' }; default: return base; } }; const defaultPrefixes = getDefaultPrefixes(variant); const prefixes = { ...defaultPrefixes, ...prefixOverrides }; // Default colors based on role const getContentColor = (role: string) => { if (contentColor) return contentColor; return { user: 'gray', assistant: 'white', system: 'gray', tool: 'magenta', error: 'red' }[role] || 'white'; }; const roleColor = getContentColor(role); // Handle tool messages specially if (role === 'tool') { return ; } // Skip empty assistant messages (when only tools were used) if (!content.trim()) { return null; } // Handle regular messages - all are complete, no pending state const trimmed_content = content.trim(); const lines = trimmed_content.split('\n'); const hasMultipleLines = lines.length > 1; const prefix = prefixes[role] || ''; return ( {lines.map((line, index) => ( {index === 0 ? prefix : ''}{line || ' '} ))} ); } /** * Tool message sub-component */ interface ToolMessageProps { toolName: string; toolArgs: string[]; toolDisplayMode: 'minimal' | 'full' | 'hidden'; prefix: string; } function ToolMessage({ toolName, toolArgs, toolDisplayMode, prefix }: ToolMessageProps) { const args = toolArgs.join(' '); if (toolDisplayMode === 'minimal') { return ( {prefix}{toolName}{args ? `: ${args}` : ''} ); } else if (toolDisplayMode === 'full') { return ( {prefix}{toolName} {args && ( Args: {args} )} ); } return null; // hidden }