// Page 2 — Alerts function AlertCard({ alert, expanded, onToggle, onDismiss, onCopy }) { return (
{alert.rule} {alert.status === "resolved" && resolved} {alert.status === "dismissed" && dismissed}
{alert.ruleTitle}
{alert.text}
{fmtDateTime(alert.ts)} ({fmtAgo(alert.ts)}) PB-{alert.seq} · {alert.title} {alert.agent && ( {teamById(alert.agent)?.name} )} {fmtDuration(alert.durationMin)}
{alert.status === "active" && ( )}
{expanded && (
Пункт инструкции
{alert.claudeMdRef}
{alert.claudeMdQuote}
Промпт для Виктора
{alert.promptDraft}
)}
); } function Meta({ label, children }) { return (
{label} {children}
); } function AlertsPage({ alerts, dismissAlert, pushToast }) { const [tab, setTab] = useState("active"); const [sev, setSev] = useState("all"); const [rule, setRule] = useState("all"); const [expanded, setExpanded] = useState(() => new Set([17])); const ruleList = useMemo(() => { const s = new Set(); alerts.forEach(a => s.add(a.rule)); return Array.from(s); }, [alerts]); const filtered = useMemo(() => { return alerts.filter(a => { if (tab !== "all" && a.status !== tab) return false; if (sev !== "all" && a.severity !== sev) return false; if (rule !== "all" && a.rule !== rule) return false; return true; }); }, [alerts, tab, sev, rule]); const counts = useMemo(() => ({ active: alerts.filter(a => a.status === "active").length, dismissed: alerts.filter(a => a.status === "dismissed").length, resolved: alerts.filter(a => a.status === "resolved").length, }), [alerts]); const toggle = (id) => { setExpanded((prev) => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n; }); }; return (

Алерты

Инциденты из правил watchdog'а. Разбирай по очереди и закрывай.
Severity: {["all","critical","warning","info"].map((s) => ( ))}
Найдено: {filtered.length}
{filtered.length === 0 ? (
● Алертов нет
) : (
{filtered.map((a) => ( toggle(a.id)} onDismiss={() => { dismissAlert(a.id); pushToast("Алерт скрыт", "info"); }} onCopy={() => { navigator.clipboard?.writeText(a.promptDraft); pushToast("Промпт скопирован", "ok"); }} /> ))}
)}
); } window.AlertsPage = AlertsPage;