import { useEffect, useState } from "react"; import { Clock3Icon } from "lucide-react"; import type { Session } from "@opengeni/sdk"; import { sessionInputWait } from "../../lib/session-rail"; /** The agent's deliberate wait retains its own reason and deadline. */ export function SessionWaitStatus({ session, }: { session: Pick; }) { const waiting = sessionInputWait(session); const deadlineAt = waiting?.deadlineAt; const [now, setNow] = useState(Date.now); useEffect(() => { if (!deadlineAt) return; setNow(Date.now()); const timer = setInterval(() => setNow(Date.now()), 15_000); return () => clearInterval(timer); }, [deadlineAt]); if (!waiting) return null; const deadline = new Date(waiting.deadlineAt); const time = deadline.toLocaleString(undefined, { ...(deadline.toDateString() === new Date(now).toDateString() ? {} : { month: "short", day: "numeric" }), hour: "2-digit", minute: "2-digit", }); const reason = waiting.reason.trim(); // Older agents used this field for verbose internal notes. Preserve those in // disclosure instead of promoting them into the current status headline. const compact = reason.length <= 180 && !/[\n]|[0-9a-f]{8}-[0-9a-f-]{27,}/i.test(reason); return (

{compact && reason ? reason : "Waiting for work in progress"}

{deadline.getTime() <= now ? "Recheck due · waiting to resume" : `Checks again at ${time} · resumes sooner if an update arrives`}

{!compact && (
Wait details

{reason}

)}
); }