'use client' import { useState } from 'react' import { User, Brain, Wrench, CheckCircle, XCircle, Settings, ChevronDown, ChevronRight, Image } from 'lucide-react' import type { ChatMessage } from '@/lib/session-detail' const ROLE_CONFIG: Record = { user: { color: '#3b82f6', bg: '#eff6ff', icon: User, label: 'User Input' }, assistant: { color: '#8b5cf6', bg: '#faf5ff', icon: Brain, label: 'Assistant' }, tool_result: { color: '#22c55e', bg: '#f0fdf4', icon: CheckCircle, label: 'Tool Result' }, system: { color: '#94a3b8', bg: '#f8fafc', icon: Settings, label: 'System' }, } function ChatEntry({ message, index }: { message: ChatMessage; index: number }) { const [expanded, setExpanded] = useState(false) const config = ROLE_CONFIG[message.role] || ROLE_CONFIG.system const Icon = message.toolName ? Wrench : (message.isThinking ? Brain : config.icon) const isLong = message.content.length > 150 let label = config.label if (message.toolName) label = message.toolName else if (message.isThinking) label = 'Thinking' else if (message.role === 'tool_result' && message.content.includes('error')) { label = 'Error' } return (
#{message.stepIndex} {label} {message.isSidechain && ( sub-agent )} {message.images && message.images > 0 && ( {message.images} )} {message.timestamp ? new Date(message.timestamp).toLocaleTimeString() : ''}
{message.content}
{isLong && ( )}
) } export function SessionChatLog({ messages }: { messages: ChatMessage[] }) { const [filter, setFilter] = useState('all') const filtered = filter === 'all' ? messages : messages.filter(m => m.role === filter || (filter === 'tool' && (m.toolName || m.role === 'tool_result'))) return (
{/* Filter buttons */}
{[ { key: 'all', label: 'All', count: messages.length }, { key: 'user', label: 'User', count: messages.filter(m => m.role === 'user').length }, { key: 'assistant', label: 'Assistant', count: messages.filter(m => m.role === 'assistant' && !m.toolName).length }, { key: 'tool', label: 'Tools', count: messages.filter(m => m.toolName || m.role === 'tool_result').length }, ].map(f => ( ))}
{/* Messages */}
{filtered.map((msg, i) => ( ))}
{messages.length > 200 && (
Showing {filtered.length} of {messages.length} messages
)}
) }