import { useEffect, useState } from 'react'; import { Bot, CheckCircle2, Loader2, XCircle } from 'lucide-react'; import type { ActiveSubagent } from '@renderer/lib/subagentTracker'; function formatElapsed(startedAt: string): string { const seconds = Math.floor((Date.now() - new Date(startedAt).getTime()) / 1000); if (seconds < 60) return `${seconds}s`; const minutes = Math.floor(seconds / 60); const remainder = seconds % 60; return `${minutes}m ${remainder}s`; } function StatusIcon({ status }: { status: ActiveSubagent['status'] }) { switch (status) { case 'running': return ; case 'completed': return ; case 'failed': return ; } } function ElapsedTimer({ startedAt }: { startedAt: string }) { const [elapsed, setElapsed] = useState(() => formatElapsed(startedAt)); useEffect(() => { const id = setInterval(() => setElapsed(formatElapsed(startedAt)), 1000); return () => clearInterval(id); }, [startedAt]); return ( {elapsed} ); } interface SubagentActivityCardProps { subagent: ActiveSubagent; } function SubagentActivityCard({ subagent }: SubagentActivityCardProps) { const borderClass = subagent.status === 'running' ? 'border-[var(--color-accent-sky)]/20' : subagent.status === 'failed' ? 'border-[var(--color-status-error)]/20' : 'border-[var(--color-status-success)]/20'; return (
{subagent.name} {subagent.activityLabel} {subagent.status === 'running' && } {subagent.error && ( {subagent.error} )}
); } interface SubagentActivityListProps { subagents: ReadonlyArray; } export function SubagentActivityList({ subagents }: SubagentActivityListProps) { if (subagents.length === 0) return null; // Only show running subagents in the chat stream const visible = subagents.filter((s) => s.status === 'running'); if (visible.length === 0) return null; return (
{visible.map((subagent) => ( ))}
); }