import React, { useState, useEffect } from 'react';
import { Bot, Loader2, CheckCircle2, X, BrainCircuit, MessageSquareText, Thermometer, Timer, Repeat } from 'lucide-react';
import MarkdownRenderer from './components/MarkdownRenderer';
import { ExpertResult } from './types';
// Simple component to format milliseconds to ss.ms or mm:ss
const TimeDisplay = ({ start, end, status }: { start?: number, end?: number, status: string }) => {
const [elapsed, setElapsed] = useState(0);
useEffect(() => {
let interval: any;
// Update live timer
if (status === 'thinking' && start) {
// Calculate initial diff immediately
setElapsed(Date.now() - start);
interval = setInterval(() => {
setElapsed(Date.now() - start);
}, 100);
}
// Show final duration
else if ((status === 'completed' || status === 'error') && start && end) {
setElapsed(end - start);
}
else {
setElapsed(0);
}
return () => clearInterval(interval);
}, [status, start, end]);
if (!start) return null;
const seconds = (elapsed / 1000).toFixed(1);
return (
{seconds}s
);
};
const ExpertCard = ({ expert }: { expert: ExpertResult }) => {
const [view, setView] = useState<'thoughts' | 'output'>('output');
const isWorking = expert.status === 'thinking';
const isDone = expert.status === 'completed';
const isPending = expert.status === 'pending';
const isError = expert.status === 'error';
const round = expert.round || 1;
// Auto-switch to thoughts if that's all we have so far
React.useEffect(() => {
if (isWorking && expert.thoughts && !expert.content) {
setView('thoughts');
} else if (expert.content && view === 'thoughts' && !expert.thoughts) {
setView('output');
}
}, [expert.thoughts, expert.content, isWorking]);
return (
{/* Header */}
{expert.role}
{round > 1 && (
Round {round}
)}
{/* Timer for Expert */}
{expert.description}
{expert.temperature !== undefined && (
{expert.temperature}
)}
{isWorking && }
{isDone && }
{isError && }
{/* Tabs */}
{!isPending && (
)}
{/* Content Area */}
{isPending ? (
Waiting for assignment...
) : (
<>
{view === 'thoughts' && (
{expert.thoughts ? (
) : (
Initializing thought process...
)}
{isWorking && }
)}
{view === 'output' && (
{expert.content ? (
) : (
{isWorking ? "Formulating output..." : "No output generated."}
)}
{isWorking && !expert.content && }
)}
>
)}
);
};
export default ExpertCard;