-- Chat Switchboard — 019 Tasks (SQLite) -- Consolidated v0.28.0: merges 026 + 027 -- v0.28.0-cs3: trigger_token, action task_type, queued run status. CREATE TABLE IF NOT EXISTS tasks ( id TEXT PRIMARY KEY, owner_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, team_id TEXT REFERENCES teams(id) ON DELETE SET NULL, name TEXT NOT NULL, description TEXT DEFAULT '', scope TEXT NOT NULL DEFAULT 'personal', task_type TEXT NOT NULL DEFAULT 'prompt', system_function TEXT DEFAULT '', persona_id TEXT REFERENCES personas(id) ON DELETE SET NULL, model_id TEXT, system_prompt TEXT DEFAULT '', user_prompt TEXT DEFAULT '', workflow_id TEXT REFERENCES workflows(id) ON DELETE SET NULL, tool_grants TEXT, schedule TEXT NOT NULL, timezone TEXT NOT NULL DEFAULT 'UTC', is_active INTEGER NOT NULL DEFAULT 1, trigger_token TEXT UNIQUE, max_tokens INTEGER NOT NULL DEFAULT 4096, max_tool_calls INTEGER NOT NULL DEFAULT 10, max_wall_clock INTEGER NOT NULL DEFAULT 300, output_mode TEXT NOT NULL DEFAULT 'channel', output_channel_id TEXT REFERENCES channels(id) ON DELETE SET NULL, webhook_url TEXT, webhook_secret TEXT, provider_config_id TEXT REFERENCES provider_configs(id) ON DELETE SET NULL, notify_on_complete INTEGER NOT NULL DEFAULT 0, notify_on_failure INTEGER NOT NULL DEFAULT 1, last_run_at TEXT, next_run_at TEXT, run_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_tasks_next_run ON tasks (next_run_at) WHERE is_active = 1; CREATE INDEX IF NOT EXISTS idx_tasks_owner ON tasks (owner_id); CREATE INDEX IF NOT EXISTS idx_tasks_team ON tasks (team_id); CREATE UNIQUE INDEX IF NOT EXISTS idx_tasks_trigger_token ON tasks (trigger_token) WHERE trigger_token IS NOT NULL; CREATE TABLE IF NOT EXISTS task_runs ( id TEXT PRIMARY KEY, task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE, channel_id TEXT REFERENCES channels(id) ON DELETE SET NULL, status TEXT NOT NULL DEFAULT 'running', trigger_payload TEXT, started_at TEXT NOT NULL DEFAULT (datetime('now')), completed_at TEXT, tokens_used INTEGER DEFAULT 0, tool_calls INTEGER DEFAULT 0, wall_clock INTEGER DEFAULT 0, error TEXT ); CREATE INDEX IF NOT EXISTS idx_task_runs_task ON task_runs (task_id); CREATE INDEX IF NOT EXISTS idx_task_runs_status ON task_runs (task_id, status);