-- Create tasks table for orchestrating Claude Code instances
CREATE TABLE IF NOT EXISTS tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
owner_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000002',
parent_task_id UUID REFERENCES tasks(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
description TEXT,
status VARCHAR(32) NOT NULL DEFAULT 'pending', -- pending/running/paused/blocked/done/failed/merged
priority INTEGER NOT NULL DEFAULT 0,
plan TEXT NOT NULL,
-- Daemon/container info
daemon_id UUID,
container_id VARCHAR(255), -- Docker/Podman container ID
overlay_path VARCHAR(512), -- Path to overlay upper layer on daemon
-- Repository info
repository_url VARCHAR(512),
base_branch VARCHAR(255), -- Branch overlay is based on
target_branch VARCHAR(255), -- Branch to merge into when complete
-- Merge settings
merge_mode VARCHAR(32) DEFAULT 'pr', -- 'pr' (create PR), 'auto' (auto-merge), 'manual'
pr_url VARCHAR(512), -- URL if PR created
-- Progress tracking
progress_summary TEXT,
last_output TEXT,
error_message TEXT,
-- Timestamps
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
version INTEGER NOT NULL DEFAULT 1,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Create indexes for tasks
CREATE INDEX idx_tasks_owner_id ON tasks(owner_id);
CREATE INDEX idx_tasks_parent_id ON tasks(parent_task_id);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_daemon_id ON tasks(daemon_id);
CREATE INDEX idx_tasks_created_at ON tasks(created_at DESC);
-- Create trigger to auto-update updated_at (reuse existing function)
CREATE TRIGGER update_tasks_updated_at
BEFORE UPDATE ON tasks
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- Create task events log for audit and state changes
CREATE TABLE IF NOT EXISTS task_events (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
event_type VARCHAR(64) NOT NULL, -- 'status_change', 'output', 'progress', 'sibling_broadcast', etc.
previous_status VARCHAR(32),
new_status VARCHAR(32),
event_data JSONB, -- Flexible event payload
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_task_events_task_id ON task_events(task_id);
CREATE INDEX idx_task_events_created_at ON task_events(created_at DESC);
-- Create connected daemons registry
CREATE TABLE IF NOT EXISTS daemons (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
owner_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000002',
connection_id VARCHAR(255) NOT NULL UNIQUE, -- WebSocket session ID
hostname VARCHAR(255),
machine_id VARCHAR(255), -- For identifying the machine
max_concurrent_tasks INTEGER NOT NULL DEFAULT 1,
current_task_count INTEGER NOT NULL DEFAULT 0,
status VARCHAR(32) NOT NULL DEFAULT 'connected', -- connected, disconnected, unhealthy
last_heartbeat_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
connected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
disconnected_at TIMESTAMPTZ
);
CREATE INDEX idx_daemons_owner_id ON daemons(owner_id);
CREATE INDEX idx_daemons_status ON daemons(status);
CREATE INDEX idx_daemons_connection_id ON daemons(connection_id);