.agents/memory/2026-02-23-scheduled-agent-tasks-feature-plan.md

3.1 KiB

2026-02-23 Session Notes

Scheduled Agent Tasks Feature Plan

Implementing a new "Tasks" dashboard tab that lets users schedule recurring agent prompts via cron expressions. The daemon will poll for due tasks and spawn CLI processes (Claude Code or OpenCode) to execute them.

Scope & Architecture

Feature consists of seven integrated components:

  1. Database: Two new tables (scheduled_tasks, task_runs) with indices on (enabled, next_run_at) and (task_id, status). Migration 012 with backwards-compat via index.ts registration.

  2. Cron Parsing: Thin wrapper module (packages/daemon/src/scheduler/cron.ts) around cron-parser dependency, exposing computeNextRun() and validateCron(). Dashboard provides preset shortcuts (15-min, hourly, daily 9am, weekly Monday, custom).

  3. Scheduler Worker: Polling worker at 15-second interval with max 3 concurrent spawned processes. Uses Bun.spawn for claude --dangerously-skip-permissions (Claude Code) and opencode -m (OpenCode) with 10-minute timeout per task. Transactional lease pattern: insert task_runs row and update next_run_at atomically before spawning. Startup cleanup marks stale running tasks as failed.

  4. API Routes: CRUD endpoints under /api/tasks/* — GET all, POST create, GET/PATCH/:id, DELETE, POST/:id/run (manual trigger), GET/:id/runs (paginated history).

  5. Dashboard UI: Kanban board with four columns (Scheduled, Running, Completed, Failed). Uses existing shadcn-svelte components (Table, Badge, Card, Sheet, Select, Input, Button, ScrollArea, Sonner). New components: TasksTab (header + board), TaskBoard, TaskCard, TaskForm (Sheet with Input/Textarea/Select), TaskDetail, RunLog. Requires adding Switch and Textarea shadcn components.

  6. Integration: Wires scheduler worker into daemon startup (line ~7002). Updates navigation store, app-sidebar, and routes in dashboard.

  7. Documentation: New SCHEDULING.md covering cron syntax, execution model, security, and troubleshooting. Updates to DASHBOARD.md, API.md, CLAUDE.md, and web/public/skill.md.

Key Decisions

  • Polling granularity: 15 seconds (cron minimum is 1 minute, no need for sub-minute precision)
  • Concurrency limit: 3 concurrent processes to prevent resource exhaustion
  • Process spawning: Via Bun.spawn with piped stdout/stderr, capped at 1MB per run
  • Timeout: 10-minute default per task execution
  • Transactional safety: Lease pattern prevents double-execution on scheduler restart
  • Kanban columns: Show task states (Scheduled/Running) and recent run states (Completed/Failed) — no drag-and-drop needed

Implementation Order

  1. Migration + type definitions
  2. Cron utilities
  3. Scheduler worker (spawn, worker, index modules)
  4. API routes wired into daemon.ts
  5. Dashboard: store, api client, navigation, components (sequential for context retention)
  6. Documentation

Open Threads

  • Confirm which shadcn-svelte components are already installed vs. need npx shadcn-svelte@next add
  • Test process timeout behavior and output truncation at 1MB
  • Define pagination limit for task_runs queries