2:start/pause/resume/cancel, SSE live progress stream, per-recipient monitor, CSV export.""" 28:router = APIRouter(prefix="/campaigns", tags=["campaigns"]) 445:# Monitor: progress, SSE stream, recipient table 481:@router.get("/{cid}/stream") 482:async def campaign_stream(cid: int, request: Request, 485: """SSE live progress stream. Manual implementation (no sse-starlette): a Redis 540: return StreamingResponse(event_gen(), media_type="text/event-stream",