import { useState, useEffect } from 'react' import { User, Bot, Wrench, CheckCircle, AlertCircle, Terminal, File, Image, FileText, Music, Video, Download, ChevronDown, ChevronRight, Copy, Check, Loader2, XCircle, Clock, Loader, X, Brain, Maximize2 } from 'lucide-react' import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import type { ChatMessage, Attachment, TaskToolResult } from '../../types/protocol' import { ToolDetailModal } from './ToolDetailModal' // 状态图标组件 function StatusIcon({ status, size = 14 }: { status: 'calling' | 'result' | 'pending' | 'success' | 'failed' | 'timeout', size?: number }) { const iconClass = `transition-all duration-300` switch (status) { case 'calling': return ( ) case 'result': case 'success': return ( ) case 'failed': return ( ) case 'timeout': return ( ) case 'pending': return ( ) default: return null } } interface MessageBubbleProps { message: ChatMessage onNavigateToSubAgent?: (taskId: string, description: string, subagentType?: string) => void showThinking?: boolean } function getAttachmentIcon(mediaType: string) { switch (mediaType) { case 'image': return case 'audio': return case 'video': return