32:    const d = await GET("/campaigns/wizard/options");
47:      const d = await GET("/campaigns/list?" + p);
79:          async () => { await POST(`/campaigns/${b.dataset.del}/delete`); loadList(); },
100:      const d = await GET("/campaigns/list?page_size=100");
131:    try { const p = await GET(`/campaigns/${MON.id}/progress`); paintProgress(p); }
180:      if (c.status === "draft") mk("Start", "", async () => { await POST(`/campaigns/${MON.id}/start`); toast("Campaign started", "ok"); startMonitor(); });
181:      if (c.status === "running") mk("Pause", "secondary", async () => { await POST(`/campaigns/${MON.id}/pause`); toast("Campaign paused", "ok"); startMonitor(); });
182:      if (c.status === "paused") mk("Resume", "", async () => { await POST(`/campaigns/${MON.id}/resume`); toast("Campaign resumed", "ok"); startMonitor(); });
184:        mk("Cancel", "danger-o", async () => { await POST(`/campaigns/${MON.id}/cancel`); toast("Campaign cancelled", "warn"); startMonitor(); },
200:    try { d = await GET(`/campaigns/${MON.id}/recipients?` + p); }
247:    try { d = await POST(`/campaigns/${cid}/preview${size ? "?sample_size=" + size : ""}`, {}); }
281:        const c = await GET(`/campaigns/${editingId}`);
564:        const d = await POST("/campaigns/validate-step", { step: serverStep, data: snapshotFor(serverStep) });
578:      if (editingId) { saved = await POST(`/campaigns/${editingId}/patch`, payload); toast("Campaign updated", "ok"); }
579:      else { saved = await POST("/campaigns/create", payload); toast(`Campaign #${saved.id} created`, "ok"); }
635:      async () => { const r = await POST("/campaigns/clear-all"); loadList(); return `Cleared ${r.deleted ?? "?"} campaign(s)`; },
