import { useMemo } from "react"; import { ArrowRight, Cpu, Lightning, ShieldCheck, Users, XCircle, } from "@phosphor-icons/react"; import type { AgentRecord, AgentMessageRecord, ApprovalRecord, BrowserActionRecord, RunRecord, SectionId, WorkflowPipelineRecord, } from "@shared/types"; import { useT } from "../../i18n"; export function NeedsAttention({ agents, approvals, runs, messages, browserActions, workflows, onNavigate, }: { agents: AgentRecord[]; approvals: ApprovalRecord[]; runs: RunRecord[]; messages: AgentMessageRecord[]; browserActions: BrowserActionRecord[]; workflows: WorkflowPipelineRecord[]; onNavigate: (section: SectionId, entityId?: string) => void; }) { const t = useT(); const pendingApprovals = useMemo(() => approvals.filter((a) => a.state === "pending"), [approvals]); const failedRuns = useMemo(() => runs.filter((r) => r.status === "failed" || r.status === "timed_out" || r.status === "interrupted"), [runs]); const urgentMessages = useMemo(() => messages.filter((message) => !message.readAt && (message.priority === "urgent" || message.channel === "incident")), [messages]); const blockedBrowserActions = useMemo(() => browserActions.filter((action) => action.status === "approval_required" || action.status === "failed"), [browserActions]); const stalledWorkflows = useMemo(() => workflows.filter((workflow) => workflow.status === "paused" || workflow.status === "failed"), [workflows]); if (pendingApprovals.length === 0 && failedRuns.length === 0 && urgentMessages.length === 0 && blockedBrowserActions.length === 0 && stalledWorkflows.length === 0) { return null; } return (
{t("dash.needsAttentionSection")}
{pendingApprovals.slice(0, 5).map((approval) => { const requester = agents.find((a) => a.id === approval.requestedByAgentId); return ( ); })} {failedRuns.slice(0, 3).map((run) => { const agent = agents.find((a) => a.id === run.agentId); return ( ); })} {urgentMessages.slice(0, 3).map((message) => { const sender = agents.find((agent) => agent.id === message.fromAgentId); return ( ); })} {blockedBrowserActions.slice(0, 3).map((action) => ( ))} {stalledWorkflows.slice(0, 3).map((workflow) => ( ))}
); }