"use client"; import { useEffect, useRef } from "react"; import { formatDistanceToNow } from "date-fns"; import { Badge } from "@/components/ui/badge"; import type { BadgeVariant } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { ScrollArea } from "@/components/ui/scroll-area"; import { useSessionStream, type MissionControlConnectionStatus, type MissionControlMessageRole, } from "@/hooks/useMissionControl"; const ROLE_BADGE_VARIANT: Record = { user: "badge-blue", assistant: "status-success", tool: "badge-amber", system: "badge-muted", }; const CONNECTION_DOT_CLASS: Record = { connected: "bg-emerald-500", connecting: "bg-amber-500", error: "bg-red-500", }; const CONNECTION_TEXT: Record = { connected: "Connected", connecting: "Connecting", error: "Error", }; export interface OrchestratorPanelProps { sessionId?: string; } function formatRelativeTimestamp(timestamp: string): string { const parsedDate = new Date(timestamp); if (Number.isNaN(parsedDate.getTime())) { return "just now"; } return formatDistanceToNow(parsedDate, { addSuffix: true }); } export function OrchestratorPanel({ sessionId }: OrchestratorPanelProps): React.JSX.Element { const { messages, status, error } = useSessionStream(sessionId ?? ""); const bottomAnchorRef = useRef(null); useEffect(() => { bottomAnchorRef.current?.scrollIntoView({ block: "end" }); }, [messages.length]); if (!sessionId) { return ( Orchestrator Panel Select an agent to view its stream ); } return (
Orchestrator Panel

Session: {sessionId}

{messages.length === 0 ? (

{error ?? "Waiting for messages..."}

) : ( messages.map((message) => (
{message.role}

{message.content}

)) )}
); }