import { useState, useEffect } from "react"; import { Warning, ArrowClockwise, X, Trash } from "@phosphor-icons/react"; interface InterruptedRun { runId: string; taskId: string; taskTitle: string; agentId: string; agentName: string; connectorId: string; interruptedAt: string; } export function RecoveryBanner() { const [runs, setRuns] = useState([]); const [dismissed, setDismissed] = useState(false); useEffect(() => { const unsubscribe = window.agentCompany?.subscribe?.((event: any) => { if (event.type === "recovery-needed" && event.interruptedRuns) { setRuns(event.interruptedRuns); } }); return () => { unsubscribe?.(); }; }, []); if (runs.length === 0 || dismissed) return null; const handleRetry = async (run: InterruptedRun) => { await window.agentCompany?.recoveryRetry(run.taskId, run.agentId, ""); setRuns(prev => prev.filter(r => r.runId !== run.runId)); }; const handleFail = async (run: InterruptedRun) => { await window.agentCompany?.recoveryFail(run.taskId); setRuns(prev => prev.filter(r => r.runId !== run.runId)); }; const handleDismissAll = () => setDismissed(true); return (
{runs.length} interrupted task(s) detected from previous session
{runs.map(run => (
{run.taskTitle} ({run.agentName})
))}
); }