async function startMonitor() { if (!MON.id) return; stopStream(); const body = $("#monBody"); body.innerHTML = `
`; await drawProgress(); // initial paint via REST await drawRecipients(); drawControls(); // SSE MON.es = new EventSource(`/campaigns/${MON.id}/stream`); MON.es.addEventListener("connected", () => $("#liveInd").classList.remove("hidden")); MON.es.addEventListener("progress", ev => { try { paintProgress(JSON.parse(ev.data)); } catch {} }); MON.es.addEventListener("done", ev => { try { paintProgress(JSON.parse(ev.data)); } catch {} stopStream(); toast(`Campaign finished — status: ${(JSON.parse(ev.data) || {}).status || "?"}`, "info", 6000); drawControls(); }); MON.es.onerror = () => { $("#liveInd").classList.add("hidden"); }; } async function drawProgress() {