A cron-based scheduler polls every 30 seconds for due tasks. Each execution creates a conversation,
copies MCP server configs, spawns an agent via the AgentExecutor, persists all events to the DB,
broadcasts live SSE updates, and prunes old history.
Configuration
cron_expr — Standard cron expression (croniter)
agent_type — claude / codex / gemini
model — Optional model override
timeout — Max execution time (default 600s)
overlap_policy — "skip" (default) or "allow"
max_history — Executions to keep (default 50)
Per-task MCP server config via scheduled_task_mcp_servers